web-dev-qa-db-ja.com

python)で画像セグメンテーションの精度を測定するためのダイス係数を計算する方法

土地被覆の画像があり、K-meansクラスタリングを使用してセグメント化しました。次に、セグメンテーションアルゴリズムの精度を計算したいと思います。私はどこかで、サイコロ係数が実質的な評価尺度であると読みました。しかし、私はそれを計算する方法がわかりません。 Python 2.7他に効果的な評価方法はありますか?要約またはソースへのリンクを教えてください。ありがとうございます!

編集:元の画像とセグメント化された画像のダイスの類似性を測定するために次のコードを使用しましたが、計算に数時間かかるようです:

for i in xrange(0,7672320):
  for j in xrange(0,3):
    dice = np.sum([seg==gt])*2.0/(np.sum(seg)+np.sum(gt)) #seg is the segmented image and gt is the original image. Both are of same size
6
RachJain

wiki のダイス類似係数を参照してください。

参考までに、サンプルコードセグメントをここに示します。 k-meansを使用しているため、kを目的のクラスターに置き換える必要があることに注意してください。

import numpy as np

k=1

# segmentation
seg = np.zeros((100,100), dtype='int')
seg[30:70, 30:70] = k

# ground truth
gt = np.zeros((100,100), dtype='int')
gt[30:70, 40:80] = k

dice = np.sum(seg[gt==k])*2.0 / (np.sum(seg) + np.sum(gt))

print 'Dice similarity score is {}'.format(dice)
8
pyan

これは、使用しているものに3つ以上のクラス(別名、1と0のマスク)がある場合の重要な説明です。

複数のクラスを使用している場合は、予測とグラウンドトゥルースも必要な値に等しいことを指定してください。そうしないと、DSC値が1より大きくなる可能性があります。

これは、各==kステートメントの最後にある追加の[]です。

import numpy as np

k=1

# segmentation
seg = np.zeros((100,100), dtype='int')
seg[30:70, 30:70] = k

# ground truth
gt = np.zeros((100,100), dtype='int')
gt[30:70, 40:80] = k

dice = np.sum(seg[gt==k]==k)*2.0 / (np.sum(seg[seg==k]==k) + np.sum(gt[gt==k]==k))

print 'Dice similarity score is {}'.format(dice)
1