{"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":"code","source":"import numpy as np\nimport os\nimport sys\nimport tensorflow as tf\nimport time\n\n# 导入用于提交预测结果的库\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":"将TensorFlow COTS检测模型加载到内存中，并定义一些util函数来运行推理。","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":"运行推断并创建提交数据","metadata":{}},{"cell_type":"code","source":"env = greatbarrierreef.make_env()   #初始化环境\niter_test = env.iter_test()    #使用迭代器遍历测试集和样本提交","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.25\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    #使用TensorFlow模型运行对象检测\n    detections = detect(image_np)\n    \n    #解析检测结果并生成预测字符串\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    # 生成提交数据\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":[]}]}