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

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

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

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

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

Взяв гистограммуLBP (Local Binary Pattern) всего (обработанного) изображениярасчетаПРОСЕЯТЬ дескрипторы в 7 точках лицевого ориентира (справа от рта, слева от рта и т. д.), которые я идентифицирую для каждого изображения с помощью внешнего приложения. Сигнатура - это конкатенация квадратного корня из дескрипторов (это приводит к гораздо более высокому измерению, но на данный момент производительность не является проблемой).

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

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

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

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

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

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

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

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

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

Ответы на вопрос(1)

Ваш ответ на вопрос