Серия «распознавание номеров»

53

Ч.4 Я снова сделал систему распознавания номеров. Как работает детектор⁠⁠

Серия распознавание номеров

Предыдущие части: Часть 1 | Часть 2 | Часть 3

Привет!

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

Спойлер: я изобрел велосипед, но сам!

Спойлер 2: Система еще на этапе разработки, пока только делюсь с вами процессом.

Как это всё начиналось — версия 2022 года

Моя первая система распознавания номеров работала по совершенно другому принципу. Камера сама должна была поймать момент — по детекции движения, по пересечению линии, по любому встроенному триггеру — и отправить готовый кадр в систему, например по FTP. Система видела новый файл и пыталась найти на нём номер.

В целом выглядит логично. На практике — куча ограничений:

Не каждая камера умеет автоматически определять транспортное средство из коробки. Настройка FTP на камере c кривой прошивкой — это отдельный квест.


У серьёзных брендов всё это есть, но мой проект был рассчитан на сегмент попроще, где камера с AliExpress. С непонятной прошивкой)

Там никакого FTP нет а если есть, работает по настроению. Кстати у меня как раз такая камера)

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

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

Так я пришёл к связке YOLOv8 + ByteTrack + OCR для номеров. YOLOv8 находит автомобили в кадре, ByteTrack следит за каждым из них как за отдельным объектом, OCR(оптическое распознавание символов c кадра) читает номер.

Архитектуру я продумал заранее. А вот с реализацией — всё оказалось сложнее, чем казалось.

Первый запуск. Первое видео

У меня не было реального RTSP-потока для тестов. Пришлось скачивать видео с YouTube — записи с трасс, парковок, перекрёстков. Качество разное, углы обзора разные, трафик машин разный.

Я не стал хвататься за всё сразу. Решил начать с того что казалось самым сложным — видео с трассы. Камера специально установлена для фиксации номеров, машины едут под одним углом, номер всегда в кадре, никаких засветок. Идеально сложные условия, как мне тогда казалось. Отрезок на распознавание небольшой, скорость у машин высокая.

Запустил. В логах поплыли результаты распознавания. "УРА!" — подумал я. Проект закончен, я молодец.

Потом открыл папку с сохранёнными кадрами...

кадр где видно только бампер въезжающей машины

кадр где видно только бампер въезжающей машины

Система радостно фиксировала каждую машину в момент когда та только появлялась в кадре. На фото — наверное 20% автомобиля, остальное за краем экрана. Я-то понимаю что это машина и что она сейчас въедет полностью, и можно поймать более удачный кадр. Система — нет. Только увидела авто — сохранила.

Проблема первая: кадр слишком ранний

Решение: не сохранять сразу. Вместо этого — собрать несколько кадров пока машина в кадре, дождаться пока она уедет, и только потом выбрать лучший.

Но какой кадр лучший? Первое что пришло в голову — тот где машина занимает наибольшую площадь в кадре. Больше площадь — машина ближе, номер крупнее, читать легче.

Так появилась первая переменная в коде:

BEST_FRAME_WINDOW — сколько кадров собрать для анализа

Стало лучше. Но не идеально. Машина "максимально" в кадре, но номер плохо читаемый, вот бы захватить кадр чуть-чуть раньше....

Проблема вторая: кадр большой, но неудачный

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

Тут я вспомнил что OCR-движок вместе с результатом отдаёт уверенность — число в диапазоне от 0 до 1 насколько он сам уверен в своём ответе.

Теперь правлю логику: если система несколько раз попробовала распознать номер(помним про BEST_FRAME_WINDOW ) и получила результаты с разной уверенностью — берём тот где уверенность выше.

Теперь логика выбора кадра стала такой: не просто "наибольшая площадь", а "наибольшая уверенность OCR". Если OCR вообще не сработал ни на одном кадре — тогда fallback на наибольшую площадь.

Появилась ещё одна переменная:

RECOGNIZE_INTERVAL — OCR запускается раз в N кадров

система делает несколько снимков одного ТС и в данному примере выберет второй кадр из карусели.

Парковка и пробка — где всё сломалось и перестало работать

Трасса оказалась самым простым случаем. Машины едут быстро, в кадре недолго, в кадре одновременно 2-3 штуки максимум. Номер всегда видно.

Настоящий ад начался когда я взял видео с парковки.

Парковка: машина стоит и это проблема

Попробуйте угадать что произошло. Подсказка: машина стоит на парковке и никуда не едет.

Правильно — система начала генерировать события на одно и то же стоящее авто каждые несколько секунд. Стоит машина час — получите пару сотен событий на один и тот же номер. Стоит сутки — ну вы поняли...

Решение: кулдаун. После того как событие зафиксировано, на этом номере N секунд тишины.

COOLDOWN_SECONDS — пауза между повторными записями одного и того же номера

Особенно актуально для пробок и перекрёстков — там машина может стоять в кадре несколько минут, медленно ехать, снова стоять и так далее.

Пробка: всё сложно одновременно

Видео с пробкой стало главным экзаменом. Несколько полос, машины едут медленно, некоторые стоят, номер то видно то не видно — водитель прижался к переднему авто и номер перекрыт на всё время пока машина в кадре.

И главная проблема с которой я столкнулся сразу: когда две машины в кадре одновременно, распознавался только один номер.

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

Режимы: single и multi

Single — для сценариев где в кадре одна машина: ворота, въезд, автосервис. Меньше нагрузка на систему, логика проще.

Multi — для потока: дорога, парковка, пробка. Здесь будет задействован ByteTrack — каждой машине присваивается уникальный ID и система следит за каждым авто независимо.

Добавляю очередные параметры в систему:

DETECTION_MODE — single или multi

DISAPPEAR_FRAMES — сколько кадров машина должна отсутствовать чтобы считаться уехавшей из кадра и начать распознавание.

В multi-режиме каждая машина живёт в своём "треке" — система помнит её историю, лучший кадр, лучший результат OCR, и ждёт финала когда машина уедет.

Триггерная зона: подсказываем системе где смотреть

Работая с тестовыми видео я заметил закономерность: номер у машины становится хорошо виден примерно в одной и той же области кадра. Зависит от угла установки камеры, но зону как правило можно определить.

Незачем гонять OCR на весь кадр всё время. Можно заранее сказать системе: "смотри только вот в этой области". Если машина туда ещё не въехала или уже выехала — OCR не запускаем.

Новые параметры:

TRIGGER_ZONE_TOP — верхняя граница зоны (доля высоты кадра, 0.0–1.0)

TRIGGER_ZONE_BOTTOM — нижняя граница зоны

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

интерфейс выбора зоны распознавания

интерфейс выбора зоны распознавания

Streak и ранее сохранение: не ждём вечно

Ещё одна история из пробки. Система честно ждала пока машина уедет из кадра, и только потом финализировала событие. Логика правильная — но на практике машина в пробке в кадре может ехать три минуты или десят. Все это время ждать результата?

Решение: если система несколько раз подряд распознала у конкретной машины одинаковый номер — считаем что мы уже знаем ответ, и незачем ждать пока машина уедет. Сохраняем сразу.

Пример: машина едет в пробке, номер периодически появляется в зоне. Система пытается его прочитать каждые несколько кадров и получает вот такую картину:

Несколько раз подряд один и тот же номер — streak набран. Система не ждёт пока машина уедет за кадр, она уже уверена в ответе. Событие сохраняется прямо сейчас, с кадра №3 где уверенность максимальная.

А вот другой сценарий — номер то появляется, то перекрывается соседним авто:

На второй попытке номер считался неполностью — streak сбросился. Счётчик начинается заново с попытки №3. На попытке №4 снова два совпадения подряд — сохраняем событие

Это называется streak — серия одинаковых результатов подряд. Набрали нужное количество совпадений, достигли нужного уровня уверенности — "отпускаем" машину не дожидаясь её физического ухода из кадра.

Новая переменная:

PLATE_CONFIRM_COUNT — сколько одинаковых OCR-результатов подряд нужно

для уверенного распознавания

Пресеты: чтобы не настраивать каждый раз вручную

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

Трасса — машины быстрые, нужен маленький DISAPPEAR_FRAMES.

Ворота — одна медленная машина, совсем другая логика.

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

В интерфейсе это выглядит так — при добавлении камеры выбираешь шаблон и получаешь готовый набор настроек. Потом можно докрутить вручную если нужно.

Пример выбора пресета

Пример выбора пресета

