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

Российские ученые предложили новый метод распознавания людей на видео с помощью глубокой нейронной сети. Подход не требует большого числа фотографий, он позволяет значительно повысить точность распознавания по сравнению с ранее известными аналогами, даже если доступна всего одна фронтальная фотография человека. Результаты работы опубликованы в журналах Expert Systems with Applications () и Optical Memory and Neural Networks ().

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

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

В качестве тестовой базы исследователи использовали несколько традиционных наборов данных для оценки методов распознавания лиц на видео – IJB-A (IARPA Janus Benchmark A) и YTF (YouTube Faces). Эти наборы включают в себя находящиеся в свободном доступе изображения известных людей (актеров, политиков, общественных деятелей), которые собирались из открытых источников в неконтролируемых условиях в разное время. Алгоритм должен был распознать лица на видео с YouTube, используя в качестве образцов несколько фотографий тех же людей из другого набора данных – LFW (Labeled Faces in the Wild). В LFW использовалось более высокое разрешение, а сами фотографии были сделаны в разное время, начиная с 1970-х до 2010-х годов.

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

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

В этот журнал я пишу обо всем, с чем сталкиваюсь впервые. В этот раз я поддался всеобщей истерии, и речь пойдет о сверточных нейронных сетях. Еще в этот раз я постараюсь подробно описать ход своих мыслей, а не просто перечислить результаты и способы их достижения. Поэтому будет "многа букаф".
Я очень долго сопротивлялся таким "грязным, искусственным" нейросетям, предпочитая "чистый, естественный" SVM. Серьезные пацаны уже давно решают проблемы используя сверточные нейронные сети. Нужна какая-то не сложная задача, желательно уже решенная мной в другой парадигме, чтобы опробовать на ней новую для меня технологию. Решено: распознаем лица. Для разогрева видео конечного продукта:
https://www.youtube.com/watch?v=mwDbGpAZdxU

Инструментарий

Как известно, нейронные сети обучаются намного эффективнее на GPU, чем на CPU. У меня нет десктопа с видеокартой. Благо, несколько лет назад покупая ноутбук, я купил игровой закладывался на то что мне понадобится освоить вычисления на GPU, и купил с видеокартой nvidia geforce gt 650m 2Gb. Итак, что я имел на момент начала работы: просто шикарный для новичка цикл статей machine learning is fun , определенный опыт в компьютерном зрении, материалы сайта face-rec.org . Нужно определиться с инструментарием. Конечно, это будет язык с++, библиотека компьютерного зрения opencv , а вот с фреймворком для распознавания лиц все оказалось сложнее. Оказалось, что OpenFace , используемый Адамом, написан на питоне и использует torch, который в свою очередь написан на lua. Мне принципиально нужно монолитное решение на с++. Быстро нашелся легковесный dlib в котором на тот момент имелся качественный детектор лиц, имелся инструментарий для работы со сверточными сетями, в том числе с использованием GPU, но не имелось функционала распознавания лиц. То что надо!
Начнем его разворачивать. Нужно скачать исходники и собрать с помощью cmake. Помучавшишь, разобрался, что для использования видеокарты, необходимо установить CUDA Toolkit и cuDNN с сайта Nvidia. Путь установки не должен содержать пробелов. Чтобы мой проект начал использовать dlib, я посмотрел параметры в тестовых примерах. Кроме списка библиотек, там нужно указать определение препроцессора DLIB_USE_CUDA и выставить параметры оптимизации. Также установил полезную утилиту GPUZ чтобы наблюдать за использованием видеокарты при обучении.

Прогнал несколько тестовых конфигураций нейросеток для известного датасета MNIST :


  • Двухслойный перцептрон обучался полчаса на одном ядре процессора Точность на обучающей выборке и на тестовой: (0.9908, 0.9792).

  • Сеть LeNet (Лекун) обучалась почти 6ч на одном ядре процессора а на видеокарте - 15 минут! Достигнутая точность (0.99975, 0.9915).

  • Сеть ResNet - 1ч и 15 минут на видеокарте, точность (0.9938).

  • Сеть Inception - около 4 часов на видеокарте, точность (0.999217, 0.9904).

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

Постановка задачи и первый вариант решения
Перейдем теперь к основной задаче. Я хочу построить достаточно надежный классификатор небольшой группы лиц (до 100 человек), опираясь на 3-5 фотографий каждого. Классификатор должен нормально "переваривать", очень вариативные изображения. Ведь в зависимости от угла обзора, условий освещения, наличия головного убора, очков, выражения лица будут получены очень разные изображения. Понятно, что при такой маленькой обучающей выборке (3-5 фото одной пероны) имеет смысл применять только линейный классификатор. И нужен очень качественный дескриптор, который мы применим предварительно, назначение которого подчеркнуть различия между фотографиями разных людей и сходства между разными фотографиями одного человека.

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


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

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


Первая конфигурация очень простая, на подобие Lenet , включает в себя пару сверточных слоев и три полносвязных:
static const size_t MINI_BATCH_SIZE = 128 ; //128; const unsigned long descriptor_size = 128 ; static const cv:: Size DATASET_IMAGE_SIZE = { 128 , 128 } ; //Сетка на подобие LeNet //LeCun, Yann, et al. "Gradient-based learning applied to document recognition." //Proceedings of the IEEE 86.11 (1998): 2278-2324. using net_type = dlib:: loss_multiclass_log < dlib:: fc < 2 , dlib:: fc < 128 , //!!!ТУТ ПРОПУСТИЛ RELU dlib::relu> >>> >>> >> >> > > > ;
Обучение выглядит следующим образом:

Std:: cout << "net initialization..." << std:: endl ; net_type net; //The code below uses mini-batch stochastic gradient descent with an initial learning rate of 0.01 to accomplish this. std:: cout << "trainer initialization..." << std:: endl ; dlib:: dnn_trainer < net_type> trainer(net) ; //dnn_trainer trainer(net, adam(0.0005, 0.9, 0.999), {0, 0, 0, 0}); trainer.set_learning_rate (0.01 ) ; //1e-3 trainer.set_min_learning_rate (MIN_LEARNING_RATE) ; trainer.set_mini_batch_size (MINI_BATCH_SIZE) ; trainer.be_verbose () ; trainer.set_synchronization_file ("lenet_faces_sync" , std:: chrono :: seconds (180 ) ) ; //Обучение std:: vector < dlib:: matrix < unsigned char >> mini_batch_samples; std:: vector < unsigned long > mini_batch_labels; dlib:: rand rnd(time (0 ) ) ; std:: cout << "traning..." << std:: endl ; while (trainer.get_learning_rate () >= MIN_LEARNING_RATE) { dataset.GetInputSamplePairBatch (mini_batch_samples, mini_batch_labels, MINI_BATCH_SIZE) ; win1.set_image (mini_batch_samples[ 0 ] ) ; win2.set_image (mini_batch_samples[ 1 ] ) ; trainer.train_one_step (mini_batch_samples, mini_batch_labels) ; } // When you call train_one_step(), the trainer will do its processing in a // separate thread. However, this also means we need to wait for any mini-batches that are // still executing. Calling get_net() performs the necessary synchronization. trainer.get_net () ; std<< std:: endl ; net.clean () ; //Очищаем сеть от вспомогательной информации dlib:: serialize ("lenet_faces.dat" ) << net; //И сохраняем ее. Для загрузки deserialize("lenet_faces.dat") >> net;

После окончания обучения сетка используется как дескриптор. На отдельной тестовой выборке обучается и тестируется линейный классификатор в пространстве векторов, полученных из откликов второго полносвязного слоя нейросети на пару изображений. В тестовой выборке порядка 1500 изображений для 15 разных персон. Обучение классификатора осуществляется на 5 изображениях на одну персону. Тестирование - на всех.
//Обучение классификатора std:: cout << "Traning classifier..." << std:: endl ; TSVMClassifier classifier({ cv:: ml :: SVM :: POLY ,2 ,2 } ) ; static const long NL = 5 ; long i = 0 ; std:: vector < long > isum (dataset.ClassNumber () ) ; cv:: Mat descr(1 , descriptor_size, CV_32FC1) , train_data(dataset.ClassNumber () * NL, descriptor_size, CV_32FC1) , train_classes(dataset.ClassNumber () * NL, 1 , CV_32SC1) , test_data(dataset.Size () , descriptor_size, CV_32FC1) , test_classes(dataset.Size () , 1 , CV_32SC1) , predicted_classes(dataset.Size () , 1 , CV_32FC1) , averaged = cv:: imread ("../AveragedMan.jpg" , CV_LOAD_IMAGE_GRAYSCALE) ; dlib:: matrix < unsigned char > averaged_dlib(DATASET_IMAGE_SIZE.height , DATASET_IMAGE_SIZE.width ) , sample_dlib; //Подготовка усредненного лица TFaceDetector FaceDetector("shape_predictor_68_face_landmarks.dat" ) ; std:: vector < dlib:: rectangle > face_rects = FaceDetector.Detect (averaged) ; dlib:: array < dlib:: matrix < unsigned char > > faces; FaceDetector.ExtractFaces (averaged, face_rects, faces) ; if (faces.size () == 1 ) resize_image(faces[ 0 ] , averaged_dlib) ; dlib:: image_window win; //Обучаем на 5 объектах каждого класса, а тестируем на всех for (unsigned long idx = 0 ; idx < dataset.Size () ; idx++ ) { try { sample_dlib = dataset.GetSample (idx) ; win.set_image (sample_dlib) ; std:: cout << dataset.GetLabelIdx (idx) << " " << dataset.GetLabelByIdx (dataset.GetLabelIdx (idx) ) << std:: endl ; } catch (exception & e) { TException * E = dynamic_cast < TException * > (& e) ; if (E) std:: cout << E- > what() << std:: endl ; else std:: cout << e.what () << std:: endl ; continue ; } ; net(dataset.MakeInputSamplePair (& averaged_dlib, & sample_dlib) ) ; for (unsigned long iv = 0 ; iv < dlib:: layer < 2 > (net) .get_output () .size () ; iv++ ) descr.at < float > (iv) = dlib:: layer < 2 > (net) .get_output () .host () [ iv] ; descr.copyTo (test_data.row (idx) ) ; test_classes.at < long > (idx) = (long ) dataset.GetLabelIdx (idx) ; if (isum[ test_classes.at < long > (idx) ] < NL) { //train_data.push_back(descr); //train_classes.push_back(test_classes.at(idx)); descr.copyTo (train_data.row (i) ) ; train_classes.at < long > (i) = test_classes.at < long > (idx) ; isum[ test_classes.at < long > (idx) ] ++ ; i++ ; } } std:: cout << train_data.cols << " " << train_data.rows << " " << train_classes.cols << " " << train_classes.rows << std:: endl ; classifier.Train (train_data, train_classes) ; classifier.Save ("classifier.txt" ) ; //Тестирование линейного классификатора std:: cout << "Testing linear classifier..." << std:: endl ; classifier.Predict (test_data, predicted_classes) ; unsigned long num_right = 0 , num_wrong = 0 ; for (unsigned long idx = 0 ; idx < dataset.Size () ; idx++ ) if (test_classes.at < long > (idx) == (long ) predicted_classes.at < float > (idx) ) num_right++ ; else num_wrong++ ; std:: cout << "training num_right: " << num_right << std:: endl ; std:: cout << "training num_wrong: " << num_wrong << std:: endl ; std:: cout << "training accuracy: " << num_right/ (double ) (num_right+ num_wrong) << std:: endl ; std:: cin >> c;

Сам процесс обучения выглядит вот так:


Видно, что загрузка видеокарты, как и процессора минимальна. Возможно ли ускорить вычисления используя имеющиеся ресурсы более полно? Обрабатывалось порядка 10 пар в секунду. Узким местом стало даже не чтение с диска, как я предполагал а детектирование лиц. Был вариант заранее пройтись детектором по всем изображениям и сохранить результат на диск, и дальше уже работать с ним. Но этот вариант мне не понравился тем, что на диске придется хранить две здоровенные базы, так как детектор я могу в будущем поменятьи вынужден хранить "сырые" необработанные изображения. Есть еще вариант кэширования. Вся выборка разбиватеся на блоки, умещающиеся в оперативной памяти. Выбираем случайным образом блок и обучаемся на случайных его подмножествах изображений до тех пор, пока каждое изображение не будет использовано n раз. Затем переключаемся на следующий блок. Таким образом можно уменьшить количество чтений с диска в n раз.

Распараллелил детектирование лиц используя пул потоков из той же библиотеки dlib, получил выигрыш по времени в 5-6 раз.
struct TR { TDataset * Dataset; bool Positive; dlib:: matrix < unsigned char > SamplePair; unsigned long Label; } ; ... if (UseMultiThreading) { std:: vector < TR> trv; std:: vector < dlib:: future < TR>> fv(batch_size) ; for (unsigned long i = 0 ; i < batch_size; i++ ) { trv.push_back (TR() = { this , positive} ) ; fv[ i] = trv[ i] ; //Можно, конечно же обойтись и без всяких лямбд ThreadPool- > add_task_by_value( (TR & val) { val.Dataset - > GetInputSamplePair(val.Positive , val.SamplePair , val.Label ) ; } , fv[ i] ) ; positive = ! positive; } ; //Каждому потоку нужен свой экземпляр детектора, потому что может быть разного размера и тд. ThreadPool- > wait_for_all_tasks() ; for (unsigned long i = 0 ; i < batch_size; i++ ) { batch_sample_pairs.push_back (fv[ i] .get () .SamplePair ) ; batch_labels.push_back (fv[ i] .get () .Label ) ; //batch_sample_pairs.push_back(tfv[i].SamplePair); //batch_labels.push_back(tfv[i].Label); } ; } else { for (unsigned long i = 0 ; i < batch_size; i++ ) { GetInputSamplePair(positive, sample_pair, label) ; batch_sample_pairs.push_back (sample_pair) ; batch_labels.push_back (label) ; positive = ! positive; //Чередуем положительные и отрицательные примеры } ; }

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

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

P.S. Ненавижу Livejournal за ограничение размера статей. Частично поэтому запускаю свой сайт delirium.su , где планирую, помимо прочего, вести полную версию блога.

Решетневские чтения. 2017

РЕШЕНИЕ ЗАДАЧ РАСПОЗНАВАНИЯ ЛИЦ И МИМИКИ С ПОМОЩЬЮ СВЕРТОЧНЫХ НЕЙРОННЫХ СЕТЕЙ

Д. В. Плотников*, Е. А. Сопов

Сибирский государственный университет науки и технологий имени академика М. Ф. Решетнева Российская Федерация, 660037, г. Красноярск, просп. им. газ. «Красноярский рабочий», 31

Е-шаП: [email protected]

Проведено экспериментальное исследование эффективности работы сверточных нейронных сетей при решении задач распознавания лица и мимики человека.

Ключевые слова: сверточная нейронная сеть, распознавание лиц, распознавание мимики.

SOLVING THE FACE AND FACIAL EXPRESSION REGOGNITION TASKS USING CONVOLUTIONAL NEURAL NETWORKS

D. V. Plotnikov*, E. A. Sopov

Reshetnev Siberian State University of Science and Technology 31, Krasnoyarsky Rabochy Av., Krasnoyarsk, 660037, Russian Federation Е-mail: [email protected]

This paper performs experimental research of convolutional neural networks performance operated with face and facial recognition tasks.

Keywords: convolutional neural network, face recognition, facial expression recognition.

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

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

В качестве тестовых задач были выбраны следующие: «The ORL Database of Faces» и «The Facial Expression Recognition 2013».

База данных «The ORL Database of Faces». Первой тестовой задачей послужила проблема распознавания лиц. База данных представляет собой 400 фотографий сорока разных людей (рис. 1). Все фото представлены в градации серого. Формирование тестовой выборки происходит следующим образом: необходимо случайным образом выбрать по одной фотографии каждого человека. Разрабатываемый алгоритм должен на основе 360 обучающих фотоснимков классифицировать остальные 40, т. е. определить людей, изображенных на них.

База данных «The Facial Expression Recognition 2013». Второй тестовой задачей послужила проблема распознавания эмоций. БД представляет собой набор изображений людей с разными выражениями лиц. Человек на изображении может быть: сердитый, испытывающий отвращение, испытывающий страх, счастливый, грустный, удивленный или спокойный.

Рис. 1. Примеры фотографий, взятые из БД «The ORL Database of Faces»

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

Рис. 2. Примеры фотографий, взятых из БД «The Facial Expression Recognition 2013»

Структура сверточной нейронной сети для работы с «The ORL Database of Faces»

Номер слоя Слой Параметры

Количество ядер Размер ядер Функция активации

1 Сверточный слой 1 20 5x5 Гиперболический тангенс

3 Сверточный слой 2 50 5x5 Гиперболический тангенс

Размер свертки Функция свертки

2 Субдискретизирующий слой 1 2x2 Функция максимума

4 Субдискретизирующий слой 2 2x2 Функция максимума

Количество нейронов Функция активации

5 Полносвязный слой 1 500 Гиперболический тангенс

6 Полносвязный слой 2 40 Гиперболический тангенс

Структура 1 Структура 2

Рис. 3. Динамика эффективности обучения CNN (Структура 1 и Структура 2)

Выборка состоит из 28709 обучающих и 7178 тестовых примеров. Каждое изображение имеет разрешение 48x48 пикселей.

Результаты экспериментов. База данных «The ORL Database of Faces». С принципом устройства работы CNN можно ознакомиться в .

В ходе работы также были использованы и другие структуры для работы с базой данных «The ORL Database of Faces». Однако они оказались неэффективны. С одной стороны, более сложные и ресурсоемкие для вычислений конфигурации не показывали лучший результат. А более простые структуры - не могли быть обучены вообще. Таким образом, наилучшим образом обученная структура достигает эффективности классификации 97,5 %.

База данных «The Facial Expression Recognition 2013». Поскольку размерность данной задачи сравнительно велика, принято решение уменьшить размерность (до 28x28). В данном случае на вход нейронной сети будет подано изображение меньшей размерности. Практика показала, что время обучения CNN при входных изображениях 48x48 пикселя в 4 раза дольше, чем при входных изображениях 28x28 пикселя. Более того, динамика обучения сети остается почти неизменной.

Следующий этап - проверка гипотезы о том, что значения гиперпараметров CNN влияют на скорость

обучения. Для решения задачи использовались две структуры: Структура 1 - идентична той, что была использована для работы с БД «The ORL Database of Faces».

Структура 2 - это Структура 1 с увеличенными значениями гиперпараметров (теперь количество ядер первого сверточного слоя = 50, второго сверточного слоя = 125) (рис. 3).

На рис. 3: ось абсцисс - итерации обучения сети, ось ординат - точность обучения. Видно, что на 125 итерации Структура 1 достигает своего уровня стагнации, в то время как Структура 2 продолжает увеличивать точность распознования.

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

Данное направление и будет являться объектом дальнейших исследований.

PewemHeecKye umeHUH. 2017

1. Face recognition: a convolutional neural-network approach / S. Lawrence, C. L. Giles, Ah Chung Tsoi, and A. D. Back // IEEE Trans. Neural Networks. 1997. Vol. 8, № 1. P. 98-113.

2. Krizhevsky A., Sutskever I., Hinton G. E. ImageNet Classification with Deep Convolutional Neural Networks, Adv. Neural Inf. Process. Syst. 2012. P. 1-9.

3. LeCun Y., Boser B., Denker J. S. et al. Backpropa-gation Applied to Handwritten Zip Code Recognition. Neural Comput. 1989. № 1 (4). P. 541-551.

4. Lin M., Chen Q., Yan S. Network In Network. arXiv Prepr. 2013:10.

5. Sopov E., Ivanov I. Design efficient technologies for context image analysis in dialog HCI using self-configuring novelty search genetic algorithm. Informatics Control Autom Robot (ICINCO), 2014. 11th Int Conf. 2014. № 2. P. 832-839.

© nn0THHK0B fl. B., ConoB E. A., 2017

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

Современные техники распознавания лиц достигли впечатляющих результатов при работе с изображениями лиц среднего и большого размера, однако эффективность работы с малыми изображениями неудовлетворительна . Главная трудность в распознавании лиц малого размера (к примеру, размером 10х10 пикселей) состоит в недостатке деталей лица, отличающих его от заднего плана. Другая проблема заключается в том, что современные методы распознавания лиц строятся на основе свёрточных нейросетей и используют для представления лица свёрточные карты особенностей с малой частотой дискретизации и большим шагом (8, 16, 32), которые теряют информацию и слишком неточны для описания изображений небольшого размера.

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

В генераторе используется нейросеть SRN (super-resolution network) , чтобы повысить разрешение. В отличие от повышения разрешения с помощью билинейной операции, SRN не добавляет артефакты в создаваемые изображения и улучшает их качество за счёт больших факторов масштабирования. Неcмотря на это, при использовании SRN и других продвинутых нейросетей, исследователи получали сильно размытые изображения без мелких деталей. Это следствие очень малого разрешения входных изображений.

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

Архитектура нейросети

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

Архитектура генератора и дискриминатора

Генератор

Улучшающая нейросеть генератора имеет архитектуру свёрточной нейросети. После каждого свёрточного слоя, за исключением последнего, производилась нормализация (batch normalization) и активация ReLU.

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

Дискриминатор

В качестве основной нейросети в дискриминаторе используется нейросеть VGG19 , из которой удалён слой субдискретизации для исключения различных операций уменьшения разрешения. Более того, все полностью соединённые слои (т.е. f c6, f c7, f c8) заменены на два параллельных полностью соединённых слоя fcGAN и fcclc . На вход подаётся изображение увеличенного разрешения. Ветвь fcGAN выдаёт вероятность того, что входное изображение - реальное, а ветвь fcclc выдаёт вероятность того, что на входном изображении присутствует лицо.

Функция потерь

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

где ILR и IHR обозначают небольшие размытые фрагменты (low resolution) и изображения с высоким разрешением (high resolution) соответственно, G1 - SNR нейросеть, G2 - улучшающая нейросеть, w  - параметры Генератора.

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

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

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

Классификационные потери используются по двум причинам. Во-первых, они позволяют Дискриминатору определить, присутствуют ли на реальном и созданном изображениях лица или нет. И во-вторых, они стимулируют Генератор создавать более детальные изображения.

Целевая функция: состязательные и классификационные потери входят в попиксельные среднеквадратичные потери. Генеративно-состязательная нейросеть может быть обучена с помощью целевой функции. Для лучшего поведения градиента функции потерь Генератора G и дискриминатора D были изменены следующим образом:


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

Исследователи ВШЭ предложили новый метод распознавания людей на видео с помощью глубокой нейронной сети. Подход не требует большого числа фотографий, он позволяет значительно повысить точность распознавания по сравнению с ранее известными аналогами, даже если доступна всего одна фронтальная фотография человека. Результаты работы опубликованы в статьях «Fuzzy Analysis and Deep Convolution Neural Networks in Still-to-video Recognition » и «Unconstrained Face Identification Using Maximum Likelihood of Distances Between Deep Off-the-shelf Features ».

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

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

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

«Сеть может со 100% точностью распознать, например, известного актера (число изображений которого в сети исчисляются миллионами). Но это совсем не значит, что при переносе знаний, накопленных в нейронной сети, она адаптируется и распознает человека, для которого в качестве образца доступна только одна фотография», - поясняет профессор кафедры информационных систем и технологий НИУ ВШЭ в Нижнем Новгороде Андрей Савченко.

Для того, чтобы решить эту задачу, исследователи ВШЭ использовали теорию нечетких множеств и теорию вероятности. Они разработали алгоритм, который позволяет существенно повысить точность (на 2-6% по сравнению с ранее проведенными экспериментами) идентификации лиц по видео в режиме реального времени при наличии ограниченного числа изображений. Это решение работает с нейросетевыми архитектурами VGGFace, VGGFace2, ResFace и LightCNN.

В качестве тестовой базы исследователи использовали несколько традиционных наборов данных для оценки методов распознавания лиц на видео – IJB-A (IARPA Janus Benchmark A) и YTF (YouTube Faces). Эти наборы включали находящиеся в свободном доступе изображения известных людей (актеры, политики, общественные деятели), которые собирались из открытых источников в неконтролируемых условиях в разное время. Алгоритм должен был распознать лица на видео с YouTube, используя в качестве образцов несколько фотографий тех же людей из другого набора данных – LFW (Labeled Faces in the Wild). В LFW использовалось более высокое разрешение, а сами фотографии были сделаны в разное время, начиная с 1970-х до 2010-х годов.

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

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

Сейчас этот алгоритм уже реализован для стационарных компьютеров на Python, что позволяет в фотоальбомах находить и группировать лица разных людей, оценивать год рождения, пол и другие параметры. Разработан прототип приложения для Android, которое определяет возраст и пол людей на фотографиях и видео. Анализ фото-галереи дает возможность автоматически оценить степень социальной активности пользователя, выделить его близких друзей и родственников. Для современных смартфонов прототип приложения обрабатывает 15 кадров в секунду. Исследователи утверждают, что благодаря разработанному алгоритму распознание лиц может происходить точнее.

Публикации по теме