CNN для 2d оценки поворота изображения (угловая регрессия) - PullRequest
3 голосов
/ 05 июня 2019

Я пытаюсь построить CNN (в Керасе), который может оценить вращение изображения (или 2-го объекта). Таким образом, в основном, вход является изображением, а выход должен быть его вращением.

Мой первый эксперимент - оценить вращение цифр MŃIST (начиная только с одной цифры «класс», скажем, «3»). Поэтому я извлек все 3 с из набора MNIST, а затем построил набор данных «повернутые 3 с», несколько раз произвольно поворачивая эти изображения и сохраняя повернутые изображения вместе с их углами поворота в качестве наземных меток истинности.

Итак, моей первой проблемой было то, что двумерное вращение является циклическим, и я не знал, как смоделировать это поведение. Поэтому я закодировал угол как y = sin (ang), x = cos (ang). Это дает мне мой набор данных (повернутые изображения 3s) и соответствующие метки (значения x и y).

Для CNN, в качестве начала, я просто взял пример CNN keras MNIST (https://keras.io/examples/mnist_cnn/)) и заменил последний плотный слой (который имел 10 выходов и активацию softmax) на плотный слой, который имеет 2 выхода (x и y) и активация tanh (поскольку y = sin (ang), x = cos (ang) находятся в пределах [-1,1]).

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

При обучении сети я вижу, что потери уменьшаются и сходятся к определенной точке. Однако когда я проверяю прогнозы и основную истину, я наблюдаю (для меня) довольно удивительное поведение. Почти все прогнозы x и y имеют тенденцию к 0 или +/- 1. А так как «декодирование» моего поворота - ang = atan2 (y, x), прогнозы обычно составляют +/- 0 °, 45 °, 90, 135 ° или 180 °. Тем не менее, мои данные тренировок и испытаний имеют только углы 0 °, 20 °, 40 °, ... 360 °. Это действительно не изменится, если я изменю сложность сети. Я также безуспешно поиграл с параметрами оптимизатора.

Что-то не так с предположениями: - x, y кодировка для угла - активация tanh должна иметь значения в [-1,1] - cosine_proximity как функция потерь

Заранее спасибо за любые советы, советы или указание на возможную ошибку, которую я совершил!

1 Ответ

0 голосов
/ 06 июня 2019

Трудно дать вам точный ответ, поэтому давайте попробуем несколько идей:

  • Перейдите с косинусного приближения на MSE или другие потери и проверьте, изменилось ли что-либо.
  • Изменить способ кодирования цели. Вы можете просто представить угол в виде числа от 0 до 1. Это не кажется проблемой, даже если углы являются циклическими.
  • Убедитесь, что шаги предварительной обработки / дополнения имеют смысл для этой конкретной задачи.
...