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

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

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

關(guān)于如何使用MATLAB 深度學(xué)習(xí)進(jìn)行語義分割的方法詳解

MATLAB ? 來源:djl ? 2019-09-12 11:30 ? 次閱讀

這篇文章展示了一個(gè)具體的文檔示例,演示如何使用深度學(xué)習(xí)和 Computer Vision System Toolbox 訓(xùn)練語義分割網(wǎng)絡(luò)。

語義分割網(wǎng)絡(luò)對圖像中的每個(gè)像素進(jìn)行分類,從而生成按類分割的圖像。語義分割的應(yīng)用包括用于自動(dòng)駕駛的道路分割和醫(yī)學(xué)診斷中的癌細(xì)胞分割。

如需了解更多文檔示例和詳細(xì)信息,建議查閱技術(shù)文檔:https://cn.mathworks.com/help

為了說明訓(xùn)練過程,本示例將訓(xùn)練 SegNet,一種用于圖像語義分割的卷積神經(jīng)網(wǎng)絡(luò) (CNN)。用于語義分割的其他類型網(wǎng)絡(luò)包括全卷積網(wǎng)絡(luò) (FCN) 和 U-Net。以下所示訓(xùn)練過程也可應(yīng)用于這些網(wǎng)絡(luò)。

本示例使用來自劍橋大學(xué)的CamVid 數(shù)據(jù)集展開訓(xùn)練。此數(shù)據(jù)集是包含駕駛時(shí)所獲得的街道級視圖的圖像集合。該數(shù)據(jù)集為 32 種語義類提供了像素級標(biāo)簽,包括車輛、行人和道路。

建立

本示例創(chuàng)建了 SegNet 網(wǎng)絡(luò),其權(quán)重從 VGG-16 網(wǎng)絡(luò)初始化。要獲取 VGG-16,請安裝Neural Network Toolbox Model for VGG-16 Network:

安裝完成后,運(yùn)行以下代碼以驗(yàn)證是否安裝正確。

vgg16();

此外,請下載預(yù)訓(xùn)練版 SegNet。預(yù)訓(xùn)練模型可支持您運(yùn)行整個(gè)示例,而無需等待訓(xùn)練完成。

關(guān)于如何使用MATLAB 深度學(xué)習(xí)進(jìn)行語義分割的方法詳解

強(qiáng)烈建議采用計(jì)算能力為 3.0 或更高級別,支持 CUDA 的 NVIDIA GPU 來運(yùn)行本示例。使用 GPU 需要 Parallel Computing Toolbox。

下載 CamVid 數(shù)據(jù)集

從以下 URL 中下載 CamVid 數(shù)據(jù)集。

關(guān)于如何使用MATLAB 深度學(xué)習(xí)進(jìn)行語義分割的方法詳解

注意:數(shù)據(jù)下載時(shí)間取決于您的 Internet 連接情況。在下載完成之前,上面使用的命令會(huì)阻止訪問 MATLAB?;蛘撸梢允褂?Web 瀏覽器先將數(shù)據(jù)集下載到本地磁盤。要使用從 Web 中下載的文件,請將上述 outputFolder 變量更改為下載文件的位置。

加載 CamVid 圖像

用于加載 CamVid 圖像。借助 imageDatastore,可以高效地加載磁盤上的大量圖像數(shù)據(jù)。

imgDir = fullfile(outputFolder,'images','701_StillsRaw_full');imds = imageDatastore(imgDir);

顯示其中一個(gè)圖像。

I = readimage(imds,1);I = histeq(I);imshow(I)

加載 CamVid 像素標(biāo)簽圖像

使用imageDatastore加載 CamVid 像素標(biāo)簽圖像。pixelLabelDatastore 將像素標(biāo)簽數(shù)據(jù)和標(biāo)簽 ID 封裝到類名映射中。

