Нейронні мережі - Знайдіть більшість подібних зображень


11

Я працюю з Python, scikit-learn та керами. У мене є 3000 тисяч зображень наручних годинників, таких як: Watch_1 , Watch_2 , Watch_3 .

Я хочу написати програму, яка отримує на вхід фото реального годинника, який може бути зроблений за менш ідеальних умов, ніж фотографії вище (різний колір тла, темніша блискавка тощо) та знайти найбільш подібні годинники серед 3000 з них. Під подібністю я маю на увазі, що якщо я надам в якості фото круглого, коричневого годинника з тонким мереживом, то я очікую як вихідний годинник круглої форми, темного кольору і з тонким мереживом.

Який найефективніший алгоритм машинного навчання для цього?

Наприклад, перейшовши за цим посиланням, я маю на увазі два різних рішення:

1) Використання CNN як екстрактора функцій та порівняйте відстані між цими ознаками для кожної пари зображень із посиланням на вхідне зображення.

2) Використання двох CNN в сіамській нейронній мережі для порівняння зображень.

Ці два варіанти найкращі для цього завдання чи ви б запропонували щось інше?

Чи знаєте ви будь-яку заздалегідь підготовлену нейронну мережу (із заздалегідь визначеними гіперпараметрами) для цього завдання?

Я знайшов кілька цікавих публікацій на StackOverflow про це, але вони досить старі: Post_1 , Post_2 , Post_3 .


Ласкаво просимо на сайт! Вивчіть вбудовування (я рекомендую двійковий хеш для швидкого пошуку в порядку тисячі біт), а потім виконайте пошук подібності.
Емре

Мені приємно бути тут ... ха-ха! ... Так, це гарна ідея, і я вже прочитав цю статтю ...
Оскар

Відповіді:


4

Я не думаю, що архітектура високого рівня як така найкраще підходить, але це, скоріше, залежить від багатьох факторів та деталей. З того, що мені відомо, перший підхід є багатообіцяючим, особливо коли він поширюється на додаткові кроки, зроблені в TiefVision :

  1. Для розмежування відповідної частини зображення від решти використовується додаткова обмежувальна мережа
  2. Функціональні вектори не просто порівнюються безпосередньо, а скоріше використовуються для навчання мережі порівняння за допомогою трійки (вивчення подібності на основі функцій векторів та прикладів для більш і менш подібних випадків).

Ця робота набагато пізніша (2016/17), ніж те, що ви опублікували та поставляється з приємним набором інструментів та більш детальним документом .

Навіщо використовувати трійок aka Deep Ranking?

Як зазначено в коментарях: Чому слід використовувати триплети для подібності зображень, а не вивчати функції векторів та обчислювати їх відстань? Триплети - це спосіб формулювання питання подібності як проблеми навчання замість того, щоб вивчати особливості векторів, які в основному не піклуються про подібність. Цей підхід має особливий сенс у випадках, коли важлива подібність, сприйнята людиною, яка може відрізнятися від сприйняття машиною.

Трійні працюють так: Ви надаєте 3 зображення. Одне для порівняння, одне подібне (близьке) та одне не настільки схоже (віддалене) зображення. Це ваші дані про навчання / тест / перевірку. Навчання вашої мережі на цих зразках та прогнозування правильного порядку (класифікувати схожі на не схожі зображення) загалом дозволяє мережі навчитися замовляти зображення на основі їх подібності.

Загалом цей підхід є порівняно складним. Це може бути переосмислено, але ви також попросили найкращий спосіб зробити це, і глибоке ранжування досягає дуже високих значень точності.


Спасибі за вашу відповідь. Це цікавий (я його підтримав). Думка про триплет хороша, хоча я не зовсім впевнений, чому використання трійки зображень обов'язково краще, ніж використання пар зображень для мого завдання. Якщо ви хочете, ви можете пояснити це детальніше у своєму дописі. Також я погляну на TiefVision.
Вигнаний

@Universalis дякую за підказку (та нагороду). Я оновив свою відповідь ще деякими подробицями про трійки та міркування. Папір також написаний дуже добре, тому погляньте на всі деталі. Можливо, існують нові фантазійні способи зробити це з моменту появи TiefVision та DeepRanking.
Gegenwind

Ще раз дякую за вашу відповідь. Так, я переглянув папір, і було досить зрозуміло, що ви додали до своєї відповіді. У цьому сенсі я вже зрозумів, на що ви додали свою відповідь, і моє запитання чіткіше було таке: чому б не використати 2 зображення (пару) замість 3 зображень (триплет) для ранжирування зображень за їх подібністю? Яка додаткова перевага від використання трійки замість пар?
Вихват

Хм, можливо, я неправильно зрозумів ваш підхід. Триплет надає порівняльну інформацію про те, що зображення 1 ближче до зображення 2, ніж до зображення 3. Маючи лише 2 зображення та заявляючи, що "ці 2 схожі", не вистачає порівняльного коефіцієнта, "подібного в тому плані", тому що при такому підході ви припускаєте, що рівна відстань вектора функцій не говорить вам достатньо. Іншими словами: Ви дізнаєтесь подібність за замовленням, і вам цього не вистачає, не маючи принаймні 2 вироби для замовлення.
Gegenwind

Дякую ще раз за вашу відповідь. Однак навіть зараз і, прочитавши статтю трохи уважніше, мені незрозуміло, навіщо вам потрібні трійки, а не пари зображень для цього непідконтрольного підходу. Під час використання міток зрозуміло, що за допомогою трійок ви отримаєте повний рейтинг подібності зображень, які ви не можете отримати з парами. Але в цьому (своєрідному) непідконтрольному підході, який ви пропонуєте, то чому б не порівнювати значення функції втрати для кожної пари зображень (завжди одне зображення пари є вхідним зображенням), щоб знайти, наприклад, 5 найбільш подібних до вхідне зображення?
Вигнаний

2

Я б вибрав класифікатор, як VGG-16, який добре працює на класах imagenet. Потім запустіть зображення годинника через нього. Напевно, ви можете очікувати, що вихід буде здебільшого "дивитись" з високою ймовірністю.

Однак ви отримуєте додаткові можливості: рівень активації всіх інших категорій. Це дає вектор тисячі значень між 0 і 1.

Ви також можете отримати активацію в різних точках мережі. Тоді подібність цих активацій та виходів повинна бути однаковою між двома випадками, лише якщо зображення схожі.


Дякуємо за вашу відповідь (нагороду). Так, я мав це на увазі, і в певному сенсі це пов'язано з першим варіантом, який я запропонував на своїй посаді. Тож я також думав про використання інших детекторів, таких як SURF ... Я побачу, чи є вони досить успішними ...
Відкритий

2

Я спершу зосередився б на збільшенні даних. Оскільки у ваших зображень білий фон, вам це трохи легше. Перетворіть білий фон у прозорий фон, зменшіть розмір зображення, оберніть його та покладіть у фони, схожі на цільові дані.

Зробіть це купу разів з різною комбінацією і мати етикетку для кожного годинника. Тоді я б запропонував використовувати для класифікації звичайну звивисту нейронну мережу. Кожна мітка матиме оцінку, вибирайте ту, яка має найвищу впевненість, і ця має бути найбільш схожа .

Наприклад, скажімо, ви запускаєте класифікатор із зображенням і отримуєте такий результат:

Watch1: 0.51

Watch2: 0.30

Watch3: 0.25

CNN заявляє, що має 51% впевненості, що Watch1 - це годинник у вхідному зображенні. Але також правдою є те, що саме той, на його думку, виглядає більш схожим, Watch2 буде наступним ще подібним тощо.

Якщо ви не отримаєте хороших результатів, виконайте звичайне. Експериментуйте з параметрами та / або додайте більше шарів. Спробуйте дізнатися, де це не вдається. Отримавши це розуміння, ви можете використовувати його для вибору більш спеціалізованого типу згорткової мережі для вашої конкретної проблеми. Шукати це без попереднього знання того, як це було б - не правильний підхід. Я б запропонував почати з базової згорткової моделі, а потім працювати звідти.


1
Дякуємо за вашу відповідь (нагороду). Так, я вже мав на увазі збільшення даних. Однак ваша відповідь досить неясна. Що ви маєте на увазі під "мати етикетку для кожного годинника"? Ви маєте на увазі маркування кожного годинника окремо або маркування їх як пари з іншим, залежно від того, схожі вони чи ні? (Якщо це колишній, то поясніть, чому це ефективно, будь ласка)
Згодом

Це колишня пропозиція, я припускав, що ви вже мали зручний спосіб позначити їх усіма. Це в основному найосновніше рішення, тому воно не буде ефективним. Моя пропозиція полягала в тому, що основна модель, можливо, може дати вам достатньо інформації для того, щоб переслідувати більш спеціалізовану модель. Глибокий рейтинг здається дуже перспективним, як сказав @Gegenwind. Я оновив свою відповідь, щоб зробити її трохи більш зрозумілою.
zimio

Гм, так, тепер зрозуміліше, що ви мали на увазі .... Це, безумовно, хороша загальна пропозиція: почніть з основ і переходите крок за кроком до більш складних речей ... Спасибі в будь-якому випадку ...
Зігнаний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.