基於深度學習的語義分割與實例分割(一)

本篇文章後文側重醫學領域

圖像分割,作爲計算機視覺的基礎,是圖像理解的重要組成部分,也是圖像處理的難點之一。

那麼,如何優雅且體面的圖像分割?

先說一個簡單的的吧,也就是先做一回調包俠:實現的庫——PixelLib,瞭解一下。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-UEOm0t0C-1590132448972)(D:\CSDN\pic\醫學影像處理(二)\1590120958485.png)]

當然,如此好用的項目,開源是必須的。

爲什麼要用到圖像分割?

雖然計算機視覺研究工作者,會經常接觸圖像分割的問題,但是我們還是需要對其做下“贅述”(方便初學者)。

我們都知道每個圖像都是有一組像素值組成。簡單來說,圖像分割就是在像素級上,對圖像進行分類的任務。

圖像分割中使用的一些“獨門祕技”,使它可以處理一些關鍵的計算機視覺任務。主要分爲2類:

  • 語義分割:就是把圖像中每個像素賦予一個類別標籤,用不同的顏色來表示。
  • 實例分割:它不需要對每個像素進行標記,它只需要找到感興趣物體的邊緣輪廓就行。

它的身影也經常會出現在比較重要的場景中:

  • 無人駕駛汽車視覺系統,可以有效的理解道路場景
  • 醫療圖像分割,可以幫助醫生進行診斷測試
  • 衛星圖像分析,等等。

所以,圖像分割技術的應用還是非常重要的。

接下來,我們就直奔主題,開始瞭解一下PixelLib,這個神奇又好用的庫。

快速安裝PixelLib

PixelLib這個庫可以非常簡單的實現圖像分割——5行代碼就可以實現語義分割和實例分割。

老規矩,先介紹一下安裝環境

安裝最新版本的TensorFlow、Pillow、OpenCV-Python、scikit-image和PixelLib:

pip3 install tensorflowpip3 install pillowpip3 install opencv-pythonpip3 install scikit-imagepip3 install pixellib

PixelLib實現語義分割

PixelLib在執行語義分割任務時,採用的是Deeplabv3+框架,以及在pascalvoc上預訓練的Xception模型。

用在pascalvoc上預訓練的Xception模型執行語義分割:

import pixellibfrom pixellib.semantic import semantic_segmentationsegment_image = semantic_segmentation()segment_image.load_pascalvoc_model(“deeplabv3_xception_tf_dim_ordering_tf_kernels.h5”)segment_image.segmentAsPascalvoc(“path_to_image”, output_image_name = “path_to_output_image”)

讓我們看一下每行代碼:

import pixellibfrom pixellib.semantic import semantic_segmentation#created an instance of semantic segmentation classsegment_image = semantic_segmentation()

用於執行語義分割的類,是從pixellib導入的,創建了一個類的實例。

segment_image.load_pascalvoc_model(“deeplabv3_xception_tf_dim_ordering_tf_kernels.h5”)

調用函數來加載在pascal voc上訓練的xception模型(xception模型可以從文末傳送門鏈接處下載)。

segment_image.segmentAsPascalvoc(“path_to_image”, output_image_name = “path_to_output_image”)

這是對圖像進行分割的代碼行,這個函數包含了兩個參數:

  • path_to_image:圖像被分割的路徑。
  • path_to_output_image:保存輸出圖像的路徑,圖像將被保存在你當前的工作目錄中。

接下來,上圖,實戰

圖像文件命名爲:san.jpg,如下圖所示。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-kZaSnKSl-1590132448974)(D:\CSDN\pic\醫學影像處理(二)\1590119956780.png)]

執行代碼如下:

import pixellibfrom pixellib.semantic import semantic_segmentationsegment_image = 
semantic_segmentation()segment_image.load_pascalvoc_model(“deeplabv3_xception_tf_dim_ordering_tf_kernels.h
5”)segment_image.segmentAsPascalvoc(“sample1.jpg”, output_image_name = “image_new.jpg”)

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ZThXACrW-1590132448980)(D:\CSDN\pic\醫學影像處理(二)\1590120099094.png)]

可以看到,在執行代碼後,保存的圖像中,所有對象都被分割了。

