Resim sınıflandırma projelerinde kullanılan yöntemlerden birisi; her bir sınıfa ait resimlerin ayrı ayrı klasörlerde tutularak okunması ve modelin eğitilmesidir. Bu projede resimler dataset isimli klasörün içinde her bir resim sınıfı için açılan alt klasörler olan cat ve dog klasörlerinde bulundurulmaktadır.
- Öncelikle gerekli kütüphaneleri ekleyelim.
import cv2
import pandas as pd
import numpy as np
import os
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split- Resimlerin bulunduğu ana klasörü ve sınıf isimlerini barındıran listeyi oluşturalım.
img_path = "dataset/"
labels = ["cat", "dog"]- Resimlerin yolu ve sınıf isimlerinden oluşan bir data frame oluşturalım.
img_list = []
label_list = []
for label in labels:
for img_file in os.listdir(img_path+label):
img_list.append(img_path+label+"/"+img_file)
label_list.append(label)
df = pd.DataFrame({"img":img_list, "label":label_list})- Oluşturduğumuz data frame için yeni bir alana sınıfları temsil eden sayılar ekleyelim.
d = {"cat":0, "dog":1}
df["encode_label"]= df["label"].map(d)- Eğitim sırasında problem çıkarmaması için listeyi karıştıralım.
df = df.sample(frac=1)
df = df.reset_index(drop=True)- İlk resmimizi bir görelim.
image = cv2.imread(str(df["img"][0]))
plt.imshow(image)- Tüm resimleri tek tek okuyarak yeniden boyutlandırma ve normalizasyon işlemi yapalım. Bu aşamada modelin girdi verileri olan
xdeğişkenini de oluşturmuş oluyoruz.
size=128
x=[]
for imge in df["img"]:
img = cv2.imread(str(imge))
# print(imge)
img = cv2.resize(img, (size,size))
img = img/255.0
x.append(img)Warning
Klasörde okunabilen resim formatları dışında dosya varsa bu aşamada hata ile karşılaşılabilir. Hangi resmin hata verdiğini görebilmek için print(image) satırı açılarak kodu tekrar çalıştırın. Hata veren dosya listenin en altındaki dosyadır. Klasörde silme işlemi yaptıysanız Resimleri Okuma işlemine geri dönerek kodları tekrar çalıştırınız.
- Ön-işlemden geçmiş resmin son hali.
plt.imshow(x[0])- Modelin girdi verilerini diziye dönüştürüp modelin çıktı verisi olan 'y' değişkenini oluşturalım.
x = np.array(x)
y = df['encode_label']- Verileri eğitim ve test olmak üzere parçalayalım.
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=.2,random_state=42)- Derin öğrenme modeli için gerekli kütüphaneler.
import tensorflow as tf
from keras.models import Sequential
from keras.layers import Conv2D, Dense, Flatten, MaxPooling2D- Modeli oluşturalım ve derleyelim.
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(size, size, 3)))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(64,kernel_size=(3,3),activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(128,kernel_size=(3,3),activation='relu'))
model.add(Flatten())
model.add(Dense(128))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])- Modeli eğitelim.
history = model.fit(x_train,y_train, validation_data=(x_test,y_test), epochs=100, verbose=1)- Test verileri ile modeli test edelim.
tahmin = model.predict(x_test[0:1])
print("İlk resmin etiketi:", y_test[0:1])
print("Modelin tahmini:", tahmin)
print("Sınıf etiketleri:", labels)
print("Tahmin edilen sınıf:", labels[int(np.round(tahmin[0][0]))])1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
İlk resmin etiketi: 193 1
Name: encode_label, dtype: int64
Modelin tahmini: [[0.9999249]]
Sınıf etiketleri: ['cat', 'dog']
Tahmin edilen sınıf: dog
- Tahmin edilen resmi görelim.
plt.imshow(x_test[0])Bu projede, kedi ve köpek resimlerini sınıflandırmak için bir derin öğrenme modeli geliştirilmiştir. Model, resimlerin ön-işleme aşamasından geçirilmesiyle oluşturulan eğitim ve test verileri üzerinde eğitilmiş ve test edilmiştir. Sonuç olarak, model test verileri üzerinde başarılı tahminler yapmıştır. Bu süreç, resim sınıflandırma problemlerinde derin öğrenme modellerinin etkinliğini göstermektedir. Ayrıca, modelin performansı artırılabilir ve farklı veri kümeleriyle genişletilerek daha genel bir sınıflandırma sistemi oluşturulabilir.
İnternetten resim indirmek için bing_image_downloader kütüphanesi kullanılabilir. Öncelikle bu paketi kurmak gerekebilir.
pip install bing-image-downloaderGerekli kütüphaneyi ekleyip resimleri indirelim.
from bing_image_downloader import downloader
aranan_ifade = "dog"
downloader.download(aranan_ifade, limit=300)Bu kod ile aranan_ifade değişkeni ile belirlenen ifade kullanılarak internette arama yapılır, önce dataset isminde bir klasör açılır ve bulunan resimler yine aynı isimle açılan alt klasöre indirilir. İndirilecek resim sayısı limit parametresi ile belirlenir. Bu projede kullanılan resimler bu yöntemle indirilmiştir.
Warning
İndirilen resimler her zaman konu ile alakalı olmayabilir. Klasördeki resimler incelenerek farklı formatlarda indirilenler veya bozuk olanlar silinmelidir. Aksi halde, metin ön işleme adımında hata ile karşılaşılabilir.


