語義分割評價名額mIOU的計算
## 注意事項
這是針對重構了的語義分割網絡,而不是之前的那個,是以不要詢問原來的網絡計算miou要怎麼做,因為整個檔案構架差距過大,建議使用新構架。
學習前言
算一下語義分割的miou,做好生态鍊。
什麼是mIOU
Mean Intersection over Union(MIoU,均交并比):其是語義分割的标準度量。
在了解mIOU之前,首先先了解一下IOU是什麼,IOU的英文全稱為Intersection over Union,中文簡稱為交并比,也就是交和并的比值。
在語義分割的問題中,單類的交并比就是該類的真實标簽和預測值的交和并的比值。示意圖如下:
在圖中,A為真實标簽,占據了圖像的一定區域;B為預測結果,占據了圖像的一定區域。中間的TP部分就是真實标簽和預測值的交,圖像整個有顔色的部分就是真實标簽和預測值的并。
而mIOU就是該資料集中的每一個類的交并比的平均。
計算公式如下:i表示真實值,j表示預測值 ,pij表示将i預測為j。
mIOU的計算
1、計算混淆矩陣:
混淆矩陣聽起來很牛逼,其實實際上的實作非常簡單。
假設我們現在有一百個樣本,分别屬于1、2、3、4類,每個類都有二十五個樣本。
我們利用網絡去進行分類,此時我們可以通過一個矩陣去表現出最終的預測效果,就是混淆矩陣。
每一行之和是該類的真實樣本數量,每一列之和是預測為該類的樣本數量。
我們來看第一行,第一行意味着,有20個實際為類1的樣本被分為類1,有2個實際為類1的樣本被分為類2,有1個實際為類1的樣本被分為類3,有1個實際為類1的樣本被分為類4。
2、計算IOU:
混淆矩陣的對角線上的值是該類的交。
混淆矩陣的每一行再加上每一列,最後減去對角線上的值就是該類的并。
比如對于類1而言,一行一列是True Positive也就是,一行二列、三列、四列都是False Negative,二行一列、三行一列、四行一列都是False Positive。
按照IOU的示意圖與公式,可以算出來
計算代碼如下:
# 設标簽寬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)