也可以對代碼稍作修改,獲取一張帶有目標對象分段重疊(segmentation overlay)的圖像。

segment_image.segmentAsPascalvoc(“sample1.jpg”, output_image_name = “image_new.jpg”, overlay = True)

添加了一個額外的參數,並設置爲True,就生成了帶有分段疊加的圖像。

可以通過修改下面的代碼,來檢查執行分割所需的推理時間。

import pixellibfrom pixellib.semantic import semantic_segmentationimport timesegment_image = semantic_segmentation()segment_image.load_pascalvoc_model(“pascal.h5”)start = time.time()segment_image.segmentAsPascalvoc(“sample1.jpg”, output_image_name= “image_new.jpg”)end = time.time()print(f”Inference Time: {end-start:.2f}seconds”)

輸出如下:

Inference Time: 8.19seconds

可以看到,在圖像上執行語義分割,只用了8.19秒。

這個xception模型是用pascalvoc數據集訓練的,有20個常用對象類別。

對象及其相應的color map如下所示:

img
源碼在最後!

PixelLib實現實例分割

Mask R-CNN是何愷明大神團隊提出的一個基於Faster R-CNN模型的一種新型的分割模型,此論文斬獲ICCV 2017的最佳論文,在Mask R-CNN的工作中,它主要完成了三件事情:目標檢測,目標分類,像素級分割。
愷明大神是在Faster R-CNN的結構基礎上加上了Mask預測分支,並且改良了ROI Pooling,提出了ROI Align。其網絡結構真容就如下圖所示啦:
img
Mask R-CNN的優缺點:

  • 引入了預測用的Mask-Head,以像素到像素的方式來預測分割掩膜,並且效果很好;
  • 用ROI Align替代了ROI Pooling,去除了RoI Pooling的粗量化,使得提取的特徵與輸入良好對齊;
  • 分類框與預測掩膜共享評價函數,雖然大多數時間影響不大,但是有的時候會對分割結果有所幹擾。

雖然語義分割的結果看起來還不錯,但在圖像分割的某些特定任務上,可能就不太理想。

在語義分割中,相同類別的對象被賦予相同的colormap,因此語義分割可能無法提供特別充分的圖像信息。

於是,便誕生了實例分割——同一類別的對象被賦予不同的colormap。

PixelLib在執行實例分割時,基於的框架是Mask RCNN,代碼如下:

import pixellibfrom pixellib.instance import instance_segmentationsegment_image = instance_segmentation()segment_image.load_model(“mask_rcnn_coco.h5”)segment_image.segmentImage(“path_to_image”, output_image_name = “output_image_path”)

同樣,我們先來拆解一下每行代碼。

import pixellibfrom pixellib.instance import instance_segmentationsegment_image = instance_segmentation()

導入了用於執行實例分割的類,創建了該類的一個實例。

segment_image.load_model(“mask_rcnn_coco.h5”)

這是加載 Mask RCNN 模型來執行實例分割的代碼(Mask RCNN模型可以從文末傳送門鏈接處下載)。

segment_image.segmentImage(“path_to_image”, output_image_name = “output_image_path”)

這是對圖像進行實例分割的代碼,它需要兩個參數:

  • path_to_image:模型所要預測圖像的路徑。

  • output_image_name:保存分割結果的路徑,將被保存在當前的工作目錄中。

  • 如上圖:

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-2ojo5DAX-1590132448988)(D:\CSDN\pic\醫學影像處理(二)\1590120288545.png)]

上圖,實戰第二彈!

圖像文件命名爲:sample2.jpg,如下圖所示。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-aD3Nd7bS-1590132448991)(D:\CSDN\pic\醫學影像處理(二)\1590120863575.png)]

執行代碼如下:

import pixellibfrom pixellib.instance import instance_segmentationsegment_image = instance_segmentation()segment_image.load_model(“mask_rcnn_coco.h5”)segment_image.segmentImage(“sample2.jpg”, output_image_name = “image_new.jpg”)

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-gnk1fRnW-1590132448995)(D:\CSDN\pic\醫學影像處理(二)\1590120841916.png)]

