diff --git a/.claude/skills/ia-gondola-engine/SKILL.md b/.claude/skills/ia-gondola-engine/SKILL.md index 3530c7a..c233766 100644 --- a/.claude/skills/ia-gondola-engine/SKILL.md +++ b/.claude/skills/ia-gondola-engine/SKILL.md @@ -12,13 +12,13 @@ Serviço isolado de detecção YOLO e treinamento. Consumido exclusivamente pela ``` ia-gondola-api → POST {IA_MOTOR_URL}/detectar → YOLO → [{box, conf, class}] - → POST {IA_MOTOR_URL}/treinar → triagem + treino → modelo no S3 + → POST {IA_MOTOR_URL}/treinar → triagem + treino → modelo atualizado no S3 ``` ## Estrutura ``` -main.py — todo o código (FastAPI simples, sem sub-módulos) +main.py — todo o código (sem sub-módulos) Dockerfile requirements.txt ``` @@ -29,34 +29,26 @@ Intencionalmente minimalista — não tem banco, não tem pastas internas. ### `POST /detectar` -Form-data: `ambiente` (str), `file` (upload de imagem). +Form-data: `ambiente` (str), `file` (imagem). Confidence threshold: 0.25. ```json -// Resposta -{ - "status": "sucesso", - "deteccoes": [ - { "box": [x1, y1, x2, y2], "conf": 0.87, "class": 0 } - ] -} +{ "status": "sucesso", "deteccoes": [{ "box": [x1,y1,x2,y2], "conf": 0.87, "class": 0 }] } ``` -Confidence threshold no detect: `0.25`. - ### `POST /treinar` Body JSON: `{ "ambiente": "gondola", "pular_triagem": false }` **Fluxo completo:** 1. Lista `treinamento/{ambiente}/novos-treinamentos/` no S3 -2. **Triagem** (a menos que `pular_triagem: true`): +2. **Triagem** (salvo `pular_triagem: true`): - Prediz cada imagem com o modelo atual (conf threshold 0.1) - - `conf média >= 0.30` OU `conf == 0` → move para `base-oficial` - - `conf média < 0.30` → move para `descartados` + - `conf média >= 0.15` OU `conf == 0` → move para `base-oficial` + - `conf média < 0.15` → move para `descartados` 3. Baixa toda a `base-oficial` para `/tmp/dataset_{ambiente}/` -4. Redimensiona imagens > 4096px (`redimensionar_imagem`) +4. Redimensiona imagens > 4096px 5. Gera `data.yaml` com train=val=img_dir, nc=1 -6. Treina: 30 épocas, imgsz=640, batch=16, device=cpu +6. Treina: 20 épocas (fine-tuning) / 30 épocas (do zero), imgsz=640, batch=8, device=cpu 7. Salva `best.pt`: - `modelos/{ambiente}/atual/cerebro.pt` (substitui) - `modelos/{ambiente}/versionamento/cerebro_{YYYYMMDD_HHMM}.pt` (histórico) @@ -64,31 +56,38 @@ Body JSON: `{ "ambiente": "gondola", "pular_triagem": false }` ## Organização S3 ``` -modelos/{ambiente}/atual/cerebro.pt ← em produção -modelos/{ambiente}/versionamento/cerebro_YYYYMMDD_HHMM.pt ← histórico -treinamento/{ambiente}/novos-treinamentos/ ← aguardando triagem (img + .txt) -treinamento/{ambiente}/base-oficial/ ← aprovados pela triagem -treinamento/{ambiente}/descartados/ ← reprovados +modelos/{ambiente}/atual/cerebro.pt +modelos/{ambiente}/versionamento/cerebro_YYYYMMDD_HHMM.pt +treinamento/{ambiente}/novos-treinamentos/ +treinamento/{ambiente}/base-oficial/ +treinamento/{ambiente}/descartados/ ``` Ambientes ativos: `"gondola"` (produtos), `"etiqueta"` (etiquetas de preço). ## Cache de modelos -- `MODELOS_CARREGADOS` = dict Python `{ambiente: YOLO}` — evita reload a cada request +- `MODELOS_CARREGADOS` = dict `{ambiente: YOLO}` — evita reload a cada request - Arquivo local: `/tmp/cerebro_{ambiente}.pt` -- Se `LastModified` do S3 > `mtime` local → descarta cache, baixa novamente -- Após treino, o modelo do ambiente treinado é removido de `MODELOS_CARREGADOS` para forçar reload +- Se `LastModified` do S3 > `mtime` local → descarta cache e baixa novamente +- Após treino, o ambiente treinado é removido de `MODELOS_CARREGADOS` para forçar reload ## Env vars | Variável | Descrição | |----------|-----------| -| `BUCKET_NAME` | Nome do bucket S3 (default: `ia-gondola-projeto-2024`) | +| `BUCKET_NAME` | Nome do bucket S3 | | `AWS_ACCESS_KEY_ID` | | | `AWS_SECRET_ACCESS_KEY` | | | `AWS_DEFAULT_REGION` | | +## Convenções + +- Todo o código em `main.py` — não criar sub-módulos +- Triagem usa conf threshold `0.15` (ajustado manualmente, comentado no código) +- `pular_triagem: true` é útil quando as imagens já foram pré-validadas +- Este serviço não tem estado persistente próprio — tudo no S3 + ## Como rodar ```bash @@ -100,10 +99,3 @@ uvicorn main:app --reload --port 8001 docker build -t ia-gondola-engine . docker run -p 8001:8000 --env-file .env ia-gondola-engine ``` - -## Convenções - -- Todo o código em `main.py` — não criar sub-módulos -- Triagem usa `conf threshold 0.30` (ajustado manualmente, comentado no código) -- `pular_triagem: true` é útil quando as imagens já foram pré-validadas -- Este serviço não tem estado persistente próprio — tudo no S3