CA1 (Детектор лиц)

CA1 (Детектор лиц)

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

Распознавание

В основе распознавания лежит основа HOG. Гистограмма направленных градиентов (Histogram of Oriented Gradients, HOG) — дескрипторы особых точек, которые используются в компьютерном зрении и обработке изображений с целью распознавания объектов. Данная техника основана на подсчете количества направлений градиента в локальных областях изображения. Этот метод похож на гистограммы направления края, дескрипторы SIFT и контексты формы, но отличается тем, что вычисляется на плотной сетке равномерно распределенных ячеек и использует нормализацию перекрывающегося локального контраста для увеличения точности

Пример вычисления направленных градиентов

Выполнив и исследовав 2_cpp_face_detection.zip вы увидите, что мы не обучаемся, а используем уже обученную на различных лицах модель. На скольких лицах модель была обучена мы не знаем, можем только догадаться, что не на очень большом, т.к. работает детектор не очень хорошо.

Задание

Задание заключается в том, чтобы сохранить в памяти какой-то образ первого найденного лица и далее искать его в последующих кадрах, отмечая его текстом. Предлагаю следующий план по такому исследованию

  1. Научиться отображать текст рядом с окном детекции. Найдите любую статью по OpenCV или в документации по части 4.0.x как выводить текст и сделайте ему правильное смещение относительно рамки.
  2. Гистограммы. О них и о коде их использования можно почитать тут (только картинки и текст) и тут(здесь можно и код). Основной инструмент идентификации в нашем простейшем случае. Работать будет, как я уже говорил плохо. Вам нужно первую найденную рамку сохранить в Mat и сделать подсчет гистограммы по ней. Эту гистограмму хранить в памяти и далее, для всех найденных лиц делать метод CompareHist(), сравнивая их гистограмму со своей. Выбирайте CV_COMP_CORREL и следите чтобы корреляция была выше порога, скажем, 0.8. Если больше — это то же самое лицо, если меньше, скорее всего нет. В случае если не будет работать в таком виде, то попробуйте порог пониже.
  3. Объедините этапы. Лицо 1 будет сопровождаться текстом, остальные лица просто будут детектироваться.
Пример работы программы детекции. Неидеально, но это уровень HOG «из коробки». Можно улучшать

Важно: Если сами почитали про гистограммы и разумно хотите попробовать их в отдельном проекте, то вы на правильном пути. Но готовьтесь к некоторым возможным трудностям. 90% исходников в интернете написаны для OpenCV 2.x (А у нас OpenCV 4.x, совместимый с веткой 3.x). Если у вас пример из интернета дает ошибки вроде «Функция не найдена», «Параметр XXX неизвестен», то скорее всего вы попали на старые исходники для OpenCV-2.x. Ищите те, которые запустятся (OpenCV 3.x и выше).