Blog. Just Blog

Распознавание лиц на фотографии с помощью PHP

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Распознавание лиц на фотографии с помощью PHP
Распознавание лиц на фотографии с помощью PHP

В социальных сетях давно используется такая функция, как "укажи людей на фотографии". Вы загружаете файл изображения, а скрипт подсвечивает на нем лица людей. Как это делается? Предположу, что у каждой социальной сети используются свои инструменты, доступа к которым со стороны никто не даст. Есть готовые бесплатные инструменты, например, PHP Facedetect, но они требуют доступ к серверу, чтобы установить необходимые компоненты. Это можно сделать только на выделенных серверах, пользователям недорогого виртуального хостинга вряд ли кто-то даст такую возможность. А еще есть общедоступный сервис Microsoft Project Oxford Face, который позволяет разработчикам определять на фотографиях лица, а также пол и примерный возраст людей. Для этого надо зарегистрироваться, получить персональный ключ, и можно передавать файлы на обработку. Вроде бы все хорошо и правильно. Но официальные SDK есть только для дотнета и Java, да и количество бесплатных обращений к сервису ограничено. Вот этим сервисом я и заинтересовался.

Сервис Microsoft Project Oxford Face
Сервис Microsoft Project Oxford Face

К счастью, на сайте есть демонстрационная страница, где любой посетитель может загрузить свою фотографию, чтобы проверить работоспособность сервиса. Возвращаемый результат с демо-страницы, как я понимаю, ничем не отличается от результата, возвращаемого через API. Я решил написать на PHP функцию, которая будет эмулировать действия пользователя, отправлять файл на сервер без всякой регистрации и оплаты, а потом самостоятельно обрабатывать полученный результат. Вот что у меня получилось:
  1. //------------------------------------------------------------
  2. // Функция для определения лиц на фотографии
  3. // Автор: ManHunter / PCL (www.manhunter.ru)
  4. //------------------------------------------------------------
  5. // Используется сервис projectoxford.ai
  6. //------------------------------------------------------------
  7. function detect_faces($file_path) {
  8.     // Проверить наличие файла и его размер
  9.     if (file_exists($file_path) && is_readable($file_path)
  10.         && filesize($file_path)>&& filesize($file_path)<4*1024*1024) {
  11.         if ($f=fopen($file_path,'r')) {
  12.             $data=fread($f,filesize($file_path));
  13.             fclose($f);
  14.         }
  15.         else {
  16.             return false;
  17.         }
  18.     }
  19.     else {
  20.         return false;
  21.     }
  22.  
  23.     // Эмуляция захода на страницу для получения нужных параметров
  24.     $ch=curl_init();
  25.     curl_setopt($chCURLOPT_URL'https://www.projectoxford.ai/demo/face');
  26.     curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
  27.     curl_setopt($chCURLOPT_HEADERtrue);
  28.     curl_setopt($chCURLOPT_POSTfalse);
  29.     curl_setopt($chCURLOPT_USERAGENT'Mozilla/5.0 (Windows NT 6.1)');
  30.     curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse);
  31.     $result=curl_exec($ch);
  32.     // Токен для отправки запроса
  33.     if (preg_match('/<span class="icon-bar"><\/span>'.
  34.         '<input name="__RequestVerificationToken" type="hidden" '.
  35.         'value="([^"]+)" \/>/is'$result$matches)) {
  36.         $__RequestVerificationToken=$matches[1];
  37.     }
  38.     else {
  39.         return false;
  40.     }
  41.  
  42.     // Извлечь печеньки из заголовка
  43.     if (preg_match('/ASP\.NET_SessionId=([^;]+)/s'$result$matches)) {
  44.         $ASP_NET_SessionId=$matches[1];
  45.     }
  46.     else {
  47.         $ASP_NET_SessionId='';
  48.     }
  49.  
  50.     if (preg_match('/__RequestVerificationToken=([^;]+)/s'$result$matches)) {
  51.         $__RequestVerificationToken2=$matches[1];
  52.     }
  53.     else {
  54.         $__RequestVerificationToken2='';
  55.     }
  56.  
  57.     if (preg_match('/ARRAffinity=([^;]+)/s'$result$matches)) {
  58.         $ARRAffinity=$matches[1];
  59.     }
  60.     else {
  61.         $ARRAffinity='';
  62.     }
  63.  
  64.     // Не удалось распарсить заголовок ответа
  65.     if ($ASP_NET_SessionId=='' || $__RequestVerificationToken2==''
  66.         || $ARRAffinity=='') {
  67.         return false;
  68.     }
  69.  
  70.     // Отправить изображение на проверку
  71.     curl_setopt($chCURLOPT_URL'https://www.projectoxford.ai/Demo/Detect');
  72.     curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
  73.     curl_setopt($chCURLOPT_HEADERfalse);
  74.     curl_setopt($chCURLOPT_USERAGENT'Mozilla/5.0 (Windows NT 6.1)');
  75.     curl_setopt($chCURLOPT_POSTtrue);
  76.     curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse);
  77.     curl_setopt($chCURLOPT_HTTPHEADER, array(
  78.         'X-Requested-With: XMLHttpRequest',
  79.         'Content-Type: application/x-www-form-urlencoded; charset=UTF-8',
  80.         'Accept: application/json, text/javascript, */*; q=0.01'
  81.     ));
  82.     curl_setopt($chCURLOPT_POSTFIELDS,
  83.         'Data='.urlencode(base64_encode($data)).
  84.         '&DataType=data&ActionType=detection'.
  85.         '&__RequestVerificationToken='.$__RequestVerificationToken);
  86.     curl_setopt($chCURLOPT_COOKIE'ARRAffinity='.$ARRAffinity.
  87.         ';__RequestVerificationToken='.$__RequestVerificationToken2.
  88.         ';ASP.NET_SessionId='.$ASP_NET_SessionId);
  89.     $result=curl_exec($ch);
  90.  
  91.     // Разобрать ответ сервера
  92.     $json=stripslashes($result);
  93.     if (strpos($json,'"faceId"')!==false) {
  94.         $faces=json_decode(substr($json,1,strlen($json)-2));
  95.         if (json_last_error()==0) {
  96.             // На изображении найдено как минимум одно лицо
  97.             return $faces;
  98.         }
  99.     }
  100.     return false;
  101. }
