前面我们给大家介绍了基于LabVIEW+YOLOv3/YOLOv4的物体识别(对象检测),今天接着上次的内容再来看看YOLOv5。本次主要是和大家分享使用LabVIEW快速实现yolov5的物体识别,本博客中使用的智能工具包可到主页置顶博客LabVIEW AI视觉工具包(非NI Vision)下载与安装教程中下载。若配置运行过程中遇到困难,欢迎大家评论区留言,博主将尽力解决。
YOLOv5是在 COCO 数据集上预训练的一系列对象检测架构和模型。表现要优于谷歌开源的目标检测框架 EfficientDet,在检测精度和速度上相比yolov4都有较大的提高。目前YOLOv5官方代码中,最新版本是YOLOv5 v6.1,一共给出了5个版本的模型,分别是 YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l、YOLO5x 五个模型(如下图所示)。这些不同的变体模型使得YOLOv5能很好的在精度和速度中权衡,方便用户选择。其中五个模型性能依次增强。比如YOLOv5n模型参数量最小,速度最快,AP精度最低;YOLOv5x模型参数量最大,速度最慢,AP精度最高。本博客,我们以YOLOv5最新版本来介绍相关的部署开发。
1、小目标的检测精度上有明显的提高;
2、能自适应锚框计算
3、具有数据增强功能,随机缩放,裁剪,拼接等功能
4、灵活性极高、速度超快,模型超小、在模型的快速部署上具有极强优势
关于YOLOv5的网络结构解释网上有很多,这里就不再赘述了,大家可以看其他大神对于YOLOv5网络结构的解析。
为方便使用,博主已经将yolov5模型转化为onnx格式,可在百度网盘下载 链接:百度网盘 请输入提取码 提取码:yiku
将Ultralytics开源的YOLOv5代码Clone或下载到本地,可以直接点击Download ZIP进行下载,
下载地址:https://github.com/ultralytics/yolov5
解压刚刚下载的zip文件,然后安装yolov5需要的模块,记住cmd的工作路径要在yolov5文件夹下:
打开cmd切换路径到yolov5文件夹下,并输入如下指令,安装yolov5需要的模块
pip install -r requirements.txt
打开cmd,进入python环境,使用如下指令下载预训练模型:
import torch # Model model = torch.hub.load('ultralytics/yolov5', 'yolov5s') # or yolov5n - yolov5x6, custom
成功下载后如下图所示:
在yolov5之前的yolov3和yolov4的官方代码都是基于darknet框架实现的,因此opencv的dnn模块做目标检测时,读取的是.cfg和.weight文件,非常方便。但是yolov5的官方代码是基于pytorch框架实现的。需要先把pytorch的训练模型.pt文件转换到.onnx文件,然后才能载入到opencv的dnn模块里。
将.pt文件转化为.onnx文件,主要是参考了nihate大佬的博客:用opencv的dnn模块做yolov5目标检测_nihate的博客-CSDN博客_opencv yolov5
将export.py做如下修改,将def export_onnx()中的第二个try注释掉,即如下部分注释:
1 '''try: 2 check_requirements(('onnx',)) 3 import onnx 4 5 LOGGER.info(f'\n{prefix} starting export with onnx {onnx.__version__}...') 6 f = file.with_suffix('.onnx') 7 print(f) 8 9 torch.onnx.export( 10 model, 11 im, 12 f, 13 verbose=False, 14 opset_version=opset, 15 training=torch.onnx.TrainingMode.TRAINING if train else torch.onnx.TrainingMode.EVAL, 16 do_constant_folding=not train, 17 input_names=['images'], 18 output_names=['output'], 19 dynamic_axes={ 20 'images': { 21 0: 'batch', 22 2: 'height', 23 3: 'width'}, # shape(1,3,640,640) 24 'output': { 25 0: 'batch', 26 1: 'anchors'} # shape(1,25200,85) 27 } if dynamic else None) 28 29 # Checks 30 model_onnx = onnx.load(f) # load onnx model 31 onnx.checker.check_model(model_onnx) # check onnx model 32 33 # Metadata 34 d = {'stride': int(max(model.stride)), 'names': model.names} 35 for k, v in d.items(): 36 meta = model_onnx.metadata_props.add() 37 meta.key, meta.value = k, str(v) 38 onnx.save(model_onnx, f)'''
并新增一个函数def my_export_onnx():
1 def my_export_onnx(model, im, file, opset, train, dynamic, simplify, prefix=colorstr('ONNX:')): 2 print('anchors:', model.yaml['anchors']) 3 wtxt = open('class.names', 'w') 4 for name in model.names: 5 wtxt.write(name+'\n') 6 wtxt.close() 7 # YOLOv5 ONNX export 8 print(im.shape) 9 if not dynamic: 10 f = os.path.splitext(file)[0] + '.onnx' 11 torch.onnx.export(model, im, f, verbose=False, opset_version=12, input_names=['images'], output_names=['output']) 12 else: 13 f = os.path.splitext(file)[0] + '_dynamic.onnx' 14 torch.onnx.export(model, im, f, verbose=False, opset_version=12, input_names=['images'], 15 output_names=['output'], dynamic_axes={'images': {0: 'batch', 2: 'height', 3: 'width'}, # shape(1,3,640,640) 16 'output': {0: 'batch', 1: 'anchors'} # shape(1,25200,85) 17 }) 18 return f
在cmd中输入转onnx的命令(记得将export.py和pt模型放在同一路径下):
python export.py --weights yolov5s.pt --include onnx
如下图所示为转化成功界面
其中yolov5s可替换为yolov5m\yolov5m\yolov5l\yolov5x
本例中使用LabvVIEW工具包中opencv的dnn模块readNetFromONNX()载入onnx模型,可选择使用cuda进行推理加速。
我们可以使用netron 查看yolov5m.onnx的网络结构,浏览器中输入链接:Netron,点击Open Model,打开相应的网络模型文件即可。
如下图所示是转换之后的yolov5m.onnx的属性:
blobFromImage参数: size:640*640 Scale=1/255 Means=[0,0,0]
Net.forward()输出: 单数组 25200*85
如下图所示,调用摄像头实现实时物体识别
本次我们是以yolov5m.onnx为例来测试识别结果和速度的; 不使用GPU加速,仅在CPU模式下,实时检测推理用时在300ms/frame左右
使用GPU加速,实时检测推理用时为30~40ms/frame,是cpu速度的十倍多
以上就是今天要给大家分享的内容,本次分享内容实验环境说明:操作系统为Windows10,python版本为3.6及以上,LabVIEW为2018及以上 64位版本,视觉工具包为博客开头提到的工具包。