Files
ozone-tech_owl_prime/vision_classifier
2026-08-03 01:26:42 +07:00
..
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00
2026-08-03 01:26:42 +07:00

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 мм):

.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