Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Воган Ли - Python для хакеров (Библиотека программиста) - 2023.pdf
Скачиваний:
5
Добавлен:
07.04.2024
Размер:
14.76 Mб
Скачать

Проект #1. Поиск и спасение      29

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

Формула для вычисления вероятности того, что очки находятся в заданной комнате, с учетом эффективности поиска выглядит так:

Здесь G — это вероятность того, что очки находятся в комнате, E —эффектив- ность поиска, а Pprior — априорная, или начальная, оценка вероятности до получения новых данных.

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

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

Проект #1. Поиск и спасение

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

У мыса Python сложные океанические течения (рис. 1.3), сейчас дует юго-запад­ ный ветер. Видимость хорошая, но волнение почти не позволяет разглядеть человеческую голову.

30      Глава 1. Спасение моряков с помощью теоремы Байеса

Рис. 1.3. Океанические течения у мыса Python

В реальной жизни вы передали бы всю информацию в систему оптимального планирования поисково-спасательных операций (Search and Rescue Optimal Planning System, SAROPS) береговой охраны. Это программное обеспечение учитывает такие факторы, как ветер, приливы и течения, находится ли тело в воде или на лодке и пр. На основе этих данных программа генерирует прямоугольные области поиска, вычисляет начальные вероятности нахождения моряка в каждой из них и составляет график наиболее эффективных траекторий полетов.

Мы предположим, что SAROPS определила три области поиска. Все, что нужно сделать, — это написать программу, которая применяет правило Байеса. При этом ресурсов у вас хватает на поиск в двух из трех областей за день. Вам нужно решить, как эти ресурсы распределить. Это очень трудно, но у вас есть мощный помощник — теорема Байеса.

ЗАДАЧА

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

Проект #1. Поиск и спасение      31

Стратегия

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

Здесь, как и в реальной жизни, есть два варианта, когда все может пойти не так: тщательный поиск в области, не увенчавшийся успехом, или плохой поиск, при котором усилия целого дня затрачиваются впустую. Если приравнять это к показателям эффективности поиска, то в первом случае вы можете получить SEP, равный 0.85, но не произвести поиск моряка в оставшихся 15 % области. Во втором же случае SEP будет 0.2 и у вас останутся неисследованными 80 % области.

Можете представить себе дилемму, которая возникает у руководителей реальных спасательных операций? Послушаете ли вы собственную интуицию, проигнорировав Байеса? Будете ли придерживаться чистой холодной логики Байеса, так как верите, что это наилучший вариант? А может, будете действовать целесообразно и подстрахуете свою карьеру и репутацию, строго следуя правилу Байеса, даже когда в нем не уверены?

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

Установка библиотек Python

OpenCV — это крупнейшая в мире библиотека компьютерного зрения. Компьютерное зрение — область глубокого обучения, позволяющая машинам видеть, распознавать и обрабатывать изображения, подобно человеку. Зародилась OpenCV в 1999 году как инициатива Intel Research, а теперь поддерживается OpenCV Foundation, некоммерческой организацией, предоставляющей программное обеспечение бесплатно.

Написана эта библиотека на C++, но есть и поддержка других языков, а именно Python и Java. Несмотря на то что в первую очередь она предназначена для приложений компьютерного зрения, работающих в реальном времени, OpenCV

32      Глава 1. Спасение моряков с помощью теоремы Байеса

также включает стандартные инструменты по работе с изображениями, подобные используемым в Python Imaging Library. На момент написания книги текущая версия библиотеки — OpenCV 4.1.

Для выполнения числовых и научных вычислений в Python этой библиотеке требуются пакеты Numerical Python (NumPy) и SciPy. OpenCV рассматривает изображения как трехмерные массивы NumPy (рис. 1.4). Это дает ей максимальную функциональную совместимость с другими научными библиотеками Python.

 

 

40

41

42

43

44

 

 

 

 

 

 

 

 

 

 

 

 

 

20

21

22

23

24

49

 

 

 

 

 

 

 

 

 

 

 

0

1

2

 

3

 

4

 

 

 

 

 

 

 

29

54

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

6

7

 

8

 

9

 

34

 

К а а а

 

 

 

59

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10

11

12

 

13

 

14

 

 

 

 

 

 

 

39

З а а

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

15

16

17

 

18

 

19

 

С а а

 

 

 

 

 

 

 

 

 

 

 

Рис. 1.4. Визуальное представление трехканального массива цветного изображения

OpenCV хранит свойства в виде строк, столбцов и каналов. «Форма» изображения с рис. 1.4 будет выражена кортежем из трех элементов (4, 5, 3). Каждый стек ячеек, например 0-20-40 или 19-39-59, представляет один пиксель. Числа показывают значения интенсивности каждого цветового канала для заданного пикселя.

Поскольку для многих проектов в книге нам потребуются библиотеки NumPy и matplotlib, сейчас самое время их установить.

Это можно сделать многими способами. Один из них — использование SciPy, открытой библиотеки Python, применяемой для научных и технических вычислений (подробнее — на https://scipy.org/index.html).

В качестве альтернативы: если вы собираетесь анализировать множество данных и выполнять чертежи для собственных задач, то можете скачать и использовать бесплатные дистрибутивы Python, например Anaconda или Enthought Canopy, которые работают с Windows, Linux и macOS. Эти дистрибутивы избавят

Проект #1. Поиск и спасение      33

вас от необходимости поиска и установки нужных версий всех необходимых научных библиотек, таких как NumPy, SciPy и т. д. Список подобных дистрибутивов вместе со ссылками на их сайты можно найти здесь: https://scipy.org/install.html.

Установка NumPy и других научных библиотек с помощью pip

Если вы хотите установить эти продукты напрямую, то используйте pip (Preferred Installer Program), систему управления библиотеками, упрощающую установку ПО для Python (подробнее — на https://docs.python.org/3/installing/). Windows и macOS версии Python, начиная с 3.4, содержат pip по умолчанию. Пользователи Linux могут установить pip отдельно. Для установки или обновления pip обратитесь к инструкциям на странице https://pip.pypa.io/en/stable/installation/

или найдите онлайн-руководство по инсталляции pip для вашей операционной системы.

Я использовал pip для установки научных пакетов, используя инструкции с https://scipy.org/install.html. Так как matplotlib требует несколько зависимостей, их также нужно установить. Для Windows выполните приведенную ниже команду (Python 3) с помощью PowerShell, запущенной (через Shift-правый клик) из каталога с текущей установкой Python:

$ python -m pip install --user numpy scipy matplotlib ipython jupyter pandas sympy nose

Если у вас установлены и Python 2, и Python 3, то вместо python используйте python3. Чтобы убедиться в том, что NumPy был установлен и стал доступен для OpenCV, откройте оболочку Python и введите:

>>> import numpy

Если ошибки не возникнет, то можно устанавливать OpenCV.

Установка OpenCV через pip

Инструкции по установке OpenCV вы найдете на https://pypi.org/project/opencvpython/. Для инсталляции OpenCV в стандартных средах (Windows, macOS и почти всех дистрибутивах GNU/Linux) введите в PowerShell или терминале следующее:

pip install opencv-contrib-python

либо

python -m pip install opencv-contrib-python