{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport cv2\nimport os\nimport re\n\nfrom PIL import Image\n\nimport albumentations as A\nfrom albumentations.pytorch.transforms import ToTensorV2\n\nfrom matplotlib import pyplot as plt","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"DIR_INPUT = '/kaggle/input/global-wheat-detection'\nDIR_TRAIN = f'{DIR_INPUT}/train'\nDIR_TEST = f'{DIR_INPUT}/test'\n\nDIR_WEIGHTS = '/kaggle/input/fasterrcnn-resnet50-fpnpth'\n\nWEIGHTS_FILE = f'{DIR_WEIGHTS}/fasterrcnn_resnet50_fpn_20epochs.pth'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df = pd.read_csv(f'{DIR_INPUT}/train.csv')\ntrain_df.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def unpack_bbox(df):\n    '''\n        Unpack bbox strings to int64\n        \n        Args:\n            df(pd.DataFrame): A dataframe with a column named 'bbox',\n                with strings of x,y,w,h of bounding boxes\n        Returns:\n            None\n    '''\n    df['x'] = -1\n    df['y'] = -1\n    df['w'] = -1\n    df['h'] = -1\n\n    def expand_bbox(x):\n        r = np.array(re.findall(\"([0-9]+[.]?[0-9]*)\", x))\n        if len(r) == 0:\n            r = [-1, -1, -1, -1]\n        return r\n\n    df[['x', 'y', 'w', 'h']] = np.stack(df['bbox'].apply(lambda x: expand_bbox(x)))\n    df.drop(columns=['bbox'], inplace=True)\n    df['x'] = df['x'].astype(np.float32)\n    df['y'] = df['y'].astype(np.float32)\n    df['w'] = df['w'].astype(np.float32)\n    df['h'] = df['h'].astype(np.float32)\n    df['x'] = df['x'].astype(np.int32)\n    df['y'] = df['y'].astype(np.int32)\n    df['w'] = df['w'].astype(np.int32)\n    df['h'] = df['h'].astype(np.int32)\n    df['x1'] = df['x']\n    df['y1'] = df['y']\n    df['x2'] = df['x']+df['w']\n    df['y2'] = df['y']+df['h']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"unpack_bbox(train_df)\ntrain_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"eval_df = pd.read_csv(f'/kaggle/input/wheat-eval/fasterrcnn_resnet50_fpn_10epochs_results.csv')\nunpack_bbox(eval_df)\neval_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def bboxes_one_img(train_df,eval_df,image_id):\n    labelled_bboxes = train_df[train_df['image_id']==image_id]\n    pred_bboxes = eval_df[eval_df['image_id']==image_id]\n    return labelled_bboxes,pred_bboxes","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def visualize_result(image,pred_bboxes,pred_scores=None,labelled_bboxes=None):\n    '''\n        Visualize predicted bboxes with optional scores and optional ground truth bboxes\n        \n        Args:\n            image(np.array): an image of wheat\n            pred_bboxes(pd.DataFrame(int)): \n                a dataframe of columns of predicted bboxes x1,y1,x2,y2 coordinates\n            pred_scores(pd.Series or [], optional): a list of confidence of predicted bboxes\n            labelled_bboxes(pd.DataFrame(int), optional): \n                a dataframe of columns of ground truth bboxes x1,y1,x2,y2 coordinates\n        Returns:\n            None\n    '''\n    \n    fig, ax = plt.subplots(1, 1, figsize=(16, 8))\n    boxes = pred_bboxes\n    for i in range(len(boxes)):\n        cv2.rectangle(image,\n                      (boxes['x1'][i].astype(np.int64), boxes['y1'][i].astype(np.int64)),\n                      (boxes['x2'][i].astype(np.int64), boxes['y2'][i].astype(np.int64)),\n                      color = (0,220, 0), thickness = 3)\n        if pred_scores is not None:\n            cv2.putText(image, f'{pred_scores[i]:.2f}', (boxes['x1'][i].astype(np.int64), \n                        boxes['y1'][i].astype(np.int64)-10), cv2.FONT_HERSHEY_SIMPLEX,\n                        0.9, (36,255,12), 2)\n            \n    if labelled_bboxes is not None:\n        boxes = labelled_bboxes\n        for i in range(len(boxes)):\n            cv2.rectangle(image,\n                          (boxes['x1'][i].astype(np.int64), boxes['y1'][i].astype(np.int64)),\n                          (boxes['x2'][i].astype(np.int64), boxes['y2'][i].astype(np.int64)),\n                          color = (220, 0, 0), thickness = 3)\n\n    ax.set_axis_off()\n    ax.imshow(image)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"image_ids = train_df['image_id'].unique()\nimage_id = image_ids[0]\nlabelled_bboxes,pred_bboxes = bboxes_one_img(train_df,eval_df,image_id)\n\nimage = cv2.imread(f'{DIR_TRAIN}/{image_id}'+'.jpg')\npred_scores = pred_bboxes['score']\nvisualize_result(image,pred_bboxes,pred_scores,labelled_bboxes)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# image = cv2.imread(f'{DIR_TRAIN}/{image_id}'+'.jpg')\nsharpen_kernel = np.array([[0,-1,0], [-1,5,-1], [0,-1,0]])\nedge_kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"image = cv2.imread(f'{DIR_TRAIN}/{image_id}'+'.jpg')\nimage = cv2.filter2D(image, -1, sharpen_kernel)\nfig, ax = plt.subplots(1, 2, figsize=(16, 8))\nax[0].set_axis_off()\nax[0].imshow(image)\nimage = cv2.imread(f'{DIR_TRAIN}/{image_id}'+'.jpg')\nimage = cv2.filter2D(image, -1, edge_kernel)\nax[1].set_axis_off()\nax[1].imshow(image)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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}