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


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 Я мог пропустить цитирование нескольких приемов. Не утверждая, что это исчерпывающий список.


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/ ].


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.