Dice系數(Dice coefficient)與mIoU與Dice Loss


Dice系數和mIoU是語義分割的評價指標,在這里進行了簡單知識介紹。講到了Dice順便在最后提一下Dice Loss,以后有時間區分一下在語義分割中兩個常用的損失函數,交叉熵和Dice Loss。

一、Dice系數

1.概念理解

Dice系數是一種集合相似度度量函數,通常用於計算兩個樣本的相似度,取值范圍在[0,1]:

 

 

 

其中 |X∩Y| 是X和Y之間的交集,|X|和|Y|分表表示X和Y的元素的個數,其中,分子的系數為2,是因為分母存在重復計算X和Y之間的共同元素的原因。

對於語義分割問題而言,X-GT分割圖像(Ground Truth),Y-Pred分割圖像

看圖一直觀理解一下

 

 


圖一 Dice系數示意圖
公式就可以理解為

 

 

 

2.實際計算

首先將 |X∩Y| 近似為預測圖pred和label GT 之間的點乘,並將點乘的元素的結果相加:

(1)預測分割圖與 GT 分割圖的點乘:

 

 

 

(2)逐元素相乘的結果元素的相加和:

 

 

 

對於二分類問題,GT分割圖是只有0,1兩個值的,因此 |X∩Y| 可以有效的將在 Pred 分割圖中未在 GT 分割圖中激活的所有像素清零. 對於激活的像素,主要是懲罰低置信度的預測,較高值會得到更好的 Dice 系數.

(3)計算|X|和|Y|,這里可以采用直接元素相加,也可以采用元素平方求和的方法:

 

 

 

3.PyTorch代碼

def dice_coeff(pred, target):
smooth = 1.
num = pred.size(0)
m1 = pred.view(num, -1) # Flatten
m2 = target.view(num, -1) # Flatten
intersection = (m1 * m2).sum()
return (2. * intersection + smooth) / (m1.sum() + m2.sum() + smooth)

二、mIoU

1.語義分割元素分類的四種情況

true positive(TP):預測正確, 預測結果是正類, 真實是正類

false positive(FP):預測錯誤, 預測結果是正類, 真實是負類

true negative(TN):預測正確, 預測結果是負類, 真實是負類

false negative(FN):預測錯誤, 預測結果是負類, 真實是正類

2.mIoU定義與單個IoU理解

計算真實值和預測值兩個集合的交集和並集之比。這個比例可以變形為TP(交集)比上TP、FP、FN之和(並集)。即:mIoU=TP/(FP+FN+TP)。

這里還是直接上個圖理解一下,詳細解釋看圖二,我覺得講的非常棒了。

對於pascal數據集來說, 對於21個類別, 分別求IoU:
對於某一個類別的IoU計算公式如下:

 

 


圖二 mIoU理解
mIoU:計算兩圓交集(橙色部分)與兩圓並集(紅色+橙色+黃色)之間的比例,理想情況下兩圓重合,比例為1。

3.mIoU計算

(1)首先是計算混淆矩陣(誤差矩陣)

(2)計算mIoU

這里代碼比較多,以后有時間單獨拿出來。也可以參考這個鏈接中的代碼部分:https://blog.csdn.net/u012370185/article/details/94409933

以及這個github:https://github.com/dilligencer-zrj/code_zoo/blob/master/compute_mIOU

 

三、Dice Loss

Dice Loss的計算公式非常簡單如下:

 

 

 

這種損失函數被稱為 Soft Dice Loss,因為我們直接使用預測概率而不是使用閾值或將它們轉換為二進制mask。

Soft Dice Loss 將每個類別分開考慮,然后平均得到最后結果。比較直觀如圖三所示。

                                                                                                                                     圖三 soft dice loss

 

需要注意的是Dice Loss存在兩個問題:

(1)訓練誤差曲線非常混亂,很難看出關於收斂的信息。盡管可以檢查在驗證集上的誤差來避開此問題。

(2)Dice Loss比較適用於樣本極度不均的情況,一般的情況下,使用 Dice Loss 會對反向傳播造成不利的影響,容易使訓練變得不穩定。

所以在一般情況下,還是使用交叉熵損失函數。

PyTorch參考代碼

import torch.nn as nn
import torch.nn.functional as F

class SoftDiceLoss(nn.Module):
def __init__(self, weight=None, size_average=True):
super(SoftDiceLoss, self).__init__()

def forward(self, logits, targets):
num = targets.size(0)
smooth = 1
probs = F.sigmoid(logits)
m1 = probs.view(num, -1)
m2 = targets.view(num, -1)
intersection = (m1 * m2)
score = 2. * (intersection.sum(1) + smooth) / (m1.sum(1) + m2.sum(1) + smooth)
score = 1 - score.sum() / num
return score

————————————————
版權聲明:本文為CSDN博主「interesting233333」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/lipengfei0427/article/details/109556985


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM