Распознавание лиц с использованием OpenCV

Авторы: Shervin EMAMI, Valentin Petrut
Источник: Facial Recognition using OpenCV | Emami | Journal of Mobile, Embedded and Distributed Systems.
Ключевые слова: лицо, определение, распознавание, система, OpenCV, Eigenface

1. Аннотация

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

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

2. Введение

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

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

Цели этого тезиса состоят в том, чтобы предоставить набор алгоритмов обнаружения, которые впоследствии можно будет упаковать в легко переносимую среду среди различных процессорных архитектур, которые мы видим сегодня на машинах (компьютерах). Эти алгоритмы должны обеспечивать успешное распознавание не менее 95%, из которых менее 3% обнаруженных лиц являются ложными срабатываниями.

3. Определение проблемы

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

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

Распознавание лица обычно включает две стадии:

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

С 2002 года обнаружение лиц может выполняться довольно легко и надежно с помощью библиотеки Intel с открытым исходным кодом под названием OpenCV [1]. Эта структура имеет встроенный детектор лица, который работает примерно на 90-95% четких фотографий человека, смотрящего в камеру. Однако обнаружить лицо человека, когда его рассматривают под углом, обычно сложнее, иногда требуется 3D-оценка позы головы. Кроме того, отсутствие надлежащей яркости изображения может значительно увеличить сложность определения лица, или повысить контрастность теней на лице, или, возможно, изображение размыто, или человек носит очки и т. д.

Однако распознавание лиц намного менее надежно, чем распознавание лиц, с точностью в целом 30-70%. Распознавание лиц было большой областью исследований с 1990-х годов, но все еще далеко от надежного метода аутентификации пользователей. Все больше и больше методов разрабатываются с каждым годом. Техника Eigenface считается самым простым методом точного распознавания лиц, но многие другие (гораздо более сложные) методы или комбинации нескольких методов немного более точны.

OpenCV был запущен в Intel в 1999 году Гэри Брэдски с целью ускорения исследований и коммерческих применений компьютерного зрения в мире и для Intel, создавая потребность в таких приложениях для еще более мощных компьютеров. Вадим Писаревский присоединился к Гари, чтобы управлять российской командой разработчиков программного обеспечения OpenCV. Со временем команда OpenCV перешла к другим компаниям и другим исследованиям. Некоторые из оригинальной команды в конечном счете нашли свое призвание в робототехнике и нашли свой путь к Willow Garage. В 2008 году Willow Garage увидел необходимость в быстром развитии возможностей восприятия роботов открытым способом, который использует все исследовательское и коммерческое сообщество, и начал активно поддерживать OpenCV, а Гэри и Вадим снова возглавили работу [2].

Библиотека компьютерного зрения с открытым исходным кодом Intel может значительно упростить программирование компьютерного зрения. Она включает в себя расширенные возможности - распознавание лиц, отслеживание лиц, распознавание лиц, фильтрацию Калмана и различные методы искусственного интеллекта (ИИ) - в готовом виде. Кроме того, она предоставляет множество базовых алгоритмов компьютерного зрения через свои низкоуровневые API.

Преимущество OpenCV состоит в том, что он является мультиплатформенным фреймворком; он поддерживает как Windows, так и Linux, а в последнее время и Mac OS X.

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

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

  • Пространство имен CXCORE содержит базовые определения типов данных, методы линейной алгебры и статистики, функции постоянства и обработчики ошибок. Несколько странно, что здесь также расположены графические функции для рисования на изображениях.
  • Пространство имен CV содержит методы обработки изображений и калибровки камеры. Функции вычислительной геометрии также находятся здесь.
  • Пространство имен CVAUX описано в документации OpenCV как содержащее устаревший и экспериментальный код. Однако самые простые интерфейсы для распознавания лиц находятся в этом модуле. Код, стоящий за ними, специализируется на распознавании лиц, и они широко используются для этой цели.
  • Пространство имен ML содержит интерфейсы машинного обучения.
  • Пространство имен HighGUI содержит базовые интерфейсы ввода/вывода и возможности мультиплатформенного управления окнами.
  • Пространство имен CVCAM содержит интерфейсы для доступа к видео через DirectX на 32-битных платформах Windows.

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

