{"cells":[{"metadata":{"_uuid":"bdde676f-0ac1-490e-8e76-8b201ac78ec3","_cell_guid":"13b99bc8-27d4-4d58-a1ff-e3c8bc39b643","trusted":true},"cell_type":"code","source":"#installing keras\n!git clone https://github.com/fizyr/keras-retinanet.git\n%cd keras-retinanet/\n!pip install .\n!python setup.py build_ext --inplace\n#importing libraries\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\nimport requests\nimport urllib\nfrom tqdm.notebook import tqdm\nimport os\nfrom PIL import Image\nfrom keras_retinanet import models\nfrom keras_retinanet.utils.image import preprocess_image, resize_image\nfrom keras_retinanet.utils.visualization import draw_box, draw_caption\nfrom keras_retinanet.utils.colors import label_color\nfrom ast import literal_eval\nimport cv2\nfrom PIL import Image, ImageDraw\n\n#importing dataset\n%cd ..\ntrain = pd.read_csv('/kaggle/input/global-wheat-detection/train.csv')\ntrain_img = '/kaggle/input/global-wheat-detection/train'\ntest_img = '/kaggle/input/global-wheat-detection/test'\n\n#visualising images\ndef show_images(images, num = 5):\n    \n    images_to_show = np.random.choice(images, num)\n\n    for image_id in images_to_show:\n\n        image_path = os.path.join(train_img, image_id + \".jpg\")\n        image = Image.open(image_path)\n\n        # get all bboxes for given image in [xmin, ymin, width, height]\n        bboxes = [literal_eval(box) for box in train[train['image_id'] == image_id]['bbox']]\n\n        # visualize them\n        draw = ImageDraw.Draw(image)\n        for bbox in bboxes:    \n            draw.rectangle([bbox[0], bbox[1], bbox[0] + bbox[2], bbox[1] + bbox[3]], width=3)\n\n        plt.figure(figsize = (15,15))\n        plt.imshow(image)\n        plt.show()\n\nunique_images = train['image_id'].unique()\nshow_images(unique_images)   \n\n#preprocessing data\nbboxs=[ bbox[1:-1].split(', ') for bbox in train['bbox']]\nbboxs=[ f\"{float(bbox[0])},{float(bbox[1])},{(float(bbox[0]))+(float(bbox[2]))},{(float(bbox[1])) + (float(bbox[3]))},wheat\" for bbox in bboxs]\ntrain['bbox_']=bboxs\ntrain.head()\n\ntrain_df=train[['image_id','bbox_']]\ntrain_df.head()\ntrain_df=train_df.sample(frac=1).reset_index(drop=True)\ntrain_df.head()\n\n#creating required csv files for training\nwith open(\"annotations.csv\",\"w\") as file:\n    for idx in range(len(train_df)):\n        file.write(train_img+\"/\"+train_df.iloc[idx,0]+\".jpg\"+\",\"+train_df.iloc[idx,1]+\"\\n\")\n        \nwith open(\"classes.csv\",\"w\") as file:\n    file.write(\"wheat,0\")\n    \n!head annotations.csv\n\nif not os.path.exists('snapshots'):\n  os.mkdir('snapshots')\n\n#loading pretrained model\nPRETRAINED_MODEL = './snapshots/_pretrained_model.h5'\nURL_MODEL = 'https://github.com/fizyr/keras-retinanet/releases/download/0.5.1/resnet50_coco_best_v2.1.0.h5'\nurllib.request.urlretrieve(URL_MODEL, PRETRAINED_MODEL)\nprint('Downloaded pretrained model to ' + PRETRAINED_MODEL)\n\n#training model\n!keras-retinanet/keras_retinanet/bin/train.py --freeze-backbone \\\n  --random-transform \\\n  --weights {PRETRAINED_MODEL} \\\n  --batch-size 8 \\\n  --steps 500 \\\n  --epochs 15 \\\n  csv annotations.csv classes.csv\n\n!ls snapshots\nmodel_path = os.path.join('snapshots', sorted(os.listdir('snapshots'), reverse=True)[0])\n\nmodel = models.load_model(model_path, backbone_name='resnet50')\nmodel = models.convert_model(model)\nli=os.listdir(test_img)\nli[:5]\n\ndef predict(image):\n    image = preprocess_image(image.copy())\n    #image, scale = resize_image(image)\n\n    boxes, scores, labels = model.predict_on_batch(\n    np.expand_dims(image, axis=0)\n  )\n\n    #boxes /= scale\n\n    return boxes, scores, labels\n\ndef draw_detections(image, boxes, scores, labels):\n    for box, score, label in zip(boxes[0], scores[0], labels[0]):\n        if score < THRES_SCORE:\n            break\n\n        color = label_color(label)\n\n        b = box.astype(int)\n        draw_box(image, b, color=color)\n\n        caption = \"{:.3f}\".format(score)\n        draw_caption(image, b, caption)\n        \n\npreds=[]\nimgid=[]\nfor img in tqdm(li,total=len(li)):\n    img_path = test_img+'/'+img\n    image = read_image_bgr(img_path)\n    boxes, scores, labels = predict(image)\n    boxes=boxes[0]\n    scores=scores[0]\n    for idx in range(boxes.shape[0]):\n        if scores[idx]>THRES_SCORE:\n            box,score=boxes[idx],scores[idx]\n            imgid.append(img.split(\".\")[0])\n            preds.append(\"{} {} {} {} {}\".format(score, int(box[0]), int(box[1]), int(box[2]-box[0]), int(box[3]-box[1])))\n\nsub={\"image_id\":imgid, \"PredictionString\":preds}\nsub=pd.DataFrame(sub)\nsub_=sub.groupby([\"image_id\"])['PredictionString'].apply(lambda x: ' '.join(x)).reset_index()\nsamsub=pd.read_csv(\"/kaggle/input/global-wheat-detection/sample_submission.csv\")\n\nfor idx,imgid in enumerate(samsub['image_id']):\n    samsub.iloc[idx,1]=sub_[sub_['image_id']==imgid].values[0,1]\n\nsamsub.to_csv('/kaggle/working/submission.csv',index=False)","execution_count":null,"outputs":[]}],"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"}},"nbformat":4,"nbformat_minor":4}