前言
前面我們給大家介紹了基于LabVIEW+YOLOv3/YOLOv4的物體識別(對象檢測),今天接著上次的內(nèi)容再來看看YOLOv5。本次主要是和大家分享使用LabVIEW快速實現(xiàn)yolov5的物體識別, 本博客中使用的智能工具包可到主頁置頂博客LabVIEW AI視覺工具包(非NI Vision)下載與安裝教程中下載 。若配置運行過程中遇到困難,歡迎大家評論區(qū)留言,博主將盡力解決。
一、關(guān)于YOLOv5
YOLOv5是在 COCO 數(shù)據(jù)集上預(yù)訓(xùn)練的一系列對象檢測架構(gòu)和模型。表現(xiàn)要優(yōu)于谷歌開源的目標(biāo)檢測框架 EfficientDet,在檢測精度和速度上相比yolov4都有較大的提高。目前YOLOv5官方代碼中,最新版本是YOLOv5 v6.1,一共給出了5個版本的模型,分別是 YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l、YOLO5x 五個模型(如下圖所示)。這些不同的變體模型使得YOLOv5能很好的在精度和速度中權(quán)衡,方便用戶選擇。其中五個模型性能依次增強。比如YOLOv5n模型參數(shù)量最小,速度最快,AP精度最低;YOLOv5x模型參數(shù)量最大,速度最慢,AP精度最高。本博客,我們以YOLOv5最新版本來介紹相關(guān)的部署開發(fā)。
YOLOv5相比于前面yolo模型的主要特點是:
1、小目標(biāo)的檢測精度上有明顯的提高;
2、能自適應(yīng)錨框計算
3、具有數(shù)據(jù)增強功能,隨機縮放,裁剪,拼接等功能
4、靈活性極高、速度超快,模型超小、在模型的快速部署上具有極強優(yōu)勢
關(guān)于YOLOv5的網(wǎng)絡(luò)結(jié)構(gòu)解釋網(wǎng)上有很多,這里就不再贅述了,大家可以看其他大神對于YOLOv5網(wǎng)絡(luò)結(jié)構(gòu)的解析。
二、YOLOv5模型的獲取
為方便使用, 博主已經(jīng)將yolov5模型轉(zhuǎn)化為onnx格式 ,可在百度網(wǎng)盤下載**鏈接:https://pan.baidu.com/s/15dwoBM4W-5_nlRj4G9EhRg?pwd=yiku
提取碼:yiku
1.下載源碼
將Ultralytics開源的YOLOv5代碼Clone或下載到本地,可以直接點擊Download ZIP進(jìn)行下載,
下載地址:https://github.com/ultralytics/yolov5
2.安裝模塊
解壓剛剛下載的zip文件,然后安裝yolov5需要的模塊,記住cmd的工作路徑要在yolov5文件夾下:
打開cmd切換路徑到y(tǒng)olov5文件夾下,并輸入如下指令,安裝yolov5需要的模塊
pip install -r requirements.txt
3.下載預(yù)訓(xùn)練模型
打開cmd,進(jìn)入python環(huán)境,使用如下指令下載預(yù)訓(xùn)練模型:
import torch
?
# Model
model = torch.hub.load('ultralytics/yolov5', 'yolov5s') # or yolov5n - yolov5x6, custom
?
成功下載后如下圖所示:
4.轉(zhuǎn)換為onnx模型
在yolov5之前的yolov3和yolov4的官方代碼都是基于darknet框架實現(xiàn)的,因此opencv的dnn模塊做目標(biāo)檢測時,讀取的是.cfg和.weight文件,非常方便。但是yolov5的官方代碼是基于pytorch框架實現(xiàn)的。需要先把pytorch的訓(xùn)練模型.pt文件轉(zhuǎn)換到.onnx文件,然后才能載入到opencv的dnn模塊里。
將.pt文件轉(zhuǎn)化為.onnx文件,主要是參考了nihate大佬的博客:https://blog.csdn.net/nihate/article/details/112731327
將export.py做如下修改,將def export_onnx()中的第二個try注釋掉,即如下部分注釋:
'''
try:
check_requirements(('onnx',))
import onnx
?
LOGGER.info(f'
{prefix} starting export with onnx {onnx.__version__}...')
f = file.with_suffix('.onnx')
print(f)
?
torch.onnx.export(
model,
im,
f,
verbose=False,
opset_version=opset,
training=torch.onnx.TrainingMode.TRAINING if train else torch.onnx.TrainingMode.EVAL,
do_constant_folding=not train,
input_names=['images'],
output_names=['output'],
dynamic_axes={
'images': {
0: 'batch',
2: 'height',
3: 'width'}, # shape(1,3,640,640)
'output': {
0: 'batch',
1: 'anchors'} # shape(1,25200,85)
} if dynamic else None)
?
# Checks
model_onnx = onnx.load(f) # load onnx model
onnx.checker.check_model(model_onnx) # check onnx model
?
# Metadata
d = {'stride': int(max(model.stride)), 'names': model.names}
for k, v in d.items():
meta = model_onnx.metadata_props.add()
meta.key, meta.value = k, str(v)
onnx.save(model_onnx, f)'''
并新增一個函數(shù)def my_export_onnx():
def my_export_onnx(model, im, file, opset, train, dynamic, simplify, prefix=colorstr('ONNX:')):
print('anchors:', model.yaml['anchors'])
wtxt = open('class.names', 'w')
for name in model.names:
wtxt.write(name+'
')
wtxt.close()
# YOLOv5 ONNX export
print(im.shape)
if not dynamic:
f = os.path.splitext(file)[0] + '.onnx'
torch.onnx.export(model, im, f, verbose=False, opset_version=12, input_names=['images'], output_names=['output'])
else:
f = os.path.splitext(file)[0] + '_dynamic.onnx'
torch.onnx.export(model, im, f, verbose=False, opset_version=12, input_names=['images'],
output_names=['output'], dynamic_axes={'images': {0: 'batch', 2: 'height', 3: 'width'}, # shape(1,3,640,640)
'output': {0: 'batch', 1: 'anchors'} # shape(1,25200,85)
})
return f
在cmd中輸入轉(zhuǎn)onnx的命令(記得將export.py和pt模型放在同一路徑下):
python export.py --weights yolov5s.pt --include onnx
如下圖所示為轉(zhuǎn)化成功界面
其中yolov5s可替換為yolov5myolov5myolov5lyolov5x
三、LabVIEW調(diào)用YOLOv5模型實現(xiàn)實時物體識別(yolov5_new_opencv.vi)
本例中使用LabvVIEW工具包中opencv的dnn模塊readNetFromONNX()載入onnx模型,可選擇使用cuda進(jìn)行推理加速。
1.查看模型
我們可以使用netron 查看yolov5m.onnx的網(wǎng)絡(luò)結(jié)構(gòu),瀏覽器中輸入鏈接: https://netron.app/,點擊Open Model,打開相應(yīng)的網(wǎng)絡(luò)模型文件即可。**
**
如下圖所示是轉(zhuǎn)換之后的yolov5m.onnx的屬性:
2.參數(shù)及輸出
blobFromImage參數(shù):
size:640*640
Scale=1/255
Means=[0,0,0]
Net.forward()輸出:
**單數(shù)組 25200*85 **
3.LabVIEW調(diào)用YOLOv5源碼
如下圖所示,調(diào)用攝像頭實現(xiàn)實時物體識別
4.LabVIEW調(diào)用YOLOv5實時物體識別結(jié)果
本次我們是以yolov5m.onnx為例來測試識別結(jié)果和速度的;
**不使用GPU加速,僅在CPU模式下,實時檢測推理用時在300ms/frame左右
使用GPU加速,實時檢測推理用時為****30~40ms/frame ,是cpu速度的十倍多**
如需源碼,請關(guān)注微信公眾號:VIRobotics?;貜?fù)關(guān)鍵字“yolov5”。
**
審核編輯 黃宇
以上就是今天要給大家分享的內(nèi)容,本次分享內(nèi)容實驗環(huán)境說明:操作系統(tǒng)為Windows10,python版本為3.6及以上,LabVIEW為2018及以上 64位版本,視覺工具包為博客開頭提到的工具包。
如果文章對你有幫助,歡迎關(guān)注、點贊、收藏
審核編輯 黃宇
-
LabVIEW
+關(guān)注
關(guān)注
1970文章
3654瀏覽量
323290 -
目標(biāo)檢測
+關(guān)注
關(guān)注
0文章
209瀏覽量
15605 -
物體識別
+關(guān)注
關(guān)注
0文章
16瀏覽量
7500
發(fā)布評論請先 登錄
相關(guān)推薦
評論