{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"Thanks [khanhlvg](https://www.kaggle.com/khanhlvg) for his notebook [COTS detection w/ TensorFlow Object Detection API](https://www.kaggle.com/khanhlvg/cots-detection-w-tensorflow-object-detection-api/) and [Inference using EfficientDet-D0 model (TensorFlow)](https://www.kaggle.com/khanhlvg/inference-using-efficientdet-d0-model-tensorflow). In this notebook I am experimenting which Deteciton Thresold works best which may be helpful.\n\nFollowing table shows LB score with repect to different Deteciton Thresold. Currently Deteciton Thresold with 0.19 has slightly better score.\n\n|  Detection Threshold   | LB Score  |\n|  ----  | ----  |\n| 0.25  | 0.441 |\n| 0.21  | 0.445 |\n| 0.2  | 0.445 |\n| 0.19  | 0.445+ |\n| 0.15  | 0.431 |","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19"}},{"cell_type":"code","source":"import numpy as np\nimport os\nimport sys\nimport tensorflow as tf\nimport time\n\n# Import the library that is used to submit the prediction result.\nINPUT_DIR = '../input/tensorflow-great-barrier-reef/'\nsys.path.insert(0, INPUT_DIR)\nimport greatbarrierreef","metadata":{"execution":{"iopub.status.busy":"2021-11-23T03:34:35.526216Z","iopub.execute_input":"2021-11-23T03:34:35.527075Z","iopub.status.idle":"2021-11-23T03:34:40.800698Z","shell.execute_reply.started":"2021-11-23T03:34:35.526941Z","shell.execute_reply":"2021-11-23T03:34:40.79933Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Load the TensorFlow COTS detection model into memory and define some util functions for running inference.","metadata":{"execution":{"iopub.status.busy":"2021-11-23T03:32:24.29052Z","iopub.execute_input":"2021-11-23T03:32:24.290814Z","iopub.status.idle":"2021-11-23T03:32:24.295257Z","shell.execute_reply.started":"2021-11-23T03:32:24.290785Z","shell.execute_reply":"2021-11-23T03:32:24.294012Z"}}},{"cell_type":"code","source":"MODEL_DIR = '../input/cots-detection-w-tensorflow-object-detection-api/cots_efficientdet_d0'\nstart_time = time.time()\ntf.keras.backend.clear_session()\ndetect_fn_tf_odt = tf.saved_model.load(os.path.join(os.path.join(MODEL_DIR, 'output'), 'saved_model'))\nend_time = time.time()\nelapsed_time = end_time - start_time\nprint('Elapsed time: ' + str(elapsed_time) + 's')","metadata":{"execution":{"iopub.status.busy":"2021-11-23T03:34:40.803168Z","iopub.execute_input":"2021-11-23T03:34:40.803539Z","iopub.status.idle":"2021-11-23T03:35:17.133959Z","shell.execute_reply.started":"2021-11-23T03:34:40.803488Z","shell.execute_reply":"2021-11-23T03:35:17.132719Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_image_into_numpy_array(path):\n    \"\"\"Load an image from file into a numpy array.\n\n    Puts image into numpy array to feed into tensorflow graph.\n    Note that by convention we put it into a numpy array with shape\n    (height, width, channels), where channels=3 for RGB.\n\n    Args:\n    path: a file path (this can be local or on colossus)\n\n    Returns:\n    uint8 numpy array with shape (img_height, img_width, 3)\n    \"\"\"\n    img_data = tf.io.gfile.GFile(path, 'rb').read()\n    image = Image.open(io.BytesIO(img_data))\n    (im_width, im_height) = image.size\n    \n    return np.array(image.getdata()).reshape(\n      (im_height, im_width, 3)).astype(np.uint8)\n\ndef detect(image_np):\n    \"\"\"Detect COTS from a given numpy image.\"\"\"\n\n    input_tensor = np.expand_dims(image_np, 0)\n    start_time = time.time()\n    detections = detect_fn_tf_odt(input_tensor)\n    return detections","metadata":{"execution":{"iopub.status.busy":"2021-11-23T03:35:17.135386Z","iopub.execute_input":"2021-11-23T03:35:17.135651Z","iopub.status.idle":"2021-11-23T03:35:17.143662Z","shell.execute_reply.started":"2021-11-23T03:35:17.13562Z","shell.execute_reply":"2021-11-23T03:35:17.142848Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Run inference and create the submission data","metadata":{}},{"cell_type":"code","source":"env = greatbarrierreef.make_env()   # initialize the environment\niter_test = env.iter_test()    # an iterator which loops over the test set and sample submission","metadata":{"execution":{"iopub.status.busy":"2021-11-23T03:35:17.145477Z","iopub.execute_input":"2021-11-23T03:35:17.145718Z","iopub.status.idle":"2021-11-23T03:35:17.158988Z","shell.execute_reply.started":"2021-11-23T03:35:17.145689Z","shell.execute_reply":"2021-11-23T03:35:17.15752Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"DETECTION_THRESHOLD = 0.19\n\nsubmission_dict = {\n    'id': [],\n    'prediction_string': [],\n}\n\nfor (image_np, sample_prediction_df) in iter_test:\n    height, width, _ = image_np.shape\n    \n    # Run object detection using the TensorFlow model.\n    detections = detect(image_np)\n    \n    # Parse the detection result and generate a prediction string.\n    num_detections = detections['num_detections'][0].numpy().astype(np.int32)\n    predictions = []\n    for index in range(num_detections):\n        score = detections['detection_scores'][0][index].numpy()\n        if score < DETECTION_THRESHOLD:\n            continue\n\n        bbox = detections['detection_boxes'][0][index].numpy()\n        y_min = int(bbox[0] * height)\n        x_min = int(bbox[1] * width)\n        y_max = int(bbox[2] * height)\n        x_max = int(bbox[3] * width)\n        \n        bbox_width = x_max - x_min\n        bbox_height = y_max - y_min\n        \n        predictions.append('{:.2f} {} {} {} {}'.format(score, x_min, y_min, bbox_width, bbox_height))\n    \n    # Generate the submission data.\n    prediction_str = ' '.join(predictions)\n    sample_prediction_df['annotations'] = prediction_str\n    env.predict(sample_prediction_df)\n\n    print('Prediction:', prediction_str)","metadata":{"execution":{"iopub.status.busy":"2021-11-23T03:35:17.160564Z","iopub.execute_input":"2021-11-23T03:35:17.161678Z","iopub.status.idle":"2021-11-23T03:35:27.498754Z","shell.execute_reply.started":"2021-11-23T03:35:17.161629Z","shell.execute_reply":"2021-11-23T03:35:27.497469Z"},"trusted":true},"execution_count":null,"outputs":[]}]}