Meefik's Blog

Freedom and Open Source

Детекция лиц с инвариантностью к повороту

27 Aug 2018 | javascript

Не так давно наткнулся на публикацию Object Detection with Pixel Intensity Comparisons Organized in Decision Trees, авторы которой предлагают модификацию метода детекции лиц Виолы-Джонса. Основное отличие метода состоит в том, что вместо признаков Хаара используются простые пиксельные тесты без необходимости рассчитывать интегральное изображение. Это позволяет повысить скорость вычислений и сэкономить память.

Авторы статьи приводят пример реализации данного алгоритма на C с предобученным классификатором для детекции лиц. Недавно появилась реализация алгоритма PICO на JS, однако в ней нет реализации инвариантности к повороту изображения (или наклона головы влево/вправо). Эту недоработку я и решил исправить.

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

В доработку вошло:

Код JS-библиотеки: https://github.com/meefik/pico.js

Использование JS-библиотеки

Все параметры библиотеки задаются в конструкторе, вот их описание:

Параметр По умолчанию Описание
shiftfactor 0.1 Шаг перемешения скользящего окна в процентах (10%) от размера изображения
scalefactor 1.1 Шаг изменения размера скользящего окна в процентах (10%) от размера изображения
initialsize 0.1 Начальный размер скользящего окна в процентах (10%) от размера изображения
rotation 0 Массив углов вращения для которых будет выполнен поиск (от 0 до 360 с шагом 1 градус)
threshold 0.2 Процент (20%) пересечения найденных кандидатов для группировки их в одну область
memory 1 Число изображений (кадров) в памяти для повышения качества поиска

На выходе получается массив областей, где, как алгоритм предполагает, находятся лица. Вот описание такой области:

Свойство Описание
c X-коортината центра найденной области лица
r Y-коортината центра найденной области лица
s Размер найденной области (ширина и высота или диаметр)
q Качество обнаружения (чем больше, тем лучше качество)
a Угол поворота изображения (наиболее вероятный из перечисленных в параметре rotation)

Пример кода:

// load cascade
fetch('./cascade.json')
  .then(function(response) {
    if (!response.ok) throw new Error(response.statusText || 'Request error');
    return response.json(); // or response.arrayBuffer()
  })
  .then(function(cascade) {
    // create PICO detector with options
    return PICO(cascade, {
      shiftfactor: 0.1, // move the detection window by 10% of its size
      scalefactor: 1.1, // resize the detection window by 10% when moving to the higher scale
      initialsize: 0.1, // minimum size of a face (10% of image area)
      rotation: [0, 30, 60, 90, 270, 300, 330], // rotation angles in degrees
      threshold: 0.2, // overlap threshold
      memory: 3 // number of images in the memory
    });
  })
  .then(function(detect) {
    // image = ImageData
    return detect(image);
  })
  .then(function(dets) {
    // dets = [{ r: rows, c: cols, s: size, q: quality, a: angle }]
    console.log(dets);
  });

Запуск демонстрации:

npm install
npm start

После запуска сервера демонстрационная страница будет доступна по адресу http://localhost:8080

И небольшое видео:

Comments