Як визначити особу на фотографії за допомогою 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-скрипт для визначення осіб.
Для початку потрібно скачати і встановити всі потрібні пакети (Perl, 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 можна тут.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.