{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":84969,"databundleVersionId":10033515,"sourceType":"competition"},{"sourceId":9902245,"sourceType":"datasetVersion","datasetId":6083037}],"dockerImageVersionId":30804,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false},"papermill":{"default_parameters":{},"duration":104.820086,"end_time":"2024-12-05T09:07:06.020274","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2024-12-05T09:05:21.200188","version":"2.6.0"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"\n# CZII: Creating Datasets for YOLO with Additional Data\n\nThis is an modified version of @ITK8191 notebook for generating datasets with additional synthetic data, denoised using Gaussian denoising. Check out the original notebook by [@ITK8191](https://www.kaggle.com/code/itsuki9180/czii-making-datasets-for-yolo).\n\nThere have been various discussions in the competition community regarding whether models trained with synthetic data perform better. For example, see the [David List discussion](https://www.kaggle.com/competitions/czii-cryo-et-object-identification/discussion/555247). \n\nIn my experiments, this was indeed true for YOLO. If someone manages to incorporate the original denoise model or IsoNet, I’m sure that better results could be achieved.\n\n\nWeights for the model can be find here [CZII YOLO L trained with synthetic data\n](https://www.kaggle.com/datasets/sersasj/czii-yolo-l-trained-with-synthetic-data).  \nmodel was trained with TS_5_4, TS_69_2 TS_6_4 TS_6_6 as validation.\n","metadata":{}},{"cell_type":"markdown","source":"# Install and Import Modules","metadata":{"_uuid":"2e538122-a0c3-4dab-963f-ca3fec61a155","_cell_guid":"736bdd25-fc27-4ced-bdcb-3e17c2eaa80f","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"!pip install zarr opencv-python","metadata":{"_uuid":"c47f4213-e8e9-4daa-8f6e-2534f2330d9d","_cell_guid":"51687ee2-978f-4364-aed1-f4a8051735db","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-12-31T02:55:44.680196Z","iopub.execute_input":"2024-12-31T02:55:44.680534Z","iopub.status.idle":"2024-12-31T02:55:58.979587Z","shell.execute_reply.started":"2024-12-31T02:55:44.680468Z","shell.execute_reply":"2024-12-31T02:55:58.978411Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import json\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport zarr\nfrom tqdm import tqdm\nimport glob, os\nimport cv2\nimport shutil\n\n","metadata":{"_uuid":"e19a24b5-9a8e-4758-9466-dc82945251d5","_cell_guid":"a5452423-001e-4d09-9e1b-2fe60d390fa9","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-12-31T02:55:58.981112Z","iopub.execute_input":"2024-12-31T02:55:58.981487Z","iopub.status.idle":"2024-12-31T02:56:03.705021Z","shell.execute_reply.started":"2024-12-31T02:55:58.981451Z","shell.execute_reply":"2024-12-31T02:56:03.704193Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"runs = sorted(glob.glob('/kaggle/input/czii-cryo-et-object-identification/train/overlay/ExperimentRuns/*'))\nprint(runs)\nruns = [os.path.basename(x) for x in runs]\nadditional_runs = sorted(glob.glob('/kaggle/input/czii10441/10441/T*'))\nprint(additional_runs)\nadditional_runs = [os.path.basename(x) for x in additional_runs]\nruns = runs + additional_runs\ni2r_dict = {i: r for i, r in zip(range(len(runs)), runs)}\nr2t_dict = {r: i for i, r in zip(range(len(runs)), runs)}\nprint(\"Runs:\", i2r_dict)","metadata":{"_uuid":"dfdbf477-3136-4e21-b984-169ebc610cda","_cell_guid":"7f87b90b-b803-44fa-817b-54ef06b8cc02","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-12-31T02:56:03.707660Z","iopub.execute_input":"2024-12-31T02:56:03.708900Z","iopub.status.idle":"2024-12-31T02:56:03.725828Z","shell.execute_reply.started":"2024-12-31T02:56:03.708849Z","shell.execute_reply":"2024-12-31T02:56:03.724737Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Normalize Function\nNormalize the image to a value between 0 and 255.","metadata":{"_uuid":"2aab94e2-68df-4cf9-b2f6-2fe18b3d6ee0","_cell_guid":"77ca1180-b9b3-4c11-9b95-818e1625529a","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"def convert_to_8bit(x):\n    lower, upper = np.percentile(x, (0.5, 99.5))\n    x = np.clip(x, lower, upper)\n    x = (x - x.min()) / (x.max() - x.min() + 1e-12) * 255\n    return x.round().astype(\"uint8\")","metadata":{"_uuid":"3ba10d74-2f36-497d-a2a9-b733d622cfa9","_cell_guid":"054c7292-d91d-41f6-b487-b0ba5663b11c","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-12-31T02:56:03.726879Z","iopub.execute_input":"2024-12-31T02:56:03.727173Z","iopub.status.idle":"2024-12-31T02:56:03.732239Z","shell.execute_reply.started":"2024-12-31T02:56:03.727142Z","shell.execute_reply":"2024-12-31T02:56:03.731256Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Information about Labels","metadata":{"_uuid":"84679000-637f-435a-8533-5200f48461a4","_cell_guid":"604020c8-ee33-40b7-b4c4-7c856afbc050","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"p2i_dict = {\n    'apo-ferritin': 0,\n    'beta-amylase': 1,\n    'beta-galactosidase': 2,\n    'ribosome': 3,\n    'thyroglobulin': 4,\n    'virus-like-particle': 5\n}\n\ni2p = {v: k for k, v in p2i_dict.items()}\n\nparticle_radius = {\n    'apo-ferritin': 60,\n    'beta-amylase': 65,\n    'beta-galactosidase': 90,\n    'ribosome': 150,\n    'thyroglobulin': 130,\n    'virus-like-particle': 135,\n}\n\nparticle_names = ['apo-ferritin', 'beta-amylase', 'beta-galactosidase', 'ribosome', 'thyroglobulin', 'virus-like-particle']","metadata":{"_uuid":"88e9a2c2-4b0e-47e0-a6a8-7d808745d834","_cell_guid":"bdc150d8-88f7-47e7-96e0-a07d0f0333ea","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-12-31T02:56:03.733511Z","iopub.execute_input":"2024-12-31T02:56:03.733814Z","iopub.status.idle":"2024-12-31T02:56:03.742755Z","shell.execute_reply.started":"2024-12-31T02:56:03.733784Z","shell.execute_reply":"2024-12-31T02:56:03.741930Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nfrom scipy.ndimage import gaussian_filter, median_filter\n\ndef denoise_tomogram(tomogram, method='gaussian', **kwargs):\n    \"\"\"\n    Apply denoising to a tomogram.\n\n    Parameters:\n        tomogram (np.ndarray): The input tomogram to denoise.\n        method (str): The denoising method ('gaussian' or 'median').\n        kwargs: Parameters for the respective method.\n    \n    Returns:\n        np.ndarray: The denoised tomogram.\n    \"\"\"\n    if method == 'gaussian':\n        return gaussian_filter(tomogram, sigma=kwargs.get('sigma', 1))\n    elif method == 'median':\n        return median_filter(tomogram, size=kwargs.get('size', 3))\n    else:\n        raise ValueError(f\"Unsupported denoising method: {method}\")","metadata":{"_uuid":"94713e56-ee02-41e9-8e75-bb37a835d664","_cell_guid":"a95de667-0335-427e-a4c4-62d6c7c47033","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2024-12-31T02:56:03.744087Z","iopub.execute_input":"2024-12-31T02:56:03.744794Z","iopub.status.idle":"2024-12-31T02:56:03.756876Z","shell.execute_reply.started":"2024-12-31T02:56:03.744747Z","shell.execute_reply":"2024-12-31T02:56:03.756039Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"name_map = {\n    'apo-ferritin': 'ferritin_complex',\n    'beta-amylase': 'beta_amylase',\n    'beta-galactosidase': 'beta_galactosidase',\n    'ribosome': 'cytosolic_ribosome',\n    'thyroglobulin': 'thyroglobulin',\n    'virus-like-particle': 'pp7_vlp',\n}","metadata":{"_uuid":"4a9fc3a6-0f84-48eb-8c88-ae1d06b1b748","_cell_guid":"0e2411db-b47b-4d5d-916d-086b7401280f","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2024-12-31T02:56:03.757959Z","iopub.execute_input":"2024-12-31T02:56:03.758252Z","iopub.status.idle":"2024-12-31T02:56:03.770510Z","shell.execute_reply.started":"2024-12-31T02:56:03.758222Z","shell.execute_reply":"2024-12-31T02:56:03.769578Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def ndjson_to_json(ndjson_path):\n    if not os.path.isfile(ndjson_path):\n        raise FileNotFoundError(f\"The file {ndjson_path} does not exist.\")\n\n    data = []\n    try:\n        with open(ndjson_path, 'r', encoding='utf-8') as ndjson_file:\n            for line_number, line in enumerate(ndjson_file, start=1):\n                stripped_line = line.strip()\n                if stripped_line:  \n                    try:\n                        json_object = json.loads(stripped_line)\n                        data.append(json_object)\n                    except json.JSONDecodeError as e:\n                        raise json.JSONDecodeError(\n                            f\"Error decoding JSON on line {line_number}: {e.msg}\",\n                            e.doc,\n                            e.pos\n                        )\n    except Exception as e:\n        raise e\n\n    return data","metadata":{"_uuid":"87044c15-176e-4509-b032-7339104ee683","_cell_guid":"a309b6eb-f8b4-4f2d-9c5a-e1a28f3f0d34","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2024-12-31T02:56:03.771750Z","iopub.execute_input":"2024-12-31T02:56:03.772071Z","iopub.status.idle":"2024-12-31T02:56:03.781283Z","shell.execute_reply.started":"2024-12-31T02:56:03.772028Z","shell.execute_reply":"2024-12-31T02:56:03.780327Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport glob\nimport json\nimport pandas as pd\nimport numpy as np\nimport zarr\nimport cv2\nfrom tqdm import tqdm\n\ndef ndjson_to_json(ndjson_path):\n    if not os.path.isfile(ndjson_path):\n        raise FileNotFoundError(f\"The file {ndjson_path} does not exist.\")\n\n    data = []\n    try:\n        with open(ndjson_path, 'r', encoding='utf-8') as ndjson_file:\n            for line_number, line in enumerate(ndjson_file, start=1):\n                stripped_line = line.strip()\n                if stripped_line:  \n                    try:\n                        json_object = json.loads(stripped_line)\n                        data.append(json_object)\n                    except json.JSONDecodeError as e:\n                        raise json.JSONDecodeError(\n                            f\"Error decoding JSON on line {line_number}: {e.msg}\",\n                            e.doc,\n                            e.pos\n                        )\n    except Exception as e:\n        raise e\n\n    return data\n\ndef make_annotate_yolo(run_name, is_train_path=True, is_syntetic=False):\n    dataset_split = 'train' if is_train_path else 'val'\n\n    # Path to the denoised volume\n    if is_syntetic:\n        vol_path = glob.glob(f'/kaggle/input/czii10441/10441/{run_name}/**/Tomograms/**/*.zarr', recursive=True)\n        if not vol_path:\n            print(f\"No volume found for run {run_name} in synthetic data.\")\n            return\n        vol_path = vol_path[0]\n    else:\n        vol_path = f'/kaggle/input/czii-cryo-et-object-identification/train/static/ExperimentRuns/{run_name}/VoxelSpacing10.000/denoised.zarr'\n    \n    print(f\"Volume path: {vol_path}\")\n    if not os.path.exists(vol_path):\n        print(f\"Volume file not found: {vol_path}\")\n        return\n\n    # Read the volume\n    vol = zarr.open(vol_path, mode='r')\n    vol = vol[0]\n    if is_syntetic:\n        vol = denoise_tomogram(np.array(vol)[:184], method='gaussian', sigma=1)  # Apply denoise\n    vol2 = convert_to_8bit(vol)\n    \n    n_imgs = vol2.shape[0]\n    print(n_imgs)\n    \n    for j in range(n_imgs):\n        newvol = vol2[j]\n        newvolf = np.stack([newvol]*3, axis=-1)\n        newvolf = cv2.resize(newvolf, (640, 640))\n        image_filename = f'images/{dataset_split}/{run_name}_{j*10}.png'\n        cv2.imwrite(image_filename, newvolf)\n        # Create empty label file\n        label_filename = f'labels/{dataset_split}/{run_name}_{j*10}.txt'\n        with open(label_filename, 'w') as f:\n            pass\n    \n    # Process each particle type\n    for p, particle in enumerate(tqdm(particle_names, desc=f\"Processing particles for run {run_name}\")):\n        if particle == \"beta-amylase\":\n            continue\n        \n        if is_syntetic:\n            particle_name_in_file = name_map.get(particle)\n            if not particle_name_in_file:\n                print(f\"Particle name mapping not found for: {particle}\")\n                continue\n            \n            ndjson_each_particle = glob.glob(f'/kaggle/input/czii10441/10441/{run_name}/**/Annotations/**/*.ndjson', recursive=True)\n            if not ndjson_each_particle:\n                print(f\"No NDJSON files found for particle: {particle} in run: {run_name}\")\n                continue\n            \n            filtered_ndjson_files = [f for f in ndjson_each_particle if particle_name_in_file in f]\n            if not filtered_ndjson_files:\n                print(f\"No NDJSON files match the particle: {particle} for run: {run_name}\")\n                continue\n            \n            json_each_particle = ndjson_to_json(filtered_ndjson_files[0])\n            df = pd.DataFrame(json_each_particle)\n        else:\n            json_each_particle = f\"/kaggle/input/czii-cryo-et-object-identification/train/overlay/ExperimentRuns/{run_name}/Picks/{particle}.json\"\n            \n            if not os.path.exists(json_each_particle):\n                print(f\"JSON file not found: {json_each_particle}\")\n                continue\n            print(f\"Loading JSON file: {json_each_particle}\")\n            try:\n                df = pd.read_json(json_each_particle)\n            except ValueError as e:\n                print(f\"Error reading JSON file {json_each_particle}: {e}\")\n                continue\n        if is_syntetic:\n            column_name = 'location'\n        else:\n            column_name = 'points'\n\n        if  column_name not in df.columns:\n            print(f\"'{column_name}' column not found in DataFrame for particle: {particle}\")\n            continue\n        \n        if is_syntetic:\n            normalized_data = pd.json_normalize(df[column_name])\n            df[['x', 'y', 'z']] = normalized_data * 10.012\n\n        else:      \n            for axis in [\"x\", \"y\", \"z\"]:\n                df[axis] = df[column_name].apply(lambda x: x[\"location\"][axis] if \"location\" in x and axis in x[\"location\"] else np.nan)\n                print(\"aquiii\",df.head())\n\n\n        df.dropna(subset=[\"x\", \"y\", \"z\"], inplace=True)\n\n        radius = particle_radius.get(particle)\n        if radius is None:\n            print(f\"Radius not defined for particle: {particle}\")\n            continue\n        divide_by = 10.012\n        for i, row in df.iterrows():    \n\n            start_z = np.round(row['z'] - radius).astype(np.int32)\n            start_z = max(0, start_z//10) \n            end_z = np.round(row['z'] + radius).astype(np.int32)\n            end_z = min(n_imgs, end_z//10)\n            for j in range(start_z, end_z):\n                \n                \n                label_filename = f'labels/{dataset_split}/{run_name}_{j*10}.txt'\n                x_center = row[\"x\"] / divide_by / vol2.shape[1]\n                y_center = row[\"y\"] / divide_by / vol2.shape[2]\n                box_width = (radius * 2) / divide_by / vol2.shape[1]\n                box_height = (radius * 2) / divide_by / vol2.shape[2]\n                with open(label_filename, 'a') as f:\n                    f.write(f'{p2i_dict.get(particle, 0)} {x_center:.6f} {y_center:.6f} {box_width:.6f} {box_height:.6f}\\n')","metadata":{"_uuid":"4858d56f-d154-45b8-8b8e-18b1bc566ba2","_cell_guid":"8f7195d1-60f2-4f19-993f-d11f0439c282","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-12-31T02:56:03.784375Z","iopub.execute_input":"2024-12-31T02:56:03.784661Z","iopub.status.idle":"2024-12-31T02:56:03.807363Z","shell.execute_reply.started":"2024-12-31T02:56:03.784633Z","shell.execute_reply":"2024-12-31T02:56:03.806258Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Prepare Folders","metadata":{"_uuid":"653ce678-ab5d-4abf-bc17-6007187deea1","_cell_guid":"fa61e5b4-d751-43f3-8f6e-dfaaebb9eefe","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"os.makedirs(\"images/train\", exist_ok=True)\nos.makedirs(\"images/val\", exist_ok=True)\nos.makedirs(\"labels/train\", exist_ok=True)\nos.makedirs(\"labels/val\", exist_ok=True)","metadata":{"_uuid":"0987649d-3e79-4c24-85bc-df66315886b2","_cell_guid":"709c669d-e88a-4429-a894-66497b52f0df","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-12-31T02:56:03.808900Z","iopub.execute_input":"2024-12-31T02:56:03.809599Z","iopub.status.idle":"2024-12-31T02:56:03.821645Z","shell.execute_reply.started":"2024-12-31T02:56:03.809552Z","shell.execute_reply":"2024-12-31T02:56:03.820758Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Create Dataset","metadata":{"_uuid":"3dfff00e-14bd-406e-a7b8-8f3bcde4268b","_cell_guid":"aae5b85a-0e04-4024-b6b8-11f2c4be72b2","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"validation_indices = [0, 1, 2, 3]  # TS_5_4, TS_69_2 TS_6_4 TS_6_6\n\n#runs = runs[:7] \n    \nfor i, r in enumerate(runs):\n    is_train_path = i not in validation_indices\n    is_syntetic = i > 7\n    print(f\"Processing Run {i}: {r}, Is Train: {is_train_path}\")\n    make_annotate_yolo(r, is_train_path=is_train_path, is_syntetic=is_syntetic)","metadata":{"_uuid":"f4059efe-aeb6-46aa-a779-d03a50ce779b","_cell_guid":"f61a4763-4829-4709-9808-b412202923f4","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-12-31T02:56:03.822869Z","iopub.execute_input":"2024-12-31T02:56:03.823321Z","iopub.status.idle":"2024-12-31T02:58:59.868171Z","shell.execute_reply.started":"2024-12-31T02:56:03.823258Z","shell.execute_reply":"2024-12-31T02:58:59.866979Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"images_train_dir = \"images/train\"\nlabels_train_dir = \"labels/train\"\n","metadata":{"_uuid":"390a5cd1-2d59-4fa0-a1b6-edd122c887e9","_cell_guid":"cc22d3d5-0a26-40ea-b62b-974576ad9a6a","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-12-31T02:58:59.890578Z","iopub.execute_input":"2024-12-31T02:58:59.890892Z","iopub.status.idle":"2024-12-31T03:01:24.423744Z","shell.execute_reply.started":"2024-12-31T02:58:59.890861Z","shell.execute_reply":"2024-12-31T03:01:24.422771Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Organize Dataset Folder Structure","metadata":{"_uuid":"98bf6e70-60fb-4ea1-9e18-f37b93edc18d","_cell_guid":"b9ef70c2-6ecf-4df7-ac67-4a98c514ef04","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"os.makedirs('datasets/czii_det2d', exist_ok=True)\nshutil.move('images/train', 'datasets/czii_det2d/images/train')\nshutil.move('images/val', 'datasets/czii_det2d/images/val')\nshutil.move('labels/train', 'datasets/czii_det2d/labels/train')\nshutil.move('labels/val', 'datasets/czii_det2d/labels/val')","metadata":{"_uuid":"686b1713-0c0a-48b7-9d6e-f830d97c0130","_cell_guid":"70708187-9846-4313-8261-f21e9f3c2f15","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-12-31T03:01:34.085634Z","iopub.execute_input":"2024-12-31T03:01:34.085963Z","iopub.status.idle":"2024-12-31T03:01:37.186382Z","shell.execute_reply.started":"2024-12-31T03:01:34.085931Z","shell.execute_reply":"2024-12-31T03:01:37.185315Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Create Configuration File for YOLO","metadata":{"_uuid":"72c7df24-864f-45fa-bdc2-f14784ce4865","_cell_guid":"8a5148ef-98d0-4060-9ea7-d6610fceee6d","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"config_content = \"\"\"\npath: /kaggle/input/czii-making-datasets-for-yolo/datasets/czii_det2d  # dataset root dir\ntrain: images/train  # train images (relative to 'path') \nval: images/val  # val images (relative to 'path') \n\n# Classes\nnames:\n  0: apo-ferritin\n  1: beta-amylase\n  2: beta-galactosidase\n  3: ribosome\n  4: thyroglobulin\n  5: virus-like-particle\n\"\"\"\n\nwith open(\"czii_conf.yaml\", \"w\") as f:\n    f.write(config_content.strip())\n\nprint(\"Configuration file 'czii_conf.yaml' created successfully.\")","metadata":{"_uuid":"8be4cb0f-2730-467e-a3aa-9f6502afa1df","_cell_guid":"143585cf-e8a9-4a24-b8c5-7866d790b8cb","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-12-31T03:01:37.187635Z","iopub.execute_input":"2024-12-31T03:01:37.188015Z","iopub.status.idle":"2024-12-31T03:01:37.193785Z","shell.execute_reply.started":"2024-12-31T03:01:37.187983Z","shell.execute_reply":"2024-12-31T03:01:37.192862Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Continue to Training Baseline\nProceed to [Training Baseline...](https://www.kaggle.com/code/itsuki9180/czii-yolo11-training-baseline)","metadata":{"_uuid":"4c091dd3-6622-4b9a-a6b9-e76fd601f34b","_cell_guid":"92a6b0de-1af0-48e0-9273-12b580e1b2ac","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}}]}