0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

手把手教你使用LabVIEW實現(xiàn)Mask R-CNN圖像實例分割(含源碼)

LabVIEW深度學習實戰(zhàn) ? 來源: LabVIEW深度學習實戰(zhàn) ? 作者: LabVIEW深度學習實 ? 2023-03-21 13:39 ? 次閱讀

前言

前面給大家介紹了使用LabVIEW工具包實現(xiàn)圖像分類,目標檢測,今天我們來看一下如何使用LabVIEW實現(xiàn)Mask R-CNN圖像實例分割。


一、什么是圖像實例分割?

圖像實例分割(Instance Segmentation)是在語義檢測(Semantic Segmentation)的基礎(chǔ)上進一步細化,分離對象的前景與背景,實現(xiàn)像素級別的對象分離。并且圖像的語義分割與圖像的實例分割是兩個不同的概念,語義分割僅僅會區(qū)別分割出不同類別的物體,而實例分割則會進一步的分割出同一個類中的不同實例的物體。

計算機視覺中常見的一些任務(wù)(分類,檢測,語義分割,實例分割)

在這里插入圖片描述

二、什么是Mask R-CNN

在這里插入圖片描述

Mask R-CNN是一個實例分割(Instance segmentation)算法,可以用來做“目標檢測”、“目標實例分割”、“目標關(guān)鍵點檢測”。 Mask R-CNN算法步驟:

  • 首先,輸入一幅你想處理的圖片,然后進行對應(yīng)的預(yù)處理操作,或者預(yù)處理后的圖片;
  • 將其輸入到一個預(yù)訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)中(ResNeXt等)獲得對應(yīng)的feature map;
  • 對這個feature map中的每一點設(shè)定預(yù)定的ROI,從而獲得多個候選ROI;
  • 將這些候選的ROI送入RPN網(wǎng)絡(luò)進行二值分類(前景或背景)和BB回歸,過濾掉一部分候選的ROI
  • 接著,對這些剩下的ROI進行ROIAlign操作(即先將原圖和feature map的pixel對應(yīng)起來,然后
  • feature map和固定的feature對應(yīng)起來);
  • **最后,對這些ROI進行分類(N類別分類)、BB回歸和MASK生成(在每一個ROI里面進行FCN操作) **

三、LabVIEW調(diào)用Mask R-CNN圖像實例分割模型

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去加載的,因為有些算子不支持,所以我們主要使用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,因為labels為第二層,即下標為1;**

    在這里插入圖片描述

    另外三個輸出我們都可以使用float32來獲取了,masks雖然數(shù)據(jù)類型是uint8,但在實操過程中發(fā)現(xiàn),它其實做過歸一化處理了,也可以使用float32.

    在這里插入圖片描述

  • 后處理并實現(xiàn)實例分割

    因為后處理內(nèi)容較多,所以直接封裝為了一個子VI, mask_rcnn_post_process.vi,源碼如下:在這里插入圖片描述

    ** 整體的程序框架如下:**在這里插入圖片描述

    實例分割結(jié)果如下,我們會發(fā)現(xiàn)這個模型跑起來,他花的時間比之前就更長了。因為他不但要獲取每一個對象的區(qū)域,還要也要把這個區(qū)域的輪廓給框出來,我們可以看到五個人及籃球都框出來了,使用不同的顏色分割出來了。

    在這里插入圖片描述

3、LabVIEW調(diào)用 Mask R-CNN 實現(xiàn)實時圖像分割(mask rcnn_camera.vi)

整體思想和上面檢測圖片的實力分割差不多,不過使用了攝像頭,并加了一個循環(huán),對每一幀對象進行實力分割,3080系列顯卡可選擇TensorRT加速推理,分割會更加流暢。我們發(fā)現(xiàn)這個模型其實很考驗檢測數(shù)量的,所以如果你只是對人進行分割,那可以選擇一個干凈一些的背景,整體檢測速度就會快很多。

在這里插入圖片描述

在這里插入圖片描述

大家可關(guān)注微信公眾號: VIRobotics ,回復(fù)關(guān)鍵字: Mask R-CNN圖像實例分割源碼 獲取本次分享內(nèi)容的完整項目源碼及模型。

四、Mask-RCNN訓(xùn)練自己的數(shù)據(jù)集(檢測行人)

1.準備工作

  • 訓(xùn)練需要jupyterlab環(huán)境,沒有安裝的同學需要通過pip install jupyterlab 安裝
  • **如果無法解決jupyterlab環(huán)境 可以使用colab或者kaggle提供的免費gpu環(huán)境進行訓(xùn)練 **
  • 訓(xùn)練源碼:mask-rcnn.ipynb