Схема логики детектора

Чтобы было понятнее как всё это работает вместе — вот упрощённая схема.

Некоторые детали реализации я намеренно оставляю за кадром — возможно из этого получится коммерческий проект, и полная инструкция по сборке в статье ни к чему :)

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

Что в итоге

Я не смог найти подробных примеров того, как работают такие системы и придумал свой велосипед. Уверен, что можно лучше и знаю что в комментариях вы мне подскажете что поправить.
Детектор прошёл долгий путь от глупого бесконечного поиска номеров в каждом кадре до системы с трекингом, фоновым OCR, триггерными зонами и автоматическим выбором лучшего момента для сохранения.

Каждая переменная — это конкретная проблема которую я встретил в ходе разработки. Не наугад , а именно: "вот кривое распознавание, вот так можно починить, вот ручка/переменная чтобы можно было отрегулировать".

Показать полностью 11
914

Ч.3 Я снова сделал систему распознавания номеров. Или почти⁠⁠

Серия распознавание номеров

Всем привет!

Если вы читали мои статьи 2022 года — вы знаете эту историю. Если нет — краткое содержание: Я IT-шник, у меня случайно появилась ip-камера, думал что с ней сделать, прикрутил к ней распознавание номеров и установил на подоконник следить за парковкой, написал об этом статью "для себя", и неожиданно получил отклик сообщества.

Мои старые статьи:
Первая часть
Вторая часть


Это было приятно. Я не ожидал.

Потом проект тихо умер.

Нет, не из-за какой-то конкретной причины. Просто я сделал что хотел — система работала, номера читала, ворота открывались. Задача выполнена. Развивать дальше не стал. Сначала я отключил из розетки Raspberry PI, потом в дождь зависла камера, отключил и её. Raspberry PI я отформатировал спустя время уже под другой проект. Код лежал где-то на диске, покрывался пылью, и в какой-то момент просто... потерялся.

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

А люди всё равно писали. Периодически в личку прилетало что-то вроде "а проект ещё живой?". Я честно отвечал: нет, заброшен, RIP. При этом чувствовал лёгкую вину.

Так прошло почти четыре года.

Идея не отпускала


"Попробовать ещё раз" — эта мысль возвращалась регулярно. Но была одна проблема: я не понимал как сделать хорошо. Просто повторить то же самое — смысла нет. Сделать лучше — а что значит лучше? Все-таки это не совсем не мое направление деятельности, я не разбираюсь в видеонаблюдении. Никогда не пользовался подобным софтом, чтобы посмотреть как оно сделано у больших компаний. Мой максимум, связанный с распознаванием номеров - это фото штрафа на госуслугуах с моим авто)))

За четыре года я стал заметно опытнее в IT-инфраструктуре. И в какой-то момент картинка в голове наконец сложилась — я понял что хочу сделать и примерно представлял как.

Так что я сел и написал это заново. С нуля.

Зачем это нужно дома или в небольшом бизнесе
Если вы первый раз слышите о распознавании номеров — давайте разберёмся зачем это вообще нужно дома или в небольшом бизнесе. Когда мне писали с вопросом "жив ли проект" я иногда так-же спрашивал какой вариант использования их интересует. Таким образом, хоть немного появилось понимание того, что нужно сделать.

Сценарии на самом деле очень разные:

  • Въезд во двор или на парковку. Камера видит машину, читает номер, открывает шлагбаум или ворота. Никаких брелоков, никаких карточек — свои заехали, чужие нет.

  • Автосервис или автомойка. Машина въезжает — система фиксирует номер и время. Никто ничего не записывает вручную, история въездов всегда под рукой.

  • "Умное" Видеонаблюдение. Камера на воротах дачи или во дворе — хочется знать какие машины приезжали, когда и сколько раз, без просмотра часов записи.

Звучит как что-то дорогое и корпоративное? В этом и была идея — сделать так, чтобы это мог установить любой человек у себя дома за разумные деньги и без специальных знаний.

Как это устроено


Логика работы моей системы простая:

упрощенная схема логики работы системы

упрощенная схема логики работы системы

Система состоит из нескольких частей.

  • Камера — обычная IP-камера с RTSP-потоком. Никакого специального железа, подойдёт любая приличная камера за 3–10 тысяч рублей. Главное — нормальный поток и видимость номерного знака. Место установки играет очень важную роль.

  • Детектор — локальный сервис, который смотрит в камеру и думает. Для каждой камеры — отдельный детектор. Внутри работает YOLOv8, нейросеть, которая находит автомобили в кадре. Когда машина найдена — в дело вступает распознавание номера. В первой версии 2022 года это делал облачный сервис, сейчас всё работает локально.

  • База данных — все события, номера и фотографии хранятся у вас. Никуда не отправляется.

  • Веб-интерфейс — открываете браузер, заходите на локальный адрес, видите ленту событий, историю, настройки. Работает с телефона и компьютера, никакой установки приложений.

Всё это поднимается через Docker Compose одной командой. Установка занимает минуты, не часы. Да, если вы только только освоили смену шрифта в Word - будет сложно.

простой запуск с использованием docker compose

простой запуск с использованием docker compose

Что умеет система


Лента событий. Главная страница. Каждое событие: фотография машины, распознанный номер, уверенность распознавания в процентах, время, камера. Лента обновляется в реальном времени, новые события появляются сверху без перезагрузки страницы.

Главная страница с лентой событий

Главная страница с лентой событий

История событий. Полная история с фильтрами: по номеру (работает частичный поиск), по дате, по камере, по типу транспорта. Выгружается в CSV — открывается в Excel.

страница событий

страница событий

Профили детектора. Это одна из вещей, которой не было в первой версии. Разные сценарии требуют разных настроек — машина едет через шлагбаум со скоростью 5 км/ч и машина на трассе делают 90 км/ч — совсем разные истории. Когда я тестировал детектор на разных видео, то понял: универсального подхода нет. Код обрастал переменными, и я сгруппировал их в готовые профили.

  • Въезд / Ворота — медленный подъезд, одна машина в кадре.

  • Парковка — машина может долго стоять, не нужно получать сотни одинаковых событий.

  • Трасса — быстрое движение, нужна быстрая реакция а требования к распознаванию можно снизить.

  • Пробка / Перекрёсток — много машин одновременно, едут медленно.

Выбираете профиль под ваш случай — система настраивается автоматически. Хотите покрутить параметры вручную — можно.

Два режима работы


Автоматический — детектор непрерывно смотрит в камеру. Увидел машину — проанализировал — сохранил событие. Подходит для въезда, парковки, любого места где нужна непрерывная фиксация.

Ручной — детектор пассивен, держит актуальный снимок с камеры. Событие создаётся только когда оператор нажимает кнопку. Удобно там, где оператор и так видит машину — например на проходной.

Где взять машины если машин нет


Казалось бы, написал детектор — теперь нужно его проверить. Берёшь камеру, смотришь на дорогу, смотришь как система работает. Всё просто.

Только вот камеру я давно отключил. А даже если бы включил — у меня во дворе поток машин такой что за день наберётся материала на пять минут тестирования. Не густо.

Окей, думаю — найду открытые RTSP-потоки с камер наблюдения где-нибудь в интернете. Трафик, парковки, въезды. Такое же есть, правда?

Есть. Но не то.

Нашёл несколько потоков с камер на трассах по всему миру. Машины есть. Но едут где-то на горизонте, номера в кадр не попадают вообще. Нашёл камеры в США — там отдельная история: во многих штатах передний номерной знак не обязателен. Камера стоит удачно, машины едут прямо на неё, угол хороший — а номеров спереди просто нет. У половины машин. Законно.

В итоге я пошёл на YouTube. Скачивал записи с пробками, парковками, хайвэями — и гонял их через детектор как видеофайлы. Это и стало моим полигоном. Немного криво, немного не то — но работало. Все шесть профилей настроек появились именно так, на чужих записях из интернета. Т.к под каждое новое видео мне приходилось постоянно менять множество значений переменных, я просто их сгруппировал и выбирал нужную группу при загрузке каждого отдельного видео.

Вот некоторые примеры того, как я тренировался:

Первое видео — с него начал:

Вариант с неподвижными машинами в кадре:

Пробка — много машин, едут медленно, номер то открывается, то перекрывается:

Проход по парковке:

Я показываю вам честно как оно есть, мой код не идеален. Есть ошибки. Но я еще веду разработку.

Community Edition — почему бесплатно


