{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceType":"competition","sourceId":114094,"databundleVersionId":13610510},{"sourceType":"datasetVersion","sourceId":15059433,"datasetId":9641227,"databundleVersionId":15940437}],"dockerImageVersionId":31287,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install ultralytics\nimport os\nimport yaml\nimport shutil\nfrom ultralytics import YOLO\n\n# =====================================\n# 1. Configuração do Dataset\n# =====================================\n\ndataset_path = \"/kaggle/working/\"\nclass_names = ['cheerios', 'soup', 'candle']\n\ndata = {\n    \"path\": dataset_path,\n    \"train\": \"/kaggle/input/competitions/grocery-items-multi-class-object-detection/train/train/images\",\n    \"val\": \"/kaggle/input/competitions/grocery-items-multi-class-object-detection/val/val/images\",\n    \"names\": {i: name for i, name in enumerate(class_names)}\n}\n\nyaml_path = os.path.join(dataset_path, \"data.yaml\")\n\nwith open(yaml_path, \"w\") as f:\n    yaml.dump(data, f)\n\n# =====================================\n# 2. Carregar modelo\n# =====================================\n\nmodel = YOLO(\"yolov8n.pt\")\n\n# =====================================\n# 3. Treinamento otimizado\n# =====================================\n\nmodel.train(\n\n    data=yaml_path,\n\n    epochs=300,\n    imgsz=768,\n    batch=16,\n\n    workers=2,\n    device=0,\n\n    # ========================\n    # AUGMENTATIONS\n    # ========================\n\n    hsv_h=0.015,\n    hsv_s=0.7,\n    hsv_v=0.4,\n\n    degrees=5.0,\n    translate=0.1,\n    scale=0.5,\n    shear=2.0,\n\n    fliplr=0.5,\n    flipud=0.1,\n\n    mosaic=1.0,\n    mixup=0.15,\n    erasing=0.4,\n\n    close_mosaic=10,\n\n    # ========================\n    # OTIMIZAÇÃO\n    # ========================\n\n    lr0=0.001,\n    lrf=0.001,\n    momentum=0.937,\n    weight_decay=0.0005,\n\n    warmup_epochs=3,\n    warmup_momentum=0.8,\n    warmup_bias_lr=0.1,\n\n    cos_lr=True,\n\n    # ========================\n    # CONTROLE DE TREINO\n    # ========================\n\n    patience=50,\n    save=True,\n    save_period=10,\n\n    plots=True\n)\n\n# =====================================\n# 4. Avaliação extra\n# =====================================\n\nmetrics = model.val(conf=0.1)\n\nprint(metrics)\n\n# =====================================\n# 5. Backup dos resultados\n# =====================================\n\nfolder_to_zip = \"/kaggle/working/runs\"\noutput_zip = \"/kaggle/working/runs_backup\"\n\nshutil.make_archive(output_zip, 'zip', folder_to_zip)\n\nprint(\"Treinamento concluído e backup salvo.\")","metadata":{"_uuid":"10c2c145-8983-4677-aac9-fbe948b58ee2","_cell_guid":"538fc4e2-4607-44e8-a7fb-10d03cae9715","trusted":true,"execution":{"iopub.status.busy":"2026-03-30T15:25:23.778658Z","iopub.execute_input":"2026-03-30T15:25:23.778948Z","iopub.status.idle":"2026-03-30T15:55:23.687757Z","shell.execute_reply.started":"2026-03-30T15:25:23.77892Z","shell.execute_reply":"2026-03-30T15:55:23.686884Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ==========================================\n# 🔧 CONFIGURE AQUI (APENAS ISSO)\n# ==========================================\n\nMODEL_PATH = \"/kaggle/input/datasets/omarvs/yolo8nmercadotacaro/detect/train/weights/best.pt\"\n\nTEST_IMAGES_PATH = \"/kaggle/input/competitions/grocery-items-multi-class-object-detection/testImages/testImages/images\"\n\nOUTPUT_DIR = \"/kaggle/working/predictions\"\n\n\n# ==========================================\n# 🚀 IMPORTS\n# ==========================================\nfrom ultralytics import YOLO\nfrom pathlib import Path\nimport cv2\nimport os\n\n\n\n# ==========================================\n# 📁 PATHS\n# ==========================================\ntest_images = Path(TEST_IMAGES_PATH)\noutput_dir = Path(OUTPUT_DIR)\n\nimages_output_dir = output_dir / \"images\"\nlabels_output_dir = output_dir / \"labels\"\n\nimages_output_dir.mkdir(parents=True, exist_ok=True)\nlabels_output_dir.mkdir(parents=True, exist_ok=True)\n\n# ==========================================\n# 🤖 LOAD MODEL\n# ==========================================\nmodel = YOLO(MODEL_PATH)\n# ==========================================\n# 🔍 FUNÇÃO DE PREDIÇÃO\n# ==========================================\ndef predict_and_save(model, image_path, output_path_img, output_path_txt):\n    results = model.predict(image_path, conf=0.01, device=\"cpu\", verbose=False)\n\n    result = results[0]\n\n    # 🖼️ salvar imagem com bbox\n    img = result.plot()\n    cv2.imwrite(str(output_path_img), img)\n\n    # 📝 salvar txt\n    with open(output_path_txt, \"w\") as f:\n        if result.boxes is None:\n            return\n        \n        for box in result.boxes:\n            cls_id = int(box.cls)\n            conf = float(box.conf[0])\n\n            # 🔥 formato YOLO (igual seu código original)\n            x_center, y_center, width, height = box.xywhn[0].tolist()\n\n            f.write(f\"{cls_id} {conf:.6f} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\\n\")\n\n\n# ==========================================\n# 🔄 LOOP PRINCIPAL\n# ==========================================\nimage_list = sorted([\n    p for p in test_images.glob(\"*\")\n    if p.suffix.lower() in [\".jpg\", \".png\", \".jpeg\"]\n])\n\nprint(f\"🔍 {len(image_list)} imagens encontradas\")\n\nfor img_path in image_list:\n    output_img = images_output_dir / img_path.name\n    output_txt = labels_output_dir / f\"{img_path.stem}.txt\"\n\n    predict_and_save(model, img_path, output_img, output_txt)\n\n# ==========================================","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}