Играйте с распознаванием лиц

искусственный интеллект Python
Играйте с распознаванием лиц

1. Развитие распознавания лиц

Подсчитывая историю развития распознавания лиц, можно условно разделить ее на четыре этапа:

  1. С 1964 по 1990 годы на первом этапе изучались черты лица распознавания лиц, но автоматическое распознавание не осуществлялось.
  2. 1991~1997, второй этап, исследования по распознаванию искусственных алгоритмов
  3. 1998–2014 гг., третий этап, в основном исследования надежности, такие как освещение, поза
  4. 2015 г. по настоящее время, четвертый этап, Интернет-приложение: зрелая технология, широкомасштабное продвижение и применение

Эта технология перевернула жизнь с ног на голову!

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


(Источник изображения:Принцип распознавания лиц)

2. Реализовать распознавание лиц на основе face_recognition

Такая крутая функция, мы также можем легко реализовать ее с помощью face_recognition!

face_recognition: это самая краткая в мире библиотека распознавания лиц, вы можете использовать Python и инструменты командной строки для извлечения, распознавания лиц и управления ими.face_recognition предоставляет богатые API (смотрите подробности) для вызова мы используем фреймворк python-flask, чтобы инкапсулировать интерфейс и построить небольшой сервер распознавания лиц.

Основной код выглядит следующим образом:

def faceMatch(name):
    if name is None:
        abort(404)
    name = './uploadimg/'+name
    unknown_image = face_recognition.load_image_file(name)
    res = []
    if unknown_image is None:
        res.append(" position fail!")
    else:
        try:
            unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
            WSI_MASK_PATH = './orisample/'  #原始库
            wsi_mask_paths = glob.glob(os.path.join(WSI_MASK_PATH, '*.jpg'))
            for pic in wsi_mask_paths:
                known_image = face_recognition.load_image_file(pic)
                #已知人脸编码
                known_encoding = face_recognition.face_encodings(known_image)[0]
                #待识别图像,与源库比对
                results = face_recognition.compare_faces([known_encoding], unknown_encoding, tolerance = 0.4)
                if results[0] == True:
                    res.append(pic.split('/')[2]+" It's a picture of me!")
                else:
                    res.append(pic.split('/')[2]+" not")
        except:
            res.append(" position fail!!")
    return render_template('facematch.html', url=res, name=res)

код (Адрес источника) Интерпретация:

  • После импорта face_recognition вызовите интерфейс face_encodings, чтобы получить кодировку изображения.
  • Затем через интерфейс compare_faces, полагаясь на алгоритм сравнения сходства между ними, сделайте прогноз.

Показать результаты:

В приведенном выше примере используется python-flask для простой инкапсуляции интерфейса face_recognition.полный код

3. Принцип распознавания лиц

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

Распознавание лиц обычно можно разделить на четыре этапа:

  • Найдите лица
  • Извлечь черты лица
  • Параметризация черт лица
  • Сравните исходную библиотеку для распознавания лиц
3.1 Поиск граней

К расположению лица применяется алгоритм HOG, и основные черты лица на картинке получаются путем замены пикселей градиентом.

Сначала мы устанавливаем изображение в черно-белое, удаляем эффект цвета, а затем помечаем его стрелками в соответствии с тенденцией градиента вокруг пикселя:

(Источник изображения:Принцип распознавания лиц)

Повторите эту операцию и, наконец, получите изображение, отмеченное стрелкой (Код реализации алгоритма HOG):

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

3.2 Извлечение черт лица

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

Поэтому выполняется простая передача для получения приблизительного фронтального изображения лица распознаваемого изображения.

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

(Источник изображения: КМУBrandon Amos)

3.3 Параметризация черт лица

Далее находится в центре внимания этой статьи! !

Каждое изображение, которое должно быть распознано лицом, будет преобразовано машиной в 128-битную параметрическую идентификацию.

Итак, каким правилам следует машина при параметризации изображений? обучаяГлубокие сверточные нейронные сети, выполнять глубокое обучение и обучение, а также определять правила преобразования изображений в 128-битные.

Метод обучения:

  • Импортируйте известное изображение лица, получите №1
  • Загрузите другую фотографию известного человека, получите № 2
  • Загрузите изображение неизвестного человека, получите #3

