Реализация распознавания лиц с использованием локальных дескрипторов (неконтролируемое обучение)

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

Из-за неконтролируемой настройки мой подход к проблеме состоит в том, чтобы вычислить "сигнатуру лица" (вектор в R^d для некоторого int d), а затем вычислить метрику, в которой два лица, принадлежащие одному и тому же человеку, действительно будут иметь короткое расстояние между ними.

У меня есть алгоритм обнаружения лица, который распознает лицо, обрезает изображение и выполняет некоторую базовую предварительную обработку, поэтому изображения, которые я подаю в алгоритм, серого цвета и выровнены (см. Ниже).

В части "подписи лица" я попробовал два подхода, о которых читал в нескольких публикациях:

  1. Взятие гистограммы LBP (Local Binary Pattern) всего (обработанного) изображения
  2. Вычисление SIFT дескрипторов по 7 точкам лицевой точки (справа от рта, слева от рта и т. Д.), Которые я идентифицирую для каждого изображения с помощью внешнего приложения. Сигнатура - это конкатенация квадратного корня из дескрипторов (это приводит к гораздо более высокому измерению, но на данный момент производительность не является проблемой).

Для сравнения двух сигнатур я использую функцию CompareHist в OpenCV (см. Здесь), пробуя несколько различных метрик расстояния (площадь Хи, евклидово и т. Д.).

Я знаю, что распознать лицо - сложная задача, не говоря уже о том, чтобы не тренироваться, поэтому я не ожидаю больших результатов. Но все, что я получаю, кажется совершенно случайным. Например, при расчете расстояний от изображения в крайнем правом углу до остальной части изображения, я получаю, что она больше всего похожа на 4 Билла Клинтона (...!).

обработанное изображение с выбранными лицевыми ориентирами

В этой замечательной презентации я прочитал, что на тестовом наборе популярно проводить процедуру "обучения метрикам", которая должна значительно улучшить результаты. Однако в презентации и в других местах говорится, что "обычные" измерения расстояний также должны давать хорошие результаты, поэтому прежде чем я попробую это сделать, я хочу понять, почему то, что я делаю, ничего не дает.

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

  1. Одно из улучшений, которое я хотел бы сделать, - это выполнять LBP только на фактическом лице, а не на углах и всем, что может внести шум в подпись. Как я могу замаскировать части, которые не являются лицом, перед вычислением LBP? Я использую OpenCV для этой части тоже.

  2. Я довольно плохо знаком с компьютерным зрением; Как бы я пошёл по поводу "отладки" моего алгоритма, чтобы выяснить, где что-то пошло не так? Это возможно?

  3. В неконтролируемой обстановке, есть ли какой-нибудь другой подход (который не является локальными дескрипторами + вычислительные расстояния), который мог бы работать для задачи кластеризации граней?

  4. Есть ли что-то еще в модуле OpenCV, которое, возможно, я не подумал, может быть полезным? Кажется, что все алгоритмы там требуют обучения и бесполезны в моем случае - алгоритм должен работать с изображениями, которые являются совершенно новыми.

Заранее спасибо.

1 ответ

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

Все современные методы извлечения неконтролируемых признаков основаны на (сверточных) нейронных сетях. Посмотрите на автоэнкодеры ( http://ufldl.stanford.edu/wiki/index.php/Autoencoders_and_Sparsity) или машины с ограниченным доступом Bolzmann (RBM).

Вы также можете взять существующий детектор лиц, например DeepFace ( https://www.cs.toronto.edu/~ranzato/publications/taigman_cvpr14.pdf), взять только слои объектов и использовать расстояние между ними для группировки похожих лиц.

Боюсь, что OpenCV не очень подходит для этой задачи, вы можете проверить Caffe, Theano, TensorFlow или Keras.

Другие вопросы по тегам