天天看點

語義分割評價名額mIOU的計算

語義分割評價名額mIOU的計算

## 注意事項

這是針對重構了的語義分割網絡,而不是之前的那個,是以不要詢問原來的網絡計算miou要怎麼做,因為整個檔案構架差距過大,建議使用新構架。

學習前言

算一下語義分割的miou,做好生态鍊。

語義分割評價名額mIOU的計算

什麼是mIOU

Mean Intersection over Union(MIoU,均交并比):其是語義分割的标準度量。

在了解mIOU之前,首先先了解一下IOU是什麼,IOU的英文全稱為Intersection over Union,中文簡稱為交并比,也就是交和并的比值。

在語義分割的問題中,單類的交并比就是該類的真實标簽和預測值的交和并的比值。示意圖如下:

語義分割評價名額mIOU的計算

在圖中,A為真實标簽,占據了圖像的一定區域;B為預測結果,占據了圖像的一定區域。中間的TP部分就是真實标簽和預測值的交,圖像整個有顔色的部分就是真實标簽和預測值的并。

而mIOU就是該資料集中的每一個類的交并比的平均。

計算公式如下:i表示真實值,j表示預測值 ,pij表示将i預測為j。

語義分割評價名額mIOU的計算

mIOU的計算

1、計算混淆矩陣:

混淆矩陣聽起來很牛逼,其實實際上的實作非常簡單。

假設我們現在有一百個樣本,分别屬于1、2、3、4類,每個類都有二十五個樣本。

我們利用網絡去進行分類,此時我們可以通過一個矩陣去表現出最終的預測效果,就是混淆矩陣。

語義分割評價名額mIOU的計算

每一行之和是該類的真實樣本數量,每一列之和是預測為該類的樣本數量。

我們來看第一行,第一行意味着,有20個實際為類1的樣本被分為類1,有2個實際為類1的樣本被分為類2,有1個實際為類1的樣本被分為類3,有1個實際為類1的樣本被分為類4。

2、計算IOU:

混淆矩陣的對角線上的值是該類的交。

混淆矩陣的每一行再加上每一列,最後減去對角線上的值就是該類的并。

比如對于類1而言,一行一列是True Positive也就是,一行二列、三列、四列都是False Negative,二行一列、三行一列、四行一列都是False Positive。

按照IOU的示意圖與公式,可以算出來

語義分割評價名額mIOU的計算

計算代碼如下:

# 設标簽寬W,長H
def fast_hist(a, b, n):
    # a是轉化成一維數組的标簽,形狀(H×W,);b是轉化成一維數組的标簽,形狀(H×W,)
    k = (a >= 0) & (a < n)
    # np.bincount計算了從0到n**2-1這n**2個數中每個數出現的次數,傳回值形狀(n, n)
    # 傳回中,寫對角線上的為分類正确的像素點
    return np.bincount(n * a[k].astype(int) + b[k], minlength=n ** 2).reshape(n, n)  

def per_class_iu(hist):
    # 矩陣的對角線上的值組成的一維數組/矩陣的所有元素之和,傳回值形狀(n,)
    return np.diag(hist) / (hist.sum(1) + hist.sum(0) - np.diag(hist))  

           

3、計算mIOU:

mIOU就是每一個類的IOU的平均,是以隻需要對每一個類都按照第二步的公式計算IOU,再求平均獲得mIOU就行了。

np.mean(per_class_iu(hist)
           
語義分割評價名額mIOU的計算

繼續閱讀