語(yǔ)義分割中的 loss function 最全面匯總
點(diǎn)擊上方“視學(xué)算法”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)
導(dǎo)讀
?本文總結(jié)了語(yǔ)義分割中的5個(gè)損失函數(shù),詳細(xì)介紹每個(gè)損失函數(shù)的使用場(chǎng)景以及特點(diǎn)。
目錄:
cross entropy loss weighted loss focal loss dice soft loss soft iou loss 總結(jié)
1、cross entropy loss
用于圖像語(yǔ)義分割任務(wù)的最常用損失函數(shù)是像素級(jí)別的交叉熵?fù)p失,這種損失會(huì)逐個(gè)檢查每個(gè)像素,將對(duì)每個(gè)像素類(lèi)別的預(yù)測(cè)結(jié)果(概率分布向量)與我們的獨(dú)熱編碼標(biāo)簽向量進(jìn)行比較。
假設(shè)我們需要對(duì)每個(gè)像素的預(yù)測(cè)類(lèi)別有5個(gè),則預(yù)測(cè)的概率分布向量長(zhǎng)度為5:

每個(gè)像素對(duì)應(yīng)的損失函數(shù)為:
整個(gè)圖像的損失就是對(duì)每個(gè)像素的損失求平均值。
特別注意的是,binary entropy loss 是針對(duì)類(lèi)別只有兩個(gè)的情況,簡(jiǎn)稱(chēng) bce loss,損失函數(shù)公式為:
2、weighted loss
由于交叉熵?fù)p失會(huì)分別評(píng)估每個(gè)像素的類(lèi)別預(yù)測(cè),然后對(duì)所有像素的損失進(jìn)行平均,因此我們實(shí)質(zhì)上是在對(duì)圖像中的每個(gè)像素進(jìn)行平等地學(xué)習(xí)。如果多個(gè)類(lèi)在圖像中的分布不均衡,那么這可能導(dǎo)致訓(xùn)練過(guò)程由像素?cái)?shù)量多的類(lèi)所主導(dǎo),即模型會(huì)主要學(xué)習(xí)數(shù)量多的類(lèi)別樣本的特征,并且學(xué)習(xí)出來(lái)的模型會(huì)更偏向?qū)⑾袼仡A(yù)測(cè)為該類(lèi)別。
FCN論文和U-Net論文中針對(duì)這個(gè)問(wèn)題,對(duì)輸出概率分布向量中的每個(gè)值進(jìn)行加權(quán),即希望模型更加關(guān)注數(shù)量較少的樣本,以緩解圖像中存在的類(lèi)別不均衡問(wèn)題。
比如對(duì)于二分類(lèi),正負(fù)樣本比例為1: 99,此時(shí)模型將所有樣本都預(yù)測(cè)為負(fù)樣本,那么準(zhǔn)確率仍有99%這么高,但其實(shí)該模型沒(méi)有任何使用價(jià)值。
為了平衡這個(gè)差距,就對(duì)正樣本和負(fù)樣本的損失賦予不同的權(quán)重,帶權(quán)重的二分類(lèi)損失函數(shù)公式如下:
要減少假陰性樣本的數(shù)量,可以增大 pos_weight;要減少假陽(yáng)性樣本的數(shù)量,可以減小 pos_weight。
3、focal loss
上面針對(duì)不同類(lèi)別的像素?cái)?shù)量不均衡提出了改進(jìn)方法,但有時(shí)還需要將像素分為難學(xué)習(xí)和容易學(xué)習(xí)這兩種樣本。
容易學(xué)習(xí)的樣本模型可以很輕松地將其預(yù)測(cè)正確,模型只要將大量容易學(xué)習(xí)的樣本分類(lèi)正確,loss就可以減小很多,從而導(dǎo)致模型不怎么顧及難學(xué)習(xí)的樣本,所以我們要想辦法讓模型更加關(guān)注難學(xué)習(xí)的樣本。
對(duì)于較難學(xué)習(xí)的樣本,將 bce loss 修改為:
其中的 通常設(shè)置為2。
舉個(gè)例子,預(yù)測(cè)一個(gè)正樣本,如果預(yù)測(cè)結(jié)果為0.95,這是一個(gè)容易學(xué)習(xí)的樣本,有 ,損失直接減少為原來(lái)的1/400。
而如果預(yù)測(cè)結(jié)果為0.4,這是一個(gè)難學(xué)習(xí)的樣本,有 ,損失減小為原來(lái)的1/4,雖然也在減小,但是相對(duì)來(lái)說(shuō),減小的程度小得多。
所以通過(guò)這種修改,就可以使模型更加專(zhuān)注于學(xué)習(xí)難學(xué)習(xí)的樣本。
而將這個(gè)修改和對(duì)正負(fù)樣本不均衡的修改合并在一起,就是大名鼎鼎的 focal loss:
4、dice soft loss
語(yǔ)義分割任務(wù)中常用的還有一個(gè)基于 Dice 系數(shù)的損失函數(shù),該系數(shù)實(shí)質(zhì)上是兩個(gè)樣本之間重疊的度量。此度量范圍為 0~1,其中 Dice 系數(shù)為1表示完全重疊。Dice 系數(shù)最初是用于二進(jìn)制數(shù)據(jù)的,可以計(jì)算為:
代表集合A和B之間的公共元素,并且 代表集合A中的元素?cái)?shù)量(對(duì)于集合B同理)。
對(duì)于在預(yù)測(cè)的分割掩碼上評(píng)估 Dice 系數(shù),我們可以將 近似為預(yù)測(cè)掩碼和標(biāo)簽掩碼之間的逐元素乘法,然后對(duì)結(jié)果矩陣求和。

