docs: corrige threshold de triagem e parâmetros de treinamento na skill

This commit is contained in:
2026-06-25 15:34:44 -03:00
parent 3f375ec8d5
commit c8ce09e5af
+25 -33
View File
@@ -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}] 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 ## Estrutura
``` ```
main.py — todo o código (FastAPI simples, sem sub-módulos) main.py — todo o código (sem sub-módulos)
Dockerfile Dockerfile
requirements.txt requirements.txt
``` ```
@@ -29,34 +29,26 @@ Intencionalmente minimalista — não tem banco, não tem pastas internas.
### `POST /detectar` ### `POST /detectar`
Form-data: `ambiente` (str), `file` (upload de imagem). Form-data: `ambiente` (str), `file` (imagem). Confidence threshold: 0.25.
```json ```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` ### `POST /treinar`
Body JSON: `{ "ambiente": "gondola", "pular_triagem": false }` Body JSON: `{ "ambiente": "gondola", "pular_triagem": false }`
**Fluxo completo:** **Fluxo completo:**
1. Lista `treinamento/{ambiente}/novos-treinamentos/` no S3 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) - 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.15` OU `conf == 0` → move para `base-oficial`
- `conf média < 0.30` → move para `descartados` - `conf média < 0.15` → move para `descartados`
3. Baixa toda a `base-oficial` para `/tmp/dataset_{ambiente}/` 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 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`: 7. Salva `best.pt`:
- `modelos/{ambiente}/atual/cerebro.pt` (substitui) - `modelos/{ambiente}/atual/cerebro.pt` (substitui)
- `modelos/{ambiente}/versionamento/cerebro_{YYYYMMDD_HHMM}.pt` (histórico) - `modelos/{ambiente}/versionamento/cerebro_{YYYYMMDD_HHMM}.pt` (histórico)
@@ -64,31 +56,38 @@ Body JSON: `{ "ambiente": "gondola", "pular_triagem": false }`
## Organização S3 ## Organização S3
``` ```
modelos/{ambiente}/atual/cerebro.pt ← em produção modelos/{ambiente}/atual/cerebro.pt
modelos/{ambiente}/versionamento/cerebro_YYYYMMDD_HHMM.pt ← histórico modelos/{ambiente}/versionamento/cerebro_YYYYMMDD_HHMM.pt
treinamento/{ambiente}/novos-treinamentos/ ← aguardando triagem (img + .txt) treinamento/{ambiente}/novos-treinamentos/
treinamento/{ambiente}/base-oficial/ ← aprovados pela triagem treinamento/{ambiente}/base-oficial/
treinamento/{ambiente}/descartados/ ← reprovados treinamento/{ambiente}/descartados/
``` ```
Ambientes ativos: `"gondola"` (produtos), `"etiqueta"` (etiquetas de preço). Ambientes ativos: `"gondola"` (produtos), `"etiqueta"` (etiquetas de preço).
## Cache de modelos ## 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` - Arquivo local: `/tmp/cerebro_{ambiente}.pt`
- Se `LastModified` do S3 > `mtime` local → descarta cache, baixa novamente - Se `LastModified` do S3 > `mtime` local → descarta cache e baixa novamente
- Após treino, o modelo do ambiente treinado é removido de `MODELOS_CARREGADOS` para forçar reload - Após treino, o ambiente treinado é removido de `MODELOS_CARREGADOS` para forçar reload
## Env vars ## Env vars
| Variável | Descrição | | 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_ACCESS_KEY_ID` | |
| `AWS_SECRET_ACCESS_KEY` | | | `AWS_SECRET_ACCESS_KEY` | |
| `AWS_DEFAULT_REGION` | | | `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 ## Como rodar
```bash ```bash
@@ -100,10 +99,3 @@ uvicorn main:app --reload --port 8001
docker build -t ia-gondola-engine . docker build -t ia-gondola-engine .
docker run -p 8001:8000 --env-file .env 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