{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":75176,"databundleVersionId":8252256,"sourceType":"competition"}],"dockerImageVersionId":30762,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# %%\nimport os\nimport wandb\n\n# Đăng nhập wandb\nwandb.login(key='4f88ff0bbc6e3485258bca7079d7da4c47798ccd')\n\n# Thiết lập thư mục làm việc và tải mã nguồn YOLO từ GitHub\nHOME = \"/kaggle/working/\"  # Thư mục làm việc hiện tại\nos.chdir(HOME)\n\n# Tải mã nguồn YOLOv9 từ GitHub\n!git clone https://github.com/SkalskiP/yolov9.git\n%cd yolov9\n!pip install -r requirements.txt -q\n\n# Tải các trọng số mô hình YOLOv9 từ các liên kết được cung cấp\n!wget -P {HOME}/weights -q https://github.com/WongKinYiu/yolov9/releases/download/v0.1/yolov9-c.pt\n!wget -P {HOME}/weights -q https://github.com/WongKinYiu/yolov9/releases/download/v0.1/yolov9-e.pt\n!wget -P {HOME}/weights -q https://github.com/WongKinYiu/yolov9/releases/download/v0.1/gelan-c.pt\n!wget -P {HOME}/weights -q https://github.com/WongKinYiu/yolov9/releases/download/v0.1/gelan-e.pt\n\n# Khởi tạo một run mới với tên dự án và tên lượt chạy cụ thể\nwandb.init(project='xuan2261_yolov9', name='test30epoch')\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# %%\nimport numpy as np\nimport pandas as pd\nimport glob\nimport cv2\nfrom tqdm import tqdm\nfrom sklearn.model_selection import train_test_split\nimport shutil\nimport yaml\nfrom skimage import exposure\n\ntqdm.pandas()\n\n# Đường dẫn đến thư mục chứa dữ liệu\nROOT = \"/kaggle/input/amia-public-challenge-2024\"\n\n# Đọc dữ liệu từ bộ dữ liệu mới\ntrain_df = pd.read_csv(ROOT + \"/train.csv\")\nimg_size_df = pd.read_csv(ROOT + \"/img_size.csv\")\n\n# Gộp thông tin kích thước ảnh gốc với dữ liệu huấn luyện\ntrain_df = train_df.merge(img_size_df, on='image_id', how='left')\n\n# Lọc bỏ lớp \"No finding\" (class_id == 14)\ntrain_df = train_df[train_df['class_id'] != 14].reset_index(drop=True)\n\n# Chỉ chọn các cột cần thiết\ntrain_df = train_df[['image_id', 'class_name', 'class_id', 'rad_id', 'x_min', 'y_min', 'x_max', 'y_max', 'dim0', 'dim1']]\n\n# Lấy đường dẫn đến tất cả các ảnh huấn luyện\ntrain_images = glob.glob(ROOT + \"/train/train/*.png\")\n\n# Thêm đường dẫn ảnh vào dataframe\ntrain_df['ImagePath'] = train_df['image_id'].progress_apply(lambda x: next(filter(lambda y: x in y, train_images), None))\n\n# %% \n# Hàm chuyển đổi DataFrame sang định dạng YOLO\ndef convert_to_yolo_format(df):\n    df['center_x'] = (df['x_min'] + df['x_max']) / 2 / df['dim1']\n    df['center_y'] = (df['y_min'] + df['y_max']) / 2 / df['dim0']\n    df['width'] = (df['x_max'] - df['x_min']) / df['dim1']\n    df['height'] = (df['y_max'] - df['y_min']) / df['dim0']\n    return df[['image_id', 'class_id', 'center_x', 'center_y', 'width', 'height']]\n\ndf_yolo = convert_to_yolo_format(train_df)\n\n# %% \n# Tạo thư mục lưu trữ ảnh và nhãn\noutput_dir_images = \"/kaggle/working/yolov9/dataset/images\"\noutput_dir_labels = \"/kaggle/working/yolov9/dataset/labels\"\nos.makedirs(output_dir_images, exist_ok=True)\nos.makedirs(output_dir_labels, exist_ok=True)\n\n# Sao chép ảnh và lưu nhãn\ndef save_labels(image_id, df, output_dir):\n    rows = df[df['image_id'] == image_id]\n    label_path = os.path.join(output_dir, f\"{image_id}.txt\")\n    with open(label_path, 'w') as f:\n        for _, row in rows.iterrows():\n            class_id = row['class_id']\n            x_center = row['center_x']\n            y_center = row['center_y']\n            width = row['width']\n            height = row['height']\n            f.write(f\"{class_id} {x_center} {y_center} {width} {height}\\n\")\n\n# Sao chép ảnh và lưu nhãn cho tất cả ảnh\nfor image_id in tqdm(df_yolo['image_id'].unique()):\n    save_labels(image_id, df_yolo, output_dir_labels)\n\n# %% \n# Phân chia dữ liệu thành tập huấn luyện và kiểm tra\ntrain_ids, val_ids = train_test_split(df_yolo['image_id'].unique(), test_size=0.1, random_state=42)\n\n# Tạo cấu trúc thư mục cho YOLO\nos.makedirs(f\"{output_dir_images}/train\", exist_ok=True)\nos.makedirs(f\"{output_dir_images}/valid\", exist_ok=True)\nos.makedirs(f\"{output_dir_labels}/train\", exist_ok=True)\nos.makedirs(f\"{output_dir_labels}/valid\", exist_ok=True)\n\n# Sao chép các tệp hình ảnh và nhãn vào các thư mục tương ứng\nfor image_id in train_ids:\n    shutil.copy(f\"{ROOT}/train/train/{image_id}.png\", f\"{output_dir_images}/train/{image_id}.png\")\n    shutil.copy(f\"{output_dir_labels}/{image_id}.txt\", f\"{output_dir_labels}/train/{image_id}.txt\")\n\nfor image_id in val_ids:\n    shutil.copy(f\"{ROOT}/train/train/{image_id}.png\", f\"{output_dir_images}/valid/{image_id}.png\")\n    shutil.copy(f\"{output_dir_labels}/{image_id}.txt\", f\"{output_dir_labels}/valid/{image_id}.txt\")\n\n# %% \n# Tạo tệp YAML cấu hình cho YOLO\ndata = {\n    'names': [\n        \"Aortic enlargement\", \"Atelectasis\", \"Calcification\", \"Cardiomegaly\", \n        \"Consolidation\", \"ILD\", \"Infiltration\", \"Lung Opacity\", \"Nodule/Mass\", \n        \"Other lesion\", \"Pleural effusion\", \"Pleural thickening\", \"Pneumothorax\", \n        \"Pulmonary fibrosis\"\n    ],\n    'nc': 14,\n    'train': f\"{output_dir_images}/train\",\n    'val': f\"{output_dir_images}/valid\"\n}\n\nwith open(f\"{output_dir_images}/data.yaml\", 'w') as file:\n    yaml.dump(data, file)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# %% \n# Huấn luyện mô hình YOLO\n%cd /kaggle/working/yolov9\n\n!python train.py --batch 16 --epochs 80 --img 640 --device 0 \\\n--data dataset/images/data.yaml \\\n--weights /kaggle/working/weights/yolov9-c.pt --cfg models/detect/gelan-c.yaml \\\n--hyp hyp.scratch-high.yaml --project xuan2261_yolov9 --name train_80epoch --exist-ok\n\n# Kết thúc ghi lại run của wandb\nwandb.finish()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# ## Kiểm Tra Kết Quả Huấn Luyện\n\n# %%\n!ls {HOME}/yolov9/runs/train/exp/\n\n# Hiển thị kết quả huấn luyện\nfrom IPython.display import Image\n\nImage(filename=f\"{HOME}/yolov9/runs/train/exp/results.png\", width=700)\nImage(filename=f\"{HOME}/yolov9/runs/train/exp/confusion_matrix.png\", width=1000)\nImage(filename=f\"{HOME}/yolov9/runs/train/exp/val_batch0_pred.jpg\", width=1000)","metadata":{}},{"cell_type":"code","source":"# Đánh giá mô hình đã huấn luyện\n%cd /kaggle/working/yolov9\n\n!python val.py --img 640 --batch 8 --conf 0.001 --iou 0.7 --device 0 \\\n--data /kaggle/working/yolov9/dataset/data.yaml \\\n--weights {HOME}/yolov9/runs/train/exp/weights/best.pt --project xuan2261_yolov9 --name val_run --exist-ok\n\n# Kết thúc ghi lại run của wandb\nwandb.finish()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"!ls {HOME}/yolov9/runs/val/exp/\n\n# ## Kiểm Tra Kết Quả Đánh Giá\n# Hiển thị kết quả đánh giá\nfrom IPython.display import Image\n\nImage(filename=f\"{HOME}/yolov9/runs/val/exp/R_curve.png\", width=700)\nImage(filename=f\"{HOME}/yolov9/runs/val/exp/val_batch0_pred.jpg\", width=700)","metadata":{}}]}