Создал домашнюю систему видеонаблюдения с распознаванием номеров

Всем привет!


INTRO
Статья о том, когда It-шнику становится любопытно. Как я решил при помощи простой ip-камеры создать сервис регистрации проезжающих автомобилей с блек-джеком и шлю… распознаванием номера и определением владельца.

Заранее напоминаю о том, что я пишу непосредственно о системе. Легитимность установки камеры и съемки зависит от конкретных случаев и в некоторых из них запрещена законом.


Часть первая. Зарождение идеи.
Начну рассказ с текущей ситуации. Примерно год назад, очередной раз бродя по интернету я попал в цепкие лапы акций магазинов бытовой техники и зачем-то купил себе камеру "Xiaomi Mi Home Security Camera 1080p Magnetic". С учетом всех скидок, акций и бонусов камера обошлась примерно в 1тыс. рублей.

Камера mi camera magnetic (фото из интернета)

Задача для камеры была поставлена быстро — "наблюдать за происходящим во дворе". Меня интересовала парковка.
Интересный факт, камера лично мне не пригодилась ни разу, но несколько раз меня с утра будили незнакомые люди звонком в дверь и интересовались "моя ли это камера" и "пишет ли она" т.к у них что-то случалось во дворе.

Пример дневной съемки во дворе

Пример ночной съемки во дворе

Не так давно мне подарили еще одну точно такую-же камеру. После некоторого времени раздумий я решил что было бы неплохо снимать именно проезжающие машины, с возможностью видеть номера. Т.к основная (первая) камера снимала общий план и детали( номера машин, лица) невозможно было определить.

Я решил поставить и настроить вторую камеру так — что бы она снимала конкретный небольшой участок дороги с проезжающими машинами.
Если у меня будут номера, можно создавать базу номеров машин. Зачем? Потому что могу!
Только на этом моя фантазия не остановилась. Номер у меня есть, почему бы не получить по нему информацию?(Марка, модель и.т.д). И как это обычно бывает — на ровном месте я придумал себе хобби-проект.


Часть вторая. Формируем ТЗ.
Идея понятна. Хочу фиксировать все проезжающие машины параллельно распознавая их номера и по возможности получать дополнительную информацию по автомобилю.

Что дальше? Дальше агрегируем требования и формируем задачу.
— Доступ к данным должен быть простым. Писать приложения под каждую платформу(вин, андроид, ios и.т.д.) мне очень не хотелось. Решено, это будет web-приложение с адаптивным под мобильные устройства дизайном.
Доступ из интернета.
— Авторизация — система должна иметь функционал авторизации по логину и паролю.
Регистрация.
Данные должны хранится в БД для возможности быстрого доступа к информации и построения различных отчетов ( сколько раз за день а/м с номером появлялся в поле камеры, самая частая машина за неделю, количество машин в день/неделю/месяц )
— Простота разработки — я бы не хотел писать полностью весь код, т.к я не супер крутой программист. Честно говоря я вообще не считаю себя программистом. Соответственно приоритет будет отдан готовым библиотекам, сервисам — которым можно отдать часть работы на аутсорс.
— Простая масштабируемость — возможно, то, что я сделаю будет полезно кому-то еще. В таком случае, не стоит создавать систему из непонятных инструментов и костылей. Использовать популярные фреймворки.
— Писать код и разрабатывать функционал с учетом использования несколькими пользователями.
— Стоимость — аренда сервера, покупка домена и подключение к сторонним api могут вылиться в копеечку. Мне постоянно стоит напоминать себе что это домашний хобби-проект. Стоит тщательно контролировать расходы.
— Данные по госномеру — очень хотелось бы помимо номера так-же получать подробные данные по госномеру.

И так, основные требования сформулированы. Можно начинать делать? Нет!
Не хочется городить велосипед ( совсем немного конечно хочется, все-таки будет свой родной, из костылей :-) ). Следующим делом стоит изучить рынок, понять что вообще предлагается в сфере видеонаблюдения конечному потребителю.


Часть третья. Анализ рынка. Поиск готовых решений.
Конечно, я сразу побежал гуглить. Сначала я был приятно удивлен, статей и информации на эту было достаточно.

Полный размерзапрос популярен, статей и предложений на рынке достаточно

Полностью готовые решения.
После радости сразу пришло разочарование. Я начал переходить по ссылкам, знакомиться с продуктами и что самое неприятное, их стоимостью. Не буду здесь приводить примеры конкретных продуктов и говорить почему они мне не подошли. В целом, претензии ко всем продуктам были идентичны.
— юзабилити продающего сайта. Да, это ужас. Словно подключился к интернету 2005 года. Подавляющее большинство сайтов были прямиком от туда. Данный факт не имеет прямой корреляции с качеством продукта. Но я был удивлен что в век цифровизации, компании которые продают системы видеонаблюдения или ПО к ним, совсем не думают о важности пользования сайтом.
— дизайн ПО. Примерно тоже самое что и сайт. Добавить особо нечего. ПО как и сайт написано в 2005 и с тех пор директора всех этих фирм запрещают обновлять интерфейс)) .
— закрытость рынка. Получить демку какого-то ПО это отдельная эпопея, нужно обязательно позвонить, написать в мессенджер, оставить заявку на сайте, написать на почту, станцевать танец и сделать жертвоприношение. В общем это лучшая практика чтобы вам никто не звонил и не писал. Отчасти я понимаю что данные системы нацелены на коммерческий сектор, а там высокая клиент-ориентированность не нужна. Торги выиграли и вперед монтировать камеры!

Тем не менее полезные выводы сделаны:
— ознакомившись с интерфейсом подобных программ начал вырисовываться и интерфейс моей системы. Определены основные блоки сайта.


Микросервисы
Теперь стоит посмотреть в сторону open-source решений касающихся распознавания номеров, конечно в первую очередь меня интересовала логика перехвата видеопотока с камеры и анализ картинки, поиск и распознавание российского гос. номера.
Погружаться в нейронные сети и машинное обучение мне не очень хотелось, это сильно замедлит разработку.
Поискав по интернету нашел несколько неплохих по описанию решений. Отфильтровав самые живые в плане комьюнити и апдейтов я решил протестировать Nomeroff Net
Nomeroff Net — это опенсорсный фрейморк написанный на питоне для распознавания номеров автомобилей.
Писать о разворачивании сервера, настройке и установке фреймворка не буду. Статей на эту тему достаточно, для разных уровней пользователей.
По результатам — номер определяется достаточно плохо. Возможно стоит поковырять настройки, но мне этого делать не хотелось т.к на мой взгляд фреймворк из коробки не справился даже с хорошим примером.
На скриншоте вы можете видеть фото с номером, которое я отдал программе и его результат распознавания.

пример распознавания с помощью nomeroff net

Тестирование сторонних сервисов.
Собираю различные изображения из интернета, дополнительно самостоятельно делаю фото на камеру телефона/фотоаппарата и отправляю их в сторонние сервисы распознавания. Здесь показывать нечего, работает все на порядок лучше и стабильнее, дополнительным плюсом является что в будущем я уменьшу возможную нагрузку на свои сервера.
Цены разные, самый дорогой что я нашел — 20рублей за одно распознавание.

Часть третья. Обработка видеопотока.
Разобрать номер на изображении это конечно хорошо, но для начала изображение необходимо получить. Первой моей мыслью было напрямую подключаться к камере, каково было мое удивление что ip-камера xiaomi не имеет популярного rtsp протокола для прямого подключения. Что делать? Пришлось прошивать. Кажется бренд xiaomi создан для того, чтобы после покупки его еще приходилось дорабатывать.
Прошивка установлена! Что дальше? Дальше настраиваем подключение к камере и понимаем что качество камеры не позволит нам разбирать номера автомобилей. Почему я не задался этим вопросом раньше? Я держал этот риск в голове изначально. Поэтому в первую очередь меня интересовала логика взаимодействия между узлами системы.
Таким образом первый тестовый стенд распознавания номером выглядел следующим образом:
Ip-камера стоит на столе и направленна на монитор пк где открыты найденные в интернете фотографии различных автомобилей с российскими номерами.

тестовый стенд распознавания номеров

Написал небольшой скрипт на питоне. Он подключался по rtsp протоколу к моей камере, сохранял кадр в формате изображения и передавал в описанный выше фреймворк для распознавания. По результатам я понял что оно работает. Необходимо улучшить качество распознавания, для этого необходимо:
— настроить фреймворк или отдать весь процесс внешним сервисам
— сменить камеру для более качественной картинки

Примерную логику работы системы я отобразил на схеме:

ИТОГИ
Идея приобрела формализованный статус и перешла в небольшой хобби-проект. Я понял примерный объем работ. Проведены первые тестовые испытания.
Напишите в комментариях если к данному проекту у вас будет интерес. В следующей части я напишу о том какие изменения я решил внести в логику системы и почему. Опишу как проходила разработка дизайна и подбор оборудования.
p/s на текущий момент система мной написана функционирует в бета режиме.

