{"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 cv2\nimport gc\nimport numpy as np\nimport os\nimport pandas as pd\nimport PIL.Image as Image\nimport tifffile as tiff\n\nfrom matplotlib import pyplot as plt\nfrom pathlib import Path\nfrom tqdm.notebook import tqdm","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-03-17T20:15:18.604642Z","iopub.execute_input":"2023-03-17T20:15:18.605621Z","iopub.status.idle":"2023-03-17T20:15:19.051815Z","shell.execute_reply.started":"2023-03-17T20:15:18.605565Z","shell.execute_reply":"2023-03-17T20:15:19.050122Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"OUTPUT_PNG = True\nOUTPUT_NPY = False\n\nROI_SIZE = 1024\nIMAGE_NUM = 3\n\nINPUT_DIR = Path(\"/kaggle/input/vesuvius-challenge-ink-detection/train\")\nOUTPUT_DIR = Path(\"/kaggle/working/\")","metadata":{"execution":{"iopub.status.busy":"2023-03-17T20:15:19.053805Z","iopub.execute_input":"2023-03-17T20:15:19.054185Z","iopub.status.idle":"2023-03-17T20:15:19.060657Z","shell.execute_reply.started":"2023-03-17T20:15:19.054149Z","shell.execute_reply":"2023-03-17T20:15:19.059393Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def crop_image(image_id, input_dir, output_dir):\n\n    output_data_dir = Path(output_dir / f\"{image_id}\")\n    if not output_data_dir.exists():\n        output_data_dir.mkdir()\n\n    # Load label image\n    inklabels_img = np.array(Image.open(str(input_dir / f\"{image_id}\" / \"inklabels.png\")))\n    inklabels_img = np.pad(inklabels_img, [(0, ROI_SIZE-inklabels_img.shape[0]%ROI_SIZE), (0, ROI_SIZE-inklabels_img.shape[1]%ROI_SIZE)], 'constant')\n\n    # Get the scanning position of the image\n    x_pos_list = []\n    y_pos_list = []\n    for y in range(0, inklabels_img.shape[0], ROI_SIZE):\n        for x in range(0, inklabels_img.shape[1], ROI_SIZE):\n            if inklabels_img[y:y+ROI_SIZE, x:x+ROI_SIZE].max() > 0:\n                x_pos_list.append(x)\n                y_pos_list.append(y)\n\n    # Crop the image\n    image_path_list = sorted(list(Path(input_dir / f\"{image_id}\" / \"surface_volume\").glob('*.tif')))\n    for i, image_path in tqdm(enumerate(image_path_list), total=len(image_path_list), desc=f\"Cropping images - {image_id}\", dynamic_ncols=True):\n\n        # load image\n        img = tiff.imread(str(image_path))\n        img = np.pad(img, [(0, ROI_SIZE-img.shape[0]%ROI_SIZE), (0, ROI_SIZE-img.shape[1]%ROI_SIZE)], 'constant')\n\n        # crop\n        for j, (x, y) in enumerate(zip(x_pos_list, y_pos_list)):\n\n            image_roi = img[y:y+ROI_SIZE, x:x+ROI_SIZE]\n            image_roi = image_roi.astype(np.float32) / 65535.0\n\n            if OUTPUT_NPY:\n                np.save(str(output_data_dir / f\"{j:03d}_{i:02d}\"), image_roi)\n\n            if OUTPUT_PNG:\n                output_image_dir = Path(output_data_dir / f\"{j:03d}\")\n                if not output_image_dir.exists():\n                    output_image_dir.mkdir()\n                cv2.imwrite(str(output_image_dir / f\"{i:02d}.png\"), (image_roi * 255).astype(np.uint8))\n\n        del img\n        gc.collect()\n\n    # Create training data\n    image_id_list = []\n    roi_id_list = []\n    for j, (x, y) in tqdm(enumerate(zip(x_pos_list, y_pos_list)), total=len(x_pos_list), desc=f\"Merge images - {image_id}\", dynamic_ncols=True):\n\n        # input\n        if OUTPUT_NPY:\n            image_tiles = []\n            for i in range(len(image_path_list)):\n                filename = str(output_data_dir / f\"{j:03d}_{i:02d}.npy\")\n                image_tiles.append(np.load(filename))\n                os.remove(filename)\n            np.save(str(output_data_dir / f\"{j:03d}\"), np.stack(image_tiles, axis=0))\n\n        # mask\n        image_roi = inklabels_img[y:y+ROI_SIZE, x:x+ROI_SIZE]\n        cv2.imwrite(str(output_data_dir / f\"{j:03d}.png\"), (image_roi * 255).astype(np.uint8))\n\n        # metadata\n        image_id_list.append(image_id)\n        roi_id_list.append(f\"{j:03d}\")\n\n    # Drawing to check the cropped position\n    inklabels_img = (inklabels_img * 255).astype(np.uint8)\n    inklabels_img = cv2.cvtColor(inklabels_img, cv2.COLOR_GRAY2BGR)\n    for x, y in zip(x_pos_list, y_pos_list):\n        inklabels_img = cv2.rectangle(\n            inklabels_img,\n            (x, y),\n            (x+ROI_SIZE, y+ROI_SIZE),\n            (0, 255, 0),\n            thickness=10)\n\n    cv2.imwrite(str(output_dir / f\"crop_image{image_id}.png\"), inklabels_img)\n    plt.imshow(cv2.cvtColor(inklabels_img, cv2.COLOR_BGR2RGB))\n    plt.axis('off')\n    plt.show()\n\n    return {\n        \"image_id_list\": image_id_list,\n        \"roi_id_list\": roi_id_list,\n        \"x_pos_list\": x_pos_list,\n        \"y_pos_list\": y_pos_list,\n    }","metadata":{"execution":{"iopub.status.busy":"2023-03-17T20:15:19.061969Z","iopub.execute_input":"2023-03-17T20:15:19.062739Z","iopub.status.idle":"2023-03-17T20:15:19.087861Z","shell.execute_reply.started":"2023-03-17T20:15:19.062689Z","shell.execute_reply":"2023-03-17T20:15:19.085779Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image_id_list_all = []\nroi_id_list_all = []\nx_pos_list_all = []\ny_pos_list_all = []\nfor image_id in range(1, IMAGE_NUM+1):\n\n    outputs = crop_image(image_id, INPUT_DIR, OUTPUT_DIR)\n\n    image_id_list_all.extend(outputs[\"image_id_list\"])\n    roi_id_list_all.extend(outputs[\"roi_id_list\"])\n    x_pos_list_all.extend(outputs[\"x_pos_list\"])\n    y_pos_list_all.extend(outputs[\"y_pos_list\"])\n\ndf = pd.DataFrame({\n    \"image_id\": image_id_list_all,\n    \"roi_id\": roi_id_list_all,\n    \"x_pos\": x_pos_list_all,\n    \"y_pos\": y_pos_list_all,\n})\ndf.to_csv(str(OUTPUT_DIR / \"train.csv\"), index=False)","metadata":{"execution":{"iopub.status.busy":"2023-03-17T20:15:19.091834Z","iopub.execute_input":"2023-03-17T20:15:19.092750Z","iopub.status.idle":"2023-03-17T20:24:58.687826Z","shell.execute_reply.started":"2023-03-17T20:15:19.092689Z","shell.execute_reply":"2023-03-17T20:24:58.686181Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv(str(OUTPUT_DIR / \"train.csv\"))\ndf.head()","metadata":{"execution":{"iopub.status.busy":"2023-03-17T20:24:58.689969Z","iopub.execute_input":"2023-03-17T20:24:58.690497Z","iopub.status.idle":"2023-03-17T20:24:58.724186Z","shell.execute_reply.started":"2023-03-17T20:24:58.690420Z","shell.execute_reply":"2023-03-17T20:24:58.722522Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}