{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":29876,"databundleVersionId":2468249,"sourceType":"competition"}],"dockerImageVersionId":30666,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## 安装yolov8环境","metadata":{}},{"cell_type":"code","source":"%pip install ultralytics\nimport ultralytics\nultralytics.checks()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Run inference on an image with YOLOv8n\n!yolo predict model=yolov8n.pt source='https://ultralytics.com/images/zidane.jpg'","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 数据处理","metadata":{}},{"cell_type":"code","source":"import os\nimport pandas as pd\nimport numpy as np\nimport random\nimport json\nimport shutil","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_info = json.load(open('../input/cowboyoutfits/train.json', 'r'))\ntemp_an = train_info[\"annotations\"]\ntotle_an = set(each[\"image_id\"] for each in temp_an)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ci = [87, 1034, 131, 318, 588]  # category_id, 分别对应belt,sunglasses,boot,cowboy_hat,jacket\n\ntotle_id = set()\n\nfor each in temp_an:\n    for idx,i in enumerate(ci):\n        if ci[idx] == each[\"category_id\"]:\n            totle_id.add(each[\"image_id\"])\n            break\nprint(len(temp_an))\n\nprint(len(totle_id))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"category = dict()\nfor idx,i in enumerate(ci):\n    category[i] = set()\n\n\nfor each in temp_an:\n    for idx,i in enumerate(ci):\n        if ci[idx] == each[\"category_id\"]:\n            category[i].add(each[\"image_id\"])\n            break\n\nfor idx,i in enumerate(ci):\n    print(len(category[i]))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## split train and test dataset","metadata":{}},{"cell_type":"code","source":"vi_c = [2, 31, 10, 13, 25]\nval_id = set()\nfor idx,i in enumerate(ci):\n    random_items = random.sample(category[i], vi_c[idx])\n    randon_set = set(random_items)\n    val_id = val_id | randon_set\n\ntrain_id = totle_id - val_id\n\nlen(val_id),len(train_id)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_an = []\nfor each_an in temp_an:\n    for tid in train_id:\n        if each_an['image_id'] == tid:\n            train_an.append(each_an)\n            break\n            \nval_an = []\nfor each_an in temp_an:\n    for tid in val_id:\n        if each_an['image_id'] == tid:\n            val_an.append(each_an)\n            break\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.makedirs('./data/train/images' ,exist_ok=True)\nos.makedirs('./data/val/images' ,exist_ok=True)\n\ntrain_img = []\ncopy_img = []\nfor j in train_info['images']:\n    for i in train_id:\n        if j['id'] == i:\n            shutil.copy('../input/cowboyoutfits/images/'+j['file_name'], './data/train/images')\n            for l in category[87]:\n                if j['id'] == l:\n                    copy_img.append(j)\n                    for i in range(15):\n                        shutil.copy('../input/cowboyoutfits/images/'+j['file_name'], './data/train/images/'+ str(i) + j['file_name'])\n            train_img.append(j)    \n                \nval_img = []\n# Move val images\nfor j in train_info['images']:\n    for i in val_id:\n        if j['id'] == i:\n            shutil.copy('../input/cowboyoutfits/images/'+j['file_name'], './data/val/images')\n            val_img.append(j)\n            ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.makedirs('./data/train/labels', exist_ok=True)\nos.makedirs('./data/val/labels', exist_ok=True)\n\ntrain_inf = [(each['id'], each['file_name'].split('.')[0], each['width'], each['height']) for each in train_img]\nval_inf = [(each['id'], each['file_name'].split('.')[0], each['width'], each['height']) for each in val_img]\n\ntrans = {f'{each}': f'{idx}' for (idx, each) in enumerate(ci)}  # Mapping the category_ids\n\n# Create *.txt files for training\nfor (imid, fn, w, h) in train_inf:\n    with open('./data/train/labels/' + fn + '.txt', 'w') as t_f:\n        for t_ann in train_an:\n            if t_ann['image_id'] == imid:\n                # convert X_min,Y_min,w,h to X_center/width,Y_center/height,w/width,h/height\n                bbox = [str((t_ann['bbox'][0] + (t_ann['bbox'][2] / 2) - 1) / float(w)) + ' ',\n                        str((t_ann['bbox'][1] + (t_ann['bbox'][3] / 2) - 1) / float(h)) + ' ',\n                        str(t_ann['bbox'][2] / float(w)) + ' ', \n                        str(t_ann['bbox'][3] / float(h))]\n                t_f.write(trans[str(t_ann['category_id'])] + ' ' + str(bbox[0] + bbox[1] + bbox[2] + bbox[3]))\n                t_f.write('\\n')\n\n\n# Create *.txt files for evaluating\nfor (imid, fn, w, h) in val_inf:\n    with open('./data/val/labels/' + fn + '.txt', 'w') as v_f:\n        for v_ann in val_an:\n            if v_ann['image_id'] == imid:\n                # convert X_min,Y_min,w,h to X_center/width,Ycenter/height,w/width,h/height\n                bbox = [str((v_ann['bbox'][0] + (v_ann['bbox'][2] / 2) - 1) / float(w)) + ' ',\n                        str((v_ann['bbox'][1] + (v_ann['bbox'][3] / 2) - 1) / float(h)) + ' ',\n                        str(v_ann['bbox'][2] / float(w)) + ' ',\n                        str(v_ann['bbox'][3] / float(h))]\n                v_f.write(trans[str(v_ann['category_id'])] + ' ' + str(bbox[0] + bbox[1] + bbox[2] + bbox[3]))\n                v_f.write('\\n')\ncopy_inf = [(each['id'], each['file_name'].split('.')[0]) for each in copy_img]               \nfor (imid, fn) in copy_inf:\n    for i in range(15):\n        shutil.copy('./data/train/labels/' + fn + '.txt', './data/train/labels/' + str(i) + fn + '.txt')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import yaml\nos.makedirs('./data', exist_ok=True)\ndata = dict(\n    train = '/kaggle/working/data/train/images',\n    val = '/kaggle/working/data/val/images',\n    test = '/kaggle/working/data/test/images',\n    nc = 5,\n    names = ['belt','sunglasses', 'boot', 'cowboy_hat', 'jacket']\n)\nwith open('./data.yaml', 'w') as f:\n    yaml.dump(data, f, default_flow_style=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!cat data.yaml","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from ultralytics import YOLO\n\n# Build from YAML and transfer weights\nFinal_model = YOLO('yolov8n.yaml').load('yolov8n.pt')  \n\n# Training The Final Model\nResult_Final_model = Final_model.train(data=\"./data.yaml\",epochs=200, imgsz = 1088 , batch = 16 ,lr0 = 0.001, dropout= 0.10, device = 0)\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(Result_Final_model)","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}