Я пытаюсь создать классификатор изображений для идентификации между 2 типами изображений на объектах недвижимости. Я разбил свой набор данных на 2 категории: [Недвижимость, Комната]. Я надеюсь, что смогу различить, находится ли изображение снаружи какого-либо объекта или комнаты внутри объекта.
Ниже приведены 2 примера типов изображений, которые я использую. Мой набор данных состоит из 800 изображений для каждой категории, а затем обучающий набор из дополнительных 160 изображений для каждой категории (не представлен в обучающем наборе).
Кажется, я всегда получаю разумные результаты в процессе обучения, но затем, когда я проверяю некоторые реальные образцы, это обычно заканчивается классификацией всех изображений в одну категорию.
Ниже вы можете увидеть модель, которую я использую:
train_datagen = ImageDataGenerator(
rescale=1./255,
width_shift_range=0.1,
height_shift_range=0.1,
rotation_range=10,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest'
) # set validation split
validate_datagen = ImageDataGenerator(rescale=1./255)
IMG_HEIGHT = IMG_WIDTH = 128
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, (11,11), activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH, 3), padding='same'),
tf.keras.layers.MaxPooling2D(11, 11),
# tf.keras.layers.Dropout(0.5),
# Second convolutional layer
tf.keras.layers.Conv2D(64, (11, 11), padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(11, 11),
# tf.keras.layers.Dropout(0.5),
# Flattening
tf.keras.layers.Flatten(),
# Full connection
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(1, activation='sigmoid')
])
from tensorflow.keras.optimizers import RMSprop
model.compile(
optimizer=RMSprop(lr=0.001),
loss='binary_crossentropy',
metrics=['accuracy']
)
# now train the model
history = model.fit_generator(
train_generator,
validation_data=validation_generator,
steps_per_epoch=75, #100
epochs=5, # 15, or 20, and 100 steps per epoch
validation_steps=50,
verbose=1
)
# Predict image
def load_image(img_path, show=False):
test_image = image.load_img(img_path, target_size=(IMG_HEIGHT, IMG_WIDTH))
test_image = image.img_to_array(test_image)
test_image /= 255.
test_image = np.expand_dims(test_image, axis = 0)
return test_image
def predict_image(img_path, show=False):
loaded_img = load_image(img_path, show)
pred = model.predict(loaded_img)
return 'property' if pred[0][0] == 0.0 else 'room'
print('Prediction is...')
print(predict_image('path/to/my/img')
Может кто-нибудь предложить возможные причины этого? Я пытался использовать разные эпохи и размеры пакетов, дополнительно увеличивая изображения, изменяя размер слоя Conv2D и Pooling, но, похоже, ничего не помогло.
Возможно, мне не хватает данных или они плохие изображения для начала с? Это мой первый набег в ML, поэтому извиняюсь, если какой-либо из вопросов кажется очевидным.