1481

Ещё одно видеонаблюдение с AI и телегой

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

Покрутил-повертел проект автора, и понял, что тоже хочу подобное, но со своими свистелками, да ещё чтоб работало и на Windows, и на Linux. Я во всяких шарпах не очень, чтобы там асинхронный код отлаживать, поэтому на старом (но новом) добром C++ написал такую штуку, которая:

Берёт (почти) любой источник видео (можно скормить rtsp, а можно обычный видео файл - собственно, картинки в посте из видеофайла и взяты, чтобы не палить объект)

С помощью AI анализирует видео, и, если находит там человека, животное или автомобиль - шлёт в телеграм уведомление с картинкой, типа такого:

Ещё одно видеонаблюдение с AI и телегой Видеонаблюдение, Искусственный интеллект, Инструкция, Длиннопост

Нотификация о событии

Когда объект в кадре задетекчен - начинается запись видео, и оно пишется, пока объект не потеряется.

Когда видео файл записан - бот присылает в телегу раскадровку - чтобы одним взглядом было понятно, есть там что интересное или нет (это оказалось самой полезной фичей):

Ещё одно видеонаблюдение с AI и телегой Видеонаблюдение, Искусственный интеллект, Инструкция, Длиннопост

Под раскадровкой видео есть кнопка для скачивания. Размер указывается приблизительно, полное число мегабайт, просто для понимания, сколько это видео будет скачиваться

Умеет присылать список видеофайлов за последние сколько хочешь часов, а также раскадровки - также за настраиваемый период - удобно смотреть, что произошло, например, за ночь

Умеет просто прислать снимок с камеры в текущий момент, и всякое по мелочи - репорт состояния диска, и т.п.

Написано всё это счастье с использованием C++, OpenCV, и либы для телеграм-бота tgbot-cpp. Опирается на всё тот же CodeProject AI. Соответственно, всё кросс-платформенное.

Я у себя в гитхабе накомпилил под Windows, а под линукс/мак придётся самим собирать, но это довольно просто, там же на гитхабе есть и инструкция, и workflow-файл.

Как это можно заюзать для себя:

Качаем CodeProject AI server отсюда: https://www.codeproject.com/Articles/5322557/CodeProject-AI-Server-AI-the-easy-way и устанавливаем

Открываем в браузере консоль - http://localhost:32168/ - и устанавливаем модуль для распознавания YOLOv5 (можно выбрать какой подходит для вашей платформы - CUDA/не CUDA и пр)

Заводим телеграм-бота и запоминаем его токен

Качаем последний релиз из гитхаб: https://github.com/sergrt/CameraAiDetector/releases и распапковываем

Правим файл settings.json. Как минимум нужно настроить следующие параметры:

- source - источник данных. Вбиваем сюда адрес rtsp потока или путь к видео файлу

- storage_path - куда будут сохраняться снимки, видео, превьюшки и пр.

- bot_token - токен бота

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

Теперь можно попробовать запустить программу. Если будет ругаться на отсутствие библиотек C++, то их можно взять у Microsoft: https://aka.ms/vs/17/release/vc_redist.x64.exe

Если вам повезло и всё заработало, то теперь можно постучаться в телегу к боту и отправить ему /start. В ответ бот пришлёт главное меню, из которого, в общем, то всё понятно:

Ещё одно видеонаблюдение с AI и телегой Видеонаблюдение, Искусственный интеллект, Инструкция, Длиннопост

Основное меню бота

Все эти кнопки можно дублировать командами, список можно глянуть в описании проекта на гитхабе.

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

Узнать, сколько места осталось на диске можно командой "Статус".

Ну вот и всё. Код проекта полностью открыт и доступен здесь: https://github.com/sergrt/CameraAiDetector. Делайте со мной, делайте как я, делайте лучше меня :)

Автор поста оценил этот комментарий
Я вот тоже решил за квартирой следить, пошел в магаз и купил самую обычную ксяоми камеру. Обладает теми же функциями кроме раскадровки. Пишет видео как только замечен объект и шлет уведомление.
Для чего создавать программу если она есть даже в самой простой камере?
раскрыть ветку (1)
28
Автор поста оценил этот комментарий

Иногда можно сделать что-то просто потому, что интересно, прокачивает навыки или просто нравится. У меня сосед играет на пианино, несмотря на то, что Моцарт уже давно написал несколько концертов для фортепиано :)

показать ответы
1
Автор поста оценил этот комментарий
А зачем искусственный интеллект нужен? Я лет 10 назад иногда настраивал видеонаблюдение на объектах, так там регистратор начинал запись при движении в кадре. И никакого AI не надо было.
раскрыть ветку (1)
19
Автор поста оценил этот комментарий

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

показать ответы
0
Автор поста оценил этот комментарий

Очень круто! Спасибо! А есть ли подобные решения на пайтоне? Не встречали?

раскрыть ветку (1)
4
Автор поста оценил этот комментарий

Не встречал. Вообще посередине пути стало понятно, что такая система пишется сильно быстрее и проще на python - opencv доступен, телеграм-бот гораздо удобнее, сетевые запросы и разбор json приятнее... Хороший проект выходного дня.

показать ответы
0
Автор поста оценил этот комментарий

Вопрос по алгоритму. Вы говорите что запись прекращается как только объект пропадает из поля зрения. Какое-то демпфирование есть? Иначе будет резать куски постоянно, если объект ненадолго уйдет из поля зрения. То есть, если объект пропадает, то запускается таймер на 30сек, например, и если объект вернётся, то запись продолжается в тот же файл, иначе завершается. Не?

раскрыть ветку (1)
3
Автор поста оценил этот комментарий

Этот момент продуман :) В настройках есть параметр cooldown_write_time_ms - время (в мс), в течение которого продолжается запись после исчезновения объекта. Если объект вернётся в кадр - этот таймер сбрасывается, и заново запустится после следующего исчезновения. Поэтому запись оборвётся только когда в течение заданного времени в кадре ничего интересного не будет.

0
Автор поста оценил этот комментарий

у меня на слабом компе тоже такое пишет, но вроде отправляет фотки нормально

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Чтобы буфер не переполнялся на слабых пк можно увеличить значение nth_detect_frame - отправлять на AI например каждый 50 кадр (при потоке 25к/с это будет примерно раз в 2 секунды)

показать ответы
1
Автор поста оценил этот комментарий

Какие требования к железу? На OrangePI работать будет?

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

На средненьком десктопе нагрузка процессор незначительная, 3-5% и анализ кадра порядка 30 мс, а на Atom 2700 анализ кадра уже 5 секунд. Orange PI конечно помощнее, чем этот атом, но надо пробовать и возможно экспериментировать с настройками - как часто отправлять кадры на анализ, как масштабировать и пр.

0
Автор поста оценил этот комментарий

А оно умеет с usb камеры брать поток? Ну т.е. буквально с вебки.

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Нужен  поток кадров, под линуксом можно настроить RTSP сервер с помощью ffmpeg, тут лучше с гуглом проконсультироваться о деталях

показать ответы
0
Автор поста оценил этот комментарий

@cookierama здравствуйте, подскажите реагирует ли ИИ на ночные артефакты?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

ИИ реагирует на объекты и потому отсекает артефакты камеры, блики, тени и пр.

показать ответы
0
Автор поста оценил этот комментарий

CodeProjectAI обновился  до версии 2.5.1 и софт перестал работать, что то в новой версии изменили в АПИ , сволочи)

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Попробовал поставить. Пришлось переустановить нужные модули, но всё работает.

показать ответы
0
Автор поста оценил этот комментарий
@cookierama, не подскажите как в Core.cpp, строки 232 и 242, stop_.notify_all под 17 стандарт переделать. Я правильно понимаю что stop используется только как флаг для завершения потоков, он же не блокирует поток? Не пойму для чего notify_all.
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Можно убрать, это от старой системы синхронизации осталось, потом вычищу)

показать ответы
0
Автор поста оценил этот комментарий

Конфиг поменял, файлы CUDA распаковал с заменой,  приложение не стартует, либы cublas64_12.dll  нехватает

Иллюстрация к комментарию
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Не установлен пакет NVidia CUDA. Вообще на вашем мини-пк вряд ли установлена карта NVidia с поддержкой CUDA, поэтому можно просто поменять конфиг и не копировать либы - обработка будет на CPU

показать ответы
0
Автор поста оценил этот комментарий

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

Иллюстрация к комментарию
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Без доп настроек так и будет Codeproject AI использовать. Задайте в файле settings.json "use_codeproject_ai" : false и "onnx_file_path" : "yolov5s.onnx" - вот тут пример как они выглядят: https://github.com/sergrt/CameraAiDetector/blob/master/src/s...

С ботом таких проблем не испытывал

1
Автор поста оценил этот комментарий

есть миниПК Целерон J1900 4gb ddr3
Работа с одной камерой занимает 50% цпу и всю оперативку, но работает
Время обработки изображения 1700-2000мс судя по логам

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Я там выложил новый релиз - добавил ещё один AI бэкенд - OpenCV DNN (переключается в настройках). Можно с ним попробовать, взять yolov5n.onnx (поменьше которая), посмотреть, возможно будет лучше. Я сам пока детальных тестов не проводил

показать ответы
2
Автор поста оценил этот комментарий

Респект! Спасибо огромное за труды. Очень надо с такому функционалу прикрутить Ptz-управление. Если интересно, готов вознаградить за сотрудничество, доступ к оборудованию предоставлю.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

В каком-нибудь стартапе под это дело я б поучаствовал, а фрилансить функционал не очень хочется, сорян)

1
Автор поста оценил этот комментарий
Подскажите пожалуйста, что бы реализовать все что вы описали в после, нужно обладать знаниями программирования? Есть в наличии регистратор hiwision на 8 камер и свободный ПК под это дело. Знание на уровне системного администратора, в программирование к сожалению на нуле.
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Во второй части поста описано по шагам, как это можно заюзать для себя - там просто надо установить AI-сервер (он доступен для всех основных ОС, в т.ч. в докере), настроить бота и программу, и надеяться, что всё заработает ) поддержку нескольких камер в виде ключа командной строки скоро прикручу - #comment_285375982

0
Автор поста оценил этот комментарий

Я так понимаю, если надо смотреть несколько камер - будет разные директории с settings.json? Может добавить флаг чтобы указать файл с настройками?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Да, можно прикрутить флажок, сделаю на досуге

2
Автор поста оценил этот комментарий

Opencv работает через ffmpeg, а он в свою очередь может считывать почти любое видео, в том числе и с юзб камеры

Также в opencv уже давно нативно поддерживаются модели ML(opencv dnn), и нет необходимости в отдельном модуле ai

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Также в opencv уже давно нативно поддерживаются модели ML(opencv dnn), и нет необходимости в отдельном модуле ai

С этим собирался поиграть на досуге, посмотреть и посравнивать, интересует многое, в том числе перформанс. Если получится сделать автономное приложение - будет здорово

0
Автор поста оценил этот комментарий

Я тоже к камере во дворе на участке попробовал привинтить. В результате рукоятка от бетономешалки с вероятностью 40% явилась person) Сейчас с frigate'ом развлекаюсь. Там уровень геморроя с настройкой на порядок больше, конечно. Хотя и возможности тюнинга соответствующие. Отдельная боль - загрузка процессора. Для рабочего применения заказал pcie TPU модуль на али, надеюсь, поможет.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Мне кажется, именно поэтому в CodeprojectAI не сделали настройку по конкретным типам объектов. Нейросеть работает довольно интересно: она, судя по всему, сначала детектит что-то, а потом пытается сопоставить с объектом. В итоге если из списка объектов удалить, например, машины (car) - то машина детектится как, например, bottle. Возможно, надо поиграть с min_confidence.

0
Автор поста оценил этот комментарий

Ясно) А если не секрет, где стоит?

И извиняюсь, если показался навязчивым, просто обратная связь по факту тестирования.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Закрытый двор с подсобными помещениями

показать ответы
0
Автор поста оценил этот комментарий

Побаловался сегодня на разных камерах и выяснилось, и могу сказать, что для реального использования нужно вводить переменную, которая будет ограничивать реакцию, если вероятность распознавания ниже указанного порога. Без этого vehicl'ом определился шкаф, а табуретка - person. Это прям беда. Еще хорошо бы сделать отсеивание по признаку - например реагируем только на person. И еще интересно, со статическими объектами малой кровью можно что-то поделать? История - приехала машина, встала и пошел флуд в телегу..) Думаю, если удастся реализовать эти 4 хотелки (включая шатдаун оповещений), можно будет ставить в реальном видеонаблюдении. Пока же без наложения масок в самой камере настроить нереально, флудит постоянно. Либо фрагмент потока выделять для анализа, либо камеру еще ставить, четко настраивая на нужное место, где нет табуреток и не ставят машины. Но тут уже вся фишка ai теряется..

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Нет никакой задачи "ставить в реальном видеонаблюдении". Решалась конкретная задача. Кому-то подходит, кому-то надо другое решение.

показать ответы
0
Автор поста оценил этот комментарий

Было бы здорово прикрутить в команды бота возможность вкл/откл оповещения, чтобы при посещении, например, дачи, бот не флудил весь день в телегу. А в остальные дни следил за наличием супостата) В остальном - софт - огнище, спасибо!

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Работа в процессе, следите за обновлениями)

показать ответы
0
Автор поста оценил этот комментарий

На сильном ПК прога работает относительно хорошо удобно, но при попытке запустить на слабеньком компе
Практически всегда выскакивает ошибка
[h264 @ 000002147f859780] cabac decode of qscale diff failed at 15 2

[h264 @ 000002147f859780] error while decoding MB 15 2, bytestream -5
после неё идёт отвал потока, попытки переподключения, успешное подключение, снова отвал и так по кругу)

Причем иногда фотографии делаются и видосы пишутся, но чаще тг выглядит вот так.

Пробовал в конфиге менять кодеки с mp4v на acvl (указан в исходниках) безрезультатно)

Иллюстрация к комментарию
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Если компьютер не тянет обработку с AI, то тут можно только переключиться на режим простого детекта (Simple), или гибридный (HybridOpenCV / HybridCodeprojectAI). Волшебной настройки для внезапного ускорения не существует

показать ответы
0
Автор поста оценил этот комментарий

поставил, вроде работает(точнее работает частично, аи видео не пишет, но если просишь картинку с бота, он ее делает ), но мне кажется он пытается мне сказать что-то ) ? так ведь не должно быть

Иллюстрация к комментарию
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Буфер переполняется, вероятно, конфигурация компьютера (или настройки AI) не позволяет обрабатывать кадры в соответствии с заданными настройками

показать ответы
0
Автор поста оценил этот комментарий

Посмотрел реализацию, круто! Что тесты показывают? Извините за наглость, но можете бинарник собрать? ) Я все снёс и не хочется зависимости пересобирать, да и думаю, что ошибка у меня будет так же самая

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Совсем слабые системы не спасает, но в целом сильно легче для процессора, пока в кадре спокойствие или пишется видео. Бинари как раз залил, v0.0.7

показать ответы
0
Автор поста оценил этот комментарий

Спасибо за приложение! Крутое. Попробовал внести изменения, но не могу собрать проект, ругается на отсутствующий libcurl-d_imp.lib (хотя сборку делаю в релиз версии). Пробовал пересобирать всё в дебаг и релиз версиях, задавать пути в cmakelist явно, всё бестолку, не хватает опыта в плюсах. Собственно хотел внести изменения и проверить работу по такому алгоритму

1. Определяем движение в кадре по простому варианту работы

2. Если движение есть, то шлём кадр в детектор ИИ

3. Если ИИ видит что-то полезное, то начинаем писать видео

4. Пишем до тех пор, пока есть движение по простому варианту распознавания


Домашний сервер (мини пк) сильно молотит, если все кадры обрабатывать через в ИИ, а простой вариант по движению пишет и уведомляет о любых изменениях в кадре.

Попробуете реализовать такой вариант?.. Или если не сложно, то подскажите, что делаю не так при сборке проекта.

В любом случае спасибо за труды!

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

А это интересный вариант, попробую на днях реализовать

показать ответы
0
Автор поста оценил этот комментарий

А часть видеопотока обрезать можно? Когда нужен только тротуар без дороги и объектов на ней.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Можно, но для этого надо влезть в код и сделать так, как хочется

0
Автор поста оценил этот комментарий

Привет, вроде работает, обджекты тестит нормально, на лишние движения и тени не срабатывает
Но как и что нужно сделать что бы заработал  face proccessing? счётчик по нулям

Иллюстрация к комментарию
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

FaceProcessing это другой функционал, он не используется

показать ответы
Автор поста оценил этот комментарий

Автор перепутал пикабу с хабром?)

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

На хабр лучше бы что-то с техническими деталями)

0
Автор поста оценил этот комментарий

и еще этот путь смущает.у меня в системе нет такого диска и пути

Иллюстрация к комментарию
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Это нормально, путь указан в проекте, так репортит программа. Этот файл можно найти в исходниках, если что.

0
Автор поста оценил этот комментарий

переустановил все. так же не детектит.попробовал вручную фотку загнать в codeproject ai explorer - не определяет.спасибо за софт,но у меня к сожалению идеи кончились.поток при этом в hikconnect и в synology surveillance station работает.

Иллюстрация к комментарию
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Попробуйте на YOLOv5 .NET переключиться

показать ответы
1
Автор поста оценил этот комментарий

спасибо.бот работает.поток с камеры видит.не могли бы вы подсказать,с чем связаны такие предупреждения в консоли? детекция объектов не работает


20231003T181600.4618180 [WARN ] Buffer size exceeds max (500), delay capture
20231003T181601.4833028 [WARN ] Buffer size exceeds max (500), delay capture
20231003T181602.5041476 [WARN ] Buffer size exceeds max (500), delay capture
20231003T181603.5268033 [WARN ] Buffer size exceeds max (500), delay capture
[h264 @ 000001f52956cdc0] left block unavailable for requested intra mode
[h264 @ 000001f52956cdc0] error while decoding MB 0 17, bytestream 2881

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Кадры приходят, но есть проблемы с обработкой. Это скорее всего связано с CodeProject AI - посмотрите в консоли (http://localhost:32168/), что там происходит. Вообще чтобы вывести больше информации об ошибках, в файле настроек можно поставить "log_level" : "Trace"  - завалит сообщениями, но может быть удастся понять, что пошло не так.

показать ответы
0
Автор поста оценил этот комментарий

Под несколько камер надо дорабатывать

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

(или запускать несколько экземпляров программы)

показать ответы
0
Автор поста оценил этот комментарий

а несколько rtsp потоков с разных камер можно? или переписывать надо?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Под несколько камер надо дорабатывать

показать ответы