Вы находитесь на странице: 1из 31

Министерство науки и высшего образования Российской Федерации

Федеральное государственное автономное образовательное


учреждение высшего образования
«ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»
(ФГАОУ ВО «ЮФУ»)

Институт компьютерных технологий и информационной безопасности

Индивидуальное задание
по дисциплине “Методы и модели теории графов”

распознавание лица человека в видеопотоке с помощью нейронной сети

Выполнил
студент группы КТбо1-1 _________________ А.М. Воронин

Приняла
доцент ИКТИБ, к. т. н. _________________ Е.Р. Мунтян

Таганрог 2021
Оглавление

Оглавление...............................................................................................................................................2
Введение....................................................................................................................................................3
Выполнение работы................................................................................................................................4
1.Перцептрон............................................................................................................................................4
1.2 Модель нейрона.............................................................................................................................4
1.2. Демонстрация возможности применения перцептрона.........................................................6
1.3. Обучение перцептрона...............................................................................................................10
2. Распознавание лица человека в видеопотоке...............................................................................17
2.1 OpenCV..........................................................................................................................................18
2.2 FaceNet...........................................................................................................................................20
2.3. Keras и Tensorflow......................................................................................................................24
2.4 Результаты объединения модулей программы......................................................................24
2.5. Сравнительный анализ предлагаемой архитектуры с альтернативами..........................25
2.5.1 Не используемые в реальной разработке альтернативы..............................................25
2.5.2 Альтернативы, используемые в реальной разработке..................................................26
Вывод.......................................................................................................................................................29
Источники..............................................................................................................................................30

2
Введение
Нейронные сети изначально проектировались как математическая
модель, основанная по принципу работы нервных клеток человека.
Основоположниками данной идеи стали Алан Тьюринг и его работа “О
вычислимых числах”, Маккаллок и Питс с исследованием “Логическое
исчисление идей, относящихся к нервной активности.

На сегодняшний день нейросети активно применяются для


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

Цель данной работы максимально полно ознакомить читателя с


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

3
Выполнение работы

1.Перцептрон
1.2 Модель нейрона

Перцептрон, изобретенный в 1957 году Фрэнком Розенблаттом из


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

Рисунок 1.1: общая схема перцептрона

Персептрон следует модели «прямой связи», то есть входные данные


отправляются в нейрон, обрабатываются и приводят к выходным данным.

Рассмотрим работу данной нейросети пошагово.

В первую очередь, перцептрон получает данные на входы для


обработки. Допустим, у нас есть перцептрон с двумя входами - назовем их x1
и x2.

Вход 0: x1 = 12

Вход 1: x2 = 4

Следующим шагом его работы будет определение весов нейросети. Каждый


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

4
перцептрона мы обычно начинаем с присвоения случайных весов. Здесь
давайте присвоим входным данным следующие веса:

Вес 0: 0,5

Вес 1: -1

Далее, необходимо перемножить соответствующие веса и входы:

Вход 0 * Вес 0 = 12*0.5 = 6

Вход 1 * Вес 1 = 4*(-1) = -4

Следующим шагом необходимо найти сумму получившихся значений:

Сумма = 6 + -4 = 2

Выходные данные перцептрона генерируются путем передачи этой суммы


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

Существуют различные функции активации. Дабы не усложнять


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

Выход = знак (сумма) ⇒ знак (2) ⇒ 1

Если мы запишем это в виде кода, выглядеть это будет следующим образом:

float[] inputs = {12 , 4};

float[] weights = {0.5,-1};

float sum = 0;

for (int i = 0; i < inputs.length; i++) {

sum += inputs[i]*weights[i];

5
}

float output = activate(sum);

