🖼️ Format bbox label with fixed precision for ortcpp-example (#4409)

Signed-off-by: Onuralp SEZER <thunderbirdtr@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Glenn Jocher <glenn.jocher@ultralytics.com>
pull/4430/head
Onuralp SEZER 1 year ago committed by GitHub
parent 8d7490f060
commit 4885538693
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 16
      examples/YOLOv8-ONNXRuntime-CPP/CMakeLists.txt
  2. 58
      examples/YOLOv8-ONNXRuntime-CPP/README.md
  3. 20
      examples/YOLOv8-ONNXRuntime-CPP/main.cpp

@ -11,20 +11,22 @@ set(CMAKE_CXX_EXTENSIONS ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_INCLUDE_CURRENT_DIR ON)
# OpenCV # -------------- OpenCV ------------------#
find_package(OpenCV REQUIRED) find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS}) include_directories(${OpenCV_INCLUDE_DIRS})
# -------------- Compile CUDA for FP16 inference if needed ------------------# # -------------- Compile CUDA for FP16 inference if needed ------------------#
option(USE_CUDA "Enable CUDA support" ON) option(USE_CUDA "Enable CUDA support" ON)
if (USE_CUDA) if (NOT APPLE AND USE_CUDA)
find_package(CUDA REQUIRED) find_package(CUDA REQUIRED)
include_directories(${CUDA_INCLUDE_DIRS}) include_directories(${CUDA_INCLUDE_DIRS})
add_definitions(-DUSE_CUDA) add_definitions(-DUSE_CUDA)
else ()
set(USE_CUDA OFF)
endif () endif ()
# ONNXRUNTIME # -------------- ONNXRUNTIME ------------------#
# Set ONNXRUNTIME_VERSION # Set ONNXRUNTIME_VERSION
set(ONNXRUNTIME_VERSION 1.15.1) set(ONNXRUNTIME_VERSION 1.15.1)
@ -84,3 +86,11 @@ endif ()
# Download https://raw.githubusercontent.com/ultralytics/ultralytics/main/ultralytics/cfg/datasets/coco.yaml # Download https://raw.githubusercontent.com/ultralytics/ultralytics/main/ultralytics/cfg/datasets/coco.yaml
# and put it in the same folder of the executable file # and put it in the same folder of the executable file
configure_file(coco.yaml ${CMAKE_CURRENT_BINARY_DIR}/coco.yaml COPYONLY) configure_file(coco.yaml ${CMAKE_CURRENT_BINARY_DIR}/coco.yaml COPYONLY)
# Copy yolov8n.onnx file to the same folder of the executable file
configure_file(yolov8n.onnx ${CMAKE_CURRENT_BINARY_DIR}/yolov8n.onnx COPYONLY)
# Create folder name images in the same folder of the executable file
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/images
)

