算法原理
基于深度學(xué)習(xí)的圖像分割算法屬于圖像處理領(lǐng)域最高層次的圖像理解范疇。所謂圖像分割就是把圖像分割成具有相似的顏色或紋理特性的若干子區(qū)域,并使它們對應(yīng)不同的物體或物體的不同部分的技術(shù)。這些子區(qū)域,組成圖像的完備子集,又相互之間不重疊。
1、傳統(tǒng)分割方法
圖像分割問題最早來自于一些文本的分割,醫(yī)學(xué)圖像分割。在文本圖像分割中,需要切割出字符,常見的問題包括指紋識別,車牌識別;由于這一類問題比較簡單,因?yàn)榛陂撝岛途垲惖姆椒ū唤?jīng)常使用;陂撝岛途垲惖姆椒m然簡單,但因此也經(jīng)常失效。以graphcut為代表的方法,是傳統(tǒng)圖像分割里面魯棒性最好的方法。Graphcut的基本思路,就是建立一張圖,其中以圖像像素或者超像素作為圖像頂點(diǎn),然后移除一些邊,使得各個(gè)子圖不相連從而實(shí)現(xiàn)分割。圖割方法優(yōu)化的目標(biāo)是找到一個(gè)切割,使得移除邊的和權(quán)重最小。
2、深度學(xué)習(xí)方法:
全卷積神經(jīng)網(wǎng)絡(luò)(Fully connected Network)是第一個(gè)將卷積神經(jīng)網(wǎng)絡(luò)正式用于圖像分割問題的網(wǎng)絡(luò)。一個(gè)用于分類任務(wù)的深度神經(jīng)網(wǎng)絡(luò)通過卷積來不斷抽象學(xué)習(xí),實(shí)現(xiàn)分辨率的降低,最后從一個(gè)較小的featuremap或者最后的特征向量,這個(gè)featuremap通常為5*5或者7*7等大小。而圖像分割任務(wù)需要恢復(fù)與原尺度大小一樣的圖片,所以,需要從這個(gè)featuremap恢復(fù)原始圖片尺寸,這是一個(gè)上采樣的過程。由于這個(gè)過程與反卷積是正好對應(yīng)的逆操作,所以我們通常稱其為反卷積。代表算法有FCN、Unet、Deeplab等。
3、深度學(xué)習(xí)算法較之傳統(tǒng)分割算法的優(yōu)勢:
(1)學(xué)習(xí)能力強(qiáng):深度學(xué)習(xí)自動(dòng)提取低層次或者高層次特征,具有較強(qiáng)的學(xué)習(xí)能力。
(2)覆蓋范圍廣,適應(yīng)性好:深度學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò)層數(shù)很多,寬度很廣,理論上可以映射到任意函數(shù),所以能解決很復(fù)雜的問題。
(3)數(shù)據(jù)驅(qū)動(dòng),上限高:深度學(xué)習(xí)高度依賴數(shù)據(jù),數(shù)據(jù)量越大,它的表現(xiàn)就越好。在圖像識別、面部識別、NLP 等部分任務(wù)甚至已經(jīng)超過了人類的表現(xiàn)。同時(shí)還可以通過調(diào)參進(jìn)一步提高它的上限。
(4)可移植性好:由于深度學(xué)習(xí)的優(yōu)異表現(xiàn),有很多框架可以使用,例如 TensorFlow、Pytorch。這些框架可以兼容很多平臺(tái)。
傳統(tǒng)分割方法中特征提取主要依賴人工設(shè)計(jì)的提取器,需要有專業(yè)知識及復(fù)雜的調(diào)參過程,同時(shí)每個(gè)方法都是針對具體應(yīng)用,泛化能力及魯棒性較差。存儲(chǔ)開銷大,計(jì)算效率低下,識別速度較慢。
深度學(xué)習(xí)主要是數(shù)據(jù)驅(qū)動(dòng)進(jìn)行特征提取,根據(jù)大量樣本的學(xué)習(xí)能夠得到深層的、數(shù)據(jù)集特定的特征表示,其對數(shù)據(jù)集的表達(dá)更高效和準(zhǔn)確,所提取的抽象特征魯棒性更強(qiáng),泛化能力更好,并且可以是端到端的。
4、Unet算法
本項(xiàng)目使用了基于深度學(xué)習(xí)的Unet網(wǎng)絡(luò):Unet網(wǎng)絡(luò)由兩部分組成,前半部分作用是特征提。ɑA(chǔ)模型為MobileNet),后半部分是上采樣。在一些文獻(xiàn)中也把這樣的結(jié)構(gòu)叫做編碼器-解碼器結(jié)構(gòu)。由于此網(wǎng)絡(luò)整體結(jié)構(gòu)類似于大寫的英文字母U,故得名Unet。
Unet與其他常見的分割網(wǎng)絡(luò)有一點(diǎn)非常不同的地方:Unet采用了完全不同的特征融合方式:拼接,Unet采用將特征在channel維度拼接在一起,形成更厚的特征。而FCN融合時(shí)使用的對應(yīng)點(diǎn)相加,并不形成更厚的特征。
所以語義分割網(wǎng)絡(luò)在特征融合時(shí)有兩種辦法:
(1)FCN式的對應(yīng)點(diǎn)相加,對應(yīng)于TensorFlow中的tf.add()函數(shù);
(2)Unet式的channel維度拼接融合,對應(yīng)于TensorFlow的tf.concat()函數(shù),比較占顯存。
除了上述新穎的特征融合方式,Unet還有以下幾個(gè)優(yōu)點(diǎn):
(1)5個(gè)pooling layer實(shí)現(xiàn)了網(wǎng)絡(luò)對圖像特征的多尺度特征識別。
(2)上采樣部分會(huì)融合特征提取部分的輸出,這樣做實(shí)際上是將多尺度特征融合在了一起,以最后一個(gè)上采樣為例,它的特征既來自第一個(gè)卷積block的輸出(同尺度特征),也來自上采樣的輸出(大尺度特征),這樣的連接是貫穿整個(gè)網(wǎng)絡(luò)的,可以看到上圖的網(wǎng)絡(luò)中有四次融合過程,相對應(yīng)的FCN網(wǎng)絡(luò)只在最后一層進(jìn)行融合。
數(shù)據(jù)集準(zhǔn)備
深度學(xué)習(xí)模型的精確度一般依賴于數(shù)據(jù)集的大小,CNN要求用于訓(xùn)練的數(shù)據(jù)集足夠大,能夠覆蓋問題域中所有已知可能出現(xiàn)的問題。設(shè)計(jì)CNN的時(shí)候,數(shù)據(jù)集包含三個(gè)子集:訓(xùn)練集、測試集、驗(yàn)證集。
1、訓(xùn)練集:包含問題域中的所有數(shù)據(jù),并在訓(xùn)練階段用來調(diào)整網(wǎng)絡(luò)的權(quán)重。
2、測試集:在訓(xùn)練的過程中用于測試網(wǎng)絡(luò)對訓(xùn)練集中未出現(xiàn)數(shù)據(jù)的檢測性能,根據(jù)網(wǎng)絡(luò)在測試集上的性能情況,網(wǎng)絡(luò)的結(jié)構(gòu)可能需要做出調(diào)整,或者增加訓(xùn)練循環(huán)次數(shù)。
3、驗(yàn)證集:驗(yàn)證集中的數(shù)據(jù)統(tǒng)一應(yīng)該包含在測試集和訓(xùn)練集中沒有出現(xiàn)過的數(shù)據(jù),用于在網(wǎng)絡(luò)確定之后能夠更好的測試和衡量網(wǎng)絡(luò)的性能。
數(shù)據(jù)預(yù)處理與參數(shù)設(shè)置
1、數(shù)據(jù)預(yù)處理
為了加速訓(xùn)練的收斂速度,一般都會(huì)采用一些數(shù)據(jù)預(yù)處理技術(shù),其中包括:去除噪聲、輸入數(shù)據(jù)降維、刪除無關(guān)數(shù)據(jù)等。
數(shù)據(jù)的平衡化在目標(biāo)檢測問題中異常重要,一般認(rèn)為訓(xùn)練集中的數(shù)據(jù)應(yīng)該相對于標(biāo)簽類別近似于平均分布,也就是每一個(gè)類別標(biāo)簽所對應(yīng)的數(shù)據(jù)集在訓(xùn)練集中是基本相等的,以避免網(wǎng)絡(luò)過于傾向于表現(xiàn)某些分類的特點(diǎn)。
為了平衡數(shù)據(jù)集,應(yīng)該移除一些過度富余的分類中的數(shù)據(jù),并相應(yīng)補(bǔ)充一些相對樣例稀少的分類中的數(shù)據(jù)。還有一個(gè)方法就是復(fù)制一部分這些樣例稀少的數(shù)據(jù),并在這些數(shù)據(jù)中加入隨機(jī)噪聲。
2、數(shù)據(jù)歸一化
將數(shù)據(jù)規(guī)則化到統(tǒng)一的區(qū)間(如[0,1])中,可以防止數(shù)據(jù)中存在較大數(shù)值的數(shù)據(jù)造成數(shù)值較小的數(shù)據(jù)對于訓(xùn)練效果減弱甚至無效化。一個(gè)常用的方法是將輸入和輸出數(shù)據(jù)按比例調(diào)整到一個(gè)和激活函數(shù)相對應(yīng)的區(qū)間。
3、網(wǎng)絡(luò)權(quán)值初始化
CNN的初始化主要是初始化卷積層和輸出層的權(quán)值和偏置。網(wǎng)絡(luò)權(quán)值初始化就是將網(wǎng)絡(luò)中的所有連接權(quán)重賦予一個(gè)初始值,如果初始權(quán)重向量處在誤差曲面的一個(gè)相對平緩的區(qū)域的時(shí)候,網(wǎng)絡(luò)訓(xùn)練的收斂速度可能會(huì)很緩慢,一般情況下網(wǎng)絡(luò)的連接權(quán)重和偏置被初始化在一個(gè)具有0均值的相對小的區(qū)間內(nèi)均勻分布。
4、學(xué)習(xí)速率
如果學(xué)習(xí)速率選取的較大,則會(huì)在訓(xùn)練過程中較大幅度的調(diào)整權(quán)值,從而加快網(wǎng)絡(luò)的訓(xùn)練速度,但是這會(huì)造成網(wǎng)絡(luò)在誤差曲面上搜索過程中頻繁抖動(dòng),且有可能使得訓(xùn)練過程不能收斂。如果學(xué)習(xí)速率選取的較小,能夠穩(wěn)定的使得網(wǎng)絡(luò)逼近于全局最優(yōu)點(diǎn),但也可能陷入一些局部最優(yōu),并且參數(shù)更新速度較慢。自適應(yīng)學(xué)習(xí)率設(shè)定有較好的效果。
5、收斂條件
訓(xùn)練誤差、誤差梯度、交叉驗(yàn)證等可以作為停止訓(xùn)練的判定條件。一般來說,訓(xùn)練集的誤差會(huì)隨著網(wǎng)絡(luò)訓(xùn)練的進(jìn)行而逐步降低。
標(biāo)注
對訓(xùn)練集和測試集的數(shù)據(jù)使用專業(yè)的標(biāo)注工具進(jìn)行標(biāo)注,本項(xiàng)目標(biāo)注圖片數(shù)量為5000張。
訓(xùn)練流程
訓(xùn)練過程分為兩個(gè)階段:前向傳播階段和后向傳播階段
前向傳播階段:
1、從樣本集中取N個(gè)樣本,輸入網(wǎng)絡(luò)。
2、計(jì)算相應(yīng)的實(shí)際輸出,在此階段信息從輸入層經(jīng)過逐級變換,傳送到輸出層。
后向傳播階段:
1、計(jì)算實(shí)際輸出與相應(yīng)的理想輸出的誤差。
2、按照極小化誤差的方法調(diào)整權(quán)值矩陣。
具體訓(xùn)練過程如下:
1、選定訓(xùn)練組,從樣本集中分別隨機(jī)地尋求N個(gè)樣本作為訓(xùn)練組。
2、將各權(quán)值、偏置,設(shè)置成小的接近于0的隨機(jī)值,并初始化精度控制參數(shù)和學(xué)習(xí)率。
3、從訓(xùn)練組中取一個(gè)輸入模式加到網(wǎng)絡(luò),并給出它的目標(biāo)輸出向量。
4、計(jì)算出中間層輸出向量,計(jì)算出網(wǎng)絡(luò)的實(shí)際輸出向量。
5、將輸出向量中的元素與目標(biāo)向量中的元素進(jìn)行比較,計(jì)算出輸出誤差;對于中間層的隱單元也需要計(jì)算出誤差。
6、依次計(jì)算出各權(quán)值的調(diào)整量和偏置的調(diào)整量。
7、調(diào)整權(quán)值和調(diào)整偏置。
8、當(dāng)經(jīng)歷M次迭代后,判斷指標(biāo)是否滿足精度要求,如果不滿足,則返回步驟3,繼續(xù)迭代;如果滿足就進(jìn)入下一步。
9、訓(xùn)練結(jié)束,將權(quán)值和偏置保存在模型文件中。這時(shí)可以認(rèn)為各個(gè)權(quán)值已經(jīng)達(dá)到穩(wěn)定,模型已經(jīng)形成。再一次進(jìn)行訓(xùn)練時(shí),直接從模型文件中導(dǎo)出權(quán)值和偏置進(jìn)行訓(xùn)練,不需要進(jìn)行初始化。
識別流程
利用訓(xùn)練好的模型對待檢測的圖片進(jìn)行缺陷檢測的具體流程大致為:
1、將整張圖片傳入模型進(jìn)行下采樣,得到特征圖。
2、將特征圖進(jìn)行上采樣且結(jié)合下采樣特征圖得到與原圖尺寸一樣的mask圖。
3、對mask圖進(jìn)行可視化即可看到測試結(jié)果。
模型優(yōu)化
針對識別結(jié)果可以通過以下方法優(yōu)化模型:
1、增加樣本數(shù)量。
2、豐富缺陷種類和平衡每種缺陷的樣本數(shù)量。
3、調(diào)整模型參數(shù)。