Я работаю с Python, scikit-learn и keras. У меня есть 3000 тысяч изображений лицевых часов, таких как следующие: Watch_1 , Watch_2 , Watch_3 .
Я хочу написать программу, которая получит в качестве входных данных фотографию настоящих часов, которые могут быть сделаны в менее идеальных условиях, чем фотографии выше (другой цвет фона, более темное освещение и т. Д.), И найду наиболее похожие часы среди 3000 из них. Под сходством я подразумеваю, что если я приведу в качестве фотографии круглые коричневые часы с тонким кружевом, то я ожидаю в качестве выходных часов круглой формы, темного цвета и с тонким кружевом.
Какой алгоритм машинного обучения наиболее эффективен для этого?
Например, по этой ссылке у меня в голове два разных решения:
1) Использование CNN в качестве извлечения характеристик и сравнить расстояния между этими функциями для каждой пары изображений со ссылкой на входном изображение.
2) Использование двух CNN в сиамской нейронной сети для сравнения изображений.
Эти два варианта лучше всего подходят для этой задачи, или вы предложите что-нибудь еще?
Знаете ли вы какие-либо предварительно обученные нейронные сети (с заранее определенными гиперпараметрами) для этой задачи?
Я нашел несколько интересных постов в StackOverflow по этому поводу, но они довольно старые: Post_1 , Post_2 , Post_3 .
источник
Ответы:
Я не думаю, что архитектура высокого уровня как таковая лучше всего подходит, но скорее зависит от многих факторов и деталей. Из того, что я знаю о первом подходе, многообещающе, особенно если его дополнить дополнительными шагами, как это сделано в TiefVision :
Эта работа намного новее (2016/17), чем вы опубликовали, и поставляется с хорошим набором инструментов и более подробным документом .
Зачем использовать триплеты aka Deep Ranking?
Как указано в комментариях: почему следует использовать триплеты для сходства изображений вместо изучения векторов объектов и расчета их расстояния? Триплеты - это способ сформулировать вопрос сходства как проблему обучения, а не изучать векторы признаков, которые в основном не заботятся о сходстве. Этот подход особенно важен в тех случаях, когда важно восприятие человеком сходства, которое может отличаться от восприятия машины
Триплеты работают так: Вы предоставляете 3 изображения. Одно для сравнения, одно похожее (близкое) и одно не очень похожее (отдаленное) изображение. Это ваши данные обучения / тестирования / проверки. Обучение вашей сети этим образцам и прогнозирование правильного порядка (классифицируйте похожие по не похожим изображениям) в целом позволяет сети научиться упорядочивать изображения на основе их сходства.
В целом, этот подход сравнительно сложен. Это может быть слишком сложно, но вы также попросили лучший способ сделать это, и Deep Ranking достигает очень высокой точности значений.
источник
Я выбрал бы классификатор, как VGG-16, который хорошо работает на классах imagenet. Затем пропустите ваши изображения часов через него. Конечно, вы можете ожидать, что выход будет в основном «смотреть» с высокой вероятностью.
Тем не менее, вы получаете дополнительные функции: уровень активации всех других категорий. Это дает вам вектор тысячи значений между 0 и 1.
Вы также можете извлечь активацию в различных точках сети. Затем сходство этих активаций и выходов должно быть похожи два случая, только если изображения похожи.
источник
Я бы сосредоточился на увеличении данных в первую очередь. Поскольку ваши изображения имеют белый фон у вас есть немного легче. Поверните белый фон в прозрачный фон, масштаб вниз изображения, повернуть его и поместить его в фон, похожий на ваш целевой данных.
Делайте это несколько раз с разными комбинациями и наклейте ярлык для каждой модели. Тогда я бы предложил вам использовать обычную сверточную нейронную сеть для классификации. У каждого лейбла будет оценка, выберите тот, который имеет наибольшую уверенность, и этот должен быть наиболее похожим .
Например, допустим, вы запускаете классификатор с изображением и получаете такой результат:
CNN говорит, что он на 51% уверен, что Watch1 - это часы на входном изображении. Но также верно то, что он выглядит более похожим, следующий будет более похожим на Watch2 и так далее.
Если вы не получите хороших результатов, делайте как обычно. Поэкспериментируйте с параметрами и / или добавьте больше слоев. Постарайтесь выяснить, где она терпит неудачу. Получив это представление, вы можете использовать его для выбора более специализированного типа сверточной сети для вашей конкретной задачи. Ищете что без предварительного знания о том, как она будет выполнять это не правильный подход. Я хотел бы предложить вам начать с базовой сверточной моделью, а затем работать оттуда.
источник