{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import os\nfrom math import log2, ceil\nfrom pathlib import Path\n\nimport pandas as pd \nfrom matplotlib import pyplot as plt\nimport numpy as np\nimport cv2\n%matplotlib inline","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Import train.csv","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"path_dir_project = Path('/kaggle/input/global-wheat-detection')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"df_train = pd.read_csv(path_dir_project/'train.csv')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Calculate bbox number per image","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"list_jpg = list()\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    if dirname != '/kaggle/input/global-wheat-detection/train': \n        continue \n        \n    for filename in filenames:\n        if filename[-4:] != '.jpg': \n            print(filename)\n            continue \n            \n        list_jpg.append(filename[:-4])\n\ndf_jpg_filename = pd.DataFrame(list_jpg, columns=['image_id'])\n\n\ndf_num_bb = df_train['image_id'].value_counts().reset_index()\ndf_num_bb.columns = ['image_id', 'count']\n\ndf_num_bb_per_image = pd.merge(df_jpg_filename, df_num_bb, how='left', on='image_id').fillna(0)\n\ndisplay(df_num_bb_per_image)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_num_bb_distribution = df_num_bb_per_image['count'].value_counts().sort_index().reset_index()\ndf_num_bb_distribution.columns = ['number', 'count']\ndisplay(df_num_bb_distribution)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Plot bounding-box distribution","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"fig = plt.figure(figsize=(20, 5))\n\nplt.bar(df_num_bb_distribution['number'], df_num_bb_distribution['count'])\n\nplt.title('Bounding-box distribution')\nplt.xlabel('number per image')\nplt.ylabel('counts')\n\nplt.show()\nplt.close()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Representitive number","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"min_num_box = df_num_bb_distribution['number'].min()\nfew_num_box = df_num_bb_distribution['number'][1]\nmax_num_box = df_num_bb_distribution['number'].max()\nave_num_box = np.round(df_num_bb_distribution['number'].mean(), 0)\nstd_num_box = np.round(df_num_bb_distribution['number'].std(), 0)\n\nnum_popular = df_num_bb_distribution['count'].max()\npopular_num_box = df_num_bb_distribution[df_num_bb_distribution['count'] == num_popular]['number'].values.tolist()\n\nprint(f'min_num_box: {min_num_box}')\nprint(f'few_num_box: {few_num_box}')\nprint(f'max_num_box: {max_num_box}')\nprint(f'ave_num_box: {ave_num_box}')\nprint(f'std_num_box: {std_num_box}')\nprint(f'popular_num_box: {popular_num_box}')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"query_min = df_num_bb_per_image['count'] == min_num_box\nsr_image_id_has_min_num_box = df_num_bb_per_image[query_min]['image_id']\n\nquery_few = df_num_bb_per_image['count'] == few_num_box\nsr_image_id_has_few_num_box = df_num_bb_per_image[query_few]['image_id']\n\nquery_max = df_num_bb_per_image['count'] == max_num_box\nsr_image_id_has_max_num_box = df_num_bb_per_image[query_max]['image_id']\n\nquery_ave = df_num_bb_per_image['count'] == ave_num_box\nsr_image_id_has_ave_num_box = df_num_bb_per_image[query_ave]['image_id']\n\nlist_image_id_popular = list()\nfor pop_num_box in popular_num_box:\n    query_popular = df_num_bb_per_image['count'] == pop_num_box\n    list_image_id_popular.extend(df_num_bb_per_image[query_popular]['image_id'].values.tolist())\n\nprint(f'image_id_has_min_num_box:\\n {sr_image_id_has_min_num_box.values.tolist()}')\nprint(f'image_id_has_few_num_box:\\n {sr_image_id_has_few_num_box.values.tolist()}')\nprint(f'image_id_has_max_num_box:\\n {sr_image_id_has_max_num_box.values.tolist()}')\nprint(f'image_id_has_ave_num_box:\\n {sr_image_id_has_ave_num_box.values.tolist()}')\nprint(f'image_id_has_popular_num_box:\\n {list_image_id_popular}')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Visualize images","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"bboxes = np.stack(df_train['bbox'].apply(lambda x: np.fromstring(x[1:-1], sep=','))).astype(int)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for i, column in enumerate(['x_min', 'y_min', 'width', 'height']):\n    df_train[column] = bboxes[:,i]\n    \ndf_train[\"x_max\"] = df_train.apply(lambda col: col.x_min + col.width, axis=1)\ndf_train[\"y_max\"] = df_train.apply(lambda col: col.y_min + col.height, axis = 1)\ndf_train.drop(columns=['bbox'], inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def draw_bbox(image_id, df_train):\n    fig_filename = f'{image_id}.jpg'\n    filepath = path_dir_project/f'train/{fig_filename}'\n\n    image = cv2.imread(str(filepath))\n\n    query_target = df_train['image_id'] == image_id\n    bboxes_target = df_train[query_target][['x_min', 'y_min', 'x_max', 'y_max']]\n\n    for idx in range(len(bboxes_target)): \n        bbox = bboxes_target.iloc[idx].values\n        image = cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (0, 0, 255), 5)\n        \n    return image\n\n\ndef plot_images(df_train, image_ids):\n    num_images = len(image_ids)\n    num_row = ceil(num_images / 2)\n    if num_images >= 2:\n        fig, axes = plt.subplots(num_row, 2, figsize=(20, 10 * num_row))\n        for idx_img, image_id in enumerate(image_ids):\n            image_bboxes = draw_bbox(image_id, df_train)\n            axes[idx_img // 2][idx_img % 2].imshow(cv2.cvtColor(image_bboxes, cv2.COLOR_BGR2RGB))\n            axes[idx_img // 2][idx_img % 2].set_title(image_id)\n            \n    else: \n        image_id = image_ids[0]\n        fig = plt.figure(figsize=(7, 6))\n\n        image_bboxes = draw_bbox(image_id, df_train)\n        plt.imshow(cv2.cvtColor(image_bboxes, cv2.COLOR_BGR2RGB))\n        plt.title(image_id)        \n\n    plt.show()\n    plt.close()    ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Min number","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"ext_image_id = np.random.choice(sr_image_id_has_min_num_box, 8, replace=False)\nprint(ext_image_id)\n\nplot_images(df_train, ext_image_id)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Few number","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"ext_image_id = np.random.choice(sr_image_id_has_few_num_box, 8, replace=False)\nprint(ext_image_id)\n\nplot_images(df_train, ext_image_id)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Max number","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"plot_images(df_train, sr_image_id_has_max_num_box.values.tolist())","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Ave number","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"ext_image_id = np.random.choice(sr_image_id_has_ave_num_box, 8, replace=False)\nprint(ext_image_id)\n\nplot_images(df_train, ext_image_id)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Popular number","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"ext_image_id = np.random.choice(list_image_id_popular, 8, replace=False)\nprint(ext_image_id)\n\nplot_images(df_train, ext_image_id)","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}