Про ip-камеру и бабушку

Вчера подруга рассказала, как недавно с дочерью ездили в отпуск и попросили милейшую бабушку-соседку заходить к ним в квартиру кормить кошку. Дома у них есть ip-камера, к которой девчонки периодически подключались, посмотреть на любимицу. Как-то раз, дочка, особенно соскучившись по кошке, решила с ней пообщаться, включила динамик камеры, и позвала: "Буся-Буся, иди сюда". И тут видит, как в комнату на всех парах влетает с выпученными глазами соседка. Оказалось, она в это время мыла в ванной миску, услышала в комнате голос: "Бабуся, иди сюда" и страшно перепугалась, подумала, что кошка заговорила...

Вот так от некоторых благ прогресса кондрашка может хватить.

Самый простой способ разместить IP-камеру на сайте в 2022 году

В чем главная проблема современных недорогих IP-камер? Вы не можете просто так добавить их на свой сайт! Они выдают видео совсем не в том формате, который понимают браузеры. Да, конечно, можно зайти напрямую на камеру (и часто только с IE), и у многих моделей есть «облако». Но проблема остается — я не могу просто так взять и поместить камеру на сайт, как например, простую картинку!


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

Ключевые особенности и преимущества данной программы:


1.Ориентированность на бесперебойность работы. Если процесс трансляции (FFMpeg) неожиданно завершается, то программа это обнаружит и попытается его перезапустить. Плеер на стороне клиента также периодически проверяет, не остановилось ли видео, и если да – попытается это исправить.


2.Максимальная экономия трафика, подходит для 3G/4G. Когда нет активных зрителей, все процессы FFMpeg будут остановлены автоматически – т.е. программа не будет забирать видеопоток с камер. Также предусмотрено кэширование захваченных статических снимков, по умолчанию время хранения в кэше равно одной минуте. В случае одновременных запросов снимка с одной камеры с разных клиентских устройств будет запущен только один процесс FFMpeg.


3.Нетребовательность к «железу». 20-30 камер вполне будут работать на компьютере с 4 ГБ оперативки и средним двухъядерным процессором. Никакого перекодирования видеопотока не происходит.


4.В отличии от моего предыдущего проекта, эта программа способна транслировать видео большему количеству зрителей. Точное число зависит от ширины исходящего интернет-канала сервера.


5.Максимально возможная простота. Один мой друг любит говорить, что «простота хуже воровства». Но только не в сфере ИТ! В современном мире мало у кого есть лишнее время, чтобы разобраться с той или иной программой, а особенно, с «полуфабрикатами». То, что предлагаю я вам – полностью готовое решение с минимумом настроек. Просто пропишите RTSP-ссылки к вашим камерам, задайте пару общих параметров и получите веб-ссылки на камеры! Разве что сертификат SSL вам придется получить самостоятельно (была мысль встроить Let’s Encrypt в программу, но не было времени – может это сделает кто-нибудь из вас).


6.Кроссплатформенность. Благодаря среде .NET Core я смог скомпилировать программу-сервер под две 64-битные платформы: Windows и Linux. Что касается Linux, я ориентировался на Debian и Ubuntu, работу на других дистрибутивах не могу гарантировать. Конфигуратор, к сожалению, написан на обычном .NET Framework, и будет доступен только под Windows. Надеюсь, это не доставит вам заметных неудобств.


Слабые стороны:


1.Видео воспроизводится с ощутимой задержкой. Это особенность технологии HTTP Live Streaming (HLS). Так, если интервал I-кадров равен четырехкратной частоте кадров, а количество сегментов в плейлисте равно трем, то задержка (расхождение с реальным временем) составит около 12 секунд. Применить технологию Low Latency HLS мне не удалось.


2.Под Linux в консоль запущенной программы попадают строки от FFMpeg, этот вопрос я не

смог решить. Знаю, что можно как-то через xterm сделать, но нет гарантии, что на вашем компьютере он будет присутствовать.


3.Программой используется FFMpeg со статически слинкованными библиотеками. Это негативно сказывается на расходе оперативной памяти, если камер много (и соответственно, много одновременно работающих процессов FFMpeg). Но вы всегда можете заменить FFMpeg на нужный вам билд со всеми оптимизациями. А пользователи Linux могут заменить файл "ffmpeg-linux64" на символическую ссылку на системный FFMpeg. У меня же в приоритете была надежность запуска, да и времени на такого рода оптимизации нет — этим мой выбор и обусловлен.


