- •Об авторе
- •О научных редакторах
- •Благодарности
- •От издательства
- •Введение
- •Для кого эта книга?
- •Почему Python?
- •План книги
- •Версия Python, платформа и IDE
- •Установка Python
- •Запуск Python
- •Использование виртуальной среды
- •Вперед!
- •Глава 1. Спасение моряков с помощью теоремы Байеса
- •Теорема Байеса
- •Проект #1. Поиск и спасение
- •Стратегия
- •Установка библиотек Python
- •Код для теоремы Байеса
- •Время сыграть
- •Итоги
- •Дополнительная литература
- •Усложняем проект. Более грамотный поиск
- •Усложняем проект. Поиск лучшей стратегии с помощью MCS
- •Усложняем проект. Вычисление вероятности обнаружения
- •Глава 2. Установление авторства с помощью стилометрии
- •Проект #2: «Собака Баскервилей», «Война миров» и «Затерянный мир»
- •Стратегия
- •Установка NLTK
- •Корпусы текстов
- •Код стилометрии
- •Итоги
- •Дополнительная литература
- •Практический проект: охота на собаку Баскервилей с помощью распределения
- •Практический проект: тепловая карта пунктуации
- •Усложняем проект: фиксирование частотности
- •Глава 3. Суммаризация текста с помощью обработки естественного языка
- •Стратегия
- •Веб-скрапинг
- •Код для «У меня есть мечта»
- •Установка gensim
- •Код для суммаризации речи «Заправляйте свою кровать»
- •Проект #5. Суммаризация речи с помощью облака слов
- •Модули Word Cloud и PIL
- •Код для создания облака слов
- •Итоги
- •Дополнительная литература
- •Усложняем проект: ночные игры
- •Усложняем проект: суммаризация суммаризаций
- •Глава 4. Отправка суперсекретных сообщений с помощью книжного шифра
- •Одноразовый блокнот
- •Шифр «Ребекка»
- •Проект #6. Цифровой ключ к «Ребекке»
- •Стратегия
- •Код для шифрования
- •Отправка сообщений
- •Итоги
- •Дополнительная литература
- •Глава 5. Поиск Плутона
- •Проект #7. Воссоздание блинк-компаратора
- •Стратегия
- •Данные
- •Код блинк-компаратора
- •Использование блинк-компаратора
- •Проект #8. Обнаружение астрономических транзиентов путем дифференцирования изображений
- •Стратегия
- •Код для детектора транзиентов
- •Использование детектора транзиентов
- •Итоги
- •Дополнительная литература
- •Практический проект: представление орбитальной траектории
- •Практический проект: найди отличия
- •Усложняем проект: сосчитаем звезды
- •Глава 6. Победа в лунной гонке с помощью «Аполлона-8»
- •Цель миссии «Аполлон-8»
- •Траектория свободного возврата
- •Задача трех тел
- •Проект #9. На Луну с «Аполлоном-8»!
- •Использование модуля turtle
- •Стратегия
- •Код программы для расчета свободного возврата «Аполлона-8»
- •Выполнение симуляции
- •Итоги
- •Дополнительная литература
- •Практический проект: симуляция шаблона поисков
- •Практический проект: запусти меня!
- •Практический проект: останови меня!
- •Усложняем проект: симуляция в истинном масштабе
- •Усложняем проект: реальный «Аполлон-8»
- •Глава 7. Выбор мест высадки на Марсе
- •Посадка на Марс
- •Карта MOLA
- •Проект #10. Выбор посадочных мест на Марсе
- •Стратегия
- •Код для выбора мест посадки
- •Результаты
- •Итоги
- •Дополнительная литература
- •Практический проект: убедимся, что рисунки становятся частью изображения
- •Практический проект: визуализация профиля высот
- •Практический проект: отображение в 3D
- •Практический проект: совмещение карт
- •Усложняем проект: три в одном
- •Усложняем проект: перенос прямоугольников
- •Глава 8. Обнаружение далеких экзопланет
- •Транзитная фотометрия
- •Проект #11. Симуляция транзита экзопланеты
- •Стратегия
- •Код для транзита
- •Эксперименты с транзитной фотометрией
- •Проект #12. Получение изображений экзопланет
- •Стратегия
- •Код для пикселизатора
- •Итоги
- •Дополнительная литература
- •Практический проект: обнаружение инопланетных мегаструктур
- •Практический проект: обнаружение транзита астероидов
- •Практический проект: добавление эффекта потемнения к краю
- •Практический проект: обнаружение пятен на звездах
- •Практический проект: обнаружение инопланетной армады
- •Практический проект: обнаружение планеты с луной
- •Практический проект: измерение продолжительности экзопланетного дня
- •Усложняем проект: генерация динамической кривой блеска
- •Глава 9. Как различить своих и чужих
- •Обнаружение лиц на фотографиях
- •Проект #13. Программирование робота-часового
- •Стратегия
- •Результаты
- •Обнаружение лиц в видеопотоке
- •Итоги
- •Дополнительная литература
- •Практический проект: размытие лиц
- •Усложняем проект: обнаружение кошачьих мордочек
- •Глава 10. Ограничение доступа по принципу распознавания лиц
- •Распознавание лиц с помощью LBPH
- •Схема распознавания лиц
- •Извлечение гистограмм локальных бинарных шаблонов
- •Проект #14. Ограничение доступа к инопланетному артефакту
- •Стратегия
- •Поддержка модулей и файлов
- •Код для захвата видео
- •Код для обучения алгоритма распознавания лиц
- •Код для прогнозирования лиц
- •Результаты
- •Итоги
- •Дополнительная литература
- •Усложняем проект: добавление пароля и видеозахвата
- •Усложняем проект: похожие лица и близнецы
- •Усложняем проект: машина времени
- •Глава 11. Создание интерактивной карты побега от зомби
- •Проект #15. Визуализация плотности населения с помощью хороплетной карты
- •Стратегия
- •Библиотека анализа данных
- •Библиотеки bokeh и holoviews
- •Установка pandas, bokeh и holoviews
- •Работа с данными по уровню безработицы и плотности населения в округах и штатах
- •Разбираем код holoviews
- •Код для отрисовки хороплетной карты
- •Планирование маршрута
- •Итоги
- •Дополнительная литература
- •Усложняем проект: отображение на карте изменения численности населения США
- •Глава 12. Находимся ли мы в компьютерной симуляции?
- •Проект #16. Жизнь, Вселенная и пруд черепахи Йертл
- •Код симуляции пруда
- •Следствия симуляции пруда
- •Измерение затрат на пересечение строк или столбцов сетки
- •Результаты
- •Стратегия
- •Итоги
- •Дополнительная литература
- •Дополнение
- •Усложняем проект: поиск безопасного места в космосе
- •Усложняем проект: а вот и Солнце
- •Усложняем проект: взгляд глазами собаки
- •Усложняем проект: кастомизированный поиск слов
- •Усложняем проект: что за сложную паутину мы плетем
- •Усложняем проект: идем вещать с горы
- •Решения для практических проектов
- •Глава 2. Определение авторства с помощью стилометрии
- •Охота на собаку Баскервилей с помощью распределения
- •Тепловая карта пунктуации
- •Глава 4. Отправка суперсекретных сообщений с помощью книжного шифра
- •Составление графика символов
- •Отправка секретов шифром времен Второй мировой войны
- •Глава 5. Поиск Плутона
- •Представление орбитальной траектории
- •Глава 6. Победа в лунной гонке с помощью «Аполлона-8»
- •Симуляция шаблона поисков
- •Заведи меня!
- •Останови меня!
- •Глава 7. Выбор мест высадки на Марсе
- •Убеждаемся, что рисунки становятся частью изображения
- •Визуализация профиля высоты
- •Отображение в 3D
- •Совмещение карт
- •Глава 8. Обнаружение далеких экзопланет
- •Обнаружение инопланетных мегаструктур
- •Обнаружение транзита астероидов
- •Добавление эффекта потемнения к краю
- •Обнаружение инопланетной армады
- •Обнаружение планеты с луной
- •Измерение продолжительности экзопланетного дня
- •Глава 9. Как различить своих и чужих
- •Размытие лиц
- •Глава 10. Ограничение доступа по принципу распознавания лиц
- •Усложняем проект: добавление пароля и видеозахвата
10
Ограничение доступа по принципу распознавания лиц
В предыдущей главе вы попробовали себя в качестве
техника в составе пехоты Звездных сил коалиции.
Здесь ваша роль останется прежней, а вот задача
будет уже посложнее. Теперь надо не просто обнару-
живать лица, а распознавать их. Ваш командующий,
капитан Демминг, обнаружил лабораторию с межпространственным порталом, рождающим монстров, и хочет,
чтобы доступ туда был только у него.
Как и в предыдущей главе, следует действовать быстро, поэтому доверимся Python и OpenCV. В частности, мы воспользуемся алгоритмом построения гистограммы на основе локальных бинарных шаблонов (LBPH). Это один из самых старых и простых в применении алгоритмов распознавания лиц, с его помощью мы и заблокируем доступ в лабораторию. Если вы еще не установили OpenCV, то обратитесь к разделу «Установка библиотек Python» на с. 31.
Распознавание лиц с помощью LBPH
При распознавании лиц алгоритм LBPH использует векторы признаков. Как говорилось в главе 5, вектор признаков, по сути, представляет список чисел в определенном порядке. В случае LBPH эти числа отражают некоторые характеристики лица. Для распознавания лиц требуется небольшое число измерений,
Распознавание лиц с помощью LBPH 291
например расстояние между глаз, ширина рта, длина носа и ширина лица. Эти четыре параметра, данные по порядку в сантиметрах, могут сформировать такой вектор признаков (5.1, 7.4, 5.3, 11.8). Представление лиц в базе данных с помощью этих векторов ускоряет поиск, а также позволяет выражать отличие между векторами в численной величине, или расстоянии.
Конечно же, компьютерное распознавание лиц требует наличия более четырех признаков. При этом разные алгоритмы работают с разными признаками. Сейчас доступны Eigenfaces, LBPH, Fisherfaces, масштабно-инвариантная трансформация признаков (SIFT, scale-invariant feature transform), устойчивые ускоренные признаки (SURF, speeded up robust features) и различные подходы с применением искусственных нейронных сетей. Когда изображения лиц делаются в контролируемых условиях, эти алгоритмы работают с высокой точностью, практически как люди.
К подобным контролируемым условиям при получении изображений лиц могут относиться фронтальный вид каждого лица с нормальным расслабленным выражением и для возможности использования всеми алгоритмами единообразное освещение и разрешение. Лицо не должно быть закрыто волосами, а глаза — очками, если алгоритм обучался распознавать лица именно в таких условиях.
Схема распознавания лиц
Прежде чем перейти к подробностям алгоритма LBPH, рассмотрим общий принцип распознавания лиц. Он состоит из трех основных этапов: захвата, обу чения и прогнозирования.
На этапе захвата мы собираем изображения, которые будем использовать для обучения распознавателя лиц (рис. 10.1). Для каждого лица, которое нужно распознавать, требуется не менее десятка изображений с разными выражениями.
Следующий этап захвата — обнаружить лицо на изображении, обвести его прямоугольником, вырезать содержимое прямоугольника, изменить размер вырезанных изображений до одинаковых (размер определяется алгоритмом) и преобразовать их в оттенки серого. Как правило, алгоритмы отслеживают лица при помощи целых чисел, поэтому каждому субъекту потребуется уникальный ID. После обработки изображения сохраняются в одном каталоге, который мы назовем базой данных.
Следующий этап — обучение алгоритма распознавания лиц (рис. 10.2). Алгоритм — в нашем случае LBPH — анализирует каждое из обучающих изображений и записывает результаты в файл YAML (.yml). YAML — это язык сериализации данных в удобочитаемый формат, который изначально расшифровывался как «Yet Another Markup Language» («Еще один язык разметки»), но теперь означает
292 Глава 10. Ограничение доступа по принципу распознавания лиц
«YAML Ain’t Markup Language» («YAML не является языком разметки»). Таким образом подчеркивается, что он больше чем просто инструмент разметки документов.
За а
ID = 1
Б
ID = 1 Ба аа
В - а а
ID = 2
Л
ID = 2
Рис. 10.1. Захват изображений лица для обучения распознавателя лиц
О
|
ID = 1 |
|
Ба а |
Ра а а |
trainer.yml |
а |
|
|
ID = 2
Рис. 10.2. Обучение алгоритма распознавания и запись результатов в файл
Завершающий этап обучения алгоритма распознавания — загрузка нового, неизвестного изображения лица и прогнозирования, кому оно принадлежит (рис. 10.3). Эти изображения подготавливают аналогично изображениям для обучения — то есть их обрезают, подгоняют в размер и преобразуют в оттенки серого. Затем распознаватель их анализирует, сравнивает результаты с лицами в файле YAML и прогнозирует наилучшее совпадение.
Распознавание лиц с помощью LBPH 293
П а
Unknown |
|
А |
ID = 1 |
ID = 1 |
|
|
|
а а а П |
= 80 |
У = 64 |
|
|
|
|
|
|
Б |
|
В- а а |
|
П |
ID = 2 |
|
|
|
trainer.yml |
= 95 |
|
|
|
|
|
|
|
|
Unknown |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ID = 2 |
|
|
ID = 1 ID = 2 |
|
У = 159 |
|
|
|
|
Unknown |
Рис. 10.3. Прогнозирование неизвестных лиц при помощи обученного алгоритма распознавания
Обратите внимание, что алгоритм распознавания осуществляет прогноз личности каждого лица. Если в файле YAML хранится всего один вариант, то алгоритм распознавания присваивает каждому лицу ID «обученного» или, лучше сказать, контрольного лица. Он также выводит значение уверенности, представляющее измерение расстояния между новым и контрольным лицами. Чем больше это значение, тем хуже совпадение. Чуть позже мы рассмотрим это подробнее, а сейчас просто знайте, что для принятия решения о верности прогноза лица используется пороговое значение. Если уровень уверенности выше установленного порога, программа отменяет совпадение и определяет проверяемое лицо как unknown (рис. 10.3).
Извлечение гистограмм локальных бинарных шаблонов
Предлагаемый OpenCV алгоритм распознавания лиц основан на локальных бинарных шаблонах (LBP). Эти дескрипторы текстур впервые были применены в 1994 году для описания и классификации текстур поверхностей, различения между бетоном и ковровым покрытием и пр. Лица также состоят из текстур, значит, эта техника вполне годится для их распознавания.
Прежде чем извлекать гистограммы, нужно сгенерировать бинарные шаблоны. Алгоритм LBP вычисляет локальное представление текстуры, сравнивая каждый пиксель с соседними. Первый шаг вычисления — смещение небольшого окна по изображению лица и запись информации о пикселях. На рис. 10.4 показан пример такого окна.
294 Глава 10. Ограничение доступа по принципу распознавания лиц
3x3 |
||
160 |
110 |
50 |
180 |
90 |
50 |
200 |
115 |
100 |
|
П |
|
|
90 |
|
1 |
|
1 |
|
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
|
|
0 |
|
|
215 |
|
|
|
|
|
|
|
|
|
|
1 |
|
1 |
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Д |
|
|
Д |
||||
а |
|
а |
||||||
|
11010111 |
|
215 |
|
Рис. 10.4. Образец скользящего окна 3 × 3 пикселя, используемого для записи локальных бинарных шаблонов
Следующий шаг — конвертация пикселей в двоичный формат с использованием центрального значения (в данном случае 90) в качестве порога. Для этого сравниваются восемь соседних значений с указанным порогом. Если соседнее значение оказывается равным или больше него, ему присваивается 1. Если же оно меньше порога, присваивается 0. Далее, игнорируя центральное значение, конкатенируем двоичные значения строка за строкой (некоторые методы это делают по часовой стрелке), формируя новое двоичное значение (11010111). Завершаем процесс конвертацией этого двоичного числа в десятичное (215) и сохранением его в позиции центрального пикселя.
Продолжаем смещение окна до тех пор, пока все пиксели не будут конвертированы в значения LBP. Помимо использования для записи соседних пикселей квадратного окна, алгоритм может использовать значение радиуса, реализуя процесс под названием круговой LBP.
Теперь пора извлекать гистограммы из LBP-изображения, созданного ранее. Для этого мы используем сетку, чтобы разделить LBP-изображение на прямоугольные области (рис. 10.5). В каждой области построим гистограмму из значений LBP (на рис. 10.5 они называются гистограммой локальной области).
Г а а
а а
К а а а а а
а а
О а |
Р а LBP |
О а ( а) |
Рис. 10.5. Извлечение гистограмм LBP
Распознавание лиц с помощью LBPH 295
После построения гистограмм локальных областей нормализуем и конкатенируем их в одну длинную гистограмму (в урезанном виде показана на рис. 10.5). Поскольку мы используем изображение в оттенках серого с показателем интенсивности от 0 до 255, каждая гистограмма содержит 256 значений. Если вы применили сетку 10 × 10, как на рис. 10.5, то в финальной гистограмме получится 10 × 10 × 256 = 25 600 состояний. Предполагается, что эта составная гистограмма включает признаки, необходимые для распознавания лица. Таким образом, эти признаки являются представлениями изображения лица, и процесс распознавания состоит из сравнения представлений, а не самих изображений.
Для прогнозирования личности нового, неизвестного лица, мы извлекаем его конкатенированную гистограмму и сравниваем ее с гистограммами из базы данных. Сравнение — это измерение расстояния между гистограммами. Для вычисления могут использоваться различные методы, включая евклидову метрику, абсолютное расстояние, хи-квадрат и т. д. Алгоритм возвращает ID контрольного изображения с наиболее близким совпадением гистограммы и показатель уверенности. После можно применить к этому показателю порог, как показано на рис. 10.3. Если уверенность относительно оцениваемого изображения окажется ниже порогового значения, значит, совпадение найдено.
Так как OpenCV инкапсулирует все эти шаги, реализация алгоритма LBPH сложностей не вызывает. Этот алгоритм также дает отличные результаты в контролируемой среде и не подвержен влиянию изменения освещения (рис. 10.6).
Алгоритм LBPH отлично реагирует на изменения в освещении, так как опирается на сравнение значений интенсивности пикселей. Даже если освещение в одном изображении оказывается намного ярче, чем в другом, относительная отражательная способность лица остается прежней и LBPH способен ее определить.
Рис. 10.6. Алгоритм LBP устойчив к изменению освещения