| # YOLOv5nu TFLite Conversion |
|
|
| YOLOv5nu is the anchor-free ("u") variant of YOLOv5 from [Ultralytics](https://github.com/ultralytics/ultralytics). It uses the YOLOv8-style decoupled, anchor-free detection head, so its output is a single `[1, 84, 8400]` tensor (`84 = 4` box coordinates `+ 80` COCO class scores, no separate objectness channel). |
|
|
| The exported TFLite outputs box coordinates **normalized to `[0, 1]`** (the demo's post-processing accounts for this). |
|
|
| ## Prerequisites |
|
|
| ### Python environment |
|
|
| The `.pt` → TFLite conversion uses Ultralytics. Python **3.10** was used. |
|
|
| ```bash |
| conda create -n <env_name> python=3.10 -y |
| conda activate <env_name> |
| pip install "ultralytics==8.4.90" "torch==2.12.1" "torchvision==0.27.1" \ |
| "tensorflow==2.21.0" "ai-edge-litert==2.1.5" |
| ``` |
|
|
| These are the exact versions used to produce the provided `yolov5nu.tflite` (Python `3.10.20`). `tensorflow` is required for the TFLite export, and `torchvision` must match `torch` (0.27.1 ↔ 2.12.1). |
|
|
| --- |
|
|
| ## Conversion of YOLOv5nu to TFLite |
|
|
| The `yolov5nu.pt` checkpoint is downloaded automatically by Ultralytics on first use. |
|
|
| ```bash |
| # CLI |
| yolo export model=yolov5nu.pt format=tflite imgsz=640 |
| ``` |
|
|
| or equivalently with the Python API: |
|
|
| ```python |
| from ultralytics import YOLO |
| YOLO("yolov5nu.pt").export(format="tflite", imgsz=640) |
| ``` |
|
|
| Ultralytics writes the export artifacts to `yolov5nu_saved_model/`; the float32 model is `yolov5nu_saved_model/yolov5nu_float32.tflite`. Copy/rename it to `yolov5nu.tflite` (the name the demo expects). |
|
|
| --- |
|
|
| ## Usage |
|
|
| A demo script is provided to run inference using OpenCV DNN: |
|
|
| ```bash |
| python demo.py --model yolov5nu.tflite --image example_outputs/input.jpg --output example_outputs/yolov5nu_output.jpg |
| ``` |
|
|
| `demo.py` uses only OpenCV's dnn module (`cv2.dnn.readNet`). It letterboxes the input to 640x640 (aspect-preserving resize + centered 114-pad, matching `ultralytics.data.augment.LetterBox`), runs the network, decodes the `[1, 84, 8400]` head (argmax over the 80 class scores; boxes are normalized `[0, 1]`, scaled to the letterboxed input and mapped back through the inverse letterbox), applies class-aware NMS (`NMSBoxesBatched`), prints the detected COCO classes / confidences / bounding boxes, and saves an annotated output image. It also handles the NMS-free (v10/26-style) `[1, 300, 6+]` head, so the same script works for other exported YOLO `.tflite` models. |
|
|
| On the provided `example_outputs/input.jpg` it detects `dog`, `truck` and `bicycle`. |
|
|
| --- |
|
|
| ## License |
|
|
| YOLOv5nu weights and the Ultralytics exporter are released under **AGPL-3.0** — see the [Ultralytics LICENSE](https://github.com/ultralytics/ultralytics/blob/main/LICENSE). Any redistribution of the converted `yolov5nu.tflite` is subject to those terms. |
|
|