AIでチップとデールを見分ける

:::note
この記事は元々**2020年12月12日**に個人ブログで公開された内容をQiitaに移行したものです。
:::

:::note
この記事は [ディズニー関連ブログ Advent Calendar 2020](https://adventar.org/calendars/5478) の参加記事です。

※ 本記事はディズニー系アドベントカレンダー向けに書かれたため、ディズニー好きの方でも楽しく読めるよう工夫しています。技術的にはちょっと「ゆるめ」の内容になっていますので、あらかじめご了承ください。
:::

こんにちは。
せっかくディズニー関連のアドベントカレンダーに参加するので、本日は可愛いキャラクターたちを紹介する癒し記事を書きたいと思います。


本日題材にするのは、みんな大好きシマリスの兄弟、チップとデールです。

![Em1X_AFVoAEjZqK.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981597/f408511e-c35b-4c2d-948c-8d995f34044c.jpeg)

## チップとデールの見分け方

実はお恥ずかしいことに、最近までどっちがチップでどっちがデールなのか分かっていませんでした...。

小学３年生のときに雑誌で見分け方を読んでえらく感心した記憶はあるのですが、それっきりだったのです。

しかし最近、知り合いから  **「チョコチップと鼻血デール」**  という覚え方を教わりました。
鼻の色が黒い方が「チョコチップ」、赤い方は「鼻血デール」ってことらしいです。

鼻の色以外にも、パッと見た感じだと目や前歯に違いがありそうです。

![Em1X_AFVoAEjZqK-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981597/4966c853-8507-437a-a2b9-b81c881c5e03.jpeg)


## CNNとは？

さて、タイトルにもある通り、本日は「ディープラーニング」と呼ばれる大人気なAI技術を使って、このシマリスくんたちの顔の違いをコンピューターに自動で学習してもらおうと思います。

今回は画像認識に特化した「CNN（Convolutional Neural Networks）」という技術を使います。ニュースサイトのCNNとは全然関係ないですよ。

今年何かと話題になった、人の顔を別人に変換する「ディープフェイク」とかも、実はこのCNNが応用された技術なのです。

## ざっくりした学習の流れ

やってることは超シンプルです。

まず [Google画像検索](https://www.google.co.jp/imghp) を使ってチップとデールの顔写真を各100枚くらい集めて、各写真に「チップ(0)」または「デール(1)」のラベルをつけます。  
そしてそれらの画像をCNNにブチ込みます。そうするとCNNが10分くらい掛けて、勝手にチップとデールの顔の違いを学習してくれるのです。

![workflow-731x1024-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981597/c02f2b10-fe4c-47a6-8a2a-4f84a07915bc.jpeg)

:::note
### 著作権は大丈夫？
ネットから画像を集めているので、「おいおい、著作権大丈夫か？」と気になった方もいらっしゃるかもしれません。  
結論から言うと、今回みたいなAI技術などの学習は「著作権法三十条の四」が適用されるのでOKです。
学習に使うのは良いけど、その画像をブログなどで公開するのはアウトってことです。  
念のため言っておきますが、当記事に貼っているチップとデールの画像は全てSNSで許可を得て頂いたものです。
:::

## ちゃんと見分けられるかテスト

ある程度学習したところで、CNNがちゃんとシマリス兄弟を見分けられるのかテストしてみましょう。

今回僕が組んだCNNモデルは、画像を入力すると「チップである確率」と「デールである確率」の両方を計算してくれる構成になっています。

![Wdz6q7jF-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981597/9c46ad74-122d-4951-96d8-6e9f2728c193.jpeg)


この例だと（チップである確率）＞（デールである確率）なので「チップ」という判定になります。

テスト用の画像として、先日Twitterで心優しき方々から頂いた画像（チップ10枚、デール10枚）を使わせていただきます。

### チップの見分けテスト

![chips-1024x475-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981597/af93e82f-5913-415e-b536-a4ecda187433.jpeg)


正解したのは8/10でした。まずまずですね。

見て分かる通り、顔が極端に横を向いていたり斜めになっていると判別がうまくいかなくなっています。  
学習に使ったデータは全て正面を向いたものだったので、正面顔じゃないと上手くいかないのは仕方がないのかもしれません。

### デールの見分けテスト

![dale-1024x475-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981597/2e99e469-e343-4889-8199-b85dd9a43651.jpeg)


正解したのは9/10。

唯一間違えた写真では、顔に何か手すり的なものが被っちゃってるせいで上手くいかなかったのだと考えられます。

## AIはどこを見て判別しているのか？

「Grad-CAM」という技術を適用すると、CNNが画像のどこを見てチップとデールを判断したのか可視化することができます。

先ほどの画像で何枚かやってみましょう。

![gradcam-1024x825-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981597/ec3734e1-1979-4d3b-a2fb-fc9f1826c691.jpeg)


色が明るくなっている箇所が、CNNが見ている所です。

これ面白いのが、チップとデールでは見ている場所に違いがあるんですね。

- チップは鼻の色に注目  
- デールは目元に注目  
- 両方に共通してまぶたと眉毛に注目  

目元と眉毛に違いあるのでしょうか？全然わからない...。  
（眉毛とまぶたの区別がついてない可能性もあります。）

## オチ：野生のシマリス

![munk-1024x252-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981597/1abae87d-809c-4390-a551-ec053cfb5181.jpeg)


野生のシマリスはだいたいデールらしいです。

## おわりに

CNNを使ってチップとデールを識別するモデルを作りました。

最近のパソコンは処理性能が高いので、こういう技術でも手軽に試せますし、楽しいのでオススメです。

チップとデールの識別ぐらいだとCNNの凄さはそこまで実感できませんが、他にも

- 画像から隠れミッキーを自動で見つける  
- ミッキーの旧フェイスを新フェイスに変換する  
- 風景写真をイマジニアのコンセプトアート風に変換する  

など、様々なことが可能です。  
暇な時にまた遊んでみたいと思います。  
というかブログ分けた方が良いかも…

## 謝辞

ディズニー好きを公言していながら、お恥ずかしいことにチップとデールの画像を一枚も持っていませんでした。

よって、当記事に掲載しているチップとデールの画像は全てTwitterの方で以下の方々から提供して頂いたものです。

- [うぉるぱ様](https://twitter.com/waltorangejuice)  
- [海鈴様](https://twitter.com/marin_moving_on)  
- [Yukkey様](https://twitter.com/Yukkey4D)  
- [Killua様](https://twitter.com/punkillua)  
- [mana様](https://twitter.com/chottomaihama)  
- [ビコ様](https://twitter.com/biko0402)

ありがとうございました！

## ソースコード

念のため今回使ったソースコード共有しておきます。

https://github.com/ShimeiYago/ChipnDale