こちらはエムスリー Advent Calendar 2024 4日目の記事です。
こんにちは、最近ニューラルネットの可視化についての論文を読んだAI・機械学習チーム(AIチーム)の農見(@rookzeno)です。ニューラルネットの可視化で有名なものといえばGrad-CAMだと思いますが、僕が読んだ論文ではstructured attention graphs (SAGs)という可視化の手法を使ってました。これは平たく言えばニューラルネットが予測できる画像の最小限の部位はどれかを出すものです。
この方法の良さとしては、複数の注目部位が得られること、ニューラルネットの予測精度と直接相関した注目部位が得られることの2点です。この部分の画像さえあれば精度が出るというものが得られるのは面白いと思いました。ただ、これってGrad-CAMで注目されている部分をぼかしてもう1回Grad-CAMしてみれば同じように複数の注目部位が得られていい感じにできないかと思ったので検証していきたいと思います。
やってみた
先ほどSAGsで使用したペルシャ猫の画像をResnet50で画像認識した結果をGrad-CAMにかけてみます。
もちろん加工前なので、確率99.8%でペルシャ猫と判定されました。ここからどこをぼかすかなのですが、赤い部分(200/255以上)をぼかそうと思います。ぼかしは以下のコードで入れました。軽くぼかすだけだと注目部位があまり変わらなかったので強めにぼかすようにしました。
img = img.resize(224, 224) # 強めのぼかしをしている blur_img = img.resize((15, 15)).resize(img_224.size, Image.BILINEAR) img_numpy = np.array(img_224) blur_img_numpy = np.array(blur_img) img_numpy[grayscale_cam*255 > 200] = blur_img_numpy[grayscale_cam*255 > 200] img = Image.fromarray(img_numpy)
そうすると、鼻と口がぼけた画像ができました。この画像を再度Grad-CAMしてみましょう。
強めにぼかしたんですが、ぼかした部分にもかなり注目が集まってしまいました。ぼかした部位からでも情報を取ろうとしてるのか、顔の輪郭があるから中心を見ようとするのか。それは置いておくとして、ぼかした部分を除いて考えるとモザイクありの場合はより広範囲に注目していることが分かります。ぼかした部分を除いて赤い部分を抜き出してみると
最初は鼻と口に注目していたのが、次は目にも注目し始めていい感じです。もう1ループやってみましょう。
いい感じに次の注目部位ができましたが、予測確率が大きく下がってしまいました。他の予測としては、トラネコとポメラニアンが候補に上がってきました。トラネコは猫なのでわかるんですが、ポメラニアンは毛並みかな? 注目部位をぼかしてしまうとダメみたいです。ということでここでストップします。今回赤い部分に着目すると3つの注目マップが得られました。
これ最初の1枚だけで把握できることからあんまり内容増えてないな、、、予測が難しくなる3回目の時はいろんな部分に注目し始めるということが分かりました。最後に注目部分だけで予測すると、どうなるか見てみましょう。
最後のはそれなりに予測精度もあっていい感じな注目部位が得られてそうです。ただ、結局1枚しか予測精度の良い画像は得られてないので、ループしなくても最初のGrad-CAMの閾値調整するだけで十分と言われればそうかもしれないですが、、、
最後にSAGsで得られた画像と並べてみましょう。よくよくみるとSAGsは注目部位がぼやけてることに気づいたので、注目部位も少しぼかしてみました。周りがぼけてるので注目部位もぼかしたら違和感が減るのか精度がかなり上昇しました。
そうすると新たなニューラルネットが予測できる画像の最小限の部位が得られました。パチパチ
で終わりたいところですが、まあこうなったのはたまたまです。別のぼかし方を試してみましょう。
# 先ほどのより強めのぼかし Kernelsize = 51 SigmaX = 50 img = cv2.GaussianBlur(img, (Kernelsize, Kernelsize), SigmaX)
先ほどよりぼかしが強くなったので、ぼかした部分には注目が集まらなくなりました。こちらも3回やってみたのですが、注目された部位だけで推論しても26.7%とそんなに高くはなりませんでした。まあそもそもニューラルネットが予測できる画像の最小限の部位を作ろうとはしてないので、おかしいわけではないです。むしろ一度、作れたということがGrad-CAMの有用性を表しているのかもしれません。
ぼかすではなく黒塗りして消す
黒塗りして消すやり方でもSAGsは作れるので試してみました。
黒塗りした時とぼかしでやった時のSAGsが結構違って面白いです。注目部位に関しては強めのぼかしをした時と同様に黒塗りした部分は注目されないようになってました。肝心の注目された部位だけで推論した結果ですが、ちょっと形に引っ張られすぎてダメでした。SAGsが穴あきなのは形を作ってしまうと、違うものに推論されてしまうからかも知れないです。今回、黒塗り3の推論は凧の確率が47%でした。確かに形的にはそれっぽいですね。
結論
Grad-CAMで注目されている部位をぼかすことで、有用な注目部位を得られることもあって面白い。
We're hiring!
色々試してみる好奇心の強い方をAI・機械学習チームでは募集しています。興味を持った方は、次のリンクからご応募お待ちしています! インターンも通年募集中です!