Большинство ресурсов по распознаванию лиц предназначено для базовых нейронных сетей, которые обычно работают не так хорошо, как Eigenfaces. И, к сожалению, есть только некоторые базовые объяснения лучшего типа распознавания лиц, чем Eigenfaces, такие как распознавание по видео и другим методам на домашней странице распознавания лиц [4] или на странице Википедии по 3D распознаванию лиц [5] и странице моделей активного внешнего вида [6]. Но для других методов, вы должны прочитать некоторые недавние исследовательские работы по компьютерному зрению из CVPR и других конференций по компьютерному зрению. Большинство конференций по компьютерному зрению или машинному зрению включают новые достижения в распознавании лиц и распознавании лиц, которые дают немного лучшую точность. Например, вы можете посмотреть конференции CVPR10 и CVPR09 [7].

4. Предлагаемое решение

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

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

Для простоты система распознавания лиц, представленная в этой статье, представляет собой Eigenfaces, использующие изображения в градациях серого. В документе показано, как легко можно преобразовать цветные изображения в оттенки серого (также называемые «оттенками серого»), а затем применить выравнивание гистограммы [8] в качестве очень простого метода автоматической стандартизации яркости и контрастности ваших изображений лица. Для получения лучших результатов вы можете использовать распознавание лиц по цвету (в идеале с подбором цветовой гистограммы в HSV или другом цветовом пространстве вместо RGB) или применять больше этапов обработки, таких как улучшение контуров, обнаружение контуров, обнаружение движения и т. д. Кроме того, этот код изменяет размер изображения до стандартного размера, но это может изменить соотношение сторон лица. В [9] описан способ изменения размера изображения с сохранением его пропорций.

В OpenCV используется тип детектора лиц, называемый классификатором Haar Cascade.

По заданному изображению, которое может быть получено из файла или из видео в реальном времени, детектор лиц проверяет каждое местоположение изображения и классифицирует его как «Лицо» или «Не Лицо». Классификация предполагает фиксированный масштаб для лица, скажем, 50x50 пикселей. Поскольку лица на изображении могут быть меньше или больше, чем это, классификатор запускается по изображению несколько раз, чтобы искать лица в диапазоне масштабов. Это может показаться огромным количеством обработки, но благодаря алгоритмическим приемам, объясненным на боковой панели, классификация очень быстрая, даже если она применяется в нескольких масштабах. Классификатор использует данные, хранящиеся в файле XML, чтобы решить, как классифицировать каждое местоположение изображения. Загрузка OpenCV включает четыре варианта XML-данных для фронтального распознавания лиц и один для профильных лиц. Он также включает три XML-файла без лица: один для обнаружения всего тела (пешеходов), один для верхней части тела и один для нижней части тела.

Вам нужно будет указать классификатору, где найти файл данных, который вы хотите использовать. Тот, который я буду использовать, называется haarcascade_frontalface_default.xml. В версии 1.0 OpenCV он находится по адресу [OPENCV_ROOT] /data/haarcascades/haarcascade_frontalface_default.xml, где [OPENCV_ROOT] - это путь к вашей установке OpenCV. Например, если вы работаете в Windows XP и выбрали место установки по умолчанию, вы должны использовать [OPENCV_ROOT] = "C: / Program Files / OpenCV" (если вы работаете с более старой 16-битной версией Windows, вы бы использовали «\» в качестве разделителя каталогов вместо «/».)

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

Захват кадров с веб-камеры может быть легко реализован с помощью этой функции:

			// Grab the next camera frame. Waits until the next frame is ready, and
			// provides direct access to it, so do NOT modify or free the returned image!
			// Will automatically initialize the camera on the first frame.
			IplImage* getCameraFrame(CvCapture* &camera)
			{
			IplImage *frame;
			int w, h;
			// If the camera hasn't been initialized, then open it.
			if (!camera) {
			printf("Acessing the camera ...\n");
			camera = cvCreateCameraCapture( 0 );
			if (!camera) {
			printf("Couldn't access the camera.\n");
			exit(1);
			}
			// Try to set the camera resolution to 320 x 240.
			cvSetCaptureProperty(camera,
			CV_CAP_PROP_FRAME_WIDTH, 320);
			cvSetCaptureProperty(camera,
			CV_CAP_PROP_FRAME_HEIGHT, 240);
			// Get the first frame, to make sure the camera is initialized.
			frame = cvQueryFrame( camera );
			if (frame) {
			w = frame->width;
			h = frame->height;
			printf("Got the camera at %dx%d resolution.\n", w, h);
			}
			// Wait a little, so that the camera can auto-adjust its brightness.
			Sleep(1000); // (in milliseconds)
			}
			// Wait until the next camera frame is ready, then grab it.
			frame = cvQueryFrame( camera );
			if (!frame) {
			printf("Couldn't grab a camera frame.\n");
			exit(1);
			}
			}
			return frame;
			}

Эту функцию можно использовать так:

			CvCapture* camera = 0;
			// The camera device.
			// Quit on "Escape" key.
			while ( cvWaitKey(10) != 27 ) {
			IplImage *frame = getCameraFrame(camera);
			//…
			}
			// Free the camera.
			cvReleaseCapture( &camera );

5. Выводы

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

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

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

Важно иметь множество вариантов условий для каждого человека, чтобы классификатор мог распознавать человека в различных условиях освещения и положениях, а не искать конкретные условия. Но также важно убедиться, что набор изображений для человека не слишком различен, например, если вы повернули некоторые изображения на 90 градусов. Это сделало бы классификатор слишком общим и также дало бы очень плохие результаты, поэтому, если вы думаете, что у вас будет набор изображений со слишком большой дисперсией (например, поворот более чем на 20 градусов), то вы можете создать отдельные наборы обучающих изображений для каждого человека.Например, вы можете обучить классификатор распознавать «John_Facing_Forward», а другой - «John_Facing_Left» и другие «Mary_Facing_Forward», «Mary_Facing_Left» и т. д. Тогда у каждого классификатора может быть много отклонений, но не слишком много, и вам просто нужно связать различные классификаторы для каждого человека с этим одним человеком (то есть: «Джон» или «Мэри»).

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

И что важно понять, так это то, что в основе алгоритма лежит сопоставление изображений, в основном эквивалентное вычитанию тестового изображения из обучающего изображения, чтобы увидеть, насколько они похожи. Это было бы неплохо, если бы человек это выполнил, но компьютер просто мыслит в терминах пикселей и чисел. Так что, если вы представите, что он смотрит на один пиксель в тестовом изображении и вычитает значение серой шкалы этого пикселя из значения пикселя в ТОЧНОМ одном и том же месте каждого тренировочного изображения, и чем меньше разница, тем лучше совпадение. Так что, если вы просто переместите изображение на несколько пикселей в поперечнике или используете изображение, которое на несколько пикселей больше или имеет на несколько пикселей больше изображения лба, чем другое изображение, и т. д., то он будет думать, что это совершенно разные изображения! Это также верно, если фон отличается, потому что код не знает разницы между фоном и передним планом (лицо), поэтому важно обрезать как можно больше фона, вплоть до того момента, когда на изображении останется только лицо.

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

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

Вот почему распознавание лиц относительно легко сделать в режиме реального времени, если вы тренируетесь на ком-то, а затем сразу же пытаетесь распознать его, используя ту же камеру, тот же фон, выражение лица будет почти одинаковым, освещение будет одинаковым, направление съемки будет одинаковым. Таким образом, вы часто получите хорошие результаты распознавания в этот момент. Но как только вы попытаетесь распознать их из другого направления, из другой комнаты, снаружи или в другое время дня, это часто даст плохие результаты! Поэтому важно провести много экспериментов, если вы хотите получить лучшие результаты, и если вы все еще не можете получить хорошие результаты после многих испытаний, возможно, вам понадобится более сложный алгоритм распознавания лиц, чем PCA (Eigenfaces), такой как 3D-распознавание лиц или активные модели внешнего вида, упомянутые ниже.

6. Список литературы

  1. Face Detection and Recognition using OpenCV, Article, http://shervinemami.info/faceRecognition.html, Published by Shervin Emami, 2010
  2. Seeing with OpenCV, Article, http://www.cognotics.com/opencv/servo_2007_series/part_1/index.html, Published by Robin Hewitt, 2010
  3. OpenCV Homepage, http://opencv.willowgarage.com
  4. Face Recognition Homepage, http://www.face-rec.org/algorithms/
  5. Wikipedia, Three-dimensional face recognition, http://en.wikipedia.org/wiki/Threedimensional_face_recognition
  6. Wikipedia, Active appearance model, http://en.wikipedia.org/wiki/Active_appearance_model
  7. Computer Vision Papers, http://www.cvpapers.com/
  8. Wikipedia, Histogram equalization, http://en.wikipedia.org/wiki/Histogram_equalization
  9. Shervin Emami, Rotating or Resizing an Image in OpenCV, http://shervinemami.info/imageTransforms.html