
Я живу один, и обычно знаю, кто может быть у меня дома. Но во время отъезда в голову иногда лезут неприятные мысли. «А вдруг кто-то всё-таки заходил, пока меня не было?». Это мог быть сосед, родственник или мастер, но без камеры остаётся только гадать.
И захотелось закрыть этот вопрос одним простеньким скриптом. Камера видит человека у двери, а в Telegram приходит сообщение и кадр. В процессе немного перестарался. Получился бот с поддержкой нескольких камер, тревогой, голосом, распознаванием лиц и возможностью вынести обработку данных на отдельный сервер.
В этой статье расскажу, зачем здесь вообще нужна YOLO и почему простого детектора движения оказалось мало. Как я проверял работоспособность проекта в реальных условиях, почему не отправляю в чат обычные фотографии людей и как организована приватность. А также как подключить телефон в качестве камеры и вынести тяжёлую обработку на удалённый сервер.
❯ Кто такой YOLO
You Only Look Once — YOLO.
Семейство моделей компьютерного зрения для поиска объектов на изображениях и видео. Первая модель появилась в 2015 году и изменила подход к детекции объектов. Вместо двух этапов «найти возможные области и классифицировать каждую» она за один запуск в сети предсказывала рамки объектов, их классы и уверенность в предсказании.
Технология постоянно развивается. Самые первые версии решали только примитивные задачи в определении объектов, но за 11 лет вышло множество версий, и технология далеко ушла вперёд.
|
|
||
|
Задача |
Что возвращает модель |
Пример применения |
|
Детекция объектов |
Ограничивающая рамка (x, y, ширина, высота), класс объекта, уверенность (confidence) |
Поиск людей/машин на кадре, подсчёт объектов |
|
Сегментация (instance segmentation) |
Точная пиксельная маска объекта + рамка + класс |
Измерение площади дефекта, разделение перекрывающихся объектов |
|
Pose estimation (оценка позы) |
Ключевые точки (например, 17 точек тела: нос, плечи, локти, колени, щиколотки) + рамка |
Анализ движений в спорте, фитнес‑трекинг, реабилитация |
|
OBB (Oriented Bounding Box) |
Повёрнутая рамка: центр (x, y), ширина, высота, угол поворота + класс |
Аэрофотосъёмка, спутниковые снимки, наклонные объекты на конвейере |
|
Трекинг |
ID объекта между кадрами + рамки/маски/ключевые точки |
Сопровождение человека в видеопотоке, подсчёт уникальных объектов |
Главное преимущество YOLO — это баланс скорости, точности и удобства. Поэтому её часто используют для камер, видеоаналитики, ритейла, спорта и контроля производства. YOLO хороша не потому, что всегда лучшая, а потому, что во многих реальных задачах её проще всего довести до работающего результата.
Популярность технологии в продакшене обеспечена тем, как развивался инструментарий вокруг неё. Раньше обучение детектора требовало долгой ручной компиляции Си-библиотек под архитектуру конкретной видеокарты. Современные версии семейства превратились в готовые Python-пакеты с минимальным порогом входа, поддерживающие экспорт в открытые форматы прямо из коробки.
Эволюция экосистемы и архитектур:
|
Поколение |
Год |
Создатели |
Что дало разработчикам |
|---|---|---|---|
|
YOLOv1 |
2015 |
Joseph Redmon |
Доказательство концепции детекции в 45 кадров в секунду на одном GPU. |
|
YOLOv2 |
2016 |
Joseph Redmon |
Стабилизация обучения благодаря Batch Normalization и ускоренный инференс. |
|
YOLOv3 |
2018 |
Joseph Redmon |
Качественный прорыв в поиске мелких объектов благодаря трём веткам детекции. |
|
YOLOv4 |
2020 |
Alexey Bochkovskiy |
Оптимальный набор методов аугментации данных (Bag of Freebies) для обучения на потребительских картах. |
|
YOLOv5 |
2020 |
Ultralytics |
Стандарт разметки TXT-файлами, нативный код PyTorch и удобный запуск дообучения в пару строк. |
|
YOLOv7 |
2022 |
C.-Y. Wang, A. Bochkovskiy |
Рекордное соотношение скорости и точности (mAP) на графических процессорах облачных серверов. |
|
YOLOv8 |
2023 |
Ultralytics |
Унификация всех задач машинного зрения под единую консольную команду и API. |
|
YOLOv10-v11 |
2024 |
Исследовательские группы |
Снижение задержки инференса (latency) за счет устранения шага NMS и оптимизации вычислений. |
YOLO на практике:
Розничная торговля и сетевой ритейл

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

