Vision Classifier — трек 3 (RealSense D415 на Orange PI)
Правила ТЗ (фиксированные)
- Габариты строго
>10×10×10и<450×320×320мм → иначе C - Иначе если
r_in/r_out ≥ 0.8(вид сверху или ≥2 поперечных среза) → D - Иначе → 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 мм):
.venv/bin/python calibrate.py --length 300 --width 200
Скрипт сам замерит высоту ленты и запишет fx/fy + belt_distance_mm в config.yaml.
Фоновая карта глубины
Сегментация умеет работать относительно карты фона (а не одной высоты): товар не сливается с платформой/бортами накопителя, а предмет, лежащий на другом предмете, выделяется отдельно.
main.py:use_background_map: trueв конфиге — карта снимается при старте (лента должна быть пустой);demo.py: кнопка «Авто-высота» снимает карту фона (уберите объекты); ручное движение ползунка высоты сбрасывает карту.
Демо
cd vision_classifier
./demo.sh
Браузер: http://127.0.0.1:8080/ (Ctrl+F5 после перезапуска)
Ползунки сверху: высота ленты, уверенность, мин. высота, порог круга, площадь.
Авто-высота — калибровка по пустой ленте. Выход: Ctrl+C.
Проверка без камеры:
.venv/bin/python test_classify.py
.venv/bin/python test_geometry.py
Полный запуск / стоп: START.md
Боевой режим (MQTT + шаговик + серво): INTEGRATION.md