Руководство для новичков по обработке 3D-изображений лица

За последнее десятилетие было предложено несколько алгоритмов машинного обучения для обработки изображений и приложений компьютерного зрения. LBP, HAAR - одни из популярных алгоритмов, которые широко используются для распознавания лиц и дают отличные результаты. Но большинство этих алгоритмов не подходят для распознавания в реальном времени в неограниченной среде. В последнее время современные методы глубокого обучения стали фаворитом традиционных алгоритмов машинного обучения. Приложение распознавания лиц работает с изображениями, которые представляют собой не что иное, как комбинацию значений пикселей в диапазоне (0–255). Алгоритм находит отличительный образец в этих значениях серого и рассматривает его как особенность, которая считается уникальной для каждого изображения. Однако в трехмерных изображениях информация о пикселях отсутствует, а доступно только положение (x, y, z) каждой точки. Это затрудняет поиск рисунка на 3D-изображениях.

Недавно я начал работать над набором данных 3D-лиц FRGC2.0, и сначала мне не удавалось найти достаточно ресурсов для обработки 3D-изображений. Наконец, через некоторое время я наткнулся на статью по 3D-распознаванию лиц, написанную Аджмалом Мианом, которого я хотел бы поблагодарить за полезные советы и рекомендации. Я также хотел бы упомянуть мою коллегу Джайету Чакраборти, которая также внесла свой вклад в развитие этого проекта. В этой статье я расскажу о шагах обработки для разработки системы распознавания лиц 3D, чтобы другие, ищущие аналогичную работу, могли иметь фору.

Чтение трехмерных изображений с глубиной

Трехмерное изображение объекта содержит высоту, ширину и глубину каждой точки объекта. Как правило, необработанные трехмерные наборы данных, такие как база данных лиц FRGC 2.0, коллекция F и коллекция G База данных трехмерного уха с файлами изображений в формате .abs, .abs.Z или .abs.gz. Образцы изображений из базы данных 3D лиц FRGC 2.0 представлены на рисунке 1.

Эти изображения представляют собой сжатые текстовые файлы ASCII. Рекомендуется не распаковывать набор данных заранее, так как расширение этих файлов может потребовать большого дискового пространства. Каждый файл изображения имеет трехстрочный заголовок, в котором указано количество строк и столбцов. Далее следуют четыре изображения. Первое - это так называемое изображение «флага», где значение пикселя 1 означает, что соответствующие значения (x, y, z) в этом пикселе действительны. Если значение флага равно нулю, вы должны игнорировать компоненты (x, y, z) для этого пикселя. За изображением флага следует изображение X-координат, изображение Y-координат и изображение Z-координат. Все изображения с плавающей запятой. Вы можете использовать трехмерные координаты каждого пикселя диапазона или выбросить изображения X и Y и заботиться только о Z-значении. Обратите внимание, что "соотношение сторон" изображения не обязательно должно быть 1. Следующий раздел кода можно использовать для получения значений x, y, z и флагов.

Вы можете распечатать x, y, z с помощью функции imshow (), это покажет захваченные изображения, когда камера обращена к оси x, оси y и оси z. Объедините все, что вы видите, изображение, как показано на рисунке 2.

Мы извлекли точки облаков, преобразовали их в файл .ply и отобразили для визуализации трехмерной формы изображения. На следующем рисунке 3 показан трехмерный вид лица. Исходное изображение содержит изображение лица, включая шею и плечо, которое не требуется для процесса извлечения признаков. Следовательно, мы должны обрезать только область лица со всего изображения, что будет обсуждаться в следующем разделе.

Рисунок 3: Вышеупомянутые рисунки относятся к той же теме. Рисунок (a) представляет трехмерную визуализацию с использованием Matlab, а рисунок (b) создается, когда он отображается в инструменте Meshlab.

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

Чтобы выделить только область лица из всего изображения, мы использовали информацию о глубине. Если вы заметили изображение, показанное на рисунке 4, можно заметить, что объект смотрит в сторону оси z, а датчик снимает фронтальное лицо. Следовательно, точка шумового наконечника будет иметь минимальную глубину от камеры.

Если вы внимательно посмотрите на рисунок 3, вы заметите, что значение глубины увеличивается с 1500 до 1700 по мере того, как мы приближаемся к уху от точки носа. Если концепция кончика носа все еще не ясна, взгляните на рисунок 5.

Вы заметите, что z-значение (глубина) кончика носа (P), показанное черной точкой, составляет от 1450 до 1480, скажем, 1460. Теперь рассмотрим кончик носа. В качестве центра 'P' мы нарисовали квадрат размером 140 единиц, как показано на рисунке 6.

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

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

Удаление шипов, заполнение отверстий и шумоподавление

Устранение шипов. 3D-грани зашумлены и содержат всплески, поэтому необходимо применить методы сглаживания. В нашем исследовании мы расширили концепцию метода взвешенной двумерной медианной фильтрации на трехмерные изображения лиц. Исследуемый метод выполняет фильтрацию набора 3D-данных с использованием взвешенной медианной реализации медианной фильтрации сетки.

Заполнение отверстий. Удаление шипов приводит к образованию отверстий, поэтому их необходимо заполнить. Для этого мы использовали 3D-интерполяцию. Среди всех методов интерполяции мы использовали «кубический». В методе кубической интерполяции интерполированное значение в точке запроса основано на кубической интерполяции значений в соседних точках сетки в каждом соответствующем измерении. Эта интерполяция основана на кубической свертке.

Удаление шума. Цифровые изображения подвержены разного рода шумам. Шум является следствием ошибок в методе получения изображения, результирующие значения не отражают истинную интенсивность сцены. Опять же, есть много методов для удаления шума, мы использовали 3D-фильтр Гаусса.

Вот окончательное изображение после всех этапов предварительной обработки, показанное на рисунке 8.

Исходный код, используемый для обнаружения области лица, обрезки лица, удаления пятен, заполнения отверстий и шумоподавления, показан ниже.

После всех шагов окончательный результат, который мы получили, представляет собой сетчатое изображение. Это сетчатое изображение можно использовать для методов извлечения признаков в соответствии с требованиями приложения. В нашем случае мы извлекли объекты PCA, а также линейные, точечные и пространственные объекты, о которых я расскажу в следующем посте. В другом эксперименте мы применили ICP к изображениям сетки, чтобы добиться лучших результатов. Если вы хотите запустить алгоритм ICP, рекомендуется иметь графический процессор.

Полный код доступен в репозитории GitHub. Вы можете загрузить и использовать его для предварительной обработки собственного набора данных 3D-лиц. Не стесняйтесь голосовать, если вы найдете этот пост полезным.

В следующем посте я расскажу о распознавании лиц на основе слияния на уровне функций и баллов с использованием анализа основных компонентов (PCA) и итеративной точки ближайшего ближайшего окружения (ICP) [Изменить: из-за некоторая проблема с разрешением, я пока не делюсь кодом PCA и ICP.].