Построение модели распознавания лиц

искусственный интеллект

Подготовка окружающей среды

Python版本:3.7
系统版本:Windows OR Linux
编写软件:PyCharm or Vscode

Установить зависимости

Установите CMake

pip install CMake

Установите VisualStudio 2017нажмите, чтобы скачать

При установке необходимо поставить галочку напротив библиотек поддержки Python и C++.

установить dlib

pip install dlib

установить распознавание лиц

pip install face_recognition

Установить openCV

 pip install opencv-python

попробуй прочитать по лицу

Вот пытаюсь прочитать фото звезды

ссылка на изображение:Страх 3-Nuggets.byte IMG.com/to S-talent-i-can 3…Из энциклопедии Байду

Я сохранил его в проектimgкаталог и названный huge.jpg

import face_recognition

# 读取图片并识别人脸
img = face_recognition.load_image_file("./img/huge.jpg")
face_locations = face_recognition.face_locations(img)
print(face_locations)

Если он распознает данные, он должен распечатать портретные данные, подобные следующим

图片.png

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

Глядя на исходный код, мы можем узнать, что данные, возвращаемые face_locations, выглядят следующим образом:

图片.png

Мы можем предположить, что, поскольку он возвращает массив, представляет ли он, сколько лиц покрыто этим изображением?

Чтобы проверить это предположение, мы используем изображение с несколькими лицами, которое я назвал huge2.jpg.

import face_recognition
# 读取图片并识别人脸

img = face_recognition.load_image_file("./img/huge2.jpg")
face_locations = face_recognition.face_locations(img)
print(face_locations)

Можно получить следующие результаты

图片.png

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

图片.png

Вероятно добиться такого эффекта (догадываюсь)

Нарисуйте изображения маркеров лица

Мы можем использовать OpenCV для рисования этого индикатора

import face_recognition
import cv2

# 读取图片并识别人脸
img = face_recognition.load_image_file("./img/huge2.jpg")
face_locations = face_recognition.face_locations(img)
# print(face_locations)

# openCV读取图像
img = cv2.imread("./img/huge2.jpg")

# 调用opencv函数显示原始图片
cv2.namedWindow("raw")
cv2.imshow("raw", img)

# 遍历人脸信息
for face in face_locations:
    print(face)
    # 人脸上边距
    top = face[0]
    # 人脸右边距
    right = face[1]
    # 人脸下边距
    bottom = face[2]
    # 人脸左边距
    left = face[3]

    # 左上
    start = (left, top)
    # 右下
    end = (right, bottom)

    # 随便挑个颜色
    color = (255, 80, 80)  # 蓝,绿,红(0~255)
    # 画线的粗度
    thickness = 3
    # 绘制一个矩形  (图像,左上角坐标,右下角坐标,颜色,粗度)
    cv2.rectangle(img, start, end, color, thickness)

# 显示绘制分析结果
cv2.namedWindow("analysis")
cv2.imshow("analysis", img)

# 意思是在用户输入任意键时才关闭,不然图片会一闪就关闭
cv2.waitKey(0)
cv2.destroyAllWindows()

图片.png

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

Как дела

Если самая важная функция в распознавании лиц состоит в том, чтобы сообщить нам, кто пользователь, но какой бы замечательной ни была модель распознавания лиц, она не может сказать вам из ниоткуда, как зовут человека. Вам нужно только встать перед камерой, и система узнает, кто вы. Как это достигается?

На самом деле все очень просто, т.Эталонное сравнение, в базе данных к которой подключена модель, здесь мы называем этолицевая основа, в базовой библиотеке лиц есть ваша оригинальная фотография, затем с помощью модели распознавания лиц сравните фотографии, чтобы обеспечить сходство каждой фотографии, чтобыпредполагатьУзнай, кто ты, да да, дапредполагать, так что нет 100% значения контраста, только максимально возможное сходство

Затем мы начнем сравнение лица

Загрузить данные объекта лица

import face_recognition
import cv2

# 提交比对的人脸
unknown_image = face_recognition.load_image_file("img/face1.jpg")
# 打印人脸数据
print("人脸对象:", len(unknown_image))
print(unknown_image)

Здесь я импортировал свою фотографию, а затем давайте посмотрим, как выглядит импортированное изображение с помощью face_recognition.

图片.pngВидно, что это очень длинный массив, а точнее, матрица Давайте посмотрим на описание исходного кода этого метода.

def load_image_file(file, mode='RGB'):
    """
    Loads an image file (.jpg, .png, etc) into a numpy array

    :param file: image file name or file object to load
    :param mode: format to convert the image to. Only 'RGB' (8-bit RGB, 3 channels) and 'L' (black and white) are supported.
    :return: image contents as numpy array
    """
    im = PIL.Image.open(file)
    if mode:
        im = im.convert(mode)
    return np.array(im)

#将图像文件(.jpg, .png等)加载到numpy数组中

#:param file:要加载的图像文件名或文件对象

#:参数模式:将图像转换为的格式。只支持'RGB'(8位RGB, 3通道)和'L'(黑白)。