Постоянно корректируем алгоритмы и параметры,№1 и №2 сближаются, а №1 и №3 все дальше и дальше друг от друга., после миллионов операций нейронная сеть, наконец, может выучить оптимальные правила параметризации изображения для достижения цели распознавания лиц.

3.4 Сравните исходную библиотеку для распознавания лиц

Сравниваем полученное 128-битное значение с библиотекой источника данных, чтобы найти максимально похожее, то есть полное распознавание лица. через простойSVM-классификатор, что может сократить процесс сравнения до нескольких миллисекунд.

Четвертый, продвинутый: кодирование видео

Впереди Хо, а сзади Ди. Это может разрушить учеников на более позднем этапе популярного развлекательного шоу «GG Преодолевая стойкость». Это также помогает ученикам на более позднем этапе распаковать и позволить программе автоматически кодировать!

Выбираем короткий отрывок из оригинального видео «ГГ преодолевает шипы»:

Закодированное видео выглядит следующим образом:

В основном реализовано с помощью ffmpeg и opencv, (Полный источник кода: Джек Куи) без необходимости изобретать велосипед:

def mask_video(input_video, output_video, mask_path='mask.jpg'):
    # 打码图片
    mask = cv2.imread(mask_path)
    # 读取视频
    cap = cv2.VideoCapture(input_video)
    # 读取视频参数,fps、width、heigth
    CV_CAP_PROP_FPS = 5
    CV_CAP_PROP_FRAME_WIDTH = 3
    CV_CAP_PROP_FRAME_HEIGHT = 4
    v_fps = cap.get(CV_CAP_PROP_FPS)
    v_width = cap.get(CV_CAP_PROP_FRAME_WIDTH)
    v_height = cap.get(CV_CAP_PROP_FRAME_HEIGHT)
    # 设置写视频参数,格式为 mp4
    size = (int(v_width), int(v_height))
    fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
    out = cv2.VideoWriter(output_video, fourcc, v_fps, size)

    # 已知人脸
    known_image = face_recognition.load_image_file("lyd2.png")
    # print(known_image)
    biden_encoding = face_recognition.face_encodings(known_image)[0]
    print(biden_encoding)
    # 读取视频
    cap = cv2.VideoCapture(input_video)
    while(cap.isOpened()):
        ret, frame = cap.read()
        if ret:
            # 检测人脸
            face_locations = face_recognition.face_locations(frame)
            # 检测每一个人脸
            for (top_right_y, top_right_x, left_bottom_y, left_bottom_x) in face_locations:
                unknown_image = frame[top_right_y-50:left_bottom_y +
                                      50, left_bottom_x-50:top_right_x+50]
                if unknown_image is None:
                    break
                try:
                    unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
                except:
                    break
                # 对比结果
                results = face_recognition.compare_faces(
                    [biden_encoding], unknown_encoding)
                # 是李云迪,就打码
                if results[0] == True:
                    mask = cv2.resize(mask, (top_right_x-left_bottom_x, left_bottom_y-top_right_y))
                    frame[top_right_y:left_bottom_y,left_bottom_x:top_right_x] = mask
            # 写入视频
            out.write(frame)
        else:
            break

Интерпретация кода:

  • С помощью opencv прочитайте cap видеопотока = cv2.VideoCapture(input_video), получите каждый кадр, пока (cap.isOpened())
  • Выполните распознавание лица face_recognition.compare_faces() для каждого кадра, если целевое лицо распознано, код cv2.resize() для каждого кадра изображения
  • Сохраните поток изображения и запишите видео кадр за кадром out.write(frame)
  • Новое видео без звука и может быть преобразовано в аудио через ffmpeg, а затем объединено вместе.

V. Проблемы и решения

5.1 face_recognition плохо распознает детские и азиатские лица

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

5.2 Динамические изменения лиц видео, приводящие к низкой целостности кодирования

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

5.3 Коммерциализация распознавания лиц

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

6. Резюме

В этой статье демонстрируется построение распознавания лиц с помощью face_recognition и вводятся принципы позиционирования лица, извлечения признаков и глубокого обучения, лежащие в его основе. Наконец, с помощью opencv через покадровую обработку реализовано кодирование видео, так что Dimou и "код" в "GG" исчезнут.

Использованная литература:

проект с открытым исходным кодом face_recognitionпортал

Modern Face Recognition with Deep Learning Adam Geitgey

Практическое руководство по глубокому обучению PytorchJack Cui