概要
私事で恐縮ながら、社会人になって一人暮らしを始めました。
今住んでいるのは都心の近くなのですが、実家は郊外なので、それぞれの景観は異なってきます。路地を歩いているとなんとなく街並みが○○区っぽいな、とか、ここは○○市らしいなとか、感じたことがある方も多いと思います。
とはいえ、その差は結構微々たるもので、その市区町村にあるな”雰囲気”の差のようなものがある気がします。
今回は東京都の町田市と中央区の画像を教師あり学習で識別モデルを学習し、GradCAMを用いて判断根拠が何なのか確認してみます。
モデルには定番のResNetを用います。
実装や詳細は下記のサイト(M3 Tech Blog様)を参考にさせていただきました。
機械学習で逆ストリートビューを作り、写真から港区らしさを判定する
ご指摘・疑問などございましたらコメントよろしくお願いいたします。
学習
上記のようなモデルを考えます。
都市の景観画像データセットを用意し、ResNetに学習させます。
識別はパターンで、東京都町田市のものと、東京都中央区のものを用意します。
パラメータ・詳細は下記のとおりです。
・学習率:1e-4
・バッチサイズ:10
・データ総数:約4,000[枚]
・フレームワーク:PyTorch
学習の定量的評価は行いませんでしたが、町田市と中央区は人間の目で見ても景観の乖離が大きいので単純なタスクかと思います。そのためvalidation dataに対する正解率は98%を超えていました。
学習データの収集
今回最も面倒だったのがデータの収集です。数千枚の景観データを手作業で収集するのは現実的ではないため、Googleのstreetview APIを使用しました。
https://developers.google.com/maps/documentation/streetview/overview
locationに位置座標、sizeに取得したい画像サイズを指定することで簡単に景観画像を取得可能です。
ご注意いただきたいのが、一回叩くごとに0.007USD請求されます。(上記サイト参照)
私はあまりに気にせず叩きまくった結果、1万円を軽く超える請求が来たため、慎重なご利用をお勧めします。(Google Cloud Platformの無料利用枠対象内でしたので実質無料でしたが、、)
また、折角お金をかけて叩いたのに、取得できないケースがあります(取得画像に”sorry we have no image here”と表示される)
データセットに悪影響を及ぼすため、こうした画像は排除することをお勧めします。
GradCAM
大変わかりやすい記事がQiitaにも多くありますので詳細は割愛しますが、平たく言うと識別モデルの判断根拠を出力する手法です。
https://qiita.com/kinziro/items/69f996065b4a658c42e8
下記の画像の例では、"cat"の判断根拠をヒートマップ画像で可視化しています。
猫の下半身周辺にモデルが注目し、"cat"と識別していることがわかります。
上記画像は下記論文から確認できます。
Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization
結果
東京都町田市の画像をランダムに抜き出し、”町田市”と判別された画像の根拠をGradCAMにより可視化しました。
ResNet的には緑の多い畑周辺に注目していることがわかりますね。
反対にアスファルトで舗装された道や、空には注目していません。中央区にも共通して確認できる特徴だからでしょうか。
中央区も同様にトライしてみました。
少し偏りがありますが、高層ビル周辺に注目しているようです。
道路や空には目もくれていません。
考察・おわりに
今回はResNetに都市画像を学習させ、GradCAMで判断根拠を可視化しました。
町田市→緑、中央区→ビル群に着目していることがわかりました。うまくいくかわからなかったので単純なタスクを設定しましたが、今後はもう少し差がない区や市でも判別が可能か、そして判断根拠はどこなのかやってみようと思います。
最後までご覧いただきありがとうございました。