談一談 UNet 圖像分割

【GiantPandaCV 導語】這篇文章主要針對於圖像分割的算法的一些理解,主要是一個比較經典的 UNet 系列的網絡的認識。最後希望看完這篇文章的讀者可以有所收穫,對於一些個人的理解歡迎大家批評指正,希望可以和大家一起交流進步。

一、引言

yolov4、v5 發佈之後,在卷積上改進感覺也快達到一個頂峯了,在卷積神經網絡的設計,在很多大佬的眼裏估計都是一樣的了,每一個新的改進或者檢測框架的提出,可能都會看到之前框架的影子,也有人把在圖像檢測上的改進稱之爲 “搭積木”;

在這之後,可能在圖像上的各大論文都將重心放在 Transformer 上了,Transformer 在 CV 上的論文也是變得越來越多了,圖像分割做爲圖像的一個領域當然也不能落下,SwinUnet 可以說終於讓 Transformer 在圖像分割中也得到了露臉的機會。

不過,基於 Transformer 在圖像方面上的應用,具體在實際落地的中,可能也會很快了。本文可能還是要從最經典的圖像分割網絡 UNet 開始說一說這個比較古老的圖像分割系列了。

雖然現在算法越來越依靠在數據上 “做手腳”,但是也不能忽視網絡的設計的技巧和思想,掌握一個優秀的設計思想,就可以天馬行空、設計出飄逸的算法。

二、圖像分割的絮叨

圖像分割作爲像素級的精細分類,可以讓算法做一些精細活,這種精細活體現在醫學上的應用(個人覺得醫學領域是一個神奇也很有價值的領域),UNet 在醫學圖像上的分割在當時有着不俗的表現力,整個網絡的設計也是非常精妙的,其網絡的設計的核心的思想在當年與 yolov3 有着相似之處,隨着後面 UNet 的幾個系列乃至現在 YOLO 的 v4 和 v5,它們最核心的設計思想都有着異曲同工之妙,那就是:信息融合、位置不偏移

其實,在對網絡的設計的過程中,始終保持着這兩點,就可以設計出一個比較好的網絡。(但是,這也只是開始的一步,網絡的設計還有很多的因素要考慮,這裏就不一一敘述了,相信每個人都會有着經驗性的理解)。

1. UNet 網絡的技巧和思想

UNet 最初的設計也是使用在醫學影像的分割,通過經典的編解碼結構、卷積、池化、ReLU 激活函數,進行設計

UNet 的技巧

2. UNet++

從 UNet++ 開始,網絡的設計就開始注意原始圖像的位置信息,還有就是整個網絡的信息融合的能力。

所以,UNet++ 通過一系列嘗試,最終設計成稠密連接,同時有長連接和短連接,並且將 UNet 中間空心的位置填滿;

可以抓取不同層次的特徵 / 不同大小的感受野。UNet++ 橫向看可以看做一個稠密結構的 DenseNet。

在這裏插入圖片描述

3. UNet3+

UNet++ 只是針對於同一尺度的稠密連接,而 UNet3 + 則是跨尺度的稠密連接

UNet3 + 橫縱信息互相交融,像極了國內高鐵的 “八橫八縱” 的高鐵網,可以獲得更大範圍的信息融合與流通。又一次感覺很多算法上的設計思想都有異曲同工之妙,亦或者說是源於生活。

當然,UNet3 + 效果在醫療圖像上分割有着不俗的效果,還有一部分是來源於其精心設計的損失函數 MS-SSIM,其作爲 UNet3 + 組合損失函數的一部分,也會在提點上有着一定的作用(算法除了模型設計,當然還逃脫不了損失的設計)。

在這裏插入圖片描述

4. U2Net

這個網絡的設計,給我的一個感覺就是很飄逸了,這是 UNet 系列改進的另一條路(我個人覺得,作者對於卷積、池化的使用達到了一個很高的水平,這是在一些常規的設計中還是比較難看到的,用簡單的組件設計出一個很優秀的算法)。

嵌套 UNet 的方式,不可謂不是一種天秀的方法;同時通過膨脹卷積的使用,在不增加計算量的情況下,獲得了很大的感受野,整個網絡看起來變得很深,但是在參數量上的控制,已經達到了一種爐火純青的地步。