На промышленных карьерах и стройплощадках модель могут встраивать в бортовые компьютеры карьерных самосвалов и экскаваторов. Камеры кругового обзора с легковесной версией YOLO Nano в реальном времени детектируют людей в жилетах, легковой транспорт и крупные валуны на пути тяжёлой техники. Бортовой терминал подаёт громкий звуковой сигнал водителю при опасном сближении, предотвращая наезды в условиях слепых зон зеркал и густой пыли.
Общественная безопасность

В системах общественной безопасности комплексы видеоаналитики на базе YOLO могут установить на автобусах и других городских транспортных средствах. Во время обычного рейса камеры анализируют окружающую обстановку, обнаруживают подозрительные действия, оставленные без присмотра предметы, конфликты, падения людей или проникновение в ограниченные зоны. Если система фиксирует потенциально опасное событие, она сохраняет фрагмент записи, определяет его координаты и передаёт уведомление оператору городского ситуационного центра для дальнейшей проверки.
Все предоставленные примеры лишь пример того, как можно использовать данную технологию.
Не всё так круто, как хотелось бы
|
|
|
Проблема смещения домена (domain shift): предобученная на датасете COCO модель отлично видит людей днём при хорошей погоде, но моментально слепнет в цехе металлургического завода при свете натриевых ламп и дыме, требуя сбора сотен собственных размеченных кадров. |
|
Сложность работы с окклюзиями: если один объект наполовину перекрыт другим (например, пешеход за столбом или коробка под другой коробкой), сеть часто теряет уверенность или путает класс предмета. |
|
Зависимость от разрешения входного тензора: чтобы найти мелкие детали на обзорной уличной панораме, приходится увеличивать размер входного изображения с 640 до 1280 пикселей, что квадратично роняет частоту кадров. |
|
Накопление ошибок трекинга: на сложных ракурсах временные трекеры вроде DeepSort или ByteTrack могут терять идентификатор человека при длительном перекрытии и присваивать ему новый номер после выхода из слепой зоны. |

Тем не менее в индустрии видеонаблюдения YOLO остаётся стандартом по умолчанию.
Она даёт готовую архитектурную базу, вокруг которой разработчик может за несколько дней собрать работающий конвейер от сбора видеопотока с RTSP-камеры до отправки алертов в базу данных
❯ DotEye: Охранник в Telegram
Telegram-бот, который следит за комнатой.
Включаешь режим охраны, подключаешь камеру, и бот начинает «охранять вашу комнату». Если в ней появляется человек, то приходит уведомление, что кто-то вошёл или вышел из кадра.
Сначала фото отправлялось при каждом движении, но это было ошибкой.
Движений было настолько много, что бот устраивал мне спам-атаку на ровном месте.
Поэтому я сделал так, что движение только будит детектор, а YOLO подтверждаёт вторжение человека в комнату. После этого IoU-трекер сопоставляет рамки между кадрами и не даёт боту спамить одинаковыми сообщениями.
В панели можно включить охрану, настроить тихие часы, выбрать модель, посмотреть состояние камеры. У каждой камеры могут быть свои настройки.

Есть и голосовой режим. При входе незнакомого человека бот может включить сирену и произнести заданную фразу через динамики компьютера. По умолчанию «Внимание, посторонний человек. Покиньте помещение!». В тихие часы обычные приветствия можно выключить, но тревогу оставить. Если распознавание лиц включено и камера узнаёт меня, тревога снимается. Если нет, то её можно снять кнопкой в чате.
Пикселизация фотографий
По умолчанию бот не отправляет в Telegram исходное фото с человеком. Каждое фото автоматически пикселизуется. Чтобы понять, что кто-то вошёл, мне не нужно видеть лицо. Исходный кадр остаётся на компьютере в зашифрованном виде и никуда не отправляется.
❯ Почему одного кадра недостаточно
YOLO смотрит на отдельный кадр. Но уведомление нужно не про кадр, а про событие во времени. Человек мог стоять у двери пять секунд, мог пройти мимо камеры или выйти и вернуться через минуту. Если не связать результаты между соседними кадрами, бот будет считать каждую новую рамку новым человеком.
Здесь работает IoU-трекер.
Он сравнивает, насколько текущая рамка пересекается с прошлой. Если пересечение большое, это тот же объект с прежним ID. Если появляется новая рамка, возникает вход. Если рамка пропала на заданное время, возникает выход. Это простая логика, но именно она убрала поток почти одинаковых фотографий из чата.
У такого подхода есть предел. Если человек полностью закрылся дверью или вышел из кадра, а потом сразу вернулся с другого края, трекер может дать новый ID. Для моего проекта это не критично. Важнее не потерять событие, чем идеально вести статистику перемещений.
Шалость удалась
Чтобы проверить функционал на практике, я попросил друга поучаствовать в небольшом эксперименте.
Утром включил охрану и ушёл, друг должен был зайти без предупреждения.
А так же он не знал, что там настроена звуковая система оповещений.

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

Шалость удалась. А я убедился, что бот действительно работает.
❯ Как запустить проект
Покажу пример, как запустить проект локально и на одном устройстве.
А после разберём как вынести основную нагрузку на отдельный сервер.
Локальный запуск
Не забудьте склонировать репозиторий перед работой.
Создаём виртуальное окружение и ставим зависимости:
python -m venv .venv
.venvScriptsactivate
pip install -r requirements.txt
Дальше копируем шаблон настроек:
cp .env.example .env
python -m doteye.crypto
Команда сгенерирует ключ шифрования. Его нужно записать в .env вместе с токеном бота и своим Telegram ID:
DOTEYE_BOT_TOKEN=<токен бота>
DOTEYE_ADMIN_IDS=<мой Telegram ID>
DOTEYE_CRYPTO_KEY=<сгенерированный ключ>у
Запуск бота:
python -m doteye.main
После старта бот присылает статус в Telegram. Там же открывайте /panel, подключайте камеру, включайте охрану и проверяйте, что бот работает.

Вместо камеры можно использовать телефон
Подключить можно встроенную веб-камеру, IP-камеру или телефон. Для Android достаточно приложения, которое отдаёт MJPEG или RTSP. Например, после запуска трансляции через приложение «IP Webcam» на экране появляется локальный адрес. Телефон и компьютер с ботом должны быть в одной сети.
Камеру можно добавить через интерфейс бота: «Панель -> Камера -> Изменить список камер». Или указать источник в настройках:
DOTEYE_CAMERA_SOURCE=http://192.168.1.40:8080/video
DOTEYE_ALLOWED_URL_HOSTS=192.168.1.40
Адрес выше примерный. У телефона будет свой IP, его и нужно подставить. Allowlist обязателен, это одна из базовых систем защиты. Если его не настроить, к серверу сможет подключиться любой, кто узнаёт адрес и порт.
❯ Как вынести обработку на сервер
На домашнем компьютере DotEye работает нормально, пока камер немного и процессора хватает. Но камера, Telegram-бот и инференс решают разные задачи.
Я захотел оставить камеру и управление дома, а YOLO вынести на отдельную машину.
Домашний компьютер продолжает читать поток камеры, хранить события и отправлять уведомления в Telegram. На сервер уходит зашифрованный JPEG-кадр, назад возвращаются только координаты рамок. Постоянный видеопоток на сервер не передаётся.
Создаём и настраиваем сервер
Для первого запуска я выбрал Timeweb Cloud и публичный IP-адрес. Это временный сценарий. Для постоянной работы лучше использовать домен и автоматически продлеваемый TLS-сертификат.
1. Регистрируем аккаунт в Timeweb Cloud и подтверждаю почту.
Переходим в Timeweb Cloud и создаём аккаунт. После регистрации открывается панель управления, из которой можно создавать серверы, управлять IP-адресами, SSH-ключами и правилами Cloud Firewall.