@ -1,14 +1,19 @@
# YOLOv8 OnnxRuntime C++ <h1 align="center">YOLOv8 OnnxRuntime C++</h1>
<p align="center">
<img alt="C++" src="https://img.shields.io/badge/C++-17-blue.svg?style=flat&logo=c%2B%2B">
<img alt="Onnx-runtime" src="https://img.shields.io/badge/OnnxRuntime-717272.svg?logo=Onnx&logoColor=white"></img>
</p>
This example demonstrates how to perform inference using YOLOv8 in C++ with ONNX Runtime and OpenCV's API. This example demonstrates how to perform inference using YOLOv8 in C++ with ONNX Runtime and OpenCV's API.
## Benefits ## Benefits
- Friendly for deployment in the industrial sector. - Friendly for deployment in the industrial sector.
- Faster than OpenCV's DNN inference on both CPU and GPU. - Faster than OpenCV's DNN inference on both CPU and GPU.
- Supports FP32 and FP16 CUDA acceleration. - Supports FP32 and FP16 CUDA acceleration.
## Exporting YOLOv8 Models ## Exporting YOLOv8 Models 📦
To export YOLOv8 models, use the following Python script: To export YOLOv8 models, use the following Python script:
@ -28,25 +33,50 @@ Alternatively, you can use the following command for exporting the model in the
yolo export model=yolov8n.pt opset=12 simplify=True dynamic=False format=onnx imgsz=640,640 yolo export model=yolov8n.pt opset=12 simplify=True dynamic=False format=onnx imgsz=640,640
``` ```
## Download COCO.yaml file ## Download COCO.yaml file 📂
In order to run example, you also need to download coco.yaml. You can download the file manually from [here](https://raw.githubusercontent.com/ultralytics/ultralytics/main/ultralytics/cfg/datasets/coco.yaml) In order to run example, you also need to download coco.yaml. You can download the file manually from [here](https://raw.githubusercontent.com/ultralytics/ultralytics/main/ultralytics/cfg/datasets/coco.yaml)
## Dependencies ## Dependencies
| Dependency | Version | | Dependency | Version |
| -------------------------------- | ------------- | | -------------------------------- | -------------- |
| Onnxruntime(linux,windows,macos) | >=1.14.1 | | Onnxruntime(linux,windows,macos) | >=1.14.1 |
| OpenCV | >=4.0.0 | | OpenCV | >=4.0.0 |
| C++ | >=17 | | C++ Standard | >=17 |
| Cmake | >=3.5 | | Cmake | >=3.5 |
| Cuda (Optional) | >=11.4,\<12.0 | | Cuda (Optional) | >=11.4 \<12.0 |
| cuDNN (Cuda required) | =8 | | cuDNN (Cuda required) | =8 |
Note: The dependency on C++17 is due to the usage of the C++17 filesystem feature. Note: The dependency on C++17 is due to the usage of the C++17 filesystem feature.
Note (2): Due to ONNX Runtime, we need to use CUDA 11 and cuDNN 8. Keep in mind that this requirement might change in the future. Note (2): Due to ONNX Runtime, we need to use CUDA 11 and cuDNN 8. Keep in mind that this requirement might change in the future.
## Usage ## Build 🛠
1. Clone the repository to your local machine.
1. Navigate to the root directory of the repository.
1. Create a build directory and navigate to it:
```console
mkdir build && cd build
```
4. Run CMake to generate the build files:
```console
cmake ..
```
5. Build the project:
```console
make
```
6. The built executable should now be located in the `build` directory.
## Usage 🚀
```c++ ```c++
// CPU inference // CPU inference

@ -1,4 +1,5 @@
#include <iostream> #include <iostream>
#include <iomanip>
#include "inference.h" #include "inference.h"
#include <filesystem> #include <filesystem>
#include <fstream> #include <fstream>
@ -18,16 +19,31 @@ void file_iterator(DCSP_CORE *&p) {
cv::Scalar color(rng.uniform(0, 256), rng.uniform(0, 256), rng.uniform(0, 256)); cv::Scalar color(rng.uniform(0, 256), rng.uniform(0, 256), rng.uniform(0, 256));
cv::rectangle(img, re.box, color, 3); cv::rectangle(img, re.box, color, 3);
std::string label = p->classes[re.classId] + " " + std::to_string(re.confidence);
float confidence = floor(100 * re.confidence) / 100;
std::cout << std::fixed << std::setprecision(2);
std::string label = p->classes[re.classId] + " " +
std::to_string(confidence).substr(0, std::to_string(confidence).size() - 4);
cv::rectangle(
img,
cv::Point(re.box.x, re.box.y - 25),
cv::Point(re.box.x + label.length() * 15, re.box.y),
color,
cv::FILLED
);
cv::putText( cv::putText(
img, img,
label, label,
cv::Point(re.box.x, re.box.y - 5), cv::Point(re.box.x, re.box.y - 5),
cv::FONT_HERSHEY_SIMPLEX, cv::FONT_HERSHEY_SIMPLEX,
0.75, 0.75,
color, cv::Scalar(0, 0, 0),
2 2
); );
} }
std::cout << "Press any key to exit" << std::endl; std::cout << "Press any key to exit" << std::endl;
cv::imshow("Result of Detection", img); cv::imshow("Result of Detection", img);

Loading…
Cancel
Save