Создание камеры-ловушки с использованием Raspberry Pi, Python, OpenCV и TensorFlow

в 13:15, , рубрики: opencv, python, Raspberry Pi, TensorFlow, Блог компании RUVDS.com, программирование микроконтроллеров, разработка, Разработка на Raspberry Pi

Создание камеры-ловушки с использованием Raspberry Pi, Python, OpenCV и TensorFlow - 1

Я сильно верю в обучение через практику, через создание чего-то нового. А для того чтобы что-то создавать, нужно чтобы работа приносила бы удовольствие.

Я начну рассказ о моём новом проекте с того, что раскрою причины, по которым решил попытаться создать камеру-ловушку на основе Raspberry Pi.

Я живу в Лондоне, мой сад часто посещают местные представители дикой природы. Случается это так часто, что я, заядлый садовник, мало-помалу начал расстраиваться. Разбитые горшки, выкопанные из земли растения, съеденные фрукты и овощи…

Я видел в своём саду маленьких лис (они — просто прелесть), больших лис, кошек (не моих), птиц. А однажды меня даже посетил ястреб-перепелятник.

Создание камеры-ловушки с использованием Raspberry Pi, Python, OpenCV и TensorFlow - 2

Ястреб-перепелятник

Кто ещё заберётся в мой сад под покровом ночи?

Создание камеры-ловушки с использованием Raspberry Pi, Python, OpenCV и TensorFlow - 3

Разглядеть животное на этом снимке не так уж и просто

Какие ещё поводы мне нужны для того чтобы создать камеру-ловушку на основе Raspberry Pi, Python, TensorFlow и чего угодно ещё? И камера у меня должна получиться очень хорошая.

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

Идея это здравая, но это будет и вполовину не так интересно.

Модули камеры для Raspberry Pi

Я начал с изучения вопроса о том, какие типы камер можно подключить к одноплатному компьютеру Raspberry Pi.

Самые популярные подобные камеры — это те, которые напрямую подключаются к Raspberry Pi с использованием MIPI-коннектора. Преимущества камер такого типа заключается в том, что данные между камерой и платой передаются очень быстро. Существует и простой в использовании API для работы с камерой. 

Я попробовал этот API и выяснил, что в нём имеется множество полезных функций, которые позволяют записывать видео и во время записи делать снимки. Благодаря этому я могу, используя простые и понятные инструменты, одновременно обнаруживать движение и записывать видео.

Есть три вида модуля камеры для Raspberry Pi. Ниже приведён сокращённый вариант таблицы с характеристиками таких модулей.

Camera Module v1 Camera Module v2 HQ Camera
Цена нетто $25 $25 $50
Размер Около 25 × 24 × 9 мм 38 x 38 x 18.4 мм (не включая оптику)
Вес 3 г 3 г
Разрешение снимков 5 М 8 М 12.3 М
Видеорежимы 1080p30, 720p60 и 640 × 480p60/90 1080p30, 720p60 и 640 × 480p60/90 1080p30, 720p60 и 640 × 480p60/90
Интеграция с Linux Драйвер V4L2 Драйвер V4L2 Драйвер V4L2
C-API OpenMAX IL и другие OpenMAX IL и другие
Сенсор OmniVision OV5647 Sony IMX219 Sony IMX477
Разрешение сенсора 2592 × 1944 пикселей 3280 × 2464 пикселей 4056 x 3040 пикселей
Размер рабочей области сенсора 3,76 × 2,74 мм 3,68 x 2,76 мм (диагональ — 4,6 мм) 6,287 x 4,712 мм (диагональ — 7,9 мм)

В этой таблице приведены сведения об официальных модулях камеры, но можно найти камеры сторонних производителей, которые будут работать с Raspberry Pi. Модули камеры используют для обработки данных с сенсора GPU Raspberry Pi.

Так как при использовании модуля камеры обработкой изображений занимается сам Raspberry Pi, оказывается, что выбор сенсоров камер весьма ограничен. У каждого сенсора имеется собственный API, поэтому поддержка различных типов сенсоров — непростая задача.

Запись видео в условиях низкой освещённости

Я собираюсь создать камеру-ловушку для наблюдения за дикими животными. Поэтому её возможностей должно быть достаточно и для работы днём, и для работы ночью. То есть, в ней должен быть сенсор, способный записывать видео в условиях низкой освещённости. Весьма желательно, чтобы он передавал бы реальный цвет снимаемых объектов. В плохих условиях освещённости Camera Module v1 и v2 работают не очень хорошо. Для того чтобы с их помощью можно было бы в таких условиях что-нибудь снять, нужно использовать ИК-подсветку и убрать из них ИК-фильтр. Процедура подготовки камеры к съёмкам в плохих условиях освещённости зависит от конкретной модели камеры. Но тут появляется ещё одна проблема, которая заключается в том, что получаемые изображения имеют розовый оттенок. При использовании подобных камер нужен механизм, который задействует ИК-фильтр при съёмках днём и убирает этот фильтр при съёмках ночью.

Создание камеры-ловушки с использованием Raspberry Pi, Python, OpenCV и TensorFlow - 4

Изображение с камеры для Raspberry Pi, снятое днём в плохих условиях освещённости

Но существует новая камера для Raspberry Pi, которая в таблице обозначена как HQ Camera. Правда, я не вполне уверен в её «ночных» возможностях. Она основана на сенсоре Sony IMX477, от которого в плохих условиях освещённости можно ожидать получения более качественной картинки, чем могут выдать камеры предыдущих поколений. Может ли этот сенсор выдавать правильную цветную картинку в темноте, я ещё собираюсь выяснить. Но мои предварительные исследования камер, касающиеся их спецификаций, говорят о том, что вряд ли он на это способен.

Sony Starvis — замечательный сенсор для камер

У компании Sony есть особое семейство сенсоров для камер, используемых, в основном, для видеонаблюдения. Это — Sony Starvis. Эти сенсоры представляют собой крайне продвинутые устройства, способные давать качественное цветное изображение в условиях низкой освещённости при всего лишь 0,001 лк. Люкс (лк) — это единица измерения освещённости.

Для того чтобы было понятнее, приведу несколько примеров. Практически полная темнота — это 0,0001 лк. А именно: нет солнечного света, нет света луны и звёзд, небо затянуто тучами, нет искусственных источников освещения. Мне неизвестны сенсоры для камер, способные снимать в полной темноте.

Но если небо чистое, то звёзды дают освещённость в 0,002 лк. Хотя и в таких условиях всё ещё очень темно, сенсор Sony Starvis способен снимать при освещённости, в два раза меньше этой. Как по мне, так это просто потрясающе.

Вот страница из Википедии, где можно найти дополнительные примеры.

Будем надеяться, что я смог донести до вас идею о том, что Sony Starvis — это идеальный сенсор для камеры-ловушки.

Главный минус этого сенсора в том, что нет камер для Raspberry Pi, в которых он применяется. Но если бы мне попалась USB-камера или IP-камера с таким сенсором, я бы что-нибудь придумал и подключил бы её к Raspberry Pi.

Собственно говоря, я нашёл такую камеру.

Я не хотел слишком сильно вкладываться в этот проект, поэтому купил подходящую IP-камеру с Sony Starvis на Aliexpress. Эта покупка обошлась мне, если я всё правильно помню, в £20.

Сравнивать камеру для Raspberry Pi и эту камеру — это как сравнивать день и ночь. И я ничуть не преувеличиваю. Да вот — сами посмотрите.

Создание камеры-ловушки с использованием Raspberry Pi, Python, OpenCV и TensorFlow - 5

Камера с сенсором Sony Starvis IMX307, съёмка в тёмной комнате

Создание камеры-ловушки с использованием Raspberry Pi, Python, OpenCV и TensorFlow - 6

Камера Raspberry Pi v2 — та же комната, но другая точка съёмки

Для камеры-ловушки и для камеры видеонаблюдения очень важна возможность делать качественные записи в плохих условиях освещённости.

Кто-то может сказать, что запись цветного видео в плохих условиях освещённости — это не так уж и важно, что можно обойтись простой камерой с ИК-подсветкой. Но я не могу использовать ИК-подсветку, так как собираюсь разместить камеру в помещении и направить её на сад через окно. А если направить источник ИК-излучения на стекло, стекло поведёт себя как зеркало и камера «ослепнет».

Если же говорить о камерах для Raspberry Pi, то они хорошо подходят для каких-нибудь простых проектов или для изучения чего-то нового. Но если заняться каким-нибудь хотя бы наполовину серьёзным проектом, тогда просто необходимо пользоваться более качественными камерами.

Применение USB-камеры (или даже IP-камеры) открывает совершенно новые возможности. Кроме того, если у вас при этом есть ещё и обычная камера для Raspberry Pi, вы можете употребить её для каких-нибудь экспериментов из сферы искусственного интеллекта.

Установка и настройка камеры для Raspberry Pi

Займёмся подключением Camera Module v2 к плате. Это, на самом деле, очень просто.

Создание камеры-ловушки с использованием Raspberry Pi, Python, OpenCV и TensorFlow - 7

Camera Module v2

У камеры имеется сине-белый шлейф. Его нужно подключить к CSI-коннектору платы. Синяя сторона шлейфа должна быть обращена к задней части платы.

Я использовал корпус для камеры, напечатанный на 3D-принтере. Соответствующие файлы я нашёл на Thingiverse. Но подходящий корпус, совсем недорогой, можно найти и, например, на Amazon.

Создание камеры-ловушки с использованием Raspberry Pi, Python, OpenCV и TensorFlow - 8

Корпус для камеры

Теперь пришло время включить камеру.

После включения Raspberry Pi нужно открыть окно терминала.

Создание камеры-ловушки с использованием Raspberry Pi, Python, OpenCV и TensorFlow - 9

Терминал

Затем надо выполнить такую команду:

$ sudo apt update

А потом — такую:

$ sudo apt full upgrade

Это делается для того чтобы обеспечить использование на плате последней версии Raspbian и самых свежих патчей и обновлений.

После этого надо выполнить в терминале следующую команду:

sudo raspi-config

Создание камеры-ловушки с использованием Raspberry Pi, Python, OpenCV и TensorFlow - 10

Работа с raspi-config

Здесь нас интересует раздел Interfacing Options>P1 Camera. Потом надо выбрать команду Finish и перезагрузить Raspberry Pi.

Съёмка фотографий с использованием raspistill

Теперь камера должна быть готова к работе. Проверим её с помощью raspistill. Снова откроем терминал и введём там такую команду:

raspistill -v -o test.jpg

Вот какое чудесное фото сняла моя камера.

Создание камеры-ловушки с использованием Raspberry Pi, Python, OpenCV и TensorFlow - 11

Снимок с камеры для Raspberry Pi

Запись видео с помощью raspivid

Фотографии — это хорошо, но запись видео — это уже гораздо лучше. Тут нам на помощь придёт raspivid:

raspivid -o vid.h264

Такая команда позволяет записать видео длительностью 5 секунд.

Если нужно снять более длительное видео — этой команде понадобится передать параметр -t с указанием длительности видео в миллисекундах. Например, следующая команда позволяет записать видео длительностью в 30 секунд:

raspivid -o vid.h264 -t 30000

Настройка потокового вещания

А теперь — самое интересное. Для того чтобы видеть то же самое, что «видит» камера, можно воспользоваться такой командой:

raspivid -o - -t 0 -n | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

Она создаёт RTSP-поток, подключиться к которому можно из локальной сети.

Итоги

Теперь, когда я разобрался с камерами для Raspberry Pi, можно развивать проект дальше, а именно, устанавливать на Raspberry Pi 4 TensorFlow, Open CV и Python и приступать к написанию кода. Об этом я планирую рассказать в следующих моих материалах. Вот, кому интересно, мой канал на YouTube, там вы можете найти видео, связанные с этим проектом.

Работали ли вы с камерами для Raspberry Pi?

Создание камеры-ловушки с использованием Raspberry Pi, Python, OpenCV и TensorFlow - 12

Создание камеры-ловушки с использованием Raspberry Pi, Python, OpenCV и TensorFlow - 13

Автор: ru_vds

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js