From 432159bb2eb972997743f2d16c173be7a17a683d Mon Sep 17 00:00:00 2001 From: Davi Dias Date: Thu, 25 Jun 2026 19:51:04 -0300 Subject: [PATCH] =?UTF-8?q?fix:=20remove=20aprova=C3=A7=C3=A3o=20autom?= =?UTF-8?q?=C3=A1tica=20de=20imagens=20sem=20detec=C3=A7=C3=A3o=20na=20tri?= =?UTF-8?q?agem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .claude/skills/ia-gondola-engine/SKILL.md | 29 +++++++++++++++++++++++ main.py | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) 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: