主頁 > 作業系統 > 使用LabVIEW實作基于pytorch的DeepLabv3影像語意分割

使用LabVIEW實作基于pytorch的DeepLabv3影像語意分割

2022-11-05 06:11:04 作業系統


 


前言

今天我們一起來看一下如何使用LabVIEW實作語意分割,

一、什么是語意分割

影像語意分割(semantic segmentation),從字面意思上理解就是讓計算機根據影像的語意來進行分割,例如讓計算機在輸入下面左圖的情況下,能夠輸出右圖,語意在語音識別中指的是語音的意思,在影像領域,語意指的是影像的內容,對圖片意思的理解,比如下圖的語意就是一個人牽著四只羊;分割的意思是從像素的角度分割出圖片中的不同物件,對原圖中的每個像素都進行標注,比如下圖中淺黃色代表人,藍綠色代表羊,語意分割任務就是將圖片中的不同類別,用不同的顏色標記出來,每一個類別使用一種顏色,常用于醫學影像,衛星影像,無人車駕駛,機器人等領域, 在這里插入圖片描述

  • 如何做到將像素點上色呢?

語意分割的輸出和影像分類網路類似,影像分類類別數是一個一維的one hot 矩陣,例如:三分類的[0,1,0],語意分割任務最后的輸出特征圖是一個三維結構,大小與原圖類似,其中通道數是類別數,每個通道所標記的像素點,是該類別在影像中的位置,最后通過argmax 取每個通道有用像素 合成一張影像,用不同顏色表示其類別位置, 語意分割任務其實也是分類任務中的一種,他不過是對每一個像素點進行細分,找到每一個像素點所述的類別, 這就是語意分割任務啦~

在這里插入圖片描述

二、什么是deeplabv3

DeepLabv3是一種語意分割架構,它在DeepLabv2的基礎上進行了一些修改,為了處理在多個尺度上分割物件的問題,設計了在級聯或并行中采用多孔卷積的模塊,通過采用多個多孔速率來捕獲多尺度背景關系,此外,來自 DeepLabv2 的 Atrous Spatial Pyramid Pooling模塊增加了編碼全域背景關系的影像級特征,并進一步提高了性能, 在這里插入圖片描述

三、LabVIEW呼叫DeepLabv3實作影像語意分割

1、模型獲取及轉換

  • 安裝pytorch和torchvision

  • 獲取torchvision中的模型:deeplabv3_resnet101(我們獲取預訓練好的模型):

 original_model = models.segmentation.deeplabv3_resnet101(pretrained=True)

 

  • 轉onnx

 1 def get_pytorch_onnx_model(original_model):
 2     # define the directory for further converted model save
 3     onnx_model_path = dirname
 4     # define the name of further converted model
 5     onnx_model_name = "deeplabv3_resnet101.onnx"
 6 ?
 7     # create directory for further converted model
 8     os.makedirs(onnx_model_path, exist_ok=True)
 9 ?
10     # get full path to the converted model
11     full_model_path = os.path.join(onnx_model_path, onnx_model_name)
12 ?
13     # generate model input
14     generated_input = Variable(
15         torch.randn(1, 3, 448, 448)
16     )
17 ?
18     # model export into ONNX format
19     torch.onnx.export(
20         original_model,
21         generated_input,
22         full_model_path,
23         verbose=True,
24         input_names=["input"],
25         output_names=["output",'aux'],
26         opset_version=11
27     )
28 ?
29     return full_model_path
View Code

 

完整獲取及模型轉換python代碼如下:

 1 import os
 2 import torch
 3 import torch.onnx
 4 from torch.autograd import Variable
 5 from torchvision import models
 6 import re
 7 ?
 8 dirname, filename = os.path.split(os.path.abspath(__file__))
 9 print(dirname)
10 ?
11 def get_pytorch_onnx_model(original_model):
12     # define the directory for further converted model save
13     onnx_model_path = dirname
14     # define the name of further converted model
15     onnx_model_name = "deeplabv3_resnet101.onnx"
16 ?
17     # create directory for further converted model
18     os.makedirs(onnx_model_path, exist_ok=True)
19 ?
20     # get full path to the converted model
21     full_model_path = os.path.join(onnx_model_path, onnx_model_name)
22 ?
23     # generate model input
24     generated_input = Variable(
25         torch.randn(1, 3, 448, 448)
26     )
27 ?
28     # model export into ONNX format
29     torch.onnx.export(
30         original_model,
31         generated_input,
32         full_model_path,
33         verbose=True,
34         input_names=["input"],
35         output_names=["output",'aux'],
36         opset_version=11
37     )
38 ?
39     return full_model_path
40 ?
41 ?
42 def main():
43     # initialize PyTorch ResNet-101 model
44     original_model = models.segmentation.deeplabv3_resnet101(pretrained=True)
45 ?
46     # get the path to the converted into ONNX PyTorch model
47     full_model_path = get_pytorch_onnx_model(original_model)
48     print("PyTorch ResNet-101 model was successfully converted: ", full_model_path)
49 ?
50 ?
51 if __name__ == "__main__":
52     main()
View Code

?

我們會發現,基于pytorch的DeepLabv3模型獲取和之前的mask rcnn模型大同小異,

2、關于deeplabv3_resnet101

我們使用的模型是:deeplabv3_resnet101,該模型回傳兩個張量,與輸入張量相同,但有21個classes,輸出[“out”]包含語意掩碼,而輸出[“aux”]包含每像素的輔助損失值,在推理模式中,輸出[‘aux]沒有用處,因此,輸出“out”形狀為(N、21、H、W),我們在轉模型的時候設定H,W為448,N一般為1;

我們的模型是基于VOC2012資料集 VOC2012資料集分為20類,包括背景為21類,分別如下:

  • 人 :人

  • 動物:鳥、貓、牛、狗、馬、羊

  • 車輛:飛機、自行車、船、巴士、汽車、摩托車、火車

  • 室內:瓶、椅子、餐桌、盆栽植物、沙發、電視/監視器

    在這里插入圖片描述

3、LabVIEW opencv dnn呼叫 deeplabv3 實作影像語意分割(deeplabv3_opencv.vi)

deeplabv3模型可以使用OpenCV dnn去加載的,也可以使用onnxruntime加載推理,所以我們分兩種方式給大家介紹LabVIEW呼叫deeplabv3實作影像語意分割,

  • opencv dnn 呼叫onnx模型并選擇

在這里插入圖片描述

  • 影像預處理 最侄訓是采用了比較中規中矩的處理方式

在這里插入圖片描述

  • 執行推理

在這里插入圖片描述

  • 后處理并實作實體分割 因為后處理內容較多,所以直接封裝為了一個子VI, deeplabv3_postprocess.vi,因為Labview沒有專門的切片函式,所以會稍慢一些,所以接下來還會開發針對后處理和矩陣有關的函式,加快處理結果,

  • 整體的程式框架如下:

在這里插入圖片描述

  • 語意分割結果如下:

在這里插入圖片描述

4、LabVIEW onnxruntime呼叫 deeplabv3實作影像語意分割 (deeplabv3_onnx.vi)

  • 整體的程式框架如下:

在這里插入圖片描述

  • 語意分割結果如下:

在這里插入圖片描述

5、LabVIEW onnxruntime呼叫 deeplabv3 使用TensorRT加速模型實作影像語意分割(deeplabv3_onnx_camera.vi)

在這里插入圖片描述

如上圖所示,可以看到可以把人和背景完全分割開來,使用TensorRT加速推理,速度也比較快,


四、deeplabv3訓練自己的資料集

訓練可參考:https://github.com/pytorch/vision

總結

以上就是今天要給大家分享的內容,大家可關注微信公眾號: VIRobotics,回復關鍵字:DeepLabv3影像語意分割原始碼  獲取本次分享內容的完整專案原始碼及模型,

如果有問題可以在評論區里討論,提問前請先點贊支持一下博主哦,如您想要探討更多關于LabVIEW與人工智能技術,歡迎加入我們的技術交流群:705637299,

如果文章對你有幫助,歡迎關注、點贊、收藏

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/527742.html

標籤:其他

上一篇:iShowU Studio for Mac(高清錄屏工具)

下一篇:深入理解sed模式空間——sed 'n;p'

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more