diff --git a/.claude/skills/ia-gondola-engine/SKILL.md b/.claude/skills/ia-gondola-engine/SKILL.md index c233766..65988e6 100644 --- a/.claude/skills/ia-gondola-engine/SKILL.md +++ b/.claude/skills/ia-gondola-engine/SKILL.md @@ -88,6 +88,35 @@ Ambientes ativos: `"gondola"` (produtos), `"etiqueta"` (etiquetas de preço). - `pular_triagem: true` é útil quando as imagens já foram pré-validadas - 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 ```bash diff --git a/main.py b/main.py index 95f7b8f..037e99c 100644 --- a/main.py +++ b/main.py @@ -115,7 +115,7 @@ def _executar_treino_sync(ambiente: str, pular_triagem: bool) -> dict: pred = modelo_base(img_data, conf=0.1, verbose=False) confs = [float(b.conf) for r in pred for b in r.boxes] 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}") for k in [img_key, txt_key]: try: