Подозрительные лица
Еще десять лет назад системы распознавания лиц были в основном уделом научной фантастики и применялись довольно редко. Сегодня они везде — на улицах мегаполисов и даже в смартфонах. Вместе с российским разработчиком систем распознавания лиц NtechLab, технологическим партнером «Ростеха», рассказываем, как работает технология, стремительно вошедшая в нашу жизнь, и как решать возникающие из-за нее этические вопросы.
Для начала стоит разобраться с тем, что такое распознавание лиц. На самом вопрос нужно поставить иначе: «Почему мы воспринимаем лица людей настолько разными, если у всех нас (почти) есть два глаза, нос и рот?» Все дело в том, что формы этих частей лица, а также их взаимное расположение сильно различаются от человека к человеку. Кроме того, отличаются форма самой головы, форма щек и других черт. Важно и то, что их параметры не так сильно коррелируют между собой, как, к примеру, длина рук и ног, а также рост. Именно поэтому мы можем узнавать знакомые лица даже издалека.
А раз параметры лиц вполне конкретны и их можно описать аналитически, то и машины можно научить различать людей между собой. Первые эксперименты в этой области начались на заре компьютерной эры. Относительно быстро стали появляться первые результаты, которые показали, что это возможно. Однако почти сразу стало понятно, что от первого прототипа до надежно работающей в реальных условиях системы распознавания лиц предстоит большой путь.
Проблема в том, что перед камерой системы распознавания находятся живые люди, которые отходят дальше или ближе, поворачивают голову, улыбаются. А еще один и тот же человек может поменять прическу, накраситься или сделать пирсинг. То есть помимо индивидуальных для каждого человека параметров лица есть огромное количество вариантов того, как человек выглядит в конкретный момент. Постепенно развитие алгоритмов и наращивание мощности компьютеров позволило обогнать по точности работы людей. Благодаря этому системы распознавания начали внедряться повсеместно.
Зачем все это нужно?
Системы распознавания лиц применяются для двух типов задач: аутентификации (проверки личности) и распознавания в потоке. Хотя как таковой границы между ними может и не быть. Первый тип связан с непосредственным взаимодействием человека с системой, после которого система допускает или не допускает его до какого-либо действия. Примеров много: разблокировка по лицу в гаджетах, тестовые системы автоматизированного контроля границы в аэропортах или пропуск в закрытые помещения.
Самый простой пример — это FaceID на iPhone и аналоги на других смартфонах. С инженерной точки зрения FaceID — почти выдающаяся система, однако с точки зрения распознавания лиц ее задача достаточно проста, потому что при взаимодействии с ней пользователи находятся почти вплотную перед датчиками, смотрят вперед, а еще освещаются встроенным инфракрасным проектором.
Распознавание людей без явного взаимодействия гораздо труднее, потому что тут нет идеальных условий, как при аутентификации. Самый частый пример подобной задачи — распознавание разыскиваемых людей в общественных местах. Такая сеть наблюдения из десятков тысяч камер работает на улицах Москвы и в общественном транспорте. Причем она синхронизирована с базой уголовного розыска и уже позволила задержать несколько сотен человек из нее.
Сложность такого распознавания заключается в ограниченности данных. Взять камеру в метро — ей необходимо в режиме реального времени распознавать лица под углом, как правило, частично закрытые шапками или волосами. Причем на каждое лицо может приходиться область всего в десятки пикселей шириной, а освещение может быть слабым.
Как это работает
Распознавание лиц работает на основе разных датчиков и технологий. Чаще всего для этого используются обычные или инфракрасные камеры. Сначала кадры с камеры пропускаются через алгоритм детектирования лица. Если в кадре есть лицо, область с ним отдается алгоритму для распознавания лиц. При классическом подходе на лице размечаются несколько десятков ключевых точек, расположенных в фиксированных участках лица, например, несколько точек по краю глаза.
Сравнивая взаимное расположение точек с базой, система определяет наиболее близкого человека. И если совпадение достаточно близкое, проводит между лицами из базы и перед камерой соответствие.
В последние годы для распознавания лиц используются нейросетевые алгоритмы. Они обучаются на огромном количестве фотографий людей и учатся определять важные для распознавания признаки на лицах. После получения фотографии обученная нейросетевая модель выдает вектор (или цифровой индекс). Он сравнивается с лицами из базы, которым также присвоен такой индекс.
Может показаться, что такую систему легко обмануть, показав фотографию человека. На самом деле в современных системах распознавания лиц также применяются алгоритмы определения живости лица. Есть несколько основных методов определения, что перед камерой стоит живой человек. Часто в одной системе используется сразу несколько. Например, базовые методы анализа оптического потока и определения плоской поверхности, отслеживание мимических движений, в том числе изменения направления взгляда и моргания. Правда, для определения мимики или моргания необходимо проанализировать не один снимок, а, как минимум, несколько, что замедляет процесс распознавания.
Помимо обычных двумерных камер для распознавания лиц используют и более «экзотические» системы. Многие из них можно увидеть в смартфонах: Samsung пару лет экспериментировала с датчиком для сканирования уникального узора радужки, а Apple и Google применяют в своих смартфонах более сложную систему трехмерного сканирования.
Эта система состоит из инфракрасной камеры и двух инфракрасных излучателей. Один из них просто равномерно освещает лицо, а второй проецирует на него узор из точек или полосок. Это позволяет восстанавливать рельеф поверхности лица. Значит, простой распечаткой для обмана такой системы уже не обойтись. При этом применить такую технологию для поиска преступников на улицах не получится. Для этого в базе данных розыска должны храниться не простые их «фотороботы», а полноценные 3D-сканы каждого лица.
Звучит хорошо, а как на деле?
Мы решили рассмотреть работу такой системы на конкретном российском примере — системе распознавания лиц FindFace от компании NtechLab. Ее успешно опробовали на Чемпионате мира по футболу в России в 2018 году. Эта же система работает на входах в офисы некоторых компаний. Она же ищет подозреваемых на улицах Москвы и в общественном транспорте. Кроме того, ее можно применять для анализа реакций людей на товары и услуги или для входа в банковские приложения по лицу. Иными словами, она имеет разные применения, но «под капотом» используется одни и те же алгоритмы.
В FindFace применяется стандартная для этой задачи и проверенная схема конвейера из алгоритмов. Изначально система получает кадр. На нем может быть один человек крупным планом, стоящий перед входом в офис, а может быть толпа людей в метро или даже вовсе не быть человека. Для того, чтобы не работать со всеми кадрами и не тратить вычислительные мощности зря, первым делом кадры анализирует алгоритм детектирования лица. Он ищет на изображении лица и вырезает области с ними.
Если в кадре обнаружено лицо или несколько, области с ними передаются на предварительную обработку, во время которой другой алгоритм старается привести области к нормальному виду со стандартной яркостью, углом поворота и другими параметрами.
И только после этой «рутины» лица отдаются основной сети для распознавания. Конкретные данные о ее устройстве разработчики не раскрывают, поскольку она является ключевой частью любой системы распознавания лиц. В общих чертах принцип работы нейросети для распознавания заключается в том, что после обучения на множестве лиц она способна замечать как базовые признаки, например, расстояние между глазами, так и более абстрактные признаки, которые тем не менее позволяют достаточно точно описать конкретное лицо.
На выходе нейросеть выдает вектор признаков, который затем сравнивается с векторами из базы. Если в базе удается найти похожий до определенной степени вектор, система выдает соответствие. При этом вместе с соответствием администратор видит «сырые» данные, в том числе индекс уверенности, а также индекс живости.
Точность FindFace на текущий момент находится на уровне нескольких лучших алгоритмов в мире по распознаванию лиц в неконтролируемых условиях, например, на городских улицах. Это подтверждается многими конкурсами, в том числе проводимыми NIST. Алгоритм делает ложноположительные ошибки, то есть некорректно узнает человека из базы в человеке перед камерой, в среднем раз в 15 миллионов случаев.
Помимо базовых составляющих у FindFace также есть дополнительные возможности, например, способность распознавать эмоции, что можно применять для выявления агрессивных людей или других целей. Сейчас разработчики NtechLab работают над алгоритмом, способным узнавать человека не только по лицу, но и по всему силуэту. Даже если лица не видно.
Мы решили не полагаться на данные разработчиков и пошли в офис NtechLab, чтобы лично попробовать обмануть систему распознавания лиц компании. Она установлена прямо на входе в офис и заменяет сотрудникам пропуск. Возле двери располагаются две камеры и небольшой монитор, на который выводится процесс распознавания и результат. А если система узнала человека, она приветствует его по имени, причем на разных языках.
В NtechLab мы поехали вдвоем. Одного из нас система знала и принимала за сотрудника, а второй был для нее неизвестным гостем. Разработчики дали нам полную свободу действий, хотя применять силу к двери все же было нельзя.
Основным нарушителем был наш выпускающий редактор Николай Воронцов, который был для системы «своим», поэтому большая часть тестов была направлена на ложноотрицательные срабатывания. Так принято называть реакцию системы, при которой она не узнает человека, который есть в базе. А в конце мы попытались проверить ее на самый опасный случай — ложноположительные срабатывания, при которых алгоритмы узнают знакомого человека в злоумышленнике.
Наша основная цель заключалась в том, чтобы тем или иным способом помешать системе увидеть ключевые области на лице, поэтому мы опробовали разные типы «маскировки». Часть из них — это дополнительные элементы одежды или внешности: три пары необычных очков, парик и косметическая маска.
Другой тип обмана — это попытка запутать систему необычными визуальными элементами на лице. На один из них нас вдохновил эксперимент Григория Бакунова из Яндекса, который со своей командой в 2017 году достаточно успешно обманул системы распознавания с помощью асимметричного макияжа. В оригинале за этот макияж отвечал алгоритм, который анализировал фотографию человека и добавлял полосы, круги и другие фигуры, чтобы добиться максимальной непохожести для алгоритмов распознавания лиц.
У нас такого алгоритма не было, поэтому сначала мы просто налепили в случайном порядке несколько полос из темной и серебристой изоленты. Затем мы усложнили задачу и ввели, по-видимому, основной компонент такого макияжа — линии, которые пересекают глаза и другие ключевые части лица, в стиле Дэвида Боуи. Кроме того, во время одного из подходов к камере мы с той же целью запутать систему закрасили половину лица темной краской.
Для проверки ложноположительных срабатываний мы воспользовались распечатками лиц на листах A4. Часть из них брали в исходном виде, на части обрезали контуры лица и плеч, а в одной из попыток наклеили круглую распечатку фотографии лица на лицо другого человека и вырезали глаза. Задумка заключалась в том, что движения тела и глаз компенсируют нереалистичность распечатки и позволят обойти алгоритм проверки живости.
Часть тестов система прошла без проблем: в случаях с париком и очками, асимметричным макияжем по образу того, что использовала команда Бакунова, и светящимися очками она сразу пропускала Николая.
С асимметричным макияжем в стиле Боуи и накинутым капюшоном FindFace тоже узнала его, но спустя несколько секунд, а не сразу. Действительно сработала только черная косметическая маска с прорезями для глаз, носа и рта. Когда половина лица была закрашена, а поверх были надеты асимметричные очки, дверь тоже не открылась. Однако по логам мы увидели, что основной алгоритм узнал человека, но алгоритм определения живости подумал, что его пытаются обмануть распечаткой или другим способом, и не пустил «злоумышленника» в офис.
Когда мы попытались «примерить» лицо сотрудников на другого человека, в основном алгоритмы справлялись и понимали, что их пытаются обмануть. Но распечатка на лице с прорезями для глаз оказалась критичной: она несколько раз почти сразу открывала дверь. Дело в том, что в офисе компании установлена не последняя версия программы, которая анализирует отдельные изображения с камеры, не сопоставляя соседние кадры между собой. По логам было видно, что почти со всеми изображениями FindFace справилась и подавала сигнал об обмане, но некоторые кадры не удалось отличить от реального человека.
Мы также проверили на этот баг мобильную версию, которая отсылает на сервер небольшой фрагмент видео. В таком случае обмануть нейросети не удалось никаким образом. Эта версия позиционируется разработчиками как решение для безопасной аутентификации в банковских приложениях.
Правовые вопросы технологии распознавания лиц
Государственное применение системы распознавания лиц в России
- Сентябрь 2017 года. Три тысячи камер наблюдения на московских улицах подключили к системе распознавания лиц.
- Апрель 2018 года. Системы распознавания лиц начали тестировать в московском метро.
- Май 2018 года. Появились первые промежуточные итоги тестирования: система в метро позволила поймать 40 человек.
- Январь 2019 года. В аэропорту «Шереметьево» начали тестировать автоматизированный паспортный контроль на основе системы распознавания лиц и отпечатков пальцев.
- Апрель 2019 года. Камеры для распознавания лиц начали устанавливать на турникетах в метро.
- Май 2019 года. Московские полицейские начали тестировать носимые камеры с алгоритмом распознавания лиц.
- Сентябрь 2019 года. Московские власти заказали систему распознавания лиц для контроля массовых общественно-политических мероприятий. Общественные активисты подалииск к московским властям с требованием признать незаконным применение системы распознавания лиц в городской сети камер наблюдения.
- Ноябрь 2019 года. Суд отказал в признании применения системы незаконной.
- Январь 2020 года.Подан второй иск к московским властям из-за использования системы распознавания лиц, на этот раз из-за ее применения на митинге.
Законодательство в сфере распознавания лиц в настоящее время формируется, поэтому многие вопросы, по-прежнему, в серой зоне. Например, Китай считает, что у государства есть право собирать данные о гражданах в любом объеме. Например, в Синьцзян-Уйгурском автономном районе Китая, по данным ООН, системы распознавания лиц используются для контроля за этническими уйгурами.
Часть американских штатов, например, Калифорния, уже приняли мораторий на распознавание лиц. В Европе обсуждается введение аналогичного (правда, временного) моратория на подобные технологии.
Григорий Копиев
Как искусственный интеллект меняет агропромышленный комплекс
Беспилотные комбайны убирают с полей пшеницу, спутники передают фермерам данные о готовности урожая, а дроны выискивают сорняков и вредителей. Цифровые технологии выполняют самые разные задачи, а объединяет их искусственный интеллект, без которого модернизация была бы невозможна. Рассказываем, чем ИИ занимается на пастбищах и фермах и какое будущее ждет российский агропромышленный комплекс.
Спутниковые снимки подтвердили способность песцов создавать оазисы в тундре
Вокруг нор этих хищников растения выше и гуще
Палеопатологи впервые описали травмы посаженного на кол человека
Скелет принадлежал казненному в 1800 году убийце французского генерала
Укажите, как вас лишили жизни — и узнайте, в чем вы провинились
В Парионе раскопали гробницу с останками 33 человек и 14 монетами для Харона
I веке до нашей эры — III веке нашей эры
Физики нашли в замещенном апатите свинца комнатную сверхпроводимость при атмосферном давлении
Пока эти результаты вызывают сомнения
Социолог нашел подтверждение теории бредовых работ
Обладатели некоторых профессий с большей вероятностью будут чувствовать бесполезность своей работы
Люди недооценили вес ладоней
Они нам кажутся почти в два раза легче своего реально веса
Астрономы обнаружили первое свидетельство существования троянских экзопланет
Наблюдения велись за молодой звездой PDS 70
В Германии обнаружили вход в пещеру палеолитических охотников-собирателей
В древности ее посещали люди мадленской культуры
Климатологи предупредили о высоком риске коллапса Атлантической меридиональной опрокидывающей циркуляции
Машинное обучение это весело! Часть 4: Распознавание лиц с помощью глубокого обучения
Вы заметили, что Facebook вдруг получил суперспособность распознавать ваших друзей на фото? В былые времена в Facebook можно было отмечать своих друзей на фотографии, но для этого надо было нажать на фото и ввести имя друга. Теперь, стоит вам только загрузить фотографию, Facebookсловно по волшебству проставит все нужные теги:
Эта технология называется распознаванием лиц. Стоит вам несколько раз отметить своих друзей на фото, и Facebook научится распознавать их лица. Это довольно удивительная технология — Facebook может распознавать лица с точностью 98% — почти так же точно, как человек!
Давайте разберемся, как работают современные технологии распознавания лиц! Но простым узнаванием лиц друзей тут не ограничится — это слишком просто. Мы можем довести эту технологию до совершенства и решить более сложную задачу — отличить Уилла Феррелла(известного актера) от Чада Смита (знаменитого рок-музыканта)!
Как использовать машинное обучение в сложных задачах
В частях 1, 2 и 3 мы использовали машинное обучение для решения изолированных задач в одно действие — оценка стоимости дома, создание новых данных на основании существующих или определение того, есть ли на изображении какой-либо объект. Для решения этих задач достаточно выбрать какой-нибудь алгоритм машинного обучения, ввести данные — и вот он результат.
Однако распознавание лиц состоит из множества взаимосвязанных подзадач:
- Во-первых, нужно посмотреть на картинку и найти на ней все лица
- Во-вторых, нужно научиться распознавать каждое лицо, даже если оно странным образом повернуто, или если освещение плохое — ведь это все равно все тот же человек.
- В-третьих, нужно уметь определять уникальные черты лица, которые отличают одного человека от других, например, размер глаз, форма лица и так далее.
- Наконец, нужно сравнить выявленные уникальные особенности этого лица со всеми людьми, которых система уже знает, чтобы понять, кто изображен на фото.
Мозг человека делает всё мгновенно и незаметно для нас. Можно сказать, что люди настолькохороши в распознавании лиц, что видят лица даже в повседневных объектах:
Компьютеры не способны к таким обобщениям высокого уровня (по крайней мере, пока …), поэтому нам придется учить их этому шаг за шагом.
Нужно построить своего рода конвейер, на котором мы выполняем каждый шаг распознавания по-отдельности, а затем передаем результат текущего шага следующему. Иными словами, мы последовательно соединим несколько алгоритмов машинного обучения:
Распознавание лиц — шаг за шагом
Давайте займемся задачей по порядку, а точнее, пошагово. На каждом этапе мы разберемся с алгоритмом машинного обучения (для каждого этапа он будет разный). Я не буду разъяснять каждый алгоритм полностью, чтобы статья не превратилась в книгу. Вместо этого я изложу основные идеи, лежащие в основе каждого из них, а также вы узнаете, как создать свою собственную систему распознавания лиц на Python, используя OpenFace и dlib.
Шаг 1. Поиск всех лиц
На первом этапе нашего конвейера нужно обнаружить лица. Ясное дело, нам нужно найти лица на фотографии, прежде чем делать что-то еще.
Если вы в последние лет 10 пользовались какой-нибудь камерой, вы, вероятно, видели распознавание лиц в действии:
Распознавание лиц — это отличная функция для камер. Если камера может автоматически выделять лица, она может убедиться, что все лица были в фокусе, прежде чем делать снимок. Но мы будем использовать этот алгоритм для другой цели — нам нужно выделить области на изображении, которые мы передадим следующему шагу нашего конвейера.
Обнаружение лиц стало мейнстримом в начале 2000-х годов, когда Пол Виола (Paul Viola) и Майкл Джонс (Michael Jones) изобрели способ обнаружения лиц, который был достаточно быстрым, чтобы работать на дешевых камерах. Однако сегодня существуют более надежные решения. Мы собираемся использовать метод, изобретенный в 2005 году — гистограмма направленных градиентов (Histogram of Oriented Gradients) — или просто HOG, для краткости.
Чтобы найти лица на изображении, сперва сделаем наше изображение черно-белым, потому что для поиска лиц цветовые данные не нужны:
Затем мы рассмотрим каждый пиксель на нашем изображении, один за другим. Но интересует нас не столько сам пиксель, сколько пиксели, окружающие его:
Наша цель — выяснить, насколько темным является текущий пиксель по сравнению с соседними. Затем мы рисуем стрелку, показывающую, в каком направлении изображение становится темнее:
Выполнив эту процедуру для каждого отдельного пикселя изображения, вы замените каждый пиксель стрелкой. Эти стрелки называются градиентами, и они показывают направление от светлых пикселей к темным по всему изображению:
Может показаться, что этот метод выбран случайно, но на самом деле есть резонная причина заменять пиксели градиентами. Если мы проанализируем пиксели напрямую, то увидим, что темные изображения и светлые изображения одного и того же человека будут иметь совершенно разные значения яркости пикселей. Но, рассматривая только направление изменения яркости, мы получим одинаковую картину независимо от яркости исходного изображения. Это значительно упрощает задачу!
Однако, сохранение градиента для каждого пикселя — это слишком много информации, и мы можем не увидеть леса за деревьями. Было бы лучше, если бы мы могли увидеть основное направление изменения света на более высоком уровне, получая таким образом общую канву изображения.
Для этого мы разделим изображение на маленькие квадраты размером 16×16 пикселей каждый. В каждом квадрате мы подсчитаем, сколько точек градиента повернуто в каждом из основных направлений (вверх, вверх, вправо, вправо и т. д.). Затем мы заменим этот квадрат на изображении стрелочками, направленными туда же, куда и большинство.
В конечном итоге мы преобразуем исходное изображение так, что ясно проглядывается базовая структура лица:
Чтобы найти лицо на HOG-изображении, все, что нам нужно сделать, — это найти часть нашего изображения, которая наиболее похожа на известный рисунок HOG, полученный из множества других лиц в ходе обучения:
Используя этот метод, мы легко можем найти лица на любом изображении:
Если вы хотите попробовать сделать это самостоятельно, используя Python и dlib, то код, показывающий, как создавать и просматривать представления HOG-изображений, можно найти здесь.
Шаг 2. Расположение лиц
Так, лица найти удалось. Но теперь мы должны разобраться с проблемой, когда лица, повернутые в разные стороны, кажутся компьютеру разными лицами:
Для решения проблемы мы попытаемся преобразовать каждое изображение так, чтобы глаза и губы всегда находились в каком-то конкретном месте. Это упростит задачу сравнения лиц на следующих этапах.
Для этого мы будем использовать алгоритм под названием оценка ориентиров лица (face landmark estimation). Есть много способов сделать это, но мы будем использовать метод, изобретенный в 2014 году Вахидом Каземи (Vahid Kazemi) и Жозефиной Салливан (Josephine Sullivan).
Основная идея состоит в том, что мы отметим 68 особых точек (называемых ориентирами), которые существуют на каждом лице — верхняя часть подбородка, внешняя точка каждого глаза, внутренняя точка каждой брови и т. д. Затем мы обучим алгоритм машинного обучения находить эти 68 особых точек на любом лице:
Вот результат размещения 68 ориентиров на нашем тестовом изображении:
Теперь, когда мы знаем, где глаза и где рот, мы можем вращать, масштабировать и сдвигатьизображение так, чтобы глаза и рот были как можно лучше центрированы. При этом мы не будем делать никаких фантастических трехмерных искажений, так как это портит изображение. Мы будем использовать только базовые преобразования изображений, такие как поворот и масштабирование, которые сохраняют параллельные линии (аффинные преобразования):
Теперь, независимо от того, как повернуто лицо, мы можем центрировать глаза и рот примерно в одно и то же положение на изображении. Это позволит сделать следующий этап более точным.
Если вы хотите попробовать сделать это самостоятельно, используя Python и dlib, то по ссылкам вы найдете код для поиска ориентиров на лице и код для преобразования изображения с использованием этих ориентиров.
Шаг 3. Кодирование лица
Теперь мы подходим к сути проблемы — как отличить одно лицо от другого. И здесь все становится действительно интересно!
Самый простой подход к распознаванию лица заключается в непосредственном сравнении неизвестного лица, которое мы обнаружили на шаге 2, со всеми изображениями людей, которые уже были отмечены ранее. Если мы находим ранее отмеченное лицо, которое очень похоже на распознаваемое лицо, то это наверняка один и тот же человек — разве не гениальная идея?
На самом деле нет. У этого подхода есть большая проблема. Такой сайт, как Facebook, на котором сидят миллиарды пользователей и триллионы фотографий, не может сравнивать все отмеченные ранее лица с каждым новым загруженным изображением — это займет слишком много времени, в то время как лица должны распознаваться за миллисекунды, а не за часы.
Значит нам нужен способ снять несколько основных измерений с каждого лица, которые мы могли бы сравнить с самыми близкими известными измерениями и найти самое похожее лицо. Например, мы можем измерить размер каждого уха, расстояние между глазами, длину носа и т. д. Если вы когда-либо смотрели криминальные телешоу, например, CSI, вы знаете, о чем я говорю:
Самый надежный способ измерить лицо
Итак, какие измерения лиц нужны нам для пополнения известной базы данных? Размер ушей? Длина носа? Цвет глаз? Что-то другое?
Оказывается, что измерения, которые кажутся людям очевидными (например, цвет глаз), на самом деле не имеют смысла для компьютера, рассматривающего отдельные пиксели изображения. Исследователи показали, что самый точный подход — это позволить компьютеру самому измерить то, что ему нужно. Глубокое обучение, определяет, какие части лица нужно измерять, лучше, чем люди.
Решение заключается в создании сверточной нейронной сети глубокого обучения (как и в части 3). Но вместо того, чтобы обучать сеть распознавать объекты на изображении, как мы делали в прошлый раз, мы научим ее создавать 128 измерений для каждого лица.
Во время обучения сети анализируется одновременно три лица:
- Обучающее изображение лица известного человека
- Другая фотография того же известного человека
- Изображение совершенно другого человека
Затем алгоритм просматривает измерения, которые он делает для каждого из этих трех изображений. Затем он немного настраивает нейронную сеть, чтобы удостовериться, что измерения, созданные для изображений #1 и #2, будут более похожи, а измерения для #2 и #3 — менее похожи:
Повторив этот этап миллионы раз для миллионов изображений тысяч разных людей, нейронная сеть учится надежно создавать 128 измерений для каждого человека. Любые десять разных изображений одного и того же человека должны давать примерно одинаковые измерения.
Полученные 128 измерений каждого лица называют картой. Идея преобразования массива необработанных данных, например, изображения, в список генерируемых компьютером чисел крайне важна для машинного обучения (особенно для автоматизированного перевода). Тот подход к лицам, который мы используем, был изобретен в 2015 году исследователями Google, но существует также много аналогичных подходов.
Кодирование изображения лица
Этот процесс обучения сверточной нейронной сети для получения карты лиц требует большого количества данных и мощного компьютера. Даже при использовании дорогой видеокарты NVidia Telsa требуется 24 часа непрерывного обучения, чтобы получить хорошую точность.
Но как только сеть будет обучена, она сможет генерировать измерения для любого лица, даже такого, которое видит впервые! Поэтому это нужно сделать всего один раз. К счастью для нас, ребята из OpenFace уже сделали это и опубликовали несколько обученных сетей, которые мы можем использовать. Спасибо, Брэндону Амосу (Brandon Amos) и его команде!
Таким образом, нам остается только пропустить изображения лиц через готовую обученную сеть, чтобы получить 128 измерений для каждого лица. Ниже приведены результаты измерений для нашего тестового изображения:
А каким частям лица соответствуют эти 128 чисел? А мы и понятия не имеем. Но для нас это не имеет большого значения. Нас интересует только то, что сеть генерирует почти одинаковые числа по двум изображениям одного и того же человека.
Если вы хотите попробовать сделать этот шаг самостоятельно, OpenFace предоставляет lua скрипт, который генерирует карты всех изображений в папке и записывать их в файл csv. Вот как его запустить.
Шаг 4: Поиск имени пользователя по кодировке
Последний этап, оказывается, самый простой во всем процессе. Все, что нам нужно сделать, это найти человека в нашей базе данных известных людей, измерения которого ближе всего к полученным нами.
Вы можете сделать это, используя любой базовый алгоритм классификации машинного обучения. И не нужны никакие модные штучки. Мы будем использовать простой линейный классификатор SVM (метод опорных векторов), но подойдут и другие алгоритмы классификации.
Все, что нам нужно сделать, — это обучить классификатор, который будет брать измерения из проверяемого изображения, и скажет нам, какой известный нам человек больше всего похож на него. Запуск классификатора занимает миллисекунды, а на выходе — имя человека!
Итак, давайте опробуем нашу систему. Сперва я натренировал классификатор, используя около 20 фотографий Уилла Феррелла, Чада Смита и Джимми Фалона (Jimmy Falon):
Как работает распознавание лиц
У вас в телефоне наверняка уже есть технология распознавания лиц. Ещё она есть в городских камерах наблюдения, на заводах и военных объектах, в лабораториях и даже в автомобилях. Посмотрим, как они устроены.
Из чего состоит распознавание лиц
Чтобы машина узнала лицо с помощью камеры, нужны такие компоненты:
- Оптическая камера или лидар, чтобы получить изображение или объёмную карту лица.
- База данных с заранее проанализированными лицами.
- Алгоритм, который находит в кадре лицо.
- Алгоритм приведения лица к какому-то набору векторов.
- Алгоритм сравнения векторов с эталонами.
Теперь посмотрим детали.
Получаем изображение с камеры
Это самая простая часть, которая может даже не зависеть от алгоритма распознавания лиц. Задача компьютера — взять видеопоток с камеры, в реальном времени нарезать его на несколько кадров и эти кадры отправить в алгоритм.
Некоторые алгоритмы используют плоское изображение с камеры. Другие используют лидары — это когда лазерная пушка быстро-быстро стреляет лазером во все стороны и измеряет скорость возвращения лучей. Получается не слишком точная, но в некоторой степени объёмная картинка. Часто её совмещают с изображением основной камеры, чтобы убедиться, что перед нами действительно человек, а не его фотография.
Иногда алгоритм настроен так, чтобы получать только подвижные изображения с меняющейся мимикой — чтобы не сканировали спящих людей или маски.
Некоторые алгоритмы вычисляют трёхмерную модель на основании поворота головы. Прямо говорят: посмотрите налево, посмотрите направо, приблизьтесь, отдалитесь. Так они пытаются построить более точную объёмную модель лица. Всё это — для безопасности.
Пример работы LIDAR-сканера на Айфоне. Это не система распознавания лиц, просто для понимания степени точности скана
Находим лицо в кадре
Перед тем как алгоритм приступит к распознаванию, ему нужно найти лицо на картинке. Для этого он использует метод Виолы — Джонса и специальные чёрно-белые прямоугольники (примитивы Хаара), которые выглядят примерно так:
С помощью этих прямоугольников алгоритм пытается найти на картинке похожие переходы между светлыми и тёмными областями. Если в одном месте программа находит много таких совпадений, то, скорее всего, это лицо человека. Например, вот как с помощью этих примитивов алгоритм находит нос и глаза:
Все примитивы специально подобраны так, чтобы с их помощью можно было найти границы лица и отсечь всё остальное. Поэтому, как только алгоритм находит место скопления таких совпадений, он для проверки сравнивает там остальные прямоугольники:
Если их набирается достаточное количество — это точно лицо. Обычно алгоритмы поиска лиц для контроля обводят рамкой найденную область — она помогает разработчикам понять, всё ли в порядке с логикой программы:
Когда есть алгоритм и достаточно быстрый процессор, находить лица — дело техники. Такие алгоритмы известны, их много, они работают даже на маломощных Raspberry Pi
Строим модель по ключевым точкам
После того как алгоритм нашёл лицо, он строит его цифровую модель. Для этого он:
- Расставляет точки в ключевых местах: нос, рот, глаза, брови и так далее.
- Считает расстояние между точками.
- По этим расстояниям строит цифровую карту или вектор. Про векторы поговорим ниже.
Ключевые точки, которые расставил алгоритм
От того, как будут расставлены эти точки, зависит точность распознавания, поэтому каждая коммерческая компания держит свой метод в секрете. Чем больше точек — тем выше точность, но минимально нужно проставить 68 точек. Если точек будет меньше, алгоритм может не сработать.
Считаем вектор и сравниваем с базой
Когда все точки найдены, алгоритм считает вектор — математический результат обработки свойств этих точек. Например, он находит расстояние между глазами, форму носа, толщину губ, форму бровей, расстояния между ними и ещё массу других параметров. В результате получается набор чисел, который называется вектором.
Если алгоритм работает в режиме «выучить новое лицо», то он записывает полученный вектор в базу данных с каким-то именем или идентификатором. Условно говоря, в базе это выглядит так:
«Вот здоровенный вектор из 900 чисел — я назову его Мишей»
Распознанные точки на лице и векторы, которые будет считать алгоритм
Другой режим работы алгоритма — сопоставление с эталоном. В базе данных уже есть один или несколько векторов, а задача алгоритма — сравнить их с новым вектором, который посчитали только что по картинке с камеры. Тогда алгоритм считает, насколько новый вектор отличается от тех, которые уже лежат в базе данных. Если этот вектор отличается достаточно мало, считаем, что мы распознали лицо.
На картинке видно, что синий неизвестный вектор, который мы хотим распознать, ближе всех находится к Мише. Если расстояние между векторами будет достаточно маленьким, алгоритм скажет, что человек в кадре — это Миша.
У каждого алгоритма свои коэффициенты совпадения: где-то допустимо совпадение только на 98% и выше — тогда алгоритм не будет вас узнавать, если вы в маске или вокруг плохое освещение. Есть алгоритмы, где совпадение может быть меньше — тогда это менее безопасно, но лучше работает. Есть алгоритмы, которые в одном месте требуют точного совпадения, а в других — менее точного (например, глаза должны совпасть точно, а рот может двигаться). Это уже нюансы настройки и подкрутки конкретного алгоритма.
Уточнение векторов и самообучение
Есть алгоритмы, которые уточняются и узнают вас всё лучше со временем. При каждом распознавании лица они видят, что в вас изменилось с прошлого раза, и уточняют свою модель. Например, вы занесли себя в базу данных с бодуна, а на следующий день пришли огурцом. Алгоритм запомнил вас в обоих состояниях.
Что дальше
Теперь, когда мы знаем, как работает эта технология, попробуем повторить это сами — сделаем систему распознавания лиц на Python.
Подбор камер для распознавания лиц
Для расчета под другие условия, можно использовать эту формулу:
Hpx ≈ 1875 * L * tg(α/2)
Где: α — горизонтальный угол обзора камеры
L — расстояние от камеры до зоны распознавания лиц в метрах
Hpx — необходимое минимальное количество пикселей по горизонтали на изображении камеры
На живом видео могут быть не заметны многие дефекты изображения, поэтому о ценку качества следует производить непосредственно по стоп-кадрам, что удобно делать по архивным записям.
3. Рекомендации по выбору ракурса и освещения
-
Область съемки, в которой производится распознавание лиц, должна быть хорошо освещена. Наличие теней на лице или пересвета значительно снизит вероятность распознавания этого человека.
Для качественной работы модуля камеру следует устанавливать в местах с централизованной и структурированной зоной прохода, например, входная дверь в здание. Широкие холлы с хаотичным движением людей — плохое место установки камеры.
Не стоит пытаться перекрыть широкую зону одной камерой. В этом случае рекомендуется установка нескольких камер.