Обнаружение лиц при помощи Emgu CV

в 2:37, , рубрики: .net, emgu cv, opencv, обработка изображений, метки: , ,

Вступление

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

В рамках данной статьи решил использовать Emgu CV, как вариант OpenCV на .NET. Изображение для анализа я нашел на TinEye. В заключении будет продемонстрирован результаты работы приложения на Emgu CV и других сервисов по обнаружению лиц.
image

Пишем приложение

Для начала необходимо загрузить Emgu CV, например отсюда. Я выбрал версию 2.3.0 вод Windows. В OpenCV алгоритм поиска лиц базируется на методе Viola Jones. В основе лежит классификатор, который базируется на каскаде признаков. При правильной тренировке каскада, метод может давать хорошие результаты, но обучается очень долго. Более подробно теория данного метода описана на Хабре здесь. OpenCV идет уже вместе с обученным классификатором для поиска лиц, поэтому «минус» проблема.

Далее необходимо создать новый проект C# и подключить требуемые сборки Emgu CV
image

Теперь указываем нужные пространства имен

using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.Util;

Создайте обработчик событий (например, нажатие на кнопку) и вставьте туда код

HaarCascade haarCascade = new HaarCascade("haarcascade_frontalface_alt.xml");
Image<Bgr, Byte> image = new Image<Bgr, Byte>("test.jpg");
Image<Gray, Byte> grayImage = image.Convert<Gray, Byte>();

var detectedFaces = grayImage.DetectHaarCascade(haarCascade)[0];
foreach (var face in detectedFaces)
    image.Draw(face.rect, new Bgr(0, 0, 255), 1);

image.Save("result.jpg");

Здесь все просто. Из xml-файла загружается натренированный каскад. Исходный файл test.jpg после загрузки преобразуется в изображение с градациями серого. Метод DetectHaarCascade определяет на изображении лица. Далее красным прямоугольником отмечаются области на изображении, где расположены лица. Выходной файл имеет название result.jpg.

Заключение

Наше приложение формирует такой результат
image

Результаты работы сторонних сервисов
image

image

Для фотоаппарата Canon пришлось делать несколько снимков, т.к. ограничение на количество лиц
image

Как видно, первый и третий проекты дают схожий результат. Это говорит о том, что codejungle использует OpenCV (кстати, это написано на сайте). Проекты, основанные на OpenCV не обнаружили лицо человека в верхнем ряду справа, вероятнее из-за наклона головы. Фотоаппарат Canon обнаружил все лица, но группами (из-за ограничения). Наиболее лучшие показатели продемонстрировал проект betaface, найдены все лица, определены наклоны головы, также определяет многие другие параметры.

Современные алгоритмы обнаруживают лицо в большинстве случаев без проблем. Все проекты обнаружили то лицо, что не обнаружил смартфон. Это, скорее всего была случайность, что смартфон не обнаружил лицо, нежели индивидуальность объекта. С Emgu CV можно легко внедрить детектор лиц в свое приложение на платформе .NET.

P.S. Спасибо Robik за предоставленные снимки с фотоаппарата.

Автор: sermal

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js