Единственный параметр $file_path - путь к файлу изображения, на котором надо определить лица. Проверка на размер файла (не более 4 мегабайт) выполняется в функции, но проверки формата файла и его минимально допустимого разрешения (36х36 пикселов) я сюда добавлять не стал. У меня для этого используются другие инструменты, а дописать нужный функционал самостоятельно совсем несложно. Обработка ошибок тоже сделана без детализации, функция возвращает или результат в виде массива объектов, описывающих координаты и характеристики найденных лиц, или false.

Конечно, даже при всех современных достижениях, машинным алгоритмам до человека все еще далеко, и гарантировать стопроцентное определение лиц при помощи этого сервиса нельзя. Но в большинстве случаев все работает как надо. Поскольку запрос к серверу выполняется не через штатные API, а через эмуляцию действий пользователя на сайте, функция может в любой момент поломаться, например, если изменится верстка страницы или передаваемые на сервер параметры. По этой же причине надо иметь в виду, что из-за слишком частых обращений к сервису с одного и того же сервера, могут быть применены какие-нибудь санкции. Я это не проверял, но злоупотреблять все равно не стоит.

На сайте проекта Microsoft Project Oxford Face есть еще несколько полезных инструментов, например, определение эмоций на лицах, сравнение двух фотографий на предмет совпадения лиц или распознавание текста на картинках. Скрипт можно легко доработать, чтобы работать и с ними.

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 2044 | Комментариев: 7

Метки: PHP, фото
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (22.04.2016 в 15:37):
Ссылочка на полезный сервис, чтобы не забыть http://findface.ru
ManHunter (09.04.2016 в 15:39):
Девочка с привидениями, вроде бы нормальный креатив.
Андрей (09.04.2016 в 14:42):
Цитата
Это постер из рекламы фотоаппаратов Nikon с функцией распознавания лиц. Я его позаимствовал и чуток подрезал под свои нужды. Вот оригинал:
http://www.postcriativo.com/wp...1150x813.jpg

У них еще есть милый креатив на эту же тему:
http://i.ytimg.com/vi/GEaN2_tb...sdefault.jpg
http://www.seyvet.com/resim/584760b12f.jpg

Первые две картинки очень позитивные. А третья что то хрень какая то. Ссылка покривела или я чего то недопонимаю?
ManHunter (29.03.2016 в 10:59):
Предлагаешь поучаствовать? :)
Vampir (29.03.2016 в 10:41):
aistconf.org
ManHunter (05.03.2016 в 07:42):
Это постер из рекламы фотоаппаратов Nikon с функцией распознавания лиц. Я его позаимствовал и чуток подрезал под свои нужды. Вот оригинал:
http://www.postcriativo.com/wp...1150x813.jpg

У них еще есть милый креатив на эту же тему:
http://i.ytimg.com/vi/GEaN2_tb...sdefault.jpg
http://www.seyvet.com/resim/584760b12f.jpg
Yoshida (05.03.2016 в 03:52):
Привет,

Иллюстрация к статье огонь!

Спасибо за статью, очень интересно.

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2017
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0045 сек.) / Память: 4.5 Mb
Наверх