OC-costで何が見えるか
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