fix: corrige upload de modelo velho após treino por causa do dir incremental

O Ultralytics incrementa o diretório de saída (train, train2, train3...)
quando o anterior já existe, mas o código sempre lia de um caminho fixo
"runs/detect/train/weights/best.pt". Depois do primeiro treino nesse
container, todo treino seguinte silenciosamente subia pro S3 o best.pt
de uma rodada anterior em vez do modelo recém-treinado — por isso as
métricas de antes/depois batiam sempre igual, mesmo com o modelo
internamente convergindo bem (mAP50 90%+ no treino do-zero mais recente).

Agora project/name/exist_ok fixam o diretório de saída por ambiente,
garantindo que o best.pt lido seja sempre o do treino que acabou de rodar.
This commit is contained in:
Davi Dias
2026-07-02 20:35:48 -03:00
parent a990e6b618
commit 6c4f9d78e5
+8 -3
View File
@@ -187,13 +187,18 @@ def _executar_treino_sync(ambiente: str, pular_triagem: bool, forcar_do_zero: bo
modelo_base.add_callback("on_fit_epoch_end", _on_fit_epoch_end)
# Fine-tuning: LR baixo preserva o que o modelo já aprendeu.
# Primeiro treino: LR padrão + mais épocas para convergir do zero.
# project/name/exist_ok fixos: sem isso o Ultralytics incrementa o
# diretório a cada treino (train, train2, train3...) e o caminho abaixo
# ficava sempre apontando pro "train" original, subindo pro S3 um
# modelo de uma rodada antiga em vez do que acabou de treinar.
train_dir = f"runs/detect/{ambiente}"
if is_fine_tuning:
modelo_base.train(data=yaml_path, epochs=20, imgsz=640, batch=8, device='cpu', plots=True, lr0=0.001, lrf=0.01)
modelo_base.train(data=yaml_path, epochs=20, imgsz=640, batch=8, device='cpu', plots=True, lr0=0.001, lrf=0.01, project="runs/detect", name=ambiente, exist_ok=True)
else:
modelo_base.train(data=yaml_path, epochs=30, imgsz=640, batch=8, device='cpu', plots=True, lr0=0.01, lrf=0.01)
modelo_base.train(data=yaml_path, epochs=30, imgsz=640, batch=8, device='cpu', plots=True, lr0=0.01, lrf=0.01, project="runs/detect", name=ambiente, exist_ok=True)
modelo_base.reset_callbacks()
best = "runs/detect/train/weights/best.pt"
best = f"{train_dir}/weights/best.pt"
if os.path.exists(best):
carimbo = datetime.now().strftime("%Y%m%d_%H%M")
s3.upload_file(best, BUCKET, f"modelos/{ambiente}/atual/cerebro.pt")