Я создал классификатор изображений для классификации изображений самолетов и ракет на основе учебника по адресу https://blog.francium.tech/build-your-own-image-classifier-with-tensorflow-and-keras-dc147a15e38e. Я написал весь код, и он, кажется, работает нормально, за исключением случаев, когда он используется для маркировки тестовых изображений. , все они помечены одним и тем же классом.
Я просмотрел код на веб-странице выше, и он, кажется, соответствует моему.
Вот мой код. Я включил все это, потому что я не знаю, в чем проблема:
import cv2
import numpy as np
import os
from random import shuffle
from tqdm import tqdm
import tensorflow as tf
from PIL import Image
import matplotlib.image as mpimg
from keras.models import Sequential
from keras.layers import *
from keras.optimizers import *
import matplotlib.pyplot as plt
#%matplotlib inline
import cv2
train_data = "C:/Users/Will Downs/image_training/training_data/"
test_data = "C:/Users/Will Downs/image_training/test_data/"
def one_hot_label(img):
ohl = np.array([0, 0])
label = img.split('.')[0]
if label == 'Airplane':
ohl = np.array([1,0])
elif label == 'Rocket':
ohl = np.array([0,1])
return ohl
#This section loads and prepares the training and testing images:
def train_data_with_label():
train_images = []
for i in tqdm(os.listdir(train_data)):
path = os.path.join(train_data, i)
img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (64,64))
train_images.append([np.array(img), one_hot_label(i)])
shuffle(train_images)
return train_images
def test_data_with_label():
test_images = []
for i in tqdm(os.listdir(test_data)):
path = os.path.join(test_data, i)
img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (64,64))
test_images.append([np.array(img), one_hot_label(i)])
shuffle(test_images)
return test_images
#This section trains the model
training_images = train_data_with_label()
testing_images = test_data_with_label()
tr_img_data = np.array([i[0] for i in training_images]).reshape(-1,64,64,1)
tr_lbl_data = np.array([i[1] for i in training_images])
tst_img_data = np.array([i[0] for i in testing_images]).reshape(-1,64,64,1)
tst_lbl_data = np.array([i[1] for i in testing_images])
model = Sequential()
model.add(InputLayer(input_shape=[64,64,1]))
model.add(Conv2D(filters=32,kernel_size=5,strides=1,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=5,padding='same'))
model.add(Conv2D(filters=50,kernel_size=5,strides=1,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=5,padding='same'))
model.add(Conv2D(filters=80,kernel_size=5,strides=1,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=5,padding='same'))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512,activation='relu'))
model.add(Dropout(rate=0.5))
model.add(Dense(2,activation='softmax'))
optimizer = Adam(lr=1e-3)
model.compile(optimizer=optimizer,loss='categorical_crossentropy',metrics=['accuracy'])
model.fit(x=tr_img_data, y=tr_lbl_data, epochs=50,batch_size=100)
model.summary()
#This section plots and labels the images
fig = plt.figure(figsize=(14,14))
for cnt, data in enumerate(testing_images[2:4]):
y = fig.add_subplot(6,5, cnt+1)
img = data[0]
data = img.reshape(1,64,64,1)
model_out = model.predict([data])
if np.argmax(model_out == 1):
str_label = "Airplane"
else:
str_label = "Rocket"
y.imshow(img, cmap="gray")
plt.title(str_label)
y.axes.get_xaxis().set_visible(False)
y.axes.get_yaxis().set_visible(False)
Я ожидал, что программа будет отображать каждое изображение в папке тестирования вместе с предсказанной меткой, но вместо этого она построила графиккаждое изображение с одинаковой меткой для всех: «Самолет» или «Ракета».