Как стать автором
Обновить

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

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


Я бы посоветовал для поиска лиц использовать MT-CNN, которая работает очень быстро даже на CPU, точная и к тому же выдаёт координаты 5-ти лицевых меток (глаза, нос, края рта).


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


Эти библиотеки легко нагугливаются, для них есть предобученные веса и кода нужно всего с десяток строк (не считая захват кадра, конечно).


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

библиотека его просто не найдёт

Там есть два детектора, выбираются параметром model=«hog» или «cnn». CNN получше, но более жирный, хотя его можно запускать на GPU. Правда не очень эффективно ускоряется.
Что интересно, даже CNN на CPU работает в один поток. Не могу понять, это ограничение Python'а?

Детектор "cnn" тоже хуже MT-CNN. На гитхабе я видел просьбу добавить поддержку этой сети в dlib, но авторы ответили, что, дескать, если вам надо, то пишите pull request.


К слову, в OpenCV тоже есть поддержка запуска нейронных сетей (поверх фреймворка Caffe) и можно скачать веса для детектора на основе архитектуры SSD. Впрочем, он тоже вместо лиц любит находить колёса автомобилей и кусты.


То, что работает в один поток — это не ограничение Python, из него лишь библиотека запускается. Это сама библиотека виновата, по-видимому.

Спасибо за информацию!
github.com/ipazc/mtcnn Это вот оно? Я правильно понимаю, ускорять можно только с помощью CUDA, OpenCL оно не поддерживает?

Да, одна из. Есть много реализаций под разные фреймворки. Во всех случаях, что я видел, это просто переписанный код из реализации на Matlab (а в нём именно MT-CNN для поиска лиц используется) и конвертированные веса.


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


По поводу CUDA и OpenCL. Я использую CUDA, поэтому особо не могу что-то посоветовать, увы. Если задача запускать на CPU, то, наверное, MXNet с MKL-DNN будет самым шустрым вариантом (можно и на RaspberryPi крутить). Есть реализация под MXNet на github, её несложно превратить в библиотеку. Но вряд ли это будет realtime. Разве что если лицо в кадре одно и кадр не очень большой. Если же задача запустить на GPU без CUDA, то я не знаю, что советовать, так как просто не имею такого опыта.

masai, Позвольте поправить — у OpenCV своя реализация нейронных сетей. Зависимостей от обучающих фреймворков — нет.

Если остался пример с false positive детектированием колёс и кустов — хотелось бы взглянуть.
Позвольте поправить — у OpenCV своя реализация нейронных сетей. Зависимостей от обучающих фреймворков — нет.

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


Если остался пример с false positive детектированием колёс и кустов — хотелось бы взглянуть.

К сожалению, не остался. Я тогда обрабатывал довольно крупный датасет, порядка 4.5 миллионов реальных, не студийных фото. Использовал сперва модель res10_300x300_ssd_iter_140000.caffemodel и количество ложных срабатываний было таким большим, что пришлось отдельной сеткой потом фильтровать. MT-CNN, конечно, тоже не волшебная, и ложные срабатывания бывают, но если пороги подкрутить, их количество очень мало. Если покопаться в статьях, то можно найти и поточнее модели, но этой моделью я доволен. Её нередко упоминают в статьях, когда пишут о предобработке.


Впрочем, не думаю, что мой случай типичный.

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


dkurt Я покопался в старых данных, и должен сказать, что процент ложных срабатываний в мой памяти был выше, чем в реальности. :) SSD неплох, хоть в нашем случае MT-CNN и оказался лучше.


К сожалению, какой-то пример из нашего датасета показать не могу, но я нашёл вот такое фото, которое обманывает детектор:



import cv2
net = cv2.dnn.readNetFromCaffe(
    'opencv_face_detector.prototxt',
    'res10_300x300_ssd_iter_140000.caffemodel')
image = cv2.imread('image.jpg')
image_small = cv2.resize(image, (300, 300)) # Да, собаку немного «сплющит», но некритично
blob = cv2.dnn.blobFromImage(image_small, 1.0,
    (300, 300), (104.0, 177.0, 123.0))
net.setInput(blob)
detections = net.forward()
# Максимальный confidence
print(detections[0, 0, :, 2].max()) # 0.95188487

То есть модель нашла лицо, с confidence ~ 0.95, что не очень хорошо, так как значение достаточно высокое.

Спасибо! Да, действительно находит. Как вариант — можно попробовать скомбинировать с детекторами людей. То есть если мы нашли лицо, но не нашли человека — значит что-то пошло не так.


Да, хочу ещё добавить, что я выбрал в своё время MT-CNN из-за скорости на CPU. Если нужна точно, то, наверное, лучше взять SSH или SFD.

Ещё пара придирок (извините).


Рекомендуется использовать Anaconda, но пакеты ставятся через pip. В этом случае особой пользы от Anaconda нет.


Упоминается использование графических ускорителей, но чтоб в dlib появилась поддержка GPU нужно устанавливать CUDA и пересобирать библиотеку с её поддержкой, что для новичка может стать проблемой.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий