Короткая версия
Я набил API, который позволяет искать картинки похожую на искомую.
API:
бесплатный
на один запрос выдает до 20 похожих картинок.
Ограничние - 100 запросов в день. Если надо больше - пишите, будем обсуждать LINK.
Cейчас в базе данных 18 миллионов изображений. Надеюсь, в ближайшее время, добавлю еще 50M.
API: LINK
Web Demo: LINK. Можно загрузить свою картинку или воспользоваться текстовым поиском. Можно кликать на картинки в результате поиска и смотреть что найдет по ней. Хороший вопрос за сколько шагов можно дойти от чего-то невинного до порнухи или хотя бы обнаженки.
Длинная версия
В прошлом посте я рассказывал, как начал со сбора Feedback для open source библиотеки Albumentations.AI, а вырулил на то, что захотелось запилить сервис по поиску картинок.
Задача картиночного поиска не нова, люди занимаются им много лет и и сервисов, которых позволяют это сделать, отсюда и до завтра.
Типичная задача для нормального человека - вы пишете блог пост или делаете сайт, нужна стильная картинка в высоком качестве, вы идете на Pexels, Unsplash или Gettyimages.
ML инжерены на картинки смотрят под другим углом. Они им нужны для тренировки нейронных сетей.
Обычная рабочая история:
Есть 20 миллионов картинок.
Из них размечено 20k.
Вы натренировали модель на размеченных данных.
Модель имеет точность, ниже требуемой.
Есть бюджет на разметку 10k.
Как выбрать нужные 10k из десятков миллионов?
Когда мы говорим: "Модель работает плохо", мы имеем в виду: "На объектах / ситуациях A, B и C модель работает хорошо и уверенно, а вот на C, D, и F так себе".
Так себе получается потому что C, D, F - это сложные ситуации, либо потому что данных с ними в тренировочных данных маловато.
Например, в задаче Self Driving'а - в данных много обычных машин. А вот скорых, пожарных или полицейских на порядки меньше. Но на дороге относится к этому классу надо с большим трепетом, особенно если они под мигалками.
Как определить картинки с полицейскими машинами?
Стандартным решением для данного вопроса является техника Active Learing.
Берем натренированную модель, которая плохо и неуверенно находит машины служителей порядка.
Смотрим что она предсказывает на неразмеченных данных.
Берем те картинки на которых модель их нашла, но нашла неуверенно, скажем, с вероятностью [0.3-0.7]. Уверенные предсказания пропускаем.
Отправляем на доразметку, добавляем в тренировочные данные и перетренировываем модель.
Если после этого точность модели на данном классе нас не устраивает, а именно так обычно и бывает - повторяем процедуру.
Думаю, все ML инженеры чем-то таким занимались.
Метод настолько стандартный, что на него можно лепить лычку "Best Industry Practice", хотя недостатки он тоже имеет.
Если у вас мало размеченных примеров нужного класса, то модель натренированная на них, будет совсем слабая и мало что найдет на новых данных.
Предсказавать на большом объеме картинок долго и дорого. А если итерировать много раз то очень долго и очень дорого.
Модель будет увеличивать точность на тех типах картинок, которые она и раньше хоть как-то определяла, но если какие-то ситуации она оне могла определить никак, то и итерации не помогут.
Комментарий: у той техники есть единоутробный брат, хоть и не близнец, называется pseudo labeling. Это когда вы игнорируете картинки с неуверенными предсказаниями, но обращаете внимание на те, где модель уверенна с вероятностью [0.9-1]. Добавляете их в тренировочный сет и перетренировываете. Да, то, что модель очень уверенна что полицейская машина тут есть, не означает, что она там и правда есть, но работает техника хорошо, особенно если докинуть Test Time Augmentation, пост обработку, ансамбли из моделей, soft labels и прочие соревновательные трюки.
Есть альтернативный вариант.
Чем мы занимались выше? Мы искали картинки, похожие на искомую. Причем похожесть мы определяли как "модель неуверенно ведет себя на картинках A и B", значит они похожи.
Слово похожи можно определить по другому, а именно семантически.
Пример того, что выдет мой сервис на запрос "woman on a bicycle". Картинки разные, но видно, что все они соответсвуют запросу.
С технологической точки зрения все прямлонейно:
Берется база данных картинок.
Каждая картинка перегоняется в векторное представление.
При поиске вектор исходной картинки сравнивается с векторами в базе данных. Чем меньше расстояние между ними, тем больше похожи картинки.
Любой картиночный поиск примерно так и работает, что в интернете, что Face ID в вашем iPhone.
Преимущество данного метода в том, что находить векторное представления нужно только один раз. И после этого можно искать, что полицейские машины, что девушек на велосипеде, что плюшевую панду.
Недостаток же состоит в том, что правильно перегонять в векторное представление, да так, чтобы это работало на картинках разного типа сложно. Причем сложность скорее научная, нежели инженерная. Обычная схема с - давайте возьмем Resnet50 / EfficientNet / InceptionNet, натренированные на ImageNet и будем их использовать как-то работает, но скорее плохо, нежели хорошо.
Q: Что мы имеем сейчас?
API, в котором можно сделать запрос картинкой, URL с картинкой или текстом и получить ссылки на 20 похожих картинок.
Демо на сайте, где вы можете потыкать, позагружать и оценить качество поиска.
Q: А что дальше?
Сейчас это технология в поисках продукта. Нужны какие-то применения, причем воспроизводимые, причем не специалистами.
Cейчас все выглядит так, что дальше я буду писать плагины для бесплатных инструментов разметки и анализа датасетов и блог посты которые покажут как все удобно и полезно.
Хотя если у вас есть более оригинальные идеи - я весь внимание. Пишете - будем общаться и вместе думать.