Трудно найти работающую архитектуру нейронной сети в проблеме контуров изображений - PullRequest
0 голосов
/ 24 сентября 2019

Я пишу свой первый серьезный проект нейронной сети, я новичок, когда дело доходит до машинного обучения.Мне бы хотелось, чтобы он нашел конкретный объект на изображении и пометил его на выходе с меньшим разрешением.Объект всегда рука, делающая буквы в воздухе с использованием языка жестов.Мое входное изображение всегда 200x200, сейчас выводится 16x16 для отладки и тестирования, но в конечном итоге я бы хотел обучить его 32x32, 64x64 или выше.У меня 6000 образцов.На идеальном выходе я бы хотел поставить белый пиксель там, где он думает, что есть рука, и черный, если нет.Реально я ожидаю аналогичного вывода с размытыми краями, но с четким контуром руки.Вот пример оригинального и тегового изображения ( 64x64 вариант ).Я изо всех сил пытаюсь найти правильную сетевую архитектуру.Я использую Keras с бэкэндом TensorFlow.Я взял набор данных из Kaggle и пометил изображения вручную.Вот мои попытки:

Сначала я попробовал плотную сеть, просто чтобы начать работу:

model.add(layers.Dense(8000, activation='sigmoid', input_shape=(200 * 200,)))
model.add(layers.Dense(2000, activation='sigmoid'))
model.add(layers.Dense(tagged_res * tagged_res, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='mean_squared_error', metrics=['mae'])

Я использовал функцию активации сигмоида, так как ожидаю вывод [0, 1]которая представляет собой вероятность того, что пиксель будет белым, и означает среднеквадратичную ошибку как функцию потерь, чтобы стимулировать жесткие края.Я попытался использовать стохастический градиентный спуск в качестве оптимизатора, но у rmsprop, похоже, гораздо лучшая скорость обучения, и это значительно уменьшило потери и ошибки.Пожалуйста, поправьте меня, если моя методология неверна.

Потребовалась пара попыток поиграть с количеством эпох, но в итоге я был рад увидеть что-то, что напоминало ожидаемый результат, но очень размыто .Это был шаг в правильном направлении для меня, но я был обеспокоен тем фактом, что модель предсказывает одно и то же изображение 16x16 для каждого входа (они осторожны в форме руки и ее размера).Модель, похоже, не перетренировалась вообще даже при большом количестве эпох, но быстро потеряла около 0,3 потерь.

Моя вторая попытка была сверточными сетями.Я думал, что размытые края были связаны с тем, что сеть пыталась создать универсальное изображение, поэтому я предположил, что сверточная архитектура может находить шаблоны и устранять этот недостаток.В основном я пробовал две архитектуры:

model.add(layers.Conv2D(32, (3, 3), activation='sigmoid', input_shape=(200, 200, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='sigmoid'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='sigmoid'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='sigmoid'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(tagged_res * tagged_res, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='mean_squared_error', metrics=['mae'])

Вторая была без двух последних пар слоев MaxPooling и Conv2D.Я взял их из книги Франсуа Шоле о глубоком обучении с Керасом в качестве отправной точки.Я запустил это, и то, что я получил, было главным образом чисто черными выходами.Я пробовал различное количество слоев и глубин на слоях сверток, но это чисто догадки, и ничего из этого не помогло.Ни одна комбинация, которую я пробовал, даже близко не была похожа на размытое изображение, полученное из плотных слоев, и лучшее, что я получил, это this .

Правильно ли мое мышление?Я должен преследовать сверточную архитектуру в этой проблеме?Какую функцию потерь лучше всего использовать здесь?Должен ли я сделать сеть глубже или меньше?Является ли результат, которого я ожидаю, реалистичным?

Заранее спасибо.

...