按照 SegNet 原創(chuàng)論文(Badrinarayanan、Vijay、Alex Kendall 和 Roberto Cipolla:《SegNet:用于圖像分割的一種深度卷積編碼器-解碼器架構(gòu)》(SegNet: A Deep Convolutional Encoder-Decoder Architecture for ImageSegmentation)。arXiv 預(yù)印本:1511.00561,201)中采用的步驟進(jìn)行操作,將 CamVid 中的 32 個(gè)原始類分組為 11 個(gè)類。指定這些類。

classes = [ "Sky" "Building" "Pole" "Road" "Pavement" "Tree" "SignSymbol" "Fence" "Car" "Pedestrian" "Bicyclist" ];

要將 32 個(gè)類減少為 11 個(gè),請將原始數(shù)據(jù)集中的多個(gè)類組合在一起。例如,“Car” 是 “Car” 、 “SUVPickupTruck” 、 “Truck_Bus” 、 “Train” 和 “OtherMoving” 的組合。使用支持函數(shù) camvidPixelLabelIDs 返回已分組的標(biāo)簽 ID,該函數(shù)會(huì)在本示例的末尾列出。

labelIDs = camvidPixelLabelIDs();

使用這些類和標(biāo)簽 ID 創(chuàng)建 pixelLabelDatastore。

labelDir = fullfile(outputFolder,'labels');pxds = pixelLabelDatastore(labelDir,classes,labelIDs);

讀取并在一幅圖像上疊加顯示像素標(biāo)簽圖像。

C = readimage(pxds,1);cmap = camvidColorMap;B = labeloverlay(I,C,'ColorMap',cmap);imshow(B)pixelLabelColorbar(cmap,classes);

沒有顏色疊加的區(qū)域沒有像素標(biāo)簽,在訓(xùn)練期間不會(huì)使用這些區(qū)域。

分析數(shù)據(jù)集統(tǒng)計(jì)信息

要查看 CamVid 數(shù)據(jù)集中類標(biāo)簽的分布情況,請使用countEachLabel。此函數(shù)會(huì)按類標(biāo)簽計(jì)算像素?cái)?shù)。

tbl = countEachLabel(pxds)

關(guān)于如何使用MATLAB 深度學(xué)習(xí)進(jìn)行語義分割的方法詳解

按類可視化像素計(jì)數(shù)。

frequency = tbl.PixelCount/sum(tbl.PixelCount);bar(1:numel(classes),frequency)xticks(1:numel(classes)) xticklabels(tbl.Name)xtickangle(45)ylabel('Frequency')

關(guān)于如何使用MATLAB 深度學(xué)習(xí)進(jìn)行語義分割的方法詳解

理想情況下,所有類都有相同數(shù)量的觀察結(jié)果。但是,CamVid 中的這些類比例失衡,這是街道場景汽車數(shù)據(jù)集中的常見問題。由于天空、建筑物和道路覆蓋了圖像中的更多區(qū)域,因此相比行人和騎自行車者像素,這些場景擁有更多的天空、建筑物和道路像素。如果處理不當(dāng),這種失衡可能影響學(xué)習(xí)過程,因?yàn)閷W(xué)習(xí)過程偏向主導(dǎo)類。在本示例中,您稍后將使用類權(quán)重來處理此問題。

調(diào)整 CamVid 數(shù)據(jù)的大小

CamVid 數(shù)據(jù)集中的圖像大小為 720 x 960。要減少訓(xùn)練時(shí)間和內(nèi)存使用量,請將圖像和像素標(biāo)記圖像的大小調(diào)整為 360 x 480。resizeCamVidImages 和 resizeCamVidPixelLabels 是本示例末尾所列出的支持函數(shù)。

關(guān)于如何使用MATLAB 深度學(xué)習(xí)進(jìn)行語義分割的方法詳解

準(zhǔn)備訓(xùn)練集和測試集

使用數(shù)據(jù)集中 60% 的圖像訓(xùn)練 SegNet。其余圖像用于測試。以下代碼會(huì)將圖像和像素標(biāo)記數(shù)據(jù)隨機(jī)分成訓(xùn)練集和測試集。

[imdsTrain,imdsTest,pxdsTrain,pxdsTest] = partitionCamVidData(imds,pxds);

