前言
前面給大家介紹了使用LabVIEW工具包實(shí)現(xiàn)圖像分類,目標(biāo)檢測,今天我們來看一下如何使用LabVIEW實(shí)現(xiàn)Mask R-CNN圖像實(shí)例分割。
一、什么是圖像實(shí)例分割?
圖像實(shí)例分割(Instance Segmentation)是在語義檢測(Semantic Segmentation)的基礎(chǔ)上進(jìn)一步細(xì)化,分離對象的前景與背景,實(shí)現(xiàn)像素級別的對象分離。并且圖像的語義分割與圖像的實(shí)例分割是兩個不同的概念,語義分割僅僅會區(qū)別分割出不同類別的物體,而實(shí)例分割則會進(jìn)一步的分割出同一個類中的不同實(shí)例的物體。
計(jì)算機(jī)視覺中常見的一些任務(wù)(分類,檢測,語義分割,實(shí)例分割)
二、什么是Mask R-CNN
Mask R-CNN是一個實(shí)例分割(Instance segmentation)算法,可以用來做“目標(biāo)檢測”、“目標(biāo)實(shí)例分割”、“目標(biāo)關(guān)鍵點(diǎn)檢測”。 Mask R-CNN算法步驟:
- 首先,輸入一幅你想處理的圖片,然后進(jìn)行對應(yīng)的預(yù)處理操作,或者預(yù)處理后的圖片;
- 將其輸入到一個預(yù)訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)中(ResNeXt等)獲得對應(yīng)的feature map;
- 對這個feature map中的每一點(diǎn)設(shè)定預(yù)定的ROI,從而獲得多個候選ROI;
- 將這些候選的ROI送入RPN網(wǎng)絡(luò)進(jìn)行二值分類(前景或背景)和BB回歸,過濾掉一部分候選的ROI
- 接著,對這些剩下的ROI進(jìn)行ROIAlign操作(即先將原圖和feature map的pixel對應(yīng)起來,然后
- feature map和固定的feature對應(yīng)起來);
- **最后,對這些ROI進(jìn)行分類(N類別分類)、BB回歸和MASK生成(在每一個ROI里面進(jìn)行FCN操作) **
三、LabVIEW調(diào)用Mask R-CNN圖像實(shí)例分割模型
1、Mask R-CNN模型獲取及轉(zhuǎn)換
- 安裝pytorch和torchvision
- 獲取torchvision中的模型(我們獲取預(yù)訓(xùn)練好的模型):
model = models.detection.maskrcnn_resnet50_fpn(pretrained=True)
- 轉(zhuǎn)onnx
def get_pytorch_onnx_model(original_model):
model=original_model
# define the directory for further converted model save
onnx_model_path = dirname
# define the name of further converted model
onnx_model_name = "maskrcnn_resnet50.onnx"
?
# create directory for further converted model
os.makedirs(onnx_model_path, exist_ok=True)
?
# get full path to the converted model
full_model_path = os.path.join(onnx_model_path, onnx_model_name)
model.eval()
?
x = torch.rand(1, 3, 640, 640)
# model export into ONNX format
torch.onnx.export(
original_model,
x,
full_model_path,
input_names=["input"],
output_names=["boxes", "labels", "scores", "masks"],
dynamic_axes={"input": [0, 1, 2, 3],"boxes": [0, 1],"labels": [0],"scores": [0],"masks": [0, 1, 2, 3]},
verbose=True,opset_version=11
)
?
return full_model_path
完整獲取及模型轉(zhuǎn)換python代碼如下:
import os
import torch
import torch.onnx
from torch.autograd import Variable
from torchvision import models
?
dirname, filename = os.path.split(os.path.abspath(__file__))
print(dirname)
?
def get_pytorch_onnx_model(original_model):
model=original_model
# define the directory for further converted model save
onnx_model_path = dirname
# define the name of further converted model
onnx_model_name = "maskrcnn_resnet50.onnx"
?
# create directory for further converted model
os.makedirs(onnx_model_path, exist_ok=True)
?
# get full path to the converted model
full_model_path = os.path.join(onnx_model_path, onnx_model_name)
model.eval()
?
x = torch.rand(1, 3, 640, 640)
# model export into ONNX format
torch.onnx.export(
original_model,
x,
full_model_path,
input_names=["input"],
output_names=["boxes", "labels", "scores", "masks"],
dynamic_axes={"input": [0, 1, 2, 3],"boxes": [0, 1],"labels": [0],"scores": [0],"masks": [0, 1, 2, 3]},
verbose=True,opset_version=11
)
?
return full_model_path
?
?
model = models.detection.maskrcnn_resnet50_fpn(pretrained=True)
print(get_pytorch_onnx_model(model))
2、LabVIEW調(diào)用 Mask R-CNN (mask rcnn.vi)
注意:Mask R-CNN模型是沒辦法使用OpenCV dnn去加載的,因?yàn)橛行┧阕硬恢С?,所以我們主要使用LabVIEW開放神經(jīng)網(wǎng)絡(luò)交互工具包(ONNX)來加載推理模型。
-
onnxruntime調(diào)用onnx模型并選擇加速方式
-
**圖像預(yù)處理 **
-
**執(zhí)行推理 **
我們使用的模型是:maskrcnn_resnet50_fpn,其輸出有四層,分別為boxes,labels,scores,masks,數(shù)據(jù)類型如下:
** 可以看到,labels的類型為INT64,所以我們的源碼中需要“Get_Rresult_int64.vi,index為1,因?yàn)閘abels為第二層,即下標(biāo)為1;**
另外三個輸出我們都可以使用float32來獲取了,masks雖然數(shù)據(jù)類型是uint8,但在實(shí)操過程中發(fā)現(xiàn),它其實(shí)做過歸一化處理了,也可以使用float32.
-
后處理并實(shí)現(xiàn)實(shí)例分割
因?yàn)楹筇幚韮?nèi)容較多,所以直接封裝為了一個子VI, mask_rcnn_post_process.vi,源碼如下:
** 整體的程序框架如下:**
實(shí)例分割結(jié)果如下,我們會發(fā)現(xiàn)這個模型跑起來,他花的時間比之前就更長了。因?yàn)樗坏@取每一個對象的區(qū)域,還要也要把這個區(qū)域的輪廓給框出來,我們可以看到五個人及籃球都框出來了,使用不同的顏色分割出來了。
3、LabVIEW調(diào)用 Mask R-CNN 實(shí)現(xiàn)實(shí)時圖像分割(mask rcnn_camera.vi)
整體思想和上面檢測圖片的實(shí)力分割差不多,不過使用了攝像頭,并加了一個循環(huán),對每一幀對象進(jìn)行實(shí)力分割,3080系列顯卡可選擇TensorRT加速推理,分割會更加流暢。我們發(fā)現(xiàn)這個模型其實(shí)很考驗(yàn)檢測數(shù)量的,所以如果你只是對人進(jìn)行分割,那可以選擇一個干凈一些的背景,整體檢測速度就會快很多。
大家可關(guān)注微信公眾號: VIRobotics ,回復(fù)關(guān)鍵字: Mask R-CNN圖像實(shí)例分割源碼 獲取本次分享內(nèi)容的完整項(xiàng)目源碼及模型。
四、Mask-RCNN訓(xùn)練自己的數(shù)據(jù)集(檢測行人)
1.準(zhǔn)備工作
- 訓(xùn)練需要jupyterlab環(huán)境,沒有安裝的同學(xué)需要通過pip install jupyterlab 安裝
- **如果無法解決jupyterlab環(huán)境 可以使用colab或者kaggle提供的免費(fèi)gpu環(huán)境進(jìn)行訓(xùn)練 **
- 訓(xùn)練源碼:mask-rcnn.ipynb
2.開始訓(xùn)練
-
**根據(jù)提示運(yùn)行這段代碼,自動或手動下載依賴文件數(shù)據(jù)集并建立數(shù)據(jù)集解析類 **
-
定義單輪訓(xùn)練的函數(shù):網(wǎng)絡(luò)結(jié)構(gòu)直接采用torchvison里現(xiàn)有的,不再重新定義
-
出現(xiàn)如下輸出表示訓(xùn)練進(jìn)行中
-
**修改這個文件名,改成自己的圖片名字,運(yùn)行看下訓(xùn)練效果 **
3、訓(xùn)練效果
4、導(dǎo)出ONNX
如果文章對你有幫助,歡迎關(guān)注、點(diǎn)贊、收藏
審核編輯 黃宇
-
LabVIEW
+關(guān)注
關(guān)注
1970文章
3654瀏覽量
323307 -
圖像分類
+關(guān)注
關(guān)注
0文章
90瀏覽量
11914 -
目標(biāo)檢測
+關(guān)注
關(guān)注
0文章
209瀏覽量
15605
發(fā)布評論請先 登錄
相關(guān)推薦
評論