Шок! Напишите программу распознавания лиц всего в 20 строках кода

Python

Эта статья была впервые опубликована в публичном аккаунте [Программирование и бой на Python]

Сегодня я познакомлю вас с face_recognition, самой компактной библиотекой распознавания лиц в мире.Вы можете использовать Python и инструменты командной строки для извлечения, распознавания лиц и управления ими.

На основе модели глубокого обучения в ведущей в отрасли библиотеке с открытым исходным кодом C++ dlib.Labeled Faces in the WildНабор данных о лицах протестирован, и точность достигает 99,38%.

1. Особенности

  1. Найдите лицо на картинке
  2. Определите ключевую позицию лица людей
  3. Определите, кто изображен на картинке
  4. Обнаружение лиц в видео

2. Установка

Для установки лучше всего использовать среду Linux или Mac, при установке под Windows будет много проблем. Перед установкой face_recognition необходимо установить следующие библиотеки, обратите внимание на порядок.!

2.1 установить cmake и повысить

pip  install  cmake
pip install boost

2.3 Установите dlib

pip install dlib

Установка здесь может занять несколько минут. Если есть ошибка установки, рекомендуется использовать файл whl для установки ссылка для скачивания:Leatherskin.org/simple/spree…

####2.3 Установите функцию распознавания лиц face_recognition обычно используется с opencv

pip install face_recognition
pip install opencv-python

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

Например, всего имеется три картинки, две из которых известны, а третья — это картинка, которую нужно идентифицировать.

Названия трех картинок: "kobe,jpg", "jordan.jpeg", "unown.jpeg" Сначала получить информацию в лицо

kobe_image = face_recognition.load_image_file("kobe.jpg")  # 已知科比照片
jordan_image = face_recognition.load_image_file("jordan.jpeg")  # 已知乔丹照片
unknown_image = face_recognition.load_image_file("unkown.jpeg")  # 未知照片

kobe_face_encoding = face_recognition.face_encodings(kobe_image)[0]
jordan_face_encoding = face_recognition.face_encodings(jordan_image)[0]
unknown_face_encoding = face_recognition.face_encodings(unknown_image)[0]

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

Затем сравните лицо на неизвестной картинке с лицом в известной картинке, используйте функцию comate_faces (), код выглядит следующим образом:

known_faces = [
    kobe_face_encoding,
    jordan_face_encoding
]
results = face_recognition.compare_faces(known_faces, unknown_face_encoding)  # 识别结果列表
print("这张未知照片是科比吗? {}".format(results[0]))
print("这张未知照片是乔丹吗? {}".format(results[1]))

Результаты приведены ниже:

Менее чем в 20 строках кода так легко определить, кто это на лице!

4. Аннотация лица

Просто распознавание лица на картинке всегда кажется чем-то особенным, так что интереснее назвать распознанное лицо~ Распознавание известных изображений такое же, как и в предыдущем коде. Неизвестные изображения имеют большее распознавание местоположения лица. Функция face_locations(), которая передает массив изображений, возвращает список местоположений лиц в фиксированном порядке сверху, справа, снизу, и влево. код показывает, как показано ниже:

face_locations = face_recognition.face_locations(unknown_image)
face_encodings = face_recognition.face_encodings(unknown_image, face_locations)

Используйте функцию FACE_DISTANCE(). Сравните расположение известного лица и неизвестной части, получите европейское расстояние ~ · Я не знаю, что конкретно, расстояния эквивалентны друг другу. Face_distance (face_encodings, face_to_compare) Face_Encodings: известное кодирование лица Face_to_compare: Кодировка лица для сравнения

Первые два снимка этого времени не изменились, а третий снимок заменили на групповое фото Коби и Джордана.После финальной операции результаты таковы:

识别结果

Слева — исходное изображение, а справа — автоматически отмеченное изображение после распознавания.

import face_recognition
from PIL import Image, ImageDraw
import numpy as np


def draws():
    kobe_image = face_recognition.load_image_file("kobe.jpg")
    kobe_face_encoding = face_recognition.face_encodings(kobe_image)[0]

    jordan_image = face_recognition.load_image_file("jordan.jpeg")
    jordan_face_encoding = face_recognition.face_encodings(jordan_image)[0]

    known_face_encodings = [
        kobe_face_encoding,
        jordan_face_encoding
    ]
    known_face_names = [
        "Kobe",
        "Jordan"
    ]

    unknown_image = face_recognition.load_image_file("two_people.jpeg")

    face_locations = face_recognition.face_locations(unknown_image)
    face_encodings = face_recognition.face_encodings(unknown_image, face_locations)

    pil_image = Image.fromarray(unknown_image)
    draw = ImageDraw.Draw(pil_image)

    for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
        matches = face_recognition.compare_faces(known_face_encodings, face_encoding)

        name = "Unknown"

        face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
        best_match_index = np.argmin(face_distances)
        if matches[best_match_index]:
            name = known_face_names[best_match_index]

        draw.rectangle(((left, top), (right, bottom)), outline=(0, 0, 255))

        text_width, text_height = draw.textsize(name)
        draw.rectangle(((left, bottom - text_height - 10), (right, bottom)), fill=(0, 0, 255), outline=(0, 0, 255))
        draw.text((left + 6, bottom - text_height - 5), name, fill=(255, 255, 255, 255))

    del draw
    pil_image.show()
    pil_image.save("image_with_boxes.jpg")

5. Макияж лица

Эту функцию необходимо использовать вместе с PIL. Использование аналогично, сначала нужно загрузить файл изображения в массив numpy, а затем идентифицировать все черты лица в списке.

image = face_recognition.load_image_file("bogute.jpeg")
face_landmarks_list = face_recognition.face_landmarks(image)

Перебираем элементы в списке, изменяя брови

d.polygon(face_landmarks['left_eyebrow'], fill=(68, 54, 39, 128))
d.polygon(face_landmarks['right_eyebrow'], fill=(68, 54, 39, 128))
d.line(face_landmarks['left_eyebrow'], fill=(68, 54, 39, 150), width=5)
d.line(face_landmarks['right_eyebrow'], fill=(68, 54, 39, 150), width=5)

посадить помаду на лицо

d.polygon(face_landmarks['top_lip'], fill=(150, 0, 0, 128))
d.polygon(face_landmarks['bottom_lip'], fill=(150, 0, 0, 128))
d.line(face_landmarks['top_lip'], fill=(150, 0, 0, 64), width=8)
d.line(face_landmarks['bottom_lip'], fill=(150, 0, 0, 64), width=8)

увеличить подводка для глаз

d.polygon(face_landmarks['left_eye'], fill=(255, 255, 255, 30))
d.polygon(face_landmarks['right_eye'], fill=(255, 255, 255, 30))
d.line(face_landmarks['left_eye'] + [face_landmarks['left_eye'][0]], fill=(0, 0, 0, 110), width=6)
d.line(face_landmarks['right_eye'] + [face_landmarks['right_eye'][0]], fill=(0, 0, 0, 110), wid=6)

Я сделал это по приведенному выше коду, а для демонстрации использовал "болтаного" Богута, который недостаточно силен для игры и грязен! Слева исходное изображение, справа эффект после добавления красоты

Ты играешь как cxk!