日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

基于U-Net的的图像分割代码详解及应用实现

發(fā)布時(shí)間:2024/3/13 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于U-Net的的图像分割代码详解及应用实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

摘要

U-Net是基于卷積神經(jīng)網(wǎng)絡(luò)(CNN)體系結(jié)構(gòu)設(shè)計(jì)而成的,由Olaf Ronneberger,Phillip Fischer和Thomas Brox于2015年首次提出應(yīng)用于計(jì)算機(jī)視覺(jué)領(lǐng)域完成語(yǔ)義分割任務(wù)。(其發(fā)表U-Net的作者建議該模型能夠很好的應(yīng)用于生物醫(yī)學(xué)圖像分割)。而本文將從U-Net的應(yīng)用領(lǐng)域、模型原理、具體應(yīng)用三個(gè)方面具體概述U-Net神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)方式及應(yīng)用技術(shù)。最后,本文基于keras神經(jīng)網(wǎng)絡(luò)框架設(shè)計(jì)并實(shí)現(xiàn)U-Net模型在EM神經(jīng)元數(shù)據(jù)集上的 分割應(yīng)用,其實(shí)現(xiàn)結(jié)果現(xiàn)實(shí),U-Net在EM 堆棧神經(jīng)元的分割任務(wù)上具有較好的實(shí)驗(yàn)結(jié)果。

1.計(jì)算機(jī)視覺(jué)任務(wù)概述

1.1 語(yǔ)義分割解析(Semantic Segmentation)

1.1.1 定義

圖像語(yǔ)義分割(Semantic Segmentation)是圖像處理和是機(jī)器視覺(jué)技術(shù)中關(guān)于圖像理解的重要一環(huán),也是 AI 領(lǐng)域中一個(gè)重要的分支。語(yǔ)義分割即是對(duì)圖像中每一個(gè)像素點(diǎn)進(jìn)行分類,確定每個(gè)點(diǎn)的類別(如屬于背景、人或車等),從而進(jìn)行區(qū)域劃分。目前,語(yǔ)義分割已經(jīng)被廣泛應(yīng)用于自動(dòng)駕駛、無(wú)人機(jī)落點(diǎn)判定等場(chǎng)景中。

1.1.2 實(shí)例解釋

圖像分類

舉個(gè)例子進(jìn)行描述:

在圖像領(lǐng)域,我們常見(jiàn)的任務(wù)是對(duì)圖像的分類任務(wù),該任務(wù)是較為粗粒度的來(lái)識(shí)別和理解圖像。即是我們給定一張圖像,我們期望模型輸出該張圖像所屬的類別(離散標(biāo)簽),而在圖像分類任務(wù)中,我們假設(shè)圖像中只有一個(gè)(而不是多個(gè))對(duì)象。描述如下圖:

?但是,語(yǔ)義分割則在圖像分類任務(wù)上更為細(xì)化。其需要經(jīng)歷三個(gè)過(guò)程:圖像定位、目標(biāo)檢測(cè)、語(yǔ)義分割(及實(shí)例分割)。其中,目標(biāo)檢測(cè)( Object detection)不僅需要提供圖像中物體的類別,還需要提供物體的位置(bounding box)。語(yǔ)義分割( Semantic segmentation)需要預(yù)測(cè)出輸入圖像的每一個(gè)像素點(diǎn)屬于哪一類的標(biāo)簽。實(shí)例分割( instance segmentation)在語(yǔ)義分割的基礎(chǔ)上,還需要區(qū)分出同一類不同的個(gè)體。

圖像定位

在與離散標(biāo)簽一起輸出時(shí)(完成分類任務(wù)過(guò)程中),我們還期望模型能夠準(zhǔn)確定位圖像中存在該物體的位置。這種定位通常使用邊界框來(lái)實(shí)現(xiàn),邊界框可以通過(guò)一些關(guān)于圖像邊界的數(shù)值參數(shù)來(lái)識(shí)別。其如下圖所示:

目標(biāo)檢測(cè)

與圖像定位不同的是,目標(biāo)檢測(cè)需要判斷圖像中物體的類別,還判斷指出提供圖像中物體的具體位置(bounding box)。即是現(xiàn)在圖像不再局限于只有一個(gè)對(duì)象,而是可以包含多個(gè)對(duì)象。任務(wù)是對(duì)圖像中的所有對(duì)象進(jìn)行分類和定位。這里再次使用邊界框的概念進(jìn)行定位。其如下圖所示:

語(yǔ)義分割

語(yǔ)義分割通過(guò)對(duì)每個(gè)像素進(jìn)行密集的預(yù)測(cè)、推斷標(biāo)簽來(lái)實(shí)現(xiàn)細(xì)粒度的推理,從而使每個(gè)像素都被標(biāo)記為其封閉對(duì)象礦石區(qū)域的類別。即是需要判斷圖像每個(gè)像素點(diǎn)的類別,進(jìn)行精確分割。圖像語(yǔ)義分割是像素級(jí)別的!因?yàn)槲覀円獙?duì)圖像中的每個(gè)像素進(jìn)行預(yù)測(cè),所以這個(gè)任務(wù)通常被稱為密集預(yù)測(cè)。其如下圖所示:

實(shí)例分割

實(shí)例分割比語(yǔ)義分割是更為細(xì)致的下游任務(wù),其中與像素級(jí)的分類任務(wù)處理方式一樣,我們希望模型分別對(duì)類的每個(gè)實(shí)例進(jìn)行分類。例如,圖中有 3 個(gè)人,嚴(yán)格來(lái)說(shuō)是“Person”類的 3 個(gè)實(shí)例。所有這3個(gè)分別分類(以不同的顏色)。其如下圖所示:

?目標(biāo)檢測(cè)、語(yǔ)義分割、實(shí)例分割三個(gè)像素級(jí)別的分類任務(wù),其區(qū)別如下圖所示。

1.2 應(yīng)用領(lǐng)域

1.2.1 自動(dòng)駕駛汽車

自動(dòng)駕駛是一項(xiàng)極為復(fù)雜的深度學(xué)習(xí)應(yīng)用任務(wù),其需要模型在不斷變化的環(huán)境中進(jìn)行感知、規(guī)劃和執(zhí)行相關(guān)任務(wù)(既是汽車避免路障等問(wèn)題)。因?yàn)槿松踩亲钪匾?#xff0c;所以這項(xiàng)任務(wù)需要最為精準(zhǔn)的模型運(yùn)行效果。語(yǔ)義分割可提供有關(guān)道路上的障礙信息、檢測(cè)路況標(biāo)記和交通標(biāo)志等信息。

1.2.2?生物醫(yī)學(xué)影像診斷(精準(zhǔn)醫(yī)療)

這就是本文將要實(shí)現(xiàn)的具體應(yīng)用了。其實(shí)現(xiàn)的最終模型可以減少放射科醫(yī)生的分析時(shí)間,為相關(guān)疾病的診療提供輔助和技術(shù)支持。

1.2.3?地理傳感

語(yǔ)義分割問(wèn)題也可以被視為分類問(wèn)題(其最終的解決方式),其中每個(gè)像素被歸類為一系列對(duì)象類別中的一個(gè)。因此,可用于衛(wèi)星圖像的土地使用制圖。例如監(jiān)測(cè)森林砍伐和城市化區(qū)域。道路和建筑物檢測(cè)也是交通管理、城市規(guī)劃和道路監(jiān)測(cè)的重要研究課題等。

1.2.4 精準(zhǔn)農(nóng)業(yè)

農(nóng)業(yè)機(jī)器人可以減少田間需要噴灑的除草劑次數(shù)和劑量,通過(guò)對(duì)作物和雜草進(jìn)行語(yǔ)義分割,實(shí)時(shí)協(xié)助它們觸發(fā)除草動(dòng)作。

2. U-Net模型解釋

2.1 U-Net模型概述

U-Net的U形結(jié)構(gòu)如圖所示。網(wǎng)絡(luò)是一個(gè)經(jīng)典的全卷積網(wǎng)絡(luò)(即網(wǎng)絡(luò)中沒(méi)有全連接操作)。網(wǎng)絡(luò)的輸入是一張?572*572?的邊緣經(jīng)過(guò)鏡像操作的圖片(input image tile),關(guān)于“鏡像操作“會(huì)在接下來(lái)進(jìn)行詳細(xì)分析,網(wǎng)絡(luò)的左側(cè)(紅色虛線)是由卷積和Max Pooling構(gòu)成的一系列降采樣操作,論文中將這一部分叫做壓縮路徑(contracting path)。壓縮路徑由4個(gè)block組成,每個(gè)block使用了3個(gè)有效卷積和1個(gè)Max Pooling降采樣,每次降采樣之后Feature Map的個(gè)數(shù)乘2,因此有了圖中所示的Feature Map尺寸變化。最終得到了尺寸為 32*32的Feature Map。

? 網(wǎng)絡(luò)的右側(cè)部分(綠色虛線)在論文中叫做擴(kuò)展路徑(expansive path)。同樣由4個(gè)block組成,每個(gè)block開(kāi)始之前通過(guò)反卷積將Feature Map的尺寸乘2,同時(shí)將其個(gè)數(shù)減半(最后一層略有不同),然后和左側(cè)對(duì)稱的壓縮路徑的Feature Map合并,由于左側(cè)壓縮路徑和右側(cè)擴(kuò)展路徑的Feature Map的尺寸不一樣,U-Net是通過(guò)將壓縮路徑的Feature Map裁剪到和擴(kuò)展路徑相同尺寸的Feature Map進(jìn)行歸一化的(即圖1中左側(cè)虛線部分)。擴(kuò)展路徑的卷積操作依舊使用的是有效卷積操作,最終得到的Feature Map的尺寸是 388*388。由于該任務(wù)是一個(gè)二分類任務(wù),所以網(wǎng)絡(luò)有兩個(gè)輸出Feature Map。

?

首先,數(shù)據(jù)集我們的原始圖像的尺寸都是 512*512?的。為了能更好的處理圖像的邊界像素,U-Net使用了鏡像操作(Overlay-tile Strategy)來(lái)解決該問(wèn)題。鏡像操作即是給輸入圖像加入一個(gè)對(duì)稱的邊(圖2),那么邊的寬度是多少呢?一個(gè)比較好的策略是通過(guò)感受野確定。因?yàn)橛行Ь矸e是會(huì)降低Feature Map分辨率的,但是我們希望 515*512的圖像的邊界點(diǎn)能夠保留到最后一層Feature Map。所以我們需要通過(guò)加邊的操作增加圖像的分辨率,增加的尺寸即是感受野的大小,也就是說(shuō)每條邊界增加感受野的一半作為鏡像邊。

2.2?U-Net 和 autoencoder 架構(gòu)的區(qū)別

U-Net模型與傳統(tǒng)的圖像分割方法(自動(dòng)編碼器體系結(jié)構(gòu))有所區(qū)別。傳統(tǒng)的經(jīng)典圖像分割方法是最初輸入信息的大小隨著層數(shù)的增加其特征信息在不斷減少,至此,自動(dòng)編碼器體系結(jié)構(gòu)的編碼器部分完成,開(kāi)始解碼器部分。而U-Net模型學(xué)習(xí)線性特征表示,其特征大小在逐漸增大,其最后的輸出大小等于輸入大小。

既是整個(gè)Auto-Encoder有兩個(gè)吸引人的應(yīng)用:1)利用前半部分做特征提取;2)利用后半部分做圖像生成。

然而,U-Net結(jié)構(gòu)和Auto-Encoder的傳統(tǒng)結(jié)構(gòu)十分相似,但是它獨(dú)特的前傳結(jié)構(gòu)讓網(wǎng)絡(luò)能夠capture到很多空間的信息,U-Net的直接前傳可以保留很多空間信息,既其前半部分是降采樣,下半部分是升采樣。

2.3?U-Net模型代碼詳解

在這部分代碼實(shí)現(xiàn)過(guò)程中一定要注意調(diào)整卷積核的大小和padding的大小,這樣才可以在最后保證圖片的尺寸恢復(fù)到和原來(lái)一樣。

inputs = Input(input_size)conv1 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(inputs)conv1 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv1)pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)conv2 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool1)conv2 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv2)pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)conv3 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool2)conv3 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv3)pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)conv4 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool3)conv4 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv4)drop4 = Dropout(0.5)(conv4)pool4 = MaxPooling2D(pool_size=(2, 2))(drop4)conv5 = Conv2D(1024, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool4)conv5 = Conv2D(1024, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv5)drop5 = Dropout(0.5)(conv5)up6 = Conv2D(512, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(drop5))merge6 = concatenate([drop4,up6], axis = 3)conv6 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge6)conv6 = Conv2D(512, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv6)up7 = Conv2D(256, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv6))merge7 = concatenate([conv3,up7], axis = 3)conv7 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge7)conv7 = Conv2D(256, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv7)up8 = Conv2D(128, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv7))merge8 = concatenate([conv2,up8], axis = 3)conv8 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge8)conv8 = Conv2D(128, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv8)up9 = Conv2D(64, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv8))merge9 = concatenate([conv1,up9], axis = 3)conv9 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge9)conv9 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv9)conv9 = Conv2D(2, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv9)conv10 = Conv2D(1, 1, activation = 'sigmoid')(conv9)model = Model(input = inputs, output = conv10)from keras.utils.vis_utils import plot_modelplot_model(model, to_file='model1.png',show_shapes=True)

3. 應(yīng)用實(shí)現(xiàn)

3.1 數(shù)據(jù)集介紹

數(shù)據(jù)來(lái)自于 ISBI 挑戰(zhàn)的數(shù)據(jù)集。該數(shù)據(jù)集包含30張訓(xùn)練圖、30張對(duì)應(yīng)的標(biāo)簽。30張測(cè)試圖片。數(shù)據(jù)是來(lái)自果蠅一齡幼蟲腹神經(jīng)索 (VNC) 的串行部分透射電子顯微鏡 (ssTEM)的圖像,其分辨率為4x4x50 nm /像素

3.2 模型設(shè)計(jì)與實(shí)現(xiàn)

實(shí)驗(yàn)環(huán)境:python3.6.5;tensorflow==1.12;keras==2.2.4等;

上述2.3實(shí)現(xiàn)的 U-Net模型其參數(shù)過(guò)多,在自己電腦上運(yùn)行過(guò)慢,為了快速建立模型并實(shí)現(xiàn)應(yīng)用,我們?cè)O(shè)計(jì)了更小是U-Net模型,其實(shí)現(xiàn)后的結(jié)構(gòu)如下所示:

其模型的訓(xùn)練采用如下代碼進(jìn)行實(shí)現(xiàn)(添加了數(shù)據(jù)增強(qiáng)):

ata_gen_args = dict(rotation_range=0.2,width_shift_range=0.05,height_shift_range=0.05,shear_range=0.05,zoom_range=0.05,horizontal_flip=True,fill_mode='nearest') myGene = trainGenerator(2,'data/membrane/train','image','label',data_gen_args,save_to_dir = None)model = unet() model_checkpoint = ModelCheckpoint('unet_membrane.hdf5', monitor='loss',verbose=1, save_best_only=True) model.fit_generator(myGene,steps_per_epoch=3,epochs=5,callbacks=[model_checkpoint],validation_data=())

其實(shí)驗(yàn)結(jié)果的準(zhǔn)確率曲線與模型訓(xùn)練次數(shù)的曲線如下所示:

?從圖中我們發(fā)現(xiàn) U-Net模型在經(jīng)過(guò)簡(jiǎn)化之后,其在細(xì)胞分割任務(wù)中已經(jīng)達(dá)到了不錯(cuò)的訓(xùn)練效果結(jié)果,其準(zhǔn)確率高達(dá)78%,為了進(jìn)一步提高模型準(zhǔn)確率,我們需要在模型設(shè)計(jì)環(huán)節(jié)設(shè)計(jì)完整的 U-Net模型,并加大模型的訓(xùn)練次數(shù),這樣就能使模型很輕松的達(dá)到95%左右。

3.3 結(jié)果展示

輸入原始圖像:

??

模型輸出圖像:?

4.結(jié)論

本文主要介紹了U-net模型在細(xì)胞分割中的相關(guān)基本概念及一個(gè)具體應(yīng)用,下一步,將進(jìn)一步探究將每?jī)蓚€(gè)相鄰的卷積層替換為殘差結(jié)構(gòu),并在收縮路徑和擴(kuò)張路徑中間加入并聯(lián)在一起的位置注意力模塊和通道注意力模塊以進(jìn)一步提高U-net模型的應(yīng)用效果。

?

?

總結(jié)

以上是生活随笔為你收集整理的基于U-Net的的图像分割代码详解及应用实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。