60/40 拆分會(huì)生產(chǎn)以下數(shù)量的訓(xùn)練圖像和測試圖像:

numTrainingImages = numel(imdsTrain.Files)

numTrainingImages = 421

numTestingImages = numel(imdsTest.Files)

numTestingImages = 280

創(chuàng)建網(wǎng)絡(luò)

使用segnetLayers創(chuàng)建利用 VGG-16 權(quán)重初始化的 SegNet 網(wǎng)絡(luò)。segnetLayers 會(huì)自動(dòng)執(zhí)行傳輸 VGG-16 中的權(quán)重所需的網(wǎng)絡(luò)操作,并添加語義分割所需其他網(wǎng)絡(luò)層。

imageSize = [360 480 3];numClasses = numel(classes);lgraph = segnetLayers(imageSize,numClasses,'vgg16');

根據(jù)數(shù)據(jù)集中圖像的大小選擇圖像大小。根據(jù) CamVid 中的類選擇類的數(shù)量。

使用類權(quán)重平衡類

如前所示,CamVid 中的這些類比例失衡。要改進(jìn)訓(xùn)練情況,可以使用類權(quán)重來平衡這些類。使用之前通過countEachLayer計(jì)算的像素標(biāo)簽計(jì)數(shù),并計(jì)算中值頻率類權(quán)重。

imageFreq = tbl.PixelCount ./ tbl.ImagePixelCount;classWeights = median(imageFreq) ./ imageFreq

關(guān)于如何使用MATLAB 深度學(xué)習(xí)進(jìn)行語義分割的方法詳解

使用pixelClassificationLayer指定類權(quán)重。

pxLayer = pixelClassificationLayer('Name','labels','ClassNames',tbl.Name,'ClassWeights',classWeights)

關(guān)于如何使用MATLAB 深度學(xué)習(xí)進(jìn)行語義分割的方法詳解

通過刪除當(dāng)前 pixelClassificationLayer 并添加新層,使用新的 pixelClassificationLayer 更新 SegNet 網(wǎng)絡(luò)。當(dāng)前 pixelClassificationLayer 名為“pixelLabels”。使用removeLayers刪除該層,使用addLayers添加新層,然后使用connectLayers將新層連接到網(wǎng)絡(luò)的其余部分。

關(guān)于如何使用MATLAB 深度學(xué)習(xí)進(jìn)行語義分割的方法詳解

選擇訓(xùn)練選項(xiàng)

用于訓(xùn)練的優(yōu)化算法是引入動(dòng)量的隨機(jī)梯度下降 (SGDM) 算法。使用trainingOptions指定用于 SGDM 的超參數(shù)。

關(guān)于如何使用MATLAB 深度學(xué)習(xí)進(jìn)行語義分割的方法詳解

大小為 4 的 minimatch 用于減少訓(xùn)練時(shí)的內(nèi)存使用量。您可以根據(jù)系統(tǒng)中的 GPU 內(nèi)存量增加或減少此值。

數(shù)據(jù)擴(kuò)充

在訓(xùn)練期間使用數(shù)據(jù)擴(kuò)充向網(wǎng)絡(luò)提供更多示例,以便提高網(wǎng)絡(luò)的準(zhǔn)確性。此處,隨機(jī)左/右反射以及 +/- 10 像素的隨機(jī) X/Y 平移用于數(shù)據(jù)擴(kuò)充。用于指定這些數(shù)據(jù)擴(kuò)充參數(shù)。

關(guān)于如何使用MATLAB 深度學(xué)習(xí)進(jìn)行語義分割的方法詳解

imageDataAugmenter 支持其他幾種類型的數(shù)據(jù)擴(kuò)充。選擇它們需要經(jīng)驗(yàn)分析,并且這是另一個(gè)層次的超參數(shù)調(diào)整。

開始訓(xùn)練