計(jì)算 Dice 系數(shù)的分子中有一個(gè)2,那是因?yàn)榉帜钢袑?duì)兩個(gè)集合的元素個(gè)數(shù)求和,兩個(gè)集合的共同元素被加了兩次。為了設(shè)計(jì)一個(gè)可以最小化的損失函數(shù),可以簡(jiǎn)單地使用 。這種損失函數(shù)被稱(chēng)為 soft Dice loss,這是因?yàn)槲覀冎苯邮褂妙A(yù)測(cè)出的概率,而不是使用閾值將其轉(zhuǎn)換成一個(gè)二進(jìn)制掩碼。
Dice loss是針對(duì)前景比例太小的問(wèn)題提出的,dice系數(shù)源于二分類(lèi),本質(zhì)上是衡量?jī)蓚€(gè)樣本的重疊部分。
對(duì)于神經(jīng)網(wǎng)絡(luò)的輸出,分子與我們的預(yù)測(cè)和標(biāo)簽之間的共同激活有關(guān),而分母分別與每個(gè)掩碼中的激活數(shù)量有關(guān),這具有根據(jù)標(biāo)簽掩碼的尺寸對(duì)損失進(jìn)行歸一化的效果。

對(duì)于每個(gè)類(lèi)別的mask,都計(jì)算一個(gè) Dice 損失:
將每個(gè)類(lèi)的 Dice 損失求和取平均,得到最后的 Dice soft loss。
下面是代碼實(shí)現(xiàn):
def?soft_dice_loss(y_true,?y_pred,?epsilon=1e-6):?
????'''?
????Soft?dice?loss?calculation?for?arbitrary?batch?size,?number?of?classes,?and?number?of?spatial?dimensions.
????Assumes?the?`channels_last`?format.
??
????#?Arguments
????????y_true:?b?x?X?x?Y(?x?Z...)?x?c?One?hot?encoding?of?ground?truth
????????y_pred:?b?x?X?x?Y(?x?Z...)?x?c?Network?output,?must?sum?to?1?over?c?channel?(such?as?after?softmax)?
????????epsilon:?Used?for?numerical?stability?to?avoid?divide?by?zero?errors
????
????#?References
????????V-Net:?Fully?Convolutional?Neural?Networks?for?Volumetric?Medical?Image?Segmentation?
????????https://arxiv.org/abs/1606.04797
????????More?details?on?Dice?loss?formulation?
????????https://mediatum.ub.tum.de/doc/1395260/1395260.pdf?(page?72)
????????
????????Adapted?from?https://github.com/Lasagne/Recipes/issues/99#issuecomment-347775022
????'''
????
????#?skip?the?batch?and?class?axis?for?calculating?Dice?score
????axes?=?tuple(range(1,?len(y_pred.shape)-1))?
????numerator?=?2.?*?np.sum(y_pred?*?y_true,?axes)
????denominator?=?np.sum(np.square(y_pred)?+?np.square(y_true),?axes)
????
????return?1?-?np.mean(numerator?/?(denominator?+?epsilon))?#?average?over?classes?and?batch
5、soft IoU loss
前面我們知道計(jì)算 Dice 系數(shù)的公式,其實(shí)也可以表示為:
其中 TP 為真陽(yáng)性樣本,F(xiàn)P 為假陽(yáng)性樣本,F(xiàn)N 為假陰性樣本。分子和分母中的 TP 樣本都加了兩次。
IoU 的計(jì)算公式和這個(gè)很像,區(qū)別就是 TP 只計(jì)算一次:
和 Dice soft loss 一樣,通過(guò) IoU 計(jì)算損失也是使用預(yù)測(cè)的概率值:
其中 C 表示總的類(lèi)別數(shù)。
總結(jié):
交叉熵?fù)p失把每個(gè)像素都當(dāng)作一個(gè)獨(dú)立樣本進(jìn)行預(yù)測(cè),而 dice loss 和 iou loss 則以一種更“整體”的方式來(lái)看待最終的預(yù)測(cè)輸出。
這兩類(lèi)損失是針對(duì)不同情況,各有優(yōu)點(diǎn)和缺點(diǎn),在實(shí)際應(yīng)用中,可以同時(shí)使用這兩類(lèi)損失來(lái)進(jìn)行互補(bǔ)。
參考:
An overview of semantic image segmentation.(https://www.jeremyjordan.me/semantic-segmentation/)
Loss Functions for Medical Image Segmentation(https://medium.com/@junma11/loss-functions-for-medical-image-segmentation-a-taxonomy-cefa5292eec0)
Losses for Image Segmentation(https://lars76.github.io/neural-networks/object-detection/losses-for-segmentation/)

點(diǎn)個(gè)在看 paper不斷!
