Эти изображения слишком "шумные", чтобы быть правильно классифицированными CNN? - PullRequest
0 голосов
/ 23 февраля 2020

Я пытаюсь создать классификатор изображений для идентификации между 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, поэтому извиняюсь, если какой-либо из вопросов кажется очевидным.

enter image description here

enter image description here

enter image description here

enter image description here

Ответы [ 2 ]

2 голосов
/ 23 февраля 2020

Вы неправильно обрабатываете выходные данные классификатора, он выводит вероятность в [0, 1], где values < 0.5 соответствует первому классу, а values >= 0.5 для второго. Вы должны изменить код соответственно.

0 голосов
/ 23 февраля 2020

Попробуйте увеличение данных: оно увеличивает изображение до некоторых случайных преобразований, таких как случайное вращение, случайное масштабирование, случайное горизонтальное отражение, изменение ширины и изменение высоты. А также попробуйте реализовать нормализацию партии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...