Files
ia-gondola-engine/CLAUDE.md
T

77 lines
2.5 KiB
Markdown

# IA Gôndola Engine
Serviço isolado de detecção YOLO e treinamento. Consumido exclusivamente pela `ia-gondola-api` via `IA_MOTOR_URL`.
## Arquitetura
```
ia-gondola-api → POST /detectar → YOLO → [{box, conf, class}]
→ POST /treinar → triagem + treino → modelo atualizado no S3
```
## Estrutura
```
main.py — todo o código (sem sub-módulos)
Dockerfile
requirements.txt
```
## Endpoints
### `POST /detectar`
Form-data: `ambiente` (str), `file` (imagem). Confidence threshold: 0.25.
```json
{ "status": "sucesso", "deteccoes": [{ "box": [x1,y1,x2,y2], "conf": 0.87, "class": 0 }] }
```
### `POST /treinar`
Body JSON: `{ "ambiente": "gondola", "pular_triagem": false }`
1. Lista `treinamento/{ambiente}/novos-treinamentos/` no S3
2. Triagem (salvo `pular_triagem: true`): conf média ≥ 0.15 → `base-oficial`, < 0.15 → `descartados`
3. Baixa `base-oficial`, redimensiona imagens > 4096px
4. Treina: 20 épocas fine-tuning / 30 épocas do zero, imgsz=640, batch=8, device=cpu
5. Salva `best.pt` em `modelos/{ambiente}/atual/cerebro.pt` + histórico versionado
Retorna `{ "status": "iniciado", "ambiente": "..." }` imediatamente — treino roda em background thread.
Quando não há modelo base, usa `yolov8n.pt` e pula triagem automaticamente.
### `GET /treinar/status`
Retorna estado do treino em andamento + últimas 30 linhas de log.
```json
{ "status": "running|concluido|erro|vazio|idle", "ambiente": "gondola", "versao": "20260627_1430", "detalhe": null, "logs": ["[1/20] box=0.432 ..."] }
```
`logs` inclui tanto as métricas por época (`_on_fit_epoch_end` callback do YOLO) quanto mensagens de progresso de triagem/download via `log_print()`.
## Organização S3
```
modelos/{ambiente}/atual/cerebro.pt
modelos/{ambiente}/versionamento/cerebro_YYYYMMDD_HHMM.pt
treinamento/{ambiente}/novos-treinamentos/
treinamento/{ambiente}/base-oficial/
treinamento/{ambiente}/descartados/
```
## Convenções
- `MODELOS_CARREGADOS` = dict em memória `{ambiente: YOLO}` — cache local em `/tmp/cerebro_{ambiente}.pt`
- Se S3 tiver versão mais nova (LastModified), descarta cache e baixa novamente
- Após treino, remove o ambiente de `MODELOS_CARREGADOS` para forçar reload
- Todo o código em `main.py` — não criar sub-módulos
- `log_print(msg)` escreve no stdout **e** em `_training_logs` (buffer circular 60 linhas) — não usar `print()` diretamente
## Como rodar
```bash
pip install -r requirements.txt
uvicorn main:app --reload --port 8001
```