fix: reduzir sobreposição de boxes em /detectar

Caixa grande "engolindo" uma caixa menor do mesmo produto continuava
aparecendo mesmo com sobreposição óbvia — IoU sozinho não resolve isso
porque a união fica dominada pela caixa maior, então o IoU continua baixo
mesmo com contenção quase total (ex.: caixa 1/5 da área da outra, 100%
contida, IoU ≈ 0.2).

- iou=0.5 explícito no NMS do YOLO (antes usava o default 0.7, permissivo
  demais)
- novo pós-filtro _suprimir_boxes_contidas(): entre duas boxes da mesma
  classe onde a intersecção cobre ≥90% da área da MENOR das duas, mantém
  só a de maior confiança

Afeta tanto as boxes da revisão quanto as do TrainingTab, já que ambas vêm
do mesmo /detectar.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-04 14:07:40 -03:00
co-authored by Claude Sonnet 5
parent 25ce7fd39f
commit 3efdb08c9b
2 changed files with 41 additions and 2 deletions
+12 -1
View File
@@ -21,7 +21,18 @@ requirements.txt
### `POST /detectar`
Form-data: `ambiente` (str), `file` (imagem). Confidence threshold: 0.25.
Form-data: `ambiente` (str), `file` (imagem). Confidence threshold: 0.25, NMS `iou=0.5`.
`ia-gondola-api` também manda um campo `conf` no form (ver `gondola_service.py`), mas esse endpoint
não declara/lê esse campo — é ignorado, o threshold usado é sempre o 0.25 hardcoded aqui.
Depois do NMS do próprio YOLO, passa por `_suprimir_boxes_contidas()`: remove boxes da mesma classe
quase totalmente contidas em outra (caixa grande "engolindo" uma caixa menor do mesmo produto —
comum em prateleira lotada). IoU sozinho não resolve isso: quando uma caixa é muito maior que a
outra, a união fica dominada pela caixa grande e o IoU continua baixo mesmo com contenção quase
total (ex.: caixa pequena 1/5 da área da grande, 100% contida → IoU ≈ 0.2, seguiria sobrevivendo
mesmo com iou threshold bem mais agressivo que o do NMS padrão). A métrica usada aqui é
intersecção / área da MENOR caixa do par, limiar 0.90 — entre duas boxes da mesma classe acima
desse limiar, fica só a de maior confiança.
```json
{ "status": "sucesso", "deteccoes": [{ "box": [x1,y1,x2,y2], "conf": 0.87, "class": 0 }] }