Паспорт генерации изображения
Промт генерации изображения
Dark neon 'underside of progress' scene, cyberpunk workshop mood. A camera view of a slanted roof eave, a warm amber diagonal roofline crossing the frame; along it, cold teal-cyan rectangles of a detection zone fitted like a staircase, a stepped approximation chasing the slanted line; cold steps versus warm diagonal. Weathered shingles and beam grain, dew droplets, cobwebs in the corner, night veranda, infrared glow. Deep shadow, volumetric haze, warm amber and cyan color palette, shallow depth of field, cinematic film still on 35mm, intricately detailed, ultra-detailed, fine textures, rich layered background, ornate mechanical detail, sharp focus, moody atmosphere.
О том, как попытка обвести косой потолок веранды превратилась в упражнение по аппроксимации и борьбу с «плавающей» камерой.
Ложные срабатывания ночью. В логах детектора - бесконечный поток событий, хотя во дворе никого нет. Причина банальна: ИК-подсветка камеры цепляет деревянный скат потолка веранды. Этот карниз должен быть в зоне игнора, но он «вылез» из-под красной маски.
Симптом возник после того, как я решил, что камеру нужно подвинуть «совсем чуть-чуть» для лучшего обзора.
Иллюзия стабильности
Первым делом проверил старые координаты зон. Сравнил текущий кадр с архивом от 13 июля - сдвиг действительно был минимальным. Казалось, достаточно поправить пару цифр в конфиге, и всё вернётся в норму.
Но не тут-то было: вскоре я подвинул камеру ЕЩЁ раз. Второй сдвиг оказался куда серьёзнее. Потолок на изображении буквально просел: верхняя граница сместилась с y≈150 до диапазона 180-205. Старая разметка превратилась в тыкву, а заново мерить координаты вручную - занятие для мазохистов.
Ошибка в трактовке линии
Решил делегировать рутину ИИ. Скинул скриншот с набросанной от руки линией карниза и попросил перевести её в координаты двух-трёх грубых прямоугольников для конфига. Результат получил быстро, но при проверке возникла проблема.
«Стой, ты херню сделал, обвёл не по чёрному контуру», - зафиксировал я в чате.
Выяснилось, что ассистент принял мою заливку области за саму границу. Он пытался создать зоны, которые закрывали «пятно», в то время как мне нужно было точно следовать линии диагонали. Но тут всплыла более глубокая проблема: детектор умеет работать только с прямоугольниками.
Попытка покрыть одну диагональную линию одним или двумя большими боксами неизбежно приводила к проигрышу. Либо прямоугольник срезает часть двора, которую нужно мониторить, либо сверху всё равно торчит кусок потолка, генерирующий ложные срабатывания. Геометрия системы и геометрия реальности просто не совпали.
Метод ступенек
Выход нашёл в аппроксимации. Если нельзя провести одну плавную линию, можно построить «лестницу» из узких вертикальных полос разной высоты.
Чтобы не гадать с цифрами, выстроил с ИИ цикл быстрой визуальной проверки. Схема была такая: беру свежий кадр из go2rtc → накладываю зоны через drawbox в ffmpeg → смотрю результат глазами → если совпало, пишу в конфиг.
Для точности добавил на кадр координатную сетку через drawgrid и текстовые метки drawtext. Это позволило буквально «нащупать» контур крыши. В итоге диагональ превратилась в четыре ступенчатых прямоугольника, которые синхронно прописались и в config.json детектора, и в Jinja-условие Home Assistant.
Команда для визуальной проверки выглядела примерно так:
ffmpeg -i input_frame.jpg -vf "drawbox=0:0:80:210:red@0.30:t=fill" output_check.jpg
А итоговые координаты в конфиге распределились по колонкам X:
"coordinates": "0,210,0,80",
"coordinates": "0,175,80,160",
"coordinates": "0,160,160,480",
"coordinates": "0,180,480,640"
Точка отсчёта
Эта история оставила один конкретный вывод: любую систему, ограниченную примитивами (в данном случае - прямоугольниками), можно подружить с произвольной геометрией только через дробление. Ступенчатая аппроксимация - единственный способ мирить математику конфига с кривизной реального мира.
Но есть и вторая, более жизненная мораль. Бесполезно доводить точность разметки до пикселя, пока физический объект не зафиксирован. Любое измерение против движущейся цели устаревает в момент нажатия кнопки «Save». Теперь правило простое: геометрия финализируется только после подтверждения, что камеру больше никто не трогает.
Часть темы «Умный дом без облака» - там собраны остальные разборы этого стека.
