OC-costで何が見えるか

2022/10/14に公開

Solafuneという衛星データ解析コンテストプラットフォームのコンペで、OC-costを評価指標にしているので、値の感覚をつかむべく何をしたらどう変わるのかを検証。

OC-costとは

論文だけでなく、執筆者が日本語記事も書いてますし、デモも作成&公開してくれているので、拝見。

ざっくりとしたイメージは

推論結果のクラスとbounding box(bbox)の誤差を正解に一致させるために、どのくらいのコストが必要かを算出する指標。値が小さい方が推論結果としては良いということになる。

検証に使用したデータと算出プログラム

データ

ダミーデータでも検証は可能だが、コンペの学習用データがあるので、こちらを使用する。1175枚分のデータ。クラス数は1なので、推論結果におけるクラス間違いを無視でき、bboxにだけ注目して検証が可能。詳しい情報は、コンペをどうぞ。

OC-costの算出プログラム

公開されているのでありがたく使用。
Usageにあるように、論文におけるlambdaは1.0、betaは0.5を使用。

検証内容

推論結果とGroundTruthが完全に一致している場合

OC-cost = 0.0
ピッタリ一致している場合は当然0。

bboxの未検出があった場合(False Negative)

すべてのbboxが未検出であった場合のOC-costは0.5で、それ以外は未検出数の割合に応じて決まる模様。つまり、未検出数におけるペナルティを増やしたいなら、画像内に検出対象が少ないものを選べばよい。検証は以下の3パターンで実施。

1つのbboxが未検出

1175枚のうち1つの画像において、bboxをランダムに1つ削除。同じ画像の中でどのbboxを消してもOC-costの値は変わらないが、どの画像から消すかで数値が変わる。画像に存在するbboxが多いほど影響は少ない模様。

正解画像内にX個のbboxがあり、うち1つを削除した場合のOC-costはYとなった。

X,Yの組み合わせは以下の表を参照。

X:bbox Y:OC-cost
1 0.5
10 0.05
50 0.01
100 0.005

2つのbboxが未検出

同様に、1つの画像において、bboxをランダムに2つ削除。

X:bbox Y:OC-cost
2 0.5
3 0.333
4 0.25
10 0.1
50 0.02
100 0.01

3つのbboxが未検出

同様に、1つの画像において、bboxをランダムに3つ削除。

X:bbox Y:OC-cost
3 0.5
4 0.375
5 0.3
10 0.15
50 0.03
100 0.015

bboxの誤検出があった場合(False Positive)

誤検出があった場合は、OC-costは誤検出の割合によって決まる。

OC-cost=0.5 * FP / (TP + FP)
※FP:False Positive、TP:True Positive

つまり、誤検出数におけるペナルティを増やしたいなら、画像内に検出対象が少ないものを選べばよい。

bboxを1つ多く検出

1175枚のうち1つの画像において、bboxを1つ追加。(既存のbboxとか重ならないようにする)
既存のbboxと重ならなければ、画像上のどこに、どのサイズで配置してもOC-costの値は変わらない。未検出同様、正解画像に存在するbboxが多いほどOC-costへの影響は少ない模様。

画像内にX個のbboxがあり、重ならないように1つを追加した場合のOC-costはYとなった。

X:bbox Y:OC-cost
1 0.25
2 0.166667
3 0.125
4 0.1
5 0.083333
10 0.045455
50 0.009804
100 0.004950

bboxを2つ多く検出

同様に、1つの画像において、bboxを2つ追加。(既存のbboxとか重ならないようにする)

X:bbox Y:OC-cost
1 0.333333
2 0.25
3 0.2
4 0.166667
5 0.142857
10 0.083333
50 0.019231
100 0.009804

bboxを3つ多く検出

同様に、1つの画像において、bboxを3つ追加。(既存のbboxとか重ならないようにする)

X:bbox Y:OC-cost
1 0.375000
2 0.3
3 0.25
4 0.214286
5 0.1875
10 0.115385
50 0.028302
100 0.014563

bboxの未検出と誤検出がどちらもあった場合

未検出のみ、誤検出のみの時と同様に、OC-costの数値はbboxとの割合によって変化する。傾向として、ある程度のbbox数がある場合は、未検出のみのOC-costと、誤検出のみのOC-costを合算したような数値になる。ただし、最大値は0.5。

bboxを1つ多く検出し、1つのbboxが未検出

