爱笑的小姐姐 · 10月11日

OpenVINO C++ 部署 YOLO11 对象检测

模型导出与输入输出

YOLO11模型导出ONNX脚本如下:

from ultralytics import YOLO
"""Test exporting the YOLO model to ONNX format."""
f = YOLO("yolo11n.pt").export(format="onnx", opset=11, dynamic=False)

如果不指明opset=11或者12,默认opset=10导出的模型推理时候会非常的慢。指定opset=11以后,导出的模型结构如下:

image.png

输入与输出格式解释如下:

输入支持格式为:1x3x640x640
输出格式为1x84x8400

输出格式8400是指输出得预测框数目,84分别是

cx cy w h coco的分类得分 - 80

C++推理

OpenVINO2023 C++ 推理,加载模型

ov::CompiledModel compiled_model = ie.compile_model(onnxpath, "CPU");
this->infer_request = compiled_model.create_infer_request();

CPU上运行结果如下:

image.png

把ONNX格式模型通过下面的命令行转换为IR文件

import openvino as ov
ov_model = ov.convert_model("D:/python/my_yolov8_train_demo/yolo11n.onnx")ov.save_model(ov_model, "yolo11.xml")

 一样可以完成 C++ 推理演示 

image.png

最后我已经把C++代码 封装成一个单独的类,直接通过客户端,三行代码实现YOLO11对象检测模型部署推理。调用的代码如下:

#include <yolo11_det_openvino.h>
#include <iostream>
#include <fstream>
std::string label_map = "D:/python/my_yolov8_train_demo/classes.txt";
int main(int argc, char** argv) {  
    std::vector<std::string> classNames;  
    std::ifstream fp(label_map);  
    std::string name;  
    while (!fp.eof()) {    
    getline(fp, name);    
    if (name.length()) {      
    classNames.push_back(name);    
    }  
}  
fp.close();  
std::shared_ptr<YOLO11OpenVINODetector> detector(new YOLO11OpenVINODetector());  
detector>initConfig("D:/python/my_yolov8_train_demo/yolo11.xml", 0.25);  
cv::VideoCapture capture("D:/bird_test/play_scoers.mp4");  cv::Mat frame;  
std::vector<YOLODetBox> results;  
while (true) {    
bool ret = capture.read(frame);    
if (frame.empty()) {      
break;    
}    
detector->detect(frame, results);    
for (YOLODetBox dr : results) {      
cv::Rect box = dr.box;      
cv::putText(frame, classNames[dr.classId], cv::Point(box.tl().x, box.tl().y - 10), cv::FONT_HERSHEY_SIMPLEX, .5, cv::Scalar(0, 0, 0));    
}    
cv::imshow("YOLO11对象检测 + OpenVINO2023", frame);    
char c = cv::waitKey(1);    
if (c == 27) { // ESC 退出      
break;    
}    
// reset for next frame    
results.clear();  
}  
return 0;
}

对比YOLOv5跟YOLOv8同等的模型,速度还是非常快。唯一不是很满意的就是感觉对小目标检测能力好像没有YOLOv5跟YOLOv8那么厉害,只是个人感觉。

作者:gloomyfish
来源:OpenCV学堂

推荐阅读

欢迎大家点赞留言,更多Arm技术文章动态请关注极术社区嵌入式AI专栏欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。

推荐阅读
关注数
18777
内容数
1332
嵌入式端AI,包括AI算法在推理框架Tengine,MNN,NCNN,PaddlePaddle及相关芯片上的实现。欢迎加入微信交流群,微信号:aijishu20(备注:嵌入式)
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息