Можно ли классифицировать участки изображения одного и того же объекта, но с разными областями с помощью CNN? - PullRequest
0 голосов
/ 25 октября 2018

У меня есть две фотографии печатного объекта, первая имеет площадь печати 2,5x2,5 см ^ 2, а вторая - тот же объект, но площадь печати составляет 5,0x5,0 см ^ 2.После отделения объекта от фона и выравнивания гистограммы обеих картинок я пытаюсь использовать небольшие патчи (64x64) в подходе глубокого обучения (CNN) для понимания их паттернов и их классификации.Я пытаюсь использовать 64x64 патчи из напечатанных объектов размером 2,5x2,5 см ^ 2, чтобы обучить классификатор глубокого обучения и протестировать их с патчами из объектов 5,0x5,0 см ^ 2.Цифровые изображения обоих объектов имеют примерно одинаковое разрешение, как это определено из экстрактора объектов.Вот примеры исправлений 64x64, используемых для обучения и тестирования двоичного классификатора CNN.


64x64 исправления 2,5x2,5 см ^ 2 объекта

64x64 патч объекта 5x5cm ^ 2

Классы, которые я хочу предсказать, следующие:

Negative Class

Отрицательный класс (печатается впервые)

Positive Class

Позитивный класс (копируется и перепечатывается)

То, что я обнаружил:

  1. Патчи из 2,5x2,5 см ^ 2 объекта легко классифицировать, если CNN обучают патчами из объектов того же размера (площади)
  2. Если CNN обучен с исправлениями 64x64 из объектов размером 2,5x2,5 см ^ 2 и протестирован с исправлениями размером 64x64 из объектов размером 5x5 см ^ 2, прогнозы рассчитаны только для одного класса (точность 50%).
  3. Некоторые многомасштабныеи в этом сценарии отлично работают дескрипторы с множественным разрешением, такие как использование пакета визуальных слов
  4. . Другие базовые CNN также не работаютэтот сценарий, такой как Mobilenet, Densenet и Resnet
  5. Я попытался включить масштабирование в мою процедуру увеличения данных (как предложено одним ответом).Это также не сработало: - (

Это модель keras, которую я до сих пор пробовал

model = Sequential()

# GROUP1
model.add(Conv2D(filters=32, kernel_size=3, strides=1, padding='same',
                 input_shape=input_shape))
model.add(LeakyReLU(alpha=0.2))


# GROUP2
model.add(Conv2D(filters=32, kernel_size=3, strides=2, padding='same'))
model.add(LeakyReLU(alpha=0.2))
model.add(BatchNormalization(axis=-1, momentum=0.9, epsilon=0.001))

# GROUP3
model.add(Conv2D(filters=64, kernel_size=3, strides=1, padding='same'))
model.add(LeakyReLU(alpha=0.2))
model.add(BatchNormalization(axis=-1, momentum=0.9, epsilon=0.001))

# GROUP4
model.add(Conv2D(filters=64, kernel_size=3, strides=2, padding='same'))
model.add(LeakyReLU(alpha=0.2))
model.add(BatchNormalization(axis=-1, momentum=0.9, epsilon=0.001))

# GROUP5
model.add(Conv2D(filters=96, kernel_size=3, strides=1, padding='same'))
model.add(LeakyReLU(alpha=0.2))
model.add(BatchNormalization(axis=-1, momentum=0.9, epsilon=0.001))

# GROUP6
model.add(Conv2D(filters=96, kernel_size=3, strides=2, padding='same'))
model.add(LeakyReLU(alpha=0.2))
model.add(BatchNormalization(axis=-1, momentum=0.9, epsilon=0.001))

model.add(Flatten())
model.add(Dense(1024))
model.add(LeakyReLU(alpha=0.2))

model.add(Dense(2, activation='softmax'))

return model

, и вот увеличение данных, которое я использую

datagen = ImageDataGenerator(
            width_shift_range=0.2,
            height_shift_range=0.2,
            horizontal_flip=True,
        vertical_flip=True,
        zoom_range=0.2,
            fill_mode='nearest')


    datagen.fit(x_train)
    datagen.fit(x_validation)

    # Fit the model on the batches generated by datagen.flow().
    model.fit_generator(datagen.flow(x_train, y_train, batch_size=batch_size),
                        steps_per_epoch=x_train.shape[0] // batch_size,
                        validation_data=datagen.flow(x_validation, y_validation, batch_size=batch_size),
                        epochs=nb_epoch, verbose=1, max_q_size=100,
                        validation_steps=x_validation.shape[0]//batch_size,
                        callbacks=[lr_reducer, early_stopper, csv_logger, model_checkpoint])

Итак, есть ли какое-либо решение для повышения точности в этом очень сложном сценарии для CNN? Я имею в виду, что CNN изучает особенности из данных, и, как вы можете видеть, данные обучения и тестирования из одного и того же класса различны.Возможно ли мне выполнить какое-либо увеличение данных или операцию CNN (на моем CNN нет пропусков и пулов, как вы можете видеть выше), которые могли бы минимизировать или смоделировать данные тестирования в данных обучения?

1 Ответ

0 голосов
/ 25 октября 2018

Если ваша цель - прогнозировать с несколькими уровнями масштабирования, вам нужно обучить CNN с несколькими уровнями масштабирования ... Я думаю, что текущее увеличение генерирует сэмплы, которые не соответствуют вашим ожиданиям.Например, это одно из изображений, которые могут генерироваться при увеличении масштаба = 1,2:

augmented_image

Самое простое решение - использовать такой генератор, как этотпри тренировке с 5x5cm ^ 2 патчами:

ImageDataGenerator(horizontal_flip=True,
                   vertical_flip=True,
                   zoom_range=[0.5, 1])

В этом случае, когда zoom = 0.5, вы получите изображение, подобное этому:

enter image description here

, который более или менее эквивалентен изображению 2,5x2,5 см ^ 2.

Если вам необходимо обучить его с помощью патчей 2,5x2,5, попробуйте:

ImageDataGenerator(horizontal_flip=True,
                   vertical_flip=True,
                   zoom_range=[1, 2],
                   fill_mode='constant',
                   cval=0)

которые генерируют изображения, подобные этому:

enter image description here

При достаточном количестве выборок и эпох CNN должна быть в состоянии узнать, что нули заполнения могут игнорироваться.

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