「画像分類」アルゴリズムにおける検証方法の紹介(Grad-CAM)

2018.09.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

概要

こんにちは、yoshimです。
「画像分類」をする際の検証手法の1つである「Grad-CAM」についてご紹介します。
これは、「画像分類」をした際に「画像のどの部分に注目して分類したのか」といったことを確認する手法です。

「Grad-CAM」自体の紹介については、既に色々なブログがあるので、今回は実際に「ネジ画像の分類」に適用してみた結果をご紹介しようと思います。

目次

1.Grad-CAMとは

「Grad-CAM」については、既に紹介ブログが多々存在するので、本エントリーでは概要だけ簡単にご紹介します。
「Grad-CAM」は「画像分類した際に、分類結果に寄与する画像中の箇所」がわかる手法です。

実際のpaperに紹介されている事例を下記に記載します。

例えば下記のような画像を分類して「犬が写っている」と結果が取得できた場合に、「猫も写っているのだが、画像のどの部分に着目してそのような結果になったのか」といったことが気になるかと思います。

そのような時に上記の画像を「Grad-CAM」で確認すると、下記のような結果が取得できます。

これは画像中の赤くなっている部分に特に注目して分類した、ということを意味しています。
つまり、ちゃんと画像中の犬の部分を見た上で「この画像は犬である」と判断していることがわかります。

従来、ニューラルネットワークベースだとどうしても処理の中身がブラックボックスと言われていたのですが、「Grad-CAM」を使うと処理の中身を少しだけ理解しやすくなります。
今回、偶然この手法を知ったので先日から実施していた「ネジ画像の分類」に適用してみようと思います。  

2.検証の前提条件

●2-1.SageMaker上で「ネジ画像の分類」を実施する。

ネジは「なべネジ」、「蝶ネジ」、「皿ネジ」の3種類。

●2-2.ビルトインアルゴリズムではなく、自作のモデルに適用する

本当はビルトインアルゴリズムに適用したかったのですが、やり方がわかりませんでした。
なので、今回はビルトインアルゴリズムと同じモデル(ResNet-50)を同一ハイパーパラメータで学習させ、その結果で確認してみました。

●2-3.学習、Grad-CAM確認に利用する画像

モデルの学習に利用するデータは全て「背景が同じ」画像のみを利用し、「Grad-CAM」確認時には学習に利用した画像+「背景が異なる」画像を利用します。
具体的には、学習時には下記のような画像のみ(背景が白色)を利用し、「Grad-CAM」確認時には「Grad-CAM確認用」にあるような「背景がバラバラ」な画像を追加します。

・学習用(背景が全て白色)

こんなのとか

こんなの

・Grad-CAM確認用

背景が黄色だったり

ティッシュ箱の上に乗せていたり

2-4.Grad-CAM生成

こちらのブログこちらのGitを参考に、一部修正して利用しました。

3.やってみた

モデルの学習が終わり、早速Grad-CAMを確認してみようと思います。
まずは、学習に利用した「背景が白色」の画像で確認し、その後に「背景がバラバラな画像」で確認しようと思います。

3-1.背景が白色の画像で確認

まず、学習に利用した「背景が白色」の画像で「Grad-CAM」を確認してみます。

・オリジナル

・Grad-CAM

赤色の部分が特に着目している箇所です。
しっかりネジの部分に着目しているみたいです。
また、この画像は正しく分類できており、確率も99%以上だったので、一見問題なさそうです。
続いて、こちらの画像でも試してみました。

こちらの画像も99%以上の精度で正しく分類できており、下記の通りちゃんとネジの部分に着目して分類してくれているようです。

3-2.背景がバラバラな画像で確認

続いて、背景がバラバラな画像で確認してみます。

この画像はティッシュ箱の上に乗せたネジの画像なのですが、こちらの画像は誤分類していました。
「Grad-CAM」を見てみると、ネジではなく「ティッシュ箱」の方に着目してしまっているので、これでは誤分類してしまうのも納得です。

もう一枚確認してみます。
こちらの画像も誤分類してしまっているのですが...

下記の通り、やはりネジとは異なる箇所に着目していました...。

最後に、「背景がバラバラな画像」でも正しく分類できている画像についても1枚だけ確認してみます。

こちらは背景が緑色になっているといった点で学習に利用したデータとは異なるのですが、正しく分類されていました。
「Grad-CAM」を確認してみると、ネジの部分に着目しているみたいです。

今回ご紹介する画像は以上になりますが、「ティッシュ箱の上にネジが乗っている画像」等の「背景がごちゃごちゃしている画像」についてはいずれも「ネジに着目していない」状態でした。
一方、背景色が単色な場合はネジの部分に着目して分類しているようでした。

4.まとめ

今回は画像分類をする際の検証手法の1つである「Grad-CAM」について、実際に適用してみました。
特に「誤分類した画像」についての「Grad-CAM」から「誤分類している画像は、背景に着目してしまっている」ことがわかりました。

この結果から、今後精度を向上するためには、「背景に多様性を持たせた画像」のレパートリーをもう少し増やした方がいいのではないか、と考えられます。
(背景に引っ張られて、着目するべきネジの部分を捉えられていないため)

ハイパーパラメータを調整することで多少なりとも改善できるとも思うのですが、パラメータの調整をある程度した後に「Grad-CAM」で誤分類した画像はどこを着目して分類してしまっているのか、といった点を確認し、そのような画像データセットを補填するやり方も有用だと思います。
(手間はかかりますが...)
特に今回の場合は「ティッシュ箱の上にネジが乗っている画像」は枚数が少なく、パラメータ調整だけだと辛そうなので、早めに「そのような画像が不足しているかもしれない」といったことがわかったので有用でした。

5.引用

Grad-CAMのpaper
kerasでGrad-CAM 自分で作ったモデルで
grad-cam.py