使用pixelLabelImageDatastore組合訓(xùn)練數(shù)據(jù)和數(shù)據(jù)擴(kuò)充選擇。pixelLabelImageDatastore 會(huì)讀取批量訓(xùn)練數(shù)據(jù),應(yīng)用數(shù)據(jù)擴(kuò)充,并將已擴(kuò)充的數(shù)據(jù)發(fā)送至訓(xùn)練算法。

關(guān)于如何使用MATLAB 深度學(xué)習(xí)進(jìn)行語義分割的方法詳解

如果 doTraining 標(biāo)志為 true,則會(huì)開始訓(xùn)練。否則,會(huì)加載預(yù)訓(xùn)練網(wǎng)絡(luò)。注意:NVIDIA Titan X 上的訓(xùn)練大約需要 5 個(gè)小時(shí),根據(jù)您的 GPU 硬件具體情況,可能會(huì)需要更長的時(shí)間。

關(guān)于如何使用MATLAB 深度學(xué)習(xí)進(jìn)行語義分割的方法詳解

在圖像上測試網(wǎng)絡(luò)

作為快速完整性檢查,將在測試圖像上運(yùn)行已訓(xùn)練的網(wǎng)絡(luò)。

I = read(imdsTest);C = semanticseg(I, net);

顯示結(jié)果。

關(guān)于如何使用MATLAB 深度學(xué)習(xí)進(jìn)行語義分割的方法詳解

將 C 中的結(jié)果與 pxdsTest 中的預(yù)期真值進(jìn)行比較。綠色和洋紅色區(qū)域突出顯示了分割結(jié)果與預(yù)期真值不同的區(qū)域。

expectedResult = read(pxdsTest);actual = uint8(C);expected = uint8(expectedResult);imshowpair(actual, expected)

從視覺上看,道路、天空、建筑物等類的語義分割結(jié)果重疊情況良好。然而,行人和車輛等較小的對象則不那么準(zhǔn)確??梢允褂媒徊媛?lián)合 (IoU) 指標(biāo)(又稱 Jaccard 系數(shù))來測量每個(gè)類的重疊量。使用jaccard函數(shù)測量 IoU。

iou = jaccard(C, expectedResult);table(classes,iou)

關(guān)于如何使用MATLAB 深度學(xué)習(xí)進(jìn)行語義分割的方法詳解

IoU 指標(biāo)可確認(rèn)視覺效果。道路、天空和建筑物類具有較高的 IoU 分?jǐn)?shù),而行人和車輛等類的分?jǐn)?shù)較低。其他常見的分割指標(biāo)包括Dice 系數(shù)和Boundary-F1輪廓匹配分?jǐn)?shù)。

評估已訓(xùn)練的網(wǎng)絡(luò)

要測量多個(gè)測試圖像的準(zhǔn)確性,請?jiān)谡麄€(gè)測試集中運(yùn)行semanticseg。

pxdsResults = semanticseg(imdsTest,net,'MiniBatchSize',4,'WriteLocation',tempdir,'Verbose',false);

semanticseg 會(huì)將測試集的結(jié)果作為 pixelLabelDatastore 對象返回。imdsTest 中每個(gè)測試圖像的實(shí)際像素標(biāo)簽數(shù)據(jù)會(huì)在“WriteLocation”參數(shù)指定的位置寫入磁盤。使用evaluateSemanticSegmentation測量測試集結(jié)果的語義分割指標(biāo)。

metrics = evaluateSemanticSegmentation(pxdsResults,pxdsTest,'Verbose',false);

evaluateSemanticSegmentation返回整個(gè)數(shù)據(jù)集、各個(gè)類以及每個(gè)測試圖像的各種指標(biāo)。要查看數(shù)據(jù)集級別指標(biāo),請檢查 metrics.DataSetMetrics。

metrics.DataSetMetrics

關(guān)于如何使用MATLAB 深度學(xué)習(xí)進(jìn)行語義分割的方法詳解

數(shù)據(jù)集指標(biāo)可提供網(wǎng)絡(luò)性能的高級概述。要查看每個(gè)類對整體性能的影響,請使用 metrics.ClassMetrics 檢查每個(gè)類的指標(biāo)。

metrics.ClassMetrics

關(guān)于如何使用MATLAB 深度學(xué)習(xí)進(jìn)行語義分割的方法詳解

盡管數(shù)據(jù)集整體性能非常高,但類指標(biāo)顯示,諸如 Pedestrian、Bicyclist 和 Car 等代表性不足的類分割效果不如Road、Sky 和 Building 等類。附加數(shù)據(jù)多一些代表性不足類樣本可能會(huì)提升分割效果。

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

    關(guān)注

    14

    文章

    7387

    瀏覽量

    88208
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5422

    瀏覽量

    120587
收藏 人收藏

    評論

    相關(guān)推薦

    圖像語義分割的實(shí)用性是什么

    什么是圖像語義分割 圖像語義分割是一種將圖像中的所有像素點(diǎn)按照其語義類別進(jìn)行分類的任務(wù)。與傳統(tǒng)
    的頭像 發(fā)表于 07-17 09:56 ?227次閱讀

    圖像分割語義分割的區(qū)別與聯(lián)系

    圖像分割語義分割是計(jì)算機(jī)視覺領(lǐng)域中兩個(gè)重要的概念,它們在圖像處理和分析中發(fā)揮著關(guān)鍵作用。 1. 圖像分割簡介 圖像分割是將圖像劃分為多個(gè)區(qū)
    的頭像 發(fā)表于 07-17 09:55 ?326次閱讀

    利用Matlab函數(shù)實(shí)現(xiàn)深度學(xué)習(xí)算法

    Matlab中實(shí)現(xiàn)深度學(xué)習(xí)算法是一個(gè)復(fù)雜但強(qiáng)大的過程,可以應(yīng)用于各種領(lǐng)域,如圖像識別、自然語言處理、時(shí)間序列預(yù)測等。這里,我將概述一個(gè)基本的流程,包括環(huán)境設(shè)置、數(shù)據(jù)準(zhǔn)備、模型設(shè)計(jì)、訓(xùn)練過程、以及測試和評估,并提供一個(gè)基于
    的頭像 發(fā)表于 07-14 14:21 ?1159次閱讀

    基于Python的深度學(xué)習(xí)人臉識別方法

    基于Python的深度學(xué)習(xí)人臉識別方法是一個(gè)涉及多個(gè)技術(shù)領(lǐng)域的復(fù)雜話題,包括計(jì)算機(jī)視覺、深度學(xué)習(xí)、以及圖像處理等。在這里,我將概述一個(gè)基本的
    的頭像 發(fā)表于 07-14 11:52 ?935次閱讀

    機(jī)器學(xué)習(xí)中的數(shù)據(jù)分割方法

    在機(jī)器學(xué)習(xí)中,數(shù)據(jù)分割是一項(xiàng)至關(guān)重要的任務(wù),它直接影響到模型的訓(xùn)練效果、泛化能力以及最終的性能評估。本文將從多個(gè)方面詳細(xì)探討機(jī)器學(xué)習(xí)中數(shù)據(jù)分割方法
    的頭像 發(fā)表于 07-10 16:10 ?612次閱讀

    深度學(xué)習(xí)中的時(shí)間序列分類方法

    的發(fā)展,基于深度學(xué)習(xí)的TSC方法逐漸展現(xiàn)出其強(qiáng)大的自動(dòng)特征提取和分類能力。本文將從多個(gè)角度對深度學(xué)習(xí)在時(shí)間序列分類中的應(yīng)用
    的頭像 發(fā)表于 07-09 15:54 ?372次閱讀

    圖像分割語義分割中的CNN模型綜述

    圖像分割語義分割是計(jì)算機(jī)視覺領(lǐng)域的重要任務(wù),旨在將圖像劃分為多個(gè)具有特定語義含義的區(qū)域或?qū)ο?。卷積神經(jīng)網(wǎng)絡(luò)(CNN)作為深度
    的頭像 發(fā)表于 07-09 11:51 ?331次閱讀

    深度學(xué)習(xí)中的無監(jiān)督學(xué)習(xí)方法綜述

    深度學(xué)習(xí)作為機(jī)器學(xué)習(xí)領(lǐng)域的一個(gè)重要分支,近年來在多個(gè)領(lǐng)域取得了顯著的成果,特別是在圖像識別、語音識別、自然語言處理等領(lǐng)域。然而,深度學(xué)習(xí)模型
    的頭像 發(fā)表于 07-09 10:50 ?216次閱讀

    機(jī)器人視覺技術(shù)中圖像分割方法有哪些

    和分析。本文將詳細(xì)介紹圖像分割的各種方法,包括傳統(tǒng)的圖像處理方法和基于深度學(xué)習(xí)方法。 閾值
    的頭像 發(fā)表于 07-04 11:34 ?384次閱讀

    深度學(xué)習(xí)的模型優(yōu)化與調(diào)試方法

    深度學(xué)習(xí)模型在訓(xùn)練過程中,往往會(huì)遇到各種問題和挑戰(zhàn),如過擬合、欠擬合、梯度消失或爆炸等。因此,對深度學(xué)習(xí)模型進(jìn)行優(yōu)化與調(diào)試是確保其性能優(yōu)越的
    的頭像 發(fā)表于 07-01 11:41 ?455次閱讀

    深度解析深度學(xué)習(xí)下的語義SLAM

    隨著深度學(xué)習(xí)技術(shù)的興起,計(jì)算機(jī)視覺的許多傳統(tǒng)領(lǐng)域都取得了突破性進(jìn)展,例如目標(biāo)的檢測、識別和分類等領(lǐng)域。近年來,研究人員開始在視覺SLAM算法中引入深度學(xué)習(xí)技術(shù),使得
    發(fā)表于 04-23 17:18 ?992次閱讀
    <b class='flag-5'>深度</b>解析<b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b>下的<b class='flag-5'>語義</b>SLAM

    基于深度學(xué)習(xí)的3D點(diǎn)云實(shí)例分割方法

    3D實(shí)例分割(3DIS)是3D領(lǐng)域深度學(xué)習(xí)的核心問題。給定由點(diǎn)云表示的 3D 場景,我們尋求為每個(gè)點(diǎn)分配語義類和唯一的實(shí)例標(biāo)簽。 3DIS 是一項(xiàng)重要的 3D 感知任務(wù),在自動(dòng)駕駛、增
    發(fā)表于 11-13 10:34 ?1629次閱讀
    基于<b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b>的3D點(diǎn)云實(shí)例<b class='flag-5'>分割</b><b class='flag-5'>方法</b>

    機(jī)器視覺圖像分割方法有哪些?

    現(xiàn)有的圖像分割方法主要分以下幾類:基于閾值(threshold)的分割方法、基于區(qū)域的分割方法、
    發(fā)表于 11-02 10:26 ?965次閱讀
    機(jī)器視覺圖像<b class='flag-5'>分割</b>的<b class='flag-5'>方法</b>有哪些?

    深度學(xué)習(xí)圖像語義分割指標(biāo)介紹

    深度學(xué)習(xí)在圖像語義分割上已經(jīng)取得了重大進(jìn)展與明顯的效果,產(chǎn)生了很多專注于圖像語義分割的模型與基準(zhǔn)
    發(fā)表于 10-09 15:26 ?329次閱讀
    <b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b>圖像<b class='flag-5'>語義</b><b class='flag-5'>分割</b>指標(biāo)介紹

    視覺深度學(xué)習(xí)遷移學(xué)習(xí)訓(xùn)練框架Torchvision介紹

    Torchvision是基于Pytorch的視覺深度學(xué)習(xí)遷移學(xué)習(xí)訓(xùn)練框架,當(dāng)前支持的圖像分類、對象檢測、實(shí)例分割、語義
    的頭像 發(fā)表于 09-22 09:49 ?748次閱讀
    視覺<b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b>遷移<b class='flag-5'>學(xué)習(xí)</b>訓(xùn)練框架Torchvision介紹