2.開始訓(xùn)練

  • **根據(jù)提示運行這段代碼,自動或手動下載依賴文件數(shù)據(jù)集并建立數(shù)據(jù)集解析類 **

    在這里插入圖片描述

  • 定義單輪訓(xùn)練的函數(shù):網(wǎng)絡(luò)結(jié)構(gòu)直接采用torchvison里現(xiàn)有的,不再重新定義

    在這里插入圖片描述

  • 出現(xiàn)如下輸出表示訓(xùn)練進行中

    在這里插入圖片描述

  • **修改這個文件名,改成自己的圖片名字,運行看下訓(xùn)練效果 **

    在這里插入圖片描述

3、訓(xùn)練效果

在這里插入圖片描述

4、導(dǎo)出ONNX

在這里插入圖片描述


如果文章對你有幫助,歡迎關(guān)注、點贊、收藏

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • LabVIEW
    +關(guān)注

    關(guān)注

    1961

    文章

    3651

    瀏覽量

    321993
  • 圖像分類
    +關(guān)注

    關(guān)注

    0

    文章

    89

    瀏覽量

    11897
  • 目標檢測
    +關(guān)注

    關(guān)注

    0

    文章

    200

    瀏覽量

    15578
收藏 人收藏

    評論

    相關(guān)推薦

    【匯總篇】小草手把手教你 LabVIEW 串口儀器控制

    視頻教程,請查看如下學院課程:小草手把手實例集錦(包含攝像頭圖像、串口、VAS采集、JKI狀態(tài)機等)http://t.elecfans.com/1902.html小草手把手
    發(fā)表于 02-04 10:45

    【原創(chuàng)視頻】小草手把手教你LabVIEW之VISION圖像采集

    點擊學習>>《龍哥手把手教你LabVIEW視覺設(shè)計》視頻教程視頻內(nèi)容:手把手講解如何通過筆記本自帶攝像頭,或者一般USB攝像頭,通過directshow來獲取
    發(fā)表于 05-01 12:37

    【視頻匯總】小草大神手把手教你Labview技巧及源代碼分享

    /jishu_484288_1_1.html小草手把手教你LabVIEW之VISION圖像采集(20150501)https://bbs.elecfans.com/jishu_4800
    發(fā)表于 05-26 13:48

    手把手教你LabVIEW儀器控制

    手把手教你LabVIEW儀器控制,串口學習
    發(fā)表于 12-11 12:00

    手把手教你寫批處理-批處理的介紹

    手把手教你寫批處理-批處理的介紹
    發(fā)表于 10-25 15:02 ?69次下載

    美女手把手教你如何裝機(中)

    美女手把手教你如何裝機(中) 再來是硬碟的部份,這款機殼還不錯,可以旋轉(zhuǎn)支架~
    發(fā)表于 01-27 11:14 ?1451次閱讀

    美女手把手教你如何裝機(下)

    美女手把手教你如何裝機(下) 接著下來就是今天的重頭戲,開核蘿!~
    發(fā)表于 01-27 11:16 ?2914次閱讀

    小草手把手教你LabVIEW儀器控制V1.0

    小草手把手教你LabVIEW儀器控制V1.0 ,感興趣的小伙伴們可以看看。
    發(fā)表于 08-03 17:55 ?94次下載

    手把手教你安裝Quartus II

    本章手把手把教你如何安裝 Quartus II 軟件 ,并將它激活 。此外 還有USB -Blaster下載器的驅(qū)動安裝步驟 。
    發(fā)表于 09-18 14:55 ?9次下載

    手把手教你如何開始DSP編程

    手把手教你如何開始DSP編程。
    發(fā)表于 04-09 11:54 ?12次下載
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>如何開始DSP編程

    什么是Mask R-CNN?Mask R-CNN的工作原理

    它的概念很簡單:對于每個目標對象,F(xiàn)aster R-CNN都有兩個輸出,一是分類標簽,二是候選窗口;為了分割目標像素,我們可以在前兩個輸出的基礎(chǔ)上增加第三個輸出——指示對象在窗口中像素位置的二進制
    的頭像 發(fā)表于 07-20 08:53 ?6.8w次閱讀

    手把手教你LabVIEW視覺設(shè)計

    手把手教你LabVIEW視覺設(shè)計手把手教你LabVIEW視覺設(shè)計
    發(fā)表于 03-06 01:41 ?3093次閱讀

    手把手教你操作Faster R-CNNMask R-CNN

    Mask R-CNN是承繼于Faster R-CNNMask R-CNN只是在Faster R-CNN
    的頭像 發(fā)表于 04-04 16:32 ?1.3w次閱讀

    用于實例分割Mask R-CNN框架

    是應(yīng)用于每個 RoI 的小型 FCN,以像素到像素的方式預(yù)測分割掩碼。鑒于 Faster R-CNN 框架,Mask R-CNN 易于實現(xiàn)
    的頭像 發(fā)表于 04-13 10:40 ?2573次閱讀

    手把手教你學FPGA仿真

    電子發(fā)燒友網(wǎng)站提供《手把手教你學FPGA仿真.pdf》資料免費下載
    發(fā)表于 10-19 09:17 ?2次下載
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>學FPGA仿真