[Подробное применение] · Практическое освоение учебника по разработке распознавания лиц Dlib
Адрес проекта на GitHub -->GitHub.com/Сяо Сун…
1. Введение
Dlib – это инструмент с открытым исходным кодом для глубокого обучения. Он разработан на основе C++, а также поддерживает интерфейсы разработки Python. Его функции аналогичны TensorFlow и PyTorch. Однако, поскольку Dlib имеет хорошую поддержку извлечения черт лица, разработчики могут использовать множество обученных моделей извлечения черт лица, поэтому разработка распознавания лиц Dlib очень подходит для разработки проектов лиц.
Упомянутая выше разработка распознавания лиц в основном относится к проверке лица, то есть при вводе двух фотографий лица система сравнивает и выводит 0 или 1, что означает определение того, является ли это одним и тем же человеком. Общее развитие распознавания лиц можно просто разделить на1. Моделирование черт лицаи2. Используйте модель черт лица для проверки(На самом деле туда же должно входить выравнивание по лицу и т.п., которые тоже можно разделить на 1). При использовании Dlib для разработки мы можем напрямую использовать обученную модель извлечения признаков лица, и основная работа заключается в том, как проверить лицо.
Проверка лица на самом деле предназначена для расчета сходства, сходство одного и того же человека будет большим, а сходство разных людей будет относительно небольшим. Сходство можно рассчитать, используя косинусное сходство или евклидово расстояние. Косинусное подобие — это вычисленный угол, а евклидово расстояние — это квадрат разности. может использоваться для представления сходства (расстояния) двух признаков.
2. Строительство окружающей среды
Установка может относиться к этому моему блогу:[Инструмент глубокого обучения] · Минимальная установка библиотеки распознавания лиц Dlib, необходимо обратить внимание на следующие моменты:
Этот пост в блоге предназначен для установки Windows 10, другие платформы могут выполнить этот шаг для установки.
- Установить Миниконду
Используйте команду conda для установки библиотеки Dlib.Можно использовать как Miniconda, так и Anaconda.Я привык использовать Miniconda, который занимает меньше памяти.
Рекомендуемое использованиеЦинхуаюань, загрузите и установите, а также выберите соответствующую версию платформы. питон == 3.6
- установить dlib
Обратите внимание, что вы должны ввести CMD от имени администратора и выполнить (используйте sudo, если это Linux Mac)
conda install -c conda-forge dlib
- Требуется библиотека imageio, которую можно установить с помощью следующей команды
conda install imageio
3. Практика развития
1. Реализовать метку обнаружения лица
face_test.py
import dlib
from imageio import imread
import glob
detector = dlib.get_frontal_face_detector()
win = dlib.image_window()
path = "f1.jpg"
img = imread(path)
dets = detector(img)
print('检测到了 %d 个人脸' % len(dets))
for i, d in enumerate(dets):
print('- %d:Left %d Top %d Right %d Bottom %d' % (i, d.left(), d.top(), d.right(), d.bottom()))
win.clear_overlay()
win.set_image(img)
win.add_overlay(dets)
dlib.hit_enter_to_continue()
Код очень простой, читаем фото через imread, а потом выполняем детекцию, на выходе получается список детов, элементов будет несколько, если лиц несколько, и у каждого элемента есть .left(), .top( ), .right (), .bottom() Четыре элемента, представляющие четыре граничных позиции рамки лица. Наконец, отмеченный прямоугольник можно отобразить на исходном изображении с помощью win.add_overlay(dets).
оригинальное фото
выходное фото
Фактически, мы можем использовать эту функцию для создания простого приложения для определения количества лиц на изображении или видео.
2. Извлечение характерных точек лица
На основе фактического боя 1 добавлена функция извлечения черт лица.
import dlib
from imageio import imread
import glob
detector = dlib.get_frontal_face_detector()
win = dlib.image_window()
predictor_path = 'shape_predictor_68_face_landmarks.dat'
predictor = dlib.shape_predictor(predictor_path)
path = "f2.jpg"
img = imread(path)
dets = detector(img)
print('检测到了 %d 个人脸' % len(dets))
for i, d in enumerate(dets):
print('- %d: Left %d Top %d Right %d Bottom %d' % (i, d.left(), d.top(), d.right(), d.bottom()))
shape = predictor(img, d)
# 第 0 个点和第 1 个点的坐标
print('Part 0: {}, Part 1: {}'.format(shape.part(0), shape.part(1)))
win.clear_overlay()
win.set_image(img)
win.add_overlay(dets)
win.add_overlay(shape)
dlib.hit_enter_to_continue()
Этот код добавляет функцию shape_predictor на основе test.py, чтобы он мог найти 68 характерных точек лица на основе обнаружения лица. На рисунке отражена синяя линия.
Исходное изображение
выходное изображение
Обратите внимание, что для запуска этого кода требуется этот файл Predictor_path = 'shape_predictor_68_face_landmarks.dat', который я помещу в свойgithub, всем удобно скачивать и пользоваться.
3. Проверка распознавания лиц
На основе второго шага мы делаем еще один шаг, чтобы извлечь лицо как вектор признаков, чтобы мы могли сравнить векторы признаков для проверки лица Здесь мы используем метод сравнения евклидова расстояния.
face_recognition.py
import dlib
from imageio import imread
import glob
import numpy as np
detector = dlib.get_frontal_face_detector()
predictor_path = 'shape_predictor_68_face_landmarks.dat'
predictor = dlib.shape_predictor(predictor_path)
face_rec_model_path = 'dlib_face_recognition_resnet_model_v1.dat'
facerec = dlib.face_recognition_model_v1(face_rec_model_path)
def get_feature(path):
img = imread(path)
dets = detector(img)
print('检测到了 %d 个人脸' % len(dets))
# 这里假设每张图只有一个人脸
shape = predictor(img, dets[0])
face_vector = facerec.compute_face_descriptor(img, shape)
return(face_vector)
def distance(a,b):
a,b = np.array(a), np.array(b)
sub = np.sum((a-b)**2)
add = (np.sum(a**2)+np.sum(b**2))/2.
return sub/add
path_lists1 = ["f1.jpg","f2.jpg"]
path_lists2 = ["赵丽颖照片.jpg","赵丽颖测试.jpg"]
feature_lists1 = [get_feature(path) for path in path_lists1]
feature_lists2 = [get_feature(path) for path in path_lists2]
print("feature 1 shape",feature_lists1[0].shape)
out1 = distance(feature_lists1[0],feature_lists1[1])
out2 = distance(feature_lists2[0],feature_lists2[1])
print("diff distance is",out1)
print("same distance is",out2)
out1 = distance(feature_lists1[0],feature_lists1[1])
out2 = distance(feature_lists2[0],feature_lists2[1])
выходной результат
检测到了 1 个人脸
检测到了 1 个人脸
检测到了 1 个人脸
检测到了 1 个人脸
feature 1 shape (128, 1)
diff distance is 0.254767715912
same distance is 0.0620976363391
Мы видим, что каждая грань извлекается как 128-мерный вектор, который мы можем понимать как 128-мерные координаты (xyz — трехмерный, а 128-мерный состоит из 128 осей). рассчитать два Расстояние до объекта, установить подходящий порог, если он меньше этого порога, он будет распознан как один и тот же человек. Коду нужен этот файл face_rec_model_path = 'dlib_face_recognition_resnet_model_v1.dat' для правильной работы, который я поместил в свой собственныйgithub, для всеобщего удобства.
Из результатов вышеприведенного теста мы видим, что разные расстояния составляют 0,25, а один и тот же человек — 0,06, а порог можно установить на промежуточное значение. Сначала я установил здесь значение 0,09.Этот порог также требует большого объема данных для расчета, и критерием выбора является минимизация ошибочной идентификации.
Затем мы устанавливаем порог 0,09, чтобы проверить, может ли система различать разных людей: добавьте следующий код в face_recognition.py.
def classifier(a,b,t = 0.09):
if(distance(a,b)<=t):
ret = True
else :
ret = False
return(ret)
print("f1 is 赵丽颖",classifier(feature_lists1[0],feature_lists2[1]))
print("f2 is 赵丽颖",classifier(feature_lists1[1],feature_lists2[1]))
print("赵丽颖照片.jpg is 赵丽颖测试.jpg",classifier(feature_lists2[0],feature_lists2[1]))
выходной результат
f1 is 赵丽颖 False
f2 is 赵丽颖 False
赵丽颖照片.jpg is 赵丽颖测试.jpg True
Из вышеизложенного видно, что функция распознавания лиц в основном выполнена.Если это будет практично, необходимо продолжить настройку порога и кода.Критерием настройки является выбор соответствующего порога для минимизации ошибки признание.
Hope this helps
Адрес проекта на GitHub -->GitHub.com/Сяо Сун…