Определение лиц используется в соцсетях, фото-редакторах, видеочатах, умной капче, time tracking программах — можно придумать еще множество применений этой функции.
![image](https://habrastorage.org/r/w780q1/getpro/habr/post_images/d64/02d/bef/d6402dbef395029fcc913c6d592e34cc.jpg)
Неплохое решение для определения лиц — FaceDetector на PHP, использует OpenCV. FaceDetector стабильно работает с разными оттенками кожи, фотографиями низкого качества, большим количеством лиц и людьми в очках.
Распознавание лиц здесь основано на методе Виолы-Джонса, каскадах Хаара (прямоугольные примитивы) и алгоритме обучения AdaBoost. Примитивы — белые и черные прямоугольники разного размера — накладываются на изображение, после чего считывается их свертка с картинкой. Подробно почитать об использовании каскадов Хаара можно тут и тут.
Вначале нужно установить пакеты:
Установить OpenCV:
Установить библиотеку:
Обязательно убедиться, что в php.ini есть:
FaceDetector имеет две основные функции: face_count и face_detect для подсчета и определения лиц соответственно. Файл haarcascade_frontalface_alt.xml нужно переместить из /usr/share/opencv/haarcascades/haarcascade_frontalface_alt.xml в папку проекта.
Пример кода — обводит лица розовым квадратиком:
![image](https://habrastorage.org/r/w780q1/getpro/habr/post_images/fc2/fcc/8c3/fc2fcc8c30a874a48a7885f9b5e1b6fd.jpg)
Вариант без использования OpenCV. Библиотека PHP FaceDetection находит только одно лицо на фотографии. Для использования нужно скачать PHP-скрипт и вставить его в свой код.
Пример использования кода — обводит одно лицо зеленым квадратиком:
Лицо можно найти и сразу вырезать с помощью функции cropFace():
Еще одна библиотека на основе OpenCV. Python-скрипт для определения лиц.
Для начала нужно скачать и установить все нужные пакеты (Python, Python OpenCV, OpenCV data files):
И установить библиотеку FaceDetect:
Проверка на наличие лица на фотке. Возвращает 0, если лицо есть, и 2 — если нет:
Пример использования библиотеки FaceDetect в PHP:
На входе — картинка image.jpg, а на выходе картинка test.jpg с выделенным в квадрат лицом.
![image](https://habrastorage.org/r/w780q1/getpro/habr/post_images/b2e/cee/2ba/b2ecee2ba7fdd29f78dad51d3aa6b5d6.jpg)
Попробовать этот способ определения лиц можно тут. Алгоритм показывает хорошие результаты даже на фотографиях с множеством лиц. Хотя иногда и выдает удивительные вещи. Например, здесь он определил у Сэмюэля Л. Джексона два лица. А вот здесь — два лица у Памелы Андерсон.
ПС: и да — котиков функция не распознает.
![image](https://habrastorage.org/getpro/habr/post_images/d64/02d/bef/d6402dbef395029fcc913c6d592e34cc.jpg)
Вариант №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 в папку проекта.
Пример кода — обводит лица розовым квадратиком:
<?php
function LoadJpeg($imgname)
{
$im = @imagecreatefromjpeg($imgname);
if (!$im)
{
$im = imagecreate(150, 30);
$bgc = imagecolorallocate($im, 255, 255, 255);
$tc = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 150, 30, $bgc);
imagestring($im, 1, 5, 5, "Error loading $imgname", $tc);
}
return $im;
}
$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);
?>
![image](https://habrastorage.org/getpro/habr/post_images/fc2/fcc/8c3/fc2fcc8c30a874a48a7885f9b5e1b6fd.jpg)
Вариант №2
Вариант без использования OpenCV. Библиотека PHP FaceDetection находит только одно лицо на фотографии. Для использования нужно скачать PHP-скрипт и вставить его в свой код.
Пример использования кода — обводит одно лицо зеленым квадратиком:
<?php
include "FaceDetector.php";
$face_detect = new Face_Detector('detection.dat');
$face_detect->face_detect('sample.jpg');
$face_detect->toJpeg();
$json = $face_detect->toJson();
$array = $face_detect->getFace();
?>
Лицо можно найти и сразу вырезать с помощью функции cropFace():
<?php
include "FaceDetector.php";
$face_detect = new Face_Detector('detection.dat');
$face_detect->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 с выделенным в квадрат лицом.
![image](https://habrastorage.org/getpro/habr/post_images/b2e/cee/2ba/b2ecee2ba7fdd29f78dad51d3aa6b5d6.jpg)
Попробовать этот способ определения лиц можно тут. Алгоритм показывает хорошие результаты даже на фотографиях с множеством лиц. Хотя иногда и выдает удивительные вещи. Например, здесь он определил у Сэмюэля Л. Джексона два лица. А вот здесь — два лица у Памелы Андерсон.
ПС: и да — котиков функция не распознает.
Конспект
- Три библиотеки для определения лиц на PHP: PHP-скрипт на OpenCV, PHP FaceDetection и Python-скрипт FaceDetect.
- Библиотека FaceDetector на OpenCV использует каскады Хаара.
- PHP FaceDetection может найти только одно лицо на фотографии.
- Попробовать как работает python-script FaceDetect можно здесь.