Как определить лицо на фотографии с помощью PHP

Определение лиц используется в соцсетях, фото-редакторах, видеочатах, умной капче, time tracking программах — можно придумать еще множество применений этой функции.
image

Вариант №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

Вариант №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

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

ПС: и да — котиков функция не распознает.

Конспект


  1. Три библиотеки для определения лиц на PHP: PHP-скрипт на OpenCV, PHP FaceDetection и Python-скрипт FaceDetect.
  2. Библиотека FaceDetector на OpenCV использует каскады Хаара.
  3. PHP FaceDetection может найти только одно лицо на фотографии.
  4. Попробовать как работает python-script FaceDetect можно здесь.

.io

43,65

Компания

Поделиться публикацией
Комментарии 13
    0
    Не распознаёт котиков? Непорядок. // Ушёл делать форк
    +17
    И причём тут PHP? Второй вариант если только и то с натягом — там порт с JS, т.е. автор тоже видимо не особо разбирался в «как что работает».

    С таким же успехом можно набросать статей по типу «хранение данных в субд mysql с помощь PHP» где написать что нибудь в духе «ну, вот есть mysqli расширение в PHP, оно значит с mysql работает».
      +1
      Это уже не первая такая статья. До этого было, например, как найти похожие изображения. Но там хотя бы действительно несколько методов было. А тут всё через FaceDetect.
      +2
      Вариант №3
      Еще одна библиотека на основе OpenCV. Python-скрипт для определения лиц

      Я прошу прощения, но статья называется «Как определить лицо на фотографии с помощью PHP»
      Ладно первые два варианта, ещё хоть как-то притянуты, но третье уже перебор.
        +2
          +1
          А вот и распознает котиков!!!
          i.onthe.io/face_detector?r=3e66740e4098bb8aa3344b2b805591bd
          ;)
            +1
            Нас на#@%ли, расходимся.
              0
              Анимешные лица плохо распознаёт:(
              Оригинал изображения (konachan) с КДПВ тоже:
                +1
                Распознавание лиц здесь основано на методе Виолы-Джонса, каскадах Хаара (прямоугольные примитивы) и алгоритме обучения AdaBoost. Примитивы — белые и черные прямоугольники разного размера — накладываются на изображение, после чего считывается их свертка с картинкой.

                Пожалуй это самое фееричное описание метода Виолы-Джонса, которое я встречал)
                  0
                  del… пропустил 2 вариант

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

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