上圖便是保存到目錄的圖片,現在可以看到語義分割和實例分割之間的明顯區別——在實例分割中,同一類別的所有對象,都被賦予了不同的colormap。

若是想用邊界框(bounding box)來實現分割,可以對代碼稍作修改:

segment_image.segmentImage(“sample2.jpg”, output_image_name = “image_new.jpg”, show_bboxes = True)

這樣,就可以得到一個包含分割蒙版和邊界框的保存圖像。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-MfumCk19-1590132448997)(D:\CSDN\pic\醫學影像處理(二)\1590120882517.png)]

同樣的,也可以通過代碼查詢實例分割的推理時間:

import pixellibfrom pixellib.instance import instance_segmentationimport timesegment_image = instance_segmentation()segment_image.load_model(“mask_rcnn_coco.h5”)start = time.time()segment_image.segmentImage(“former.jpg”, output_image_name= “image_new.jpg”)end = time.time()print(f”Inference Time: {end-start:.2f}seconds”)

輸出結果如下:

Inference Time: 12.55 seconds

可以看到,在圖像上執行實例分割,需要12.55秒的時間。

最後,奉上、模型下載地址 百度搜索就有:

PixelLib項目地址:
https://github.com/ayoolaolafenwa/PixelLib

xception模型下載地址:
https://github.com/bonlime/keras-deeplab-v3-plus/releases/download/1.1/deeplabv3_xception_tf_dim_ordering_tf_kernels.h5

Mask RCNN模型下載地址:
https://github.com/matterport/Mask_RCNN/releases/download/v2.0/mask_rcnn_coco.h5


除了使用PixelLib還可以用這些:

2019年CVPR的oral,來自華中科技大學的研究生黃釗金同學提出的
MS R-CNN,這篇文章的提出主要是對上文所說的Mask R-CNN的一點點缺點進行了修正。他的網絡結構也是在Mask R-CNN的網絡基礎上做了一點小小的改進,添加了Mask-IoU。
黃同學在文章中提到:愷明大神的Mask R-CNN已經很好啦!但是有個小毛病,就是評價函數只對目標檢測的候選框進行打分,而不是分割模板(就是上文提到的優缺點中最後一點),所以會出現分割模板效果很差但是打分很高的情況。所以黃同學增加了對模板進行打分的MaskIoU Head,並且最終的分割結果在COCO數據集上超越了愷明大神,下面就是MS R-CNN的網絡結構啦~
img
MS R-CNN的優缺點:

  • 優化了Mask R-CNN中的信息傳播,提高了生成預測模板的質量;
  • 未經大批量訓練的情況下,就拿下了COCO 2017挑戰賽實例分割任務冠軍;
  • 要說缺點的話。。應該就是整個網絡有些龐大,一方面需要ResNet當作主幹網絡,另一方面需要其它各種Head共同承擔各種任務。

3.基於RNN的圖像分割

Recurrent neural networks(RNNs)除了在手寫和語音識別上表現出色外,在解決計算機視覺的任務上也表現不俗,在本篇文章中我們就將要介紹RNN在2D圖像處理上的一些應用,其中也包括介紹使用到它的結構或者思想的一些模型。
RNN是由Long-Short-Term Memory(LSTM)塊組成的網絡,RNN來自序列數據的長期學習的能力以及隨着序列保存記憶的能力使其在許多計算機視覺的任務中遊刃有餘,其中也包括語義分割以及數據標註的任務。接下來的部分我們將介紹幾個使用到RNN結構的用於分割的網絡結構模型:

1.ReSeg模型

ReSeg可能不被許多人所熟知,在百度上搜索出的相關說明與解析也不多,但是這是一個很有效的語義分割方法。衆所周知,FCN可謂是圖像分割領域的開山作,而RegNet的作者則在自己的文章中大膽的提出了FCN的不足:沒有考慮到局部或者全局的上下文依賴關係,而在語義分割中這種依賴關係是非常有用的。所以在ReSeg中作者使用RNN去檢索上下文信息,以此作爲分割的一部分依據。
img
該結構的核心就是Recurrent Layer,它由多個RNN組合在一起,捕獲輸入數據的局部和全局空間結構。
優缺點:

  • 充分考慮了上下文信息關係;
  • 使用了中值頻率平衡,它通過類的中位數(在訓練集上計算)和每個類的頻率之間的比值來重新加權類的預測。這就增加了低頻率類的分數,這是一個更有噪聲的分割掩碼的代價,因爲被低估的類的概率被高估了,並且可能導致在輸出分割掩碼中錯誤分類的像素增加。
2.MDRNNs(Multi-Dimensional Recurrent Neural Networks)模型

傳統的RNN在一維序列學習問題上有着很好的表現,比如演講(speech)和在線手寫識別。但是 在多爲問題中應用卻並不到位。MDRNNs在一定程度上將RNN拓展到多維空間領域,使之在圖像處理、視頻處理等領域上也能有所表現。
該論文的基本思想是:將單個遞歸連接替換爲多個遞歸連接,相應可以在一定程度上解決時間隨數據樣本的增加呈指數增長的問題。以下就是該論文提出的兩個前向反饋和反向反饋的算法。
img

4.基於上採樣/反捲積的分割方法

卷積神經網絡在進行採樣的時候會丟失部分細節信息,這樣的目的是得到更具特徵的價值。但是這個過程是不可逆的,有的時候會導致後面進行操作的時候圖像的分辨率太低,出現細節丟失等問題。因此我們通過上採樣在一定程度上可以不全一些丟失的信息,從而得到更加準確的分割邊界。
接下來介紹幾個非常著名的分割模型:

a.FCN(Fully Convolutional Network)

是的!講來講去終於講到這位大佬了,FCN!在圖像分割領域已然成爲一個業界標杆,大多數的分割方法多多少少都會利用到FCN或者其中的一部分,比如前面我們講過的Mask R-CNN。
在FCN當中的反捲積-升採樣結構中,圖片會先進性上採樣(擴大像素);再進行卷積——通過學習獲得權值。FCN的網絡結構如下圖所示:
img
當然最後我們還是需要分析一下FCN,不能無腦吹啦~
優缺點:

  • FCN對圖像進行了像素級的分類,從而解決了語義級別的圖像分割問題;
  • FCN可以接受任意尺寸的輸入圖像,可以保留下原始輸入圖像中的空間信息;
  • 得到的結果由於上採樣的原因比較模糊和平滑,對圖像中的細節不敏感;
  • 對各個像素分別進行分類,沒有充分考慮像素與像素的關係,缺乏空間一致性。
2.SetNet

SegNet是劍橋提出的旨在解決自動駕駛或者智能機器人的圖像語義分割深度網絡,SegNet基於FCN,與FCN的思路十分相似,只是其編碼-解碼器和FCN的稍有不同,其解碼器中使用去池化對特徵圖進行上採樣,並在分各種保持高頻細節的完整性;而編碼器不使用全連接層,因此是擁有較少參數的輕量級網絡:

圖像分割是計算機視覺研究中的一個經典難題,已經成爲圖像理解領域關注的一個熱點,圖像分割是圖像分析的第一步,是計算機視覺的基礎,是圖像理解的重要組成部分,同時也是圖像處理中最困難的問題之一。所謂圖像分割是指根據灰度、彩色、空間紋理、幾何形狀等特徵把圖像劃分成若干個互不相交的區域,使得這些特徵在同一區域內表現出一致性或相似性,而在不同區域間表現出明顯的不同。簡單的說就是在一副圖像中,把目標從背景中分離出來。對於灰度圖像來說,區域內部的像素一般具有灰度相似性,而在區域的邊界上一般具有灰度不連續性。 關於圖像分割技術,由於問題本身的重要性和困難性,從20世紀70年代起圖像分割問題就吸引了很多研究人員爲之付出了巨大的努力。雖然到目前爲止,還不存在一個通用的完美的圖像分割的方法,但是對於圖像分割的一般性規律則基本上已經達成的共識,已經產生了相當多的研究成果和方法。

本文對於目前正在使用的各種圖像分割方法進行了一定的歸納總結,由於筆者對於圖像分割的瞭解也是初窺門徑,所以難免會有一些錯誤,還望各位讀者多多指正,共同學習進步。

SetNet的優缺點:

  • 保存了高頻部分的完整性;
  • 網絡不笨重,參數少,較爲輕便;
  • 對於分類的邊界位置置信度較低;
  • 對於難以分辨的類別,例如人與自行車,兩者如果有相互重疊,不確定性會增加。
    以上兩種網絡結構就是基於反捲積/上採樣的分割方法,當然其中最最最重要的就是FCN了,哪怕是後面大名鼎鼎的SegNet也是基於FCN架構的,而且FCN可謂是語義分割領域中開創級別的網絡結構,所以雖然這個部分雖然只有兩個網絡結構,但是這兩位可都是重量級嘉賓,希望各位能夠深刻理解~

5.基於提高特徵分辨率的分割方法

在這一個模塊中我們主要給大家介紹一下基於提升特徵分辨率的圖像分割的方法。換一種說法其實可以說是恢復在深度卷積神經網絡中下降的分辨率,從而獲取更多的上下文信息。這一系列我將給大家介紹的是Google提出的DeepLab 。
DeepLab是結合了深度卷積神經網絡和概率圖模型的方法,應用在語義分割的任務上,目的是做逐像素分類,其先進性體現在DenseCRFs(概率圖模型)和DCNN的結合。是將每個像素視爲CRF節點,利用遠程依賴關係並使用CRF推理直接優化DCNN的損失函數。
在圖像分割領域,FCN的一個衆所周知的操作就是平滑以後再填充,就是先進行卷積再進行pooling,這樣在降低圖像尺寸的同時增大感受野,但是在先減小圖片尺寸(卷積)再增大尺寸(上採樣)的過程中一定有一些信息損失掉了,所以這裏就有可以提高的空間。
接下來我要介紹的是DeepLab網絡的一大亮點:Dilated/Atrous Convolution,它使用的採樣方式是帶有空洞的採樣。在VGG16中使用不同採樣率的空洞卷積,可以明確控制網絡的感受野。
img
圖a對應3x3的1-dilated conv,它和普通的卷積操作是相同的;圖b對應3x3的2-dilated conv,事蹟卷積核的尺寸還是3x3(紅點),但是空洞爲1,其感受野能夠達到7x7;圖c對應3x3的4-dilated conv,其感受野已經達到了15x15.寫到這裏相信大家已經明白,在使用空洞卷積的情況下,加大了感受野,使每個卷積輸出都包含了較大範圍的信息。
這樣就解決了DCNN的幾個關於分辨率的問題:
1)內部數據結構丟失;空間曾計劃信息丟失;
2)小物體信息無法重建;
當然空洞卷積也存在一定的問題,它的問題主要體現在以下兩方面:
1)網格效應
加入我們僅僅多次疊加dilation rate 2的 3x3 的卷積核則會出現以下問題
img
我們發現卷積核並不連續,也就是說並不是所有的像素都用來計算了,這樣會喪失信息的連續性;
2)小物體信息處理不當
我們從空洞卷積的設計背景來看可以推測出它是設計來獲取long-ranged information。然而空洞步頻選取得大獲取只有利於大物體得分割,而對於小物體的分割可能並沒有好處。所以如何處理好不同大小物體之間的關係也是設計好空洞卷積網絡的關鍵。

6.基於特徵增強的分割方法

基於特徵增強的分割方法包括:提取多尺度特徵或者從一系列嵌套的區域中提取特徵。在圖像分割的深度網絡中,CNN經常應用在圖像的小方塊上,通常稱爲以每個像素爲中心的固定大小的卷積核,通過觀察其周圍的小區域來標記每個像素的分類。在圖像分割領域,能夠覆蓋到更大部分的上下文信息的深度網絡通常在分割的結果上更加出色,當然這也伴隨着更高的計算代價。多尺度特徵提取的方法就由此引進。
在這一模塊中我先給大家介紹一個叫做SLIC,全稱爲simple linear iterative cluster的生成超像素的算法。
首先我們要明確一個概念:啥是超像素?其實這個比較容易理解,就像上面說的“小方塊”一樣,我們平常處理圖像的最小單位就是像素了,這就是像素級(pixel-level);而把像素級的圖像劃分成爲區域級(district-level)的圖像,把區域當成是最基本的處理單元,這就是超像素啦。
算法大致思想是這樣的,將圖像從RGB顏色空間轉換到CIE-Lab顏色空間,對應每個像素的(L,a,b)顏色值和(x,y)座標組成一個5維向量V[l, a, b, x, y],兩個像素的相似性即可由它們的向量距離來度量,距離越大,相似性越小。
算法首先生成K個種子點,然後在每個種子點的周圍空間裏搜索距離該種子點最近的若干像素,將他們歸爲與該種子點一類,直到所有像素點都歸類完畢。然後計算這K個超像素裏所有像素點的平均向量值,重新得到K個聚類中心,然後再以這K箇中心去搜索其周圍與其最爲相似的若干像素,所有像素都歸類完後重新得到K個超像素,更新聚類中心,再次迭代,如此反覆直到收斂。
有點像聚類的K-Means算法,最終會得到K個超像素。
Mostahabi等人提出的一種前向傳播的分類方法叫做Zoom-Out就使用了SLIC的算法,它從多個不同的級別提取特徵:局部級別:超像素本身;遠距離級別:能夠包好整個目標的區域;全局級別:整個場景。這樣綜合考慮多尺度的特徵對於像素或者超像素的分類以及分割來說都是很有意義的。
接下來的部分我將給大家介紹另一種完整的分割網絡:PSPNet:Pyramid Scene Parsing Network
論文提出在場景分割是,大多數的模型會使用FCN的架構,但是FCN在場景之間的關係和全局信息的處理能力存在問題,其典型問題有:1.上下文推斷能力不強;2.標籤之間的關係處理不好;3.模型可能會忽略小的東西。
本文提出了一個具有層次全局優先級,包含不同子區域時間的不同尺度的信息,稱之爲金字塔池化模塊。
該模塊融合了4種不同金字塔尺度的特徵,第一行紅色是最粗糙的特徵–全局池化生成單個bin輸出,後面三行是不同尺度的池化特徵。爲了保證全局特徵的權重,如果金字塔共有N個級別,則在每個級別後使用1×1 1×11×1的卷積將對於級別通道降爲原本的1/N。再通過雙線性插值獲得未池化前的大小,最終concat到一起。其結構如下圖:
img
最終結果就是,在融合不同尺度的feature後,達到了語義和細節的融合,模型的性能表現提升很大,作者在很多數據集上都做過訓練,最終結果是在MS-COCO數據集上預訓練過的效果最好。
img
爲了捕捉多尺度特徵,高層特徵包含了更多的語義和更少的位置信息。結合多分辨率圖像和多尺度特徵描述符的優點,在不丟失分辨率的情況下提取圖像中的全局和局部信息,這樣就能在一定程度上提升網絡的性能。

後半部分的資料來源我的關注的公衆號:計算機視覺LIFE


深度學習與醫學影像分割

一、醫學影像分割有助於臨牀工作

圖像分割在影像學診斷中大有用處。自動分割能幫助醫生確認病變腫瘤的大小,定量評價治療前後的效果。除此之外,臟器和病竈的識別和甄別也是一項影像科醫生的日常工作。CT和磁共振的數據都是三維數據,這意味着對器官和病竈的分割就需要逐層進行。如果都是手工分割的話,會給醫生帶來繁重的工作量。實際上,已經有很多學者提出了許多醫學影像的分割方法,但由於醫學影像複雜,分割目標多變,仍有很多自動分割問題等待解決。

近年來深度學習在計算機視覺的各個細分鄰域都取得了出色的成績,那麼,深度學習如何幫助醫生得到更滿意的圖像分割結果呢?本文就從三個深度學習分割網絡的改進思路談起,聊一聊這些改進的出發點和具體實現策略。

二、醫學影像分割的特點

2.1 分割問題有別於分類問題

深度學習開始大放異彩的工作,莫過於在ImageNet數據集上,對輸入圖片的分類了。只要輸入圖片,就能判斷圖片中主體所屬的類別。然而,和分類問題輸入圖像輸出主體的類別不一樣,分割問題需要對每個像素點的類別進行識別。圖1就展示了分類和分割的不同點,上圖的網絡只需要對圖片中的主體識別,得到圖中有一隻小貓的結論,而對下圖的分割問題,則需要得出關於這隻小貓所在像素點的熱力分佈圖。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-1VBPuYmO-1590132448999)(D:\CSDN\pic\醫學影像處理(二)\1590132267616.png)]

圖1 分割和分類的區別[1]

2.2 醫學影像的分割精度要求高

經典的語義分割更重視像素點的多分類信息,往往對多個類別進行分割,對分割細節要求不高。一個典型的例子就是今年發表於CVPR的文章[2]中,對街景的分割。圖2可以看出,它出色的捕捉到了像素的類別信息,但是在分割細節上就不是那麼的讓人滿意了。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-3KTEqa1h-1590132449002)(D:\CSDN\pic\醫學影像處理(二)\1590132292523.png)]

圖2 工作[2]分割結果,左圖爲待分割圖像,中圖爲金標準,右圖爲分割結果

而對於醫學影像分割,有一個好消息和一個壞消息:好消息是對於醫學影像而言,往往不需要進行多分類,只需要進行病竈或器官的區分即可;而壞消息在於,醫學影像所需的分割精度較高,同時穩定性也需要很高,但醫學影像往往信噪比相對較低,即使是醫生也需要長期的專業訓練,而一致性也往往會受到醫生經驗、疲勞程度和耐心程度的限制。

在Kaggle上舉辦的心室分割比賽要求參賽選手們對心臟的內包膜和外包膜同時進行分割,如圖3所示,該任務對分割細節的要求較高。和圖2的街景分割任務相比,醫學影像的分割細緻程度要求較高,不正確或是不穩定的分割將會直接影響心臟射血量的定量計算,從而失去了對醫學圖像分割的本來意義。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-YmTNtjIF-1590132449005)(D:\CSDN\pic\醫學影像處理(二)\1590132308606.png)]

圖3 左圖爲待分割圖像,右圖爲心臟的內包膜和外包膜的分割

三、深度學習分割的開山鼻祖——FCN網絡

Fully convolutional network[1]作爲分割的代表性工作得到了廣泛關注,其核心思想在於將在ImageNet數據集上已經訓練好的網絡中,深層網絡的全連接層改爲全卷積層,從而保存分割的位置信息,但是由於最終的分割結果只利用了深層特徵映射(feature map),分割結果不夠精確。

文章作者也嘗試將不同池化(pooling)層的輸出進行不同倍數的上採樣得到如圖4的結果。可以看出,上採樣倍數越多(更深層的池化輸出)的結果顯得越模糊但分類的語義信息較爲精確,上採樣倍數越少(更淺層的池化輸出)的結果保留的分割細節更多而語義信息卻不精確。因此,作者指出,該網絡中像素類別的精確性和位置的精確性存在着此消彼長的關係。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-G2AzY9IQ-1590132449009)(D:\CSDN\pic\醫學影像處理(二)\1590132323533.png)]

圖4 不同池化層做上採樣操作後的結果,最右側爲金標準

對於醫學影像分割,深度學習已經有了非常出色的表現,而且越來越多的新思路和新方法用於不斷提高分割精度和穩健性,並逐漸減輕醫生繁瑣的日常工作,降低視覺疲勞的壓力,成爲臨牀醫生的有力工具(文章來源:騰訊雲,完整版,請自行搜索)

源碼:

import pixellib
from pixellib.semantic import semantic_segmentation
from pixellib.instance import instance_segmentation
segmengt_image = semantic_segmentation()
segmengt_image.load_pascalvoc_model("deeplabv3_xception_tf_dim_ordering_tf_kernels.h5")
segmengt_image.segmentAsPascalvoc("k.jpg", output_image_name="k1.jpg", overlay=True)


segmengt_image = instance_segmentation()
segmengt_image.load_model("mask_rcnn_coco.h5")
segmengt_image.segmentImage("k.jpg", output_image_name="k2.jpg", show_bboxes=True)

這是前輩們的訓練及其封裝,權重文件可以自行百度或者聯繫我的微信,我自己的深度學習交流羣,也歡迎大家進入!
在這裏插入圖片描述上海第二工業大學 智能科學與技術
周小夏(CV調包俠)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章