vision model

This commit is contained in:
2026-08-03 01:26:42 +07:00
parent 3f8f3a40ec
commit 8aa0c16359
26 changed files with 5795 additions and 0 deletions

View File

@@ -0,0 +1,61 @@
# 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)