fix: remove aprovação automática de imagens sem detecção na triagem
Imagens onde o YOLO não detecta nada (conf == 0) passavam direto para base-oficial, contaminando o dataset. Agora vão para descartados e precisam de revisão humana antes de entrar no treino. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
c8ce09e5af
commit
432159bb2e
@@ -88,6 +88,35 @@ Ambientes ativos: `"gondola"` (produtos), `"etiqueta"` (etiquetas de preço).
|
|||||||
- `pular_triagem: true` é útil quando as imagens já foram pré-validadas
|
- `pular_triagem: true` é útil quando as imagens já foram pré-validadas
|
||||||
- Este serviço não tem estado persistente próprio — tudo no S3
|
- Este serviço não tem estado persistente próprio — tudo no S3
|
||||||
|
|
||||||
|
## Bugs conhecidos / pendentes de correção
|
||||||
|
|
||||||
|
### Bug 1 — Triagem aprova imagens sem nenhuma detecção (CORRIGIDO em código, validar deploy)
|
||||||
|
Linha 118 do `main.py`:
|
||||||
|
```python
|
||||||
|
# Antes (bug)
|
||||||
|
decisao = "base-oficial" if media >= 0.15 or media == 0 else "descartados"
|
||||||
|
# Depois (correto)
|
||||||
|
decisao = "base-oficial" if media >= 0.15 else "descartados"
|
||||||
|
```
|
||||||
|
O critério `media == 0` aprovava imagens onde o YOLO não detectou nada (desfocadas,
|
||||||
|
ângulo errado, fora de contexto), contaminando o dataset de treino.
|
||||||
|
|
||||||
|
### Bug 2 — Validação e treino usam os mesmos dados (PENDENTE — aplicar após restaurar v1)
|
||||||
|
Linha 152 do `main.py`:
|
||||||
|
```python
|
||||||
|
yaml.dump({'train': img_dir, 'val': img_dir, ...}) # val = train → mAP50 inflado
|
||||||
|
```
|
||||||
|
Precisa de split 80/20: 80% para `train/`, 20% para um `val/` separado. Só aplicar
|
||||||
|
**após** a restauração da v1 e retreino de estabilização estarem concluídos.
|
||||||
|
|
||||||
|
## Situação do modelo (2026-06-25)
|
||||||
|
|
||||||
|
O modelo `cerebro.pt` (gondola) regrediu após rodadas de treino acumulativas. A v1
|
||||||
|
original (timestamp mais antigo em `modelos/gondola/versionamento/`) performa melhor.
|
||||||
|
Plano de restauração documentado em `ia-gondola-api/docs/plano-mitigacao-regressao-modelo.md`.
|
||||||
|
O rollback pode ser feito pelo frontend: aba Treinamento → Ciclos → botão "↩ Rollback"
|
||||||
|
no run mais antigo, ou via endpoint `POST /training/gondola/runs/{run_id}/rollback`.
|
||||||
|
|
||||||
## Como rodar
|
## Como rodar
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ def _executar_treino_sync(ambiente: str, pular_triagem: bool) -> dict:
|
|||||||
pred = modelo_base(img_data, conf=0.1, verbose=False)
|
pred = modelo_base(img_data, conf=0.1, verbose=False)
|
||||||
confs = [float(b.conf) for r in pred for b in r.boxes]
|
confs = [float(b.conf) for r in pred for b in r.boxes]
|
||||||
media = sum(confs)/len(confs) if confs else 0
|
media = sum(confs)/len(confs) if confs else 0
|
||||||
decisao = "base-oficial" if media >= 0.15 or media == 0 else "descartados"
|
decisao = "base-oficial" if media >= 0.15 else "descartados"
|
||||||
log_print(f"{os.path.basename(img_key)}: Conf. {media:.2f} -> {decisao}")
|
log_print(f"{os.path.basename(img_key)}: Conf. {media:.2f} -> {decisao}")
|
||||||
for k in [img_key, txt_key]:
|
for k in [img_key, txt_key]:
|
||||||
try:
|
try:
|
||||||
|
|||||||
Reference in New Issue
Block a user