Я назвал бесплатную версию Community Edition. Не только потому что так принято, а потому что так понятно. Разработку я начал с полностью облачной версии, где вся система будет расположена на моих серверных мощностях, но пока временно ушел от этой реализации.

CE работает полностью локально. Никакого облака, никаких серверов на моей стороне, никакой подписки. Вы скачиваете, разворачиваете у себя, данные остаются у вас. Всё.

CE будет в открытом доступе (GitHub). Пока я дописываю документацию, провожу тесты и довожу до состояния, которое мне будет не стыдно показать.

Что дальше


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

Может ваша поддержка пополнит мои запасы энтузиазма. А может выяснится что тема уже никому не интересна — тоже полезно знать.

В следующей части разберём детектор изнутри: как YOLOv8 находит машины в кадре, почему распознавание номера — это отдельная и нетривиальная задача, и как система справляется когда в кадре одновременно пять машин. Будет скучно и много текста)

Еще, очень хочется придумать проекту имя и это неожиданно самая сложная задача.

Если есть вопросы или сценарий который хотите обсудить — пишите в комментарии. Читаю всё.

До встречи!

Показать полностью 4 4
768

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

Серия распознавание номеров

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

- Первая часть


Часть пятая. Поиск оборудования. Форм-фактор.
По предварительным испытаниям стало совершенно точно понятно, текущая ip-камера не подходит и необходимо что-то лучше.
Т.к у меня совершенно нет понимания, что происходит на рынке видеонаблюдения, я начал читать какие-есть типы камер и чем они отличаются.
Для начала расскажу вам какие типы камер бывают. Разделить можно на два основных раздела, это IP и Аналоговые камеры. Для себя я выбрал первый вариант по следующим причинам:
• Простота установки. Не требует дополнительного оборудования
• Настройки осуществляются в самой камере
• Возможность обработки видеопотока непосредственно на камере
Следующий момент — это форм-фактор. Не сказать, что для меня он играет важную роль, но мне бы хотелось иметь возможность установить камеру на улицу и иметь возможность легко выставлять кадр.


Корпусные камеры.
Пожалуй, самый классический форм-фактор — это «корпусные камеры». Это камеры, которые мы чаще всего представляем в своей голове. Пример на рисунке 1.


Купольные камеры
Думаю, каждый из нас встречал такие камеры в банках, торговых центрах и развлекательных комплексах.
Основной особенностью такого устройства корпуса является, что в случае вандальных действий будет сложнее «открутить голову», плюс не так просто в отличие от предыдущего типа определить, куда именно смотрит камера, например, чтобы выявить мертвые зоны. Пример на рисунке 2.


Купольная PTZ-камера.
Когда смотрел различные обзоры, часто встречал слово PTZ и не понимал, что оно означает. Рассказываю – это полный аналог купольной камеры, только поворотный механизм объектива управляется удаленно. Пример на рисунке 2.


Поворотная PTZ-камера
Форм-фактор здесь может быть различным, но главная функция — это удаленное управление поворотом камеры. Пример на рисунке 3.

Итак, для себя решил, мне подойдет классическая корпусная камера.


Часть шестая. Поиск оборудования. Функционал
Одной из основных задач моего проекта – обработка информации с камеры.
Первоочередно я искал камеры с поддержкой RTSP потока. Для начала я понял, что выбирать среди лидеров рынка оборудования видеонаблюдения я не буду, как бы странно это не звучало. Цены на оборудование бренда hikvision и прочих сильно противоречат одному из требований, оговоренных мною ранее – дешевизна решения. Стал искать среди популярных китайский брендов.
Составил для себя ТОП:
• Gadinan
• BOAVISION
• GCraftsman
• Reolink
Когда начал знакомиться с решениями данных производителей – был приятно удивлен, адекватные для домашнего сегмента цены и неплохие технические характеристики на бумаге. Но все мы с вами знаем о качестве китайского ПО – классные функции на бумаге легко разбиваются о бесконечные глюки и зависания)
Сравнивая различные модели, прочитав множество обзоров и отзывов на работу камер, я определил для себя бренд reolink. Меня очень привлек следующий функционал:
• Распознавание человека
• Распознавание автотранспорта
Возможность отправки уведомлений:
• Загрузка на FTP
• Отправка на email
По итогу я заказал себе камеру RLC-811A (на момент покупки цена 5900руб.)
Основные характеристики:
• POE
• 8MP
• ИК – подсветка
• Светодиодная подсветка
• Слот для SD-карты
• Пятикратный оптический зум
Камера в пути, тем временем продолжаю остальную подготовку.


