From 1c39fb70f8effe17ac41ecc424fd4bce898c8154 Mon Sep 17 00:00:00 2001 From: Davi Dias Date: Thu, 25 Jun 2026 20:15:26 -0300 Subject: [PATCH] =?UTF-8?q?fix:=20separar=20conjunto=20de=20valida=C3=A7?= =?UTF-8?q?=C3=A3o=20do=20treino=20com=20split=2080/20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Antes, val e train apontavam para o mesmo diretório, causando overfitting silencioso e métricas infladas. Agora 20% das imagens são movidas para val/ antes do treino. Co-Authored-By: Claude Sonnet 4.6 --- main.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/main.py b/main.py index 037e99c..4ec8333 100644 --- a/main.py +++ b/main.py @@ -146,10 +146,28 @@ def _executar_treino_sync(ambiente: str, pular_triagem: bool) -> dict: if not k.endswith('.txt'): redimensionar_imagem(caminho_local) - if len(os.listdir(img_dir)) > 0: + imagens = [f for f in os.listdir(img_dir) if not f.endswith('.txt')] + if len(imagens) > 0: + import random, shutil + random.shuffle(imagens) + corte = max(1, int(len(imagens) * 0.8)) + val_imgs = imagens[corte:] + + val_img_dir = f"{dataset_local}/val/images" + val_lbl_dir = f"{dataset_local}/val/labels" + os.makedirs(val_img_dir, exist_ok=True) + os.makedirs(val_lbl_dir, exist_ok=True) + + for fname in val_imgs: + shutil.move(os.path.join(img_dir, fname), os.path.join(val_img_dir, fname)) + lbl = fname.rsplit('.', 1)[0] + '.txt' + lbl_src = os.path.join(lbl_dir, lbl) + if os.path.exists(lbl_src): + shutil.move(lbl_src, os.path.join(val_lbl_dir, lbl)) + yaml_path = f"{dataset_local}/data.yaml" with open(yaml_path, 'w') as f: - yaml.dump({'train': img_dir, 'val': img_dir, 'nc': 1, 'names': {0: ambiente}}, f) + yaml.dump({'train': img_dir, 'val': val_img_dir, 'nc': 1, 'names': {0: ambiente}}, f) log_print(f"Treinando com {len(os.listdir(img_dir))} fotos ({'fine-tuning' if is_fine_tuning else 'do zero'})...") modelo_base.add_callback("on_fit_epoch_end", _on_fit_epoch_end)