- •Об авторе
- •О научных редакторах
- •Благодарности
- •От издательства
- •Введение
- •Для кого эта книга?
- •Почему 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. Ограничение доступа по принципу распознавания лиц
- •Усложняем проект: добавление пароля и видеозахвата
374 Решения для практических проектов
app.draw_qc_rects() app.sort_stats()
ptp_img = app.draw_filtered_rects(IMG_GRAY_GEO, app.ptp_filtered) std_img = app.draw_filtered_rects(IMG_GRAY_GEO, app.std_filtered)
# Отображаем отфильтрованные прямоугольники на полутоновой карте. cv.imshow('Sorted by ptp for {} rect'.format(app.name), ptp_img) cv.waitKey(3000)
cv.imshow('Sorted by std for {} rect'.format(app.name), std_img) cv.waitKey(3000)
app.make_final_display() # Включает в себя вызов mainloop()
if __name__ == '__main__': main()
Глава 8. Обнаружение далеких экзопланет
Обнаружение инопланетных мегаструктур
practice_tabbys_star.py
"""Симулируем транзит инопланетного массива на фоне звезды и отображаем кривую блеска."""
import numpy as np import cv2 as cv
import matplotlib.pyplot as plt
IMG_HT = 400
IMG_WIDTH = 500
BLACK_IMG = np.zeros((IMG_HT, IMG_WIDTH), dtype='uint8')
STAR_RADIUS = 165
EXO_START_X = -250
EXO_START_Y = 150
EXO_DX = 3
NUM_FRAMES = 500
def main():
intensity_samples = record_transit(EXO_START_X, EXO_START_Y) rel_brightness = calc_rel_brightness(intensity_samples) plot_light_curve(rel_brightness)
def record_transit(exo_x, exo_y):
"""Рисуем проходящий на фоне звезды массив и возвращаем список изменений в интенсивности ее свечения."""
intensity_samples = []
for _ in range(NUM_FRAMES): temp_img = BLACK_IMG.copy()
# Рисуем звезду:
cv.circle(temp_img, (int(IMG_WIDTH / 2), int(IMG_HT / 2)), STAR_RADIUS, 255, -1)
# Рисуем инопланетный массив:
Глава 8. Обнаружение далеких экзопланет 375
cv.rectangle(temp_img, (exo_x, exo_y),
(exo_x + 20, exo_y + 140), 0, -1) cv.rectangle(temp_img, (exo_x - 360, exo_y),
(exo_x + 10, exo_y + 140), 0, 5) cv.rectangle(temp_img, (exo_x - 380, exo_y),
(exo_x - 310, exo_y + 140), 0, -1) intensity = temp_img.mean()
cv.putText(temp_img, 'Mean Intensity = {}'.format(intensity), (5, 390),
cv.FONT_HERSHEY_PLAIN, 1, 255) cv.imshow('Transit', temp_img) cv.waitKey(10) intensity_samples.append(intensity) exo_x += EXO_DX
return intensity_samples
def calc_rel_brightness(intensity_samples):
"""Возвращаем из списка значений интенсивности список значений относительной яркости."""
rel_brightness = []
max_brightness = max(intensity_samples) for intensity in intensity_samples:
rel_brightness.append(intensity / max_brightness) return rel_brightness
def plot_light_curve(rel_brightness):
"""Выводим график изменений относительной яркости во времени.""" plt.plot(rel_brightness, color='red', linestyle='dashed',
linewidth=2) plt.title('Relative Brightness vs. Time') plt.xlim(-150, 500)
plt.show()
if __name__ == '__main__': main()
Обнаружение транзита астероидов
practice_asteroids.py
"""Симулируем транзит астероидов и рисуем график кривой блеска.""" import random
import numpy as np import cv2 as cv
import matplotlib.pyplot as plt
STAR_RADIUS = 165
BLACK_IMG = np.zeros((400, 500, 1), dtype="uint8")
NUM_ASTEROIDS = 15
NUM_LOOPS = 170
class Asteroid():
"""Рисуем на изображении круг, обозначающий астероид."""
376 Решения для практических проектов
def __init__(self, number):
self.radius = random.choice((1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3))
self.x = random.randint(-30, 60) self.y = random.randint(220, 230) self.dx = 3
def move_asteroid(self, image):
"""Рисуем и перемещаем объект астероида.""" cv.circle(image, (self.x, self.y), self.radius, 0, -1) self.x += self.dx
def record_transit(start_image):
"""Симулируем транзит астероидов на фоне звезды и возвращаем список значений интенсивности."""
asteroid_list = [] intensity_samples = []
for i in range(NUM_ASTEROIDS): asteroid_list.append(Asteroid(i))
for _ in range(NUM_LOOPS): temp_img = start_image.copy()
# Рисуем звезду.
cv.circle(temp_img, (250, 200), STAR_RADIUS, 255, -1) for ast in asteroid_list:
ast.move_asteroid(temp_img) intensity = temp_img.mean()
cv.putText(temp_img, 'Mean Intensity = {}'.format(intensity), (5, 390), cv.FONT_HERSHEY_PLAIN, 1, 255)
cv.imshow('Transit', temp_img) intensity_samples.append(intensity) cv.waitKey(50)
cv.destroyAllWindows() return intensity_samples
def calc_rel_brightness(image):
"""Вычисляем величины относительной яркости и возвращаем их список.""" rel_brightness = record_transit(image)
max_brightness = max(rel_brightness) for i, j in enumerate(rel_brightness):
rel_brightness[i] = j / max_brightness return rel_brightness
def plot_light_curve(rel_brightness):
"Рисуем график кривой блеска на основе списка значений относительной яркости."""
plt.plot(rel_brightness, color='red', linestyle='dashed', linewidth=2, label='Relative Brightness')
plt.legend(loc='upper center') plt.title('Relative Brightness vs. Time') plt.show()
Глава 8. Обнаружение далеких экзопланет 377
relative_brightness = calc_rel_brightness(BLACK_IMG) plot_light_curve(relative_brightness)
Добавление эффекта потемнения к краю
practice_limb_darkening.py
"""Симулируем транзит экзопланеты, рисуем график кривой ее блеска и оцениваем радиус."""
import cv2 as cv
import matplotlib.pyplot as plt
IMG_HT = 400 IMG_WIDTH = 500
BLACK_IMG = cv.imread('limb_darkening.png', cv.IMREAD_GRAYSCALE) EXO_RADIUS = 7
EXO_START_X = 40
EXO_START_Y = 230 EXO_DX = 3 NUM_FRAMES = 145
def main():
intensity_samples = record_transit(EXO_START_X, EXO_START_Y) relative_brightness = calc_rel_brightness(intensity_samples) plot_light_curve(relative_brightness)
def record_transit(exo_x, exo_y):
"""Рисуем планету, проходящую на фоне звезды, и возвращаем список со значениями изменяющейся интенсивности."""
intensity_samples = []
for _ in range(NUM_FRAMES): temp_img = BLACK_IMG.copy()
# Рисуем экзопланету:
cv.circle(temp_img, (exo_x, exo_y), EXO_RADIUS, 0, -1) intensity = temp_img.mean()
cv.putText(temp_img, 'Mean Intensity = {}'.format(intensity), (5, 390),
cv.FONT_HERSHEY_PLAIN, 1, 255) cv.imshow('Transit', temp_img) cv.waitKey(30) intensity_samples.append(intensity) exo_x += EXO_DX
return intensity_samples
def calc_rel_brightness(intensity_samples):
"""Возвращаем из списка интенсивности список значений относительной яркости."""
rel_brightness = []
max_brightness = max(intensity_samples) for intensity in intensity_samples:
rel_brightness.append(intensity / max_brightness) return rel_brightness