Часть седьмая. Логика системы.
Теперь вводные немного изменились. Моя новая камера может самостоятельно определять автомобиль в кадре и отправлять уведомление на почту или FTP. Это снимает с меня необходимость в реальном времени самостоятельно обрабатывать видеопоток, теперь мне нужно обрабатывать входящие алерты (оповещения), которые мне отправит камера.
Тогда этапы взаимодействия в системе должны быть следующими:
1. Камера отправляет алерты на сервер(ftp) или почту
2. Моя система принимает входящие данные
3. Данные обрабатываются
Здесь стоит вспомнить еще об одном требовании, которое я для себя выставил – поддержка нескольких пользователей.
Значит необходимо продумать канал для передачи уведомлений. Я решил, у каждого пользователя должны быть свои собственные реквизиты, будь это директория и пользователь ftp или почтовый ящик для отправки.
Вариант с FTP я посчитал недостаточно безопасным. Email подходит намного лучше т.к позволяет гибко управлять настройками почтового ящика и обработкой писем.
У каждого пользователя может быть свой почтовый ящик, у кого-то mail.ru, кто-то пользуется gmail, yandex .и.т.д – при работе с каждым из этих провайдеров можно столкнутся с различными проблемами. Например, gmail с недавних пор вообще запретил подключать свою почту к различным умным устройствам и сторонним приложениям.
Придется создать свой почтовый сервер. При регистрации нового пользователя в системе ему должен быть автоматически создан почтовый ящик и предоставлены подробные настройки для камеры. Пользователь вводит данные настройки в камеру и теперь все уведомления отправляютcя через мой почтовый сервис, которым я могу гибко управлять.

Итак, новая схема теперь выглядит так:

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


Часть восьмая. Установка камеры.
Пришла долгожданная посылка! После домашней мини-камеры от xiaomi новая кажется гигантом.

Изначально я планировал питать камеру через PoE…


Проблема первая. Из коробки камера не запустилась. Как оказалось, мой роутер Микротик подает слабый вольтаж на PoE и необходимо сменить блок питания роутера. Т.к час был поздний и запустить камеру хотелось очень сильно, решил запитать камеру по отдельной выделенной линии питания, к счастью, в коробке с проводами( у всех же такая есть?) нашел подходящий блок питания на 12v.
Вставил витую пару, подключил питание и через пару секунд камера успешно запустилась. Фирменные приложения в телефоне и на компьютере уже были на готове, камера быстро нашлась в сети, и я успешно подключился.


Проблема вторая.
Камеру хотел установить на балконе, но в связи с проблемами питания тянуть два кабеля до балкона мне не хотелось, а на самом балконе розеток нет. Покупать новый блок питания для PoE я пока тоже не собирался. В итоге решил попробовать установить камеру на кухне, розеток там достаточно, но теперь проблема с доступом в сеть, тянуть витую пару по всей квартире тоже не хотелось.
К счастью, у меня валялось несколько сетевых железок, достал малютку mikrotik hap ac2.

Настроил микротик в режиме wifi-репитера и уже по витой паре от него раздал интернет на камеру. В итоге схема получилась следующей:

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

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

Белое пятно в верхнем левом углу изображения — это ик-светодиоды камеры. В итоге решено, камеру необходимо выводить на улицу.


Проблема четвертая.
При установке камеры, я понимал, скорее всего придется ещё много раз менять её положение и соответственно создавать крепеж «на века» пока не имеет смысл. Но задача крепко зафиксировать камеру на улице осталась.
Решил установить её на подоконник «вверх ногами», почему «вверх ногами»? Корпус предполагает, что такие камеры устанавливаются крепежом сверху или вертикально на стену, а в моем случае крепеж будет снизу.

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

Что за синие прямоугольники? Хороший вопрос))) т.к сверлить подоконник очень не хотелось, я воспользовался небольшими неодимовыми магнитами, держат они очень крепко, сложно снять уголок двумя руками. Магниты не находятся в близости к камере или проводам, так что каких-либо помех или проблем замечено не было.

Проблема пятая. Оборудование установлено, вроде работает. Проверяю качество картинки днем, с помощью зума – отлично! Номера прекрасно читаются

Но… наступает ночь и что я вижу – а ничего! Точнее видно все, кроме номеров. Ик-подсветка сделана у камеры на совесть и засвечивает номера превращая их в сплошной белый прямоугольник.

К такому, признаюсь, я совершено не был готов, идей не было. Пошел гуглить интернеты, основные советы – изменить источник ик-подсветки чтобы угол отражения был другим и не лупил прямиком обратно в объектив.
Я уже начал было собирать компоненты в голове для создания небольшого ик-фонаря, но еще подумав над возможными вариантами, решил попробовать снизить мощность этой подсветки. В очередной раз, в прямом смысле отодрав (помните про неодимовые магниты 😊 ) камеру с подоконника, изучил конструкцию подсветки. Она состоит из четырех отдельных ик-светодиодов, что ж, прекрасно! Берем непрозрачный скотч и просто заклеиваем три из них. Ставим все обратно, проверяем.

Готово! И так с камерой на текущем этапе разобрались (на самом деле есть еще одна серьёзная проблема, но о ней позже), теперь возвращаемся за компьютерный стол.

Часть седьмая. Разработка
Ниже будут скриншоты бета-версии сайта. На них возможны опечатки, неточности и на текущий момент некоторые элементы могут быть изменены и не соответствовать изображению.
Практически все этапы( тестирование, распознавание, подбор оборудования, продумывание логики и.т.д) я вел параллельно и соответственно понемногу писал сам сервис.
Что и как писать о разработке, не сильно уходя в программирование достаточно сложно. Я постараюсь писать так, чтобы обычный читатель понимал, о чем речь.
Первое – определить, где будет находиться сервер. Все тесты я проводил на своем домашнем сервере, который выступает у меня в роли файлохранилища и держит несколько сервисов. Но по ходу развития идеи понял, что возможно не я один буду пользоваться сервисом и решил отдалить его от домашней инфраструктуры и чувствительной для меня информации.
Особых требований к хостингу нет, подойдет практически любой. Я остановился на одном из популярных Российских хостеров.
Сразу оформил заказ на два сервера, один непосредственно для web-сервиса, второй для почтового сервера.
Ранее собранные в голове образы интерфейса системы пришлось обрисовать, получился такой шаблон:

Шутка, но она не далека от правды.

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

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

Еще один важный раздел сайта – Автомобили. Стоит понимать, один автомобиль может несколько раз попадать в поле зрения камеры, таким образом необходимо разделять сущности «алерт» и «автомобиль».
Один автомобиль может принадлежать к нескольким алертам. И если мы хотим увидеть историю автомобиля, для этого нам необходимо отталкиваться именно от автомобиля.

Страница настроек — это первое, куда должен отправиться пользователь после регистрации. Как я писал ранее, для каждого пользователя будет генерироваться персональный почтовый ящик.
Реквизиты доступа к ящику и остальные настройки, которые необходимо указать в камере – будут находиться на этой странице.

Также вы можете заметить поле «Часовой пояс», зачем? Т.к я писал систему с возможностью что ей будут пользоваться несколько человек необходимо понимать, что у каждого будет свой часовой пояс. И вся информация в системе должна отображаться с учетом часового пояса конечного пользователя.

Пример того, как функционирует система изображен на видео. Обновление данных и распознавание работает достаточно быстро.

Финишная прямая.
Статья получилась большой, но аккуратно разбить её я не смог. Надеюсь вам было интересно наблюдать за моим небольшим домашним проектом.
Выше я писал, что с камерой есть еще одна серьезная проблема. Я вам её покажу:

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


Полезная информация для самых терпеливых :)

Кому интересна данная система и кто хочет помочь в её развитии (желательно чтобы у вас была камера типа моей) — пишите мне в личку, будем тестировать вместе.
Также будет интересно услышать от вас, какое имя вы бы придумали для этой системы. Если оно мне понравится, возможно сервис будет назван вашим вариантом.

Показать полностью 21 1
1169

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

Серия распознавание номеров

Всем привет!


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 на текущий момент система мной написана функционирует в бета режиме.

Показать полностью 7
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества