Grad-CAM、Grad-CAM++、Score-CAMを実装・比較してみた



あけましておめでとうございます。←

2020も頑張りましょう。

今回は表題の通り、画像系深層学習の判断根拠手法について、

近年人気のある手法「Grad-CAM」と、

その改良版「Grad-CAM++」、さらに去年論文発表されたばかりの「Score-CAM」を、

TensorFlow/Kerasで実装・比較してみます。

データセットはKaggleのデータセットを使い、カーネルノートブックのGPUを使って深層学習させましたので、

全コードはそちらを参照ください。

https://www.kaggle.com/itoeiji/visual-explanations-gradcam-gradcam-scorecam

一応ノートブックをアウトプットしてGitにも同じものをあげています。

https://github.com/Gin04gh/datascience/blob/master/kaggle_dataset_intel_image_classification/visual-explanations-gradcam-gradcam-scorecam.ipynb

判断根拠の可視化について

深層学習は、特に画像認識分野で優れたパフォーマンスを実現する可能性があります。

しかし、それらは直感的でなく、理解可能なコンポーネントへの分解も難しいため、解釈可能性が低くなりがちです。

そのため、近年では、深層学習モデルが、画像のどこにフォーカスして予測をしたのかといった、判断根拠を視覚化する方法が研究されています。

以下は、最近人気のあるGrad-CAMの視覚化の例です。(Grad-CAM論文抜粋)

判断根拠の可視化のメリットは主に2つあります。

1つは、先のような解釈可能性の低さを改善し、モデルの透明性を向上できることです。

これにより、モデルの予測ロジックを言語化でき、妥当性を評価できるため、実社会の特に責任の伴う場面に適用しやすくなる可能性があります。

もう1つは、学習データのバイアスに気づくことができることです。

上記の視覚化例は論文から抜粋したもので、「ドクター」と「ナース」を分類するモデルの可視化例ですが、

真ん中列は、学習データに、「ドクター」は男性、「ナース」は女性として、バイアスがかかったデータを学習させてしまっていたために、

人の顔や髪の部分を見て、どちらも「ナース」と予測してしまっている例です。

これを性別のバイアスを学習データから取り除いた結果、人が持っている医療器具を注視するようなった(右列)という例になります。

データセット・モデルアーキテクチャ

では、実装例を見ていきます。

実装のために、画像分類用のデータセットとして、以下のデータセットを利用します。

Intel Image Classification: https://www.kaggle.com/puneet6060/intel-image-classification

下記6クラスにラベル付されている画像データセットです。

  • 建物(buildings)
  • 森(forest)
  • 雪山(glacier)
  • 山(mountain)
  • 海(sea)
  • ストリート(street)

以下のように、各クラスについて、枚数、比率、サンプル画像を何枚か表示してみました。

いずれも同じくらいの比率で、2,000枚ほど格納されているようです。

この時点で、gracierとmountainは分類が難しそうなのがわかります。

枚数も少なめなので、モデルのアーキテクチャは、学習済みResNet50のファインチューニングでモデルを作ってみます。

学習はオーグメンテーションを行うようにイテレータを作成しました。

こちらで学習をさせてみたところ、以下のように90%ほどの精度となりました。

やはりglacierとmountainは間違えやすい傾向にありそうです。

Grad-CAM

さて、それぞれの可視化手法を実装し、試してみます。

まずはGrad-CAMです。

論文は以下。

Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization: https://arxiv.org/abs/1610.02391

Grad-CAMは2016年に発表されましたが、その少し前に発表されたCAM(Class Activation Mapping)の拡張として発表されました。

他のCAM手法と比較がわかりやすくなるように、数式をこちらで少し変えて表現してみました。

CAMは、一般的な畳み込み層に、Global Average Poolingをかけて学習させた時の特徴マップの出力は、重みがクラス分類の重要度を特徴マップ上で考えられるという考えから提案されています。

ランプ関数はクラスに対するマイナスの勾配は無視するためです。

つまり、このままだとモデルとして、Global Average Poolingが必要になるのですが、それを勾配で代用できることを示し、どんなモデルアーキテクチャにも、CAMのような可視化が可能だとしたのがGrad-CAMになります。

実は上記モデル実装部分で、Global Average Pooling層を追加しましたが、多分これはなくても大丈夫だと思います。

実装は以下のようになります。

Grad-CAM++

Grad-CAM++は、2017年に、Grad-CAMの改良版として発表されました。

Grad-CAM++: Improved Visual Explanations for Deep Convolutional Networks: https://arxiv.org/abs/1710.11063

こちらは、特徴マップにかかる重みみたいなものがあったとしたら、それはどう表現されるかを、これまでの論文で出てきた数式からガリガリと紐解いていて、以下のように表現しています。

特に特徴量マップの中でクラス予測に影響を与えるが、その大きさが大きくなかったものは、これまで取れていなかったが、これにより捉えるようになった特徴などあります。

こちらを実装すると、以下のようになります。

Score-CAM

Score-CAMは昨年2019年10月に発表された新しい手法です。

Score-CAM: Improved Visual Explanations Via Score-Weighted Class Activation Mapping: https://arxiv.org/abs/1910.01279

勾配での表現は、時々入力層のわずかな小さな変化に対しても、過剰に大きな値を返してしまう問題があります。

これは、Grad-CAMやGrad-CAM++においても指摘されていたことでした。

そこで、この論文では、特徴量ヒートマップを勾配を使わないで作成する方法を提案しています。

Iはインプット画像で、特徴量マップ*画像のスコアを表現するような形をしています。

これを実装すると、以下のようになります。

結果の比較

各可視化の実装ができましたので、各クラスの判断根拠の可視化を比較してみます。

  • 建物(buildings)

モデルは建物の全体部分に注目しているような可視化結果が得られました。

Grad-CAM++とScore-CAMの方が、Grad-CAMよりも、より建物の全体を見ているような結果となりました。

Grad-CAM++とScore-CAMはそれほど大きな違いはないように見えます。

  • 森(forest)

個人的には、木の幹の部分を見つけて、森と予測しているように見えます。

特に、Grad-CAM++とScore-CAMの方が、Grad-CAMよりも顕著にその特徴を捉えているように見えます。

  • 雪山(glacier)

山の形を見ている?ような結果となりました。

これに関しては、いずれの可視化手法も大きな違いはなさそうに見えます。

  • 山(mountain)

こちらも山の形を見ているような、雪山と同じような結果となりました。

山の画像にも、上記例の1列目の画像や最後の列の画像は、色的にも雪山の方が正しいような気もするし、判断に迷います。

そのくらい、差別化できるような画像要素を見つけられていないように思います。

またこちらも、いずれの可視化手法も大きな違いはなさそうです。

  • 海(sea)

こちらは、海の表面や水平線を見ているような可視化結果となりました。

Grad-CAM++とScore-CAMの方が、Grad-CAMよりもより海全体を捉えているように見えます。

  • ストリート(street)

モデルは、路面およびその両側に建つ建物について見ているような結果となりました。

こちらも、Grad-CAM++とScore-CAMの方が、より全体を捉えているように見えます。

まとめ

以上、KerasでGrad-CAM、Grad-CAM++、Score-CAMの実装および結果の比較をしてみました。

Grad-CAMは、クラス予測に関連のある部分のごく一部にしか反応できていなかったように見えますが、Grad-CAM++とScore-CAMの方が、より関連のある部分全体を可視化してくれていたように見えました。

また、Grad-CAM++とScore-CAMには、可視化にはそれほど大きな違いはないようです。

また、それぞれの手法の実行時間は、新しくなるにつれて時間がかかります。(Grad-CAM < Grad-CAM++ < Score-CAM)

Grad-CAM++は、Grad-CAMよりも微分計算などが加えられて、当然実行時間は長くなります。

また、Score-CAMはマスク画像を複数枚推論する必要があるため、実行時間がかかっているように思います。

あまり時間を気にしないなら、個人的には、Grad-CAM++かScore-CAMがおすすめなのかなと思いました。



“Grad-CAM、Grad-CAM++、Score-CAMを実装・比較してみた” への 0 件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です