Python
スクレイピング
画像認識
可視化
深層学習

CNNは「iPhone」と「Android」をどのように見分けるか?

このスマホ、「iPhone」と「Android」のどちらかわかる?

ニューラルネットワーク(Convolutional Neural Network: CNN)に「iPhone」と「Android」の画像を学習させ二値分類させます。その後、Grad-CAMを使って、識別上重要とされた箇所をヒートマップで可視化するというやつです。CNNはどこを見てスマホを識別するのでしょうか?

当初、CNNが識別の特徴として注目するだろうと予測していた画像領域は、

  • 「iPhone」→ 背面のリンゴマーク・正面のホームボタン・正面のインカメ周りの構造・側面の物理ボタン など
  • 「Android」→ いろいろバリエーションあるのでよくわかんない。よくわかんないけど、「iPhoneではないやつ」みたいな特徴?

多分人間もこの辺を見て判断してますよね?
ニューラルネットワーク的にはどうなのかを確かめてみます。

画像の収集

まずは学習に使う「iPhone」と「Android」画像の収集からです。スマホの画像ならネットにたくさん落ちてるだろうなーということで画像検索エンジンから取ってくることにしました。

画像収集するスクレイパーを作っても良かったのですが、できるだけ楽をしたいので今回は有料のAPIをつかって収集することにします(ただし、初回無料クーポンでまかなえたのでほぼ0円でした)。

検索APIの候補は google,、yahoo、bing(マイクロソフトの検索エンジン)です。全部試してみたのですが、唯一まともに使えそうなのがbingだけでした。APIを使った画像収集の詳細は以下にまとめました。

こうして、画像を収集・目検でゴミ画像を削除し、最終的にはiPhone 508枚、Android 503枚の画像をゲットしました。

集めた画像の雰囲気としてはこんな感じです。
iPhone↓
iphones.PNG
Android↓
androids.PNG

CNNで学習

収集した画像のうち、500枚を以下の分割で使用しました。

用途 iPhone Android
学習用 300 300
検証用 100 100
評価用 100 100

画像分類モデルは、CNNで構築しました。Kerasを使って実装しています。

CNNのネットワーク構造は、サイズ 3×3 のフィルタによる畳み込み層を4層積んでいます。活性化関数にはReLUを用いました。最初の2層はプーリングを介さずに積んでいます。3層目と4層目については、それぞれのReLU出力の直後にサイズ 2×2 のプーリング層を積んでいます。

バッチサイズ15、エポック数300で学習を行った結果、評価用データで正解率80%の分類モデルが得られました。

分類結果を混同行列で表すと下表のようになります。

正解\推論 iPhone Android
iPhone 79 21
Android 20 80

クラスごとに横に足した数字が正解画像の枚数です。本当は“iPhone"なのに間違って“Android"と判定された画像が21枚、“Android"なのに“iPhone"と判定された画像が20枚あった、という見方です。

画像の前処理やパラメータチューイングをしていないので、そこまで良い精度ではないのですが、今回は識別領域を確かめたいだけなので、一旦ラフに学習させてそれで良しとしています。

可視化結果

CNNがスマートフォンのどこに着目し分類を行ったのかをGrad-CAMで可視化&解釈してみます。

赤い領域ほど、特定のクラスを分類するためにCNNが重要だと判断した領域となります。
その赤い領域の内、さらに詳細な箇所がGuided Grad-CAMによって可視化されます。

iphone_iphone.png

and_and.png

iph_and.png

and_iphone.png

感想

この分類を実際に行う前の予想では、上記にも書いたように、iPhoneであることを識別するための特徴は「背面のアップルマーク」「正面のホームボタン」「インカメラ周辺の構造」「側面のボタン類」などの「スマホの外見的形状」がGrad-CAMによって可視化されると想定していました。

しかし、実際にCNNがiPhoneとAndroidを識別するために着目した特徴は、まず「アプリアイコン」であり、その次に「スマホの外見的形状」だという結果(のように見える)となりました。

改めて考えると、たしかに「アプリアイコン」はiPhoneとAndroidで共通して存在する特徴であり、かつ、両者をユニークに識別するのに十分差がある特徴だと思えます。(ぐぅ賢い…)

(※上記のネットワークと学習量ではこの結果でしたが、異なる条件で学習させればまた違う箇所に注目して判断を行う可能性もあると思います)

以前「フォントを識別するロボット」を作って展示したときも、ロボットがフォントを識別している様子を見たデザイナーさんから
『自分がフォントを識別するときはCNNが注目している箇所とは違うところを見ている』
『人間と違う場所に注目しているのに、判断結果が同じというのは面白い』
みたいなコメントをもらいました。

(CNNがフォントのどの箇所に注目して識別しているか可視化した内容はこちら)
- CNNは絵札のどの部分に注目してフォントを見分けているか

AlphaGoの話もそうですが、人間はまだまだ機械に教わる(人間とは異なるモノの見方を教えてくれる)チャンスがたくさんあるなーと思いました。