Система машинного обучения распознавания лица с веб-камеры (Webcam based facial recognition machine learning system)

Автор: | 02.11.2019

Введение
Постановка задачи
Интерфейс программы для распознавания лица с веб-камеры 
Выводы
Полезные ссылки

Введение

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

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

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

Постановка задачи

В статьях:

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

Обратите внимание на следующий рисунок.

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

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

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

Каждая пара сигналов берется с кадров (frames) от веб-камеры через определенный промежуток времени.

Для обучения сети используется выборка данных для нескольких лиц с различными их положениями относительно камеры. Наше лицо получает на выходе НС сигнал 1, остальные — 0.

При тестировании уже обученной сети сигнал на выходе должен быть близок к 1 — если наше лицо опознано; и близок к 0 — если это лицо другого субъекта. Обязательно необходимо проводить тестирование и с данными лиц субъектов, которые не входили в обучающую выборку.

Порядок выполнения лабораторной работы:

  1. Получите входные данные (пара нормализованных расстояний от точки носа до точек глаз) для нескольких кадров (Frames), используя программу из статьи  Обнаружение лица и выделение характерных точек в реальном времени
  2. Обучите и протестируйте нейронную сеть на основе этих данных, используя программу из статьи Простейшие нейронные сети на Python в Visual Studio.  Для обучения НС используйте поочередно входные данные, полученные с кадров вашего лица и лиц других особ. Для тестирования используйте данные с кадров, которые не использовались при обучении НС. Тест считается успешным, если по входным данным вашего лица получен сигнал на выходе, близкий к 1, для лица другой особы  — сигнал на выходе, близкий к 0.
  3. Разработайте программу для распознавания вашего лица среди множества лиц с возможностью автоматического считывания данных с веб-камеры. Возможный интерфейс программы описывается ниже.

Интерфейс программы для распознавания лица с веб-камеры

При запуске программы появляется диалоговое окно.

При нажатии на кнопку Start  запускается процесс обучения — если включена опция Training или процесс распознавания —  если включена опция Recognition.

Перед началом обучения (еще до включения веб-камеры) появляется msgbox с вопросом: «This person? »

При положительном ответе на выход нейронной сети будет подаваться значение сигнала 1, в противном случае — 0.

Далее включается веб-камера и начинается обучение НС на основе признаков лица (нормализованных расстояний от точки носа до точек глаз), снимаемых с кадров через определенные интервалы времени. Лицо необходимо поворачивать перед камерой, чтобы получать на вход НС разнообразные данные.

Этап обучения НС для одного лица заканчивается после обработки  определенного количества кадров. Камера выключается и запускается этап обучения с другим лицом. Этапы обучения должны чередоваться между вашим лицом (с сигналом на выходе 1) и другими лицами (с сигналом на выходе 0).

Для тестирования корректности обучения включается опция Recognition и нажимается кнопка Start . Тест считается успешным, если при любом положении лица относительно камеры корректно и стабильно отображается один и тот же текст («YES»  или  «NO»).

Если перед камерой ваше лицо, то сигнал на выходе НС должен быть близок к 1 (в окне мелькает текст «YES»). Если перед камерой лицо другого человека,  то сигнал на выходе должен быть близким к 0 (в окне мелькает текст «NO»).

Приблизительно шаблон кода для описанного интерфейса может выглядеть так:

from tkinter import *
from tkinter import filedialog
from tkinter import messagebox as mb

def Quit(ev):
 global root
 root.destroy()
 
def Start(ev):   # функция вызывается при нажатии кнопки "Start"
  value = option.get()
  if value == 1:
       # Training
       train = True
       answer = mb.askyesno(title="Question", message="This person?")
       # if answer == True на выход сети поступит сигнал 1
       # else: на выход сети поступит сигнал 0       
  else:
       # Recognition
       train = False
  # Запуск модуля Video() - видео-захват лица и выделение признаков 
  # в пределах этого модуля проверка условий
  # if train == True:  
  # запуск модуля Training() - обучение сети
  # else:
  # запуск модуля Recognition() - тестирование обученной сети

# Network weights initialization:
# запуск модуля Init() инициализация весов сети

# Interface
root = Tk()

panelFrame = Frame(root, height = 60, bg = 'gray')
textFrame = Frame(root, height = 40, width = 600)

panelFrame.pack(side = 'top', fill = 'x')
textFrame.pack(side = 'bottom', fill = 'both', expand = 1)

option = IntVar()
R1 = Radiobutton(panelFrame, text="Training       ", value = 1, var = option)
R1.pack()
R2 = Radiobutton(panelFrame, text="Recognition", value = 2, var = option)
R2.pack()
value = option.set(1)

startBtn = Button(panelFrame, text = 'Start')
quitBtn = Button(panelFrame, text = 'Quit')

startBtn.bind("<Button-1>", Start)
quitBtn.bind("<Button-1>", Quit)

startBtn.place(x = 10, y = 10, width = 40, height = 40)
quitBtn.place(x = 250, y = 10, width = 40, height = 40)

root.mainloop()

Фрагменты кода для доработки приложения возьмите из программ в  статьях:

Выводы

Выше был рассмотрен метод распознавания лица с веб-камеры через обучение НС. Этот метод может быть применен для идентификации особы, например — вместо пароля при входе в компьютерную систему.

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

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

Если сеть обучалась на одних данных (при определенных условиях), то не факт, что она будет давать хорошие результаты для выборки других данных (при других условиях).

Можно подобрать оптимальную комбинацию обоих подходов. Например, в статьях Распознавание лиц на основе OpenCV для C++ и  Распознавание лиц. 3D-реконструкция ASM модели  задача решается алгоритмически. Однако, при этом остается открытой проблема  определения весовых коэффициентов признаков-расстояний. Решить эту проблему можно с помощью НС:

Полезные ссылки:

 

 

 

Автор: Николай Свирневский

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *