ФОРУМ КУПИТЬ

Последние статьи из блога

ВСЕ СТАТЬИ

Как я боролся с собаками с помощью нейросети

08/08/2025 16:25:56

У меня давно существовала проблема - собаки. Они облюбовали мой палисадник, засаженный газонной травой, в качестве места для выгула. Нетрудно себе представить, какие мероприятия нужно было проводить каждый раз перед тем, как покосить траву. Ну и это просто неприятно. К самим четвероногим друзьям я отношусь очень хорошо. Скорее у меня имеются претензии к их двуногим владельцам, которые совершенно спокойно пускают питомца справить нужду на ухоженную кем-то территорию. Всегда интересно рассмотреть на записях видеонаблюдения лицо хозяина очередной присевшей собачки. Физиономия эта, как правило, невозмутимая, каменная, без признаков тревоги, волнения или осознания того, что что-то тут не так. В самом деле, для чего же еще по мнению вот таких собаководов нужны соседские палисадники... Только один раз я увидел, как мужчина с пакетиком забрал то, что оставила его псинка. Мне хотелось выйти, обнять его, пожать ему руку, выразить слова глубокой благодарности. Но это было один раз.

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


Фотка реальная, с камеры SIP-домофона, но слегка приукрашенная чатомЖПТ.
Пятую лапу у собаки замазал в фотошопе.

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

Ультразвуковой отпугиватель собак стационарный
Стационарный отпугиватель Grad Duos S с двумя излучателями. Не дешево и не сердито

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


А ведь немало и глухих собак... Им вааще пофиг!

Большое количество людей пытаются делать отпугиватели самостоятельно. На форуме radiokot можно найти десятки тем. Одна из них растянулась на 82 страницы. Работающий прибор, как оказалось, сделать совсем не просто. А реальных результатов никто, кажется, так и не добился. Ну и в принципе использование ультразвука меня как-то не вдохновляло. Слишком грубо, неэкологично, техногенно. Неизвесно к тому же, какое воздействие при постоянном использовании он будет оказывает на людей. Прежде всего, на нас самих. Мне хватило послушать работу ультразвукового датчика ветра...


"А результат тот же. Никакой"

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

Ну, как вы уже догадались, у меня родилась идея фикс. И она оказалась рабочей. Когда-то давно я смастерил SIP-домофон из Raspberry Pi. Камера этого домофона, размещенного на калитке, захватывала значительную часть палисадника. Это первый ингредиент. Помимо этого, у меня уже много лет используется автополив, построенный на относительно недорогих и доступных клапанах и дождевателях Hunter, которые подключены к контроллеру MegaD-2561. К слову, из всех клапанов, которые я использовал дома для различных задач, Hunter самые живучие. Есть разбрызгиватели и в районе палисадника. Это второй ингредиент. Замысел был очевиден - нужно анализировать изображение с камеры домофона и включать автополив сразу же, как только собака пересечет защищаемую область. Решение это безобидное, не наносящее вред животному, но потенциально эффективное. Помимо отпугивания брызгами воды, дождеватели еще и довольно сильно шипят. Это должно подействовать и на владельцев. Не каждому понравится, если его любимец вдруг намочится.

Итак, нужно в реальном времени анализировать видео с камеры домофона на предмет собачек, забегающих в палисадник, и своевременно включать автополив. Функциональное ядро данной системы - распознавание объектов в потоковом видео. Прямо сейчас наблюдается бум в области нейросетей и нейросетевых моделей, аналитических алгоритмов, LLM, искусственного интеллекта. Все очень быстро меняется. На момент написания статьи я пришел к выводу, что для данной задачи лучше всего подходит YOLO, основанная на сверточных нейросетях. Эта модель как раз заточена для обнаружения объектов на изображениях в реальном времени. Ее отличительная особенность - высокая скорость работы. Я решил попробовать.

RPi3, на которой у меня реализован Wi-Fi домофон, для этой задачи, конечно, не подходит. Слишком слабая железка. Но у меня есть домашний сервер. Точнее, сервера два. Первый помощнее, боевой, предназначен для реализации всех актуальных функций домашней автоматизации. Другой - для всяких тестов, экспериментов и прочих второстепенных и необязательных систем. Вот его я и решил использовать. Процессор в этой машине не самый современный Intel Core i5 3570K 3,4ГГц, а GPU-ускорителя нет. Только встроенная графика. Справится? Проверим.

Для начала нужно, чтобы домофон в реальном времени передавал видеопоток на сервер. Для этого я использовал слегка модифицированный скрипт из документации на Picamera.

Далее уже на сервере я установил необходимые инструменты и модель для распознавания видео

# Устанавливаем Python и инструмент для создания виртуального окружения
sudo apt install python3 python3-pip python3-venv
# Создаем виртуальное окружение (чтобы не поломать систему)
python3 -m venv yolo-env
# Активируем виртуальное окружение
source yolo-env/bin/activate
# Устанавливаем систему распознавания. В распакованном виде все необходимое занимает почти 12 Гб!
pip install --upgrade pip
pip install ultralytics opencv-python

Наконец, набросал простой скрипт на питоне. Пара слов о логике. Скрипт "ловит" собак в любой части кадра и записывает видео с "пойманными" собаками в отдельную папку. Но автополив включается только в том случае, если собака пересечет границу палисадника, которую я заранее задал координатами (зона POI). Эта зона также выделена на видео.

import cv2
from ultralytics import YOLO
import os, time
from datetime import datetime
import requests
import logging

# URL потока с моего Wi-Fi домофона на базе Raspberry Pi 3
URL = "http://192.168.0.233:8000/stream.mjpg"
model = YOLO("yolov8n.pt")
cap = cv2.VideoCapture(URL)

# Папка для записи видео с собачками
os.makedirs("videos", exist_ok=True)

# ROI - координаты палисадника в кадре
ROI_X1, ROI_Y1 = 110, 820
ROI_X2, ROI_Y2 = 1280, 962

recording = False
video_writer = None
last_seen = 0
last_poliv_time = 0
FPS = 10
width = int(cap.get(3))
height = int(cap.get(4))

# Настройка логирования
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[
        logging.FileHandler("dog_watch.log", encoding="utf-8"),
        logging.StreamHandler()  # чтобы дублировалось в терминал
    ]
)

# Функция, которая определяет, что собака пересекла границу POI. Хотя бы одной лапкой или хвостиком
def is_in_roi(x1, y1, x2, y2):
    return not (x2 < ROI_X1 or x1 > ROI_X2 or y2 < ROI_Y1 or y1 > ROI_Y2)

while True:
    ret, frame = cap.read()
    if not ret:
        continue

    cv2.rectangle(frame, (ROI_X1, ROI_Y1), (ROI_X2, ROI_Y2), (0, 255, 255), 4)

    results = model(frame, imgsz=640)
    dog_found = False
    dog_in_roi = False

    for box in results[0].boxes:
        cls = int(box.cls[0])
        conf = float(box.conf[0])
        if model.names[cls] == "dog" and conf > 0.5:
            dog_found = True
            x1, y1, x2, y2 = box.xyxy[0]
            logging.info(f"Собака в кадре: {x1}, {y1}, {x2}, {y2}")
            if is_in_roi(x1, y1, x2, y2):
                dog_in_roi = True
                logging.info(f"Собака в ROI: {x1}, {y1}, {x2}, {y2}")
                break  # достаточно одной собаки в зоне

    now = time.time()

    # Запись видео с собакой
    if dog_found:
        last_seen = now
        if not recording:
            filename = f"videos/dog_{datetime.now().strftime('%Y%m%d_%H%M%S')}.avi"
            video_writer = cv2.VideoWriter(filename, cv2.VideoWriter_fourcc(*'XVID'), FPS, (width, height))
            logging.info(f"[REC] Начата запись: {filename}")
            recording = True

    if recording:
        video_writer.write(frame)
        if now - last_seen > 8:  # если 5 сек никого
            video_writer.release()
            logging.info(f"[REC] Завершена запись")
            recording = False

    # Включение автополива, если собака в ROI
    if dog_in_roi and now - last_poliv_time > 60:  # не чаще, чем раз в минуту
        logging.info("Собака в палисаднике! Включаю полив")
        # Передача команды контроллеру MegaD-2561
        # Автополив включается на минуту. Пауза выдерживается средствами контроллера
        requests.get("http://192.168.0.100/sec/?cmd=11:1;p600;11:0", timeout=3)
        last_poliv_time = now

И все заработало, как говорится, из коробки! Никакого дополнительного обучения модели не требуется. Достаточно в коде использовать ключевое слово "dog". Таким же образом можно ловить в кадре машины (car), людей (person) и другие объекты. Но в существующей конфигурации обнаружился небольшой недостаток - почти полная загрузка CPU (до 100%) и не самая высокая производительность. Вот, что я увидел в логах работы модели.

0: 512x640 (no detections), 102.5ms
Speed: 1.9ms preprocess, 102.5ms inference, 1.0ms postprocess per image at shape (1, 3, 512, 640)

То есть, на распознавание объектов на видео сервер тратит приблизительно 100 мс на кадр. А значит реальная производительность составляет около 9-10 кадров в секунду. Учитывая накладные расходы на формирование потока на стороне RPi3, а также передачу данных по Wi-Fi, время реакции системы после пересечения животным границы палисадника порядка 2 секунд. Многовато. Самая быстрая операция здесь - это включение автополива. Контроллер MegaD-2561 отрабатывает команду сервера мгновенно - пару миллисекунд. RPi3 никак ускорить нельзя, как и передачу данных по Wi-Fi, но можно ускорить обработку видео на сервере. В сущности это вообще не задача центрального процессора. Да и код модели оптимизирован под использование GPU с CUDA.

К счастью решить проблему с производительностью анализа видеоряда было просто. Я зашел на Авито и увидел огромное количество объявлений о продаже видеокарт без видеовыхода на базе чипа NVIDIA GP106 (GTX 1060). Поиск по ключевому слову "P106 100". Ранее их использовали главным образом для майнинга. Сейчас, наверное, они уже морально устарели, но для ловли собачек, полагаю, самое оно. Цены от 750 руб за штуку. Я приобрел такую карту у продавца в своем регионе и установил на сервере.

После установки карты в Debian Linux нужно включить contrib non-free в source.list и установить необходимые пакеты и драйвера.

apt install nvidia-driver nvidia-smi

После перезагрузки системы я снова запустил свой собачий скрипт и увидел совсем другую картину

0: 512x640 (no detections), 16.6ms
Speed: 4.5ms preprocess, 16.6ms inference, 1.8ms postprocess per image at shape (1, 3, 512, 640)

Распознавание объектов в кадре ускорилось примерно в 6 раз! При такой конфигурации сервер способен легко и без задержек переваривать видео с той частотой кадров, которую выдает RPi3.

Испытания системы прошли успешно. Владельцы песиков явно обратили внимание на данную фичу. Сначала они стали вдруг отрываться от своих смартфонов, чтобы понять, что происходит. Если собака шла позади, то возвращались, чтобы увести своего питомца с поливающегося газона. Ну а в результате через пару дней они и вовсе перестали пускать собак на наш газон. И каждый раз, проходя мимо, слегка поворачивали голову в сторону дождевателей, которые неустанно стояли на страже рубежей и общественного порядка и внимательно следили за траекторией движения четвероногих дружков...

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

Пожалуй стоит сказать и минусе данного решения. Точнее было бы назвать это даже не минусом, а накладными расходами. Подобная обработка видео приводит к увеличению потребления электроэнергии приблизительно на 45-50 Вт. Да, к сожалению, сервер делает это не бесплатно. Причем неважно, чем конкретно анализировать видео: с помощью CPU или GPU. Потребление приблизительно одинаковое. Специализированный GPU позволяет делать это быстрее и снизить нагрузку на центральный процессор. Но в целях воспитания собаководов, прививания им уважения к общественной среде и окружающим, а также в целях предотвращения ими нарушения КоАП, я готов потратиться на несколько лишних кВт*ч в месяц.


Update 2025.08.28

Некоторых собак алгоритм идентифицирует как "horse" (лошадь). Ну, некоторые особи сбоку и правда похожи. Добавил в код:
if (model.names[cls] == "dog" or model.names[cls] == "horse")
Полет нормальный.
 

Автор: Andrey_B
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.



Добавить комментарий:

(необязательно, не отображается на сайте)


Сортировка комментариев: Последние сверху | Первые сверху

2025-11-28 14:36:43 | Сергей
Делал такое лет 5 назад, до нейросетей. AxxonNext и небольшие прямоугольные зоны в которые помещается собака но не помещается человек. Также нужно было задать время через которое сработает, т.е. если просто прошла - молчим. Задержалась - включаем сирену. Так как это был столб, хотел прикопать бачок с насосом для омывания лобового от ВАЗовской классики. Но отказался в пользу сирены т.к. зимой собаки тоже льют на столб. Дочь снеговика слепила - пожелтел на сл.день.


2025-10-16 17:23:11 | Andrey_B
Alexey, да, вариант "летний". И в каком-то смысле воспитательный. Может, в течение сезона владельцы выдрессируются... Зимой же и проблема не столь актуальна и палисадники обычно завалены сугробами. Питомцы не полезут. Хотя по весне, конечно, все равно приходится выгребать накопившееся. Но вдруг кто-то придумает еще какие-нибудь рабочие варианты.


2025-10-16 13:06:19 | Alexey
Изящное решение, но для плюсовых температур! Но не просто собаковладельцы хитро присматриваются...
Зимний альтернативный вариант предполагается? Или за ненадобностью покоса до весны все ложится в сугробы?


2025-08-26 18:46:55 | Andrey_B
Александр, спасибо за ссылку. Как-то она прошла мимо меня. Думаю, для пользователей Home Assistant отличный вариант. Преимущество моего подхода в простоте, прозрачности и полном контроле. Я знаю, как все работает и могу вносить любые изменения в код. Но готовая NVR с AI детекцией действительно может быть интересна пользователям, которые не готовы связываться с кодингом, а хотят настроить интеграцию с HA и сценарии с помощью web-интерфейса. Полезное ПО.


2025-08-26 16:26:47 | Александр
А для снятия нагрузки с CPU, использую Coral TPU, он "заточен" для этих дел.


2025-08-26 16:25:28 | Александр
https:/frigate.video/


2025-08-26 15:28:45 | Andrey_B
Александр, а что такое "фригат"? Что-то не нашел ничего по данному ключевому слову, что бы имело отношение к данной теме.


2025-08-25 21:38:01 | Александр
Прям очень здорово!!
А на "фригат" почему ваш выбор не пал?


2025-08-11 13:26:20 | Andrey_B
Ruslan, конечно, можно распознавать кошек, птиц, слонов и других зверей. Единственный минус в том, что библиотека обрабатывает каждый кадр отдельно, не в динамике. Она не учитывает характер движения объекта, как это делает человек, который чисто по движениям теней силуэта способен отличить кошку от собаки. Поэтому один и тот же объект, особенно если он маленький, алгоритм может на разных кадрах воспринимать как собаку, кошку или даже птицу. Но у распознанного объекта есть параметр conf (confidence). Поэтому в коде можно игнорировать сомнительные результаты (ниже 0.6).


2025-08-08 22:10:34 | Ruslan
Как всегда интересно и полезно!
Наверное, с распознаванием кошек тоже проблем быть не должно, а то повадились проникать ко мне на участок и делать в клумбах свое черное дело... Причем вероломно, без объявления, в 4 утра (когда все нормальные люди спят и не могут пресечь это безобразие).