#:返回:图像内容为numpy数组

Из возвращенных слов мы можем сделать вывод, что после того, как мы введем объект изображения, мы можем получить массив результатов анализа numpy, который должен содержать много ценных данных, Например, мы можем проанализировать человека в предыдущем разделе из объекта. Расстояние вокруг лица

import face_recognition
import cv2

# 提交比对的人脸
unknown_image = face_recognition.load_image_file("img/face1.jpg")
# 打印人脸数据
# print("人脸对象:", len(unknown_image))
# print(unknown_image)

# 获取人脸对象的四周边距
face_locations = face_recognition.face_locations(unknown_image)
print(face_locations)

图片.png

Получить данные о портретных функциях

Пробуем извлечь собственные значения портрета из этого объекта лица

import face_recognition
import cv2

# 提交比对的人脸
unknown_image = face_recognition.load_image_file("img/face1.jpg")
# 打印人脸数据
# print("人脸对象:", len(unknown_image))
# print(unknown_image)

# 获取人脸对象的四周边距
face_locations = face_recognition.face_locations(unknown_image)
print("人像边距", face_locations)

# 人像特征值
face_encodings = face_recognition.face_encodings(unknown_image, face_locations)
print(face_encodings)

Можно получить следующие результаты

图片.pngДавайте посмотрим на описание исходного кода этого метода

def face_encodings(face_image, known_face_locations=None, num_jitters=1, model="small"):
    """
    Given an image, return the 128-dimension face encoding for each face in the image.

    :param face_image: The image that contains one or more faces
    :param known_face_locations: Optional - the bounding boxes of each face if you already know them.
    :param num_jitters: How many times to re-sample the face when calculating encoding. Higher is more accurate, but slower (i.e. 100 is 100x slower)
    :param model: Optional - which model to use. "large" (default) or "small" which only returns 5 points but is faster.
    :return: A list of 128-dimensional face encodings (one for each face in the image)
    """
    raw_landmarks = _raw_face_landmarks(face_image, known_face_locations, model)
    return [np.array(face_encoder.compute_face_descriptor(face_image, raw_landmark_set, num_jitters)) for raw_landmark_set in raw_landmarks]


"""
给定一个图像,返回对图像中每个人脸进行编码的128维人脸。
:param face_image:包含一个或多个人脸的图像
:param known_face_locations:可选-如果你已经知道每个面的边界框。
:param num_jitters:在计算编码时重新采样人脸的次数。更高更准确,但更慢(即100是100倍慢)
:参数模型:可选-使用哪个模型。“大”(默认)或“小”,只返回5点,但更快。

:return:一个128维面编码列表(图像中的每个面都有一个)
"""

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

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

Я сравниваю исходное изображение Hu Ge 1 (одиночное) с этим изображением Hu Ge 3 (одиночное), чтобы отличить, ставимhuge3.pngОно считается входным изображением, другие изображения используются для сравнения.

图片.png

import face_recognition
import cv2

# 提交比对的人脸(假装我们不知道它是谁)
unknown_image = face_recognition.load_image_file("img/huge3.png")

# 一个已知的人脸 (胡歌的照片)
huge_img = face_recognition.load_image_file("img/huge.jpg")

# 未知的人脸对象
unknown_face_locations = face_recognition.face_locations(unknown_image)
# 未知人像特征值 (先默认拿第一张人脸  因为只有一张)
unknown_face_encoding = face_recognition.face_encodings(unknown_image, unknown_face_locations)[0]

# 胡歌人像特征值 (直接将图片输入提取特征函数,因为被比对的照片必须只能有一张人脸)
huge_face_encoding = face_recognition.face_encodings(huge_img)

# 使用比对函数 输入两个特征值对象 以及容忍度,便可以知道是不是同一个人
Results = face_recognition.compare_faces(huge_face_encoding, unknown_face_encoding,  tolerance=0.4)
print(Results)

Запустив здесь, мы можем получить результат

图片.png

Мы используем новый метод compare_faces, когда получаем результаты сравнения, давайте посмотрим на описание исходного кода.

def compare_faces(known_face_encodings, face_encoding_to_check, tolerance=0.6):
    """
    Compare a list of face encodings against a candidate encoding to see if they match.

    :param known_face_encodings: A list of known face encodings
    :param face_encoding_to_check: A single face encoding to compare against the list
    :param tolerance: How much distance between faces to consider it a match. Lower is more strict. 0.6 is typical best performance.
    :return: A list of True/False values indicating which known_face_encodings match the face encoding to check
    """
    return list(face_distance(known_face_encodings, face_encoding_to_check) <= tolerance)
"""
将面部编码列表与候选编码进行比较,看看它们是否匹配。

:param known_face_encodings:已知的人脸编码列表
:param face_encoding_to_check:与列表进行比较的单个面编码
:参数容忍度:面与面之间的距离是否匹配。越低越严格。0.6是典型的最佳性能。
:return:一个True/False值的列表,指明哪些known_face_encoding匹配要检查的face encoding
"""

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

На этом мы завершили сравнение характеристик двух портретов.