4

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

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

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

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

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

enter image description here

Для сравнения двух подписей, я использую функцию compareHist OpenCV (см here), пытаясь несколько различных показателей расстояния (хи-квадрат, евклидовы и т.д.).

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

processed image with chosen facial landmarks

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

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

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

  2. Я довольно новичок в компьютерном зрении; Как мне пойти «отлаживать» мой алгоритм, чтобы выяснить, где все идет не так? Это возможно?

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

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

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

ответ

3

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

Современные методы для неконтролируемого извлечения функций основаны на (сверточных) нейронных сетях. Посмотрите на автокодеры (http://ufldl.stanford.edu/wiki/index.php/Autoencoders_and_Sparsity) или Ограниченные машины Больцмана (RBM).

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

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

+0

Спасибо за ответ. На самом деле у меня есть структура Caffe, которую я смогу использовать. Предложите ли вы разработать большой набор обучающих наборов предварительно обработанных лиц и запустить его через CNN, чтобы получить лучшее представление каждого изображения, а затем вычислить расстояния между изображениями? Считаете ли вы, что при достаточно хорошем представлении простое евклидово расстояние должно быть достаточно хорошим? – galoosh33

+0

Да, это именно то, что было у меня на уме. Если функции, которые CNN узнает, хороши, достаточно простого евклидова расстояния. –

Смежные вопросы