- •Об авторе
- •О научных редакторах
- •Благодарности
- •От издательства
- •Введение
- •Для кого эта книга?
- •Почему 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. Ограничение доступа по принципу распознавания лиц
- •Усложняем проект: добавление пароля и видеозахвата
Обнаружение лиц в видеопотоке 283
Появление в коридоре мутантов также может спровоцировать срабатывание огнестрельного механизма, если люди, которые находятся в коридоре, в этот момент отвернутся от камеры (рис. 9.14).
Рис. 9.14. И это не мог нормально сделать!
Я пересмотрел достаточно ужастиков и научно-фантастических фильмов и понимаю, что в реальных сценариях запрограммировал бы пушку стрелять во все, что движется. К счастью, с подобной этической дилеммой мне, надеюсь, никогда не придется столкнуться.
Обнаружение лиц в видеопотоке
Можно также обнаруживать лица в режиме реального времени, используя видеокамеры. Делается это просто, поэтому обойдемся без отдельного проекта. Введите код из листинга 9.5 либо используйте его цифровую версию video_face_detect. py из каталога Chapter_9, доступного для скачивания с сайта книги. Вам нужно использовать камеру своего компьютера или внешнюю камеру, подключенную к нему.
284 Глава 9. Как различить своих и чужих
Листинг 9.5. Обнаружение лиц в видеопотоке video_face_detect.py
import cv2 as cv
path = "C:/Python372/Lib/site-packages/cv2/data/"
face_cascade = cv.CascadeClassifier(path + 'haarcascade_frontalface_alt.xml')
cap = cv.VideoCapture(0)
while True:
_, frame = cap.read()
face_rects = face_cascade.detectMultiScale(frame, scaleFactor=1.2,
minNeighbors=3)
for (x, y, w, h) in face_rects:
cv.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv.imshow('frame', frame)
if cv.waitKey(1) & 0xFF == ord('q'): break
cap.release()
cv.destroyAllWindows()
После импорта OpenCV настраиваем путь на каскадный классификатор Хаара, как делали это в блоке листинга 9.1. Я здесь использую файл haarcascade_frontalface_alt.xml, поскольку он обладает более высокой точностью (меньше ложноположительных результатов), чем файл haarcascade_frontalface_alt.xml, который мы использовали в предыдущем проекте. Далее инстанцируем объект класса VideoCapture по имени cap (от capture). Передаем этому конструктору индекс видеоустройства, которое планируется использовать . Если у вас всего одна камера, например встроенная в ноутбук, то ее индекс должен быть 0.
Чтобы удерживать активными и камеру, и процесс обнаружения, используем цикл while. Этот цикл захватывает каждый видеокадр и анализирует его на наличие лиц, так же как в случае со статическими изображениями в предыдущем проекте. Алгоритм обнаружения лиц достаточно быстр, чтобы поспеть за непрерывным потоком, несмотря на объем работы, которую ему необходимо проделать.
Для загрузки кадров вызываем метод read() объекта cap. Он возвращает кортеж, состоящий из булева кода возврата и NumPy-объекта ndarray, представляющего текущий кадр. Код возврата используется, чтобы проверить, закончились ли кадры при считывании из файла. Но так как здесь мы считываем не из файла, то присваиваем его нижнему подчеркиванию, указывая на незначительность этой переменной.
Обнаружение лиц в видеопотоке 285
Далее повторно используем код предыдущего проекта, который находит прямо угольники лиц и рисует их в кадре. Отображаем кадр с помощью метода OpenCV imshow(). В случае обнаружения лица программа должна рисовать в этом кадре прямоугольник.
Завершаем цикл нажатием клавиши Q , чтобы выйти. Начинаем с вызова метода OpenCV waitKey(), которому передаем значение, равное 1 мс. Этот метод приостанавливает программу при ожидании нажатия клавиши, но ненадолго, чтобы не прерывать видеопоток.
Встроенная в Python функция ord() получает в качестве аргумента строку и возвращает переданный аргумент в форме кодовой точки Юникода, в данном случае q нижнего регистра. Таблицу сопоставления символов с числами можете найти на http://www.asciitable.com/. Чтобы этот код выполнялся в любой операционной системе, включите побитовый оператор AND, &, с шестнадцатеричным числом FF(0xFF), которое представляет значение 255. Использование & 0xFF гарантирует считывание только 8 последних бит переменной.
Когда цикл завершается, вызываем метод release() объекта cap. Это освобождает камеру для других приложений. Завершаем программу, закрывая окно отображения.
Можно добавить в процесс обнаружения лиц дополнительные каскады, чтобы повысить точность, как мы делали в предыдущем проекте. Если это слишком замедлит обнаружение, попробуйте уменьшить масштаб видеокадра. Сразу после вызова cap.read() добавьте следующий фрагмент:
frame = cv.resize(frame, None, fx=0.5, fy=0.5, interpolation=cv.INTER_AREA)
Аргументы fx и fy определяют масштабирование для измерений x и y экрана. Использование значения 0.5 приведет к уменьшению изначального размера окна вдвое.
Программа будет хорошо отслеживать ваше лицо, но только до тех пор, пока вы не станете совершать нестандартные действия, например не наклоните голову набок. Этого вполне достаточно, чтобы сбить с толку алгоритм обнаружения, из-за чего прямоугольник исчезнет (рис. 9.15).
Каскадные классификаторы Хаара спроектированы для распознавания вертикально расположенных лиц в фас или в профиль, и делают это неплохо. Они способны обрабатывать даже очки и бороду, но стоит лишь наклонить голову, и алгоритм может не справиться.
286 Глава 9. Как различить своих и чужих
Рис. 9.15. Обнаружение лиц с использованием видеокадров
Неэффективный, но простой способ распознавания наклоненной головы — использование цикла, который слегка поворачивает изображения, прежде чем передавать их для распознавания лиц.
Небольшой наклон каскадные классификаторы Хаара обработать способны (рис. 9.16), поэтому перед каждой передачей изображение можно поворачивать примерно на 5 градусов, что даст неплохой шанс на получение положительного результата.
Рис. 9.16. Поворот изображения помогает обнаружению