Чи можна надати зображення змінного розміру як вхід до згорткової нейронної мережі?


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-s размера
  3. https://discuss.pytorch.org/t/how-to-create-convnet-for-variable-size-input-dimension-images/1906

PS Можливо, я пропустив, посилаючись на кілька прийомів. Не стверджуючи, що це вичерпний перелік.


1
Теоретично це звучить нормально, але не працює на Tensorflow. Хтось має для цього реалізацію?
Hossein

1
@Hossein Я також зіткнувся з деякими проблемами в практичній реалізації, але сьогодні я отримав CNN зі змінним розміром, працюючи в Tensorflow Keras 2.x з деякими обмеженнями. У своїй відповіді я опублікував контур підходу стосовно деяких практичних деталей. Удачі!
J Trana

4

Самі згорткові шари та шари об'єднання не залежать від вхідних розмірів. Однак висновок згорткових шарів буде мати різні просторові розміри для зображень різного розміру, і це спричинить проблему, якщо після цього у нас буде повністю пов'язаний шар (оскільки наш повністю пов'язаний шар вимагає введення фіксованого розміру). Є кілька рішень для цього:

1. Глобальне об'єднання: уникайте повністю з'єднаних шарів в кінці згорткових шарів, а замість цього використовуйте об'єднання (наприклад, Global Average Pooling), щоб зменшити карти ваших функцій із форми (N, H, W, C) (перед глобальним пулом) ) до форми (N, 1,1, с) (після того, як глобального пулу), де:

N = Число зразків minibatch
H = просторової висотою об'єктом карти
Ш = шириною просторової картою функції
C = кількість функціональних карт (канали)

як Як видно, розмірність виводу (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.