Можно ли дать изображения переменного размера в качестве входных данных для сверточной нейронной сети?

17

Можем ли мы предоставить изображения с переменным размером в качестве входных данных для сверточной нейронной сети для обнаружения объектов? Если возможно, как мы можем это сделать?


Но если мы попытаемся обрезать изображение, мы потеряем некоторую часть изображения, и если мы попытаемся изменить его размер, то четкость изображения будет потеряна. Означает ли это, что использование встроенных сетевых свойств является лучшим, если ясность изображения является основным соображением?

Ашна Эльдо
источник

Ответы:

9

Есть несколько способов сделать это. Большинство из них уже были освещены в ряде публикаций на StackOverflow, Quora и других веб-сайтах с контентом.

Подводя итог, большинство из перечисленных методов могут быть сгруппированы в два класса решений, а именно:

  1. Трансформации
  2. Собственное сетевое свойство

В преобразованиях можно искать такие методы, как

  • Изменение размера , которое является самым простым из всех упомянутых методов
  • Обрезка , которая может быть выполнена в виде скользящего окна или однократного обрезания с потерей информации

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

  • Полностью сверточные сети (FCN) , которые вообще не имеют ограничений на размер входных данных, поскольку после описания размеров ядра и шагов свертка на каждом уровне может генерировать соответствующие выходные данные измерений в соответствии с соответствующими входными данными.

  • Пространственное пирамидальное объединение (SPP) , FCN не имеют полностью связанного плотного слоя и, следовательно, не зависят от размера изображения, но говорят, что если кто-то хотел использовать плотный слой без учета входных преобразований, то есть интересная статья, которая объясняет слой в сеть глубокого обучения.

Ссылки:

  1. https://www.quora.com/How-are-variably-shaped-and-sized-images-given-inputs-to-convoluted-neural-networks
  2. /ai/2008/how-can-neural-networks-deal-with-varying-input-sizes
  3. https://discuss.pytorch.org/t/how-to-create-convnet-for-variable-size-input-dimension-images/1906

PS Я мог пропустить цитирование нескольких приемов. Не утверждая, что это исчерпывающий список.

m1cro1ce
источник
1
Это звучит нормально в теории, но не работает на Tensorflow. У кого-нибудь есть какие-то реализации для этого?
Хоссейн
1
@ Хоссейн Я также столкнулся с некоторыми проблемами при практической реализации, но сегодня я получил CNN переменного размера, работающий в Tensorflow Keras 2.x с некоторыми ограничениями. В своем ответе я опубликовал план подхода к некоторым практическим деталям. Удачи!
J Trana
4

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

1. Глобальное объединение: избегайте полностью связанных слоев в конце сверточных слоев, и вместо этого используйте объединение (такое как глобальное среднее объединение), чтобы уменьшить ваши карты объектов от формы (N, H, W, C) (до глобального объединения ) по форме (N, 1,1, C) (после глобального пула), где:

N = количество выборок мини-пакетов
H = пространственная высота карты объектов
W = пространственная ширина карты объектов
C = количество карт объектов (каналов)

As Можно видеть, что выходная размерность (N * C) теперь не зависит от пространственного размера (H, W) карт объектов. В случае классификации вы можете перейти к использованию полностью связанного слоя сверху, чтобы получить логиты для ваших классов.

2. Объединение переменных размеров:Используйте регионы пула переменного размера, чтобы получить одинаковый размер карты объектов для разных входных размеров.

3. Обрезать / изменить размер / заполнить входные изображения: вы можете попробовать изменить масштаб / обрезать / заполнить входные изображения, чтобы все они имели одинаковую форму.


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

4. Создать новые полностью связанные слои: вы можете полностью отбросить исходные полностью связанные слои и инициализировать новый полностью связанный слой с необходимой вам размерностью, а также обучить ее с нуля.

5. Относитесь к полностью связанному слою как к свертке: как правило, мы изменяем карты объектов с (N, H, W, C) на (N, H * W * C) перед подачей его на полностью подключенный слой. Но вы также можете рассматривать полностью связанный слой как свертку с восприимчивым полем (H, W). Затем вы можете просто свести это ядро ​​с вашими картами возможностей независимо от их размера (при необходимости используйте нулевое заполнение) [http://cs231n.github.io/transfer-learning/ ].

Soroush
источник
1

Я должен был разобраться с этой проблемой сегодня, поэтому я решил поделиться тем, что сработало. Я обнаружил, что в Интернете было довольно много ответов и лакомых слов «это может сработать теоретически», но меньше практического «вот как вы конкретно это реализуете».

Чтобы реализовать это с помощью Tensorflow Keras, мне пришлось сделать следующее. Возможно, кто-то еще может найти некоторые из них, которые могут быть изменены, смягчены или отброшены.

  1. Установите вход сети, чтобы разрешить ввод переменного размера, используя «None» в качестве измерения заполнителя для input_shape. Смотрите ответ Франсуа Шоле здесь .
  2. Используйте сверточные слои только до тех пор, пока не произойдет операция глобального пула (например, GlobalMaxPooling2D). Тогда можно использовать плотные слои и т. Д., Поскольку размер теперь фиксирован.
  3. Используйте только размер партии 1. Это позволяет избежать смешанных размеров в партии.
  4. Напишите небольшую пользовательскую последовательность, которая создает пакеты размером 1 из списка входных данных. Я сделал это, чтобы не иметь дело с разными размерами внутри одного массива Numpy.
  5. Используйте Model.fit_generator в вашей пользовательской последовательности для обучения и проверки. (против Model.fit)
  6. По какой-то причине Model.predict_generator выскочил даже при использовании последовательности, как указано выше. Мне пришлось прибегнуть к использованию Model.predict на отдельных входах.

Обратите внимание, что вызовы Model.predict жаловались на производительность - что неудивительно, учитывая неэффективность решения, - но оно работает!

Дж Трана
источник
-2

Да, просто выберите подходящую магистральную сеть, которая не зависит от размера входного изображения, чтобы быть точным значением - большинство сетей удовлетворяют этому критерию.

Симао
источник
3
Вы не ошиблись, но ваш ответ не очень информативен - как насчет его расширения, чтобы объяснить, почему большинство современных CNN могут работать с изображениями переменного размера? Кроме того, каковы пределы этой изменчивости (например, не пытайтесь смешивать изображения разных размеров в одной мини-партии ...)? Большинство людей, приходящих из старомодных MLP (длина ввода фиксирована) или из старомодных CNN (AlexNet & VGG-1X) с их надоедливыми Flattenслоями, не понимают, как современные CNN в принципе могут снимать изображения любого размера.
DeltaIV