image_to_pixle_params_yoloSAM/ultralytics-main/examples/YOLOv8-CPP-Inference/README.md

86 lines
4.0 KiB
Markdown
Raw Permalink Normal View History

2025-07-14 17:36:53 +08:00
# YOLOv8/YOLOv5 C++ Inference with OpenCV DNN
This example demonstrates how to perform inference using Ultralytics YOLOv8 and YOLOv5 models in C++ leveraging the [OpenCV DNN module](https://docs.opencv.org/4.x/d6/d0f/group__dnn.html).
## 🛠️ Usage
Follow these steps to set up and run the C++ inference example:
```bash
# 1. Clone the Ultralytics repository
git clone https://github.com/ultralytics/ultralytics
cd ultralytics
# 2. Install Ultralytics Python package (needed for exporting models)
pip install .
# 3. Navigate to the C++ example directory
cd examples/YOLOv8-CPP-Inference
# 4. Export Models: Add yolov8*.onnx and/or yolov5*.onnx models (see export instructions below)
# Place the exported ONNX models in the current directory (YOLOv8-CPP-Inference).
# 5. Update Source Code: Edit main.cpp and set the 'projectBasePath' variable
# to the absolute path of the 'YOLOv8-CPP-Inference' directory on your system.
# Example: std::string projectBasePath = "/path/to/your/ultralytics/examples/YOLOv8-CPP-Inference";
# 6. Configure OpenCV DNN Backend (Optional - CUDA):
# - The default CMakeLists.txt attempts to use CUDA for GPU acceleration with OpenCV DNN.
# - If your OpenCV build doesn't support CUDA/cuDNN, or you want CPU inference,
# remove the CUDA-related lines from CMakeLists.txt.
# 7. Build the project
mkdir build
cd build
cmake ..
make
# 8. Run the inference executable
./Yolov8CPPInference
```
## ✨ Exporting YOLOv8 and YOLOv5 Models
You need to export your trained PyTorch models to the [ONNX](https://onnx.ai/) format to use them with OpenCV DNN.
**Exporting Ultralytics YOLOv8 Models:**
Use the Ultralytics CLI to export. Ensure you specify the desired `imgsz` and `opset`. For compatibility with this example, `opset=12` is recommended.
```bash
yolo export model=yolov8s.pt imgsz=640,480 format=onnx opset=12 # Example: 640x480 resolution
```
**Exporting YOLOv5 Models:**
Use the `export.py` script from the YOLOv5 repository structure (included within the cloned `ultralytics` repo).
```bash
# Assuming you are in the 'ultralytics' base directory after cloning
python export.py --weights yolov5s.pt --imgsz 640 480 --include onnx --opset 12 # Example: 640x480 resolution
```
Place the generated `.onnx` files (e.g., `yolov8s.onnx`, `yolov5s.onnx`) into the `ultralytics/examples/YOLOv8-CPP-Inference/` directory.
**Example Output:**
_yolov8s.onnx:_
![YOLOv8 ONNX Output](https://user-images.githubusercontent.com/40023722/217356132-a4cecf2e-2729-4acb-b80a-6559022d7707.png)
_yolov5s.onnx:_
![YOLOv5 ONNX Output](https://user-images.githubusercontent.com/40023722/217357005-07464492-d1da-42e3-98a7-fc753f87d5e6.png)
## 📝 Notes
- This repository utilizes the [OpenCV DNN API](https://docs.opencv.org/4.x/d6/d0f/group__dnn.html) to run [ONNX](https://onnx.ai/) exported models of YOLOv5 and Ultralytics YOLOv8.
- While not explicitly tested, it might theoretically work for other YOLO architectures like YOLOv6 and YOLOv7 if their ONNX export formats are compatible.
- The example models are exported with a rectangular resolution (640x480), but the code should handle models exported with different resolutions. Consider using techniques like [letterboxing](https://docs.ultralytics.com/modes/predict/#letterbox) if your input images have different aspect ratios than the model's training resolution, especially for square `imgsz` exports.
- The `main` branch version includes a simple GUI wrapper using [Qt](https://www.qt.io/). However, the core logic resides in the `Inference` class (`inference.h`, `inference.cpp`).
- A key part of the `Inference` class demonstrates how to handle the output differences between YOLOv5 and YOLOv8 models, effectively transposing YOLOv8's output format to match the structure expected from YOLOv5 for consistent post-processing.
## 🤝 Contributing
Contributions are welcome! If you find any issues or have suggestions for improvement, please feel free to open an issue or submit a pull request. See our [Contributing Guide](https://docs.ultralytics.com/help/contributing/) for more details.