Миллион домашних фотографий: лица, лица, лица

    Итак, все фотографии разложены по папкам и находить фотографии Новых годов или дней рождения стало быстро и удобно. Фотографии из отпусков тоже можно найти относительно быстро, но хотелось большего. А именно, искать по людям и не просто по людям, а по набору людей, например, найти все совместные фотографии детей или фотографии с бабушкой и т.д.

    Поэтому я решил немного углубиться в так называемый Face Recognition.

    Все просто?

    С первого взгляда, когда смотришь на тематические статьи, кажется, что со стороны пользователя все просто: взял по одной фотографии человека, сказал системе, что это, мол, Саша, Алиса, Тима; потом на вход дается набор фотографий и система однозначно (ну ок, не однозначно, а с некоторой большой вероятностью) устанавливает «кто есть кто». Но на практике так работает, если надо отличить Байдена от Обамы на протокольных фотографиях из Белого дома. Не совсем так работает, когда нужно различать лица на домашних фотках (плохой ракурс, освещение, перекрытие лиц предметами и т.д.). Совсем не так работает, когда на фотографиях близкие родственники. И почти никак не работает если фотографии покрывают всю жизнь от младенчества до зрелости (я и сам часто не могу отличить фотографию одного своего ребенка от другого если нет контекста или хотя бы даты снимка).

    Еще, смотря на коммерческие системы, кажется, что стоит дать на вход одну фронтальную фотографию и лицо будет распознано во всех ракурсах и на всех кадрах. Но, как показал опыт, часто многие системы просто пропускают «не очень хорошие» лица: перекрытые, в профиль и т.д, а пользователь даже и не узнает, что на этой фотографии лицо было проигнорировано, да и доступ к алгоритмам коммерческих систем не всегда есть, так что пришлось работать с тем, что нашел в opensource.

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

    Но об этом чуть позже.

    Белогривые лошадки?

    Вначале, я, как любитель серверов и всего облачного, решил, что, наверное, можно не изобретать велосипед и воспользоваться готовыми облачными решениями. 

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

    В итоге «белогривые лошадки» помчались без оглядки мимо, а я принялся за реализацию локально-серверного варианта. Тем более, что какой-никакой сервер дома уже стоял и процессор там большую часть времени простаивал.

    На случай, если кого интересуют облачные решения, оставлю пару ссылок:

    https://azure.microsoft.com/en-us/services/cognitive-services/face/

    https://cloud.google.com/vision/docs/face-tutorial

    https://aws.amazon.com/rekognition/

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

    CPU -> GPU

    Сначала я, будучи наивным, запустил поиск лиц по алгоритму CNN (см. ниже) на CPU. 

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

    Но, как и многие, я знал, что для ускорения некоторых типов вычислений можно применять GPU. Так вот, Face Recognition как из тех типов вычислений. Поэтому, почитав отзывы и подобрав подходящий вариант, я помчался на местную онлайн барахолку и за довольно небольшую сумму наличности купил GeForce GTX 1050 Ti. И, даже на такой скромной карточке, процесс пошел куда шустрее… меньше секунды на одну фотографию! Но, увы, это не происходит по щелчку пальцев. Вначале надо чтобы весь зоопарк библиотек смог с этой видеокарточкой заработать.

    И тут начинается веселье: сперва надо поставить драйвера для видеокарточки и CUDА. Потом поставить… библиотеки с поддержкой CUDА? Нет, потом надо ставить сборочное окружение, так как теперь все те библиотеки, что запросто встали из репозиториев без поддержки GPU ускорения придется собирать и ставить руками.

    Настройка всего этого зоопарка — тема отдельной статьи и даже не одной (благо на просторах Интернета их немало), но в первый раз все это заняло пару вечеров и немало дискового пространства.

    Итак, сервер настроен, библиотеки стоят, вентиляторы охлаждения CPU и GPU работают на малых оборотах в ожидании задач, можно и начать распознавать лица.

    Этапы распознавания

    Весь этап распознавания лиц на фотографии можно разбить на несколько этапов:

    1. Нахождение лиц на фотографии (face detection)

    2. Поиск элементов лица (landmarks detection)

    3. Кодировка лица (face encoding)

    4. Сравнение лица с шаблонами (face matching)

    Нахождение лиц на фотографии можно делать разными способами, но самые популярные это:

    • Гистограмма направленных градиентов (HOG).

    • Алгоритм на базе сверточных нейронных сетей (CNN).

    HOG работает быстро, вполне достаточно CPU, но распознает хуже и только фронтальные лица.

    CNN целесообразно использовать только на GPU, зато распознает гораздо лучше и во всех возможных позах.

    Я использовал реализации этих алгоритмов из библиотеки face_recognition (пришлось немного ее модифицировать, чтобы бы заставить работать с элементами лица полученными в других библиотеках, см. ниже). Эта библиотека является по сути удобной оберткой над dlib.

    При первом же прогоне полноформатной фотографии на 8 мегапикселей с цифрового фотоаппарата, видеокарта сказала: «Упс» и выкинула исключение о том, что, мол, милый друг, моих 4 GB видеопамяти для этой задачи маловато. Поэтому волевым решением было решено урезать все входные фотографии до 1000 пикселей по длинной стороне (max_image_size в конфиге, если что), этого размера вполне достаточно, если вас не сильно интересуют лица всяких прохожих далеко на заднем плане (о да, иногда, в процессе отладки, там попадались довольно странные лица)

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

    Некоторые алгоритмы также позволяют находить элементы лица в трёхмерных координатах, что полезно, например, при поиске направления поворота лица.

    Я «игрался» с двумя алгоритмами: первый из упомянутой выше библиотеки face_recognition (она же dlib), второй из библиотеки face-alignment.

    Первый работает, в общем-то, неплохо, но увы, только на фронтальных фотографиях. На фотографиях в профиль начинается «веселье». И самое главное «веселье» в том, что алгоритм не определяет фас или профиль, а просто находит фас по мере всех своих «нейроспособностей». В итоге весьма весомая часть распознанных лиц выглядит примерно так:

    Это меня немало так опечалило, и я предпринял две попытки это как-то исправить.

    Вначале, решил «в лоб» научить нейронную сеть отличать хороший результат от плохого, руками отобрал примерно 10000 фотографий с хорошим/плохим результатом настроил нейронку и получил точность… около 80%, что было совсем недостаточно, так как до этого система примерно на таком же количестве искала точки корректно. Да, немного точность повысилась, но процент брака, а соответственно потенциальной ручной работы, был велик.

    Затем я решил предпринять попытку настроить нейронку на распознание лиц в фас и в профиль. И… достиг примерно такого же результата. В общем, для таких экспериментов нужно куда большая база образцов, иначе точность будет так себе. На все эти мытарства ушло около месяца, а потом я наткнулся на второй алгоритм, и проблемы исчезли. Да, я немного углубил свои познания в нейронных сетях, но, так сказать, осадочек остался.

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

    Для лучшего распознавания элементов лица некоторым алгоритмам (например из библиотеки deepface) желательно чтобы лицо было выровнено по линии глаз, но некоторые обходятся и без этого (из face_recogintion, dlib).

    Кодировка лица заключается в переводе изображения лица (или только координат полученных элементов лица) в то представление, в которым можно осуществлять сравнение двух лиц. Чаще всего это матричный вид. Иногда этот этап совмещен с предыдущим. Особых тонкостей и возможностей тонкой настройки тут нет, просто приходиться использовать вариант из той библиотеки, с помощью которой осуществлен поиск элементов лица.

    После кодировки лицо можно сравнить с кодировками шаблонов других лиц и по «близости» к ним судить о принадлежности одному или другому человеку.

    Вот как раз с шаблонами и началась самая большая заморочка.

    При малом количестве шаблонов (я в начале взял по одной фотографии лица каждого человека которого надо было распознавать, потом по 10) у меня так и не получилось подстроить пороги срабатывания так, чтобы близкие родственники однозначно распознавались, кто есть кто. Поставишь большой порог, система путает братьев/сестер, поставишь маленький, и для многих фотографий соответствия вообще не находится. В итоге, методом многократных итераций, подобрал максимальный порог при котором не было путаницы между отдельными людьми и смирился с тем что шаблонов придется делать много, очень много. Теперь если взять фотографии за тот год из которого нет ни одного шаблона, то лишь где-то две трети лиц будут однозначно распознаны, остальные либо попадут в категорию «вроде бы похож» (weak match) либо вообще не распознаны, такие приходиться посмотреть глазами, добавить в шаблоны и повторить итерацию сравнения.

    «Профильно-фронтальные» проблемы

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

    К сожалению, я не смог найти в открытом доступе готовых алгоритмов которые решают эту задачу и смирился с тем что шаблонов потребуется много. При этом я также понял, что в большинстве случаев для исходных задач (а ну-ка найди мне фотографии Алисы с бабушкой) чаще всего фотографии в профиль не так важны, поэтому добавил в систему возможность отсекать фотографии в профиль, тем самым снижая объем ручной работы. Так что, если кто-то захочет воспользоваться моей системой, но при этом не готов на подвиг в виде бессонных ночей рассматривания сотен и тысяч (пусть даже любимых) лиц, то можно просто использовать конфигурационный файл с именем frontal.cfg и снизить объем последующей ручной работы в несколько раз.

    А что насчет видео?

    Разобравшись с фотографиями, я решил, а не замахнуться ли нам на Вильяма, понимаете ли, нашего Шекспира распознавание лиц в видео? Эта задача, с практической точки зрения, выглядела даже более полезной чем предыдущая, так как, если на фотографии по иконкам в режиме предпросмотра можно довольно быстро понять кто есть кто, то на видео эта задача уже практически нерешаемая, лицо-то в видео далеко не всегда на первом же кадре. По реализации эта задача не очень сильно отличается от работы с фото, только вместо одного кадра на файл их теперь несколько тысяч.

    В начале сделал «в лоб»: распознавать все кадры и все лица, но после прогона первых нескольких дней было решено сделать несколько оптимизаций, так как объем ручной работы предстоял немалый, да и ждать обработки всех видео файлов пришлось бы не один месяц.

    Во-первых, распознавать только первые несколько минут видео (max_video_frames в конфиге) так как, чаще всего, все главные действующие лица уже появились на видео. Во-вторых, распознавать не каждый кадр, а с некоторым прореживанием (video_frames_step в конфиге) так как главные действующие лица не мелькают в кадре лишь на мгновение, а держатся долго. Ну и в довершение, лицо должно попасться не в одном кадре, а в нескольких (min_video_face_count в конфиге) по той же причине, если лицо только мигнуло, то для исходной задачи оно не так уж и важно.

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

    Если кому-то захотелось воспользоваться моими наработками, все исходники и краткая инструкция тут.

    Под катом я приведу

    несколько скриншотов и сценариев использования системы

    Представим, что вы из тех людей, что читают README файлы и систему уже поставили и даже запустили.

    Перед вами главное окно. Запустим распознавание папки:

    «Recognition» -> «Add new files…»

    (первый запуск будет довольно долгий, так как библиотеки подгружают необходимые модели из Интернета)

    Получим кучу нераспознанных лиц:

    Добавим (кликом на нужные или выделением с последующим кликом на одну из выделенных) их в шаблоны, введем новое имя для прекрасной незнакомки:

    По мере добавления новых людей, список будет расширяться и вводить имена будет не нужно, достаточно выбрать из уже введённых ранее (заглавную фотографию человека можно заменить подложив в папку с шаблонами файл 0_face.jpg). 

    Если в списке очень много людей, то можно начать набирать имя с клавиатуры, при наборе, имя будет подсвечено. Если лицо на фотографии вас не интересует, либо вообще произошла ошибка распознавания, то следует отправить его в корзину (trash).

    Если просочилась ошибка поиска элементов лица, до данную фотографию опасно добавлять в шаблоны, так как совершенно непредсказуемо, что именно потом с ним совпадет. Для этого есть галочка «Bad encoding», текущая фотография будет отнесена к данному человеку, но в сравнениях с другими она участвовать не будет.

    Повторим сравнение: «Match» -> «Rematch folder…».

    После этого часть лиц будет однозначно распознана, а часть попадет в категорию «weak», т.е. похож, но не совсем. По этой категории следует пройтись отдельно и также добавить в шаблоны. Можно не бояться добавить в шаблоны много, это лишь улучшит качество распознания, выделять группу лиц можно с помощью Shift и Ctrl. 

    Пока лица находятся в категории «weak» или «unknown» они не будут синхронизироваться и по ним не будет осуществляться поиск.

    Если для понимания «кто есть кто» нужно больше контекста, есть две подсказки, во-первых, на фотографии отображается год (предполагается что фотографии именованы с помощью системы из прошлой статьи), во-вторых, по клику на иконку

    откроется оригинал фотографии.

    А если хочется узнать с каким именно шаблоном было совпадение можно кликнуть на иконку

    (если она подсвечена зеленым, то значит именно эта фотография и была использована как шаблон).

    Ну распознали мы все, а что дальше?

    Как дальше искать людей? Теперь в базе данных есть информация по каждой фотографии, кто на ней изображен. Отлично! Но как смотреть теперь? Поскольку у меня основной системой просмотра фотографий сейчас является Plex, то я не придумал ничего лучше, чем экспортировать данные о людях на фото в эту его базу в виде тегов. К сожалению, открытого API у них нет, но, к счастью, его база просто хранится в sqlite файле и имеет не очень сложный формат. Поэтому я просто пишу туда теги на прямую. (Не буду грузить статью деталями реализации базы данных Plex, но, если кому-то они интересны, могут посмотреть в исходниках в файле plexdb.py).

    Для синхронизации же непосредственно тегов я сделал отдельный скрипт. На веб не выносил, так как его проще регулярно запускать по крону.

    face-rec-plexsync -a set_tags

    Немного подождать и вуаля! Теперь можно искать!

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

    Например, с помощью вот такого запроса, можно найти все фотографии с Тимой и Алисой за 2020 год

    face-rec-db -a find_files_by_names -f 2020 -n Тима,Алиса

    Понятно, что смотреть фотографии в консоли не очень интересно, но если добавить после команды что-то вроде

    | xargs -I{} ln -s {} /mnt/multimedia/query/ 

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

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

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

    Заключение

    Вот такой вот небольшой пример наведения порядка в домашних фотографиях.

    Многое уже сделано, стало гораздо удобнее, но еще есть масса «хотелок», надеюсь когда-нибудь и до них дойдут руки:

    • Распознать голос в видео и аудио записях. Есть десятки тысяч аудио заметок и искать по ним вообще невозможно, это даже хуже, чем видео.

    • Кроме лиц добавить распознание других объектов: животные, предметы.

    • Как фантазия на будущее, распознавать условия съемки и окружение: горы, море, в помещении и т.д.

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

    Иногда мне кажется, оборачиваясь назад и оценивая затраченное время, что было бы проще оплатить какую-нибудь облачную систему, типа гугл-фото, которая предоставляет в каком-то виде подобный функционал, но, во-первых, локальное хранение (с бекапом, само собой) надежнее и быстрее, а, во-вторых, я получил неоценимый опыт и это главное!

    Спасибо за внимание!

    Комментарии 39

      +2
      Вот за это — отдельное спасибо :)

      Сам таким был.
      Но сейчас стоит другая задача: классифицировать снимки с прошлого и даже позапрошлого века. Сканер дымится, руки устают… Вот бы их все куда-нибудь закинуть, и чтобы само распозналось ;-0

        0
        Мне повезло в этом плане с доцифровой эпохи фотографий всего несколько тысяч, так что я их отсканировал и разложил по местам еще с появлением первых нормальных сканеров.
          0
          В этом смысле очень удачным решением зачастую является Wikimedia Foundation. Загрузив ваши фотографии на Викисклад и разрешив всем свободно использовать их для произвольных целей, вы привлекаете большое сообщество к тому, чтобы опознать их сюжеты.

          Конечно, это работает лишь с фотографиями, которые можно использовать без ограничений. То есть с фотографиями, где авторское право принадлежит вам, или с фотографиями, которые перешли в общественное достояние.
            0
            Провозившись как следует, наконец-то сформулировал свою хотелку. Вопрос не в том, чтобы опознать всех. А в том, что по какому-то набору, в котором, возможно и руками выделить лицо и указать: вот это Ян Феликсович, а это Виктория Юрьевна, в диапазоне от X до Y лет, распознавались конкретные лица и в старшем возрасте
          0
          CUDO --> CUDA, пожалуйста
            +1

            Какое финальное качество распознования?


            Пробовали переводить в чёрно-белые и так распозновать?

              0
              Если говорить о нахождении лиц, то в случае с CNN сложно сказать точные цифры.
              Такое ощущение что находит в 100% (если не брать лица повернутые от камеры больше чем на 90). Специально пропущенные я не искал, а случайно не попадались. В первой тестовой (пара десятков групповых фото) выборке нашел все.
              HOG около 97% фронтальных и совсем плохо если даже немного повернуты.

              Если про кодировку, то алгоритм из face-alignment нормально отрабатывает на ~95% (но то, что не отрабатывает это в основном совсем шлак: не в фокусе, сильно перекрытые или отвернутые), все хорошие отрабатывают отлично.

              Соответственно экспериментами с ЧБ не занимался, впрочем, не исключаю что внутри dlib оно само преобразуется, так как в моих экспериментах по работе непосредственно с сетками ЧБ работает лучше.
                +1

                100% это просто лица или конкретного человека правильно определяет в 100% случаев?

                  0
                  Просто лицо.
                  А дальше очень сильно зависит от того, сколько образцов, насколько отличаются люди и какие выставлены пороги для погрешностей.
                  В моем случае (когда уже обработаны фотографии за несколько лет и добавлено большое количество образцов), если сейчас взять абсолютно новые фотографии тех людей, что уже есть в системе, то около 90% определяется верно.
                    +1

                    Без отношения к распознованию, но было бы интересно собирать статистику просмотров.


                    Тогда можно интересные кейсы делать, типа покажи 10 случайных фото которых не видел.


                    Ну и лайки собирать, тоже вариант.

                      0
                      Ну это уже дело системы просмотра фотографий. А у меня была задача добавить в нее теги, чтобы искать по лицам.
              +1

              Не пробовали это, работает вроде шустро и без видеокарты есть демо в браузере:
              https://justadudewhohacks.github.io/face-api.js/docs/index.html
              А так старая добрая picasa все ещё может работать и все делать из коробки)

                0
                Не пробовали это, работает вроде шустро и без видеокарты есть демо в браузере:

                Не пробовал, но там, судя по беглому описанию, тот же dlib под капотом.
                  +1

                  Но вот в демо я подгружаю свои фотки, и всё распознаётся за несколько секунд на не самом мощном железе.

                    0
                    image
                    Попробовал. Упс.
                    Ну т.е. оно работает, да, но лица в профиль мимо.
                    Собственно все проблемы у меня из-за того, что я решил лица в профиль тоже распознавать.
                +1

                Что-то я не очень понял. Picasa, например, на древнем Core 2 Duo и 2 Gb Ram весьма бодро лица искала и группировала…

                  0
                  А вы уверены, что были найдены все лица, а не только фронтальные?
                  Большинство программ просто ищет по фото, а не подсвечивает лица, поэтому увидеть что было пропущено весьма непросто.
                  Ну и плюс сгруппировать и сопоставить все группы одному человеку с этим пока даже гугл-фото весьма и весьма лажает.
                  +2

                  Для желающих рассортировать свой каталог фотографии по лицам (и местам и другим другим категориям), но не желающим для этого разбираться в нейронных сетях или сливать личную информацию в Гугл/Эппл -


                  Попробуйте synology moments.
                  То же фото-облако, только на вашем собственном железе. Я был полностью удовлетворен.

                    +1

                    Уже вот-вот выйдет DSM 7, в котором приложения Photo Station и Moments полностью переделаны и совмещены в одно

                      0
                      А я правильно понимаю, что оно работает только на их фирменном и весьма недешевом железе?
                        +3

                        Есть бесплатный опенсорсный порт их софта — XPEnology. Да-да, название придумано русскими :)


                        Однако после полугода использования Synology DS920+ могу сказать, что качество железа и удобство работы более чем оправдывает его стоимость.

                          +1
                          Если для DSM7 смогут сделать загрузчик, то на условно произвольном железе тоже будет работать. Гуглить XPEnology
                          +2
                          Я пришёл в эту публикацию потому что знал, что в комментариях кто-то подскажет готовое решение для ленивых. Большое спасибо! Теперь есть чем занять свою домашнюю DSку.
                          –1
                          «Лица, лица, лица...»
                          В общем-то, неплохой вариант. Было предложение авторизировать пользователей ватер-клозета по индивидуальному рисунку складок, оказывается они более уникальны, чем черты лица.
                            +1
                            можно позавидовать людям, у которых такая большая семья и столько разных фотографий, что без распознавания лиц никак не обойтись…
                              +2
                              в postgres есть уже давно такой тип как CUBE — в идеально хранятся матрицы с лицами. Потом можно одним запросом находить самые похожие лица. Вообще я 2 года назад сделал на этой же библиотеке поисковик по фейсам за 2 секунду по 300к фейсам с википедии искала на довольно плохом хостинге.
                                0
                                Спасибо. Про CUBE знаю, но не хотелось привязываться к «взрослой» СУБД. Да и скорость поиска тут не важна, он только на этапе подготовке данных и на фоне остальных операций крайне незначительно времени занимает. А в основном режиме работы поиск идет только по тегам, а это вообще не требует ничего специфического.
                                +1
                                Спасибо за статьи.

                                Тоже интересовался темой, потому что не хочу выкладывать фотографии в облако.
                                Нашёл opensource приложение на Go PhotoPrism, которое умеет распознавать объекты на фотографиях (TensorFlow) и web-ui для просмотра и поиска фотографий. Есть демо — demo.photoprism.org/browse

                                В случае работы на Mac OS задача облегчается тем, что все модели для распознавания объектов на фотографиях уже есть в ОС и с приложением osxphotos можно разметить свои фотографии, метаинформацию хранить в sqlite. Вот еще занимательная статья про то, как найти лучшую фотографию с пеликаном.

                                Интересно, может где-то есть обученные модели распознавания предметов и животных в открытом доступе?
                                  +2
                                  PhotoPrism плохонько работает. Чёрную кошку распознал только на трёх фото из нескольких десятков, хлебушек счёл портретом и так далее. там под капотом NasNet, SOTA 2017 Года: accuracy of 82.7% top-1 and 96.2% top-5 on ImageNet.
                                    +1
                                    Почему так? Модели не очень?
                                    0
                                    Спасибо за ссылку, посмотрю.
                                    Довольно большой каталог датасетов для создания различных моделей можно найти тут www.tensorflow.org/datasets/catalog/overview?hl=en
                                    Насчет уже обученных моделей не подскажу, не приступал еще к этой задаче.
                                    +1
                                    pypi.org/project/face-recognition – вполне ок. Я вставил ее в свой самописный iPhoto, она за 1-2 дня обработала тысяч сорок фоток на дохленьком двухядерном Celeron 1.6GHz. Главное было обрабатывать scaled фотки, а не оригиналы 6000x4500px (разницы в точности я не заметил).

                                    Главной проблемой оказалось не найти лица, а корректно идентифицировать людей, с учетом того, что это семейный архив, и условная Маша в 2020 году очень похожа на бабушку Клаву в 1925 :-)
                                      0
                                      Подозреваю что вы использовали ее с настройками по умолчанию, значит с HOG, он да, на CPU вполне норм идет.

                                      Главной проблемой оказалось не найти лица, а корректно идентифицировать людей, с учетом того, что это семейный архив, и условная Маша в 2020 году очень похожа на бабушку Клаву в 1925 :-)

                                      Значит вы ощутили всю мою боль! :)
                                        +1

                                        Если знать дату фотографии и добавить простую логику, то ясно что баба Клава не могла выглядить как Маша в 2018 году.


                                        Есть ещё модели для определения возраста, там ещё пооще с логикой должно быть.

                                          0
                                          Думал добавить, правда руки так и не дошли.
                                          Но добавил отображение года в интерфейс проверки качества, очень помогает.
                                      +2

                                      Сейчас для поиска и распознавания лиц существуют более продвинутые библиотеки, например https://github.com/deepinsight/insightface.


                                      Правда для быстрой работы GPU уже просто необходимы. С некоторыми оптимизациями сетки по ссылке выше можно запускать на видеокартах GTX 1080 на скоростях около 70-90 кадров в секунду

                                        0
                                        Выглядит интересно! Посмотрю, спасибо.
                                          +2

                                          Если будет интересно попробовать, у меня на гитхабе есть докеризованная версия обернутая в FastAPI и сконвертированная в TensorRT для повышения производительности: https://github.com/SthPhoenix/InsightFace-REST

                                            0
                                            вы крутой.
                                            а на TensorRT действительно в разы быстрее работают модели insightface

                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                      Самое читаемое