Комментарии 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, то я не знаю, что советовать, так как просто не имею такого опыта.
Позвольте поправить — у 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 и пересобирать библиотеку с её поддержкой, что для новичка может стать проблемой.
Создание модели распознавания лиц с использованием глубокого обучения на языке Python