int activate(float sum) {

if (sum > 0) return 1;

else return -1;

1.2. Демонстрация возможности применения перцептрона


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

Рассмотрим линию в двухмерном пространстве. Точки в этом пространстве


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

6
Рисунок 1.2: задача классификации точек относительно линии

Допустим, перцептрон имеет 2 входа (координаты точки x и y). Используя


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

Рисунок 1.3: модель перцептрона для решения задачи.

Мы можем видеть, как есть два входа (x и y), вес для каждого входа
(weight x и weight y), а также обрабатывающий нейрон, который генерирует
выходные данные.

Однако здесь есть довольно серьезная проблема. Рассмотрим точку


(0,0). Что, если мы отправим эту точку в перцептрон в качестве входных
данных: x = 0 и y = 0? Какова будет сумма его взвешенных входов?
Независимо от веса, сумма всегда будет равна 0! Но это не может быть
правильным - в конце концов, точка (0,0) определенно может быть выше или
ниже различных линий в нашем двумерном мире.

Чтобы избежать этой дилеммы, нашему перцептрону потребуется


третий вход, обычно называемый входом смещения. Вход смещения всегда
имеет значение 1 и также взвешивается. Вот наш перцептрон с добавлением
смещения:

7
Рисунок 1.4: исправленная модель перцептрона для решения задачи.

Вернемся к точке (0,0). Вот наши данные:

0 * вес для x = 0

0 * вес для y = 0

1 * вес для смещения = вес для смещения

Результатом является сумма трех вышеуказанных значений, 0 плюс 0


плюс вес смещения. Следовательно, смещение само по себе отвечает на
вопрос, где находится (0,0) по отношению к линии. Если вес смещения
положительный, (0,0) находится над линией; отрицательный, он ниже. Это
«искажает» понимание персептроном положения линии относительно точки
(0,0).

Теперь мы готовы к созданию кода для класса Perceptron.


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

class Perceptron {

float[] weights;

8
Конструктор может получить аргумент, указывающий количество
входов (в данном случае три: x, y и смещение) и соответственно размер
массива.

Perceptron(int n) {

weights = new float[n];

for (int i = 0; i < weights.length; i++)

{ weights[i] = random(-1,1); }

Персептрон должен иметь возможность получать входные данные и


генерировать выходные данные. Мы можем упаковать эти требования в
функцию под названием feedforward (). В этом примере перцептрон будет
получать свои входные данные в виде массива (который должен быть той же
длины, что и массив весов) и возвращать выходные данные в виде целого
числа.

int feedforward(float[] inputs) {

float sum = 0;

for (int i = 0; i < weights.length; i++)

{ sum += inputs[i]*weights[i]; }

return activate(sum);

Теперь мы можем создать объект Perceptron и найти его


предположение о месте над или под линией для любой заданной точки.

9
Рисунок 1.5: решение задачи перцептроном.

Perceptron p = new Perceptron(3);

float[] point = {50,-12,1};

int result = p.feedforward(point);

1.3. Обучение перцептрона


Правильно ли перцептрон находит ответ? На данный момент шанс
“попадания” у перцептрона составляет не больше 50%. Это происходит
потому, что его создании мы давали каждому весу случайное значение.
Чтобы научить нейронную сеть правильно отвечать, мы будем использовать
метод обучения с учителем.

Обучение с учителем - стратегия, в которой участвует учитель,


который знает ответ на поставленную нейросети задачу. Возьмем пример
распознавания лиц. Учитель показывает сети множество лиц, и учитель уже
знает имя, связанное с каждым лицом. Сеть делает свои предположения,
затем учитель дает правильные ответы. Нейросеть может сравнить свои
ответы с известными «правильными» и внести коррективы в соответствии со
своими ошибками.

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


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

10
1) Предоставить перцептрону входные данные, для которых есть
известный ответ.
2) Попросите перцептрон угадать ответ.
3) Найти ошибку. (Ответ был правильный или неправильный?)
4) Отрегулировать все веса в соответствии с ошибкой.
5) Повторить с пункта 1

Шаги с 1 по 4 можно объединить в функцию. Однако, прежде чем мы


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

Ошибка = желаемый вывод – вывод перцептрона

В случае перцептрона на выходе есть только два возможных значения:


+1 или -1. Это означает, что есть только три возможных ошибки.

Если перцептрон угадывает правильный ответ, то это предположение


равно желаемому результату, а ошибка равна 0.

Если правильный ответ -1, а ответ нейросети +1, то ошибка равна -2.

Если правильный ответ +1, а ответ нейросети -1, то ошибка +2.

Величина ошибки является определяющим фактором при настройке


веса перцептрона. Для любого заданного веса мы хотим вычислить
изменение веса, часто называемое Δweight (или «дельта-вес» )

НОВЫЙ ВЕС = ВЕС + ΔВЕС

Δweight рассчитывается как ошибка, умноженная на входные данные.

ΔВЕС = ОШИБКА * ВВОД

НОВЫЙ ВЕС = ВЕС + ОШИБКА * ВВОД

11
Нейронная сеть будет использовать дополнительную переменную,
называемую «константа обучения», чтобы отрегулировать скорость
изменения веса. Мы добавим константу обучения следующим образом:

НОВЫЙ ВЕС = ВЕС + ОШИБКА * ВВОД * ПОСТОЯННАЯ


ОБУЧЕНИЕ

Обратите внимание, что высокая константа обучения означает, что вес


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

Предполагая добавление переменной c для обучающей константы,


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

float c = 0.01;

void train(float[] inputs, int desired) {

int guess = feedforward(inputs);

float error = desired - guess;

for (int i = 0; i < weights.length; i++) {

weights[i] += c * error * inputs[i];

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

class Perceptron {

12
float[] weights;

float c = 0.01;

Perceptron(int n) {

weights = new float[n];

for (int i = 0; i < weights.length; i++) {

weights[i] = random(-1,1);

int feedforward(float[] inputs) {

float sum = 0;

for (int i = 0; i < weights.length; i++) {

sum += inputs[i]*weights[i];

return activate(sum);

int activate(float sum) {

if (sum > 0) return 1;

else return -1;

void train(float[] inputs, int desired) {

13
int guess = feedforward(inputs);

float error = desired - guess;

for (int i = 0; i < weights.length; i++) {

weights[i] += c * error * inputs[i];

Чтобы обучить перцептрон, нам нужен набор входных данных с


известным ответом. Мы могли бы упаковать это в такой класс:

class Trainer {

float[] inputs;

int answer;

Trainer(float x, float y, int a) {

inputs = new float[3];

inputs[0] = x;

inputs[1] = y;

inputs[2] = 1;

answer = a;

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


она над линией или под ней? Начнем с формулы для линии, где y
вычисляется как функция от x:

14
у = F (х)

В общих чертах линию можно описать как:

у = ах + b

Вот конкретный пример:

у=2*х+1

Помня об этом, мы можем написать функцию обработки.

float f(float x) {

return 2*x+1;

Итак, если мы ставим точку:

float x = random (width);

float y = random (height);

Как мы узнаем, находится ли эта точка над линией или под ней?
Линейная функция f (x) дает нам значение y в строке для этой позиции x.
Назовем это переменной yline.

Позиция Y на линии

float yline = f (x);

15
Если значение y, которое мы исследуем, находится выше линии, оно
будет меньше, чем yline.

Рисунок 1.6: определяем положение y относительно линии

if (y < yline) {

answer = -1;

} else {

answer = 1;

Затем мы можем создать объект Trainer с входными данными и


правильным ответом.

Trainer t = new Trainer(x, y, answer);

Предполагая, что у нас есть Perceptrone объект ptron, мы можем затем


обучить его, отправив входные данные вместе с известным ответом.

ptron.train(t.inputs,t.answer);

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

2. Распознавание лица человека в видеопотоке.


Задача распознавания лиц сегодня имеет крайне высокую
практическую значимость, как минимум из-за того, что это наиболее
распространенный способ биометрической идентификации. В данной работе
я хочу на примере итогового продукта проекта, в котором мне довелось
поучаствовать разобрать, какие принципы и инструменты используются для
реализации этого типа распознавания.

Наиболее простой метод разработки нейросети – это использование


языка Python и различных библиотек для него в качестве инструмента.
Также, зачастую более серьезную коммерческую разработку ведут на C++. Я
собираюсь подробно остановиться на реализации нейросети и
вспомогательных элементов на языке Python. Общий алгоритм практически
любой программы по распознаванию лица следующий:

Рисунок 2.1: общая схема работы нейросети для распознавания лиц.

Исходя из рисунка выше видно, что в первую очередь, необходимо


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

17
После этого человеку в соответствии с тем, что распознала нейросеть
присваивается id.

В описываемом мной проекте использовались следующие


библиотеки:

1) Tensorflow
2) FaceNet
3) opencv-python
4) numpy
5) scipy
6) matplotlib
7) argparse

Рассмотрим подробнее алгоритмы работы основных модулей программы.

2.1 OpenCV
Данная библиотека не является компонентом нейросети, но выполняет
крайне важную роль для дальнейшей обработки изображения. На основе
OpenCV пишется классификатор лиц, который выделяет лицо в detection-
branch и передает его в нейросеть для распознавания. Для этого OpenCV
использует каскады признаков Хаара.

Обнаружение объектов с использованием каскадных классификаторов


Хаара - это эффективный метод обнаружения объектов, предложенный
Полом Виолой и Майклом Джонсом в их статье «Быстрое обнаружение
объектов с использованием усиленного каскада простых функций» в 2001
году. Это подход, основанный на машинном обучении. Каскадная функция
обучается на большом количестве положительных и отрицательных
изображений. Затем он используется для обнаружения объектов на других
изображениях.

18
Существует алгоритм, называемый структурой обнаружения объектов
Виолы – Джонса, который включает в себя все шаги, необходимые для
обнаружения лица человека:

1) Выбор функций Хаара


2) Создание целостного образа
3) Обучение Adaboost
4) Каскадная классификация

В стандартном методе Виолы – Джонса используются прямоугольные


признаки, изображенные на рисунке ниже, они называются примитивами
Хаара:

Рисунок 2.2: примитивы Хаара.

1. Выбор характеристик Хаара.

Черты лица, которые мы находим общими для большинства


человеческих лиц (глаза, рот, нос, губы, темная область глаз над верхней
частью щек, яркая область переносицы между глазами и т. д.). Эти
характеристики в основном являются чертами Хаара. Значение
характеристики просто вычисляется путем суммирования пикселей в черной
области и вычитания пикселей в белой области., то есть:
19
Функция прямоугольника = сумма пикселей черной области - сумма
пикселей белой области

2. Создание целостного образа.

Чтобы извлечь эти особенности Хаара, нам нужно вычислить сумму


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

3. Обучение Adaboost.

Учитывая набор маркированных обучающих изображений


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

4. Каскадный классификатор.

Каскадные классификаторы обучаются с использованием нескольких


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

2.2 FaceNet
FaceNet позволят создать сверточную нейросеть для
распознавания лиц. Сверточная нейронная сеть (CNN) - это многослойная
нейронная сеть со специальной архитектурой для обнаружения сложных

20
функций в данных. CNN использовались для распознавания изображений,
обеспечения зрения в роботах и для беспилотных транспортных средств.

После создания CNN ее можно использовать для классификации


содержимого различных изображений. Все, что нам нужно сделать, это
загрузить эти изображения в модель. Как и ИНС, CNN вдохновлены работой
человеческого мозга. CNN могут классифицировать изображения,
обнаруживая особенности, аналогично тому, как человеческий мозг
обнаруживает особенности для идентификации объектов.

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


с некоторыми концепциями CNN и этапами их создания.

Изображения состоят из пикселей. Каждый пиксель представлен


числом от 0 до 255. Следовательно, каждое изображение имеет цифровое
представление, с помощью которого компьютеры могут работать с
изображениями. Процес построения CNN можно описать в несколько этапов.

1. Свертка.

Свертка - это комбинированная интеграция двух функций, которая


показывает, как одна функция изменяет другую.

Рисунок 2.3: функция свертки

В этом процессе следует упомянуть три важных элемента: входное


изображение, детектор признаков и карту признаков. Детектор признаков
представляет собой матрицу, обычно 3x3 (также может быть 7x7). Его также
называют ядром или фильтром.
21
Матричное представление входного изображения поэлементно
умножается с помощью детектора признаков для создания карты признаков,
также известной как свернутый объект или карта активации. Цель этого шага
- уменьшить размер изображения и упростить обработку. На этом этапе
теряются некоторые особенности изображения.

Однако основные характеристики изображения, которые важны для


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

2. ReLu (выпрямленный линейный блок).

На этом этапе мы применяем функцию выпрямителя для увеличения


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

3. Объединение

Пространственная инвариантность - это концепция, при которой


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

Существуют разные типы пулов, например, максимальный пул и


минимальный пул. Максимальное объединение работает путем размещения
матрицы 2x2 на карте функций и выбора наибольшего значения в этом поле.
22
Матрица 2x2 перемещается слева направо по всей карте признаков, выбирая
наибольшее значение на каждом проходе.

Эти значения затем образуют новую матрицу, называемую


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

4. Сглаживание

После получения объединенной избранной карты следующим шагом


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

5. Полное подключение

После выравнивания развернутая карта признаков проходит через


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

Окончательные цифры, полученные нейронной сетью, обычно не


равняются единице. Однако важно, чтобы эти цифры были сокращены до
чисел от нуля до единицы, которые представляют вероятность каждого
класса. Это роль функции Softmax.

23
Идентификация лица может быть реализована путем обучения
простого мультиклассового классификатора, такого как K-NN или SVM,
посредством встраивания лиц, созданных FaceNet.

FaceNet генерирует встраивание (512-мерный вектор признаков в


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

2.3. Keras и Tensorflow.


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

2.4 Результаты объединения модулей программы

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

Рисунок 2.4: демонстрация работы программы на вышеуказанных


принципах.

Основные проблемы при использовании такого типа нейросетей –


высокая чувствительность к освещению. В условиях плохой освещенности
возможна некорректная работа.

25
2.5. Сравнительный анализ предлагаемой архитектуры с
альтернативами.
2.5.1 Не используемые в реальной разработке альтернативы
Если мы хотим разобраться, как можно создать программное
обеспечение для распознавания лиц, стоит выделить два основных подхода –
нейросетевой и статистический.

Статистический подход строится на построении вероятностного


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

Например, имея детектор, мы попытались использовать его совместно


с нейросетью архитектуры FaceNet вместо того, чтобы использовать
каскадное распознавание, что значительно увеличило бы точность
идентификации, так ка FaceNet достаточно мощна, чтобы идентифицировать
человека по одной фотографии. Однако, такая модель системы была бы
значительно требовательнее к ресурсам, что удалось выяснить опытным
путем. Количество кадров в секунду, даже с выделением вывода
изображения с камеры в отдельный поток, было плачевно низким - система
очень сильно нагрузила связку из процессора I5-8250U и GPU MX150, пусть
они и не являются эталонными для таких операций. В итоге были
использованы базовые средства OpenCV в связке с dlib.

Есть еще несколько вариантов конструирования при нейросетевом


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

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


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

2.5.2 Альтернативы, используемые в реальной разработке.


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

Основное свое внимание я хотел бы обратить на нейросети


архитектуры Yolo v4, как наиболее новой и производительной. Она
появилась в 2020 году, и показала отличные результаты как по скорости
распознавания, так и по его точности. Для понимание реальных перспектив
разработки на ней, я советовал бы ознакомиться с видео по ссылке в QR-
коде.

27
Рисунок 2.5: QR-код видеопредставления Yolo v4.

Согласно графикам, это действительно самая быстрая архитектура для


классификации нейросети на данный момент.

Рисунок 2.5: график сравнения Yolo V4 с другими архитектурами.

Также, отдельное внимание стоит уделить архитектурам EfficientDet


версий D2 и D0 (для обучения на мощных, и более слабых компьютерах
соответственно). Они выдают чуть меньшую скорость распознавания и
требуют больше ресурсов для обучения (D0 примерно на 10% медленнее

28
Yolo v4, при аналогичных требованиях к железу), но при этом являются
наиболее близкими аналогами. Думаю, в случае если разработчик заранее
знает обсуждаемую архитектуру и не знает Yolo, то разработка на
EfficientDet предпочтительнее в большинстве случаев.

Спарка Keras, Tensorflow и FaceNet тоже нельзя назвать полностью


устаревшей, но такая архитектура нейронной сети на данный момент будет
ощутимо медленнее при распознавании объектов. Там, где это не играет
роли, ее можно продолжать применять. В своем проекте мы использовали
данную архитектуру, так как на 2019 год она была одной из наиболее
перспективных.

В завершении выбранной темы, хочется сказать, что различных


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

29
Вывод

В результате выполнения данной работы я на практике разобрал


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

30
Источники
1. Брюхомицкий Ю. А Нейросетевые модели для систем
информационной безопасности: Учебное пособие. - Таганрог: Изд-во ТРТУ,
2005.
2. Ю.Лифшиц Статистические методы распознавания образов. 2005.
3. Hinton Geoffrey ImageNet Classification with Deep Convolutional
Neural Networks. - NIPS'12: Proceedings of the 25th International Conference on
Neural Information Processing Systems - Volume 1 изд. 2012.
4. LeCun, Yann; Bengio, Yoshua Convolutional networks for images,
speech, and time series. - The handbook of brain theory and neural networks, изд.
2, 1995.
5. Andrew R. Webb QinetiQ Statistical Pattern Recognition. - изд. 2
изд. - Malvern UK: 2002.
6. Florian Schroff, Dmitry Kalenichenko, James Philbin FaceNet: A
Unified Embedding for Face Recognition and Clustering. - 3-е изд. - IEEE
Computer Society Conference on Computer Vision and Pattern Recognition 2015:
2015.
7. Viola and Jones, Rapid object detection using a boosted cascade of
simple features, Computer Vision and Pattern Recognition, 2001
8. Lienhart, R. and Maydt, J., An extended set of Haar-like features for
rapid object detection, 2002
9. Pulli, Kari; Baksheev, Anatoly; Kornyakov, Kirill; Eruhimov, Victor
Realtime Computer Vision with OpenCV, 2012
10. Piatetsky, Gregory Python eats away at R: Top Software for
Analytics, Data Science, Machine Learning in 2018: Trends and Analysis. 2018.

31