来源:小白学视觉
yolov5兼具速度和精度,工程化做的特别好,git clone到本地即可在自己的数据集上实现目标检测任务的训练和推理,在产业界中应用广泛。开源社区对yolov5支持实例分割的呼声高涨,yolov5在v7.0中正式官宣支持实例分割。
本文主要介绍在c++中使用openvino工具包部署yolov5-seg模型,主要步骤有:
配置openvino c++开发环境
下载并转换yolov5-seg预训练模型
使用openvino runtime c++ api编写推理程序
下面,本文将依次详述
1.1 配置openvino c++开发环境
配置openvino c++开发环境的详细步骤,请参考《在windows中基于visual studio配置openvino c++开发环境》。
1.2 下载并转换yolov5预训练模型
下载并转换yolov5-seg预训练模型的详细步骤,请参考:https://mp.weixin.qq.com/s/k3wp5ylau4p5jsdimyjumg,本文所使用的openvino是2022.3 lts版。
首先,运行命令获得 yolov5s-seg onnx 格式模型:yolov5s-seg.onnx:
python export.py --weights yolov5s-seg.pt --include onnx
然后运行命令获得yolov5s-seg ir格式模型:yolov5s-seg.xml和yolov5s-seg.bin,如下图所示
mo -m yolov5s-seg.onnx --compress_to_fp16
图 1-1 yolov5-seg onnx格式和ir格式模型
1.3 使用openvino runtime c++ api编写推理程序
一个端到端的ai推理程序,主要包含五个典型的处理流程:
采集图像&图像解码
图像数据预处理
ai推理计算
对推理结果进行后处理
将处理后的结果集成到业务流程
图 1-2 端到端的ai推理程序处理流程
1.3.1 采集图像&图像解码
opencv提供imread()函数将图像文件载入内存,
mat cv::imread (const string &filename, int flags=imread_color)
若是从视频流(例如,视频文件、网络摄像头、3d摄像头(realsense)等)中,一帧一帧读取图像数据到内存,则使用cv::videocapture类,对应范例代码请参考opencv官方范例代码:https://github.com/opencv/opencv/tree/4.x/samples/cpp。
图 1-3 从视频流读取图像帧范例
1.3.2 yolov5-seg模型的图像预处理
yolov5-seg模型构架是在yolov5模型构架基础上,增加了一个叫“proto”的小型卷积神经网络,用于输出检测对象掩码(mask),如下图所示:
图 1-4 yolov5-seg模型输出的代码定义
详细参看:https://github.com/ultralytics/yolov5/blob/master/models/yolo.py#l92
由此可知,yolov5-seg模型对数据预处理的要求跟yolov5模型一模一样,yolov5-seg模型的预处理代码可以复用yolov5模型的c++预处理代码。
另外,从代码可以看出yolov5-seg模型的输出有两个张量,一个张量输出检测结果,一个张量输出proto,其形状可以用netron打开yolov5-seg.onnx查知,如下图所示。
图 1-5 yolov5-seg模型的输入和输出
“output0”是检测输出,第一个维度表示batch size,第二个维度表示25200条输出,第三个维度表示有117个字段,其中前85个字段(0~84)表示:cx、cy、w、h、confidence和80个类别分数,后32个字段与”output1”做矩阵乘法,可以获得尺寸为160x160的检测目标的掩码(mask)。
1.3.3 执行ai推理计算
基于openvino runtime c++ api实现ai推理计算主要有两种方式:一种是同步推理方式,一种是异步推理方式,本文主要介绍同步推理方式。
主要步骤有:
初始化core类:ov::core core;
编译模型:core.compile_model()
创建推理请求infer_request:compiled_model.create_infer_request()
读取图像数据并做预处理:letterbox()
将预处理后的blob数据传入模型输入节点:infer_request.set_input_tensor()
调用infer()方法执行推理计算:infer_request.infer()
获得推理结果:infer_request.get_output_tensor()
基于openvino runtime c++api的同步推理代码如下所示:
// -------- step 1. initialize openvino runtime core -------- ov::core core; // -------- step 2. compile the model -------- auto compiled_model = core.compile_model(model_file, gpu.1); //gpu.1 is dgpu a770 // -------- step 3. create an inference request -------- ov::inferrequest infer_request = compiled_model.create_infer_request(); // -------- step 4. read a picture file and do the preprocess -------- cv::mat img = cv::imread(image_file); //load a picture into memory std::vector paddings(3); //scale, half_h, half_w cv::mat resized_img = letterbox(img, paddings); //resize to (640,640) by letterbox // bgr->rgb, u8(0-255)->f32(0.0-1.0), hwc->nchw cv::mat blob = cv::blobfromimage(resized_img, 1 / 255.0, cv::size(640, 640), cv::scalar(0, 0, 0), true); // -------- step 5. feed the blob into the input node of yolov5 ------- // get input port for model with one input auto input_port = compiled_model.input(); // create tensor from external memory ov::tensor input_tensor(input_port.get_element_type(), input_port.get_shape(), blob.ptr(0)); // set input tensor for model with one input infer_request.set_input_tensor(input_tensor); // -------- step 6. start inference -------- infer_request.infer(); // -------- step 7. get the inference result -------- auto detect = infer_request.get_output_tensor(0); auto detect_shape = detect.get_shape(); std::cout << the shape of detection tensor:<< detect_shape << std::endl; auto proto = infer_request.get_output_tensor(1); auto proto_shape = proto.get_shape();std::cout << the shape of proto tensor: << proto_shape << std::endl;
1.3.4 推理结果进行后处理
后处理工作主要是从”detect ”输出张量中拆解出检测框的位置和类别信息,并用cv::nmsboxes()过滤掉多于的检测框;从”detect ”输出张量的后32个字段与”proto”输出张量做矩阵乘法,获得每个检测目标的形状为160x160的掩码输出,最后将160x160的掩码映射回原始图像完成所有后处理工作。
1.4 总结
配置openvino c++开发环境后,可以直接编译运行yolov5seg_openvino_dgpu.cpp,结果如下图所示。使用openvino runtime c++ api函数开发yolov5推理程序,简单方便,并可以任意部署在英特尔cpu、集成显卡和独立显卡上。
红米note8系列和荣耀9X相比,谁才是你心中的购机标准呢?
服务器在升级RAID卡固件版本后无法正常启动
胶管用钢丝绳标准GB/T12756-91
交流电压信号调理电路分析
智能配变综合监测终端的介绍,它都有哪些特色功能
在C++中使用OpenVINO工具包部署YOLOv5-Seg模型
拥抱eSIM技术,英飞凌引领新时代发展
泰禾智能开价600万出售艾睿思30%股权
电源中的+12V/+5V/+3.3V都给哪些硬件供电?
基于PM2.5传感器的空气净化器应用解决方案的介绍
塑封贴片压敏电阻的型号及其特点,你了解多少?
亿安泰电子:大功率逆变器资料简介
基于ZIGBEE和RFID结合的物流管理系统分析
DS3660 安全存储器和可编程篡改检测加密处理器
智能手机如何实现无线上网?各有什么优缺点?
优傲机器人在深圳宝安壹方城举行了乔迁仪式庆典
美国顶级大学和微软联盟 用AI和超级计算机解决新冠病毒
单总线温度传感器的EDA控制方法
元旦后再掀小米手机抢购风 全靠口碑传播
亚马逊宣布推出云游戏平台Luna,服务基于亚马逊网络服务云平台运行