сверточная нейронная сеть для локализации объекта - PullRequest
0 голосов
/ 03 января 2019

Я видел в курсе глубокого обучения Эндрю Нг способ локализации одного объекта на изображении: https://www.youtube.com/watch?v=GSwYGkTfOKk. Насколько я понимаю, вы можете, например, привязать точку к определенной части объекта, взять координаты: x, y в качестве меток y и обучить CNN.

Я хотел тренировать нейронную сеть CNN, чтобы локализовать мои глаза (не классификация). Я сделал 200 фотографий: 60х60 пикселей в оттенках серого. Я пометил левый и правый глаз. Каждая координата помеченного глаза была нормализована до 0-1. Метка y: [x of eye1, y of eye1, x of eye2, y of eye2]. Я использовал оптимизатор SGD с потерей mse и в сигмоидной функции выходного слоя.

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Conv2D(64, (3,3), input_shape= (60,60, 1)))
model.add(tf.keras.layers.Activation('relu'))
model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2)))

model.add(tf.keras.layers.Conv2D(32, (3,3)))
model.add(tf.keras.layers.Activation('relu'))
model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2)))

model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(64, activation='relu'))

model.add(tf.keras.layers.Dense(4, activation='sigmoid'))
sgd= tf.keras.optimizers.SGD(lr = 0.01)
model.compile(loss = 'mean_squared_error', optimizer=sgd, metrics=['accuracy'])
model.fit(x,y, batch_size=3, epochs=15, validation_split=0.2)

Это не сработало для этой задачи, так как решить эту проблему? Я где-то видел: применить CNN к изображению (я полагаю, без плотных слоев), затем при сглаживании данных из CNN использовать линейную регрессию для каждой координаты x / y (многопараметрическая логистическая регрессия). Это решение? Насколько я понимаю, я бы подавал каждое изображение в слои Conv и MaxPool, затем выравнивал и затем передавал данные в lin. регресс и тренировать его, но я понятия не имею, как это сделать в керасе. Я новичок в этой области, поэтому любая идея мне помогает.

1 Ответ

0 голосов
/ 03 января 2019

Прежде всего, пара замечаний относительно вашего кода.

Поскольку последний слой содержит более 2 нейронов , вам необходимо использовать функцию активации softmax , не сигмоид (обратите внимание, что это в случае классификации, а не регрессии).

Сигмоид следует использовать только тогда, когда вы выполняете двоичную классификацию, но не когдау вас есть более двух классов (обратите внимание, что вы также можете использовать softmax для 2 классов, однако это не обязательно рекомендуется с небольшой вычислительной точки зрения).

Ваша проблема заключается в регрессии и классификации! .

Первый слой вашей сверточной нейронной сети содержит 64 карты характеристик, каждый размер ядра 3x3.Хотя способ подачи изображений в нейронную сеть является правильным, вы передаете только изображение в градациях серого, а не координаты x1, x2, y1, y2 .

Для ANN с регрессией взгляните на этот урок: https://machinelearningmastery.com/regression-tutorial-keras-deep-learning-library-python/.

Ваша интуиция верна;нейронные сети обнаружения объектов заменяют полностью связанные слои сверточными.Ян ЛеКун даже заявляет, что полностью подключенные слои не должны быть частью CNN.

Поскольку вы новичок в этой области, я бы порекомендовал принять следующий конвейер.

1) Найти онлайнМодель github, написанная в вашей предпочитаемой библиотеке глубокого обучения (Keras / PyTorch / TensorFlow и т. д.).

2) Следуйте инструкциям / руководству, чтобы воспроизвести результаты, полученные пользователем github.

3) С помощью последнего вы также должны понимать код / ​​получить хорошее интуитивное понимание.

4) Адаптировать модель к нужной вам проблеме.

Одно место, с которого вы могли бы начать, этоздесь (это обнаружение объектов - обнаружение нескольких объектов, а также разных категорий): https://github.com/pierluigiferrari/ssd_keras.

Если у вас есть дополнительные вопросы, пожалуйста, запишите их, я был бы рад помочь!

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