Нейронные сети - Найти наиболее похожие изображения


11

Я работаю с Python, scikit-learn и keras. У меня есть 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 изображения. Одно для сравнения, одно похожее (близкое) и одно не очень похожее (отдаленное) изображение. Это ваши данные обучения / тестирования / проверки. Обучение вашей сети этим образцам и прогнозирование правильного порядка (классифицируйте похожие по не похожим изображениям) в целом позволяет сети научиться упорядочивать изображения на основе их сходства.

В целом, этот подход сравнительно сложен. Это может быть слишком сложно, но вы также попросили лучший способ сделать это, и Deep Ranking достигает очень высокой точности значений.


Благодарю за ваш ответ. Это интересный (я проголосовал за это). Идея о триплете хороша, хотя я не совсем уверен, почему использование триплетов изображений обязательно лучше, чем использование пар изображений для моей задачи. Если вы хотите, вы можете объяснить это более подробно на своем посту. Также я посмотрю на TiefVision.
Изгой

@Universalis спасибо за подсказку (и upvote). Я обновил свой ответ некоторыми подробностями о триплетах и ​​их рассуждениях. Бумага также написана очень хорошо, поэтому посмотрите на все детали. Хотя могут появиться новые причудливые способы сделать это с тех пор, как появились TiefVision и DeepRanking.
Gegenwind

Еще раз спасибо за Ваш ответ. Да, я посмотрел на бумагу, и было довольно ясно, что вы добавили в свой ответ. В этом смысле я уже понял, что вы добавили в свой ответ, и мой вопрос был более понятным: почему бы не использовать 2 изображения (пару) вместо 3 изображений (триплет) для ранжирования изображений в соответствии с их сходством? Каково дополнительное преимущество использования триплетов вместо пар?
Изгой

Хм, может быть, я неправильно понял ваш подход. Триплет предоставляет сравнительную информацию о том, что изображение 1 находится ближе к изображению 2, чем к изображению 3. При наличии только 2 изображений и утверждении «эти 2 сходны» отсутствует сравнительный коэффициент «схожий в этом отношении», поскольку в этом подходе вы предполагаете, что простое расстояние вектора признаков не говорит вам достаточно. другими словами: вы изучаете сходство по заказу, и вам не хватает этого, не имея по крайней мере 2 предметов для заказа.
Gegenwind

Еще раз спасибо за ваш ответ. Тем не менее, даже сейчас и после более внимательного прочтения статьи мне не ясно, почему для этого неконтролируемого подхода вам обязательно нужны тройки, а не пары изображений. При использовании меток ясно, что при использовании триплетов вы получите полный рейтинг сходства изображений, которые вы не можете получить с помощью пар. Но в этом (своего рода) неконтролируемом подходе, который вы предлагаете, почему бы не сравнить значения функции потерь для каждой пары изображений (всегда одно изображение пары является входным изображением), чтобы найти, например, 5 наиболее похожих на входное изображение?
Изгой

2

Я выбрал бы классификатор, как VGG-16, который хорошо работает на классах imagenet. Затем пропустите ваши изображения часов через него. Конечно, вы можете ожидать, что выход будет в основном «смотреть» с высокой вероятностью.

Тем не менее, вы получаете дополнительные функции: уровень активации всех других категорий. Это дает вам вектор тысячи значений между 0 и 1.

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


Спасибо за ваш ответ (upvote). Да, я это имел в моем уме , и в некотором смысле это связано с первым вариантом , который я представил на своем посту. Поэтому я также думал об использовании других детекторов , как SURF ... Я буду видеть , если они являются достаточно успешными ...
Outcast

2

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

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

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

Watch1: 0.51

Watch2: 0.30

Watch3: 0.25

CNN говорит, что он на 51% уверен, что Watch1 - это часы на входном изображении. Но также верно то, что он выглядит более похожим, следующий будет более похожим на Watch2 и так далее.

Если вы не получите хороших результатов, делайте как обычно. Поэкспериментируйте с параметрами и / или добавьте больше слоев. Постарайтесь выяснить, где она терпит неудачу. Получив это представление, вы можете использовать его для выбора более специализированного типа сверточной сети для вашей конкретной задачи. Ищете что без предварительного знания о том, как она будет выполнять это не правильный подход. Я хотел бы предложить вам начать с базовой сверточной моделью, а затем работать оттуда.


1
Спасибо за ваш ответ (upvote). Да, у меня уже было увеличение данных в моей голове. Однако ваш ответ совершенно неясен. Что вы подразумеваете под «иметь ярлык для каждых часов»? Ты имеешь в виду маркировку каждого наручного часы по отдельности или маркировку их как пары с другими в зависимости от того, похожи они или нет? (Если это первое, то объясните, почему это эффективно, пожалуйста)
Изгой

Это первое предложение, я предполагал, что у вас уже есть удобный способ обозначить их всех. Это в основном самое основное решение, поэтому оно не будет эффективным. Я предположил, что базовая модель может дать вам достаточно информации, чтобы вы могли использовать более специализированную модель. Глубокий рейтинг выглядит очень многообещающе, как сказал @Gegenwind. Я обновил свой ответ, чтобы сделать его немного более понятным.
Zimio

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