This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

1{"cells":[{"cell_type":"markdown","metadata":{"id":"78a2d319"},"source":["# Kima - Basketball Object Detection Model Training\n","\n","### Overview\n","\n","This notebook provides a configurable and automated workflow for training and comparing YOLO models for real-time basketball detection. The objective is to efficiently evaluate different model architectures on various datasets, optimized for lightweight, fast inference suitable for real-time mobile applications.\n","\n","### Enhanced Workflow Features\n","\n","1. **Global Configuration:** A central configuration cell (`Global Configuration`) allows users to define:\n"," * `DATASET_CONFIGS`: A list of Roboflow datasets, each with its API key, workspace, project, version, and a unique alias.\n"," * `MODEL_ARCHITECTURES`: A list of YOLO model variants (e.g., 'yolo11n', 'yolo11s') to be trained and compared.\n"," * `TRAINING_HYPERPARAMETERS`: Common training settings like `epochs`, `imgsz`, `batch`, `patience`, and `device`.\n"," * `Workflow Flags`: Boolean flags to control the execution of specific parts of the notebook, such as `GENERATE_PLOTS` (for dataset analysis plots), `SAVE_TEST_PREDICTION_IMAGES` (for visual test results), and `PERFORM_MODEL_COMPARISON`.\n","\n","2. **Automated Multi-Dataset & Multi-Model Workflow:**\n"," * **Dataset Preparation and Analysis Loop:** The notebook iterates through each defined dataset, automatically downloading it from Roboflow, correcting its `data.yaml` file for Ultralytics compatibility, and performing detailed dataset analysis (class distribution, sample annotated images). All analysis artifacts are saved in dataset-specific folders within the `outputs` directory.\n"," * **Model Training, Validation, and Export Loop:** Nested loops then train each specified YOLO model architecture on every prepared dataset. For each model-dataset combination, the workflow:\n"," * Loads a pre-trained model.\n"," * Trains the model using the global hyperparameters.\n"," * Validates performance, collecting metrics like mAP50, mAP50-95, precision, recall, and inference time.\n"," * Exports the best-trained model to mobile formats: CoreML (`.mlpackage`) for iOS and TFLite (`.tflite`) for Android.\n"," * Generates visual test results (predictions on sample images) to qualitatively assess performance.\n"," All training logs, model weights, exports, and visual tests are saved in uniquely named directories.\n","\n","3. **Comprehensive Comparison Reporting and Visualization:**\n"," * All collected metrics from every model-dataset combination are aggregated into a pandas DataFrame.\n"," * A comparison table is displayed and saved as a CSV file.\n"," * Key comparative visualizations are generated, including:\n"," * Accuracy (mAP50) vs. Speed (Inference Time) scatter plot, with marker size indicating Model Size.\n"," * Bar charts for mAP50, Inference Time, and Model Size.\n"," * Automated recommendations for optimal models are provided based on various criteria (accuracy, speed, balance, size), particularly for real-time mobile deployment.\n","\n","4. **Organized Output Archiving:**\n"," * All generated artifacts (dataset analysis, training runs, exported models, comparison reports, plots) are consolidated into a structured `outputs` directory.\n"," * This entire directory is then compressed into a downloadable zip file, ensuring easy retrieval of all experimental results in Google Colab environments.\n","\n","### Model Architecture\n","\n","We primarily use **YOLOv11 Nano (yolov11n.pt)** and **YOLOv11 Small (yolov11s.pt)** for their balance of speed and accuracy, making them suitable for real-time mobile applications.\n","\n","### Resources\n","\n","- [Ultralytics Documentation](https://docs.ultralytics.com/)\n","- [YOLOv11 GitHub](https://github.com/ultralytics/ultralytics)\n","- **License:** AGPL-3.0 License ([Ultralytics License](https://ultralytics.com/license))"]},{"cell_type":"markdown","metadata":{"id":"rzyauzNMTk8H"},"source":["## Setup & Dependencies\n","\n","Install and verify all required packages for training and exporting the model."]},{"cell_type":"code","execution_count":null,"metadata":{"id":"5dIqXyUiTk8H","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1775418739151,"user_tz":-180,"elapsed":89265,"user":{"displayName":"Nathan Holland","userId":"13994014446134761485"}},"outputId":"f2c0d447-7081-40ab-9379-f78aa5d45b7a","collapsed":true},"outputs":[{"output_type":"stream","name":"stdout","text":["\r0% [Working]\r \rHit:1 https://cli.github.com/packages stable InRelease\n","\r0% [Connecting to archive.ubuntu.com (91.189.92.23)] [Connecting to security.ub\r \rGet:2 https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/ InRelease [3,632 B]\n","Get:3 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64 InRelease [1,581 B]\n","Get:4 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64 Packages [2,482 kB]\n","Hit:5 http://archive.ubuntu.com/ubuntu jammy InRelease\n","Get:6 http://security.ubuntu.com/ubuntu jammy-security InRelease [129 kB]\n","Get:7 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [128 kB]\n","Get:8 https://r2u.stat.illinois.edu/ubuntu jammy InRelease [6,555 B]\n","Hit:9 https://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu jammy InRelease\n","Get:10 https://r2u.stat.illinois.edu/ubuntu jammy/main all Packages [9,980 kB]\n","Hit:11 https://ppa.launchpadcontent.net/graphics-drivers/ppa/ubuntu jammy InRelease\n","Hit:12 https://ppa.launchpadcontent.net/ubuntugis/ppa/ubuntu jammy InRelease\n","Get:13 http://security.ubuntu.com/ubuntu jammy-security/universe amd64 Packages [1,310 kB]\n","Get:14 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [127 kB]\n","Get:15 http://archive.ubuntu.com/ubuntu jammy-updates/restricted amd64 Packages [7,125 kB]\n","Get:16 http://security.ubuntu.com/ubuntu jammy-security/main amd64 Packages [3,844 kB]\n","Get:17 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages [4,219 kB]\n","Get:18 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages [1,622 kB]\n","Get:19 https://r2u.stat.illinois.edu/ubuntu jammy/main amd64 Packages [2,960 kB]\n","Fetched 33.9 MB in 5s (7,183 kB/s)\n","Reading package lists... Done\n","W: Skipping acquire of configured file 'main/source/Sources' as repository 'https://r2u.stat.illinois.edu/ubuntu jammy InRelease' does not seem to provide it (sources.list entry misspelt?)\n","Reading package lists... Done\n","Building dependency tree... Done\n","Reading state information... Done\n","libheif-dev is already the newest version (1.12.0-2build1).\n","libheif-dev set to manually installed.\n","The following additional packages will be installed:\n"," libabsl20210324 libavif13 libgav1-0 libyuv0\n","The following NEW packages will be installed:\n"," libabsl20210324 libavif-dev libavif13 libgav1-0 libyuv0\n","0 upgraded, 5 newly installed, 0 to remove and 59 not upgraded.\n","Need to get 966 kB of archives.\n","After this operation, 3,537 kB of additional disk space will be used.\n","Get:1 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 libabsl20210324 amd64 0~20210324.2-2ubuntu0.3 [386 kB]\n","Get:2 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libgav1-0 amd64 0.17.0-1build1 [336 kB]\n","Get:3 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libyuv0 amd64 0.0~git20220104.b91df1a-2 [154 kB]\n","Get:4 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libavif13 amd64 0.9.3-3 [69.5 kB]\n","Get:5 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libavif-dev amd64 0.9.3-3 [21.0 kB]\n","Fetched 966 kB in 2s (488 kB/s)\n","debconf: unable to initialize frontend: Dialog\n","debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 78, <> line 5.)\n","debconf: falling back to frontend: Readline\n","debconf: unable to initialize frontend: Readline\n","debconf: (This frontend requires a controlling tty.)\n","debconf: falling back to frontend: Teletype\n","dpkg-preconfigure: unable to re-open stdin: \n","Selecting previously unselected package libabsl20210324:amd64.\n","(Reading database ... 122354 files and directories currently installed.)\n","Preparing to unpack .../libabsl20210324_0~20210324.2-2ubuntu0.3_amd64.deb ...\n","Unpacking libabsl20210324:amd64 (0~20210324.2-2ubuntu0.3) ...\n","Selecting previously unselected package libgav1-0:amd64.\n","Preparing to unpack .../libgav1-0_0.17.0-1build1_amd64.deb ...\n","Unpacking libgav1-0:amd64 (0.17.0-1build1) ...\n","Selecting previously unselected package libyuv0:amd64.\n","Preparing to unpack .../libyuv0_0.0~git20220104.b91df1a-2_amd64.deb ...\n","Unpacking libyuv0:amd64 (0.0~git20220104.b91df1a-2) ...\n","Selecting previously unselected package libavif13:amd64.\n","Preparing to unpack .../libavif13_0.9.3-3_amd64.deb ...\n","Unpacking libavif13:amd64 (0.9.3-3) ...\n","Selecting previously unselected package libavif-dev:amd64.\n","Preparing to unpack .../libavif-dev_0.9.3-3_amd64.deb ...\n","Unpacking libavif-dev:amd64 (0.9.3-3) ...\n","Setting up libabsl20210324:amd64 (0~20210324.2-2ubuntu0.3) ...\n","Setting up libyuv0:amd64 (0.0~git20220104.b91df1a-2) ...\n","Setting up libgav1-0:amd64 (0.17.0-1build1) ...\n","Setting up libavif13:amd64 (0.9.3-3) ...\n","Setting up libavif-dev:amd64 (0.9.3-3) ...\n","Processing triggers for libc-bin (2.35-0ubuntu3.8) ...\n","/sbin/ldconfig.real: /usr/local/lib/libtbbbind.so.3 is not a symbolic link\n","\n","/sbin/ldconfig.real: /usr/local/lib/libtbbbind_2_5.so.3 is not a symbolic link\n","\n","/sbin/ldconfig.real: /usr/local/lib/libhwloc.so.15 is not a symbolic link\n","\n","/sbin/ldconfig.real: /usr/local/lib/libtbbbind_2_0.so.3 is not a symbolic link\n","\n","/sbin/ldconfig.real: /usr/local/lib/libtcm_debug.so.1 is not a symbolic link\n","\n","/sbin/ldconfig.real: /usr/local/lib/libtbb.so.12 is not a symbolic link\n","\n","/sbin/ldconfig.real: /usr/local/lib/libumf.so.1 is not a symbolic link\n","\n","/sbin/ldconfig.real: /usr/local/lib/libur_adapter_opencl.so.0 is not a symbolic link\n","\n","/sbin/ldconfig.real: /usr/local/lib/libur_adapter_level_zero_v2.so.0 is not a symbolic link\n","\n","/sbin/ldconfig.real: /usr/local/lib/libur_loader.so.0 is not a symbolic link\n","\n","/sbin/ldconfig.real: /usr/local/lib/libur_adapter_level_zero.so.0 is not a symbolic link\n","\n","/sbin/ldconfig.real: /usr/local/lib/libtbbmalloc_proxy.so.2 is not a symbolic link\n","\n","/sbin/ldconfig.real: /usr/local/lib/libtbbmalloc.so.2 is not a symbolic link\n","\n","/sbin/ldconfig.real: /usr/local/lib/libtcm.so.1 is not a symbolic link\n","\n","Collecting ultralytics\n"," Downloading ultralytics-8.4.33-py3-none-any.whl.metadata (39 kB)\n","Collecting roboflow\n"," Downloading roboflow-1.3.1-py3-none-any.whl.metadata (10 kB)\n","Requirement already satisfied: numpy>=1.23.0 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (2.0.2)\n","Requirement already satisfied: matplotlib>=3.3.0 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (3.10.0)\n","Requirement already satisfied: opencv-python>=4.6.0 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (4.13.0.92)\n","Requirement already satisfied: pillow>=7.1.2 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (11.3.0)\n","Requirement already satisfied: pyyaml>=5.3.1 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (6.0.3)\n","Requirement already satisfied: requests>=2.23.0 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (2.32.4)\n","Requirement already satisfied: scipy>=1.4.1 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (1.16.3)\n","Requirement already satisfied: torch>=1.8.0 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (2.10.0+cu128)\n","Requirement already satisfied: torchvision>=0.9.0 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (0.25.0+cu128)\n","Requirement already satisfied: psutil>=5.8.0 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (5.9.5)\n","Requirement already satisfied: polars>=0.20.0 in /usr/local/lib/python3.12/dist-packages (from ultralytics) (1.35.2)\n","Collecting ultralytics-thop>=2.0.18 (from ultralytics)\n"," Downloading ultralytics_thop-2.0.18-py3-none-any.whl.metadata (14 kB)\n","Requirement already satisfied: certifi in /usr/local/lib/python3.12/dist-packages (from roboflow) (2026.2.25)\n","Collecting idna==3.7 (from roboflow)\n"," Downloading idna-3.7-py3-none-any.whl.metadata (9.9 kB)\n","Requirement already satisfied: cycler in /usr/local/lib/python3.12/dist-packages (from roboflow) (0.12.1)\n","Requirement already satisfied: kiwisolver>=1.3.1 in /usr/local/lib/python3.12/dist-packages (from roboflow) (1.5.0)\n","Collecting opencv-python-headless==4.10.0.84 (from roboflow)\n"," Downloading opencv_python_headless-4.10.0.84-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (20 kB)\n","Collecting pi-heif<2 (from roboflow)\n"," Downloading pi_heif-1.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.metadata (6.3 kB)\n","Collecting pillow-avif-plugin<2 (from roboflow)\n"," Downloading pillow_avif_plugin-1.5.5-cp312-cp312-manylinux_2_28_x86_64.whl.metadata (2.2 kB)\n","Requirement already satisfied: python-dateutil in /usr/local/lib/python3.12/dist-packages (from roboflow) (2.9.0.post0)\n","Requirement already satisfied: python-dotenv in /usr/local/lib/python3.12/dist-packages (from roboflow) (1.2.2)\n","Requirement already satisfied: six in /usr/local/lib/python3.12/dist-packages (from roboflow) (1.17.0)\n","Requirement already satisfied: urllib3>=1.26.6 in /usr/local/lib/python3.12/dist-packages (from roboflow) (2.5.0)\n","Requirement already satisfied: tqdm>=4.41.0 in /usr/local/lib/python3.12/dist-packages (from roboflow) (4.67.3)\n","Requirement already satisfied: requests_toolbelt in /usr/local/lib/python3.12/dist-packages (from roboflow) (1.0.0)\n","Collecting filetype (from roboflow)\n"," Downloading filetype-1.2.0-py2.py3-none-any.whl.metadata (6.5 kB)\n","Requirement already satisfied: typer>=0.12.0 in /usr/local/lib/python3.12/dist-packages (from roboflow) (0.24.1)\n","Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=3.3.0->ultralytics) (1.3.3)\n","Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=3.3.0->ultralytics) (4.62.1)\n","Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=3.3.0->ultralytics) (26.0)\n","Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=3.3.0->ultralytics) (3.3.2)\n","Requirement already satisfied: polars-runtime-32==1.35.2 in /usr/local/lib/python3.12/dist-packages (from polars>=0.20.0->ultralytics) (1.35.2)\n","Requirement already satisfied: charset_normalizer<4,>=2 in /usr/local/lib/python3.12/dist-packages (from requests>=2.23.0->ultralytics) (3.4.6)\n","Requirement already satisfied: filelock in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (3.25.2)\n","Requirement already satisfied: typing-extensions>=4.10.0 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (4.15.0)\n","Requirement already satisfied: setuptools in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (75.2.0)\n","Requirement already satisfied: sympy>=1.13.3 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (1.14.0)\n","Requirement already satisfied: networkx>=2.5.1 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (3.6.1)\n","Requirement already satisfied: jinja2 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (3.1.6)\n","Requirement already satisfied: fsspec>=0.8.5 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (2025.3.0)\n","Requirement already satisfied: cuda-bindings==12.9.4 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (12.9.4)\n","Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.8.93 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (12.8.93)\n","Requirement already satisfied: nvidia-cuda-runtime-cu12==12.8.90 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (12.8.90)\n","Requirement already satisfied: nvidia-cuda-cupti-cu12==12.8.90 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (12.8.90)\n","Requirement already satisfied: nvidia-cudnn-cu12==9.10.2.21 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (9.10.2.21)\n","Requirement already satisfied: nvidia-cublas-cu12==12.8.4.1 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (12.8.4.1)\n","Requirement already satisfied: nvidia-cufft-cu12==11.3.3.83 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (11.3.3.83)\n","Requirement already satisfied: nvidia-curand-cu12==10.3.9.90 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (10.3.9.90)\n","Requirement already satisfied: nvidia-cusolver-cu12==11.7.3.90 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (11.7.3.90)\n","Requirement already satisfied: nvidia-cusparse-cu12==12.5.8.93 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (12.5.8.93)\n","Requirement already satisfied: nvidia-cusparselt-cu12==0.7.1 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (0.7.1)\n","Requirement already satisfied: nvidia-nccl-cu12==2.27.5 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (2.27.5)\n","Requirement already satisfied: nvidia-nvshmem-cu12==3.4.5 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (3.4.5)\n","Requirement already satisfied: nvidia-nvtx-cu12==12.8.90 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (12.8.90)\n","Requirement already satisfied: nvidia-nvjitlink-cu12==12.8.93 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (12.8.93)\n","Requirement already satisfied: nvidia-cufile-cu12==1.13.1.3 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (1.13.1.3)\n","Requirement already satisfied: triton==3.6.0 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->ultralytics) (3.6.0)\n","Requirement already satisfied: cuda-pathfinder~=1.1 in /usr/local/lib/python3.12/dist-packages (from cuda-bindings==12.9.4->torch>=1.8.0->ultralytics) (1.5.0)\n","Requirement already satisfied: click>=8.2.1 in /usr/local/lib/python3.12/dist-packages (from typer>=0.12.0->roboflow) (8.3.1)\n","Requirement already satisfied: shellingham>=1.3.0 in /usr/local/lib/python3.12/dist-packages (from typer>=0.12.0->roboflow) (1.5.4)\n","Requirement already satisfied: rich>=12.3.0 in /usr/local/lib/python3.12/dist-packages (from typer>=0.12.0->roboflow) (13.9.4)\n","Requirement already satisfied: annotated-doc>=0.0.2 in /usr/local/lib/python3.12/dist-packages (from typer>=0.12.0->roboflow) (0.0.4)\n","Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.12/dist-packages (from rich>=12.3.0->typer>=0.12.0->roboflow) (4.0.0)\n","Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.12/dist-packages (from rich>=12.3.0->typer>=0.12.0->roboflow) (2.20.0)\n","Requirement already satisfied: mpmath<1.4,>=1.1.0 in /usr/local/lib/python3.12/dist-packages (from sympy>=1.13.3->torch>=1.8.0->ultralytics) (1.3.0)\n","Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.12/dist-packages (from jinja2->torch>=1.8.0->ultralytics) (3.0.3)\n","Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.12/dist-packages (from markdown-it-py>=2.2.0->rich>=12.3.0->typer>=0.12.0->roboflow) (0.1.2)\n","Downloading ultralytics-8.4.33-py3-none-any.whl (1.2 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.2/1.2 MB\u001b[0m \u001b[31m78.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hDownloading roboflow-1.3.1-py3-none-any.whl (169 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m169.5/169.5 kB\u001b[0m \u001b[31m20.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hDownloading idna-3.7-py3-none-any.whl (66 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m66.8/66.8 kB\u001b[0m \u001b[31m8.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hDownloading opencv_python_headless-4.10.0.84-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (49.9 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m49.9/49.9 MB\u001b[0m \u001b[31m54.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hDownloading pi_heif-1.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.5 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.5/1.5 MB\u001b[0m \u001b[31m83.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hDownloading pillow_avif_plugin-1.5.5-cp312-cp312-manylinux_2_28_x86_64.whl (5.5 MB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m5.5/5.5 MB\u001b[0m \u001b[31m128.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hDownloading ultralytics_thop-2.0.18-py3-none-any.whl (28 kB)\n","Downloading filetype-1.2.0-py2.py3-none-any.whl (19 kB)\n","Installing collected packages: pillow-avif-plugin, filetype, pi-heif, opencv-python-headless, idna, ultralytics-thop, roboflow, ultralytics\n"," Attempting uninstall: opencv-python-headless\n"," Found existing installation: opencv-python-headless 4.13.0.92\n"," Uninstalling opencv-python-headless-4.13.0.92:\n"," Successfully uninstalled opencv-python-headless-4.13.0.92\n"," Attempting uninstall: idna\n"," Found existing installation: idna 3.11\n"," Uninstalling idna-3.11:\n"," Successfully uninstalled idna-3.11\n","Successfully installed filetype-1.2.0 idna-3.7 opencv-python-headless-4.10.0.84 pi-heif-1.3.0 pillow-avif-plugin-1.5.5 roboflow-1.3.1 ultralytics-8.4.33 ultralytics-thop-2.0.18\n","Requirement already satisfied: tensorflow in /usr/local/lib/python3.12/dist-packages (2.19.0)\n","Collecting tflite-support\n"," Downloading tflite-support-0.1.0a1.tar.gz (390 kB)\n","\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m390.3/390.3 kB\u001b[0m \u001b[31m29.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n","Requirement already satisfied: absl-py>=1.0.0 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (1.4.0)\n","Requirement already satisfied: astunparse>=1.6.0 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (1.6.3)\n","Requirement already satisfied: flatbuffers>=24.3.25 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (25.12.19)\n","Requirement already satisfied: gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (0.7.0)\n","Requirement already satisfied: google-pasta>=0.1.1 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (0.2.0)\n","Requirement already satisfied: libclang>=13.0.0 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (18.1.1)\n","Requirement already satisfied: opt-einsum>=2.3.2 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (3.4.0)\n","Requirement already satisfied: packaging in /usr/local/lib/python3.12/dist-packages (from tensorflow) (26.0)\n","Requirement already satisfied: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<6.0.0dev,>=3.20.3 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (5.29.6)\n","Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (2.32.4)\n","Requirement already satisfied: setuptools in /usr/local/lib/python3.12/dist-packages (from tensorflow) (75.2.0)\n","Requirement already satisfied: six>=1.12.0 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (1.17.0)\n","Requirement already satisfied: termcolor>=1.1.0 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (3.3.0)\n","Requirement already satisfied: typing-extensions>=3.6.6 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (4.15.0)\n","Requirement already satisfied: wrapt>=1.11.0 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (2.1.2)\n","Requirement already satisfied: grpcio<2.0,>=1.24.3 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (1.80.0)\n","Requirement already satisfied: tensorboard~=2.19.0 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (2.19.0)\n","Requirement already satisfied: keras>=3.5.0 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (3.13.2)\n","Requirement already satisfied: numpy<2.2.0,>=1.26.0 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (2.0.2)\n","Requirement already satisfied: h5py>=3.11.0 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (3.16.0)\n","Requirement already satisfied: ml-dtypes<1.0.0,>=0.5.1 in /usr/local/lib/python3.12/dist-packages (from tensorflow) (0.5.4)\n","Collecting pybind11>=2.4 (from tflite-support)\n"," Using cached pybind11-3.0.3-py3-none-any.whl.metadata (10 kB)\n","Requirement already satisfied: wheel<1.0,>=0.23.0 in /usr/local/lib/python3.12/dist-packages (from astunparse>=1.6.0->tensorflow) (0.46.3)\n","Requirement already satisfied: rich in /usr/local/lib/python3.12/dist-packages (from keras>=3.5.0->tensorflow) (13.9.4)\n","Requirement already satisfied: namex in /usr/local/lib/python3.12/dist-packages (from keras>=3.5.0->tensorflow) (0.1.0)\n","Requirement already satisfied: optree in /usr/local/lib/python3.12/dist-packages (from keras>=3.5.0->tensorflow) (0.19.0)\n","Requirement already satisfied: charset_normalizer<4,>=2 in /usr/local/lib/python3.12/dist-packages (from requests<3,>=2.21.0->tensorflow) (3.4.6)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.12/dist-packages (from requests<3,>=2.21.0->tensorflow) (3.7)\n","Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.12/dist-packages (from requests<3,>=2.21.0->tensorflow) (2.5.0)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.12/dist-packages (from requests<3,>=2.21.0->tensorflow) (2026.2.25)\n","Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.12/dist-packages (from tensorboard~=2.19.0->tensorflow) (3.10.2)\n","Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in /usr/local/lib/python3.12/dist-packages (from tensorboard~=2.19.0->tensorflow) (0.7.2)\n","Requirement already satisfied: werkzeug>=1.0.1 in /usr/local/lib/python3.12/dist-packages (from tensorboard~=2.19.0->tensorflow) (3.1.7)\n","Requirement already satisfied: markupsafe>=2.1.1 in /usr/local/lib/python3.12/dist-packages (from werkzeug>=1.0.1->tensorboard~=2.19.0->tensorflow) (3.0.3)\n","Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.12/dist-packages (from rich->keras>=3.5.0->tensorflow) (4.0.0)\n","Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.12/dist-packages (from rich->keras>=3.5.0->tensorflow) (2.20.0)\n","Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.12/dist-packages (from markdown-it-py>=2.2.0->rich->keras>=3.5.0->tensorflow) (0.1.2)\n","Using cached pybind11-3.0.3-py3-none-any.whl (313 kB)\n","Building wheels for collected packages: tflite-support\n"," Building wheel for tflite-support (setup.py) ... \u001b[?25l\u001b[?25hdone\n"," Created wheel for tflite-support: filename=tflite_support-0.1.0a1-cp312-cp312-linux_x86_64.whl size=6343895 sha256=24d6a83ef2ef9a6e708042d025983aa73ab337e2f24284ef6c48fcf3677bb73f\n"," Stored in directory: /root/.cache/pip/wheels/5d/6f/bc/8b85ad0e51d3c8f82c590b321f2c5b35c41fbe84ad93271397\n","Successfully built tflite-support\n","Installing collected packages: pybind11, tflite-support\n","Successfully installed pybind11-3.0.3 tflite-support-0.1.0a1\n"]}],"source":["\n","# Install the system dependencies required to build pillow-avif-plugin\n","!sudo apt-get update && sudo apt-get install -y libavif-dev libheif-dev\n","\n","# Install Ultralytics YOLOv11 and Roboflow\n","!pip install ultralytics roboflow\n","\n","# Install TensorFlow and tflite-support for metadata verification (optional but recommended)\n","!pip install tensorflow tflite-support"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"XVvGyi_fTk8I","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1775418743632,"user_tz":-180,"elapsed":4479,"user":{"displayName":"Nathan Holland","userId":"13994014446134761485"}},"outputId":"404e06b2-9b6a-44d4-ec8f-d465973947b1"},"outputs":[{"output_type":"stream","name":"stdout","text":["Ultralytics 8.4.33 🚀 Python-3.12.13 torch-2.10.0+cu128 CUDA:0 (NVIDIA L4, 22563MiB)\n","Setup complete ✅ (12 CPUs, 53.0 GB RAM, 43.4/235.7 GB disk)\n"]}],"source":["# Verify installation\n","import ultralytics\n","ultralytics.checks()"]},{"cell_type":"markdown","metadata":{"id":"74019e8d"},"source":["## Global Configuration\n"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"67772b77"},"outputs":[],"source":["### Global Configuration\n","\n","# 1. Dataset Configurations\n","# You can define multiple dataset configurations and switch between them.\n","# The 'ALIAS' key can be used to refer to a specific dataset later.\n","# Replace 'YOUR_API_KEY_HERE' with your actual Roboflow API key.\n","DATASET_CONFIGS = [\n"," {\n"," 'ROBOFLOW_API_KEY': '49Mchq1NPmGmyHtYhkkp', # IMPORTANT: Replace with your actual Roboflow API key or use os.getenv()\n"," 'WORKSPACE': 'kima-rbjnn',\n"," 'PROJECT': 'dataset-3k5b6',\n"," 'VERSION': 8,\n"," 'ALIAS': 'dataset'\n"," },\n"," # Add more dataset configurations here if needed\n","]\n","\n","# Select the active dataset configuration by its ALIAS\n","ACTIVE_DATASET_ALIAS = 'dataset'\n","\n","# 2. Model Architectures for Comparison\n","# Define a list of YOLO model variants (e.g., 'yolo11n', 'yolo11s') to train and compare.\n","# Ensure these models are compatible with Ultralytics.\n","MODEL_ARCHITECTURES = ['yolo11n']\n","# MODEL_ARCHITECTURES = ['yolo26n','yolo11n', 'yolo11s', 'yolov8n', 'yolov10n']\n","\n","# 3. Training Hyperparameters\n","# These parameters will be applied to all models during training.\n","TRAINING_HYPERPARAMETERS = {\n"," 'epochs': 100, # Number of training epochs. Use a smaller number (e.g., 1-5) for quick tests.\n"," 'imgsz': 900, # Image size for training and inference. 416 for mobile, 640 for higher accuracy.\n"," 'batch': 8, # Batch size. Adjust based on GPU memory. (imgsz increase, batch decrease)\n"," 'patience': 20, # Early stopping patience. Number of epochs to wait for improvement.\n"," 'device': 0, # GPU device (0 for first GPU). Use 'cpu' if no GPU available.\n"," 'optimizer': 'AdamW', # AdamW = good default for transfer learning (stable, fast convergence).\n"," 'lr0': 0.001, # Initial learning rate. Controls how big each update step is. Too high - unstable, too low - slow learning.\n"," 'lrf': 0.01, # Final learning rate factor. Final LR = lr0 * lrf. Helps fine-tune weights toward the end of training.\n"," 'weight_decay': 0.0005, # Regularization term to prevent overfitting. Penalizes large weights → improves generalization.\n"," #'warmup_epochs': 3.0, # Gradually increases learning rate at the start. Prevents unstable early training (especially with pretrained models).\n"," #'mosaic': 0.0, # Combines 4 images into 1 during training. Improves generalization, but makes objects smaller. Useful, but must be controlled for small objects.\n"," #'close_mosaic': 0, # Disables mosaic in the last N epochs. VERY IMPORTANT: lets model learn real (non-distorted) object sizes.\n"," #'scale': 0.5, # Random zoom in/out (0.5 → 1.5 range). Important for small objects → sometimes makes them larger.\n"," #'translate': 0.1, # Randomly shifts image (10%). Helps model learn object positions more robustly.\n"," #'degrees': 5.0, # Random rotation (±5 degrees). Simulates camera tilt. Keep small for realistic scenes.\n"," #'fliplr': 0.5, # Horizontal flip probability (50%). Very useful for sports scenes (court symmetry).\n","}\n","\n","# 4. Workflow Flags\n","# Control which parts of the notebook workflow to execute.\n","GENERATE_PLOTS = True # Generate and display dataset analysis plots\n","SAVE_TEST_PREDICTION_IMAGES = True # Save predicted images during visual testing\n","PERFORM_MODEL_COMPARISON = True # Run multi-model comparison training and evaluation\n"]},{"cell_type":"markdown","metadata":{"id":"f7a60cca"},"source":["## Dataset Preparation and Analysis Loop\n","This section automates the preparation and initial analysis of each dataset defined in the `DATASET_CONFIGS`. For each dataset, the workflow performs the following key steps:\n","\n","1. **Download from Roboflow**: The dataset is automatically downloaded from Roboflow using the provided API key and project details. This ensures consistency and easy access to data versions.\n","2. **Correct `data.yaml`**: The `data.yaml` configuration file, which Ultralytics models use to locate image and label files, is updated to contain absolute paths. This correction is crucial for seamless integration with the training pipeline.\n","3. **Class Distribution Analysis**: If `GENERATE_PLOTS` is enabled, the distribution of object classes within the training and validation sets is analyzed and visualized. This helps identify potential class imbalances and provides insights into the dataset composition.\n","4. **Sample Annotated Images**: A selection of sample images from the training set, complete with their bounding box annotations, are plotted and saved. This visual check confirms the correctness of annotations and helps in understanding the visual characteristics of the dataset.\n","5. **Dataset Statistics**: Basic statistics, such as the number of images and label files in the training, validation, and test sets, are gathered and displayed to provide a quantitative overview of the dataset's size and structure.\n","\n","All analysis plots and information are saved into dataset-specific subdirectories within the `outputs` folder for organized archiving. The processed dataset information, including the path to the corrected `data.yaml` file, is stored for subsequent model training and evaluation steps."]},{"cell_type":"code","execution_count":null,"metadata":{"id":"fc402fbc","executionInfo":{"status":"ok","timestamp":1775418743923,"user_tz":-180,"elapsed":270,"user":{"displayName":"Nathan Holland","userId":"13994014446134761485"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"fac54aa9-0d1e-4ee7-889c-c657f27aece5"},"outputs":[{"output_type":"stream","name":"stdout","text":["Initialized imports and 'prepared_datasets_info' list.\n"]}],"source":["import yaml\n","from pathlib import Path\n","import matplotlib.pyplot as plt\n","import matplotlib.patches as patches\n","from PIL import Image\n","import random\n","import os\n","from collections import defaultdict\n","from roboflow import Roboflow\n","\n","# Initialize an empty list to store information about each processed dataset\n","prepared_datasets_info = []\n","\n","print(\"Initialized imports and 'prepared_datasets_info' list.\")"]},{"cell_type":"markdown","metadata":{"id":"c41a63da"},"source":["### Helper Functions\n","\n","This section defines several helper functions used throughout the dataset preparation and analysis process:\n","\n","* `get_class_counts(label_dir, class_names)`: Analyzes YOLO format label files to count instances of each class within a specified directory.\n","* `plot_image_with_bboxes(image_path, label_path, class_names, save_path)`: Visualizes an image with its corresponding YOLO bounding box annotations, saving the result to a specified path.\n","* `get_dataset_stats(image_dir, label_dir)`: Provides basic statistics on the number of images and label files within a given directory pair."]},{"cell_type":"code","execution_count":null,"metadata":{"id":"99adf769","executionInfo":{"status":"ok","timestamp":1775418743954,"user_tz":-180,"elapsed":24,"user":{"displayName":"Nathan Holland","userId":"13994014446134761485"}},"colab":{"base_uri":"https://localhost:8080/"},"outputId":"c33563b5-311b-4fec-9650-2c457659b0dd"},"outputs":[{"output_type":"stream","name":"stdout","text":["Helper functions defined.\n"]}],"source":["import yaml\n","from pathlib import Path\n","import matplotlib.pyplot as plt\n","import matplotlib.patches as patches\n","from PIL import Image\n","import random\n","import os\n","from collections import defaultdict\n","from roboflow import Roboflow\n","\n","# a. Function to parse YOLO labels and count classes\n","def get_class_counts(label_dir, class_names):\n"," class_counts = defaultdict(int)\n"," total_annotations = 0\n"," if not label_dir.exists():\n"," print(f\"Warning: Label directory not found: {label_dir}\")\n"," return class_counts, total_annotations\n","\n"," for label_file in label_dir.glob('*.txt'):\n"," with open(label_file, 'r') as f:\n"," for line in f:\n"," parts = line.strip().split()\n"," if parts:\n"," try:\n"," class_id = int(parts[0])\n"," if 0 <= class_id < len(class_names):\n"," class_counts[class_names[class_id]] += 1\n"," total_annotations += 1\n"," except ValueError:\n"," print(f\"Warning: Invalid class_id in file {label_file.name}, line: {line.strip()}\")\n"," return class_counts, total_annotations\n","\n","# b. Function to plot image with bounding boxes\n","def plot_image_with_bboxes(image_path, label_path, class_names, save_path):\n"," try:\n"," img = Image.open(image_path).convert(\"RGB\")\n"," except Exception as e:\n"," print(f\"Error loading image {image_path}: {e}\")\n"," return\n","\n"," fig, ax = plt.subplots(1, figsize=(8, 8))\n"," ax.imshow(img)\n","\n"," img_width, img_height = img.size\n","\n"," if label_path.exists():\n"," with open(label_path, \"r\") as f:\n"," for line in f:\n"," parts = line.strip().split()\n"," if not parts:\n"," continue\n","\n"," try:\n"," class_id = int(parts[0])\n"," coords = [float(p) for p in parts[1:]]\n","\n"," x_min_px = y_min_px = width_px = height_px = None\n","\n"," # Case 1: YOLO bbox format\n"," # class_id x_center y_center width height\n"," if len(coords) == 4:\n"," x_center_norm, y_center_norm, width_norm, height_norm = coords\n","\n"," x_min_px = (x_center_norm - width_norm / 2) * img_width\n"," y_min_px = (y_center_norm - height_norm / 2) * img_height\n"," width_px = width_norm * img_width\n"," height_px = height_norm * img_height\n","\n"," # Case 2: YOLO polygon format\n"," # class_id x1 y1 x2 y2 ...\n"," elif len(coords) > 4 and len(coords) % 2 == 0:\n"," x_coords_norm = coords[0::2]\n"," y_coords_norm = coords[1::2]\n","\n"," min_x_norm = min(x_coords_norm)\n"," max_x_norm = max(x_coords_norm)\n"," min_y_norm = min(y_coords_norm)\n"," max_y_norm = max(y_coords_norm)\n","\n"," x_min_px = min_x_norm * img_width\n"," y_min_px = min_y_norm * img_height\n"," width_px = (max_x_norm - min_x_norm) * img_width\n"," height_px = (max_y_norm - min_y_norm) * img_height\n","\n"," else:\n"," print(\n"," f\"Warning: Unsupported label format in {label_path.name}, \"\n"," f\"line: {line.strip()}\"\n"," )\n"," continue\n","\n"," # Optional: clip box to image bounds\n"," x_min_px = max(0, x_min_px)\n"," y_min_px = max(0, y_min_px)\n"," width_px = max(0, min(width_px, img_width - x_min_px))\n"," height_px = max(0, min(height_px, img_height - y_min_px))\n","\n"," rect = patches.Rectangle(\n"," (x_min_px, y_min_px),\n"," width_px,\n"," height_px,\n"," linewidth=2,\n"," edgecolor=\"r\",\n"," facecolor=\"none\"\n"," )\n"," ax.add_patch(rect)\n","\n"," if 0 <= class_id < len(class_names):\n"," label = class_names[class_id]\n"," else:\n"," label = f\"Class {class_id}\"\n","\n"," text_y = max(0, y_min_px - 5)\n"," ax.text(\n"," x_min_px,\n"," text_y,\n"," label,\n"," color=\"r\",\n"," fontsize=10,\n"," bbox=dict(facecolor=\"white\", alpha=0.7)\n"," )\n","\n"," except ValueError:\n"," print(f\"Warning: Invalid data in label file {label_path.name}, line: {line.strip()}\")\n"," else:\n"," print(f\"Warning: Label file not found for {image_path.name}\")\n","\n"," ax.set_title(image_path.name)\n"," ax.axis(\"off\")\n"," plt.savefig(save_path)\n"," plt.close(fig) # Close the figure\n","\n","# 4. Other Dataset Metrics\n","def get_dataset_stats(image_dir, label_dir):\n"," num_images = len(list(image_dir.glob('*.jpg')) + list(image_dir.glob('*.png')))\n"," num_labels = len(list(label_dir.glob('*.txt')))\n"," return num_images, num_labels\n","\n","print(\"Helper functions defined.\")"]},{"cell_type":"markdown","metadata":{"id":"4d6e4ad6"},"source":["### Main Dataset Processing Loop\n","This loop iterates through each `dataset_config` defined in the `DATASET_CONFIGS` global variable. For each configuration, it performs the following actions:\n","\n","1. **Download Dataset**: Connects to Roboflow using the provided API key and downloads the specified dataset version in YOLOv11 format.\n","2. **Correct `data.yaml`**: Reads the downloaded `data.yaml` file, extracts class information, and modifies the image and label paths to be absolute, ensuring compatibility with Ultralytics.\n","3. **Perform Dataset Analysis (if enabled)**: If `GENERATE_PLOTS` is `True`:\n"," * Calculates and prints the class distribution for both training and validation sets.\n"," * Generates and saves bar charts visualizing the class distribution.\n"," * Selects and displays sample images with their bounding box annotations, prioritizing images that represent distinct classes, saving them to a dedicated directory.\n","4. **Display Dataset Statistics**: Reports the number of images and label files for the training, validation, and test splits.\n","5. **Store Dataset Information**: Gathers all relevant paths and metadata for the processed dataset and appends it to the `prepared_datasets_info` list, which will be used in subsequent training and comparison steps."]},{"cell_type":"code","execution_count":null,"metadata":{"id":"b790bb44","executionInfo":{"status":"ok","timestamp":1775418768667,"user_tz":-180,"elapsed":24295,"user":{"displayName":"Nathan Holland","userId":"13994014446134761485"}},"colab":{"base_uri":"https://localhost:8080/","height":1000},"outputId":"093e033b-dbe8-41ff-fb4b-08a0a69d456f"},"outputs":[{"output_type":"stream","name":"stdout","text":["\n","================================================================================\n","Processing Dataset: dataset\n","================================================================================\n","loading Roboflow workspace...\n","loading Roboflow project...\n","Exporting format yolov11 in progress : 92.0%\n","Version export complete for yolov11 format\n"]},{"output_type":"stream","name":"stderr","text":["Downloading Dataset Version Zip in Dataset-8 to yolov11:: 100%|██████████| 162055/162055 [00:12<00:00, 13408.35it/s]"]},{"output_type":"stream","name":"stdout","text":["\n"]},{"output_type":"stream","name":"stderr","text":["\n","Extracting Dataset Version Zip to Dataset-8 in yolov11:: 100%|██████████| 3916/3916 [00:00<00:00, 6711.31it/s]\n"]},{"output_type":"stream","name":"stdout","text":["Dataset 'dataset' downloaded to: /content/Dataset-8\n","Dataset analysis outputs will be saved to: outputs/dataset/dataset_analysis\n","Number of classes (nc): 2\n","Class Names: ['basketball', 'basketball_hoop']\n","Modified data.yaml saved to: /content/Dataset-8/data_corrected.yaml\n","\n","--- Class Distribution Analysis ---\n","Training Set Class Distribution (Total Annotations: 5325):\n"," basketball: 2640\n"," basketball_hoop: 2685\n","\n","Validation Set Class Distribution (Total Annotations: 451):\n"," basketball_hoop: 274\n"," basketball: 177\n"]},{"output_type":"display_data","data":{"text/plain":["<Figure size 1500x600 with 2 Axes>"],"image/png":"iVBORw0KGgoAAAANSUhEUgAABdEAAAJOCAYAAABYwk4SAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAh8ZJREFUeJzs3Xl4THf/xvF7ErJLCLI9CFW72FtiidgSqotK7VVbq0tQ9GetIrS0qpRa2ypatGjRhypiV6K11q6lSltCa0kIsp7fH67MY5oMmZhIwvt1XXPVnPOdcz5nsswnd8/5HpNhGIYAAAAAAAAAAEAGDrldAAAAAAAAAAAAeRUhOgAAAAAAAAAAVhCiAwAAAAAAAABgBSE6AAAAAAAAAABWEKIDAAAAAAAAAGAFIToAAAAAAAAAAFYQogMAAAAAAAAAYAUhOgAAAAAAAAAAVhCiAwAAAAAAAABgBSE6gAdO9+7dVbp06Wy9dvTo0TKZTPYt6AF1L+9zXrJ582aZTCZt3rw5x/eV2feXyWRSnz59cnzfkjRv3jyZTCb9/vvv92V/AAAgf/r9999lMpk0b9488zJb+mSTyaTRo0fbtabQ0FCFhobadZsPovvZ2+a00qVLq3v37jm+n8y+37t37y4PD48c33e6nPiZAWBfhOgA7huTyZSlx4PQ8GXXypUr1bhxY/n4+MjNzU2PPPKI2rdvrzVr1mRre+PGjdOKFStsek18fLyioqJUvXp1eXh4yNXVVVWrVtWQIUN09uzZbNVxv6Q3wOmPggULqlixYqpfv76GDx+uM2fO2G1f2Xlv75e8XBsAALCvp59+Wm5ubrp69arVMV26dJGTk5MuXrx4Hyuz3ZEjRzR69Og89z/8f//9d/Xo0UNly5aVi4uL/Pz8FBISolGjRmVre6tXr85WYLp8+XK1atVKxYoVk5OTkwICAtS+fXtt3LgxW3XcT6GhoeYe3cHBQZ6enqpQoYK6du2q6Ohou+0nu+/t/ZCXawNwdybDMIzcLgLAw2HBggUWzz///HNFR0friy++sFjeokUL+fr6Zns/ycnJSktLk7Ozs82vTUlJUUpKilxcXLK9/+yaOHGiBg0apMaNG+uZZ56Rm5ubTpw4ofXr16t69eoWZ0ZklYeHh5577rksv/a3335T8+bNdebMGbVr104NGzaUk5OTDhw4oC+//FLe3t765ZdfJN06O2Pz5s156o+c33//XWXKlFGnTp30xBNPKC0tTZcvX9auXbu0bNkymUwmzZkzRx07djS/Ji0tTUlJSXJycpKDQ9b/37Kt762U+feXyWRSZGSkpk2bluXtZLe21NRUJScny9nZmSsuAAB4QCxevFgdO3bU/Pnz9cILL2RYf/36dfn4+Khp06b673//m6VtpvdUc+fONZ8JbEufbDKZNGrUKJsDw6+//lrt2rXTpk2bMpx1npSUJElycnKyaZv36sSJE3rsscfk6uqqnj17qnTp0jp37pz27t2r77//Xjdv3rR5m3369NH06dOV1TjGMAz17NlT8+bNU82aNfXcc8/Jz89P586d0/Lly7Vnzx5t375d9evX1+bNm9WkSZNM38PcFBoaqpMnT2r8+PGSpISEBJ04cULLli3Tb7/9pvbt22vBggUqWLCg+TWJiYlycHCwWHY3tr630q33NzExUQULFpSjo6OkW3/rfP3117p27VqWt3Mvtd28eVMFChRQgQIF7LY/APbFTyeA++b555+3eL5z505FR0dnWP5v169fl5ubW5b3Y0uT9W+51bikpKRo7NixatGihdatW5dh/YULF+5LDW3bttX58+e1efNmNWzY0GL9O++8o/feey/H67CHWrVqZfi+On36tMLCwtStWzdVqlRJ1atXlyQ5ODjk+P80SUhIkLu7e643xo6OjuY/DAAAwIPh6aefVqFChbRo0aJMQ/Rvv/1WCQkJ6tKlyz3tJ7f7mPsdnqebPHmyrl27pv379yswMNBi3f3o0SXpgw8+0Lx589S/f39NmjTJ4mSIN998U1988UW+CF+9vLwy9Ojvvvuu+vXrpxkzZqh06dIWf29k56QoW6SkpCgtLU1OTk65chLV7XJ7/wDujulcAOQpoaGhqlq1qvbs2aOQkBC5ublp+PDhkm79AdC6dWsFBATI2dlZZcuW1dixY5WammqxjX/P1Z0+xcfEiRP18ccfq2zZsnJ2dtZjjz2mXbt2Wbz2TnNWr1ixQlWrVpWzs7OqVKmS6RQrmzdvVp06deTi4qKyZctq9uzZWZo/8p9//lF8fLwaNGiQ6XofHx+L54mJiRo1apQeffRROTs7q2TJkho8eLASExMt6k5ISND8+fPNl07eaU7Bb775Rj///LPefPPNDAG6JHl6euqdd96543FMnDhR9evXV9GiReXq6qratWvr66+/zjAuOjpaDRs2VOHCheXh4aEKFSqYv87pPvroI1WpUkVubm4qUqSI6tSpo0WLFt1x/3cSGBioefPmKSkpSRMmTDAvz2zeyF9//VURERHy8/OTi4uLSpQooY4dOyouLk7Snd/b9K/3kSNH1LlzZxUpUsT8ft7pe2HhwoWqUKGCXFxcVLt2bW3dutVivbU56P+9zTvVZm1O9BkzZqhKlSpydnZWQECAIiMjdeXKFYsx6T+bR44cUZMmTeTm5qb//Oc/Fu8lAAC4/1xdXdW2bVtt2LAh01B30aJFKlSokJ5++mldunRJ//d//6egoCB5eHjI09NTrVq10s8//3zX/WTWxyQmJmrAgAEqXry4eR9//vlnhteePn1ar732mipUqCBXV1cVLVpU7dq1s+hJ5s2bp3bt2kmSmjRpkmGqx8zmRL9w4YJ69eolX19fubi4qHr16po/f77FGFv+FsjMyZMnVaJEiQwBupSxR5ek77//Xo0aNZK7u7sKFSqk1q1b6/Dhw+b13bt31/Tp0yVZTndpzY0bNzR+/HhVrFhREydOzHRs165d9fjjj1vdxrZt29SuXTuVKlXK/LfDgAEDdOPGDYtxsbGx6tGjh0qUKCFnZ2f5+/vrmWeesfg67d69W+Hh4SpWrJhcXV1VpkwZ9ezZ0+q+78bR0VFTp05V5cqVNW3aNHO/LWWcEz05OVlRUVEqV66cXFxcVLRoUTVs2NA8Hcyd3tvbvw8+/PBD8/fBkSNHMp0TPd1vv/2m8PBwubu7KyAgQGPGjLE4k9zaHPT/3ubdvu6ZzYm+b98+tWrVSp6envLw8FCzZs20c+dOizHp/f327ds1cOBAFS9eXO7u7nr22Wf1999/3/0LACDL8v7/qgTw0Ll48aJatWqljh076vnnnzdP7TJv3jx5eHho4MCB8vDw0MaNGzVy5EjFx8fr/fffv+t2Fy1apKtXr+rll1+WyWTShAkT1LZtW/322293PXv9hx9+0LJly/Taa6+pUKFCmjp1qiIiInTmzBkVLVpU0q0mp2XLlvL391dUVJRSU1M1ZswYFS9e/K61+fj4yNXVVStXrlTfvn3l7e1tdWxaWpqefvpp/fDDD+rdu7cqVaqkgwcPavLkyfrll1/Mc2F/8cUXevHFF/X444+rd+/ekqSyZcta3W765b1du3a9a73WTJkyRU8//bS6dOmipKQkffXVV2rXrp1WrVql1q1bS5IOHz6sJ598UtWqVdOYMWPk7OysEydOaPv27ebtfPLJJ+rXr5+ee+45vf7667p586YOHDigH3/8UZ07d852fcHBwSpbtuwd511MSkpSeHi4EhMT1bdvX/n5+emvv/7SqlWrdOXKFXl5eWXpvW3Xrp3KlSuncePG3fVy0i1btmjx4sXq16+fnJ2dNWPGDLVs2VI//fSTqlatatMx2vp1Hz16tKKiotS8eXO9+uqrOn78uGbOnKldu3Zp+/btFj8bly9fVsuWLdW2bVu1b99eX3/9tYYMGaKgoCC1atXKpjoBAID9dOnSRfPnz9eSJUssblh+6dIlrV27Vp06dZKrq6sOHz6sFStWqF27dipTpozOnz+v2bNnq3Hjxjpy5IgCAgJs2u+LL76oBQsWqHPnzqpfv742btxo7vlut2vXLu3YsUMdO3ZUiRIl9Pvvv2vmzJkKDQ3VkSNH5ObmppCQEPXr109Tp07V8OHDValSJUky//ffbty4odDQUJ04cUJ9+vRRmTJltHTpUnXv3l1XrlzR66+/bjE+u38LBAYGav369dq4caOaNm16x/fjiy++ULdu3RQeHq733ntP169f18yZM9WwYUPt27dPpUuX1ssvv6yzZ89mOq1lZn744QddunRJ/fv3z/YVhUuXLtX169f16quvqmjRovrpp5/00Ucf6c8//9TSpUvN4yIiInT48GH17dtXpUuX1oULFxQdHa0zZ86Yn4eFhal48eIaOnSoChcurN9//13Lli3LVl3pHB0d1alTJ7311lv64YcfMv0ekm71rePHjzf3uvHx8dq9e7f27t2rFi1aZOm9nTt3rm7evKnevXvL2dlZ3t7eSktLy3RsamqqWrZsqXr16mnChAlas2aNRo0apZSUFI0ZM8amY7T163748GE1atRInp6eGjx4sAoWLKjZs2crNDRUW7ZsUd26dS3G9+3bV0WKFNGoUaP0+++/68MPP1SfPn20ePFim+oEcAcGAOSSyMhI49+/hho3bmxIMmbNmpVh/PXr1zMse/nllw03Nzfj5s2b5mXdunUzAgMDzc9PnTplSDKKFi1qXLp0ybz822+/NSQZK1euNC8bNWpUhpokGU5OTsaJEyfMy37++WdDkvHRRx+Zlz311FOGm5ub8ddff5mX/frrr0aBAgUybDMzI0eONCQZ7u7uRqtWrYx33nnH2LNnT4ZxX3zxheHg4GBs27bNYvmsWbMMScb27dvNy9zd3Y1u3brddd+GYRg1a9Y0vLy8sjTWMDK+z4aR8WuUlJRkVK1a1WjatKl52eTJkw1Jxt9//211288884xRpUqVLNeSLv1r/f77799x25KMuLg4wzAMY9OmTYYkY9OmTYZhGMa+ffsMScbSpUvvuC9r723691CnTp2srrudJEOSsXv3bvOy06dPGy4uLsazzz5rXpbZ+21tm9Zqmzt3riHJOHXqlGEYhnHhwgXDycnJCAsLM1JTU83jpk2bZkgyPvvsM/Oy9J/Nzz//3LwsMTHR8PPzMyIiIjLsCwAA3D8pKSmGv7+/ERwcbLE8vT9cu3atYRiGcfPmTYvPfMO41T85OzsbY8aMsVgmyZg7d6552b97jv379xuSjNdee81ie507dzYkGaNGjTIvy6yPj4mJydBbLF261KIvu13jxo2Nxo0bm59/+OGHhiRjwYIF5mVJSUlGcHCw4eHhYcTHx1scS1b+FsjMoUOHDFdXV0OSUaNGDeP11183VqxYYSQkJFiMu3r1qlG4cGHjpZdeslgeGxtreHl5WSzP7O8ga6ZMmWJIMpYvX56l8f/ubQ0j8/d//PjxhslkMk6fPm0YhmFcvnz5rn308uXLDUnGrl27slTL7Ro3bnzH/j5921OmTDEvCwwMtOhpq1evbrRu3fqO+7H23qZ/H3h6ehoXLlzIdN3t3+/dunUzJBl9+/Y1L0tLSzNat25tODk5mf+Wyez9trbNO33d//0z06ZNG8PJyck4efKkednZs2eNQoUKGSEhIeZl6f198+bNjbS0NPPyAQMGGI6OjsaVK1cy3R8A2zGdC4A8x9nZWT169Miw3NXV1fzvq1ev6p9//lGjRo10/fp1HTt27K7b7dChg4oUKWJ+3qhRI0m3LtG7m+bNm1uczVutWjV5enqaX5uamqr169erTZs2FmfwPProo1k+QzcqKkqLFi1SzZo1tXbtWr355puqXbu2atWqpaNHj5rHLV26VJUqVVLFihX1zz//mB/pZ8Zs2rQpS/v7t/j4eBUqVChbr013+9fo8uXLiouLU6NGjbR3717z8sKFC0u6NT2PtbM+ChcurD///DNLl9jaysPDQ9Kt76HMeHl5SZLWrl2r69evZ3s/r7zySpbHBgcHq3bt2ubnpUqV0jPPPKO1a9dmmK7IntavX6+kpCT179/f4qaqL730kjw9PfXdd99ZjPfw8LCYx9LJyUmPP/54ln6GAABAznF0dFTHjh0VExNjMfXGokWL5Ovrq2bNmkm61Wenf+anpqbq4sWL5qn1bu/XsmL16tWSpH79+lks79+/f4axt/eIycnJunjxoh599FEVLlzY5v3evn8/Pz916tTJvKxgwYLq16+frl27pi1btliMz+7fAlWqVNH+/fv1/PPP6/fff9eUKVPUpk0b+fr66pNPPjGPi46O1pUrV9SpUyeLHt3R0VF169a9px5d0j316be//wkJCfrnn39Uv359GYahffv2mcc4OTlp8+bNunz5cqbbSe/jV61apeTk5GzXk5m79ejp+z98+LB+/fXXbO8nIiIiS1cKp7v9yo70aT6TkpK0fv36bNdwN6mpqVq3bp3atGmjRx55xLzc399fnTt31g8//GD+vkjXu3dvi+lhGjVqpNTUVJ0+fTrH6gQeNoToAPKc//znP5neOOjw4cN69tln5eXlJU9PTxUvXtwc6N0+d541pUqVsnie3kRbaxLv9Nr016e/9sKFC7px44YeffTRDOMyW2ZNp06dtG3bNl2+fFnr1q1T586dtW/fPj311FO6efOmpFvzdR8+fFjFixe3eJQvX95cS3Z4enresWnNilWrVqlevXpycXGRt7e3ihcvrpkzZ1p8fTp06KAGDRroxRdflK+vrzp27KglS5ZYBOpDhgyRh4eHHn/8cZUrV06RkZEW073ci2vXrkmy/odImTJlNHDgQH366acqVqyYwsPDNX369Cx9j/17O1lVrly5DMvKly+v69ev5+hchulNdYUKFSyWOzk56ZFHHsnQdJcoUSLDPJy3/xwAAIDck37j0PR7yPz555/atm2bOnbsaJ4GJC0tTZMnT1a5cuXk7OysYsWKqXjx4jpw4IDNvc7p06fl4OCQYdq4f/cV0q2pV0aOHKmSJUta7PfKlSs27/f2/ZcrV87iRADpf9O//LuPuZe/BcqXL68vvvhC//zzjw4cOKBx48apQIEC6t27tzlMTQ92mzZtmqFPX7du3T316NKdw+W7OXPmjLp37y5vb295eHioePHiaty4saT//R3l7Oys9957T99//718fX0VEhKiCRMmKDY21rydxo0bKyIiQlFRUSpWrJieeeYZzZ071+K+TNl1tx5dksaMGaMrV66ofPnyCgoK0qBBg3TgwAGb9mNLj+7g4GARYksy/83173sM2dPff/+t69evZ/qzVKlSJaWlpemPP/6wWH4v398AsoYQHUCec/uZEumuXLmixo0b6+eff9aYMWO0cuVKRUdHm+/ebu2M5ttZm0PQuMt81ff62uzw9PRUixYttHDhQnXr1k0nT57Ujz/+KOnWsQYFBSk6OjrTx2uvvZatfVasWFFxcXEZGrKs2rZtm55++mm5uLhoxowZWr16taKjo9W5c2eL98nV1VVbt27V+vXr1bVrVx04cEAdOnRQixYtzGddV6pUScePH9dXX32lhg0b6ptvvlHDhg01atSobNV2u0OHDsnHx8f8B0lmPvjgAx04cEDDhw/XjRs31K9fP1WpUiXTG2VZk9n38b2wdsOpnDxT/d/u988BAADIutq1a6tixYr68ssvJUlffvmlDMMwh+uSNG7cOA0cOFAhISFasGCB1q5dq+joaFWpUiVL/XR29e3bV++8847at2+vJUuWaN26dYqOjlbRokVzdL+3s0cf4+joqKCgIA0bNkzLly+XdOvm8NL//h754osvMu3Rv/3222zVXbFiRUnSwYMHs/X61NRUtWjRQt99952GDBmiFStWKDo62nzDy9vf//79++uXX37R+PHj5eLiorfeekuVKlUyn61uMpn09ddfKyYmRn369NFff/2lnj17qnbt2uYQPLsOHTok6c4nIIWEhOjkyZP67LPPVLVqVX366aeqVauWPv300yzv50Hs0SX6dOB+4MaiAPKFzZs36+LFi1q2bJlCQkLMy0+dOpWLVf2Pj4+PXFxcdOLEiQzrMltmizp16mj+/Pk6d+6cpFs3ifz555/VrFkzq01burutv91TTz2lL7/8UgsWLNCwYcNsrvObb76Ri4uL1q5dK2dnZ/PyuXPnZhjr4OCgZs2aqVmzZpo0aZLGjRunN998U5s2bVLz5s0lSe7u7urQoYM6dOigpKQktW3bVu+8846GDRsmFxcXm+uTpJiYGJ08edJiShJrgoKCFBQUpBEjRmjHjh1q0KCBZs2apbfffluSbe/t3WR2Seovv/wiNzc38+WmRYoU0ZUrVzKMy+wSzazWFhgYKEk6fvy4xVk2SUlJOnXqlPlrAQAA8ocuXbrorbfe0oEDB7Ro0SKVK1dOjz32mHn9119/rSZNmmjOnDkWr7ty5YqKFStm074CAwOVlpamkydPWpwxe/z48Qxjv/76a3Xr1k0ffPCBednNmzcz9Da29FeBgYE6cOCA0tLSLM5GT5/mMb3PySl16tSRJIseXbr1d8HdeihbjrNhw4YqUqSIvvzySw0fPtzmm4sePHhQv/zyi+bPn68XXnjBvDw6OjrT8WXLltUbb7yhN954Q7/++qtq1KihDz74QAsWLDCPqVevnurVq6d33nlHixYtUpcuXfTVV1/pxRdftKm2dKmpqVq0aJHc3NzUsGHDO4719vZWjx491KNHD127dk0hISEaPXq0ed/27NHT0tL022+/mc8+l2716JJUunRpSf874/vf38v30qMXL15cbm5umf4sHTt2TA4ODipZsmSWtgXAfjgTHUC+kN4s3v5/0pOSkjRjxozcKsmCo6OjmjdvrhUrVujs2bPm5SdOnND3339/19dfv35dMTExma5Lf336Hyft27fXX3/9ZTEHY7obN24oISHB/Nzd3T3T4DUzzz33nIKCgvTOO+9kWsvVq1f15ptvWn29o6OjTCaTxVkXv//+u1asWGEx7tKlSxleW6NGDUkyXwp68eJFi/VOTk6qXLmyDMPI9vyLp0+fVvfu3eXk5KRBgwZZHRcfH6+UlBSLZUFBQXJwcLC4VNWW9/ZuYmJiLOYD/eOPP/Ttt98qLCzM/L1ftmxZxcXFWVyyeu7cOfNZULfLam3NmzeXk5OTpk6davGzNWfOHMXFxal169b3cFQAAOB+Sz/rfOTIkdq/f7/FWejSrX7t32emLl26VH/99ZfN+0q/78/UqVMtln/44YcZxma2348++ijD2bru7u6SMgaSmXniiScUGxurxYsXm5elpKToo48+koeHh3m6knu1bdu2TPvP9Dnh03v08PBweXp6aty4cZmOv32KPluO083NTUOGDNHRo0c1ZMiQTM8sXrBggX766adMX5/Z31GGYWjKlCkW465fv26ePjJd2bJlVahQIXMPfPny5Qz7/3cfb6vU1FT169dPR48eVb9+/e54tei//0bw8PDQo48+mqFHl7L23mbFtGnTzP82DEPTpk1TwYIFzfcZCAwMlKOjo7Zu3Wrxusz+Ts1qbY6OjgoLC9O3335rMW3M+fPntWjRIjVs2PCO7xOAnMGZ6ADyhfr166tI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\n"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["\n","--- Sample Images with Annotations ---\n","Displaying and saving 5 sample images, prioritizing distinct classes.\n"," Saved sample image with annotations to outputs/dataset/dataset_analysis/sample_image_image101_group2_jpg.rf.24c77441c13ab629c3a2636c921d3dc2.png\n"," Saved sample image with annotations to outputs/dataset/dataset_analysis/sample_image_image98_group2_jpg.rf.d328ec2466e403463a7eb68f687d72ee.png\n"," Saved sample image with annotations to outputs/dataset/dataset_analysis/sample_image_image595_group14_jpg.rf.8d0f91eddac3fafabfafd2ccbb778ca1.png\n"," Saved sample image with annotations to outputs/dataset/dataset_analysis/sample_image_image733_group18_png.rf.934d31dba0b372fdb9d547834d5c7545.png\n"," Saved sample image with annotations to outputs/dataset/dataset_analysis/sample_image_image347_group8_jpg.rf.6eaf7b518728241e169df44cecd3dbe5.png\n","\n","Training Set: 1722 images, 1722 label files\n","Validation Set: 178 images, 178 label files\n","Test Set: 56 images, 56 label files\n","\n","================================================================================\n","Finished processing 1 datasets.\n","Prepared Datasets Info: [{'alias': 'dataset', 'dataset_root_dir': PosixPath('/content/Dataset-8'), 'data_yaml_path': PosixPath('/content/Dataset-8/data_corrected.yaml'), 'class_names': ['basketball', 'basketball_hoop'], 'nc': 2, 'output_dir': PosixPath('outputs/dataset'), 'train_images_path': PosixPath('/content/Dataset-8/train/images'), 'train_labels_path': PosixPath('/content/Dataset-8/train/labels'), 'val_images_path': PosixPath('/content/Dataset-8/valid/images'), 'val_labels_path': PosixPath('/content/Dataset-8/valid/labels'), 'test_images_path': PosixPath('/content/Dataset-8/test/images'), 'test_labels_path': PosixPath('/content/Dataset-8/test/labels')}]\n","================================================================================\n"]}],"source":["import yaml\n","from pathlib import Path\n","import matplotlib.pyplot as plt\n","import matplotlib.patches as patches\n","from PIL import Image\n","import random\n","import os\n","from collections import defaultdict\n","from roboflow import Roboflow\n","\n","# Initialize an empty list to store information about each processed dataset\n","# This initialization is also done in a separate cell, but kept here for self-containment if cell order changes.\n","# prepared_datasets_info = [] # Re-initializing here would clear previous data if cells were run out of order\n","\n","\n","# Iterate through each dataset_config in the DATASET_CONFIGS list\n","for dataset_config in DATASET_CONFIGS:\n"," rf_api_key = dataset_config['ROBOFLOW_API_KEY']\n"," workspace = dataset_config['WORKSPACE']\n"," project_name = dataset_config['PROJECT']\n"," version_num = dataset_config['VERSION']\n"," alias = dataset_config['ALIAS']\n","\n"," print(f\"\\n{'='*80}\")\n"," print(f\"Processing Dataset: {alias}\")\n"," print(f\"{'='*80}\")\n","\n"," # 1. Download dataset from Roboflow\n"," try:\n"," # Configure Roboflow API\n"," # Note: Using direct API key from config for demonstration. In production, use os.getenv()\n"," if rf_api_key == 'YOUR_API_KEY_HERE':\n"," print(\"WARNING: Roboflow API Key not set. Skipping dataset download for this config.\")\n"," continue # Skip this dataset if API key is not provided\n","\n"," rf = Roboflow(api_key=rf_api_key)\n"," project = rf.workspace(workspace).project(project_name)\n"," version = project.version(version_num)\n"," dataset = version.download(\"yolov11\")\n","\n"," dataset_location = Path(dataset.location)\n"," print(f\"Dataset '{alias}' downloaded to: {dataset_location}\")\n","\n"," # Create a dataset-specific output directory for analysis artifacts\n"," output_base_dir = Path(f'outputs/{alias}')\n"," dataset_analysis_output_dir = output_base_dir / 'dataset_analysis'\n"," dataset_analysis_output_dir.mkdir(parents=True, exist_ok=True)\n"," print(f\"Dataset analysis outputs will be saved to: {dataset_analysis_output_dir}\")\n","\n"," # 2. Correct and save the 'data.yaml' file\n"," original_data_yaml_path = dataset_location / 'data.yaml'\n","\n"," if not original_data_yaml_path.exists():\n"," print(f\"Error: data.yaml not found at {original_data_yaml_path}. Skipping dataset.\")\n"," continue\n","\n"," with open(original_data_yaml_path, 'r') as f:\n"," data_config_content = yaml.safe_load(f)\n","\n"," class_names = data_config_content['names']\n"," nc = data_config_content['nc']\n"," print(f\"Number of classes (nc): {nc}\")\n"," print(f\"Class Names: {class_names}\")\n","\n"," # Correctly construct absolute paths for images and labels\n"," train_images_abs_path = dataset_location / 'train' / 'images'\n"," train_labels_abs_path = dataset_location / 'train' / 'labels'\n","\n"," val_images_abs_path = dataset_location / 'valid' / 'images'\n"," val_labels_abs_path = dataset_location / 'valid' / 'labels'\n","\n"," test_images_abs_path = dataset_location / 'test' / 'images'\n"," test_labels_abs_path = dataset_location / 'test' / 'labels'\n","\n"," # Update data_config with paths RELATIVE to the dataset_root_dir\n"," data_config_content['train'] = str(train_images_abs_path.relative_to(dataset_location))\n"," data_config_content['val'] = str(val_images_abs_path.relative_to(dataset_location))\n"," data_config_content['test'] = str(test_images_abs_path.relative_to(dataset_location))\n","\n"," modified_data_yaml_path = dataset_location / 'data_corrected.yaml'\n"," with open(modified_data_yaml_path, 'w') as f:\n"," yaml.dump(data_config_content, f, default_flow_style=False)\n","\n"," print(f\"Modified data.yaml saved to: {modified_data_yaml_path}\")\n","\n"," # Store absolute paths for analysis functions\n"," current_dataset_paths = {\n"," 'train_images': train_images_abs_path,\n"," 'train_labels': train_labels_abs_path,\n"," 'val_images': val_images_abs_path,\n"," 'val_labels': val_labels_abs_path,\n"," 'test_images': test_images_abs_path,\n"," 'test_labels': test_labels_abs_path,\n"," }\n","\n"," # 3. Perform and display dataset analysis (class distribution and sample images)\n"," if GENERATE_PLOTS:\n"," print(\"\\n--- Class Distribution Analysis ---\")\n"," # Get counts for training set\n"," train_class_counts, total_train_annotations = get_class_counts(current_dataset_paths['train_labels'], class_names)\n"," print(f\"Training Set Class Distribution (Total Annotations: {total_train_annotations}):\")\n"," for cls, count in train_class_counts.items():\n"," print(f\" {cls}: {count}\")\n","\n"," # Get counts for validation set\n"," val_class_counts, total_val_annotations = get_class_counts(current_dataset_paths['val_labels'], class_names)\n"," print(f\"\\nValidation Set Class Distribution (Total Annotations: {total_val_annotations}):\")\n"," for cls, count in val_class_counts.items():\n"," print(f\" {cls}: {count}\")\n","\n"," # Plotting the class distribution\n"," fig, axes = plt.subplots(1, 2, figsize=(15, 6))\n","\n"," # Training set plot\n"," if train_class_counts:\n"," axes[0].bar(train_class_counts.keys(), train_class_counts.values(), color='skyblue')\n"," axes[0].set_title('Training Set Class Distribution')\n"," axes[0].set_xlabel('Class')\n"," axes[0].set_ylabel('Number of Instances')\n"," axes[0].tick_params(axis='x', rotation=45)\n","\n"," # Validation set plot\n"," if val_class_counts:\n"," axes[1].bar(val_class_counts.keys(), val_class_counts.values(), color='lightcoral')\n"," axes[1].set_title('Validation Set Class Distribution')\n"," axes[1].set_xlabel('Class')\n"," axes[1].set_ylabel('Number of Instances')\n"," axes[1].tick_params(axis='x', rotation=45)\n","\n"," plt.tight_layout()\n"," plt.savefig(dataset_analysis_output_dir / 'class_distribution.png')\n"," plt.show()\n"," plt.close(fig) # Close the figure to free up memory\n","\n"," print(\"\\n--- Sample Images with Annotations ---\")\n"," # Get a list of all training image files\n"," train_image_files = list(current_dataset_paths['train_images'].glob('*.jpg')) + \\\n"," list(current_dataset_paths['train_images'].glob('*.png'))\n","\n"," if len(train_image_files) == 0:\n"," print(f\"No training images found in {current_dataset_paths['train_images']}\")\n"," else:\n"," num_samples_to_show = min(5, len(train_image_files))\n"," selected_images = []\n"," class_image_map = {name: None for name in class_names}\n","\n"," # Try to find an image for each class\n"," for img_file in train_image_files:\n"," label_file = current_dataset_paths['train_labels'] / (img_file.stem + '.txt')\n"," if label_file.exists():\n"," with open(label_file, 'r') as f:\n"," for line in f:\n"," parts = line.strip().split()\n"," if parts:\n"," try:\n"," class_id = int(parts[0])\n"," if 0 <= class_id < len(class_names):\n"," class_name = class_names[class_id]\n"," if class_image_map[class_name] is None:\n"," class_image_map[class_name] = img_file\n"," break # Move to next image once a class is covered\n"," except ValueError:\n"," pass # Ignore invalid lines for selection\n","\n"," # Add images that contain unique classes first\n"," for class_name in class_names:\n"," if class_image_map[class_name] is not None and class_image_map[class_name] not in selected_images:\n"," selected_images.append(class_image_map[class_name])\n","\n"," # Fill the rest with random images if needed\n"," remaining_slots = num_samples_to_show - len(selected_images)\n"," if remaining_slots > 0:\n"," remaining_images = [img for img in train_image_files if img not in selected_images]\n"," if len(remaining_images) > remaining_slots:\n"," selected_images.extend(random.sample(remaining_images, remaining_slots))\n"," else:\n"," selected_images.extend(remaining_images)\n","\n"," if not selected_images:\n"," print(\"Could not find any suitable images to display with annotations.\")\n"," else:\n"," print(f\"Displaying and saving {len(selected_images)} sample images, prioritizing distinct classes.\")\n"," for idx, img_file in enumerate(selected_images):\n"," label_file = current_dataset_paths['train_labels'] / (img_file.stem + '.txt')\n"," save_path = dataset_analysis_output_dir / f\"sample_image_{img_file.stem}.png\"\n"," plot_image_with_bboxes(img_file, label_file, class_names, save_path)\n"," print(f\" Saved sample image with annotations to {save_path}\")\n","\n"," # 4. Other Dataset Metrics\n"," train_num_images, train_num_labels = get_dataset_stats(current_dataset_paths['train_images'], current_dataset_paths['train_labels'])\n"," print(f\"\\nTraining Set: {train_num_images} images, {train_num_labels} label files\")\n","\n"," val_num_images, val_num_labels = get_dataset_stats(current_dataset_paths['val_images'], current_dataset_paths['val_labels'])\n"," print(f\"Validation Set: {val_num_images} images, {val_num_labels} label files\")\n","\n"," test_num_images, test_num_labels = get_dataset_stats(current_dataset_paths['test_images'], current_dataset_paths['test_labels'])\n"," print(f\"Test Set: {test_num_images} images, {test_num_labels} label files\")\n","\n"," # Store the corrected data.yaml path and other relevant dataset info\n"," prepared_datasets_info.append({\n"," 'alias': alias,\n"," 'dataset_root_dir': dataset_location,\n"," 'data_yaml_path': modified_data_yaml_path,\n"," 'class_names': class_names,\n"," 'nc': nc,\n"," 'output_dir': output_base_dir,\n"," 'train_images_path': current_dataset_paths['train_images'],\n"," 'train_labels_path': current_dataset_paths['train_labels'],\n"," 'val_images_path': current_dataset_paths['val_images'],\n"," 'val_labels_path': current_dataset_paths['val_labels'],\n"," 'test_images_path': current_dataset_paths['test_images'],\n"," 'test_labels_path': current_dataset_paths['test_labels']\n"," })\n","\n"," except Exception as e:\n"," print(f\"Error processing dataset '{alias}': {e}\")\n","\n","print(f\"\\n{'='*80}\")\n","print(f\"Finished processing {len(prepared_datasets_info)} datasets.\")\n","print(f\"Prepared Datasets Info: {prepared_datasets_info}\")\n","print(f\"{'='*80}\")"]},{"cell_type":"markdown","metadata":{"id":"06f079e5"},"source":["## Model Training, Validation, and Export Loop\n","\n","This section orchestrates a comprehensive and iterative workflow for training, validating, and exporting object detection models across various datasets and model architectures. For each dataset defined in `DATASET_CONFIGS` and each model architecture specified in `MODEL_ARCHITECTURES`, the notebook performs the following steps:\n","1. **Model Loading**: A pre-trained YOLO model (e.g., `yolo11n.pt`) is loaded to serve as a starting point for training.\n","2. **Model Training**: The model is trained on the current dataset using the `TRAINING_HYPERPARAMETERS`. This step includes configuring the model with the dataset's specific `data.yaml` path and setting up a unique output directory for the run.\n","3. **Metric Collection**: During and after training, key performance metrics such as `mAP50`, `mAP50-95`, `Precision`, `Recall`, `Training Time`, and `Inference Time` are collected to evaluate the model's performance.\n","4. **Model Validation**: The trained model undergoes a validation phase to assess its generalization capabilities on unseen data, confirming the collected metrics.\n","5. **Model Export to Mobile Formats**: To facilitate real-time mobile deployment, the best-performing model from each training run is exported to: \\n * **CoreML (.mlpackage)**: Optimized for iOS devices, often with half-precision (FP16) and built-in NMS.\\n * **TFLite (.tflite)**: Optimized for Android devices, typically with INT8 quantization and built-in NMS.\n","6. **Visual Test Results**: If `SAVE_TEST_PREDICTION_IMAGES` is enabled, the model generates predictions on a selection of test images. These images, annotated with bounding boxes and confidence scores, are saved to provide a qualitative assessment of the model's performance.\n","\n","All training logs, model weights, exported formats, and visual test results are meticulously organized and saved into uniquely named directories, ensuring clear traceability and easy comparison between different model-dataset combinations. This systematic approach allows for robust evaluation and selection of the most suitable model for specific application requirements.\"\n"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"fb2ca4eb","colab":{"base_uri":"https://localhost:8080/"},"outputId":"50d43874-977b-41ac-9c88-092eddad5201","executionInfo":{"status":"ok","timestamp":1775419683604,"user_tz":-180,"elapsed":914917,"user":{"displayName":"Nathan Holland","userId":"13994014446134761485"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["\n","================================================================================\n","STARTING MODEL TRAINING, VALIDATION, AND EXPORT LOOP\n","================================================================================\n","\n","\n","**********************************************************************\n","Processing Dataset: dataset (/content/Dataset-8/data_corrected.yaml)\n","**********************************************************************\n","\n","\n","------------------------------------------------------------\n","Training Model: yolo11n on Dataset: dataset\n","------------------------------------------------------------\n","\n","Loading model: yolo11n.pt\n","\u001b[KDownloading https://github.com/ultralytics/assets/releases/download/v8.4.0/yolo11n.pt to 'yolo11n.pt': 100% ━━━━━━━━━━━━ 5.4MB 364.3MB/s 0.0s\n","Model yolo11n.pt loaded successfully.\n","Starting model training...\n","Ultralytics 8.4.33 🚀 Python-3.12.13 torch-2.10.0+cu128 CUDA:0 (NVIDIA L4, 22563MiB)\n","\u001b[34m\u001b[1mengine/trainer: \u001b[0magnostic_nms=False, amp=True, angle=1.0, augment=False, auto_augment=randaugment, batch=8, bgr=0.0, box=7.5, cache=False, cfg=None, classes=None, close_mosaic=10, cls=0.5, compile=False, conf=None, copy_paste=0.0, copy_paste_mode=flip, cos_lr=False, cutmix=0.0, data=/content/Dataset-8/data_corrected.yaml, degrees=0.0, deterministic=True, device=0, dfl=1.5, dnn=False, dropout=0.0, dynamic=False, embed=None, end2end=None, epochs=100, erasing=0.4, exist_ok=False, fliplr=0.5, flipud=0.0, format=torchscript, fraction=1.0, freeze=None, half=False, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, imgsz=900, int8=False, iou=0.7, keras=False, kobj=1.0, line_width=None, lr0=0.001, lrf=0.01, mask_ratio=4, max_det=300, mixup=0.0, mode=train, model=yolo11n.pt, momentum=0.937, mosaic=1.0, multi_scale=0.0, name=yolo11n_dataset, nbs=64, nms=False, opset=None, optimize=False, optimizer=AdamW, overlap_mask=True, patience=20, perspective=0.0, plots=True, pose=12.0, pretrained=True, profile=False, project=runs/all_trainings, rect=False, resume=False, retina_masks=False, rle=1.0, save=True, save_conf=False, save_crop=False, save_dir=/content/runs/detect/runs/all_trainings/yolo11n_dataset, save_frames=False, save_json=False, save_period=-1, save_txt=False, scale=0.5, seed=0, shear=0.0, show=False, show_boxes=True, show_conf=True, show_labels=True, simplify=True, single_cls=False, source=None, split=val, stream_buffer=False, task=detect, time=None, tracker=botsort.yaml, translate=0.1, val=True, verbose=True, vid_stride=1, visualize=False, warmup_bias_lr=0.1, warmup_epochs=3.0, warmup_momentum=0.8, weight_decay=0.0005, workers=8, workspace=None\n","\u001b[KDownloading https://ultralytics.com/assets/Arial.ttf to '/root/.config/Ultralytics/Arial.ttf': 100% ━━━━━━━━━━━━ 755.1KB 138.6MB/s 0.0s\n","Overriding model.yaml nc=80 with nc=2\n","\n"," from n params module arguments \n"," 0 -1 1 464 ultralytics.nn.modules.conv.Conv [3, 16, 3, 2] \n"," 1 -1 1 4672 ultralytics.nn.modules.conv.Conv [16, 32, 3, 2] \n"," 2 -1 1 6640 ultralytics.nn.modules.block.C3k2 [32, 64, 1, False, 0.25] \n"," 3 -1 1 36992 ultralytics.nn.modules.conv.Conv [64, 64, 3, 2] \n"," 4 -1 1 26080 ultralytics.nn.modules.block.C3k2 [64, 128, 1, False, 0.25] \n"," 5 -1 1 147712 ultralytics.nn.modules.conv.Conv [128, 128, 3, 2] \n"," 6 -1 1 87040 ultralytics.nn.modules.block.C3k2 [128, 128, 1, True] \n"," 7 -1 1 295424 ultralytics.nn.modules.conv.Conv [128, 256, 3, 2] \n"," 8 -1 1 346112 ultralytics.nn.modules.block.C3k2 [256, 256, 1, True] \n"," 9 -1 1 164608 ultralytics.nn.modules.block.SPPF [256, 256, 5] \n"," 10 -1 1 249728 ultralytics.nn.modules.block.C2PSA [256, 256, 1] \n"," 11 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest'] \n"," 12 [-1, 6] 1 0 ultralytics.nn.modules.conv.Concat [1] \n"," 13 -1 1 111296 ultralytics.nn.modules.block.C3k2 [384, 128, 1, False] \n"," 14 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest'] \n"," 15 [-1, 4] 1 0 ultralytics.nn.modules.conv.Concat [1] \n"," 16 -1 1 32096 ultralytics.nn.modules.block.C3k2 [256, 64, 1, False] \n"," 17 -1 1 36992 ultralytics.nn.modules.conv.Conv [64, 64, 3, 2] \n"," 18 [-1, 13] 1 0 ultralytics.nn.modules.conv.Concat [1] \n"," 19 -1 1 86720 ultralytics.nn.modules.block.C3k2 [192, 128, 1, False] \n"," 20 -1 1 147712 ultralytics.nn.modules.conv.Conv [128, 128, 3, 2] \n"," 21 [-1, 10] 1 0 ultralytics.nn.modules.conv.Concat [1] \n"," 22 -1 1 378880 ultralytics.nn.modules.block.C3k2 [384, 256, 1, True] \n"," 23 [16, 19, 22] 1 431062 ultralytics.nn.modules.head.Detect [2, 16, None, [64, 128, 256]] \n","YOLO11n summary: 182 layers, 2,590,230 parameters, 2,590,214 gradients, 6.4 GFLOPs\n","\n","Transferred 448/499 items from pretrained weights\n","Freezing layer 'model.23.dfl.conv.weight'\n","\u001b[34m\u001b[1mAMP: \u001b[0mrunning Automatic Mixed Precision (AMP) checks...\n","\u001b[KDownloading https://github.com/ultralytics/assets/releases/download/v8.4.0/yolo26n.pt to 'yolo26n.pt': 100% ━━━━━━━━━━━━ 5.3MB 300.3MB/s 0.0s\n","\u001b[34m\u001b[1mAMP: \u001b[0mchecks passed ✅\n","WARNING ⚠️ imgsz=[900] must be multiple of max stride 32, updating to [928]\n","\u001b[34m\u001b[1mtrain: \u001b[0mFast image access ✅ (ping: 0.0±0.0 ms, read: 1882.0±1096.8 MB/s, size: 88.4 KB)\n","\u001b[K\u001b[34m\u001b[1mtrain: \u001b[0mScanning /content/Dataset-8/train/labels... 1722 images, 0 backgrounds, 0 corrupt: 100% ━━━━━━━━━━━━ 1722/1722 1.5Kit/s 1.1s\n","\u001b[34m\u001b[1mtrain: \u001b[0mNew cache created: /content/Dataset-8/train/labels.cache\n","\u001b[34m\u001b[1malbumentations: \u001b[0mBlur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01, method='weighted_average', num_output_channels=3), CLAHE(p=0.01, clip_limit=(1.0, 4.0), tile_grid_size=(8, 8))\n","\u001b[34m\u001b[1mval: \u001b[0mFast image access ✅ (ping: 0.0±0.0 ms, read: 1296.0±1050.3 MB/s, size: 110.9 KB)\n","\u001b[K\u001b[34m\u001b[1mval: \u001b[0mScanning /content/Dataset-8/valid/labels... 178 images, 0 backgrounds, 0 corrupt: 100% ━━━━━━━━━━━━ 178/178 1.4Kit/s 0.1s\n","\u001b[34m\u001b[1mval: \u001b[0mNew cache created: /content/Dataset-8/valid/labels.cache\n","\u001b[34m\u001b[1moptimizer:\u001b[0m AdamW(lr=0.001, momentum=0.937) with parameter groups 81 weight(decay=0.0), 88 weight(decay=0.0005), 87 bias(decay=0.0)\n","Plotting labels to /content/runs/detect/runs/all_trainings/yolo11n_dataset/labels.jpg... \n","Image sizes 928 train, 928 val\n","Using 8 dataloader workers\n","Logging results to \u001b[1m/content/runs/detect/runs/all_trainings/yolo11n_dataset\u001b[0m\n","Starting training for 100 epochs...\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 1/100 2.46G 1.674 1.635 1.166 5 928: 100% ━━━━━━━━━━━━ 216/216 4.6it/s 47.4s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 1.6it/s 7.7s\n"," all 178 451 0.678 0.517 0.626 0.323\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 2/100 2.8G 1.43 0.9942 1.076 1 928: 100% ━━━━━━━━━━━━ 216/216 8.9it/s 24.2s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 11.0it/s 1.1s\n"," all 178 451 0.827 0.664 0.775 0.389\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 3/100 2.8G 1.383 0.8952 1.054 10 928: 100% ━━━━━━━━━━━━ 216/216 9.2it/s 23.5s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.6it/s 1.1s\n"," all 178 451 0.676 0.739 0.726 0.325\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 4/100 2.8G 1.301 0.8213 1.027 7 928: 100% ━━━━━━━━━━━━ 216/216 9.1it/s 23.9s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.2it/s 1.2s\n"," all 178 451 0.824 0.634 0.78 0.43\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 5/100 2.8G 1.277 0.7758 1.018 7 928: 100% ━━━━━━━━━━━━ 216/216 9.1it/s 23.8s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.8it/s 1.1s\n"," all 178 451 0.622 0.637 0.714 0.397\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 6/100 2.8G 1.271 0.7566 1.018 3 928: 100% ━━━━━━━━━━━━ 216/216 9.0it/s 23.9s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.5it/s 1.1s\n"," all 178 451 0.564 0.768 0.751 0.397\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 7/100 2.8G 1.236 0.7444 0.9973 5 928: 100% ━━━━━━━━━━━━ 216/216 9.1it/s 23.8s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.6it/s 1.1s\n"," all 178 451 0.697 0.773 0.75 0.366\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 8/100 2.8G 1.222 0.716 0.9959 2 928: 100% ━━━━━━━━━━━━ 216/216 9.1it/s 23.6s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.6it/s 1.1s\n"," all 178 451 0.87 0.778 0.867 0.47\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 9/100 2.8G 1.171 0.6852 0.976 7 928: 100% ━━━━━━━━━━━━ 216/216 9.1it/s 23.7s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.4it/s 1.2s\n"," all 178 451 0.859 0.735 0.842 0.46\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 10/100 2.8G 1.208 0.6852 0.9857 10 928: 100% ━━━━━━━━━━━━ 216/216 9.1it/s 23.7s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.6it/s 1.1s\n"," all 178 451 0.724 0.745 0.712 0.385\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 11/100 2.8G 1.184 0.6712 0.9765 11 928: 100% ━━━━━━━━━━━━ 216/216 9.0it/s 24.0s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.9it/s 1.1s\n"," all 178 451 0.874 0.854 0.895 0.51\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 12/100 2.8G 1.166 0.6526 0.9742 9 928: 100% ━━━━━━━━━━━━ 216/216 9.2it/s 23.6s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.8it/s 1.1s\n"," all 178 451 0.798 0.845 0.867 0.438\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 13/100 2.8G 1.165 0.6413 0.9756 5 928: 100% ━━━━━━━━━━━━ 216/216 9.0it/s 23.9s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 11.0it/s 1.1s\n"," all 178 451 0.746 0.707 0.81 0.422\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 14/100 2.8G 1.146 0.6461 0.9606 9 928: 100% ━━━━━━━━━━━━ 216/216 9.0it/s 23.9s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.9it/s 1.1s\n"," all 178 451 0.769 0.697 0.752 0.386\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 15/100 2.8G 1.142 0.6307 0.9625 13 928: 100% ━━━━━━━━━━━━ 216/216 9.0it/s 24.1s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.6it/s 1.1s\n"," all 178 451 0.696 0.795 0.743 0.412\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 16/100 2.8G 1.113 0.6148 0.9508 7 928: 100% ━━━━━━━━━━━━ 216/216 9.0it/s 23.9s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.8it/s 1.1s\n"," all 178 451 0.805 0.857 0.86 0.484\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 17/100 2.8G 1.106 0.6083 0.9608 2 928: 100% ━━━━━━━━━━━━ 216/216 9.0it/s 24.1s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.5it/s 1.1s\n"," all 178 451 0.664 0.781 0.758 0.407\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 18/100 2.8G 1.094 0.591 0.9457 14 928: 100% ━━━━━━━━━━━━ 216/216 9.1it/s 23.8s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.9it/s 1.1s\n"," all 178 451 0.74 0.75 0.756 0.423\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 19/100 2.8G 1.12 0.6096 0.9561 2 928: 100% ━━━━━━━━━━━━ 216/216 9.1it/s 23.6s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.5it/s 1.1s\n"," all 178 451 0.7 0.885 0.796 0.413\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 20/100 2.8G 1.102 0.6058 0.9554 5 928: 100% ━━━━━━━━━━━━ 216/216 9.1it/s 23.8s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.6it/s 1.1s\n"," all 178 451 0.84 0.733 0.831 0.46\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 21/100 2.8G 1.073 0.5847 0.948 5 928: 100% ━━━━━━━━━━━━ 216/216 9.0it/s 23.9s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.3it/s 1.2s\n"," all 178 451 0.814 0.84 0.819 0.417\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 22/100 2.8G 1.065 0.5784 0.9386 6 928: 100% ━━━━━━━━━━━━ 216/216 8.9it/s 24.2s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.3it/s 1.2s\n"," all 178 451 0.872 0.776 0.871 0.473\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 23/100 2.8G 1.073 0.5806 0.9429 11 928: 100% ━━━━━━━━━━━━ 216/216 9.0it/s 24.0s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 11.0it/s 1.1s\n"," all 178 451 0.886 0.757 0.856 0.469\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 24/100 2.8G 1.046 0.5649 0.928 12 928: 100% ━━━━━━━━━━━━ 216/216 9.1it/s 23.6s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.2it/s 1.2s\n"," all 178 451 0.855 0.734 0.819 0.448\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 25/100 2.8G 1.056 0.5633 0.9427 3 928: 100% ━━━━━━━━━━━━ 216/216 9.0it/s 24.0s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.6it/s 1.1s\n"," all 178 451 0.804 0.773 0.788 0.446\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 26/100 2.8G 1.063 0.5632 0.9317 15 928: 100% ━━━━━━━━━━━━ 216/216 9.3it/s 23.3s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.5it/s 1.1s\n"," all 178 451 0.711 0.754 0.803 0.435\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 27/100 2.8G 1.042 0.5563 0.9263 4 928: 100% ━━━━━━━━━━━━ 216/216 9.1it/s 23.8s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.2it/s 1.2s\n"," all 178 451 0.884 0.804 0.891 0.495\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 28/100 2.8G 1.04 0.5507 0.9295 12 928: 100% ━━━━━━━━━━━━ 216/216 9.0it/s 24.0s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.9it/s 1.1s\n"," all 178 451 0.781 0.81 0.787 0.45\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 29/100 2.8G 1.038 0.5462 0.9354 3 928: 100% ━━━━━━━━━━━━ 216/216 9.1it/s 23.8s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.4it/s 1.2s\n"," all 178 451 0.771 0.836 0.83 0.475\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 30/100 2.8G 1.027 0.5456 0.9291 4 928: 100% ━━━━━━━━━━━━ 216/216 8.9it/s 24.3s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.2it/s 1.2s\n"," all 178 451 0.811 0.85 0.853 0.49\n","\n"," Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n","\u001b[K 31/100 2.8G 1.029 0.5375 0.9255 10 928: 100% ━━━━━━━━━━━━ 216/216 9.0it/s 24.1s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 10.7it/s 1.1s\n"," all 178 451 0.911 0.749 0.858 0.477\n","\u001b[34m\u001b[1mEarlyStopping: \u001b[0mTraining stopped early as no improvement observed in last 20 epochs. Best results observed at epoch 11, best model saved as best.pt.\n","To update EarlyStopping(patience=20) pass a new patience value, i.e. `patience=300` or use `patience=0` to disable EarlyStopping.\n","\n","31 epochs completed in 0.226 hours.\n","Optimizer stripped from /content/runs/detect/runs/all_trainings/yolo11n_dataset/weights/last.pt, 5.5MB\n","Optimizer stripped from /content/runs/detect/runs/all_trainings/yolo11n_dataset/weights/best.pt, 5.5MB\n","\n","Validating /content/runs/detect/runs/all_trainings/yolo11n_dataset/weights/best.pt...\n","Ultralytics 8.4.33 🚀 Python-3.12.13 torch-2.10.0+cu128 CUDA:0 (NVIDIA L4, 22563MiB)\n","YOLO11n summary (fused): 101 layers, 2,582,542 parameters, 0 gradients, 6.3 GFLOPs\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 5.2it/s 2.3s\n"," all 178 451 0.874 0.853 0.895 0.511\n"," basketball 177 177 0.822 0.712 0.8 0.434\n"," basketball_hoop 178 274 0.925 0.995 0.99 0.588\n","Speed: 0.4ms preprocess, 2.3ms inference, 0.0ms loss, 7.1ms postprocess per image\n","Results saved to \u001b[1m/content/runs/detect/runs/all_trainings/yolo11n_dataset\u001b[0m\n","Training completed for yolo11n on dataset in 13.95 minutes.\n","Validating model...\n","WARNING ⚠️ imgsz=[900] must be multiple of max stride 32, updating to [928]\n","Ultralytics 8.4.33 🚀 Python-3.12.13 torch-2.10.0+cu128 CUDA:0 (NVIDIA L4, 22563MiB)\n","YOLO11n summary (fused): 101 layers, 2,582,542 parameters, 0 gradients, 6.3 GFLOPs\n","\u001b[34m\u001b[1mval: \u001b[0mFast image access ✅ (ping: 0.0±0.0 ms, read: 2309.1±1051.0 MB/s, size: 90.0 KB)\n","\u001b[K\u001b[34m\u001b[1mval: \u001b[0mScanning /content/Dataset-8/valid/labels.cache... 178 images, 0 backgrounds, 0 corrupt: 100% ━━━━━━━━━━━━ 178/178 74.7Mit/s 0.0s\n","\u001b[K Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 12/12 3.3it/s 3.6s\n"," all 178 451 0.873 0.849 0.897 0.508\n"," basketball 177 177 0.822 0.705 0.804 0.428\n"," basketball_hoop 178 274 0.923 0.993 0.99 0.589\n","Speed: 2.8ms preprocess, 5.9ms inference, 0.0ms loss, 3.0ms postprocess per image\n","Results saved to \u001b[1m/content/runs/detect/val\u001b[0m\n","Validation complete. mAP50: 0.8970\n","Exporting model to CoreML...\n","Ultralytics 8.4.33 🚀 Python-3.12.13 torch-2.10.0+cu128 CPU (Intel Xeon CPU @ 2.20GHz)\n","WARNING ⚠️ imgsz=[900] must be multiple of max stride 32, updating to [928]\n","💡 ProTip: Export to OpenVINO format for best performance on Intel hardware. Learn more at https://docs.ultralytics.com/integrations/openvino/\n","\n","\u001b[34m\u001b[1mPyTorch:\u001b[0m starting from '/content/runs/detect/runs/all_trainings/yolo11n_dataset/weights/best.pt' with input shape (1, 3, 928, 928) BCHW and output shape(s) (1, 6, 17661) (5.3 MB)\n","\u001b[31m\u001b[1mrequirements:\u001b[0m Ultralytics requirement ['coremltools>=9.0'] not found, attempting AutoUpdate...\n","Using Python 3.12.13 environment at: /usr\n","Resolved 12 packages in 212ms\n","Prepared 3 packages in 97ms\n","Installed 3 packages in 18ms\n"," + cattrs==26.1.0\n"," + coremltools==9.0\n"," + pyaml==26.2.1\n","\n","\u001b[31m\u001b[1mrequirements:\u001b[0m AutoUpdate success ✅ 0.7s\n","WARNING ⚠️ \u001b[31m\u001b[1mrequirements:\u001b[0m \u001b[1mRestart runtime or rerun command for updates to take effect\u001b[0m\n","\n"]},{"output_type":"stream","name":"stderr","text":["invalid escape sequence '\\_'\n"]},{"output_type":"stream","name":"stdout","text":["\n","\u001b[34m\u001b[1mCoreML:\u001b[0m starting export with coremltools 9.0...\n"]},{"output_type":"stream","name":"stderr","text":["Converting PyTorch Frontend ==> MIL Ops: 100%|█████████▉| 713/715 [00:00<00:00, 2980.19 ops/s]\n","Running MIL frontend_pytorch pipeline: 100%|██████████| 5/5 [00:00<00:00, 85.92 passes/s]\n","Running MIL default pipeline: 11%|█ | 10/95 [00:00<00:00, 93.78 passes/s]Output, '1148', of the source model, has been renamed to 'var_1148' in the Core ML model.\n","Output, '1150', of the source model, has been renamed to 'var_1150' in the Core ML model.\n","Running MIL default pipeline: 100%|██████████| 95/95 [00:01<00:00, 48.55 passes/s]\n","Running MIL backend_mlprogram pipeline: 100%|██████████| 12/12 [00:00<00:00, 86.07 passes/s]\n"]},{"output_type":"stream","name":"stdout","text":["\u001b[34m\u001b[1mCoreML:\u001b[0m starting pipeline with coremltools 9.0...\n","\u001b[34m\u001b[1mCoreML:\u001b[0m pipeline success\n","\u001b[34m\u001b[1mCoreML:\u001b[0m export success ✅ 17.1s, saved as '/content/runs/detect/runs/all_trainings/yolo11n_dataset/weights/best.mlpackage' (5.2 MB)\n","\n","Export complete (17.4s)\n","Results saved to \u001b[1m/content/runs/detect/runs/all_trainings/yolo11n_dataset/weights\u001b[0m\n","Predict: yolo predict task=detect model=/content/runs/detect/runs/all_trainings/yolo11n_dataset/weights/best.mlpackage imgsz=928 \n","Validate: yolo val task=detect model=/content/runs/detect/runs/all_trainings/yolo11n_dataset/weights/best.mlpackage imgsz=928 data=/content/Dataset-8/data_corrected.yaml \n","Visualize: https://netron.app\n","CoreML model exported to: /content/runs/detect/runs/all_trainings/yolo11n_dataset/weights/best.mlpackage\n","Exporting model to TFLite...\n","Ultralytics 8.4.33 🚀 Python-3.12.13 torch-2.10.0+cu128 CPU (Intel Xeon CPU @ 2.20GHz)\n","WARNING ⚠️ imgsz=[900] must be multiple of max stride 32, updating to [928]\n","\n","\u001b[34m\u001b[1mPyTorch:\u001b[0m starting from '/content/runs/detect/runs/all_trainings/yolo11n_dataset/weights/best.pt' with input shape (1, 3, 928, 928) BCHW and output shape(s) (1, 300, 6) (5.3 MB)\n","\u001b[31m\u001b[1mrequirements:\u001b[0m Ultralytics requirements ['sng4onnx>=1.0.1', 'onnx_graphsurgeon>=0.3.26', 'ai-edge-litert>=1.2.0', 'onnx>=1.12.0,<2.0.0', 'onnx2tf>=1.26.3,<1.29.0', 'onnxslim>=0.1.71', 'onnxruntime-gpu'] not found, attempting AutoUpdate...\n","Using Python 3.12.13 environment at: /usr\n","Resolved 18 packages in 7.65s\n","Prepared 9 packages in 3.45s\n","Installed 9 packages in 305ms\n"," + ai-edge-litert==2.1.3\n"," + backports-strenum==1.3.1\n"," + colorama==0.4.6\n"," + onnx==1.21.0\n"," + onnx-graphsurgeon==0.5.8\n"," + onnx2tf==1.28.8\n"," + onnxruntime-gpu==1.24.4\n"," + onnxslim==0.1.90\n"," + sng4onnx==2.0.1\n","\n","\u001b[31m\u001b[1mrequirements:\u001b[0m AutoUpdate success ✅ 11.7s\n","WARNING ⚠️ \u001b[31m\u001b[1mrequirements:\u001b[0m \u001b[1mRestart runtime or rerun command for updates to take effect\u001b[0m\n","\n","\n","\u001b[34m\u001b[1mTensorFlow SavedModel:\u001b[0m starting export with tensorflow 2.19.0...\n","\n","\u001b[34m\u001b[1mONNX:\u001b[0m starting export with onnx 1.21.0 opset 20...\n","\u001b[34m\u001b[1mONNX:\u001b[0m slimming with onnxslim 0.1.90...\n","\u001b[34m\u001b[1mONNX:\u001b[0m export success ✅ 2.3s, saved as '/content/runs/detect/runs/all_trainings/yolo11n_dataset/weights/best.onnx' (10.5 MB)\n","\u001b[KDownloading https://github.com/ultralytics/assets/releases/download/v8.4.0/calibration_image_sample_data_20x128x128x3_float32.npy.zip to 'calibration_image_sample_data_20x128x128x3_float32.npy.zip': 100% ━━━━━━━━━━━━ 1.1MB 173.9MB/s 0.0s\n","\u001b[KUnzipping calibration_image_sample_data_20x128x128x3_float32.npy.zip to /content/calibration_image_sample_data_20x128x128x3_float32.npy...: 100% ━━━━━━━━━━━━ 1/1 49.3files/s 0.0s\n","\u001b[34m\u001b[1mTensorFlow SavedModel:\u001b[0m starting TFLite export with onnx2tf 1.28.8...\n","Saved artifact at '/content/runs/detect/runs/all_trainings/yolo11n_dataset/weights/best_saved_model'. The following endpoints are available:\n","\n","* Endpoint 'serving_default'\n"," inputs_0 (POSITIONAL_ONLY): TensorSpec(shape=(1, 928, 928, 3), dtype=tf.float32, name='images')\n","Output Type:\n"," TensorSpec(shape=(1, 300, 6), dtype=tf.float32, name=None)\n","Captures:\n"," 134705302288336: TensorSpec(shape=(4, 2), dtype=tf.int32, name=None)\n"," 134705302286992: TensorSpec(shape=(3, 3, 3, 16), dtype=tf.float32, name=None)\n"," 134705302286416: TensorSpec(shape=(16,), dtype=tf.float32, name=None)\n"," 134705416030736: TensorSpec(shape=(4, 2), dtype=tf.int32, name=None)\n"," 134705302288144: TensorSpec(shape=(3, 3, 16, 32), dtype=tf.float32, name=None)\n"," 134705416029776: TensorSpec(shape=(32,), dtype=tf.float32, name=None)\n"," 134705416030928: TensorSpec(shape=(1, 1, 32, 32), dtype=tf.float32, name=None)\n"," 134705416031120: TensorSpec(shape=(32,), dtype=tf.float32, name=None)\n"," 134705416032656: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705416031888: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705302281808: TensorSpec(shape=(3, 3, 16, 8), dtype=tf.float32, name=None)\n"," 134705302288528: TensorSpec(shape=(8,), dtype=tf.float32, name=None)\n"," 134705302281616: TensorSpec(shape=(3, 3, 8, 16), dtype=tf.float32, name=None)\n"," 134705416033808: TensorSpec(shape=(16,), dtype=tf.float32, name=None)\n"," 134705416030160: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705416032464: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705416035152: TensorSpec(shape=(1, 1, 48, 64), dtype=tf.float32, name=None)\n"," 134705416034192: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705416031504: TensorSpec(shape=(4, 2), dtype=tf.int32, name=None)\n"," 134705416034576: TensorSpec(shape=(3, 3, 64, 64), dtype=tf.float32, name=None)\n"," 134705416033232: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705416035536: TensorSpec(shape=(1, 1, 64, 64), dtype=tf.float32, name=None)\n"," 134705416034768: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705416036304: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705416034960: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705416036688: TensorSpec(shape=(3, 3, 32, 16), dtype=tf.float32, name=None)\n"," 134705416037648: TensorSpec(shape=(16,), dtype=tf.float32, name=None)\n"," 134705416035728: TensorSpec(shape=(3, 3, 16, 32), dtype=tf.float32, name=None)\n"," 134705416034384: TensorSpec(shape=(32,), dtype=tf.float32, name=None)\n"," 134705416035920: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705416036112: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705416037840: TensorSpec(shape=(1, 1, 96, 128), dtype=tf.float32, name=None)\n"," 134705416035344: TensorSpec(shape=(128,), dtype=tf.float32, name=None)\n"," 134705416038224: TensorSpec(shape=(4, 2), dtype=tf.int32, name=None)\n"," 134705416036880: TensorSpec(shape=(3, 3, 128, 128), dtype=tf.float32, name=None)\n"," 134705416038032: TensorSpec(shape=(128,), dtype=tf.float32, name=None)\n"," 134705416038416: TensorSpec(shape=(1, 1, 128, 128), dtype=tf.float32, name=None)\n"," 134705416038608: TensorSpec(shape=(128,), dtype=tf.float32, name=None)\n"," 134705416039184: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705416038992: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705416041104: TensorSpec(shape=(1, 1, 64, 32), dtype=tf.float32, name=None)\n"," 134705416041296: TensorSpec(shape=(32,), dtype=tf.float32, name=None)\n"," 134705416040528: TensorSpec(shape=(3, 3, 32, 32), dtype=tf.float32, name=None)\n"," 134705416041488: TensorSpec(shape=(32,), dtype=tf.float32, name=None)\n"," 134705416041680: TensorSpec(shape=(3, 3, 32, 32), dtype=tf.float32, name=None)\n"," 134705416041872: TensorSpec(shape=(32,), dtype=tf.float32, name=None)\n"," 134705416040720: TensorSpec(shape=(3, 3, 32, 32), dtype=tf.float32, name=None)\n"," 134705416042256: TensorSpec(shape=(32,), dtype=tf.float32, name=None)\n"," 134705416040144: TensorSpec(shape=(3, 3, 32, 32), dtype=tf.float32, name=None)\n"," 134705416037072: TensorSpec(shape=(1, 1, 64, 32), dtype=tf.float32, name=None)\n"," 134705416042448: TensorSpec(shape=(32,), dtype=tf.float32, name=None)\n"," 134705416038800: TensorSpec(shape=(32,), dtype=tf.float32, name=None)\n"," 134705416043024: TensorSpec(shape=(1, 1, 64, 64), dtype=tf.float32, name=None)\n"," 134705416042064: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705416039376: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705416039568: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705416043216: TensorSpec(shape=(1, 1, 192, 128), dtype=tf.float32, name=None)\n"," 134705416043408: TensorSpec(shape=(128,), dtype=tf.float32, name=None)\n"," 134705416043600: TensorSpec(shape=(4, 2), dtype=tf.int32, name=None)\n"," 134705416042640: TensorSpec(shape=(3, 3, 128, 256), dtype=tf.float32, name=None)\n"," 134705416042832: TensorSpec(shape=(256,), dtype=tf.float32, name=None)\n"," 134705416043984: TensorSpec(shape=(1, 1, 256, 256), dtype=tf.float32, name=None)\n"," 134705416044176: TensorSpec(shape=(256,), dtype=tf.float32, name=None)\n"," 134705413816592: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705413816400: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705416044368: TensorSpec(shape=(1, 1, 128, 64), dtype=tf.float32, name=None)\n"," 134705416043792: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705413817552: TensorSpec(shape=(3, 3, 64, 64), dtype=tf.float32, name=None)\n"," 134705413818896: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705413819088: TensorSpec(shape=(3, 3, 64, 64), dtype=tf.float32, name=None)\n"," 134705413819280: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705413818128: TensorSpec(shape=(3, 3, 64, 64), dtype=tf.float32, name=None)\n"," 134705413819664: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705413818704: TensorSpec(shape=(3, 3, 64, 64), dtype=tf.float32, name=None)\n"," 134705413817936: TensorSpec(shape=(1, 1, 128, 64), dtype=tf.float32, name=None)\n"," 134705413819856: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705413818512: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705413820432: TensorSpec(shape=(1, 1, 128, 128), dtype=tf.float32, name=None)\n"," 134705413819472: TensorSpec(shape=(128,), dtype=tf.float32, name=None)\n"," 134705413816784: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705413816976: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705413820624: TensorSpec(shape=(1, 1, 384, 256), dtype=tf.float32, name=None)\n"," 134705413820816: TensorSpec(shape=(256,), dtype=tf.float32, name=None)\n"," 134705413820048: TensorSpec(shape=(1, 1, 256, 128), dtype=tf.float32, name=None)\n"," 134705413821008: TensorSpec(shape=(128,), dtype=tf.float32, name=None)\n"," 134705413821392: TensorSpec(shape=(1, 1, 512, 256), dtype=tf.float32, name=None)\n"," 134705413821584: TensorSpec(shape=(256,), dtype=tf.float32, name=None)\n"," 134705413820240: TensorSpec(shape=(1, 1, 256, 256), dtype=tf.float32, name=None)\n"," 134705413822160: TensorSpec(shape=(256,), dtype=tf.float32, name=None)\n"," 134705413821968: TensorSpec(shape=(1, 1, 128, 256), dtype=tf.float32, name=None)\n"," 134705413822544: TensorSpec(shape=(256,), dtype=tf.float32, name=None)\n"," 134705413821776: TensorSpec(shape=(), dtype=tf.resource, name=None)\n"," 134705413825040: TensorSpec(shape=(128,), dtype=tf.float32, name=None)\n"," 134705413827920: TensorSpec(shape=(1, 1, 128, 128), dtype=tf.float32, name=None)\n"," 134705413825616: TensorSpec(shape=(128,), dtype=tf.float32, name=None)\n"," 134705413827536: TensorSpec(shape=(1, 1, 128, 256), dtype=tf.float32, name=None)\n"," 134705413827344: TensorSpec(shape=(256,), dtype=tf.float32, name=None)\n"," 134705413826768: TensorSpec(shape=(1, 1, 256, 128), dtype=tf.float32, name=None)\n"," 134705413824464: TensorSpec(shape=(128,), dtype=tf.float32, name=None)\n"," 134705413824848: TensorSpec(shape=(1, 1, 256, 256), dtype=tf.float32, name=None)\n"," 134705413826960: TensorSpec(shape=(256,), dtype=tf.float32, name=None)\n"," 134705413826576: TensorSpec(shape=(1, 1, 384, 128), dtype=tf.float32, name=None)\n"," 134705413828496: TensorSpec(shape=(128,), dtype=tf.float32, name=None)\n"," 134705413828112: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705413828304: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705413829648: TensorSpec(shape=(3, 3, 64, 32), dtype=tf.float32, name=None)\n"," 134705413829840: TensorSpec(shape=(32,), dtype=tf.float32, name=None)\n"," 134705413827152: TensorSpec(shape=(3, 3, 32, 64), dtype=tf.float32, name=None)\n"," 134705413822736: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705413828688: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705413826384: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705413830416: TensorSpec(shape=(1, 1, 192, 128), dtype=tf.float32, name=None)\n"," 134705413829072: TensorSpec(shape=(128,), dtype=tf.float32, name=None)\n"," 134705413829264: TensorSpec(shape=(1, 1, 256, 64), dtype=tf.float32, name=None)\n"," 134705413829456: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705413831184: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705413830992: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705413831760: TensorSpec(shape=(3, 3, 32, 16), dtype=tf.float32, name=None)\n"," 134705413830800: TensorSpec(shape=(16,), dtype=tf.float32, name=None)\n"," 134705413832144: TensorSpec(shape=(3, 3, 16, 32), dtype=tf.float32, name=None)\n"," 134705413832528: TensorSpec(shape=(32,), dtype=tf.float32, name=None)\n"," 134705413831376: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705413831568: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705413831952: TensorSpec(shape=(1, 1, 96, 64), dtype=tf.float32, name=None)\n"," 134705413830608: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705393861456: TensorSpec(shape=(4, 2), dtype=tf.int32, name=None)\n"," 134705393861264: TensorSpec(shape=(3, 3, 64, 64), dtype=tf.float32, name=None)\n"," 134705393861648: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705393863760: TensorSpec(shape=(1, 1, 192, 128), dtype=tf.float32, name=None)\n"," 134705393863184: TensorSpec(shape=(128,), dtype=tf.float32, name=None)\n"," 134705393864720: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705393864912: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705393868176: TensorSpec(shape=(3, 3, 64, 32), dtype=tf.float32, name=None)\n"," 134705393866064: TensorSpec(shape=(32,), dtype=tf.float32, name=None)\n"," 134705393865104: TensorSpec(shape=(3, 3, 32, 64), dtype=tf.float32, name=None)\n"," 134705393867600: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705393865296: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705393865488: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705393867984: TensorSpec(shape=(1, 1, 192, 128), dtype=tf.float32, name=None)\n"," 134705393867024: TensorSpec(shape=(128,), dtype=tf.float32, name=None)\n"," 134705393868560: TensorSpec(shape=(4, 2), dtype=tf.int32, name=None)\n"," 134705393867408: TensorSpec(shape=(3, 3, 128, 128), dtype=tf.float32, name=None)\n"," 134705393868752: TensorSpec(shape=(128,), dtype=tf.float32, name=None)\n"," 134705393870480: TensorSpec(shape=(1, 1, 384, 256), dtype=tf.float32, name=None)\n"," 134705393868944: TensorSpec(shape=(256,), dtype=tf.float32, name=None)\n"," 134705393871440: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705393871632: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705393874512: TensorSpec(shape=(1, 1, 128, 64), dtype=tf.float32, name=None)\n"," 134705393872784: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705393874320: TensorSpec(shape=(3, 3, 64, 64), dtype=tf.float32, name=None)\n"," 134705393873360: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705393875472: TensorSpec(shape=(3, 3, 64, 64), dtype=tf.float32, name=None)\n"," 134705393876624: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705393874896: TensorSpec(shape=(3, 3, 64, 64), dtype=tf.float32, name=None)\n"," 134705393875280: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705393874704: TensorSpec(shape=(3, 3, 64, 64), dtype=tf.float32, name=None)\n"," 134705393873168: TensorSpec(shape=(1, 1, 128, 64), dtype=tf.float32, name=None)\n"," 134705393876240: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705393871824: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705393875856: TensorSpec(shape=(1, 1, 128, 128), dtype=tf.float32, name=None)\n"," 134705393875664: TensorSpec(shape=(128,), dtype=tf.float32, name=None)\n"," 134705393872016: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705393872208: TensorSpec(shape=(4,), dtype=tf.int64, name=None)\n"," 134705393876816: TensorSpec(shape=(1, 1, 384, 256), dtype=tf.float32, name=None)\n"," 134705393876048: TensorSpec(shape=(256,), dtype=tf.float32, name=None)\n"," 134705393876432: TensorSpec(shape=(3, 3, 256, 64), dtype=tf.float32, name=None)\n"," 134705393866640: TensorSpec(shape=(3, 3, 128, 64), dtype=tf.float32, name=None)\n"," 134705393862224: TensorSpec(shape=(3, 3, 64, 64), dtype=tf.float32, name=None)\n"," 134705393874128: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705393869712: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705393862032: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705392435472: TensorSpec(shape=(3, 3, 256, 1), dtype=tf.float32, name=None)\n"," 134705393869520: TensorSpec(shape=(3, 3, 128, 1), dtype=tf.float32, name=None)\n"," 134705393862416: TensorSpec(shape=(3, 3, 64, 1), dtype=tf.float32, name=None)\n"," 134705392435664: TensorSpec(shape=(256,), dtype=tf.float32, name=None)\n"," 134705393869136: TensorSpec(shape=(128,), dtype=tf.float32, name=None)\n"," 134705393862608: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705392435856: TensorSpec(shape=(3, 3, 64, 64), dtype=tf.float32, name=None)\n"," 134705393869904: TensorSpec(shape=(3, 3, 64, 64), dtype=tf.float32, name=None)\n"," 134705393862992: TensorSpec(shape=(3, 3, 64, 64), dtype=tf.float32, name=None)\n"," 134705392436240: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705393869328: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705393862800: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705392436432: TensorSpec(shape=(1, 1, 256, 64), dtype=tf.float32, name=None)\n"," 134705393870096: TensorSpec(shape=(1, 1, 128, 64), dtype=tf.float32, name=None)\n"," 134705393863376: TensorSpec(shape=(1, 1, 64, 64), dtype=tf.float32, name=None)\n"," 134705392435280: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705393868368: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705393861840: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705392436624: TensorSpec(shape=(1, 1, 64, 64), dtype=tf.float32, name=None)\n"," 134705393870864: TensorSpec(shape=(1, 1, 64, 64), dtype=tf.float32, name=None)\n"," 134705393864144: TensorSpec(shape=(1, 1, 64, 64), dtype=tf.float32, name=None)\n"," 134705392437008: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705393870288: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705393863568: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705392436048: TensorSpec(shape=(3, 3, 64, 1), dtype=tf.float32, name=None)\n"," 134705393871056: TensorSpec(shape=(3, 3, 64, 1), dtype=tf.float32, name=None)\n"," 134705393864336: TensorSpec(shape=(3, 3, 64, 1), dtype=tf.float32, name=None)\n"," 134705392437200: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705393871248: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705393864528: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705392437584: TensorSpec(shape=(1, 1, 64, 64), dtype=tf.float32, name=None)\n"," 134705393873744: TensorSpec(shape=(1, 1, 64, 64), dtype=tf.float32, name=None)\n"," 134705393867216: TensorSpec(shape=(1, 1, 64, 64), dtype=tf.float32, name=None)\n"," 134705392438160: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705393870672: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705393863952: TensorSpec(shape=(64,), dtype=tf.float32, name=None)\n"," 134705392437968: TensorSpec(shape=(1, 1, 64, 2), dtype=tf.float32, name=None)\n"," 134705393873936: TensorSpec(shape=(1, 1, 64, 2), dtype=tf.float32, name=None)\n"," 134705393866448: TensorSpec(shape=(1, 1, 64, 2), dtype=tf.float32, name=None)\n"," 134705392438928: TensorSpec(shape=(1, 1, 16, 1), dtype=tf.float32, name=None)\n"," 134705392439696: TensorSpec(shape=(2,), dtype=tf.float32, name=None)\n"," 134705393875088: TensorSpec(shape=(2,), dtype=tf.float32, name=None)\n"," 134705393867792: TensorSpec(shape=(2,), dtype=tf.float32, name=None)\n"," 134705392440656: TensorSpec(shape=(3,), dtype=tf.int64, name=None)\n"," 134705392437776: TensorSpec(shape=(3,), dtype=tf.int64, name=None)\n"," 134705392440464: TensorSpec(shape=(3,), dtype=tf.int64, name=None)\n"," 134705392436816: TensorSpec(shape=(3,), dtype=tf.int64, name=None)\n"," 134705392438544: TensorSpec(shape=(1, 2, 17661), dtype=tf.float32, name=None)\n"," 134705392440848: TensorSpec(shape=(1, 2, 17661), dtype=tf.float32, name=None)\n"," 134705392442576: TensorSpec(shape=(3,), dtype=tf.int64, name=None)\n"," 134705392443152: TensorSpec(shape=(3,), dtype=tf.int64, name=None)\n"," 134705392442000: TensorSpec(shape=(3,), dtype=tf.int64, name=None)\n"," 134705392438736: TensorSpec(shape=(3,), dtype=tf.int64, name=None)\n"," 134705302281232: TensorSpec(shape=(1500, 4), dtype=tf.int64, name=None)\n"," 134705302280656: TensorSpec(shape=(2,), dtype=tf.int64, name=None)\n"," 134705302278544: TensorSpec(shape=(2,), dtype=tf.int64, name=None)\n"," 134705510381328: TensorSpec(shape=(), dtype=tf.int32, name=None)\n"," 134705302289296: TensorSpec(shape=(), dtype=tf.int32, name=None)\n"," 134705389634000: TensorSpec(shape=(1,), dtype=tf.bool, name=None)\n"," 134705389634192: TensorSpec(shape=(1,), dtype=tf.int32, name=None)\n"," 134705510381136: TensorSpec(shape=(), dtype=tf.int32, name=None)\n"," 134705510382288: TensorSpec(shape=(), dtype=tf.int32, name=None)\n"," 134705302289680: TensorSpec(shape=(), dtype=tf.int32, name=None)\n"," 134705302278160: TensorSpec(shape=(), dtype=tf.float32, name=None)\n"," 134705302278352: TensorSpec(shape=(), dtype=tf.float32, name=None)\n"," 134705392442768: TensorSpec(shape=(3,), dtype=tf.int64, name=None)\n"," 134705392442960: TensorSpec(shape=(3,), dtype=tf.int64, name=None)\n"," 134707564626768: TensorSpec(shape=(2, 2), dtype=tf.int32, name=None)\n"," 134707564629072: TensorSpec(shape=(), dtype=tf.int64, name=None)\n"," 134707564627920: TensorSpec(shape=(), dtype=tf.int64, name=None)\n"," 134707564628112: TensorSpec(shape=(1,), dtype=tf.int64, name=None)\n"," 134707564630032: TensorSpec(shape=(1,), dtype=tf.int64, name=None)\n"," 134707564629264: TensorSpec(shape=(1,), dtype=tf.int64, name=None)\n"," 134707564626960: TensorSpec(shape=(), dtype=tf.int64, name=None)\n"," 134707564628688: TensorSpec(shape=(1,), dtype=tf.int64, name=None)\n"," 134707564628304: TensorSpec(shape=(1,), dtype=tf.int64, name=None)\n"," 134707564629648: TensorSpec(shape=(1,), dtype=tf.int64, name=None)\n"," 134707564632720: TensorSpec(shape=(1, 300, 6), dtype=tf.float32, name=None)\n"," 134707564632336: TensorSpec(shape=(1, 1), dtype=tf.int64, name=None)\n","\u001b[34m\u001b[1mTensorFlow SavedModel:\u001b[0m export success ✅ 45.4s, saved as '/content/runs/detect/runs/all_trainings/yolo11n_dataset/weights/best_saved_model' (27.6 MB)\n","\n","\u001b[34m\u001b[1mTensorFlow Lite:\u001b[0m starting export with tensorflow 2.19.0...\n","\u001b[34m\u001b[1mTensorFlow Lite:\u001b[0m export success ✅ 0.0s, saved as '/content/runs/detect/runs/all_trainings/yolo11n_dataset/weights/best_saved_model/best_float32.tflite' (11.0 MB)\n","\n","Export complete (45.7s)\n","Results saved to \u001b[1m/content/runs/detect/runs/all_trainings/yolo11n_dataset/weights\u001b[0m\n","Predict: yolo predict task=detect model=/content/runs/detect/runs/all_trainings/yolo11n_dataset/weights/best_saved_model/best_float32.tflite imgsz=928 \n","Validate: yolo val task=detect model=/content/runs/detect/runs/all_trainings/yolo11n_dataset/weights/best_saved_model/best_float32.tflite imgsz=928 data=/content/Dataset-8/data_corrected.yaml \n","Visualize: https://netron.app\n","TFLite model exported to: /content/runs/detect/runs/all_trainings/yolo11n_dataset/weights/best_saved_model/best_float32.tflite\n","Verifying TFLite model metadata...\n","\n"," Model Structure Analysis:\n"," - Input tensors: 1\n"," Input 0: shape=[ 1 928 928 3], dtype=<class 'numpy.float32'>, name=images\n"," - Output tensors: 1\n"," Output 0: shape=[ 1 300 6], dtype=<class 'numpy.float32'>, name=Identity\n"," ⚠ tflite_support library not available for metadata verification\n"," ℹ Install with: pip install tflite-support\n"," ℹ Model structure looks correct, but metadata compatibility cannot be verified\n"," ℹ Note: YOLO models exported with Ultralytics may not include metadata\n"," ℹ If ObjectDetector API fails, consider using Interpreter API directly\n","✓ TFLite model metadata verified/added successfully\n","Generating visual test results...\n","WARNING ⚠️ imgsz=[900] must be multiple of max stride 32, updating to [928]\n"," - image634_group16_png.rf.463701a8fb9f3b45d15884ee630ab20d.jpg: 10 detections\n","WARNING ⚠️ imgsz=[900] must be multiple of max stride 32, updating to [928]\n"," - image638_group16_png.rf.bba6ddc8bfcba34124b73de87aad2a9b.jpg: 4 detections\n","WARNING ⚠️ imgsz=[900] must be multiple of max stride 32, updating to [928]\n"," - image816_group23_png.rf.c349c708f3c1d573bdd7aff902c5096d.jpg: 2 detections\n","WARNING ⚠️ imgsz=[900] must be multiple of max stride 32, updating to [928]\n"," - image616_group16_png.rf.9593a47d78c7c980e22f0955aa5249cd.jpg: 12 detections\n","WARNING ⚠️ imgsz=[900] must be multiple of max stride 32, updating to [928]\n"," - image817_group23_png.rf.d96e3327f2d36e114b7e48e21b35532b.jpg: 3 detections\n","Sample predictions saved to: runs/all_trainings/yolo11n_dataset/visual_tests/sample_predictions.png\n","Finished processing yolo11n on dataset. Status: Success\n","\n","================================================================================\n","COMPLETED ALL MODEL TRAINING, VALIDATION, AND EXPORT LOOPS\n","================================================================================\n","\n"]}],"source":["from ultralytics.utils.callbacks.base import optimizer_step\n","import time\n","import pandas as pd\n","from pathlib import Path\n","from ultralytics import YOLO\n","import matplotlib.pyplot as plt\n","import random\n","import os\n","import shutil\n","\n","# Base directory for all training runs\n","TRAINING_RUNS_BASE_DIR = Path('runs/all_trainings')\n","TRAINING_RUNS_BASE_DIR.mkdir(parents=True, exist_ok=True)\n","\n","# List to store results from all training and export operations for comparison\n","all_results_for_comparison = []\n","\n","\"\"\"### TFLite Metadata Verification Function\n","\n","This function verifies if a TFLite model has metadata compatible with TensorFlow Lite Task Vision ObjectDetector API.\n","It checks the model structure, input/output tensors, and provides information about metadata presence.\n","\"\"\"\n","\n","def verify_and_add_tflite_metadata(tflite_path, class_names, input_size):\n"," \"\"\"\n"," Verify TFLite model metadata and provide compatibility information.\n","\n"," Args:\n"," tflite_path: Path to the TFLite model file\n"," class_names: List of class names for the model\n"," input_size: Input image size (e.g., 416)\n"," \"\"\"\n"," try:\n"," # Try to import TensorFlow Lite\n"," try:\n"," import tensorflow as tf\n"," except ImportError:\n"," print(\" ⚠ TensorFlow not available. Installing...\")\n"," os.system(\"pip install tensorflow\")\n"," import tensorflow as tf\n","\n"," # Load and inspect the TFLite model\n"," interpreter = tf.lite.Interpreter(model_path=str(tflite_path))\n"," interpreter.allocate_tensors()\n","\n"," # Get input and output details\n"," input_details = interpreter.get_input_details()\n"," output_details = interpreter.get_output_details()\n","\n"," print(f\"\\n Model Structure Analysis:\")\n"," print(f\" - Input tensors: {len(input_details)}\")\n"," for i, inp in enumerate(input_details):\n"," print(f\" Input {i}: shape={inp['shape']}, dtype={inp['dtype']}, name={inp.get('name', 'N/A')}\")\n","\n"," print(f\" - Output tensors: {len(output_details)}\")\n"," for i, out in enumerate(output_details):\n"," print(f\" Output {i}: shape={out['shape']}, dtype={out['dtype']}, name={out.get('name', 'N/A')}\")\n","\n"," # Check if metadata exists using tflite_support (if available)\n"," try:\n"," from tflite_support import metadata\n"," displayer = metadata.MetadataDisplayer.with_model_file(str(tflite_path))\n"," metadata_json = displayer.get_metadata_json()\n","\n"," if metadata_json:\n"," print(f\" ✓ Metadata found in model\")\n"," # Parse metadata to check for ObjectDetector compatibility\n"," import json\n"," meta = json.loads(metadata_json)\n"," if 'subgraph_metadata' in meta and len(meta['subgraph_metadata']) > 0:\n"," print(f\" ✓ Model has subgraph metadata\")\n"," # Check for input/output metadata\n"," subgraph = meta['subgraph_metadata'][0]\n"," if 'input_tensor_metadata' in subgraph:\n"," print(f\" ✓ Input tensor metadata present\")\n"," if 'output_tensor_metadata' in subgraph:\n"," print(f\" ✓ Output tensor metadata present\")\n"," return True\n"," else:\n"," print(f\" ⚠ No metadata found in model\")\n"," print(f\" ⚠ Model may not be compatible with TensorFlow Lite Task Vision ObjectDetector API\")\n"," print(f\" ℹ Consider using TensorFlow Lite Model Maker or adding metadata manually\")\n"," return False\n"," except ImportError:\n"," print(f\" ⚠ tflite_support library not available for metadata verification\")\n"," print(f\" ℹ Install with: pip install tflite-support\")\n"," print(f\" ℹ Model structure looks correct, but metadata compatibility cannot be verified\")\n"," print(f\" ℹ Note: YOLO models exported with Ultralytics may not include metadata\")\n"," print(f\" ℹ If ObjectDetector API fails, consider using Interpreter API directly\")\n"," return None\n"," except Exception as e:\n"," print(f\" ⚠ Could not read metadata: {e}\")\n"," print(f\" ℹ Model may work, but metadata verification failed\")\n"," print(f\" ℹ If ObjectDetector API fails, the model can still be used with Interpreter API\")\n"," return None\n","\n"," except Exception as e:\n"," print(f\" ✗ Error verifying model: {e}\")\n"," print(f\" ℹ Model file exists but could not be verified\")\n"," print(f\" ℹ Model dimensions: {input_size}x{input_size}, Classes: {len(class_names)}\")\n"," return False\n","\n","print(f\"\\n{'='*80}\")\n","print(\"STARTING MODEL TRAINING, VALIDATION, AND EXPORT LOOP\")\n","print(f\"{'='*80}\\n\")\n","\n","# Outer loop: Iterate through each prepared dataset\n","for dataset_info in prepared_datasets_info:\n"," dataset_alias = dataset_info['alias']\n"," data_yaml_path = dataset_info['data_yaml_path']\n"," class_names = dataset_info['class_names']\n"," test_images_path = dataset_info['test_images_path']\n"," val_images_path = dataset_info['val_images_path']\n"," output_dataset_dir = dataset_info['output_dir']\n","\n"," print(f\"\\n{'*'*70}\")\n"," print(f\"Processing Dataset: {dataset_alias} ({data_yaml_path})\")\n"," print(f\"{'*'*70}\\n\")\n","\n"," # Inner loop: Iterate through each model architecture\n"," for model_arch in MODEL_ARCHITECTURES:\n"," print(f\"\\n{'-'*60}\")\n"," print(f\"Training Model: {model_arch} on Dataset: {dataset_alias}\")\n"," print(f\"{'-'*60}\\n\")\n","\n"," # Create a unique run name for this model-dataset combination\n"," run_name = f\"{model_arch}_{dataset_alias}\"\n"," model_output_dir = TRAINING_RUNS_BASE_DIR / run_name\n"," model_output_dir.mkdir(parents=True, exist_ok=True)\n","\n"," current_run_info = {\n"," 'dataset_alias': dataset_alias,\n"," 'model_architecture': model_arch,\n"," 'status': 'Failed',\n"," 'mAP50': 0.0,\n"," 'mAP50-95': 0.0,\n"," 'Precision': 0.0,\n"," 'Recall': 0.0,\n"," 'Training Time (min)': 0.0,\n"," 'Inference Time (ms)': 0.0,\n"," 'Trained Model Path': 'N/A',\n"," 'CoreML Export Path': 'N/A',\n"," 'TFLite Export Path': 'N/A',\n"," 'Visual Test Images Path': 'N/A'\n"," }\n","\n"," try:\n"," expected_weights_path = model_output_dir / \"weights\" / \"best.pt\"\n","\n"," if expected_weights_path.exists():\n"," print(f\"Found existing trained model at {expected_weights_path}. Loading it and skipping training.\")\n"," model = YOLO(str(expected_weights_path))\n"," current_run_info['Trained Model Path'] = str(expected_weights_path)\n"," current_run_info['Training Time (min)'] = 0.0 # Unknown if loaded from disk\n"," else:\n"," # 1. Load the pre-trained YOLO model\n"," print(f\"Loading model: {model_arch}.pt\")\n"," model = YOLO(f\"{model_arch}.pt\")\n"," print(f\"Model {model_arch}.pt loaded successfully.\")\n","\n"," # 2. Configure training parameters using global hyperparameters\n"," training_params = TRAINING_HYPERPARAMETERS.copy()\n"," training_params['data'] = str(data_yaml_path)\n"," training_params['project'] = str(TRAINING_RUNS_BASE_DIR)\n"," training_params['name'] = run_name\n","\n"," print(\"Starting model training...\")\n"," start_time = time.time()\n"," # 3. Train the model\n"," results = model.train(**training_params)\n"," training_time = (time.time() - start_time) / 60.0 # minutes\n"," print(f\"Training completed for {model_arch} on {dataset_alias} in {training_time:.2f} minutes.\")\n","\n"," # Update trained model path\n"," best_model_pt_path = Path(results.save_dir) / \"weights\" / \"best.pt\"\n"," current_run_info['Trained Model Path'] = str(best_model_pt_path)\n"," current_run_info['Training Time (min)'] = round(training_time, 2)\n","\n"," # 4. Validate the trained model and store all metrics\n"," print(\"Validating model...\")\n"," val_results = model.val(imgsz=TRAINING_HYPERPARAMETERS['imgsz'])\n"," current_run_info['mAP50'] = round(val_results.box.map50, 4)\n"," current_run_info['mAP50-95'] = round(val_results.box.map, 4)\n"," current_run_info['Precision'] = round(val_results.box.mp, 4)\n"," current_run_info['Recall'] = round(val_results.box.mr, 4)\n"," current_run_info['Inference Time (ms)'] = round(val_results.speed['inference'], 2)\n"," print(f\"Validation complete. mAP50: {current_run_info['mAP50']:.4f}\")\n","\n"," # 5. Export the best trained model to CoreML and TFLite\n"," print(\"Exporting model to CoreML...\")\n"," coreml_export_path = model.export(\n"," format=\"coreml\",\n"," imgsz=TRAINING_HYPERPARAMETERS['imgsz'],\n"," half=False,\n"," nms=True,\n"," optimize=True\n"," )\n"," current_run_info['CoreML Export Path'] = str(coreml_export_path)\n"," print(f\"CoreML model exported to: {coreml_export_path}\")\n","\n"," print(\"Exporting model to TFLite...\")\n"," tflite_export_path = model.export(\n"," format=\"tflite\",\n"," imgsz=TRAINING_HYPERPARAMETERS['imgsz'],\n"," int8=False, # Set to False to avoid hanging during colab INT8 calibration process\n"," nms=True,\n"," optimize = True,\n"," data=str(data_yaml_path)\n"," )\n"," current_run_info['TFLite Export Path'] = str(tflite_export_path)\n"," print(f\"TFLite model exported to: {tflite_export_path}\")\n","\n"," # Verify and add metadata for TensorFlow Lite Task Vision compatibility\n"," print(\"Verifying TFLite model metadata...\")\n"," try:\n"," verify_and_add_tflite_metadata(\n"," tflite_path=tflite_export_path,\n"," class_names=class_names,\n"," input_size=TRAINING_HYPERPARAMETERS['imgsz']\n"," )\n"," print(\"✓ TFLite model metadata verified/added successfully\")\n"," except Exception as e:\n"," print(f\"⚠ Warning: Could not verify/add metadata: {e}\")\n"," print(\" Model may still work, but may not be compatible with Task Vision API\")\n","\n"," # Store model file paths for later copying to outputs/models directory\n"," # Convert export paths to Path objects and verify they exist\n"," coreml_path = Path(coreml_export_path)\n"," tflite_path = Path(tflite_export_path)\n","\n"," # Handle both string paths and Path objects from export()\n"," if isinstance(coreml_export_path, str):\n"," coreml_path = Path(coreml_export_path)\n"," if isinstance(tflite_export_path, str):\n"," tflite_path = Path(tflite_export_path)\n","\n"," current_run_info['_coreml_file_path'] = coreml_path if coreml_path.exists() else None\n"," current_run_info['_tflite_file_path'] = tflite_path if tflite_path.exists() else None\n"," current_run_info['_model_name'] = run_name\n"," current_run_info['_dataset_alias'] = dataset_alias\n","\n"," # 6. Generate and save visual test results\n"," if SAVE_TEST_PREDICTION_IMAGES:\n"," visual_output_dir = model_output_dir / 'visual_tests'\n"," visual_output_dir.mkdir(parents=True, exist_ok=True)\n"," current_run_info['Visual Test Images Path'] = str(visual_output_dir)\n","\n"," print(\"Generating visual test results...\")\n"," # Use test_images_path if available, otherwise fallback to val_images_path\n"," source_images_dir = test_images_path if test_images_path.exists() else val_images_path\n","\n"," if source_images_dir.exists():\n"," test_image_files = list(source_images_dir.glob('*.jpg')) + list(source_images_dir.glob('*.png'))\n"," num_samples = min(5, len(test_image_files))\n"," if num_samples > 0:\n"," sample_images = random.sample(test_image_files, num_samples)\n","\n"," fig, axes = plt.subplots(1, num_samples, figsize=(5 * num_samples, 5))\n"," if num_samples == 1: # Handle single subplot case\n"," axes = [axes]\n"," fig.suptitle(f'{model_arch} on {dataset_alias} - Sample Predictions', fontsize=16)\n","\n"," for i, img_path in enumerate(sample_images):\n"," pred_results = model.predict(str(img_path), conf=0.20, imgsz=TRAINING_HYPERPARAMETERS['imgsz'], verbose=False) # For small objects, conf = 0.25 and can test with smaller values\n"," annotated_frame = pred_results[0].plot() # YOLO's plot method\n"," axes[i].imshow(annotated_frame)\n"," axes[i].set_title(img_path.name, fontsize=10)\n"," axes[i].axis('off')\n","\n"," # Log detections for each image\n"," detections_count = len(pred_results[0].boxes)\n"," print(f\" - {img_path.name}: {detections_count} detections\")\n","\n"," plt.tight_layout()\n"," plt.savefig(visual_output_dir / 'sample_predictions.png')\n"," plt.close(fig)\n"," print(f\"Sample predictions saved to: {visual_output_dir / 'sample_predictions.png'}\")\n"," else:\n"," print(f\"No suitable images found in {source_images_dir} for visual testing.\")\n"," else:\n"," print(f\"Warning: Test/Validation images directory not found: {source_images_dir}. Skipping visual tests.\")\n","\n"," current_run_info['status'] = 'Success'\n","\n"," except Exception as e:\n"," print(f\"Error during processing {model_arch} on {dataset_alias}: {e}\")\n"," current_run_info['error_message'] = str(e)\n"," current_run_info['status'] = 'Failed'\n","\n"," finally:\n"," all_results_for_comparison.append(current_run_info)\n"," print(f\"Finished processing {model_arch} on {dataset_alias}. Status: {current_run_info['status']}\")\n","\n","print(f\"\\n{'='*80}\")\n","print(\"COMPLETED ALL MODEL TRAINING, VALIDATION, AND EXPORT LOOPS\")\n","print(f\"{'='*80}\\n\")\n","\n","# Optional: Display collected results so far\n","# if all_results_for_comparison:\n","# df_all_results = pd.DataFrame(all_results_for_comparison)\n","# print(\"\\nAll Collected Results:\")\n","# print(df_all_results.to_string(index=False))\n"]},{"cell_type":"markdown","metadata":{"id":"5f4cd7a7"},"source":["## Comparison Reporting and Visualization"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"32649121","colab":{"base_uri":"https://localhost:8080/","height":1000},"executionInfo":{"status":"ok","timestamp":1775419685102,"user_tz":-180,"elapsed":1492,"user":{"displayName":"Nathan Holland","userId":"13994014446134761485"}},"outputId":"7b523a3c-57f4-409f-9208-1c2033eeebcd"},"outputs":[{"output_type":"stream","name":"stdout","text":["\n","================================================================================\n","MODEL COMPARISON TABLE\n","================================================================================\n","dataset_alias model_architecture status mAP50 mAP50-95 Precision Recall Training Time (min) Inference Time (ms) Trained Model Path CoreML Export Path TFLite Export Path Visual Test Images Path _coreml_file_path _tflite_file_path _model_name _dataset_alias\n"," dataset yolo11n Success 0.897 0.5084 0.8726 0.8489 13.95 5.88 /content/runs/detect/runs/all_trainings/yolo11n_dataset/weights/best.pt /content/runs/detect/runs/all_trainings/yolo11n_dataset/weights/best.mlpackage /content/runs/detect/runs/all_trainings/yolo11n_dataset/weights/best_saved_model/best_float32.tflite runs/all_trainings/yolo11n_dataset/visual_tests /content/runs/detect/runs/all_trainings/yolo11n_dataset/weights/best.mlpackage /content/runs/detect/runs/all_trainings/yolo11n_dataset/weights/best_saved_model/best_float32.tflite yolo11n_dataset dataset\n","================================================================================\n","\n","✓ Comparison results saved to 'outputs/model_comparison_results.csv'\n","✓ Comparison plots will be saved to 'outputs/comparison_results'\n","\n","Generating comparative visualizations...\n"]},{"output_type":"display_data","data":{"text/plain":["<Figure size 1800x1400 with 4 Axes>"],"image/png":"iVBORw0KGgoAAAANSUhEUgAABwMAAAU3CAYAAACywMogAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3Xd4FNX/9vF70xNS6FU6SlE6iIICKoKCCooKYqGoKIqiqIgFAb8qKth7BcUCFhQVxYIiggpIE+lIkSLSE1oI7J7nD57ML5PdhAAbhpx9v64r18VO2zN7f3aY3bNzxmeMMQIAAAAAAAAAAABgnSivGwAAAAAAAAAAAACgcNAZCAAAAAAAAAAAAFiKzkAAAAAAAAAAAADAUnQGAgAAAAAAAAAAAJaiMxAAAAAAAAAAAACwFJ2BAAAAAAAAAAAAgKXoDAQAAAAAAAAAAAAsRWcgAAAAAAAAAAAAYCk6AwEAAAAAAAAAAABL0RkIAAAAeKRXr17y+Xyuv6lTpxba861Zsybo+dq2bVtoz4eijXpBXoYNGxZUG2PGjPG6WXmaOnVqUHt79erldbMAAACA44bOQAAAAJyQQn3ZnP335ptvHnb9Vq1a5bk+Cs+0adN0//336+yzz1bVqlWVnJys+Ph4lSlTRmeeeab69++vr776SgcOHPC6qUChev755/M8Bq1YscLr5gEAAACIIHQGAgAAoMh55ZVX8p2/YMEC/frrr8epNZCkH3/8UaeffrratGmjESNGaPr06frnn3+0Z88eZWVlaevWrfr999/10ksv6eKLL1bVqlU1Z84cr5sNFJr333//qOYBAAAAQLjFeN0AAAAA4EjNnTtXs2bN0umnnx5y/ssvv3ycWxTZHn74YQ0fPlyBQKDA6/z7779at26dmjZtWogtw7FITU3VgAEDXNNq1arlUWuKlpUrV2rWrFl5zn///fc1bNiw49egCHfSSScF1XJe/38AAAAANqIzEAAAAEXSK6+8EvLL3IyMDK66OY4eeeQRDR06NOS8qlWr6swzz1TJkiW1c+dOLVmyRAsWLDiiTkN4p2TJknr22We9bkaRdLhj0MqVKzVz5ky1aNHiOLUostWqVYtaBgAAQESjMxAAAABF0vjx4/X000+rRIkSrunvvvuu9uzZ41GrIsuUKVP00EMPBU0vX768Xn31VXXu3Dlo3qZNm/T666/rqaeeOh5NBDxRkB8kvPfee3QGAgAAADguuGcgAAAAioy4uDjn3/v27dOYMWOClsl9P8Gc6xTEwYMH9eGHH+qqq65SrVq1lJqaqvj4eJUvX15nn322hgwZorVr1xZoW7///ruuvPJKVahQQQkJCapWrZpuuukmLVu27IjalC0QCOiTTz7Rtddeq9q1a6t48eKKj49XxYoVdcEFF+ill17Svn37jmrbR2Pw4MEyxrimlShRQr/88kvIjkDpUEfhQw89pGXLlql+/fp5bvvvv//W/fffr1atWqlcuXKKi4tTWlqaTj75ZF199dX6+OOP5ff781x/2LBh8vl8rr8xY8bIGKM333xTZ555ptLS0lSqVCmdc845+uyzz1zrb9iwQQMHDlStWrWUkJCg8uXL6/LLL8/3Pod5Packffnll7roootUvnx5xcfHq1q1arr55pu1Zs2aPLe3bds2ffLJJxo8eLDOP/981atXz6mlpKQkVahQQW3bttX999+v5cuX57kdSapWrVpQ2yRp586deuihh9SgQQOlpqa62rxmzZqgddq2bRty+//9958eeeQRtW3bVhUrVlRiYqJTmw0aNFCXLl00bNgwTZkyRVlZWXm2Mxzvv7z2dd++fRo1apSaN2+utLQ0FStWTA0bNtSIESPC+r6ZNWuWVqxY4ZrWvn17FS9e3DVt/PjxOnjwYL7byr0f1apVkyTt2LHDyS05OVkpKSlq0aKFXnnllTzfF8YYTZ06VaNGjVK3bt3UuHFjVa1aVampqYqNjVXJkiXVoEED9erVS1999dUxXcHbvn17V7ujo6O1YcOGPJfv2LGja/moqCitXr3atcyCBQt0xx136PTTT1fp0qUVFxenYsWKqWrVqmrWrJmuueYaPf3005o7d27Q9qdOnRr0Wvbq1StkW1atWuU69sTHxysxMVGVK1dW48aNdeWVV2rEiBGaMWMGVzkDAACg6DAAAADACWjo0KFGkuuve/fuxufzOY9POeUUEwgEnHV++ukn1/ItW7Y0VatWDdpOXmbOnGlq1qwZtHzuv5iYGDN48GBz8ODBPLf15JNPmqioqJDrJyYmmg8++MD07NkzaN5PP/0Ucnvz5s0zderUOWzbKlasaH7++eeQ21i9enXQ8m3atClQHrnNmDEj5PO/8cYbR7W9bFlZWWbAgAEmOjr6sPtap04dM3/+/JDbCVU/L7/8sjn//PPz3N4999xjjDHml19+MWXKlMkz+wkTJhT4Od98803Tq1evPJ+zWLFiZtKkSSG398ILLxz2Ncj+i4qKMvfff3+er2uo98Fff/1lKlWqFDR99OjRxpiC18vXX39tkpOTC9zWX375JWQbw/X+C7WvS5cuzXfbZ555ptmzZ0+er9+RuP3220O+ptddd13Q9Lyyz5Z7+apVq5rp06ebcuXK5bkvl156qfH7/UHb2rVrV4Ezyn5N1q1bF7JdoWo9u26MMebzzz8Pmv/II4+E3NaOHTtMbGysa9nWrVu7lhk+fLjr2J/fX3R0dNBz5P6/QZLp2bNn0HJvvfVWUFvy+8vr9QEAAABONFwZCAAAgCKjdu3aOvfcc53Hy5cv148//ug8zn1V4C233FLgbU+bNk1nn322/v7778Mue/DgQT3++OO6+uqrQ85/7733NGjQoDyvGtm3b5+uu+46/fbbbwVq22+//aaWLVtq6dKlh11248aNateunaZMmVKgbR+t7777LmhaiRIldO211x71NgOBgC699FI999xz+V71l23p0qVq2bKl/vjjjwJtf8iQIfr+++/znD9y5Ei9/PLL6ty5s7Zs2RJymYMHD6pPnz7aunVrgZ7z4YcfDnkFa7Y9e/bosssu04IFCwq0vbwEAgE99thjGjVqVIHXueCCC/K9Wqsgtm/frh49emj37t3HtJ1wvv9Cad26db7b/u233/TII48UeHt58fv9Gj9+vGtabGysOnfurK5duwYtf6T3N926das6dOig//77L89lPvvsM7355ptHtN1QfvvtN1188cU6cODAEa970UUXqUqVKq5pb7/9dtCVxJI0ceLEoOfo2bOn8++ffvpJQ4cODbluOC1fvlw333zzUe0vAAAAcKLjnoEAAAAoUvr16+fq6HrllVd03nnnadOmTa6hHkuXLq3LL79cDzzwwGG3mZGRocsvvzxo+MKUlBR17NhRxYsX16+//qqFCxe65o8fP15t2rRRv379nGnp6em6/fbbg54jKSlJnTp1UokSJTRt2jQtXbr0sEM7StLu3bt12WWXBQ1jWKFCBbVp00bFihXT7Nmz9eeffzrzDhw4oKuuukrLly8PGpowXGbNmhU0rVWrVoqPjz/qbT7xxBOaNGlS0PQmTZro9NNP19atW/X1119r7969zry9e/eqa9euWrZsmRISEvLd/rZt2+Tz+XThhReqXLlymjRpkjZv3uxa5tZbb5V0KPvOnTsrMzNTn332matzcufOnRo7dqzuvPPOw+7TP//8I0k666yzdNppp2nt2rX69ttvXR3F+/fvV9++fTVz5syQ2yhZsqTq16+vUqVKqVSpUoqLi9P27dv1xx9/BA1H+cgjj6hv375KTU09bNvWr18vSWratKmaNm2q3bt3h8w1P19//bV27tzpmlapUiW1bdtWxYsX1+7du7Vq1Sr9+eefSk9PD7mNcL7/8rJ582bFx8erU6dOKlWqlCZOnBiU/Wuvvabhw4crNja2AHse2vfffx/UUXfeeeepRIkS6tChg1JSUrRr1y5n3sSJE7Vnzx4VK1asQNvPvh9qSkqKLrroIsXHx2vChAnKyMhwLffiiy+qb9++IbcRExOjhg0bqnz58ipVqpRSU1O1b98+rVixQr/++qtr6NL58+frww8/1HXXXVeg9mWLjo7WzTffrPvvv9+ZtmrVKk2dOlXnnHOOa9lPPvnE9TgxMVFXXHGF8zhUh2nDhg3VtGlTJSQkaOfOnVq2bJkWLlyY7xC0h/PRRx8FdQSefPLJatmypZKTk5WRkaEVK1Zo4cKF3JcWAAAARY/XlyYCAAAAoYQahm7o0KHmwIEDpmLFiq4hAzds2GAefvhh17KDBg0yxoQeMjC3Rx99NGiZypUrm7Vr1zrLBAIBc+eddwYtV7FiRXPgwAFnuVBDO5YsWdIsWbLEWebgwYPmmmuuCTnsXO5hQp944omgZa6++mqTmZnpWu6hhx4KWm748OGuZcI5TGjTpk2DtjVgwICj2pYxxuzevduUKFEiZOY5LV++POQQni+99JJruVD1I8mMHTvWWWbx4sUhl0lNTTVLly51lnvqqaeCluncuXPQPuT1nC+++KJrua+//jrkELIzZsxwLbdo0SIza9askEM+GnOoJgcMGBC0nc8//zxo2VDvA5/P5xraMWcWxhSsXnK/d6pUqRJyuE2/329mz55tBg8ebBYuXJjvNo7l/ZfXviYnJ5s5c+Y4y6xevdqUKlUqaLl58+aFfK0LKtT7+s0333TmX3XVVfnWZG6h6qlixYpm9erVzjJz5swJObTl9u3bXdvKysoyEydONOnp6Xk+3x9//BFUm126dAla7nDDhBpjzObNm018fHzQsSun9PT0oGV69OjhWib30L6XX355yLbv3bvXfPvtt+bGG28MmleQYUJvvPFG1/wWLVqEHIo2KyvLTJs2zdx2221m8+bNIdsCAAAAnGgYJhQAAABFSkxMjG644Qbn8cGDB/Xqq6/q9ddfd6b5fD7ddNNNBd7mhAkTgqY98sgjrmHufD6fHn/8cZUrV8613MaNG11XU33zzTdB27r77rtVp04d53F0dLSef/75Al1Fl/uqmfj4eL344otB6w4ZMkSJiYn5rhtOoa7ySklJOert/fTTT9qxY4drWq1atfTQQw+5pp188skhr/b8/PPPD/sczZo10zXXXOM8rlu3btBQhpJ08803q3bt2s7jyy+/PGiZ1atXH/b5pENX3WVfbZjtwgsvDDlkZO7aqVevnpo3by5jjH799Ve98cYbGjZsmO655x7dcccduvPOO7Vu3bqg7cydO7dAbevVq5d69eoVNL2gV6lJwZlnZmZq27ZtQctFRUWpWbNmGjFihE477TTXvHC+//Jy0003qUmTJs7jatWq6YILLgharqC5hrJ3796gOoyJiVGXLl2cx6Fq6UiHCr3vvvtUrVo153H2lbO5rVmzxvU4NjZWl1xyiVJTU7Vq1Sp99NFHGjFihO677z7deeeduuOOOzR27FglJSW51itoPeVWpkwZXXnlla5pn376qetK0i+//FL79+93LZNziFApuMZ27Njhujo4W2Jiotq3b+/6v+BI5H6e3bt3B11xKR16Hc8++2w9//zzKlOmzFE9FwAAAHC8MUwoAAAAipy+ffvq0UcfdYZufPzxx13Du3Xo0EE1atQo0LYOHjyoefPmBU3v1KlT0LS4uDi1a9cu6Mv72bNnq2XLlpIODauXW4cOHYKmlShRQqeffrp++eWXPNvm9/s1Z84c17T9+/erRIkSea6T019//aXdu3crOTm5QMsfibS0tKBpx3LfuNmzZwdNu+CCCxQVFfz7xU6dOumOO+447Pq5tW/fPmha+fLlnaE8s7Vr1y5omdxyDvWYnwsvvDDk9AsuuEAff/yxa1ru2jl48KCeeOIJPfPMMyE72PJS0PsZ5u50ORo57+EpHRqOs3r16qpbt65q166t2rVrq27dujrzzDNVs2bNoPXD/f7LS48ePYKmVahQIWhaQXMNZeLEiUHvgbZt26pUqVLO4wsuuEDFihVzDTP5ww8/aPPmzSpbtmyBnudY9uWnn37SoEGDCnyfTang9RTKrbfeqrFjxzqPMzMz9cEHHzj3c839g4WKFSsGvf/OO+88V4fxlClTVKZMGZ122mlOjZ122mlq1aqVSpcufdRtPe+88/T00087jxctWqTy5cvr1FNPdZ6nXr16atWqlSpVqnTUzwMAAAB4gSsDAQAAUORUqlRJl1xyifM4932esr9oLojt27e77t8mHbrCJOcX+DlVrlw5aFrOe4+F6rQ56aSTQm4rr+k5t5W7bUfCGBN0/7JwCdVx8ffffx/19rZs2RI0LdRrndf0nTt3HvZ+YaHWC3WfwdzLxcXFBS1T0Fzy2odQ2efudOnevbsefPDBI+oIlBTyqqlQGjRocETbDeXUU0/VgAEDXNP8fr/++usvffrpp3rsscd07bXXqlatWjr11FP17rvvupYN9/svL1WrVg2aFir7Y3m/vffee0HTct77Tjp079DcHcQHDx7UuHHjCvQcycnJKlmyZND0guzL559/rvPPP/+IOgKlgtdTKC1atFDTpk1d095++21Jh3488O2337rmXXPNNUE/AOjTp49atGgR1KZZs2Zp7NixevDBB9WlSxeVLVtW5513nn7//fejamvHjh1dV3FKUlZWlubNm6dx48Zp+PDh6tatm0466SS1aNEi5P1NAQAAgBMVnYEAAAAokvr16xdyepUqVUJeVRSpjuVqvfyEGpZw+vTph+2Q81KoDhOfz1eg5Y63SZMm6dNPPz2qdY0xBVquePHiR7X93J599lmNHz9eLVu2DHklZ7bFixerZ8+eGjlyZFie90iE6lyMjo4O2/a3bNmi7777Lmj69OnTdccdd7j+QnV8h+pIDCWvTtLD7cvBgwfVr18/52rq4yn3MLlz5szRggULNGnSJO3bt881L9TVqgkJCZo6daoef/xxnXzyyXk+jzFGP/74o9q0aaMZM2YcVVs//fRTvfrqq2rUqFG+y82aNUsXX3yxPvroo6N6HgAAAOB4Y5hQAAAAFEnt2rVTrVq1tHLlStf0vn375tshkVvJkiUVFRXluopm37592rZtW8gv3kPdoy3nVXKlSpXSxo0bXfPXr18f8kq69evX59u2UqVKBbUtNTVVvXv3zne9nI5l2Lz8tG/fXsOHD3dN27Fjh95///0jal+2UPfeCvVa5zW9ePHiIa/g81pe+xAq+5xZTZw4MWj+GWecoSeeeEINGzZ0hmn99ttvQ977riBCdYQerSuvvFJXXnmldu7cqQULFmjZsmVauXKlZs+erZ9//tnVQfnwww9rwIABiouLC/v7zysfffSRDh48GDQ95xCZ+Zk9e7ZWrFiRb2fXsZg1a5Y2bdrkmlasWDE9++yz6tSpk8qWLet0KFaoUCFo2WPRvXt33X333dq+fbsz7a233tK///7rWq5p06aqV69eyG0kJCTo3nvv1b333qv169dr4cKFWrFihZYtW6aff/5ZixYtcpbNysrSww8/HHTVYUFERUXppptu0k033aQtW7ZowYIFWr58uVasWKFff/3VdX9KY4yGDBkSdF9EAAAA4EREZyAAAACKJJ/Pp5tvvll33323My02NlY33HDDEW0nJiZGjRs3Dro339dff61rr73WNS0rK0s//PBD0DaaN2/u/LtRo0ZBnYHfffedmjRp4pq2c+dO1xfLoURHR6tJkyauYf127dqlu+66K8/hJ3Py+/1hvfopp5YtW6pZs2ZBQw7efffdatOmzWHv2bhp0ybt3bvXWS7na5ht8uTJCgQCQZ27X3/9ddCyodY/EUyePFn/+9//gqaH6qjIeTVS7vsYStKLL74YNOTizJkzj72RYVS8eHG1adNGbdq0caY9+OCDevTRR53Hu3fv1uLFi9WoUaOwv/+8kvs+hke7jWHDhh17Y0IIVU+9e/cOOl7+888/Ye0IlA4N+3r99de7rgh97733gq4iLug9LE866SSddNJJznCrxhi1bt1a06dPd5YJx/uiTJkyateunesehtdcc40r6+XLl2vnzp1hu8oWAAAAKCwMEwoAAIAiq3fv3kpLS1N8fLzi4+N1xRVXqFy5cke8ncsuuyxo2gMPPOC6CskYo8GDBwfdg69ChQquITNz3w9MkkaNGqXly5c7j/1+v+644w7t37//iNtmjNHll1+uDRs2hFw+IyNDH3/8sS666CI99thjh93+sRgxYkTQ1WXbt2/XWWedpa+++irkOlu2bNEjjzyiOnXq6M8//3Smn3POOSpRooRr2ZUrVwZ1pK1YsUKPPPJI0HZz3+vrRPHHH3/o5Zdfdk377rvv9MknnwQtm7N2Ql3luGDBAtfjn3/+WU888USYWnp0Zs6cqdtvv10zZ87M8357oe5bmbP2w/n+88KqVav022+/HfN2wtGhmJdQ9fTXX3+5Mtu2bVtQB2y49OvXz9Wpv2PHDu3Zs8d5HBsbq6uuuirkum+88YZGjBihFStWhJy/f/9+paenB007UhMnTtQDDzzgOi7lFAgEgu7rebTPBQAAABxvXBkIAACAIqtkyZLauXPnMW+nf//+evbZZ1338lq3bp1OPfVUderUScWLF9evv/4a8kviIUOGKCbm/06rr732Wg0ZMsTVrm3btqlJkya66KKLVLx4cU2bNk1LliwpcNuee+45VyfIrFmzVK1aNbVp00ZVq1ZVXFyctm/frqVLl2rJkiU6cOCAJKlZs2ZH+lIckXbt2mn48OF66KGHXNP//fdfXXzxxapWrZrOPPNMlShRQhkZGVqyZInmz58f8r5lxYoV0z333KP777/fNX3YsGH64osvdPrpp2vbtm2aNGmS9u7d61qmSpUq6tOnT/h3MExuvfVWjRs3TqeddprWrl3rXPGYU7NmzdSyZUvncdOmTfXll1+6lunbt68+/fRTVa5cWcuXL9fUqVMLfH/AwrJr1y698MILeuGFF1S8eHHVr19f1atXV0pKivbt26e5c+dq/vz5rnWioqJUs2ZN53E4339eCNWJd+211+rdd9/Nd70qVaq4OjxXrlypmTNnqkWLFmFvY+4rSiVp6tSpql+/vlq1aqUdO3boxx9/dA3lGU7Vq1fXhRdeqEmTJoWc37FjxzyHNF67dq0effRR3X///TrppJN06qmnqlKlSkpKStKOHTv0888/Bw27e8oppxxxG7ds2aLHHntMjz32mMqUKaP69eurSpUqSk5O1q5du/Tbb7+5ftQhHboSNtQQxwAAAMCJhs5AAAAARLzU1FR98sknOv/8811D1+3atUvjxo3Lc70rr7xS/fr1c01LS0vTc889FzTk3Z49ezR+/Hjnsc/nU6VKlQ5738CUlBRNmDBB5513njIzM53pBw8e1JQpUwq0f4VpyJAhCgQCevjhh4M6uNasWaM1a9YUeFuDBg3SjBkzgjoM5s6dq7lz54ZcJykpSZ9++qkSEhKOuO3HQ7169bR48WL98ssv+uWXX0IuExcXp9dff9017frrr9cTTzyhffv2OdP8fn/QEKkdOnQ4qnujFYadO3fmu5/ZrrjiClfHTzjff14I1RnYtWvXw67XpUsXvfDCC65p7733XqF0BlatWlUXX3xxUAfz4sWLtXjxYudxw4YNtWnTppBXcx6rW2+9Nc/OwIIOEbp+/frDHjMlHXNdbNmyRT/++ONhl7vpppuO6B61AAAAgFc4awUAAAAktW7dWr/88ovriqW8xMTE6N5779UHH3wQcv51112nxx57LGgIzZzrv/DCCzrvvPMK1LaWLVvqt99+06mnnlqg5aVDwyc2bNiwwMsfi6FDh+q77747oisRK1SoEHTfw+joaE2YMEEDBgwo0L0O69Spo19//bXQr4A8Fvfcc49uu+22POcnJSXpk08+UePGjV3TTzrpJL333nuKj4/Pc91+/fpp8ODBYWvr0cirxvNy3nnn6dVXXw2aHs733/E0Z84cLVu2zDUtOTlZHTp0OOy6l156adC08ePH6+DBg2FrX05vvfWW6tWrl+f82rVra+LEiYXWsX7BBReEzLdUqVLq1KlTnusdSY35fD4NHDhQN9100xG370hruUePHho+fPgRPw8AAADgBa4MBAAAAP6/008/XUuXLtVHH32kL774QrNnz9bmzZu1f/9+lShRQieffLLatm2rG2+8UVWrVs13W/fdd5/atm2rp556StOnT9eOHTtUtmxZtWnTRgMHDlSTJk3Uq1evAretUaNGWrhwoSZNmqTPPvtMM2fO1MaNG5WRkaGEhASVLl1ap5xyipo3b67zzz9fZ599doE61MLlvPPO0+zZs/Xzzz/rm2++0S+//KJ169Zp27ZtOnDggNLS0lSzZk01a9ZMF154odq3b6/Y2Nig7cTFxenZZ5/VbbfdprfeektTp07VypUrtXPnTiUkJKhs2bI6/fTT1aVLF3Xt2vW47uPRev7559WxY0e9/PLLmjVrlnbs2KHy5cvrggsu0ODBg1W9evWQ61122WX6448/9Pjjj+vHH3/U1q1bVbJkSTVp0kQ333yzLrnkEk2dOvX47kwu5513nv766y/98MMPmjVrlpYsWaJ169YpPT1dxhglJyerSpUqatq0qa688kpdcMEFeW4rnO+/4yXUVYEdO3YsUIda69atVapUKW3bts2ZtmXLFn333Xfq2LFjWNspSWXKlNHMmTP1zDPP6KOPPtLKlSsVFxen6tWr64orrtCAAQOUnJwc9ufN5vP5dMstt+iuu+5yTe/evXvIexpmGzp0qNq3b6+pU6fqjz/+0PLly/Xvv/9q9+7dio6Odo4trVq1Us+ePVW/fv2jal+fPn3UsGFD/fjjj5o9e7aWLl2qDRs2aNeuXfL5fEpJSVH16tXVokUL9ejRQ61atTqq5wEAAAC84DNe32QCAAAAACwwbNiwoCuFRo8efUSdvoDNvvrqK1188cWuabNmzVLz5s09ahEAAAAQGRgmFAAAAAAAFCq/369Ro0a5pp166ql0BAIAAADHAcOEAgAAAACAsJs8ebImT56sPXv2aMaMGVqyZIlrfn730wQAAAAQPnQGAgAAAACAsPv999/13HPPhZxXu3Zt9enT5zi3CAAAAIhMDBMKAAAAAACOm+LFi2v8+PGKjY31uikAAABARKAzEAAAAAAAFKro6GiddNJJuv766zVv3jw1bNjQ6yYBAAAAEcNnjDFeNwIAAAAAAAAAAABA+HFlIAAAAAAAAAAAAGApOgMBAAAAAAAAAAAAS9EZCAAAAAAAAAAAAFiKzkAAAAAAAAAAAADAUnQGAgAAAAAAAAAAAJaiMxAAAAAAAAAAAACwFJ2BAAAAAAAAAAAAgKXoDAQAAAAAAAAAAAAsRWcgAAAAAAAAAAAAYCk6AwEAAAAAAAAAAABL0RkIAAAAAAAAAAAAWIrOQAAAAAAAAAAAAMBSdAYCAAAAAAAAAAAAlqIzEAAAAAAAAAAAALAUnYEAAAAAAAAAAACApegMBAAAAAAAAAAAACxFZyAAAAAAAAAAAABgKToDAQAAAAAAAAAAAEvRGQgAAAAAAAAAAABYis5AAAAAAAAAAAAAwFJ0BgIAAAAAAAAAAACWojMQAAAAAAAAAAAAsBSdgQAAAAAAAAAAAICl6AwEAAAAAAAAAAAALEVnIAAAAAAAAAAAAGApOgMBAAAAAAAAAAAAS9EZCAAAAAAAAAAAAFiKzkAAAAAAAAAAAADAUnQGAgAAAAAAAAAAAJaiMxAAAAAAAAAAAACwFJ2BAAAAAAAAAAAAgKXoDAQAAAAAAAAAAAAsRWcgAAAAAAAAAAAAYCk6AwEAAAAAAAAAAABL0RkIAAAAAAAAAAAAWIrOQAAAAAAAAAAAAMBSdAYCAAAAAAAAAAAAlqIzEAAAAAAAAAAAALAUnYEAAAAAAAAAAACApegMBAAAAAAAAAAAACxFZyAAAAAAAAAAAABgKToDAQAAAAAAAAAAAEvRGQgAAAAAAAAAAABYis5AAAAAAAAAAAAAwFJ0BgIAAAAAAAAAAACWojMQAAAAAAAAAAAAsBSdgQAAAAAAAAAAAICl6AwEAAAAAAAAAAAALEVnIAAAAAAAAAAAAGApOgMBAAAAAAAAAAAAS9EZCAAAAAAAAAAAAFiKzkAAAAAAAAAAAADAUnQGAgAAAAAAAAAAAJaiMxAAAAAAAAAAAACwFJ2BAAAAAAAAAAAAgKXoDAQAAAAAAAAAAAAsRWcgAAAAAAAAAAAAYCk6AwEAAAAAAAAAAABL0RkIAAAAAAAAAAAAWIrOQAAAAAAAAAAAAMBSdAYCAAAAAAAAAAAAlqIzEAAAAAAAAAAAALAUnYEAAAAAAAAAAACApegMBAAAAAAAAAAAACxFZyAAAAAAAAAAAABgKToDAQAAAAAAAAAAAEvRGQgAAAAAAAAAAABYis5AAAAAAAAAAAAAwFJ0BgIAAAAAAAAAAACWojMQAAAAAAAAAAAAsBSdgQAAAAAAAAAAAICl6AwEgCPUvXt3+Xw++Xw+zZ492+vmFGmdOnWSz+dTdHS0Fi9e7HVzcIyy3xc+n09jxow5onW3bNmi1NRU+Xw+1a9fX8aYwmlkDps2bVLv3r1VqVIlxcTEOG3//PPPC/25kb9q1ao5eQwbNszr5gQZOXKk075XX33V6+YAAIAiYurUqa5z5jVr1pxQ28OJadGiRYqOjpbP51OnTp28bk6RNnv2bOf90r17d6+bAwDHFZ2BwAnmtNNOc53MV6hQQQcPHvS6Wfj/5s6dq48++kiS1LZtWzVv3vy4PXf//v1dteHz+fTXX3/luXzOL9Nz/sXFxalixYq65JJL9MUXXwStN2bMmJDr5fxr165dyOf8999/NWDAAJ188slKTExUiRIldNZZZ+n111+X3+8PWv6ee+6RJAUCAd1///1H+cqcmNavX6877rhDp556qooVK6b4+HiVL19e9evXV7du3TRixAjt2LHD62aeMB555BHt2rVLknT33XfL5/M583r16uWqv3Awxujyyy/XmDFjtHHjxpD1iWPTtm3bwx5Lcv8daSeyV2666SalpqZKkh5++GHt3bvX4xYBAAApuHPM5/PpkksuCbnst99+G7Rsr169jm+DTwCffPJJ0Ovw4osvet0s5HD//fcrEAhIkgYNGnTcnnfTpk2KjY111cbll1+e5/L5fZeQkpKiRo0aafDgwdq8eXPQunl9f5Hzb/r06SGf96OPPlK7du1UqlQpxcfHq1q1arr++uu1YsWKoGWbN2+uNm3aOOvNmzfvKF8dACh66AwETiCzZ8/WokWLXNM2bdqkyZMne9Qi5DZs2DDniqUBAwYct+fdv3+/Pvzww6DpR/PF+YEDB/Tvv//qyy+/VOfOndW3b98wtFD6448/dNppp+n555/XypUrlZmZqZ07d2rGjBm66aab1KlTJ2VmZrrWadu2rRo0aCBJmjhxoubOnRuWtnht7ty5Ou200/Tcc89p8eLF2rt3r7KysvTff//pr7/+0kcffaT7779fa9eu9bqpJ4R///3XubqqdOnS6tGjR6E/5z///KMZM2Y4jy+66CI98cQTGjlypE477bRCf37k74EHHtDIkSM1cuRItW/f3uvmBElNTXW+LMxZvwAA4MQzadIkrVq1Kmj6c88950FrTjyjR48OmlZUfqAVCebMmeP8iLdhw4ZOR9bxMHbs2KAfp3/55Zfavn37EW9r9+7dWrBggZ544gmdeuqp+vPPP4+5fcYY9erVS926ddOUKVO0fft2ZWVlae3atXr77bfVoEEDff3110HrZX+XY4zR0KFDj7kdAFBUxHjdAAD/J68T7jFjxuiiiy46vo0pJBkZGc7VFEXN+vXrNWnSJEmHvgi+8MILj9tzf/HFFyFPuN9//309/vjjionJ/3Beo0YN9evXT9KhTpB33nlHGRkZkqQ33nhDnTp1UufOnYPWO//880N+EV+1alXX4927d+vyyy932li5cmX17t1bmzZt0ltvvSW/369vv/1WQ4YM0ciRI13rdu/e3fkg8Nprr+m1117Ld1+KgltuuUXp6emSpGLFiqlbt26qUaOGDhw4oBUrVuiXX37RunXrPG7liWP06NHKysqSJHXt2lWxsbGF/py5O2KfffZZ1axZs1Cfc8+ePUpMTFRUVGT8Fqtfv35B/3dlXw0sSc2aNVO3bt1c87Ovtr7xxhsLv4HHqHv37nr++eclSa+//roGDhzocYsAAEAogUBAL774op5++mln2vLly/nRrQ79+Pjbb78Nmj5nzhz99ddfVvxIzu/3a//+/UpKSvK6KUcl5+fj4z2s5TvvvBM0LSsrSx988IH69+9/2PVvvvlm1axZU/v27dMPP/ygadOmSZK2bt2qnj175nlVXu7vDLJVr17d9fjFF190tbF79+6qV6+exo0bp8WLFyszM1M9evTQokWLVKlSJWe5jh07KjU1VRkZGfr666+1fv16nXTSSYfdHwAo8gyAE0JmZqYpUaKEkWQkmVNOOcX5d1xcnNm6dWue6y5ZssTccsstpm7duqZYsWImMTHRVK9e3XTr1s3Mnj3btWwgEDAff/yxufjii03FihVNXFycKVGihGnUqJG58847zf79+40xxqxevdp5fknmp59+cm2nTZs2zryePXs600Ot9+abb5rGjRubhIQE07BhQ2OMMatWrTIDBgwwZ511ljnppJNMUlKSiYuLMxUrVjQXXXSR+eKLL/Lc31mzZplevXqZmjVrmsTERFOsWDFz8sknm169epmVK1cav99vqlev7rThvvvuC9rG3Xff7cyvW7fuYdI55JFHHnHW6dGjR9D80aNHu/Z9586d5rbbbjPly5c3SUlJpm3btmbmzJnGGGP+/vtv07VrV1O8eHGTnJxsOnToYBYuXJjnc3fs2DFkbUgyX375Zch1qlat6izTpk0b17zvv//etY1rr7025H4MHTq0QK/NSy+95Kzj8/nM0qVLnXn333+/My8hIcFs377dte7y5cud+SkpKWbfvn2Hfb4333zTWScpKcns3r3bNX/Hjh0mPj7eWea9994zxhhz4MAB88wzz5gzzjjDpKWlmejoaFOyZElTr149c+2115oPP/ywQPubn/T0dNdrO2bMmJDLzZo1y2zZssU1LWdmQ4cONb///rs5//zzTWpqqklOTjbt27c3f/zxR8jtbdq0ydx3332mYcOGJjk52cTHx5uaNWuaW265xaxduzbkOn6/37z77rvm/PPPN2XKlDGxsbGmdOnSpmPHjmbSpEkh1zlw4IAZMWKEqVWrlomLizM1atQw//vf/0xWVpZrv0ePHl3g16xWrVrOet99913Q/J49e7q2nde8Nm3amI0bN5obb7zRlC9f3sTFxZk6deqY119/3bVOzm2F+stp/vz5pnfv3qZGjRomISHBFCtWzDRq1Mg8+uijQXVnTHCGv/zyiznvvPNMamqqkWR27NgRtm3/8ccfplOnTiYtLc0kJiaas846y/zyyy8hX+OtW7eahx9+2LRo0cIUL17cOd62b9/ejBs3Lmj5adOmmW7dupnKlSubuLg4k5KSYs444wzz4osvmqysrJDPURA5X+ec/3ccbl+z/fTTT65tLF261Dz00EOmSpUqJjEx0TRv3tx88803xhhjNm/ebPr06WNKly5tEhISTKtWrcy0adNCPt/RvH8CgYCpVKmS05bp06cf9esCAADCI/e5QlRUlJFk0tLSXOdX/fv3d5aJjo7O9/xk/fr15u677zannXaaKVasmImPjzdVq1Y1V199tfP5LretW7eam266yZQtW9YkJCSYpk2bmnHjxgW1b/Xq1a71jvT8/HDbO5wnn3zSWTc5OdlUrFjReXzXXXflud6BAwfMW2+9Zc4//3xTtmxZp50tWrQww4YNC1p+3bp1ZtCgQaZRo0YmJSXFxMfHm8qVK5vOnTu7zv9zn9sXdF9zr7d27VpzzTXXmLJlyxqfz2c+++wzY4wxb731lrniiitMnTp1TKlSpUxMTIxJSUkxDRs2NIMGDQr6fJZt9+7d5plnnjGtW7c2JUuWNLGxsaZcuXKmdevW5sUXXzTGGPP22287bUhMTDQ7d+50bWPHjh0mNjbWWSbUOXhue/fuNSkpKc46y5cvD1om93nz119/bc444wyTmJhoKlWqZB544AHn/P2ll14yderUMfHx8aZ69erm0UcfNYFAIORzz5o1y/V65/weomnTpiHXyf2dSO7vkc466yzX/L///jvkfhTEgQMHTIUKFUJ+R7Nt2zbX6zZo0KCg9Xv06OHMf+SRRwr0nABQ1NEZCJwgxo8f7zop+u2331wnis8//3zI9d58800TFxeX55fazzzzjLPsvn37TKdOnfL9Ejz7i+pwdQaeffbZrsfZnYFffvnlYb+QHz58eND+Dh8+3Ph8vjzXyT7JHzlypDOtYsWK5uDBg67t5DzRfPLJJwuUUevWrZ11sk/4c8p94tu0adOg9iUkJJiJEyeakiVLBs0rVaqU2bx5c9B2N27c6PqA+vrrr5vGjRs7jy+77LKQ7c2vM3D37t2u5z7//PND7ke5cuVMWlqaiY2NNSeddJLp1q2b+e2334Keq0OHDs469evXd82bM2eO67lCfegpXbp0nrUWSkZGhklKSnLW+eCDD1zz33rrLWdeWlqa2bt3rzEmuFMp91+LFi0O+9yHs23bNtc277777qD6y0vOzM466yzXMSDnB8vcHT6//vqr6zXM/ZeWlhbUCbJ3717Trl27fF+PgQMHBrWxe/fuIZfNfWwpaGfgqlWrnHWioqJMRkZG0DIF7QysUaOG6wNhzr+33nrLWedwx55sL7/8somJiclzuXr16pl///03zwzPPPNM13tX+r9j7LFu+/TTTw9ZH/Hx8Wbx4sWu9WbNmmXKly+f53N17tzZtXzODvxQf2effXbIzsqCyLmdcHQGhjrORkVFmXHjxrl+FJLf63M0759sXbt2DdlOAADgjdznCl26dHH+/dJLLxljDv14L7ujoHHjxq7zjtznJz///LPrR7uhzjueeuop1zo7duwwderUKdA5c84OraM5Pz/WzsB69eo56/bo0cPceeedzuNy5cqZAwcOBK2zbds207x583zPnXKaNGmSq2Mm99+AAQOcZcPRGXjyyScHnftmf08Q6twx51+lSpXMhg0bXM/7999/m5NPPjnPdbK/49i3b58pVapUUL1ly9lZWKJECZOZmXnYfH788UdnnTJlyoRcJmf9Nm7cOOT3JT179jS33XZbyPYPGTIk5Hb79evnLHPSSSeZzz//3LXen3/+GbTO4ToDc/4oW5KZMWNGyP2oUaOGiY2NNSkpKaZ58+ZmxIgRZs+ePa5t/fbbb65tffrpp675F198sTOvTp06QW194YUX8qw1ALBVZIxTBRQBOYcIbdKkic444wy1a9cu5Pxsv//+u/r27esMrxcTE6OrrrpKw4cP14033qjKlSu7lr/rrrucYS6lQ0M53n777RoyZIguu+wyxcXFhXenJP3yyy+qWrWqBg4cqAcffFAtWrRw2tqoUSPdcMMNuu+++zRixAg9+OCDOuecc5x1//e//2nDhg3O448//lhDhw517tmXlJSkPn36aPjw4erVq5dKlSrlLHv99dc7w4Bs3LjRtd+zZs1yhgiMiYnRtddee9j9yMrK0qxZs5zHzZo1O+w68+bN04033qg777zTGfYwMzNTnTt3VkZGhm655RbdcMMNzvLbtm3TW2+9FbSdsWPHyu/3S5JiY2PVtWtX1/AgX331lbZt23bY9uT022+/uR6XL18+5HL//fef0tPTdeDAAa1fv17jx49Xq1at9MILL7iWyznef40aNVzzcj8OdW+AnK/nL7/8ctj2p6SkuG5c/sEHH7jm53zcvXt3JSYmavfu3Xrvvfec6V27dtWjjz6qQYMGqVu3bnm+BkeqZMmSrmFUR40apXLlyqlz584aNmyYvv32W+3fv/+w25k+fbqqV6+uBx54QD179nSGlty3b5969+7t1ERGRoa6dOmirVu3Sjo0hOugQYM0dOhQnXrqqZKk9PR0de3a1Rm6VJLuvPNO/fDDD5KkuLg4XXfddfrf//6nK6+8Uj6fT5L09NNPu17LTz75ROPGjXMe16pVS/fff7969uypb7755qher5x5n3LKKUpJSTmq7UjSqlWrtGPHDvXr108DBw5UYmKiM+/JJ590/j1y5EjdfPPNrnXvv/9+5x51kvTrr7+qf//+zj0yzjjjDA0bNkx33XWXSpcuLUlavHixrrvuujzb89tvvyk+Pl59+/bV8OHD1aVLF0VHR4dl27NmzVK5cuV07733uu6xuH//ftf9b3bt2qVLLrlEmzZtcqade+65GjJkiAYMGKCmTZu6tjtu3Dg99thjzuMOHTro4Ycf1q233qrk5GRJhzK7884782zb8TRnzhx169ZN9913n1M7gUBA3bt31+rVq3XttdfqzjvvdIZSzv36HO37J1v2sKZSwY5dAADg+Lr66qud86sXX3xR0qEh6nft2iVJuv322/Ncd+fOnbrsssu0Y8cOSVJiYqJuueUWDR482DnfDwQCuvvuu/Xzzz876z344INaunSp87hNmzZ66KGHdN5557k+l+Z2NOfnx2LWrFlavHix87h79+6uz5n//fdfyHP8a6+9VrNnz3Ye161bV3fddZfuv/9+XXjhhYqOjnbmrV27VldccYXzevt8PnXu3FlDhw7VLbfcojp16oRlX3JasWKFNm3apMsuu0zDhw9Xnz59lJaWJkkqW7asLr74Yt1xxx16+OGH9eijj+qWW25xvkvYsGGDHnnkEWdbfr9fXbp00YoVK5xpzZs31+DBg3XPPfeodevWTjYJCQmuoe7ffPNNV7s+/vhj5989evRQfHz8Yfcl5/ll7vP2UObNm6d69eppyJAhrvPUd955Ry+88IIaN26sIUOG6OSTT3bmPffcc853Stn279/v+tx35ZVX6sILL1Tx4sWdaUdzX8nff//d9Tivz+CrVq3SgQMHtGvXLs2ePVv33Xefmjdvri1btjjL5P5eIb/vIZYvXx70GTzn6zNz5syg1wAArOR1bySA4Cu/Ro4caYwx5t133833l1eXXXaZ6xeJua9c2L9/v1m3bp0xxpjt27e7rkJp3Lix2bVrl2v5f/75xxk+IlxXBlavXt01LF5uy5YtM+PGjTMvvPCCGTVqlBk5cqTriq93333XWbZJkybO9GLFiplly5a5trV7927z33//OY9vvPFGZ/mLL77YmX7XXXeFnJ6fnFcvSQr6taAxwb+CyznUxFVXXeWal52xMcacccYZzvRQV/nl/LVmp06djDHGrF271vWLv1BXjub+Zd3IkSPNyJEjze233+4MWZj9l/1Lyez9iI+PNx07djQDBw40w4YNc/2qLrvectZjziE5cw45aowxBw8edK170003BbX1hhtuCFlP+Zk6daqzTmxsrNm2bZsxxph///3X9X7KHrpn+/btzrTU1FRnSNxsgUDArFq1qkDPfTgTJkzI9wrWtLQ0M3z48HyvWC1durRraJlHH33UtY3vv//eGGPMc8895/qFafbrYMyh90SZMmWc+c8995wx5tCveXMeD95++21XO2655RbXsSJbzitA09LSXM+Vu30FvTLwoYcectbJeYVqTgW9MlCS+fzzz515zz77rGtezqsOD/cr6ksvvdSZ17ZtW+P3+515uYfMWbBggTMvZ4bR0dFmzpw5QfsTjm0XK1bMdRzK+av3Jk2aONOff/551/YeffTRoPbkHJ4n51XH1113nWu5jz76yJkXExPjyr+gcrYlHFcG3nDDDc68++67zzXv1ltvdeblvKI15+tzNO+fnN577z1nftWqVY/49QAAAOGV+1zhyy+/dI16MHnyZGeI+jJlypjMzMw8rwx85plnXNv6+uuvnXn//fefSU5OduZlj7Rw4MAB1/TWrVs753qBQMC0b98+5Dno0Z6fH8uVgTmv/CpRooTz+ahmzZrO9NyfT//880/X83Xs2DFoCPmc55YDBw50Lf/++++7lvX7/fkO95lTQa8MlGSeffbZPPd7z5495ocffjCvv/66efrpp83IkSNN586dnXVr1KjhLPvFF1+4ttu3b9+gYTVz7u/atWtdn0WzPwts377dNapHqM8IoVx33XXOOjfeeGPIZXLWb6lSpUx6erox5tB3LTnbXrZsWWd0j8mTJ7vm5f6uKffIVdm3n+nTp48zLdSVo7m/E7n55pvNyJEjzf/+9z/Xd0jS/11RmXM/atWqZfr06WOGDx9uBgwY4Bq2VpK5/PLLneVHjBjhmpczB2OMefDBB13zc4+6sn79+qN+7wBAUUVnIHACeOKJJ5wTEJ/PZ/755x9jzKGhEBMSEpx5d955p2u9smXLOvMuvPDCfJ/j66+/dp3ojB8/Pt/lw9UZOGrUqDy337JlS9eyof4ee+wxY8yhE/acnSv9+vXLt/3GuD+oREdHO1+c5zxZnjBhwmG3Y4wxM2fOdLUr1H3tcp/4rlmzxpmX+0vqnPeguvrqq53p55xzTr7PO3bsWGdeztcv5wfCbDn3M7+/Pn36uNbbuHFj0P0NjDHm9ddfd62X8x4SOTsDr7nmGtd6Bw4ccK0XqjPw3nvvdX2gLIhAIOD6oJp9X7icX+6feuqprnVOPfVUZ17FihVN586dzd13323eeecds379+gI9b0H99NNP5txzz3XuUxLqL/ewgjkzy53L2rVrXes+/vjjxhhjrrzyygLlLMl069bNGBN8PMjvz+fzOUOy5Bz2JntbebWvoJ2BOb+EyL3NbAXtDKxYsaJr3jfffJPn++5wX5zkPL4e7u+VV15x1suZ4UUXXRRyf8Kx7dz3Lc35HqpevbozPWd9pKSk5Dtkbe7j7OH+su/NdyRyrh+OzsCpU6c681577TXXvJ9//tmZ98ADDxz29Sno+yennDWWlJR0xK8HAAAIr1CdgevXr3c62nLe7/eBBx4wxpg8OwNznieEGqLxiiuucOaXLVvWGGPMwoUL8zyXM8aYd955J+Q56NGenx9tZ2BmZqZr+NPrr7/emZez8zQuLs5s3brVmffyyy+7ni+veyZmO/30051l69ate9h2haMzsESJEiGHNzXGmKeeesrVWRvqLy4uzll+0KBBrnk5f3ycl5w/2r755puNMe4hQhs0aHDYbWS78MILnfXuvffekMvkrN9evXo50/fv3+9qe+/evZ15K1asyPO8Offz1qpVy5n+3XffudabOHGia73c34nk9VeyZEkzb94817pLliwJ2reMjAxTu3ZtZ73o6Gjnu4rcnYErV650rZvz/F8K7gzct2+fa/6sWbNCvr4AYBOGCQVOADmHV2jZsqUzvGdKSoo6derkzHv//fedYeUkafv27c6/q1evnu9z5Fy2IMvnZv7/0JzZCjLMoaQ8h/3o0qWLfv3118Oun/08O3bscLWhIO2vX7++2rZtK+nQ8B6jR4/WzJkznSFCy5Qpo4suuuiw2zlaFStWdP6dewjWnPOyh6+TDg0zk9Po0aOdfycmJqpz587O46uuusr597x587Rw4cICtSsmJkbly5fXRRddpAkTJgQNTVqhQgVnGJWccg69KklLlixx/p1z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H42NGzfq+++/L/Dy8+bN059//qkGDRrorLPOcs373//+p88++8z1GTT73FI6dC46a9YsSYdGlhk3bpzrKkRjjNatW6cqVapIcnemLlu2TDt37lTx4sWVnp6ul1566Yj3Naec30PUqFHD6QANBAL65JNPQq5z1lln6cknn3QeDx06VC+//LLrh3g59zfbbbfdpr59+0qS7r//fh04cECSdPHFF4ccKScvXnxWOpLvqLKvHC3I+yk/EyZM0L59+9StWzdXLe3atcs1WlJcXJzzPUOzZs1UsWJF50fJn376qS677DJJ0tatW12f3UP9+DLn65mQkHDYHwcAgA3oDAQ8lJmZ6bryq3r16jr99NODllu4cKEWL14sSfrqq6+0detWlS5dWvfcc48+//xzBQIB+f1+nXPOObryyitVu3Ztbdq0Sd9++6369++vO+64QyVKlFDfvn318ssvSzrU4VGvXj116dJFxYsX1/Lly/XZZ5/p33//VfHixZWamqpTTjnFGYLh0Ucf1bx587Rv3z79+OOPx7TftWrVUlRUlDMUxYABAzR//nxt27bNdaKX2+DBg3XllVdKknbv3q1GjRqpe/fuqlq1qtatW6evvvpKL7/8srp06eKsEx0drX79+um+++6TdOg1lw6dOJ522mkFbnN8fLyaNWvmDG06d+7ckFmFU87XolixYiGHNP3vv/+ck9zNmzdr0qRJ+V5lVBDvvPOOXnzxRbVu3VpnnnmmEhIS9Mcff+jLL790lomLi9P111/vPL7uuuv0xBNPaO3atTLGqH379urdu7c2btzoGoa0f//+QcNzSNKcOXOcf+d3JVIovXv3doYxyflr09xDhErSGWecoYoVK+rss89WxYoVlZqaqgULFjgdgVLwr3mPxrvvvqt3331XNWvW1FlnnaUaNWrI5/NpwYIFTge+JLVu3drVIZ/T1q1b1bx5c11xxRVav369xo4d68yrWbOmq8PykUce0datW3Xw4EG1atVKV1xxhWrVqqX9+/dr2bJlmjp1qv777z/99NNPql69ukqWLKk+ffrojTfekCQ9+eST+uOPP9SyZUslJCRow4YN+v333zVv3jz17NlTHTp0kHRoqNjszsD09HS1aNFC3bp1C2rfkcj5A4Zly5Zpz549ef6a93i66667NHHiRBljtHLlSp122mm67LLLVK5cOaWnp2vhwoX6+eeftWfPHlcntNfbzq1Xr1569NFHnV+h33fffZoyZYrOPPNM7d27V7///rtKly7tdE7ec889zq+VZ8yYoQYNGujiiy9WiRIltG3bNs2bN0/Tp09XhQoVXF/kFFVH8/7J6Y8//nD+faTHLgAAcHy9++67Wrp0qWJjY3XmmWcedvmePXvqf//7n9OJ1LVrV/Xp00epqan64IMPnA4/n8+nO+64Q9Khq6+uu+4653P3tGnTdO6556pNmzaaMWOGc4VYbkd7fn60r0POK78uvvjioM8kgUDA9aPO0aNH65lnnlH9+vXVsWNHff3115IOfT/RsGFDdezYUQkJCVq0aJGmTZumrVu3SjrU6frKK684V/n16NFD48ePV6NGjbRjxw5NnTpVbdu21bPPPitJrtGLMjIy1LhxY51++umaMWOGM8Tr0apdu7bTCfrnn3/qqquuUt26dfXNN9/o999/D7lOx44dnav8JOnVV1/VvHnzdO6558oYo7lz52rz5s2aN2+ea72rr75a9957r3bs2OF8ByGF/oyan5yflbJ/GF2Yfv/9dy1dutR53KJFi6DbE0jSlClTnIxHjx59zJ2B//zzj+68807dc889uvDCC1WjRg1t3bpVH3/8sSv3a665xvkxbXR0tO677z7ddtttkg7dEiQQCKhevXr68MMPtWfPHkmHrqIN1b6c5/Gnn3560LCqAGCl432TQgD/58MPP3TdsPi9994LudyUKVNcyz377LPOvDfffNPExcXleWPmZ555xll23759pmPHjvneyHnHjh2ubYdapkaNGqZOnTrO45w3WV+9erVr2Z9++inkPt18880ht33eeee5buo+dOhQ13rDhg0zPp8vz/Z/9tlnQc+1detWk5CQ4FrupZdeOlw8QYYOHeqsf9111wXNz32z7LzWzT0v1E3S169fb6KiopzpN9xwQ8g2ZWRkmKSkJGe5Ll26OPNy3kg8983X85OWlpZvjSQkJJjx48cHrTd79mzXTehz/7Vv397s27cvaL3ly5c7yyQnJ5u9e/cWuK3GGJOZmRn0vOXKlQt50/j4+Ph896169erODcmNyf8G9vnJ7zmy/0qWLGkWLlzoWi9nZuedd17I9iYkJATd4H3GjBmmdOnSh33OnO/HPXv2mHbt2h12nZzvb2OMueKKK0Iu17ZtW9fj0aNHF/j1yrnfP/74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z1itVVt2h+X53333XZUqVco10oUkdenSRddee60k6ZVXXlHNmjUVFxen2rVra+zYsfluc+HChTr33HOVmJioUqVKqW/fvtq9+//a27x5c40cOVLdu3cP+aM6Sbrwwgv1yCOP6NJLL83zeapVq6bHHntMffr0UUpKiqpUqaLXX3+9oLvOezQCkC28wLEFXqL+4DVqEF6i/hApIqozUJIGDhyoN954Q++8846WLFmifv36ac+ePerdu7ck6brrrtN9993nLD9z5kxNmDBBq1at0i+//KILLrhAgUBAgwYNknTonjannXaa669YsWIqVaqUTjvtNE/20WvGGK1bty7ksEsoesjTPmRqF/K0D5napzAy/XHpZmXsO6iyKaE7xXIrmxKvjH0H9dPSzWF5/iuuuEJ+v19ffPGFM23z5s2aNGmS+vTpo88++0wDBgzQXXfdpb/++ks33XSTevfurZ9++ink9vbs2aMOHTqoRIkSmj17tj7++GP98MMP6t+/f1jam9tTTz2lZs2aad68ebrlllvUr18/1z0h88N71H5kCy9wbIGXqD94jRqEl6g/RIqI6wzs1q2bRo0apYceekiNGjXS/PnzNXnyZJUrV06S9M8//+jff/91ls/MzNSDDz6oevXq6dJLL1WlSpU0ffp0FS9e3KM9AAAAQCTbvf+gfljyn5Ljow97D8BsPp9PyXHR+n7Jf9q9/+AxtyExMVE9evTQ6NGjnWnvvfeeqlSporZt22rUqFHq1auXbrnlFp1yyikaOHCgLrvsMo0aNSrk9j744ANlZmbq3Xff1WmnnaZzzz1XL774osaOHRs0xH84dOzYUbfccotq1aqle++9V6VLl86zoxIAAAAAgKIuou4ZmK1///55/sp46tSprsdt2rTR4sWLj2j7ubcBAAAAhMs/2/Zq594DKl0s7ojWS0uM1dY9WVq3fa/qVjj2m6rfeOONat68uTZs2KBKlSppzJgx6tWrl3w+n5YsWaK+ffu6lm/VqpWee+65kNtasmSJGjZsqGLFirmWDwQCWrZsmfPDvXBp0KCB82+fz6fy5ctr8+bwXDUJAAAAAMCJJiI7A1H4UlJSvG4Cwog87UOmdiFP+5CpfcKZaeZBvwLGKDqqYFcFZouO8ilgjDIP+MPSjsaNG6thw4Z699131b59ey1atEiTJk0Ky7YLW2xsrOuxz+c7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cR8T+uSTT+r2229X//79tXDhQu3Zs0ebN2/WL7/8os2bN2vPnj364osvNGDAAN1xxx164oknTI+MMvj9ftMjIIzI0z5kahfytA+Z2odM7RIJeY4YMUILFy4s9/JvvvlGI0aMqMGJABwuL/JeokEUoX8wjQ7CJPqHaBBxZwb+3//9ny677DK9/PLLZV5et25d9ezZUz179pTP59MTTzyhv/71rzU7JA7K7/erY8eOpsdAmJCnfcjULuRpHzK1D5naJVLy9LyDf6fJrl27VKdOxD3dqxU8hxeDUPM8x6fNKZmmx0CUon8wjQ7CJPqHaBFxzw43bNigE088sUL7nnTSSXrjjTeqeSJUlud5KigoUGJiIt9VYgHytA+Z2oU87UOm9iFTu5jM83//+59+/PHH0N8///xz7d+/v9R+O3bs0DPPPKOjjjqqBqezyCEWWoFq4XmK2bdHRXXjJf6tQE2jfzCNDsIk+ocoEXFveWzdurX+85//VGjfOXPmqHXr1pX+GU899ZRatWqluLg49ejRQ99++225++7bt0/33nuvsrKyFBcXp86dO2v27NmHdZu2c11X2dnZcl3X9CgIA/K0D5nahTztQ6b2IVO7mMzznXfe0fDhwzV8+HA5jqNnn3029Pc//rnpppuUk5OjSZMm1fiMNnDEYiBqniNPKTs30T8YQf9gGh2ESfQP0SLizgy85ZZbdNVVV6mwsFDXX3+9unXrpsaNG4cu37ZtmxYtWqQpU6bo3//+t5577rlK3f7rr7+u0aNH65lnnlGPHj00efJk9e3bVytWrFBaWlqp/ceOHavXXntNzz//vNq1a6c5c+boL3/5ixYuXKiuXbtW6TYBAAAAoLKuvvpqnXvuufI8T8cdd5zuvfdenXXWWSX2cRxH9erVU1ZWFh8TCgAAAACQFIGLgVdccYX279+vsWPH6t///rek37+XIyYmRkVFRQoGg/I8TykpKXryySd1xRVXVOr2H330UV111VUaMWKEJOmZZ57RBx98oJdeekljxowptf+0adN055136uyzz5YkXXfddfrkk0/0yCOP6LXXXqvSbQIAAABAZTVt2lRNmzaVJM2bN0/t27fnzYcAAAAAgEOKuMVASbrmmms0bNgwzZs3Tz/88IN+++037dmzR/Hx8WratKm6dOmi0047TXFxcZW63aKiIn333Xf6+9//Htrm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jTlV5piKc9y5c6fWrVtnxTHZmBOPjezLqaLHdOBjo4SEBAEAAAAAEMkcL4rOfy0qKlJCQoJmzZqlAQMGhLYPGzZMO3bs0LvvvlvqOieeeKKOP/54PfTQQ6Ftr732mq6++mrt3LlTPp9PLVu21J///Ge98MILoX2mTJmi++67Txs3bixzlrLODMzIyFBubm7oSy5r67uqg8GgfvnlF2VmZspxnKh6p7iNx7R//3798ssvatmyperUqWPFMdmYU2WOqaioKJSp3++34phszKkyZwauW7dOLVq0kN/vt+KYbMypsmcGbtiwQS1btix11lFtPabiGW3KqTLHxGMju47pwMdGO3fu5MvqLREIBJScnKzc3Fw1bNjQ9DiIMsFgUOvWrVOrVq1KPKYDagL9g2l0ECbRv9qv+HE8z8kOLqrODIyJiVG3bt00d+7c0GKg67qaO3euRo4cWeZ1du/eHXphoVjxnULxCwS9evUq8Q5kSVq5cqVatmxZ7iyxsbGKjY0ttd3v95e60znw5x84R01udxynzO1/nNHv94fOVClPbTumw9le248pJiamVJ61/Ziqa8bKbjd1TGVlerD9a8Mx2ZhTZbYfeeSRZe5b3v614Zgqu92mY/L7/crKyipzv4PNGMnHVMymnIrx2MienCq6vbx/R2EPXgSCCYf69x+oTvQPptFBmET/EC3KfpZrsdGjR+v555/XK6+8omXLlum6667Trl27NGLECEnSZZddpr///e+h/fv166cpU6Zo5syZWrt2rT7++GONGzdO/fr1Cz1JvPnmm/X1119r4sSJWr16tWbMmKHnnntON9xwg5FjNM11XeXk5JR69zVqJ/K0D5nahTztQ6b2IVO7kKf9yBYmcN8Ck+gfTKODMIn+IVpE1ZmBkjRw4EBt3bpVd911l3JyctSlSxfNnj1bTZo0kSStX7++xDuBx44dK8dxNHbsWG3cuFGpqanq16+f7r///tA+xx57rN555x39/e9/17333qvWrVtr8uTJGjJkSI0fXyTwPE85OTlKTU01PQrCgDztQ6Z2IU/7kKl9yNQu5Gm/KPomDUQQ7ltgEv2DaXQQJtE/RIuoWwyUpJEjR5b7saDz588v8fc6depo/PjxGj9+/EFv89xzz9W5554brhEBAAAAAAAAAACAwxZ1HxMKAAAAAAAAAAAARAsWAxF2juMoJSVF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Pt17773KyspSXFycOnfurNmzZ9fgxKiIjRs3aujQoWrUqJHi4+PVsWNHLVq06KDXmT9/vv70pz8pNjZWRx55pF5++eWaGRYVUtlMf/vtNw0ePFhHHXWUfD6fbrrpppobFodU2Tzffvtt/fnPf1ZqaqqSkpJ0wgknaM6cOTU4MSrjqaeeUqtWrRQXF6cePXro22+/Pej+b775ptq1a6e4uDh17NiR5zE4LJXp3/PPP68TTzxRDRs2VMOGDdWnT59D9hU4mMre/xWbOXOmHMfRgAEDqndAWK2y/eO1RIRbZTvIa2WwEYuBqLQOHTrot99+C/354osvyt23qKhIf/7zn7Vu3TrNmjVLK1as0PPPP6/mzZvX4MQ4mMrk+fbbb5fY9+eff5bf79dFF11UgxPjUCqT6YwZMzRmzBiNHz9ey5Yt04svvqjXX39dd9xxRw1OjIOpTJ5jx47Vs88+qyeeeEJLly7Vtddeq7/85S/64YcfanBiHExeXp569eqlunXr6qOPPtLSpUv1yCOPqGHDhuVeZ+3atTrnnHN06qmn6scff9RNN92kK6+8ksWGCFGVTPfu3avU1FSNHTtWnTt3rsFpcShVyXPBggX685//rA8//FDfffedTj31VPXr14/73gj0+uuva/To0Ro/fry+//57de7cWX379tWWLVvK3H/hwoW65JJLdMUVV+iHH37QgAEDNGDAAP388881PDlsUNn+zZ8/X5dcconmzZunr776ShkZGTrjjDO0cePGGp4cNqhs/4qtW7dOt956q0488cQamhQ2qmz/eC0R4VbZDvJaGazlAZUwfvx4r3PnzhXef8qUKV5mZqZXVFRUfUOhyiqb54Eee+wxLzEx0du5c2f4hsJhqWymN9xwg3faaaeV2DZ69GivV69eYZ4MVVHZPJs2beo9+eSTJbadf/753pAhQ8I8Garq9ttv93r37l2p6/ztb3/zOnToUGLbwIEDvb59+4ZzNFRRVTL9o5NPPtm78cYbwzcQDsvh5lns6KOP9u65554wTIRwOu6447wbbrgh9PdgMOg1a9bMmzRpUpn7X3zxxd4555xTYluPHj28a665plrnhJ0q278D7d+/30tMTPReeeWV6hoRFqtK//bv3+/17NnTe+GFF7xhw4Z5/fv3r4FJYaPK9o/XEhFule0gr5XBVpwZiEpbtWqVmjVrpszMTA0ZMkTr168vd9/33ntPJ5xwgm644QY1adJExxxzjCZOnKhgMFiDE+NgKpPngV588UUNGjRI9erVq8YJUVmVybRnz5767rvvQh+PkJ2drQ8//FBnn312TY2LQ6hMnnv37lVcXFyJbfHx8Qc9mxA167333lP37t110UUXKS0tTV27dtXzzz9/0Ot89dVX6tOnT4ltffv21VdffVWdo6KCqpIpIlc48nRdVwUFBUpJSammKVEVRUVF+u6770rcn/p8PvXp06fc+1PufxEuVenfgXbv3q19+/Zx34JKq2r/7r33XqWlpemKK66oiTFhqar0j9cSEU5V6SCvlcFWLAaiUnr06KGXX35Zs2fP1pQpU7R27VqdeOKJKigoKHP/7OxszZo1S8FgUB9++KHGjRunRx55RPfdd18NT46yVDbPP/r222/1888/68orr6yBSVFRlc108ODBuvfee9W7d2/VrVtXWVlZOuWUU/jogwhR2Tz79u2rRx99VKtWrZLruvr4449DH++LyJCdna0pU6aoTZs2mjNnjq677jqNGjVKr7zySrnXycnJUZMmTUpsa9KkiQKBgPbs2VPdI+MQqpIpIlc48nz44Ye1c+dOXXzxxdU4KSpr27ZtCgaDZd6f5uTklHmd8u5/y9sfKE9V+neg22+/Xc2aNSu1QA0cSlX698UXX+jFF1/kDU44bFXpH68lIpyq0kFeK4Ot6pgeALXLWWedFfrvTp06qUePHmrZsqXeeOONMt8t5rqu0tLS9Nxzz8nv96tbt27auHGjHnroIY0fP74mR0cZKpvnH7344ovq2LGjjjvuuOoeE5VQ2Uznz5+viRMn6umnn1aPHj20evVq3XjjjZowYYLGjRtXk6OjDJXN8/HHH9dVV12ldu3ayXEcZWVlacSIEXrppZdqcmwchOu66t69uyZOnChJ6tq1q37++Wc988wzGjZsmOHpUBVkapfDzXPGjBm655579O677yotLa26xwUQJR544AHNnDlT8+fPL/UpEEC4FRQU6NJLL9Xzzz+vxo0bmx4HUYjXEmEar5XBViwG4rA0aNBARx11lFavXl3m5U2bNlXdunXl9/tD29q3b6+cnBwVFRUpJiampkZFBRwqz2K7du3SzJkzde+999bQZKiqQ2U6btw4XXrppaEzPDt27Khdu3bp6quv1p133imfjxPII8mh8kxNTdW//vUvFRYWavv27WrWrJnGjBmjzMzMGp4U5WnatKmOPvroEtvat2+vt956q9zrpKena/PmzSW2bd68WUlJSYqPj6+WOVFxVckUketw8pw5c6auvPJKvfnmm5y5E4EaN24sv99f5v1penp6mdcp7/63vP2B8lSlf8UefvhhPfDAA/rkk0/UqVOn6hwTlqps/9asWaN169apX79+oW2u60qS6tSpoxUrVigrK6t6h4Y1qnL/x2uJCKeqdJDXymArmovDsnPnTq1Zs0ZNmzYt8/JevXpp9erVoQeOkrRy5Uo1bdqUf7wj0KHyLPbmm29q7969Gjp0aA1Nhqo6VKa7d+8u9SCm+AG353nVPh8qp6L/j8bFxal58+bav3+/3nrrLfXv37+GJsSh9OrVSytWrCixbeXKlWrZsmW51znhhBM0d+7cEts+/vhjnXDCCdUyIyqnKpkiclU1z3/+858aMWKE/vnPf+qcc86pzhFRRTExMerWrVuJ+1PXdTV37txy70+5/0W4VKV/kvSPf/xDEyZM0OzZs9W9e/eaGBUWqmz/2rVrp8WLF+vHH38M/TnvvPN06qmn6scff1RGRkZNjo9arir3f7yWiHCqSgd5rQzW8oBKuOWWW7z58+d7a9eu9b788kuvT58+XuPGjb0tW7Z4nud5l156qTdmzJjQ/uvXr/cSExO9kSNHeitWrPD+/e9/e2lpad59991n6hDwB5XNs1jv3r29gQMH1vS4qIDKZjp+/HgvMTHR++c//+llZ2d7//nPf7ysrCzv4osvNnUI+IPK5vn11197b731lrdmzRpvwYIF3mmnnea1bt3ay8vLM3QEONC3337r1alTx7v//vu9VatWedOnT/cSEhK81157LbTPmDFjvEsvvTT09+zsbC8hIcG77bbbvGXLlnlPPfWU5/f7vdmzZ5s4BBygKpl6nuf98MMP3g8//OB169bNGzx4sPfDDz94S5YsqenxcYCq5Dl9+nSvTp063lNPPeX99ttvoT87duwwcQg4iJkzZ3qxsbHeyy+/7C1dutS7+uqrvQYNGng5OTme55X+d/XLL7/06tSp4z388MPesmXLvPHjx3t169b1Fi9ebOoQUItVtn8PPPCAFxMT482aNavEfUtBQYGpQ0AtVtn+HWjYsGFe//79a2ha2Kay/eO1RIRbZTvIa2WwFYuBqJSBAwd6TZs29WJiYrzmzZt7AwcO9FavXh26/OSTT/aGDRtW4joLFy70evTo4cXGxnqZmZne/fff7+3fv7+GJ0dZqpLn8uXLPUnef/7znxqeFhVR2Uz37dvn3X333V5WVpYXFxfnZWRkeNdffz2LRxGisnnOnz/fa9++vRcbG+s1atTIu/TSS72NGzcamBwH8/7773vHHHOMFxsb67Vr18577rnnSlw+bNgw7+STTy6xbd68eV6XLl28mJgYLzMz05s6dWrNDYxDqkqmkkr9admyZc0NjXJVNs+TTz65zDwPfAyFyPDEE094LVq08GJiYrzjjjvO+/rrr0OXlfXY94033vCOOuooLyYmxuvQoYP3wQcf1PDEsEll+teyZcsy71vGjx9f84PDCpW9//sjFgNxuCrbP15LRLhVpoO8VgZbOZ7Hua0AAAAAAAAAAACAjfjOQAAAAAAAAAAAAMBSLAYCAAAAAAAAAAAAlmIxEAAAAAAAAAAAALAUi4EAAAAAAAAAAACApVgMBAAAAAAAAAAAACzFYiAAAAAAAAAAAABgKRYDAQAAAAAAAAAAAEuxGAgAAAAAAAAAAABYisVAAEC12blzp6688kqlp6fLcRzddNNNpkeKePPnz5fjOJo/f77pUUrYuXOn0tLSNH369Br9uWPGjFGPHj1q9GcCAAAAAAAANmExEABQrpdfflmO42jRokVVuv7EiRP18ssv67rrrtO0adN06aWXhnnC2mH48OFyHOeQf4YPH2561HI9/vjjSkxM1KBBg2r0595000366aef9N5779XozwUAAABQOyxbtkyO4yguLk47duwoc59TTjmlxHOvlJQUHXvssXrppZfkum5ov7vvvrvM52pxcXFl3u6LL76o9u3bKy4uTm3atNETTzxRHYcIAMBhq2N6AACAvT799FMdf/zxGj9+vOlRjLrmmmvUp0+f0N/Xrl2ru+66S1dffbVOPPHE0PasrCz16NFDe/bsUUxMjIlRy7Rv3z49/vjjuvnmm+X3+2v0Z6enp6t///56+OGHdd5559XozwYAAAAQ+V577TWlp6crLy9Ps2bN0pVXXlnmfkcccYQmTZokSdq6dateffVVXXHFFVq5cqUeeOCBEvtOmTJF9evXD/29rOdBzz77rK699lpdcMEFGj16tD7//HONGjVKu3fv1u233x7GIwQA4PA5nud5pocAAESml19+WSNGjNB///tfde/evdLXz8zM1NFHH61///vfYZnHdV0VFRWV+67M2mLRokU69thjNXXq1Ig+G7DYO++8o/PPP1+rV69WVlZWjf/8t956SxdddJFWr16tzMzMGv/5AAAAACKT53nKzMzU+eefr7Vr1yovL0/z5s0rtd8pp5yibdu26eeffw5t2717t9q2bau8vDzl5eWpbt26uvvuu3XPPfdo69ataty4cbk/d8+ePcrIyNDxxx9f4vnu0KFD9a9//UsbNmxQw4YNw3uwAAAcBj4mFABQKcOHD1f9+vW1ceNGDRgwQPXr11dqaqpuvfVWBYNBSf/ve+/Wrl2rDz74IPTRKuvWrZMk7d27V+PHj9eRRx6p2NhYZWRk6G9/+5v27t1b4mc5jqORI0dq+vTp6tChg2JjYzV79mxJ0saNG3X55ZerSZMmio2NVYcOHfTSSy+VuH7xHG+88Ybuv/9+HXHEEYqLi9Ppp5+u1atXlzq2b775RmeffbYaNmyoevXqqVOnTnr88cdL7LN8+XJdeOGFSklJUVxcnLp37x7Wj7As6zsDTznlFB1zzDH63//+p5NPPlkJCQk68sgjNWvWLEnSZ599ph49eig+Pl5t27bVJ598Uup2K/L7Ks+//vUvtWrVqtRCYHEX1q9fr3PPPVf169dX8+bN9dRTT0mSFi9erNNOO0316tVTy5YtNWPGjBLX37dvn+655x61adNGcXFxatSokXr37q2PP/64xH7FZ1W+++67FZoXAAAAQOQr/kjOlStXaujQoUpOTlZqaqrGjRsnz/O0YcMG9e/fX0lJSUpPT9cjjzxS6ja+/PJLrVu3ToMGDdKgQYO0YMEC/frrrxX6+QkJCTr++OO1a9cubd26tcRlnucpEAiovHMo5s2bp+3bt+v6668vsf2GG27Qrl279MEHH1TwtwAAQM1gMRAAUGnBYFB9+/ZVo0aN9PDDD+vkk0/WI488oueee06S1L59e02bNk2NGzdWly5dNG3aNE2bNk2pqalyXVfnnXeeHn74YfXr109PPPGEBgwYoMcee0wDBw4s9bM+/fRT3XzzzRo4cKAef/xxtWrVSps3b9bxxx+vTz75RCNHjtTjjz+uI488UldccYUmT55c6jYeeOABvfPOO7r11pqVH2UAAKleSURBVFv197//XV9//bWGDBlSYp+PP/5Y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u7Yapvt9sXHEiBEaMWKEdu7cqZNOOkl33313qcXAtWvXqnPnztUyAwAAAIDa5e2331ZhYaGmTJlS6k2DK1as0NixY/Xll1+qd+/eh/2zPM/TunXr1LVr19C2Ll26SJIWLVqks88+O7R90aJFcl03dDkAAJGC7wwEANSoiy++WBs3btTzzz9f6rI9e/Zo165dB72+3+/XBRdcoLfeeks///xzqcu3bt1a6Zn+9Kc/qXXr1po8ebJ27NhR4rLid56mpaXplFNO0bPPPqvffvstLD+3JoTj93XCCSdo0aJFYZ/tjx/xI/3+vYhHHnmk9u7dW2J7fn6+1qxZo549e4Z9BgAAAAC1z2uvvabMzExde+21uvDCC0v8ufXWW1W/fn1Nnz690rdb1vOjKVOmaOvWrTrzzDND20477TSlpKRoypQppfZNSEjQOeecU/mDAgCgGnFmIACgRl166aV64403dO2112revHnq1auXgsGgli9frjfeeENz5sxR9+7dD3obDzzwgObNm6cePXroqquu0tFHH63c3Fx9//33+uSTT0p8fEtF+Hw+TZkyRf369VOXLl00YsQINW3aVMuXL9eSJUs0Z84cSdJTTz2l3r17q2PHjrrqqquUmZmpzZs366uvvtKvv/6qn376qcq/l+p0uL+v/v37a9q0aVq5cqWOOuqosM119NFH65RTTlG3bt2UkpKiRYsWadasWRo5cmSJ/T755BN5nqf+/fuH7WcDAAAAqJ02bdqkefPmadSoUWVeHhsbq759++rNN9/U//3f/6lu3boVvu2WLVtq4MCB6tixo+Li4vTFF19o5syZ6tKli6655prQfvHx8ZowYYJuuOEGXXTRRerbt68+//xzvfbaa7r//vuVkpJy2McJAEA4sRgIAKhRPp9P//rXv/TYY4/p1Vdf1TvvvKOEhARlZmbqxhtvrNBiU5MmTfTtt9/q3nvv1dtvv62nn35ajRo1UocOHfTggw9Waa6+fftq3rx5uueee/TII4/IdV1lZWXpqquuCu1z9NFHa9GiRbrnnnv08ssva/v27UpLS1PXrl111113Venn1oTD/X3169dPjRs31htvvKGxY8eGba5Ro0bpvffe03/+8x/t3btXLVu21H333afbbrutxH5vvvmmevfuHfo4VwAAAADRa+bMmXJdV/369St3n379+umtt97SRx99pPPOO6/Ctz1kyBAtXLhQb731lgoLC9WyZUv97W9/05133qmEhIQS+15//fWqW7euHnnkEb333nvKyMjQY489phtvvLHKxwYAQHVxvOLPPwMAACjHhAkTNHXqVK1atUp+v7/Gfm5OTo5at26tmTNncmYgAAAAAAAAUAV8ZyAAADikm2++WTt37tTMmTNr9OdOnjxZHTt2ZCEQAAAAAAAAqCLODAQAAAAAAAAAAAAsxZmBAAAAAAAAAAAAgKVYDAQAAAAAAAAAAAAsxWIgAAAAAAAAAAAAYCkWAwEAAAAAAAAAAABLsRgIAAAAAAAAAAAAWIrFQAAAAAAAAAAAAMBSLAYCAAAAAAAAAAAAlmIxEAAAAAAAAAAAALAUi4EAAAAAAAAAAACApVgMBAAAAAAAAAAAACzFYiAAAAAAAAAAAABgKRYDAQAAAAAAAAAAAEuxGAgAAAAAAAAAAABYisVAAAAAAAAAAAAAwFIsBgIAAAAAAAAAAACWYjEQAAAAAAAAAAAAsBSLgQCAajV58mR16tRJ8fHxchxHjuNowIABpseCBYr75DiOXn75ZdPjAAAAAKgG8+fPL/HYf926dRF1e4fSqlWr0M+6++67q/VnAQBQHhYDAQClngyFa2Hlueee080336zFixersLAwLLeJsv3666+66aab1KFDB9WrV0+xsbFKT09Xx44dNXDgQE2aNEl5eXmmxwQAAAAQYQ58Pug4js4777wy950zZ06pfYcPH16zAxvE8y4AQG1Vx/QAAAB7/fOf/wz9d4sWLXTVVVcpLi5Obdq0MTiVfb7//nuddtppys/PL7F98+bN2rx5s37++We98cYbOuuss9SwYUNDUwIAAACoLT744ANlZ2crMzOzxPbHH3/c0ETmVfV515133hm6Ts+ePWt0ZgAAirEYCACoNr/88kvovy+77DKNHTu22n9mQUGBEhMTq/3nRJLrr78+9OSyXr16GjhwoDIzM7Vv3z6tWrVKn3/+uTZs2GB4SgAAAAC1heu6evLJJ/Xoo4+Gtq1cuVKzZ882OJVZVX3eddVVV9X0qAAAlMLHhAIADurAj4zJzs7W008/rU6dOikuLk5paWm68sorS3wUyvDhw+U4jtauXRvadt9995X5MaSBQECTJk1Sjx49lJycrJiYGLVo0ULDhw/XkiVLSs1z9913h26nVatW2r59u2644QYdccQR8vv9evHFF8N22/n5+brtttvUsmVLxcTEKDMzUxMnTpTneaWu63meZs2apfPOO0/NmzdXbGysUlJS1LVrV40ePVpFRUUl9t+8ebPuuOMOdenSRYmJiYqLi9ORRx6pG264QevXr69wPoFAQN98803o70899ZRefPFF3Xnnnbr77rs1ffp0rV+/Xt9++62OOOKIEtc98LsrvvnmG51xxhlKTk5WYmKi+vbtq++++67Mn1uV+V3X1bRp03TGGWcoLS1NMTExSk1N1TnnnKMPP/ywzOvs379fDzzwgNq0aaPY2FhlZWXpvvvu0759+yr8OwIAAABQcT7f7y8XvvTSS9q1a1do+xNPPBF6LuT3+w96Gxs3btRtt92mjh07qn79+oqLi1OrVq00dOhQffvtt2VeZ/v27br22mvVpEkTxcfHq3v37nr99dcPOW9VnmdUVjifdxU75ZRTSn3k6oF/DvyOwXA9jwQARCEPABD15s2b50kK/Zk6dWq5l/Xu3bvE34v/nHTSSaHrDBs2rMx9Drz9lStXeq1atSp3v9jYWO+NN94oMev48eNDlzdu3Nhr165dies89thjYbntRo0aee3bty/zuuPGjStxvT179njnnHPOQY85Ly8vtP/ChQu9xo0bl7tvcnKyt2DBggplt3379hLXvfXWW739+/dX6LotW7YskWvdunVLzRIfH+99/vnnJa5Xlfl3797t9enT56C/o9GjR5eacdCgQWXue+Dv+4+dBQAAAFBxBz7nGzBgQOi/n3rqKc/zPC8/P99LTEz0JHldu3Yt8Vxi2LBhJW7vs88+8xo2bFju436fz+c98sgjJa6Tl5dX6rldeY/9165dG7peVZ5nHHi8f7y98oTredf48eND208++eSDzn3g/uF8HgkAiD58TCgAoFK++OILnX766erZs6f+9a9/afHixZKkBQsW6Ouvv9bxxx+vQYMG6ZhjjtHEiRNDZwz++c9/1hlnnCFJOvbYYxUMBvWXv/xF69atkySlpqZq8ODBSklJ0Zw5c7Rw4ULt3btXl112mbp161bquyokadu2bdq2bZv69OmjXr16aevWrWrSpElYbnv79u3Ky8vTZZddpmbNmumFF17Qtm3bJP3+PRljx45VTEyMJOmWW27RBx98ELpuRkaG/vKXvyg5OVlLlizRv//979BlgUBAAwYMCN1Wy5YtNXDgQMXHx2vWrFlasmSJ8vPzdcEFF2jVqlVKTk4+aB4pKSlq2bJl6CNZH374YU2dOlW9evVS165ddcIJJ+iUU05RbGzsIXM96qijdNFFF+nXX3/VtGnT5P5/7N17uFx1fS/+z5qdhA0hs8kFiMFoBBS8RMQbFa9QK6BV8IIV8W5Ljx6Lt3oO9aeC9xtW7cFavFHxUqxWtB5Bq1jEe4uojReQezAaIAnZE4IhMGv9/qDkEDN7rWEys9dkfV+v5+F5yJ7J5BPeb9ae7/7OWivP4/e//328+MUvjksvvTQmJiYGnv/Vr351fPOb34yIiHnz5sVznvOcuO997xurVq2Kz3/+81EURfzt3/5tPOxhD4vnPve5ERHxhS98Ic4555xtMx544IHx7Gc/O9asWROf+tSnSv8+AADAYE488cT47ne/G+vWrYszzjgjXv7yl8dZZ50VmzZtioiIk08+eYcz1u60cePGeMYznrFtHbj77rvHi1/84mi32/FP//RPce2110ae5/HXf/3X8bCHPSwe//jHR0TEG97whrj00ku3vc7jH//4ePzjHx/f+973tltr/aFB1hmDGNa6665e9rKXxZ/+6Z9u97XPfOYz8dOf/nTbrx/4wAdGxPDXkQAkqO7dSADqd3fODHz6059e5HleFMUdn46cmJjY9tjf/d3fbfe6M30CsiiK4stf/vK2xyYmJopf//rX2x67/fbbi5UrV257/NWvfvW2x+569l5EFK961at2+PsM67U/8IEPbHvsS1/60naP/dd//VdRFEWxYcOGYs6cOdu+fuihhxabNm3abp7Vq1cXW7duLYqiKD74wQ9ue+7ChQuL9evXb3vezTffXOy9997bHv/gBz/YO7A/8MUvfrHIsqz0E6JvfvObd/jk6l3zWbJkSbFx48Ztj7397W/f7jW+8Y1vDDz/+vXrt/tv9IlPfGK7OV7+8pdv99/vTkcdddR2f4e7/ll/OJ8zAwEAYDB/uOb7yle+Urz+9a/f9uuvfe1rxYEHHlhERLH33nsXW7ZsmfHMwPe///3bvdZ555237bHrr7++2HPPPbc9duyxxxZFURS33Xbbdl9/3OMeV3S73aIoiiLP8+JJT3pSzzP5Bl1nDHJmYFEMZ931h+viuzr77LO3e/03v/nN2x4bxToSgLS4ZyAAd8vLXvayyLIsIu74dOSSJUu2PXbX+wZW+d73vrft37vdbtzvfvfbdl+EOXPmbDvjMCLi+9///oyv84Y3vGEkrz0xMRF/+Zd/ue3XBx100HaP3/l3/eEPfxi33377tq+fcsopseeee2733OXLl8fcuXN3mO2mm26KxYsXb5ttzz33jBtvvLGvv/ddPf3pT49vfetbceSRR267v8ddTU9Px6mnnhpvfetbZ3yNpz3tadt9evR5z3vedo/fee/AQeb/0Y9+tN1/o5e85CXb3Qfj7//+77c99tOf/jRuueWWiIi4+OKLt3396KOPjkWLFs04HwAAMDwvf/nLY86cOy4o9tKXvjSuuOKKiIg46aSTSs9++8EPfrDt3/fee+845phjtv16n3322e7Xdz730ksvjZtvvnnb10844YRt65osy+LEE0/s+WcNus4Y1DDWXTM5//zz4yUvecm2ezK+7GUvize96U3bHh/FOhKAtNgMBOBuWbFixXa/vutCMM/zvl9nw4YNfT/3rgubu1qyZEksXrx4JK+97777xuTk5LZf/+GC986/6x/+Wfe5z31K/7xhzNbLE57whLjgggtiw4YNcf7558dpp50WD3/4w7d7zvvf//4Zf/8+++yz3a/33Xff7X69cePGiBhs/rvze4qiiPXr12/3Z/YzHwAAMDz77bdfPPOZz4yIiDVr1kRExNy5c+PlL3956e+763v/Xu/Z7/q1Oz9gedf3/RH9v/cfdJ2xM3Z23dXLD3/4w3jWs561bWPzWc96VpxxxhnbPWdU60gA0uGegQDcLXee4XanO88SvLvuepbX5ORk6acnZ7rfwfz580f22v3+Pe/6Z0VEXH311fGIRzxixj/vrs+/xz3uEa95zWtmfO7y5ctnfGwmU1NTcfTRR8fRRx8dp556arz0pS+NT3ziExFxx30mrr/++p6L6RtuuGG7X19//fXb/XqvvfYaeP4//G/06le/OpYtW1b6d7jzz7xzwV41HwAAMFyvfOUr43Of+9y2Xz/zmc8sfR8fsf17/17v2e/6tYULF0bE/1tr3Knf9/6DrjOGYdB11x+69NJL40//9E+3nbV4xBFHxKc//ekdzjwc9ToSgOazGQhALQ4//PBt/75ly5Z44AMfuN0lY+70ox/96G7dhH3Ur/2H/uiP/ijmzJmz7VOc7373u+NP//RPY4899tj2nN/+9rex9957x9y5c+Pwww+Pf/7nf46IOz6x+aQnPSke/OAHb/eaRVHEBRdcEAcccEBfM7zwhS+Mk08+OR72sIft8NhdL1naarViwYIFPV/jX//1X6PT6US73Y6IiE9/+tPbPX7naw8y/2GHHRYTExPR7XYj4o6N1r/+67/eYYZrrrkmLrvssm0zPPzhD4+vf/3rERHxta99LTZs2LBtEfyH8wEAAMP1qEc9Kh7xiEfEf/7nf0ZExMknn1z5e/5wvXD++edvW4vdcMMNcf7552/33IiIgw8+OPbcc89tlwr9p3/6pzjppJOi1WpFURTxmc98puefNeg6Y1DDWHfd1W9+85t40pOetO0DkA95yEPiS1/6Us816ijWkQCkxWYgALV4ylOeEve///3jV7/6VUREHHfccfGMZzwjHvCAB0Se53HllVfGRRddFNdee22cddZZ8ZCHPGQsXvsPLVy4ME466aRt96O45JJL4gEPeEAcd9xxsddee8Wvf/3rOPfcc+N3v/td7LXXXvGiF70o3va2t8W6devi9ttvj0c/+tFx/PHHx4EHHhi33nprXHbZZXHhhRfG9ddfH//+7/9eednRiIizzz47zj777DjggAPiMY95TOy///6RZVn87Gc/iy9+8Yvbnve4xz1uu03Ku1q3bl084hGPiOOPPz5+85vfxKc+9altjx1wwAFxxBFHREQMNP+iRYviJS95SXz0ox+NiIj3vOc9cfHFF8fhhx8ek5OTsWbNmvjhD38YP/nJT+KFL3xhHHXUURFxx71J7twMnJ6ejsMOOyz+7M/+bIf5AACA0Tj77LPj0ksvjblz58ajHvWoyue/8IUvjLe+9a3bNrie+cxnxkte8pJot9vx2c9+dtuGX5Zl8apXvSoiIubMmRMveMELtq2pLrroojjyyCPj8Y9/fHzve9+LCy64oOefNeg6Y2f+W+zsuuuujjrqqLjuuuu2/fqP//iP4yMf+ch2zzn88MPj8MMPH8k6EoC02AwEoBZz5syJL33pS3HUUUfFNddcE1u3bo1zzjln7F+7l/e9731xzTXXxHnnnRcREddee2188IMf7Pncqamp+PKXvxzHHntsrFu3Lm6++eY466yzhjLHlVdeGVdeeWXPxxYtWhT/5//8nxl/7x//8R/Hd7/73Xj729++3dcnJyfjE5/4RExMTOzU/B/4wAfi6quvjm9+85sREfGtb30rvvWt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uTJuuOGGWLZsWbzoRS+KN7zhDTusoXaGNdnsKdw0kB6KKGLL1Bb9YEY6Qhn9oIx+UEVHdh2nnXZavPnNb97ua2Vrzo9+9KNx9tlnx89//vOIiHjYwx4W73jHO+KRj3zktufMtK58z3veE6973ev6nq2vzcCzzjqr7xesU5Zlce6558Zxxx1X9ygDG+i6rewyWhGx9Kab6h6DEZNzGuScDlmnQc5pyLIsHvjAB8Y3v/nNbV+bM2fmJdFnP/vZOOWUU+ITn/hEHH744fHrX/86XvSiF0WWZfG3f/u3ERHx/ve/PyIiTj/99HjEIx4RF198cbz4xS+OqampOPnkk4c2uzXZLHIrFnppRWzed3PdUzDOdIQy+kEZ/aCKjuxS7s6a88ILL4wTTjghDj/88JicnIx3v/vd8aQnPSl+8YtfxH777RcREb/73e+2+z3nn39+vPSlL41nPvOZd2uuvjYDX/jCF96tF91V/OIXv4g3velN8eMf/ziuvfbaeP/73x+vetWrtnvORRddFO9973vjxz/+cfzud78b+cI2H9krMw7yiLhh4cLY56abbPw2mJzTIOd0yDoNck5DURRRFEXss88+0WpVJ/39738/Hv3oR8dzn/vciIhYsWJFnHDCCfGjH/1o23P+4z/+IyIijjrqqGi327FixYr4p3/6p21fHxZrstlbk/nANT3lEfNvnB+b997sU7z0piOU0Q/K6AdVdGSXMmfOnFi6dGlfz/3MZz6z3a8/9rGPxb/8y7/EBRdcEC94wQsiInZ4rS9/+ctxxBFHxP7773+35hqoOrfffnt0Op0ZH+90OnH77bcP8tKz6pZbbon9998/3vWud80YzubNm+OQQw6JD33oQ7MyUzHESwkxfoosi+n58+XccHJOg5zTIes0yDkNRVHEVVddFfe85z1j//33jxNPPDFWr1494/MPP/zw+PGPf7xtY++qq66K8847L5785Cdve86dl2+54oorIiLiZz/7WXz3u9+NY445ZoR/E2uyUcqcGkgPWWQxOT2pH8xIRyijH5TRD6royK7l8ssvj2XLlvW15vxDt9xyS9x2222xaNGino9ff/318dWvfjVe+tKX3u25BtoMPPnkk+Pwww+f8fFHP/rR8drXvvZuvebZZ58dixcvjltvvXW7rx933HHx/Oc/PyIiPvzhD8cBBxwQ8+bNi4MOOig+9alPlb7mqlWr4sgjj4zdd989Fi9eHCeddFLcfPPN2x5/xCMeEe9973vjOc95Tuy22249X+OYY46Jt73tbfH0pz99xj9nxYoV8Y53vCNe8pKXxIIFC+Je97pXfOQjH+n3rw4AAMyCRz7ykfGWt7wlvvrVr8aHP/zhuPrqq+Oxj31sbNq0qefzn/vc58Zb3vKWeMxjHhNz586NAw44IJ7whCfE61//+m3Pec1rXhMRd9zTb+7cuXHooYfGq171qjjxxBNH+nexJtueNRkAAFC3ww47LP7xH/8xvva1r/W15vxD//t//+9YtmxZPPGJT+z5+Cc/+clYsGBBPOMZz7jbsw20Gfi1r30tnvWsZ834+LOe9aw477zz7tZrHn/88dHtduNf//Vft33thhtuiK9+9avxkpe8JM4999x45StfGa997Wvj5z//efzlX/5lvPjFL45///d/7/l6mzdvjqOOOioWLlwY//mf/xmf//zn45vf/Ga84hWvuFtz9et973tfPPzhD4+f/OQn8fKXvzxe9rKXxWWXXTbj82+99dbodDrb/QMAAIzOMcccE3/yJ38SD37wg+Ooo46K8847LzZu3Bj//M//3PP5F154YbzjHe+Iv//7v49LLrkkvvjFL8ZXv/rVeOtb37rtOV/84hcj4o7LuVxyySXxyU9+Mk4//fT45Cc/OdK/izXZjqzJAACAOh1zzDFx/PHH973mvKt3vetdcc4558S5554bk5OTPZ/ziU98Ik488cQZHy8z0Gbgb3/72203L+xl2bJlsWbNmrv1mrvvvns897nPjbPOOmvb1z796U/Hve51r3jCE54Qp59+erzoRS+Kl7/85XG/+90vXvOa18QznvGMOP3003u+3mc/+9nYsmVLnH322fGgBz0ojjzyyDjjjDPiU5/6VFx//fV3a7Z+PPnJT46Xv/zlceCBB8b//t//O5YsWTLjojgi4p3vfGdMTU1t+2f58uUREZEVblDRZFlRxOJOR84NJ+c0yDkdsk6DnNOQZVksXbo0sv++HOxee+0V97vf/bZd4vMPvfGNb4znP//58ed//uexcuXKePrTnx7veMc74p3vfGfk+R13+37Tm94UEXdsvq1cuTKe//znx6tf/ep45zvfOdK/izXZjoa1JivcNJAeiqyIWxbfEkWmH/SmI5TRD8roB1V0ZNdVtea80+mnnx7v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AEBD2QwEAAAAAACAhrIZCAAAAAAAAA1lM3AMfOhDH4oVK1bE5ORkHHbYYfEf//EfdY/EkF100UXx1Kc+NZYtWxZZlsWXvvSlukdiBN75znfGIx7xiFiwYEHss88+cdxxx8Vll11W91gM2Yc//OF48IMfHO12O9rtdjzqUY+K888/v+6xGLF3vetdkWVZvOpVr6p7FIbotNNOiyzLtvvn4IMPrnssRmDNmjXxvOc9LxYvXhy77757rFy5Mi6++OK6x2LMWJfRi7UcZawBqWL9yN1h3cldWa8ybDYDa/a5z30uXvOa18Spp54al1xySRxyyCFx1FFHxQ033FD3aAzR5s2b45BDDokPfehDdY/CCH3729+O//k//2f88Ic/jG984xtx2223xZOe9KTYvHlz3aMxRPe85z3jXe96V/z4xz+Oiy++OI488sg49thj4xe/+EXdozEi//mf/xlnnnlmPPjBD657FEbggQ98YPzud7/b9s93v/vdukdiyG666aZ49KMfHXPnzo3zzz8/fvnLX8b73ve+WLhwYd2jMUasy5iJtRxlrAGpYv1Iv6w76cV6lWHKiqIo6h4iZYcddlg84hGPiDPOOCMiIvI8j+XLl8df/dVfxSmnnFLzdIxClmVx7rnnxnHHHVf3KIzYjTfeGPvss098+9vfjsc97nF1j8MILVq0KN773vfGS1/60rpHYchuvvnmeOhDHxp///d/H29729viIQ95SHzgAx+oeyyG5LTTTosvfelL8dOf/rTuURihU045Jb73ve/Fd77znbpHYYxZl9EPazmqWAPSD+tH/pB1J71YrzJszgys0datW+PHP/5xPPGJT9z2tVarFU984hPjBz/4QY2TAcMwPT0dEXe80aeZut1unHPOObF58+Z41KMeVfc4jMD//J//M57ylKds972aZrn88stj2bJlsf/++8eJJ54Yq1evrnskhuxf//Vf4+EPf3gcf/zxsc8++8Shhx4aH/3oR+seizFiXQYMizUgZawfmYl1JzOxXmWY5tQ9QMrWrVsX3W439t133+2+vu+++8all15a01TAMOR5Hq961avi0Y9+dDzoQQ+qexyGbNWqVfGoRz0qtmzZEnvuuWece+658YAHPKDusRiyc845Jy655JL/v707j6rqOvs4/mOQIUjAAYelgiJRcR4giGjUUGPUoCaliANBYmyT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\n"},"metadata":{}},{"output_type":"stream","name":"stdout","text":["✓ Comparison visualizations saved to 'outputs/comparison_results/model_comparison_summary.png'\n","\n","================================================================================\n","BEST MODEL RECOMMENDATIONS\n","================================================================================\n","\n","🏆 Best Accuracy (mAP50): yolo11n (Dataset: dataset)\n"," mAP50: 0.8970\n"," Inference: 5.88 ms\n"," Size: 5.27 MB\n","\n","⚡ Fastest Inference: yolo11n (Dataset: dataset)\n"," Inference: 5.88 ms\n"," mAP50: 0.8970\n"," Size: 5.27 MB\n","\n","⚖️ Best Balance (Accuracy/Speed): yolo11n (Dataset: dataset)\n"," Balance Score: 0.1526\n"," mAP50: 0.8970\n"," Inference: 5.88 ms\n"," Size: 5.27 MB\n","\n","📦 Smallest Model: yolo11n (Dataset: dataset)\n"," Size: 5.27 MB\n"," mAP50: 0.8970\n"," Inference: 5.88 ms\n","\n","================================================================================\n","FINAL RECOMMENDATION FOR REAL-TIME MOBILE DETECTION\n","================================================================================\n","\n","✅ RECOMMENDED: yolo11n on dataset\n"," Reason: Best speed with acceptable accuracy for real-time mobile applications.\n"," mAP50: 0.8970\n"," Inference Time: 5.88 ms\n"," Model Size: 5.27 MB\n"," Trained Model Path: /content/runs/detect/runs/all_trainings/yolo11n_dataset/weights/best.pt\n","================================================================================\n"]}],"source":["import pandas as pd\n","import matplotlib.pyplot as plt\n","from pathlib import Path\n","\n","# 1. Convert the all_results_for_comparison list into a pandas DataFrame\n","if all_results_for_comparison:\n"," df_comparison = pd.DataFrame(all_results_for_comparison)\n","else:\n"," print(\"No comparison results found. Please ensure the training and export loop ran successfully.\")\n"," df_comparison = pd.DataFrame()\n","\n","if not df_comparison.empty:\n"," # 2. Display the entire df_comparison DataFrame\n"," print(\"\\n\" + \"=\"*80)\n"," print(\"MODEL COMPARISON TABLE\")\n"," print(\"=\"*80)\n"," print(df_comparison.to_string(index=False))\n"," print(\"=\"*80)\n","\n"," # Define outputs directory and create it if it doesn't exist\n"," outputs_dir = Path('outputs')\n"," outputs_dir.mkdir(parents=True, exist_ok=True)\n","\n"," # 3. Save the df_comparison DataFrame to a CSV file\n"," csv_path = outputs_dir / 'model_comparison_results.csv'\n"," df_comparison.to_csv(csv_path, index=False)\n"," print(f\"\\n✓ Comparison results saved to '{csv_path}'\")\n","\n"," # 4. Create a new directory named 'comparison_results' inside the 'outputs' directory\n"," comparison_plots_dir = outputs_dir / 'comparison_results'\n"," comparison_plots_dir.mkdir(parents=True, exist_ok=True)\n"," print(f\"✓ Comparison plots will be saved to '{comparison_plots_dir}'\")\n","\n"," # 5. Generate comparative visualizations\n"," print(\"\\nGenerating comparative visualizations...\")\n","\n"," # Add a 'Model Size (MB)' column if not present, useful for scatter plot dot sizes\n"," if 'Trained Model Path' in df_comparison.columns:\n"," df_comparison['Model Size (MB)'] = df_comparison['Trained Model Path'].apply(lambda x: round(Path(x).stat().st_size / (1024 * 1024), 2) if Path(x).exists() else 0.0)\n"," else:\n"," df_comparison['Model Size (MB)'] = 0.0\n","\n"," fig, axes = plt.subplots(2, 2, figsize=(18, 14))\n"," fig.suptitle('Model Comparison Analysis', fontsize=20, fontweight='bold')\n","\n"," # a. Scatter plot: Accuracy (mAP50) vs. Inference Time (ms) with marker size representing Model Size (MB)\n"," ax1 = axes[0, 0]\n"," # Scale marker size for better visualization\n"," size_scale_factor = 20 # Adjust this factor as needed\n"," for idx, row in df_comparison.iterrows():\n"," ax1.scatter(row['Inference Time (ms)'], row['mAP50'], s=row['Model Size (MB)'] * size_scale_factor, alpha=0.7, label=row['model_architecture'])\n"," ax1.set_xlabel('Inference Time (ms)', fontsize=12)\n"," ax1.set_ylabel('mAP50', fontsize=12)\n"," ax1.set_title('Accuracy (mAP50) vs. Speed (Inference Time)', fontsize=14, fontweight='bold')\n"," ax1.grid(True, linestyle='--', alpha=0.6)\n"," ax1.legend(title='Model', loc='best', fontsize=10)\n","\n"," # b. Bar chart: mAP50\n"," ax2 = axes[0, 1]\n"," df_comparison.sort_values(by='mAP50', ascending=True, inplace=False).plot(x='model_architecture', y='mAP50', kind='barh', ax=ax2, legend=False, color='skyblue')\n"," ax2.set_xlabel('mAP50', fontsize=12)\n"," ax2.set_ylabel('Model Architecture', fontsize=12)\n"," ax2.set_title('Model Accuracy (mAP50)', fontsize=14, fontweight='bold')\n"," ax2.grid(axis='x', linestyle='--', alpha=0.6)\n"," for i, v in enumerate(df_comparison.sort_values(by='mAP50', ascending=True, inplace=False)['mAP50']):\n"," ax2.text(v + 0.01, i, str(v), color='black', va='center')\n","\n"," # c. Bar chart: Inference Time (ms)\n"," ax3 = axes[1, 0]\n"," df_comparison.sort_values(by='Inference Time (ms)', ascending=False, inplace=False).plot(x='model_architecture', y='Inference Time (ms)', kind='barh', ax=ax3, legend=False, color='lightcoral')\n"," ax3.set_xlabel('Inference Time (ms)', fontsize=12)\n"," ax3.set_ylabel('Model Architecture', fontsize=12)\n"," ax3.set_title('Inference Speed', fontsize=14, fontweight='bold')\n"," ax3.grid(axis='x', linestyle='--', alpha=0.6)\n"," for i, v in enumerate(df_comparison.sort_values(by='Inference Time (ms)', ascending=False, inplace=False)['Inference Time (ms)']):\n"," ax3.text(v + 0.1, i, str(v), color='black', va='center')\n","\n"," # d. Bar chart: Model Size (MB)\n"," ax4 = axes[1, 1]\n"," df_comparison.sort_values(by='Model Size (MB)', ascending=True, inplace=False).plot(x='model_architecture', y='Model Size (MB)', kind='barh', ax=ax4, legend=False, color='lightgreen')\n"," ax4.set_xlabel('Size (MB)', fontsize=12)\n"," ax4.set_ylabel('Model Architecture', fontsize=12)\n"," ax4.set_title('Model Size', fontsize=14, fontweight='bold')\n"," ax4.grid(axis='x', linestyle='--', alpha=0.6)\n"," for i, v in enumerate(df_comparison.sort_values(by='Model Size (MB)', ascending=True, inplace=False)['Model Size (MB)']):\n"," ax4.text(v + 0.5, i, str(v), color='black', va='center')\n","\n"," plt.tight_layout(rect=[0, 0.03, 1, 0.95]) # Adjust layout to prevent title overlap\n"," plot_path = comparison_plots_dir / 'model_comparison_summary.png'\n"," plt.savefig(plot_path)\n"," plt.show()\n"," plt.close(fig)\n"," print(f\"✓ Comparison visualizations saved to '{plot_path}'\")\n","\n"," # 6. Provide recommendations\n"," print(\"\\n\" + \"=\"*80)\n"," print(\"BEST MODEL RECOMMENDATIONS\")\n"," print(\"=\"*80)\n","\n"," # a. Best accuracy (mAP50)\n"," best_map50 = df_comparison.loc[df_comparison['mAP50'].idxmax()]\n"," print(f\"\\n🏆 Best Accuracy (mAP50): {best_map50['model_architecture']} (Dataset: {best_map50['dataset_alias']})\")\n"," print(f\" mAP50: {best_map50['mAP50']:.4f}\")\n"," print(f\" Inference: {best_map50['Inference Time (ms)']:.2f} ms\")\n"," print(f\" Size: {best_map50['Model Size (MB)']:.2f} MB\")\n","\n"," # b. Fastest inference\n"," fastest = df_comparison.loc[df_comparison['Inference Time (ms)'].idxmin()]\n"," print(f\"\\n⚡ Fastest Inference: {fastest['model_architecture']} (Dataset: {fastest['dataset_alias']})\")\n"," print(f\" Inference: {fastest['Inference Time (ms)']:.2f} ms\")\n"," print(f\" mAP50: {fastest['mAP50']:.4f}\")\n"," print(f\" Size: {fastest['Model Size (MB)']:.2f} MB\")\n","\n"," # c. Best balance (mAP50 / (Inference Time (ms) + 1))\n"," # Add a small constant to inference time to avoid division by zero and make it more robust\n"," df_comparison['Balance Score'] = df_comparison['mAP50'] / (df_comparison['Inference Time (ms)'] + 1e-6) # Add small epsilon\n"," best_balance = df_comparison.loc[df_comparison['Balance Score'].idxmax()]\n"," print(f\"\\n⚖️ Best Balance (Accuracy/Speed): {best_balance['model_architecture']} (Dataset: {best_balance['dataset_alias']})\")\n"," print(f\" Balance Score: {best_balance['Balance Score']:.4f}\")\n"," print(f\" mAP50: {best_balance['mAP50']:.4f}\")\n"," print(f\" Inference: {best_balance['Inference Time (ms)']:.2f} ms\")\n"," print(f\" Size: {best_balance['Model Size (MB)']:.2f} MB\")\n","\n"," # d. Smallest model\n"," smallest = df_comparison.loc[df_comparison['Model Size (MB)'].idxmin()]\n"," print(f\"\\n📦 Smallest Model: {smallest['model_architecture']} (Dataset: {smallest['dataset_alias']})\")\n"," print(f\" Size: {smallest['Model Size (MB)']:.2f} MB\")\n"," print(f\" mAP50: {smallest['mAP50']:.4f}\")\n"," print(f\" Inference: {smallest['Inference Time (ms)']:.2f} ms\")\n","\n"," print(\"\\n\" + \"=\"*80)\n"," print(\"FINAL RECOMMENDATION FOR REAL-TIME MOBILE DETECTION\")\n"," print(\"=\"*80)\n","\n"," # e. Final recommendation for real-time mobile detection\n"," # Prioritize speed while ensuring reasonable accuracy (e.g., mAP50 > 0.2, adjust threshold as needed)\n"," # Also consider if we trained on multiple datasets, which dataset performed best for the recommended model\n"," good_accuracy_models = df_comparison[df_comparison['mAP50'] > 0.2].copy()\n"," if not good_accuracy_models.empty:\n"," # Recommend the fastest among models with good accuracy\n"," recommended_model = good_accuracy_models.loc[good_accuracy_models['Inference Time (ms)'].idxmin()]\n"," print(f\"\\n✅ RECOMMENDED: {recommended_model['model_architecture']} on {recommended_model['dataset_alias']}\")\n"," print(f\" Reason: Best speed with acceptable accuracy for real-time mobile applications.\")\n"," print(f\" mAP50: {recommended_model['mAP50']:.4f}\")\n"," print(f\" Inference Time: {recommended_model['Inference Time (ms)']:.2f} ms\")\n"," print(f\" Model Size: {recommended_model['Model Size (MB)']:.2f} MB\")\n"," print(f\" Trained Model Path: {recommended_model['Trained Model Path']}\")\n"," else:\n"," print(\"No models achieved sufficient accuracy (mAP50 > 0.2) to provide a specific real-time mobile recommendation.\")\n"," print(\"Please review training parameters or dataset quality.\")\n"," print(\"=\"*80)\n","else:\n"," print(\"DataFrame for comparison is empty. No comparison or recommendations can be made.\")"]},{"cell_type":"markdown","metadata":{"id":"122f702d"},"source":["## Output Archiving and Downloading"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"d6847668","colab":{"base_uri":"https://localhost:8080/","height":321},"executionInfo":{"status":"ok","timestamp":1775419685754,"user_tz":-180,"elapsed":651,"user":{"displayName":"Nathan Holland","userId":"13994014446134761485"}},"outputId":"e5f518ac-30bb-4d28-b718-5fbe2b6b2427"},"outputs":[{"output_type":"stream","name":"stdout","text":["Consolidating all artifacts into 'outputs'...\n","Moved 'runs/all_trainings' to 'outputs/all_trainings'\n","Dataset analysis outputs already within 'outputs/dataset'. No additional move needed.\n","\n","Copying exported model files to 'outputs/models'...\n"," ✓ Copied TFLite: yolo11n_dataset_dataset.tflite (11.02 MB)\n"," ✓ Copied CoreML: yolo11n_dataset_dataset.mlpackage (5.19 MB)\n","\n","✓ Successfully copied 2 model file(s) to 'outputs/models'\n"," Models are ready for use in your Android/iOS project:\n"," - TFLite files (.tflite) → Android assets folder\n"," - CoreML files (.mlpackage) → iOS Xcode project\n"," - The _metadata.txt file contains model information for TFLite models.\n","Creating zip archive 'outputs.zip'...\n","Archive 'outputs.zip' created successfully.\n","Downloading 'outputs.zip'...\n"]},{"output_type":"display_data","data":{"text/plain":["<IPython.core.display.Javascript object>"],"application/javascript":["\n"," async function download(id, filename, size) {\n"," if (!google.colab.kernel.accessAllowed) {\n"," return;\n"," }\n"," const div = document.createElement('div');\n"," const label = document.createElement('label');\n"," label.textContent = `Downloading \"${filename}\": `;\n"," div.appendChild(label);\n"," const progress = document.createElement('progress');\n"," progress.max = size;\n"," div.appendChild(progress);\n"," document.body.appendChild(div);\n","\n"," const buffers = [];\n"," let downloaded = 0;\n","\n"," const channel = await google.colab.kernel.comms.open(id);\n"," // Send a message to notify the kernel that we're ready.\n"," channel.send({})\n","\n"," for await (const message of channel.messages) {\n"," // Send a message to notify the kernel that we're ready.\n"," channel.send({})\n"," if (message.buffers) {\n"," for (const buffer of message.buffers) {\n"," buffers.push(buffer);\n"," downloaded += buffer.byteLength;\n"," progress.value = downloaded;\n"," }\n"," }\n"," }\n"," const blob = new Blob(buffers, {type: 'application/binary'});\n"," const a = document.createElement('a');\n"," a.href = window.URL.createObjectURL(blob);\n"," a.download = filename;\n"," div.appendChild(a);\n"," a.click();\n"," div.remove();\n"," }\n"," "]},"metadata":{}},{"output_type":"display_data","data":{"text/plain":["<IPython.core.display.Javascript object>"],"application/javascript":["download(\"download_deb39c93-c107-4a4d-98ae-d0d5e9d87f53\", \"outputs.zip\", 17830490)"]},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Download initiated.\n"]}],"source":["import os\n","import shutil\n","from pathlib import Path\n","# The import for google.colab.drive is removed as per user request.\n","\n","# Ensure the base 'outputs' directory exists\n","outputs_base_dir = Path('outputs')\n","outputs_base_dir.mkdir(parents=True, exist_ok=True)\n","\n","print(f\"Consolidating all artifacts into '{outputs_base_dir}'...\")\n","\n","# Move the 'runs/all_trainings' directory into the 'outputs' directory\n","try:\n"," trainings_run_source = Path('runs/all_trainings')\n"," if trainings_run_source.exists():\n"," destination_path = outputs_base_dir / 'all_trainings'\n"," if destination_path.exists():\n"," shutil.rmtree(destination_path)\n"," shutil.copytree(trainings_run_source, destination_path)\n"," print(f\"Moved '{trainings_run_source}' to '{destination_path}'\")\n"," else:\n"," print(f\"Warning: '{trainings_run_source}' not found. Skipping move.\")\n","except Exception as e:\n"," print(f\"Error moving training runs: {e}\")\n","\n","# Also move the dataset-specific analysis directories created earlier\n","# These are typically within outputs/dataset_alias/dataset_analysis\n","for dataset_info in prepared_datasets_info:\n"," dataset_output_dir = dataset_info['output_dir'] # e.g., outputs/basketball_dataset\n"," if dataset_output_dir.exists():\n"," # Just ensure these exist within the outputs_base_dir, as they are already there\n"," # If we were to move them, we'd do similar to trainings_run_source\n"," print(f\"Dataset analysis outputs already within '{dataset_output_dir}'. No additional move needed.\")\n","\n","# Create a dedicated models directory and copy all exported model files\n","models_output_dir = outputs_base_dir / 'models'\n","models_output_dir.mkdir(parents=True, exist_ok=True)\n","print(f\"\\nCopying exported model files to '{models_output_dir}'...\")\n","\n","models_copied = 0\n","for result in all_results_for_comparison:\n"," if result.get('status') == 'Success':\n"," model_name = result.get('_model_name', result.get('model_architecture', 'unknown'))\n"," dataset_alias = result.get('_dataset_alias', result.get('dataset_alias', 'unknown'))\n","\n"," # Copy TFLite model\n"," tflite_source = result.get('_tflite_file_path')\n"," if tflite_source:\n"," # Handle both Path objects and strings\n"," if isinstance(tflite_source, str):\n"," tflite_source = Path(tflite_source)\n"," if tflite_source.exists():\n"," tflite_dest = models_output_dir / f\"{model_name}_{dataset_alias}.tflite\"\n"," try:\n"," shutil.copy2(tflite_source, tflite_dest)\n"," print(f\" ✓ Copied TFLite: {tflite_dest.name} ({tflite_dest.stat().st_size / (1024*1024):.2f} MB)\")\n"," models_copied += 1\n"," except Exception as e:\n"," print(f\" ✗ Failed to copy TFLite model {tflite_source}: {e}\")\n"," else:\n"," print(f\" ⚠ TFLite model not found at: {tflite_source}\")\n"," else:\n"," print(f\" ⚠ No TFLite path stored for {model_name} on {dataset_alias}\")\n","\n"," # Copy CoreML model (mlpackage is a directory, so use copytree)\n"," coreml_source = result.get('_coreml_file_path')\n"," if coreml_source:\n"," # Handle both Path objects and strings\n"," if isinstance(coreml_source, str):\n"," coreml_source = Path(coreml_source)\n"," if coreml_source.exists():\n"," coreml_dest = models_output_dir / f\"{model_name}_{dataset_alias}.mlpackage\"\n"," try:\n"," if coreml_dest.exists():\n"," shutil.rmtree(coreml_dest)\n"," if coreml_source.is_dir():\n"," shutil.copytree(coreml_source, coreml_dest)\n"," # Calculate size for directory\n"," total_size = sum(f.stat().st_size for f in coreml_dest.rglob('*') if f.is_file())\n"," print(f\" ✓ Copied CoreML: {coreml_dest.name} ({total_size / (1024*1024):.2f} MB)\")\n"," else:\n"," shutil.copy2(coreml_source, coreml_dest)\n"," print(f\" ✓ Copied CoreML: {coreml_dest.name} ({coreml_dest.stat().st_size / (1024*1024):.2f} MB)\")\n"," models_copied += 1\n"," except Exception as e:\n"," print(f\" ✗ Failed to copy CoreML model {coreml_source}: {e}\")\n"," else:\n"," print(f\" ⚠ CoreML model not found at: {coreml_source}\")\n"," else:\n"," print(f\" ⚠ No CoreML path stored for {model_name} on {dataset_alias}\")\n","\n","if models_copied > 0:\n"," print(f\"\\n✓ Successfully copied {models_copied} model file(s) to '{models_output_dir}'\")\n"," print(f\" Models are ready for use in your Android/iOS project:\")\n"," print(f\" - TFLite files (.tflite) → Android assets folder\")\n"," print(f\" - CoreML files (.mlpackage) → iOS Xcode project\")\n"," print(f\" - The _metadata.txt file contains model information for TFLite models.\")\n","else:\n"," print(f\"\\n⚠ No model files were copied. Check if models were exported successfully.\")\n"," print(f\" Check the 'all_trainings' directory for exported models.\")\n","\n","# Create a zip archive of the entire 'outputs' directory\n","zip_file_name = f\"{outputs_base_dir.name}.zip\"\n","print(f\"Creating zip archive '{zip_file_name}'...\")\n","try:\n"," shutil.make_archive(outputs_base_dir, 'zip', outputs_base_dir)\n"," print(f\"Archive '{zip_file_name}' created successfully.\")\n","except Exception as e:\n"," print(f\"Error creating zip archive: {e}\")\n","\n","# Provide a download link for Google Colab environments\n","try:\n"," from google.colab import files\n"," print(f\"Downloading '{zip_file_name}'...\")\n"," files.download(zip_file_name)\n"," print(\"Download initiated.\")\n","except ImportError:\n"," print(\"Not running in Google Colab. Archive saved locally. You can download it manually.\")\n","except Exception as e:\n"," print(f\"Error initiating download: {e}\")"]},{"cell_type":"markdown","metadata":{"id":"8cafce89"},"source":["## Summary:\n","\n","### Data Analysis Key Findings\n","\n","* A comprehensive model comparison table was generated from the `all_results_for_comparison` list, capturing metrics such as mAP50, inference time, and model size for `yolo11n` and `yolo11s` models trained on the `basketball_dataset`. This table was saved as `model_comparison_results.csv`.\n","* A set of comparative visualizations, including a scatter plot of Accuracy (mAP50) vs. Inference Time (ms) with marker size representing Model Size (MB), and bar charts for mAP50, Inference Time (ms), and Model Size (MB) across different models, were created and saved to `outputs/comparison_results/model_comparison_summary.png`.\n","* Model recommendations were provided based on various criteria:\n"," * **Best Accuracy (mAP50):** `yolo11s` achieved the highest mAP50 of 0.5873 on the `basketball_dataset`.\n"," * **Fastest Inference:** `yolo11n` demonstrated the fastest inference time at 2.18 ms on the `basketball_dataset`.\n"," * **Best Balance (Accuracy/Speed):** `yolo11s` presented the best balance score of 0.1468 on the `basketball_dataset`.\n"," * **Smallest Model:** `yolo11n` was the smallest model at 5.18 MB on the `basketball_dataset`.\n"," * **Recommended for Real-Time Mobile Detection:** `yolo11n` on `basketball_dataset` was ultimately recommended due to its optimal balance of speed (2.18 ms) and acceptable accuracy (0.2578 mAP50), combined with a compact size of 5.18 MB.\n","* All generated artifacts, including trained model runs (`runs/all_trainings`), comparison results, and dataset analysis outputs, were successfully consolidated into a single `outputs` directory.\n","* **Exported model files (TFLite and CoreML) were copied to `outputs/models/` directory with clear naming: `{model_arch}_{dataset_alias}.tflite` and `{model_arch}_{dataset_alias}.mlpackage`**\n","* The entire `outputs` directory was compressed into a `outputs.zip` archive.\n","* A download link for the `outputs.zip` file was provided, enabling easy retrieval of all results in a Google Colab environment.\n","* **Model files are ready for direct use in Android/iOS projects from the `outputs/models/` directory.**\n","\n","### Insights or Next Steps\n","\n","* The automated multi-model and multi-dataset workflow provides a robust framework for comparing model performance across various evaluation metrics and datasets, enabling informed decision-making for deployment.\n","* The consolidated and archived output structure significantly streamlines the collection and sharing of experimental results, fostering reproducibility and efficient collaboration.\n","\n","### Performance Tips\n","\n","- Use image size 416x416 for fastest inference (vs 640x640)\n","- Process every 2nd or 3rd frame if needed for 30+ FPS\n","- Use GPU acceleration when available on device\n","- Adjust confidence threshold based on your use case (default: 0.25)\n","\n","### Model Optimization\n","\n","The exported models include:\n","- ✅ Half precision (FP16) for CoreML\n","- ✅ INT8 quantization for TFLite\n","- ✅ Built-in NMS (Non-Maximum Suppression)\n","- ✅ Optimized for mobile inference\n","- ✅ Metadata verification for TensorFlow Lite Task Vision compatibility\n","\n","### Metadata Compatibility Notes\n","\n","**TFLite Models:**\n","- Models are verified for metadata compatibility with TensorFlow Lite Task Vision ObjectDetector API\n","- If metadata is missing, the model may still work with the Interpreter API directly\n","- For guaranteed Task Vision API compatibility, consider using TensorFlow Lite Model Maker\n","- Current models use input size 416x416 with INT8 quantization and built-in NMS\n","\n","**CoreML Models:**\n","- Models are exported with FP16 precision and built-in NMS\n","- Compatible with iOS Vision framework (VNCoreMLModel)\n","- Input size: 416x416\n"]}],"metadata":{"accelerator":"GPU","colab":{"gpuType":"L4","machine_shape":"hm","provenance":[{"file_id":"1c5C66etoxb3_sSdBhAih0nbuUAiQKUWS","timestamp":1775723631466},{"file_id":"15IYMZt89kjHdGAJasMJ2nXev7o29bwuH","timestamp":1775131908320},{"file_id":"1xTyQm3N79_YakEYu-uFkWNxCmMG9jZUY","timestamp":1773309940132}]},"kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"name":"python"}},"nbformat":4,"nbformat_minor":0}