1つの画像において、bboxを1つ追加。(既存のbboxとか重ならないようにする)
その後、既存のbboxの1つを削除。
既存のbboxと重ならなければ、画像上のどこに、どのサイズで追加してもOC-costの値は変わらない。同じ画像の中で、追加した以外であれば、どのbboxを消してもOC-costの値は変わらない。

画像内にX個のbboxがあり、重ならないように1つを追加し、それ以外の1つを削除した場合のOC-costはYとなった。

X:bbox Y:OC-cost
1 0.5
2 0.333333
3 0.25
4 0.2
5 0.166667
10 0.090909
50 0.019608
100 0.009901

bboxを2つ多く検出し、2つのbboxが未検出

同様に、1つの画像において、bboxを2つ追加し、既存のbboxの2つを削除。

X:bbox Y:OC-cost
1 0.5
2 0.5
3 0.4
4 0.333333
5 0.285714
10 0.166667
50 0.038462
100 0.019608

bboxを3つ多く検出し、3つのbboxが未検出

同様に、1つの画像において、bboxを3つ追加し、既存のbboxの3つを削除。

X:bbox Y:OC-cost
1 0.5
2 0.5
3 0.5
4 0.428571
5 0.375
10 0.230769
50 0.056604
100 0.029126

検出の重複があった場合

ここでの重複とは、同一の検出対象物に対して、重なるように複数のbboxがある状態を指す。

重複が1つ

1つの画像において、bboxを1つ追加。(既存のbboxとか重なるようにする)

画像内にX個のbboxがあり、いずれかのbboxと重なるように1つを追加した場合のOC-costはYとなった。

結果が、bboxの誤検出があった場合(False Positive)と等しいことから、重複も誤検出と同様に扱われる模様。

X:bbox Y:OC-cost
1 0.25
2 0.166667
3 0.125
4 0.1
5 0.083333
10 0.045455
50 0.009804
100 0.004950

bboxのずれがあった場合

1つの画像において、bboxを1つ動かす。OC-costの位置ずれについては、GIoUが使用されている。今回の検証ではクラス数が1なので、クラス間違いによるコストが無視され、純粋に位置ずれが評価される。これまでの検証内容はbboxの位置やサイズには影響ないが、どんなデータでも同じく考えることができるが、ずれの評価はデータの影響を受けるので、あくまで参考値。

bboxの座標値1つがずれている

1175枚の全画像全bboxの右下X座標値を+1pxずらしたものと、正解データでOC-costを算出すると、0.03184となった。同様に、右下Y座標値を+1pxした場合は、0.03226となった。

bboxの座標値4つがずれている

bboxには左上・右下それぞれXとY座標があり、1175枚の全画像全bboxにおいて、この4つの値をランダムに-1,±0,+1した場合のOC-costは0.08345となった。同様に、ランダムに-2,-1,±0,+1,+2した場合は、0.13979となった。

パラメータについて

OC-costの算出において外部から変更可能なパラメータが、lambdaとbetaの2つある。

lambdaは、分類コストと位置コストの比率を変更できるパラメータ。分類度合を重視したい、クラス間違いに対して高いコストをかけたい場合は、lambdaを0にする。今回はクラス数1なので、lambdaのチューニングの必要はない。lambdaを変更しても全体の大きさが変化するだけで、相対的な関係は変化しない。

betaはダミーコストで、コストの最大値ともとらえることができる。値を大きくすると、誤差が許容され、値を小さくすると正確な検出が求められる。

試しにbetaを変更して、OC-costを再計算してみる。betaの値を0.1,0.5,1.0と変化させると、1つのbboxが未検出のOC-costが次のように変化した。

X:bbox Y:beta=0.1 Y:beta=0.5 Y:beta=1.0
1 0.1 0.5 1.0
10 0.01 0.05 0.1
50 0.002 0.01 0.02
100 0.001 0.005 0.01

しかし、bboxの座標値1つがずれている場合のOC-costには変化がなかった。つまり、未検出とbboxのずれ、どちらに多くのペナルティをつけるかが選択可能となる。

まとめ

論文に、適用するタスクや段階においてパラメータを変更すべきとあったが、実際にどう変化するかのイメージがつかめた。パラメータだけでなく画像内に正解がどれくらい存在するかも、最終的なOC-costに影響するので、評価指標だけでなくデータの状況も確認するのが良さそう。

また、lambdaやbetaを大きく動かすことで、見たいコストの部分だけを強調して見ることができるので、1つの組み合わせにこだわらず、状況に応じて色々な使い方ができそう。

Discussion