【DataRobot】画像からマスクを着けているかどうかを判定するAIをほぼ自動で作ってみる

# はじめに

こんにちは、[@yshr10ic](https://twitter.com/yshr_10ic)です。

[Qiita夏祭り](https://qiita.com/summer-festival)の「DataRobotテーマ」の投稿になります。
前回の記事では、DataRobotのトライアルの申し込みから、実際にサンプルデータを用いて回帰予測をさせるところまでを実施しました。

[【DataRobot】DataRobot AI Platformのトライアル申し込みから予測させるまで](https://qiita.com/yshr10ic/items/8f3062f84f10e2ab88ba)

DataRobot AI Platform トライアルでは、Visual AI（画像データ入力）によるモデリングも使えるとのことでしたので、今回はVisual AIにチャレンジしてみたいと思います！

# Visual AIで何を作るか？

普段は、やりたいことが先にあってそれを実現するためにどんな手段を使うか（機械学習、AIなど）という順番になりますが、今回はVisual AIを使うことが目的のため、何をやるかを決めなければいけません。（私はこの作業が非常に苦手です。）

特に何も思い浮かばなかったので、Qiitaで参考になりそうなものはないかなーと探してみました。「きのこの山」と「たけのこの里」を分類する、ポケモンの画像を使って何かしらの判定をする、などなど考えたのですが特にピンとくるものがありませんでした。

そんなときに、ふと数ヶ月前のお客さんとの話しを思い出しました。

> AIを使って、人がマスクを着けているかどうか簡単に判定できないか？

このお話しをしていたときは、画像ではなく動画でビルの入り口などにカメラを置いて、マスクの着用有無を判定したいという内容でした。（さらには検温もしたいとのことでしたが、今回は関係ありませんね。）

このお話しは最終的に流れてしまったのですが、人の写真からマスクを着けているかどうかを判定するAIをほとんど自動で作れたらすごいのでは？となりました。おそらく需要があるのは動画による判定でしょうが、DataRobotならそのうち動画にも対応してくれるでしょう笑

ということで、今回は**画像からマスクを着けているかどうかを判定するAI**を作ってみたいと思います！！！

# 画像準備

まずは画像を集めたいと思います。今回は下記のサイトからマスクをしている人とマスクをしていない人の画像を取得します。（なかなか良いサイトがなかったので、ちょっと古い感じのサイトになってしまいました笑）
このサイトとGoogle画像検索を用いて、30枚ずつ計60枚を用意しました。

[http://busitry-photo.info/](http://busitry-photo.info/)

<img width="983" alt="無料人物写真フリー素材の【ビジトリーフォト】商用利用OK.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530906/a153c695-e8ee-baf9-8188-02f2371ffca4.png">

# データセットの用意

[https://app2.datarobot.com/docs-jp/modeling/visual-ai/vai-model.html#データセットの準備](https://app2.datarobot.com/docs-jp/modeling/visual-ai/vai-model.html#データセットの準備)を参考にデータセットを準備していきます。

分類したいクラスごとにディレクトリを用意します。今回は`with-mask`と`without-mask`としました。

<img width="196" alt="ダウンロード.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530906/a2f90aa8-579e-1160-c6fe-84573bcf2f0e.png">

次にクラス名と画像のパスを格納したCSVを用意します。

<img width="365" alt="all_data_csv_—_mask.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530906/58e99a1e-179d-030a-2e5b-24c01c5dc1ba.png">

画像のディレクトリとCSVを合わせてzipファイルに固めます。

# AIを作ってみよう

[https://app2.datarobot.com/new](https://app2.datarobot.com/new)にアクセスし、真ん中にある「ローカルファイル」を選択します。

<img width="1439" alt="DataRobot.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530906/7978e184-87ad-0a41-e6ae-1667730a496e.png">

先ほど作成したzipファイルをアップロードしましょう。無事にアップロードできたようです。

<img width="1174" alt="DataRobot.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530906/e62f4e8c-937f-8123-e9ce-1b4c7df9667b.png">

予測対象を「Target」とすると、今回は「分類」が自動で選択されました。これで、モデルを作成してみましょう！

<img width="1112" alt="DataRobot.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530906/78da28e3-31b6-e909-d218-e99a53c9dd9e.png">

と思ったら、分類には100レコード必要みたいですね。。。画像を集めなおします。

<img width="608" alt="DataRobot.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530906/0ccf0e4b-6e79-5655-2ddf-1d8712493f5a.png">

レコード数が100件なので、２〜３分でモデリングが終わりました！今回作成されたのは５つのモデルで、上位モデルは非常にシンプルなモデルになっていますね！

<img width="1192" alt="DataRobot.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530906/39b91c90-ee92-ac5c-e0af-edb3df439e72.png">

今回のモデルのインサイトを確認したいと思います。「解釈」タブの「画像埋め込み」タブを選択すると、以下のようなマップが表示されます。これは、画像のサブセット間の視覚的な類似性を２次元に表示したものになります。これを見てみると、マスクありとマスクなしを以下のように分類できるそうだということが分かりますね。

<img width="1200" alt="DataRobot.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530906/aaf0859f-aca9-f9ca-1405-8643e40fd4df.png">

次に「アクティベーションマップ」タブを見てみましょう。アクティベーションマップでは、モデルの予測に対して重要と思われる領域を強調表示してくれます。こうして見てみると、人を認識しており、さらに何となくマスクの周りも強調しているように見えなくもないですね。

<img width="1188" alt="DataRobot.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530906/60be5186-6ad0-5bb0-e2ea-5eb6ef42c765.png">

# 予測

この上位モデルを使って、新しい画像に対して予測させたいと思います。
マスクと言ったら勝手に安倍首相が思い浮かんだので、安倍首相のマスクあり、マスクなし画像で試してみました。

学習のときと同様に画像とそのパスを指定したCSVファイルを用意します。予測対象のカラムは不要です。

<img width="481" alt="all_data_csv_—_prediction.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530906/cbc9005a-7c74-7aa1-3f0e-fa89f9a1f4cb.png">

「予測」タブから上で用意したzipファイルをアップロードし、予測を計算します。

<img width="1162" alt="DataRobot.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530906/b4f9d629-3238-f2a0-924d-077727218f8f.png">

結果をダウンロードしてみると、予測の確率とラベルが付与されたCSVファイルを取得することができます。`PredictedLabel`なのですが、こちらが何を表すのかDataRobotの画面から確認できませんでした。おそらくデータを入れた順番にカテゴリに連番を振っていると思うので、`0: マスクあり`が`1: マスクなし`だと思います。（つまり両方とも予測できている？）

`PredictedLabel`の確認方法をご存知の方がいらっしゃいましたら教えていただけると嬉しいです:bow_tone1:

<img width="360" alt="mask_zip_Elastic-Net_Classifier__L2___Binomial_Deviance___21__100_5effe7e54be69d002f44472f_19bd8b5f-42f0-49c9-9455-6_prediction_csv_—_prediction.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530906/d05be6c4-a039-e20f-0b4a-2830a177be93.png">

# まとめ

いかがだったでしょうか？今回はVisual AIを用いて画像からマスクを着けているかどうかを判定するAIを作ってみました。人が行う作業としては、画像とラベル付けしたCSVを用意するだけです。あとはDataRobotがよしなにAIを作ってくれるので、非常に便利だと感じました！

また、作成されたモデルのインサイトも簡単に確認できるのが嬉しいですね。AIが予測した結果の判断の根拠はなんなのか？というのは良く議論に上がることなので、こちらをノーコードで確認できるのはすごいと思います。ただ学習に使用した画像に対するインサイトは確認できたのですが、予測に使用した画像に対するインサイトを確認できないのは少し残念でした。（もしかしたらできるのかもしれませんが、どこでできるのか分かりませんでした。）

ちなみに判断の根拠に関する記事は、以下が参考になるかと思います。

- [ディープラーニングの判断根拠を理解する手法](https://qiita.com/icoxfog417/items/8689f943fd1225e24358)
- [【論文読み】深層距離学習でGrad-CAM](https://qiita.com/shinmura0/items/ba45b7b9da02a44ed1b1)

今回の記事は以上となります。最後まで読んでいただき、ありがとうございました！
参考になった！という方はLGTMをしていただけると励みになりますので、よろしくお願いいたします！