Как определить лицо на фотографии с помощью PHP
Определение лиц используется в соцсетях, фото-редакторах, видеочатах, умной капче, time tracking программах — можно придумать еще множество применений этой функции.
Вариант №1
Неплохое решение для определения лиц — FaceDetector на PHP, использует OpenCV. FaceDetector стабильно работает с разными оттенками кожи, фотографиями низкого качества, большим количеством лиц и людьми в очках.Алгоритм работы Распознавание лиц здесь основано на методе Виолы-Джонса, каскадах Хаара (прямоугольные примитивы) и алгоритме обучения AdaBoost. Примитивы — белые и черные прямоугольники разного размера — накладываются на изображение, после чего считывается их свертка с картинкой. Подробно почитать об использовании каскадов Хаара можно тут и тут.Установка FaceDetector Вначале нужно установить пакеты: sudo apt-get install pkg-config python libjpeg62-dev libpng12-dev libtiff4-dev php-pear Установить OpenCV: sudo apt-get install libopencv-dev Установить библиотеку: pecl install facedetect Обязательно убедиться, что в php.ini есть: extension=facedetect.so Применение FaceDetector имеет две основные функции: face_count и face_detect для подсчета и определения лиц соответственно. Файл haarcascade_frontalface_alt.xml нужно переместить из /usr/share/opencv/haarcascades/haarcascade_frontalface_alt.xml в папку проекта.
Пример кода — обводит лица розовым квадратиком:
$total= face_count ($_GET['file'],'haarcascade_frontalface_alt.xml'); $ord= face_detect ($_GET['file'],'haarcascade_frontalface_alt.xml'); $im = LoadJpeg ($_GET['file']); $pink = imagecolorallocate ($im, 255, 105, 180); if (count ($ord) > 0) { foreach ($ord as $arr) { imagerectangle ($im,$arr['x'] ,$arr['y'] , $arr['x']+$arr['w'], $arr['y']+$arr['h'], $pink); } } header ('Content-Type: image/jpeg'); imagejpeg ($im); imagedestroy ($im); ?>
Вариант №2
Вариант без использования OpenCV. Библиотека PHP FaceDetection находит только одно лицо на фотографии. Для использования нужно скачать PHP-скрипт и вставить его в свой код.
Пример использования кода — обводит одно лицо зеленым квадратиком:
face_detect ('sample.jpg'); $face_detect→toJpeg (); $json = $face_detect→toJson (); $array = $face_detect→getFace (); ?> Лицо можно найти и сразу вырезать с помощью функции cropFace (): face_detect ('sample.jpg'); $face_detect→cropFace (); ?>
Вариант №3
Еще одна библиотека на основе OpenCV. Python-скрипт для определения лиц.Для начала нужно скачать и установить все нужные пакеты (Python, Python OpenCV, OpenCV data files): sudo apt-get install python python-opencv libopencv-dev И установить библиотеку FaceDetect: sudo cp facedetect /usr/local/bin Проверка на наличие лица на фотке. Возвращает 0, если лицо есть, и 2 — если нет: exec ('./facedetect -q path/to/image.jpg'); echo exec ('echo $?'); Пример использования библиотеки FaceDetect в PHP: // получаем координаты лиц ob_start (); passthru ('/usr/local/bin/facedetect path/to/image.jpg'); $data = ob_get_clean (); echo $data; // обводим координаты лиц, и сохраняем в файл test.jpg exec ('/usr/local/bin/facedetect -o test.jpg path/to/image.jpg'); На входе — картинка image.jpg, а на выходе картинка test.jpg с выделенным в квадрат лицом.
Попробовать этот способ определения лиц можно тут. Алгоритм показывает хорошие результаты даже на фотографиях с множеством лиц. Хотя иногда и выдает удивительные вещи. Например, здесь он определил у Сэмюэля Л. Джексона два лица. А вот здесь — два лица у Памелы Андерсон.
ПС: и да — котиков функция не распознает.
Конспект
- Три библиотеки для определения лиц на PHP: PHP-скрипт на OpenCV, PHP FaceDetection и Python-скрипт FaceDetect.
- Библиотека FaceDetector на OpenCV использует каскады Хаара.
- PHP FaceDetection может найти только одно лицо на фотографии.
- Попробовать как работает python-script FaceDetect можно здесь.