Deep Learning等の精度評価において、F値(Dice)とIoU(Jaccard)のどちらを選択するべきか?

初めまして、R&Dの加藤です。R&Dでは珍しく中途入社です*1 。業務は農業や医療のプロジェクトでDeep Learningを使った画像解析を主に担当しています*2。 また、終業後は不定期(主に月曜日)に職場の人達と一緒に皇居を走っています。先日開催された多摩川のランニングイベントでは、10kmコースを43分で走れました!

今回の記事では、Deep Learningによらず機械学習や統計の場面でも良く出現するF1 score(F値)とIntersection over Union(IoU)の意味を理解して使い分けることを目標とします*3

そもそもなぜ精度評価が必要?

Deep Learningに限らず、画像や音声などの認識、検知系全般においてその成果物(検知器)がどれだけ優秀かを説明する必要があります。
今回は大豆の葉の穴あき検知を例に説明します。この穴あき検知はAgri Field Managerを支えている技術のひとつです。

https://www.optim.co.jp/agriculture/agri-field.php

穴あき検知をはじめとした画像から画像を生成する系のDeep Learningは視覚的にも理解がしやすいと思います。
以下の図では、撮影した圃場*4の画像から葉の穴あき部分を画像として出力し、精度評価を行うフローを可視化しています。

f:id:optim-tech:20190312201916p:plain

入力画像とは、学習(推論*5)に使用する画像のことです。そこそこ*6の精度を出すには数千から数十万の画像が必要です。

正解画像とは、入力画像を学習(推論)させる時の答えとなる画像のことです。今回の図では正解画像の白い部分(虫食い穴)をある程度再現することを目標としています*7。虫食い穴に限らず、その他どんな正解画像を用意しても良いですが、難しすぎる問題は再現が難しくなります。

推論画像とは、入力画像をDeep Learningで推論した画像のことです。推論画像と正解画像が同じになっているかは目視確認ではなく、ちゃんと比較検証をしましょう。

推論と正解の比較検証とは、推論画像が正解画像とどれだけ近しいかを比較して検証した画像のことです。

  • True Positive(TP):正解画像と同じ場所を虫食い穴として検知できました!
  • False Positive(FP):虫食い穴じゃないのに、虫食い穴として誤検知しました
  • False Negative(FN):虫食い穴を見逃してしまいました…

このように、成果物と理想のギャップを可視化することはとても大切です。その一つとして例を出してみました。
さて、さっそくTPとかFPとか出てきましたね。次の章では精度評価に使用する用語をおさらいします。

用語のおさらい

混同行列についてTP/TN/FP/FN

先ほど登場したTPFPFNはTNと合わせて混同行列と呼ばれており、以下のような表になります。

Positive Negative
True TP:穴を正しく検知できた(緑色 TN:穴じゃないところを正しく検知できた
False FP:穴じゃないところを穴として誤検知した(黄色 FN:穴を見逃した(赤色

参考に、先ほどの画像を一部簡略化したものを以下に用意しました。

f:id:optim-tech:20190312210659p:plain

正解画像と推論画像が等しくなるにつれてTP(TN)が増え、FPFNが減っていきます*8。しかし、画像のサイズや正解画像の白い部分の割合などで混同行列の数値は大きく変化するので比較しにくいですね。そこで登場するのが次に説明する評価指標です。

評価指標について Precision/Recall/F値(Dice係数)/IoU(Jaccard係数)

評価指標にも様々ありますが、ここでは私が業務で良く使っているPrecision、Recall、F値(Dice係数)、IoU(Jaccard係数)の4種類について紹介していきます。

Precision(適合率)

Precisionを数式で表現すると以下の通りです。

\displaystyle
Precision = \frac{TP}{TP + FP}

PrecisionはPositiveを確認する指標になります。数式にFNが含まれていないので、いくら見逃していようが、PositiveがすべてTrue(FP=0)ならばPrecisionは100%になります。つまり誤検知にどれだけ強いかを測定する指標ともいえますね。

Recall(再現率)

Recallを数式で表現すると以下の通りです。

\displaystyle
Recall = \frac{TP}{TP + FN}

RecallはPrecisionと異なり、Negativeを確認する指標になります。数式にFPが含まれていないので、いくら誤検知していようが、False Negativeが0ならばRecallは100%になります。つまり見逃しにどれだけ強いかを測定する指標ともいえますね。
農業でも医療でも、誤検知は運用でカバーしやすいですが見逃しはそうもいかないので、PrecisionよりもRecallを重視する場合がほとんどです。

F値(Dice係数)

F値はPrecisionとRecallの調和平均になります。これを数式で表現すると以下の通りです。

\displaystyle
\begin{aligned}
F &= \frac{2}{\frac{1}{Precision}+\frac{1}{Recall}} \\  \\
&= \frac{2(Precision \times Recall)}{Recall + Precision} \\  \\
&= \frac{2\frac{TP^2}{(TP+FP)(TP+FN)}}{\frac{TP}{TP+FN}+\frac{TP}{TP+FP}}  \\  \\
&= \frac{2TP}{2TP + FP + FN}  \\  \\
&= \frac{TP}{TP + \frac{1}{2}(FP + FN)}
\end{aligned}

Precision(誤検知NG)とRecall(見逃しNG)はトレードオフの関係にあるのですが、PrecisionもRecallもどっちも欲しいというワガママな指標がF値です。 別名Dice係数と呼ばれています。

IoU(Jaccard係数)

Intersection over Union(IoU)を数式で表現すると以下の通りです。

\displaystyle
IoU = \frac{TP}{TP + FP + FN}

IoUはオーバーラップ率とも呼ばれています。大豆の葉の穴あきでいえば、どれだけ正確に穴あきを描画できているかを測る指標になります。別名Jaccard係数と呼ばれています。

F値とIoUどちらを使えばいい?

誤検知を評価したい場合はPrecision、見逃しを評価したい場合はRecallを重視すればいいことがわかりました。しかし、評価指標としては他のプロジェクトや学習モデルと定量的に比較したい場合も多々あるので、F値やIoUといった指標も使っていたいです。

数式による比較

F値とIoUの数式を見比べるとわかるように、どちらもとても似ていますが、F値の方が分母に1/2あるだけ値が大きくなる傾向ですね。

\displaystyle
\begin{aligned}
F &= \frac{TP}{TP + \frac{1}{2}(FP + FN)}  \\  \\
IoU &= \frac{TP}{TP + FP + FN} 
\end{aligned}

見やすくするためにTPをA、FP+FNをAxとする*9と以下のようになります。

\displaystyle
\begin{aligned}
F &= \frac{A}{A + \frac{1}{2}(Ax)}  \\  \\
&= \frac{2}{2 + x}  \\  \\
IoU &= \frac{A}{A + Ax}  \\  \\
&= \frac{1}{1 + x}
\end{aligned}

ここまでくると、F値とIoUが一番乖離するタイミングがわかりそうですね。プロットしてみましょう。

f:id:optim-tech:20190314103138p:plain

これによると、x\sqrt{2}、つまりFP+FNTPの約1.4倍で一番乖離するようです*10
また、F値とIoUは反比例の式になっているので、xが0に近いときか非常に大きいときに等しくなることがわかりますね。つまり、FP+FNTPの差が極端に大きい時です。

ここまでをまとめましょう。

  • F値とIoUが乖離するのは、FP+FNTPの約1.4倍の時
  • F値とIoUが同一になるのは、FP+FNTPの差が極端に大きいとき

図による比較

先ほどは数式による比較を実施しましたが、1.4倍とかいわれてもイメージつきませんね。視覚的にもわかりにくいので、図示してみましょう。

まず一つ目の図は、FP+FNTPの1.4倍程度の時です。 左は縁があまりうまく検知できていないようですが、右はかなり余計に誤検知していますね。 数値としては、右も左もF値が約55%、IoUが約40%と15%の開きがあります。

f:id:optim-tech:20190313123138p:plain

二つ目の図はFP+FNTPの差が極端に大きい時です。 左はきれいに検知できていますが、右は全然検知できていませんね。 数値としては、左のF値が約95%、IoUが約90%で、右のF値が約8%、IoUが約4%です。

f:id:optim-tech:20190313123144p:plain

これで少しはF値とIoUのイメージがつかめてきたのではないかと思います。ようやく次で「どちらを使う?」に決着です。

結局どちらを使えばいいの?

ここまででF値とIoUのイメージがなんとなくつかめたと思います。私は以下の基準で選択しています。

  • F値:検知したいものが検知されているかどうか評価したい場合
  • IoU:輪郭の漏れや若干のはみ出しを厳密に評価したい場合

今回のような穴あき検知では厳密性はそこまで重要ではないので、F値を選択するのがよさそうですね。

まとめ

  • Deep Learningによらず機械学習や統計の場面では混同行列を導出しましょう
  • プロジェクトの性質に応じてPrecisionとRecallを使い分けましょう
  • 厳密に評価したい場合はF値ではなく、IoUを選択しましょう

OPTiMでは農業医療に限らず、土木やサービス業など幅広くITを推進しているので、少子高齢化や人手不足をダイレクトに解決したいチャレンジャーなエンジニアのみなさんを募集しています!
また、一緒に皇居を走ったり、マラソン大会に参加してくれたりするマルチなエンジニアも募集しています!

*1:前職ではポスターを印刷するような大きなプリンターを設計・開発していました

*2:農業や医療については絶賛勉強中です

*3:後半で数式も出てきますが、分数の計算しかしていません

*4:作物を栽培する田畑のことを圃場といいます

*5:Deep Learningで学習したモデルを使用することです。

*6:精度評価の話をしているのにアバウトすぎる表現ですが、もう少し具体的に言うと一般人並みの能力です

*7:最終的な目的が除草剤散布の判断なので、おおよそ抜け漏れがなければ目的を達成できます

*8:TNは使わない場面が多いです。今日もここから先は登場しません。

*9:TPのx%はFPとFNが出るという解釈です

*10:ここまできたら高校数学の知識とかで頂点求められそうですね。ぜひ解いてみてください。