不過,這篇論文的實驗的數據集不在是針對醫療圖像,也沒有去做實驗去比較;但是,U2Net 爲了獲得更大的感受野,個人覺得在位置信息上丟失的還是比較多的,在對於位置信息的表現力,可能是有所欠缺的。

在這裏插入圖片描述

二、對於改進 UNet 的見解

上面說的內容沒有說的特別繁瑣,這些內容網上有着非常細緻的解讀(因爲上面的技術也是 2021 年之前的知識點了,可能也算是相對來說比較古老的技術了,大家估計都聽過或者看到過一些解讀),本文就挑核心的點進行介紹,讓大家在對上面的內容有了一個認識,並引出我下面的一些理解。

應該說很多人,其實都喜歡在 UNet 進行改進,換個優秀的編碼器,然後自己在手動把解碼器對應實現一下。至於爲什麼要選擇 UNet 上進行改進,可能是因爲 UNet 網絡的結構比較簡單,還是比較好進行改進的,而且 UNet 的效果,在很多場景下的表現力可能都是差強人意的。

但是,直接對 UNet 進行簡單的替換編解碼器,效果應該也是差強人意或者效果就是很差的;之前也有一些同事,在對 UNet 進行改進的時候,也會遇到效果不好的問題。直接對 UNet 改進,個人認爲有兩個本質的原因會影響網絡的效果。

首先,原始的 UNet 在編碼器的網路結構是很淺的,同時沒有加 padding,使得解碼器獲取編碼器的信息時,位置信息丟失的不會很嚴重;但是一旦選擇一個比較深的網絡作爲編碼器(一般的特徵提取的網絡會加 padding),使得位置信息丟失的相對來說是很嚴重的,在解碼器獲取到對應編碼器的信息時,就已經產生了很大的偏移,再經過一個同樣深的解碼器,那麼位置偏移就會變得更加嚴重,效果不好就可以解釋的通了。

不過上面都是針對於直接用其他優秀的特徵提取網絡直接改進 UNet 的情況。

個人認爲,UNet 上的改進一定要認識到最原始的設計思路,以及它相對於後面系列的一個劣勢,就是信息融合、位置不偏移。

其實,信息融合、位置偏移在 yolov4、v5 中也得到了體現,v4 和 v5 對於網絡的改進思路也是緊緊抓住了這兩個點(當然也有其他非常重要或者新穎的點,但是這兩點一定是核心的),後期對於 UNet 進行改進的網絡都是在對信息融合上有着獨到的理解,這也是後面改進的網絡比較難以再進行優化的一個原因,要想對 UNet 有着非常獨到的新穎的改進,還是比較有難度的(Swin-UNet 是 Transformer 在圖像上的表現,我也不太好評價)。

如果非要在 UNet 上通過替換編解碼器的方式(用現有的優秀的特徵提取器)進行改進時,可以借鑑 UNet++ 和 UNet3 + 的思想,橫縱信息的流通,還有就是 padding 上的特殊處理、能不能更好的進行反向傳播、位置偏移上的特殊處理、不要選擇太深的網絡、卷積核的大膽設計這幾個方面出發;

最後,其實分割網絡可以嘗試其他的分割模型,Deeplab 系列也是一個比較好的選擇,對主幹的修改也相對容易。

三、總結

  1. 個人的感覺對於這種網絡的設計、代碼的寫法要有天馬行空的想象力,代碼寫起來也像武俠小說中那種飄逸感;同時,算法設計思想是很重要的,如果單純的替換主幹這種事情,都可以當做算法的設計的話,那豈不是人人都可以做算法工程師了(這也是單純的從模型的角度來說);不過優秀的算法設計的思想很往往是很困難的,因爲不可能每個人都是 “聰明絕頂” 的高手,可能有時候需要像有機化學中苯環的結構圖一樣,需要做一個奇幻的美夢。

  2. 這篇文章,我的個人的理解比較多,可能也有不正確的理解,也歡迎大家批評指正,多多學習。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/eQgA1OYozKLXx-gbJjDpnw