Как сделать фотоловушку с Raspberry Pi и Sony Alpha
Недавно белка заметила нашу коробку с орехами, которая почти год ждала рейда. Но поскольку наши белки здесь немного пугливы, мне нужно было придумать способ подойти поближе, чтобы сделать их хорошие снимки.
Вспомнив свой проект, в котором я использовал свой старый Sony Alpha NEX-5T для таймлапсов 3D-печати, я решил установить фотоловушку на основе функции удаленного доступа Wi-Fi этой камеры, и она отлично сработала.
Это должно работать на любом Sony Alpha, начиная с NEX-5R, включая серию a6000 и любой из a7s, а управляющий сценарий должен работать на любом компьютере с доступом к камере по Wi-Fi. В моем случае это был запасной Raspberry Pi.
Результаты, достижения
Итак, чтобы было ясно: чтобы понять, чего вы можете ожидать от этой установки, позвольте мне описать свой опыт работы с ней. Однажды вечером я написал код фотоловушки, а на следующее утро настроил камеру, прежде чем уйти с детьми на игровую площадку. Десять минут спустя я мог увидеть на своем телефоне следующее изображение (примечание: загрузка фотографий на мой телефон не является частью сценария. Я просто синхронизировал папку вывода сценария с моим экземпляром Nextcloud):
Для этого у меня была только камера на штативе и поблизости Raspberry Pi, который управлял камерой, автоматически нажимал на спусковой крючок, когда белка была в поле зрения, и загружал изображение предварительного просмотра полученного изображения. Никакого дополнительного оборудования не требуется, кроме защиты вашего снаряжения от кражи и непогоды; он больше не нуждается в надзоре.
Чтобы избежать попадания влаги, я переместил установку в свой гараж на ночь, но, кроме того, я мог оставить его готовый на весь день, и изображения продолжали поступать.
Что вам нужно
Вам понадобится только подходящая камера и компьютер для запуска моего кода.
Камера должна быть Sony Alpha с функцией удаленного доступа по Wi-Fi. Итак, если вашей камерой можно управлять с помощью приложения Imaging Edge Mobile, она должна работать и в соответствии со списком совместимости Sony, которым должен быть любой Sony Alpha, начиная с NEX-5R.
Затем вам понадобится компьютер, на котором можно запустить мой сценарий и который подключен к Wi-Fi камеры. Поскольку сценарий написан на Python, это должно быть возможно на любом ноутбуке с любой операционной системой, если он имеет Wi-Fi и может запускать Python. К сожалению, как всегда, запускать Python в Windows довольно сложно. Да, существует множество руководств, и после настройки это не так сложно, но по сравнению с процессом "просто запустите" в Linux и MacOS, это кошмар.
Я использовал запасной Raspberry Pi 3, который не использовался, так как я заменил его Raspberry Pi 4 для домашней автоматизации. Я совершенно уверен, что более старый Raspberry Pi 2 также достаточно быстр, но вам нужно будет добавить к нему Wi-Fi-карту, поскольку у нее нет встроенного Wi-Fi.
Возможно, вы захотите добавить к своей установке адаптер переменного тока с фиктивной батареей, если вы не используете одну из новых камер Sony, которые могут работать от USB во время съемки. Идея состоит в том, чтобы оставить его работающим на долгое время без присмотра, и вы сможете собирать изображения позже. Он работал бы от батареи камеры, но она быстро разряжается. Поскольку вам нужен компьютер или Raspberry Pi поблизости, вам в любом случае понадобится решение для питания, поэтому подключение камеры к источнику питания не требует особых дополнительных усилий.
Сцена
Как вы увидите ниже, у сцены, которую вы можете снимать по моему сценарию, есть некоторые ограничения. Спусковой механизм основан на том, что животное находится в фокусе на размытом или однородном фоне. В любом случае вам наверняка захочется использовать ручную фокусировку и нацелиться на то место, где вы ожидаете, что будет находиться ваше животное. Вы также хотите снимать под углом, который дает хорошее разделение фона и открывает диафрагму достаточно широко, чтобы должным образом размыть фон.
Другие объекты тоже могут быть в фокусе, но важно, чтобы большая часть изображения была размытой, если только эта часть не занята животным.
Как работает скрипт
Когда все готово и вы запустите сценарий, он сначала попытается подключиться к вашей камере через функцию удаленного доступа Wi-Fi. Это простой HTTP REST API, который хорошо задокументирован Sony, поэтому мне было легко выполнить рукопожатие с камерой, запросить видеопоток в видоискателе и запустить фактические фотографии при обнаружении животного.
Единственная немного более сложная часть - это обнаружение белок (или животных в целом). Для этого я использую OpenCV. Это библиотека с открытым исходным кодом для всех видов инструментов для обработки изображений и компьютерного зрения, и если вы слышали о ней раньше, вы, вероятно, думаете о сложных алгоритмах глубокого обучения для распознавания лиц. Но, к счастью, есть гораздо более простой метод обнаружения белок, чем научить ИИ распознавать белку с помощью гигабайтов изображений с белками.
Вместо этого мы используем тот факт, что у нас есть подходящая камера и сцена, как описано выше. Вместо того, чтобы фактически распознавать какую-либо особенность изображения, сценарий просто определяет, какая часть изображения находится в фокусе. Это довольно простая математическая задача, которую можно решить в несколько строк кода (с OpenCV). Мы просто смотрим на стандартное отклонение оператора Лапласа для версии изображения в оттенках серого.
Если ни "стандартное отклонение", ни "оператор Лапласа" не имеют для вас никакого значения, не волнуйтесь. Оператор Лапласа - это "расхождение" "градиента", поэтому можно сказать, что это индикатор того, насколько градиент яркости между соседними пикселями меняет направление. На размытом или однородном фоне не так много градиента, но если есть много деталей с резкими линиями, пиксели быстро чередуются, и градиент точки повсюду. По сути, так работает контрастный автофокус.
Таким образом, сценарий вычисляет эту меру для "фокуса" для каждого кадра видео предварительного просмотра и берет скользящее среднее этого значения в течение более минуты. Значение изменяется и слегка дрейфует по мере изменения освещения в течение дня, и это среднее значение будет отслеживать текущий "базовый" фокус пустой сцены. Но когда белка попадает в кадр и занимает область, которая в противном случае не в фокусе, эта "мера фокусировки" внезапно значительно увеличивается. И тогда скрипт запускает камеру.
Я думаю, что это хороший пример, когда простой подход намного лучше, чем бросать все в алгоритм машинного обучения. Я ожидал, что этот код не только прост в настройке и программировании, но и на довольно медленных устройствах. Да, и, конечно же, запускает все интересное - не только белок.
Самостоятельно
Подготовка камеры - самая простая часть: вам просто нужно включить функцию управления Wi-Fi. На старых моделях это реализовано как приложение камеры, а на новых - это просто опция в меню настроек, позволяющая управлять с помощью смартфона.
Следующий шаг - это, наверное, единственная сложная часть. Вам необходимо подключить компьютер / ноутбук / Raspberry Pi к Wi-Fi камеры. Для этой простой настройки это не должно быть слишком сложно. Камера показывает имя сети (SSID), а при нажатии кнопки также отображается пароль. Вы можете просто ввести их для своего Wi-Fi-соединения, как если бы вы настраивали любое другое WiFi-соединение на своем устройстве.
Проблемной частью является то, что камера позволяет удаленное управление только в том случае, если у нее есть собственная точка доступа, и это имеет несколько неприятных последствий, поскольку это означает, что ваш ноутбук и Pi не могут быть одновременно подключены к вашему "обычному" Wi-Fi. На ноутбуке это обычно означает, что он будет отключен во время управления камерой, и вам может потребоваться запретить вашей операционной системе подключаться к Wi-Fi по умолчанию из-за "отсутствия Интернета".
На Raspberry Pi это может быть еще более проблематичным, если вы запустите его без экрана и клавиатуры. Если его Wi-Fi подключен к вашей камере, вы не можете одновременно войти в свой Pi через Wi-Fi. Итак, не запускайте raspi-config для подключения к камере, если вы также используете Wi-Fi для доступа к Pi, так как это выкинет вас из сеанса SSH.
Тем не менее, когда вы используете Pi, у вас есть несколько вариантов:
Хорошо, на этом этапе у вас должно быть устройство, подключенное к Wi-Fi вашей камеры, которое может запускать сценарии Python. В зависимости от вашей ОС и дистрибутива Python вам может потребоваться установить несколько пакетов, но, по крайней мере, на Raspbian вам нужно будет установить только OpenCV для Python с помощью: sudo apt install python3-opencv.
Затем загрузите мой скрипт из репозитория Github и создайте в этой же папке папку "белки". Это будет место, куда скрипт выгружает все загруженные изображения предварительного просмотра после срабатывания камеры. В большинстве случаев вам не нужно ничего настраивать, но если вам нужно, могут быть интересны следующие значения в верхней части скрипта:
Когда все будет готово, вы можете просто запустить скрипт с python3 autocapture.py. Если вы хотите выйти из системы, пока скрипт продолжает работать (например, на Raspberry Pi), я настоятельно рекомендую запустить скрипт с экраном (просто выполните поиск по запросу "отключение экрана" в Интернете, если вы еще этого не знаете).
Улучшения?
Что ж, одна проблема с моей чрезвычайно простой настройкой заключается в том, что белки имеют тенденцию пугаться громкого шума затвора моего старого NEX-5T, поэтому вы можете использовать большее фокусное расстояние, чтобы разместить камеру подальше, или использовать один из более новые Sony Alpha, которые могут дополнительно использовать свои электронные жалюзи, чтобы вообще не шуметь.
Мне очень нравится тот факт, что сценарий может быть таким простым, но есть пределы его возможностей. Поскольку он полагается исключительно на тот факт, что белка окажется единственным объектом в фокусе с очень размытым фоном, вы ограничены этими сценами. Хотя такие фотографии выглядят великолепно, это не сработает, если вы попытаетесь поймать животное, которое не приманлено к такому ограниченному пространству, или если вы хотите иметь больше деталей на заднем плане (например, показать животное в его естественной среде обитания).
Итак, хотя я хочу посмеяться над тем, насколько просто мое решение по сравнению с вычислительно сложными системами обнаружения белок, более сложные алгоритмы также могут сделать такие снимки возможными. Мой сценарий можно легко адаптировать к любой логике распознавания, от простого обнаружения движения между кадрами до распознавания конкретных животных на основе глубокого обучения. Если у вас есть небольшой опыт в этой области, возьмите мой небольшой фрагмент кода и начните с ним играть. Я хотел бы увидеть и поделиться более продвинутыми версиями этого.
Об авторе: Себастьян Стэакс, физик, разработчик приложения phyphox, отец двоих детей, проводит оставшееся свободное время с проектами, связанными с оборудованием, 3D-печатью, кодированием и фотографией. Эта статья изначально была опубликована здесь.