# Vision Classifier — трек 3 (RealSense D415 на Orange PI) ## Правила ТЗ (фиксированные) 1. Габариты строго `>10×10×10` и `<450×320×320` мм → иначе **C** 2. Иначе если `r_in/r_out ≥ 0.8` (вид сверху **или** ≥2 поперечных среза) → **D** 3. Иначе → **B** Стабилизация: медиана 12 кадров + голосование ≥2/3 окна → **LOCK**. После LOCK зона не меняется, пока объект не убрали. Без «достройки» круга на коробках. **Пограничные случаи:** если консенсуса нет `uncertain_after_frames` кадров (ratio у порога 0.8, сторона у лимита 450/320) — товар помечается **«неуверенно»** и уходит в безопасную зону (`uncertain_fallback_zone: C`), а не в основной поток. Все LOCK-решения пишутся в `logs/decisions.jsonl` (метрики для отчёта: зоны, габариты, ratio, доля неуверенных). ## Калибровка (обязательно перед замером габаритов!) Габариты считаются через фокусное `fx/fy`. Дефолт `670` — расчёт по спецификации D415 @ 640×480 (старое значение 430 завышало размеры в ~1.56 раза). Уточнить под свою камеру по коробке известного размера (рулеткой, высота коробки ≥ 30 мм): ```bash .venv/bin/python calibrate.py --length 300 --width 200 ``` Скрипт сам замерит высоту ленты и запишет `fx/fy` + `belt_distance_mm` в `config.yaml`. ## Фоновая карта глубины Сегментация умеет работать относительно карты фона (а не одной высоты): товар не сливается с платформой/бортами накопителя, а предмет, лежащий на другом предмете, выделяется отдельно. - `main.py`: `use_background_map: true` в конфиге — карта снимается при старте (лента должна быть **пустой**); - `demo.py`: кнопка **«Авто-высота»** снимает карту фона (уберите объекты); ручное движение ползунка высоты сбрасывает карту. ## Демо ```bash cd vision_classifier ./demo.sh ``` Браузер: **http://127.0.0.1:8080/** (Ctrl+F5 после перезапуска) Ползунки сверху: высота ленты, уверенность, мин. высота, порог круга, площадь. **Авто-высота** — калибровка по пустой ленте. Выход: `Ctrl+C`. Проверка без камеры: ```bash .venv/bin/python test_classify.py .venv/bin/python test_geometry.py ``` **Полный запуск / стоп:** [START.md](START.md) Боевой режим (MQTT + шаговик + серво): [INTEGRATION.md](INTEGRATION.md)