2. Пополняем баланс на нужную сумму.


3. В панели открываем «Облачные серверы» и нажимаю «Создать сервер».

4. Выбираем конфигурацию будущего сервера
В панели открываем раздел облачных серверов и нажимаем «Создать сервер». Выбираем чистый образ Ubuntu. Для этой инструкции используем Ubuntu 26.04 и локацию «Москва».
Сервер лучше размещать ближе к дому или месту, где работает камера. Это не ускорит YOLO само по себе, но уменьшит задержку между домашним DotEye и VPS.

С конфигурацией каждый решает под свои задачи. Мне будет достаточно этой:

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

Во вкладке «Безопасность» можете оставить настройки по умолчанию.

Всё, теперь жмём кнопку «Заказать» и ожидаем.
5. Подключаемся к серверу
На почту должно прийти письмо с данными для входа на сервер.

В дашборде копируем пароль от сервера, открываем консоль и подключаемся к серверу по SSH.
ssh root@<server_ip>
Если SSH-ключ был добавлен заранее, пароль не понадобится. Для постоянного сервера такой вариант предпочтительнее входа по паролю.
6. Подготавливаем сервер к remote-режиму
На этом шаге сервер уже создан, публичный IP сохранён, а SSH-сессия открыта. На этом этапе только подготовка. Устанавливаем Docker и копируем исходный код. Remote-сервер пока не запускаем, сертификат не выпускаем и настройки домашнего DotEye не меняем.
Обновляем список пакетов и устанавливаем Git с Docker:
apt update
apt install -y git ca-certificates curl
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
Проверяем, что Docker и Docker Compose доступны:
docker --version
docker compose version
Клонируем репозиторий DotEye:
git clone https://github.com/network-user/DotEye.git
cd DotEye
На этом подготовка VPS закончена. На сервере есть Docker, Docker Compose и исходный код проекта.
Запускаем remote-сервер
Remote-сервер использует два маршрута:
-
GET /health— отвечает, что сервис работает; -
POST /detect— принимает зашифрованный кадр и возвращает координаты найденных объектов.
Обычный HTTP для внешнего подключения не подходит. DotEye разрешает его только для localhost и режима разработки. Через remote передаются кадры помещения, поэтому сервер должен работать по HTTPS.
В каталоге проекта запускаем генератор конфигурации:
python3 deploy/deploy_remote.py
Генератор задаст вопросы.
-
DOTEYE_CRYPTO_KEY: Нажимаем Enter, чтобы создать новый ключ, и сохраняем его в менеджере секретов. Тот же ключ понадобится на домашней машине. -
Тип развёртывания: Выбираем
2– IP-адрес. -
IP: Вставляем публичный IPv4 VPS.
-
Выбираем устройство и модель: Для обычного VPS без NVIDIA GPU используем
cpuиyolov8n.pt.
Скрипт создаст deploy/.env.remote и deploy/docker-compose.remote.yml. В IP-режиме Compose уже содержит TLS-пути, порт 8099 и выбранную модель. Ручное редактирование конфигурации не требуется.
Теперь выпускаем самоподписанный сертификат. В subjectAltName обязательно указываем IP сервера: иначе клиент правильно откажется подключаться к сертификату.
mkdir -p deploy/tls
openssl req -x509 -newkey rsa:4096 -sha256 -nodes -days 365
-keyout deploy/tls/server.key
-out deploy/tls/server.crt
-subj "/CN=<IP_СЕРВЕРА>"
-addext "subjectAltName = IP:<IP_СЕРВЕРА>"
Запускаем remote-сервис:
chown root:1000 deploy/tls/server.key
chmod 640 deploy/tls/server.key
chmod 644 deploy/tls/server.crt
docker compose -f deploy/docker-compose.remote.yml up -d --build
docker compose -f deploy/docker-compose.remote.yml ps
В Cloud Firewall добавляем входящее правило для TCP-порта 8099. Если домашнее подключение использует постоянный внешний IP, ограничиваем источником только его. При динамическом IP порт придётся открыть шире, поэтому особенно важно не отключать TLS-проверку и не передавать DOTEYE_CRYPTO_KEY третьим лицам.
Приватный server.key остаётся на VPS. На домашний компьютер копируем только публичный сертификат:
mkdir -p certs
scp root@<IP_СЕРВЕРА>:/root/DotEye/deploy/tls/server.crt certs/doteye-remote.crt
Команда предполагает, что репозиторий на сервере находится в /root/DotEye. Если он склонирован в другой каталог, меняем путь после двоеточия.
На домашнем компьютере добавляем в .env:
DOTEYE_REMOTE_PROCESSING=1
DOTEYE_REMOTE_URL=https://<IP\_СЕРВЕРА>:8099
DOTEYE_ALLOWED_URL_HOSTS=<IP_СЕРВЕРА>,<IP_КАМЕРЫ>
DOTEYE_REMOTE_CA_CERT=<абсолютный путь к скопированному server.crt>
DOTEYE_REMOTE_FALLBACK=1
DOTEYE_CRYPTO_KEY=<ТОТ_ЖЕ_КЛЮЧ_ИЗ_deploy/.env.remote>
DOTEYE_ALLOWED_URL_HOSTS содержит точный список сетевых адресов, к которым DotEye может обращаться. Если камера подключена напрямую к компьютеру, оставляем только IP Сервера. Если источником служит телефон, RTSP-камера или HTTP-поток, добавляем и IP камеры.
Путь /app/certs/doteye-remote.crt используется при запуске основного DotEye через Docker Compose. Если проект запускается напрямую через Python, указываем абсолютный путь к сертификату на домашнем компьютере.
Перезапускаем основной сервис:
docker compose up -d --build doteye
docker compose logs -f doteye
Или при запуске без Docker:
python -m doteye.main
Проверяем remote-сервер уже с домашней машины:
curl --cacert certs/doteye-remote.crt https://<IP_СЕРВЕРА>:8099/health
В PowerShell лучше использовать curl.exe:
curl.exe --cacert certs/doteye-remote.crt https://<IP_СЕРВЕРА>:8099/health
Если /health вернул {"status": "ok"}, домашний DotEye сможет отправлять кадры на сервер. При временной недоступности сервера DOTEYE_REMOTE_FALLBACK=1 переключит обработку на локальный детектор. Бот пришлёт сообщение о сбое и отдельное сообщение, когда remote снова станет доступен.

Самоподписанный сертификат действует 365 дней. Перед окончанием срока его нужно перевыпустить на сервере, перезапустить remote-контейнер, скопировать новый server.crt на домашнюю машину и перезапустить DotEye. Это главный недостаток IP-варианта. Для постоянной работы лучше использовать домен и автоматический TLS.
Если сервер станет недоступен, то обработка автоматически переключается на локальное устройство
❯ Заключение
DotEye вырос из простой задачи: хотелось понимать, кто заходил в комнату, но не получать по сотне одинаковых кадров из-за теней, света из окна или движения шторы. Решение оказалось не в том, чтобы бесконечно гонять YOLO по видеопотоку, а в нормальном разделении задач.
Сначала срабатывает детектор движения. Только после этого кадр уходит в YOLO, а IoU-трекер и задержка убирают повторы. Камера, история событий и Telegram-бот остаются на домашнем компьютере. Когда локальных ресурсов не хватает, инференс берёт на себя сервер. А если сервер перестаёт отвечать, бот автоматически переключается на локальный детектор, а после восстановления возвращается к remote-обработке.
После шутки над другом, которого система встретила голосовым оповещением и тревогой, я понял, что проект перестал быть просто экспериментом с YOLO и стал полноценным пет-проектом.
Ссылки:
GitHub: https://github.com/network-user
Обо мне: https://info.dotcore.lol/
Новости | AI: https://t.me/nesw_ai
Может быть интересно:
Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram‑канале ↩
Автор: bububebe