Поддерживаемые камеры – практически любые, способные выдавать H.264 поток по протоколу RTSP. Если ваша камера умеет H.265, то вам нужно переключить ее в H.264, так как сервер не осуществляет перекодирование, а большинство браузеров пока «не умеют» новый формат. Надеюсь, это временно, и когда-нибудь можно будет вернуть обратно. Также можно оставить основной поток в H.265, а дополнительный сделать в H.264 и тогда в Конфигураторе указывать ссылку на него. Сохранится и возможность воспроизведения браузерами, и хорошее качество записи на диск (если требуется).


Установка и настройка:


1.Распаковываем программу в нужное вам место. Программа после запуска должна иметь возможность писать в свою вложенную папку data (да, не самое лучшее решение, я знаю), поэтому проверьте права на запись в нее.


2.Определитесь, будете ли вы использовать SSL-сертификат. Если да (строго рекомендую), то получаете сертификат на свое доменное имя и устанавливаете:

a.Для формата PEM: разместите файлы сертификата под именами cert.pem и privkey.pem в подпапке data.

b.Для формата PFX: разместите сертификат под именем cert.pfx в подпапке data (в случае использования обоих форматов приоритет отдается PEM).

c.Иные форматы: не поддерживаются, требуется конвертация (например, через программу OpenSSL).


3.Запускаем Конфигуратор файлом "Configurator.exe". Если сервер не на Windows, то вам придется скопировать Конфигуратор на соответствующий компьютер, там настроить и скопировать конфиг "data/config.xml" на сервер. Также можно расшарить папку с файлами программы по сети и запускать Конфигуратор из нее – этот способ использую я сам.


4.Добавляем камеры, прописываем RTSP-ссылки. Придумываем секретный общий ключ из латинских букв и цифр, указываем адрес сервера (необязательно в случае «просто посмотреть, протестировать»). Если используется SSL сертификат – включите защищенное соединение галочкой. Если вы используете сертификат формата PFX, то укажите пароль на него.


5.Копируем себе ссылки на камеры из поля в нижней части окна Конфигуратора.


6.Запускаем серверную часть файлом RTSP2HLS.exe (Windows) или RTSP2HLS (Linux). Оба варианта являются консольной программой.


7.Если целью установки программы не было тестирование, то скорее всего вам придется пробросить порты на роутере, чтобы сервер был виден из интернета (по умолчанию используется порт tcp/8000, его лучше изменить в Конфигураторе). А также добавить сервер в автозагрузку. Здесь вам придется действовать самим.


8.Готово – теперь вы можете смотреть камеры в браузере по тем ссылкам, которые вы скопировали в п.5.


Важное замечание – внесенные в Конфигураторе изменения вступают в силу только после перезапуска программы-сервера. Кстати, сам Конфигуратор требует для своего запуска платформу .NET Framework 4.0 или выше.


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


•Увеличьте число сегментов в плейлисте в Конфигураторе. Внимание – это увеличит задержку воспроизведения, видео будет отставать от реального времени сильнее.


•Проверьте настройки своей камеры – интервал ключевого кадра (интервал I-кадра) рекомендуется выставить равным N помноженное на частоту кадров, где N – число от 2 до 6. Если снимаемая сцена в основном статична (т.е. в кадре мало движения), то большие значения N заодно повысят ее качество. Параметр также влияет на задержку видео, плюс увеличивает время захвата снимка.


•Отключите функцию поддержки перемотки видео (в Конфигураторе).


Также программа-сервер умеет выдавать снимки с видеокамер. Для этого в ссылках, полученных из Конфигуратора, замените слово player на image. Открыв такую ссылку в браузере, вы увидите снимок в формате JPEG, его можно использовать в качестве превью на вашем сайте.


Ну а дальше все зависит только от ваших желаний.


Дистрибутив программы: https://github.com/carpediem-av/rtsp2hls/releases

Исходники программы: https://github.com/carpediem-av/rtsp2hls

Страничка автора (меня): http://carpediem.0fees.us

Fastler - информационно-развлекательное сообщество которое объединяет людей с различными интересами. Пользователи выкладывают свои посты и лучшие из них попадают в горячее.

Контакты

© Fastler v 2.0.2, 2022


Мы в социальных сетях: