理系大学生が徹底解説! Gravioを使って「俺か、俺以外か」を自動で判断・可視化するAIシステムを構築

このエントリーをはてなブックマークに追加

Ledge.ai編集部でインターンをしている大学4年生の川口です。大学では情報工学を専攻しています。

突然ですが、みなさんは、自分で画像推論ができるAIシステムを作りたいと思ったことはありませんか?

画像推論とは、AIに画像を学習させることで、新しい画像がどの画像と近いかを推論できる仕組みのことです。

たとえば「犬」と「猫」の写真をあらかじめAIに学習させておくことで、写真に映っているのが「犬なのか」「猫なのか」「どちらでもないのか」を識別できます。画像推論は、「顔認証」によるスマートフォンのロック解除や、自動運転技術で信号機・標識の検出などに活用されており、身近な技術になりつつあります。

「AIを作るなんて大変そう」「自分で作ってうまくいくの?」と考える人も多いと思います。僕自身、この記事を書く前まではそう思っていました。

しかし、アステリア株式会社が提供するAI搭載IoT総合エッジウェア「Gravio(グラヴィオ)」を使うと、推論モデルをGravioに取り込んで、誰でもかんたんにAIシステムを作れるんです! 難しいプログラミングなど一切なく、ノーコードで作成できるため、特別な知識は必要ありません。

では、実際にAIを作ることから始めていきましょう!

ちなみに今回の記事は、Gravioを活用してAIシステムを構築する「新Gravioを使ってみた」シリーズの第3弾で、第1弾、第2弾は「TensorFlow Hub」に公開されている推論モデルを利用したものです。こちらもぜひチェックしてください! 👇

新GravioはAI画像推論機能がすごい!ワイン大好きライターが「ワインラベルを自動で読み取るAIシステム」を作ってみた

プログラム未経験の大学生でも旅行写真認識AIを構築できた!写真に映っている名所旧跡の名前をLINEに通知するシステムも作ってみた



Gravio画像認識サービスについての調査資料


AIに学習させる「教師データ」の顔写真を用意する

教師データの顔写真「俺」の教師データをAIに学習させました

まずは、AIに学習させるための「教師データ」を用意します。

今回は「俺」の教師データとして、あらかじめ僕の顔写真を「Ledge.ai」編集部の人に撮影してもらいました。

真正面だけでなく、少しずつ角度を変えて斜め横から撮ったり、マジメな顔や笑った顔、背景を変えたり照明を変えたり、バリエーションに富んだ環境で撮影した僕の顔写真を20枚ほど用意しました。

教師データの顔写真「俺以外」の教師データ

次に、「俺以外」の教師データを用意します。属性は「俺」本人と近いほうがいいので、「俺以外」の教師データの写真も、属性は「男性」「20〜30代」「アジア系」となるようにします。

レッジの社員や関係者の男性20人に協力してもらい、それぞれ10枚ずつ(顔の向きや背景を変えたもの)用意しました(協力してくださったみなさん、どうもありがとうございました!)。

GoogleのVision AIでAIを作成

GoogleのVision AI

それでは、AIを作成する作業をしていきましょう。

今回は、Googleが提供している「Vision AI」という、画像推論モデルが作成できる機械学習サービスを利用します。ちなみに、このVision AIもノーコードツールなので、コードを書くことなくAIが作成できるのです。

「Vision AIを無料で試す」というボタンを押し、個人情報やクレジットカードなどを登録します。無料のクレジットとして300ドルが受け取れるため、本来はAIを学習させる際に料金がかかるところを、無料でAIを作ることができます。

個人情報などを登録したら、VisionAIのダッシュボードに移動します。左側のタブから、「データセット」を選択します。すると、実際に作ったモデルの一覧画面に移ります。今回は自分で新しいAIを作るので、「新しいデータセット」を選択します。

「新しいデータセットの作成」ウィンドウが出てくるので、任意のデータセット名に変更します。モデルの目的を「単一ラベル分類」にし、「データセットを作成」を選択します。

教師データの画像をアップロードする

自動的に、新しく作ったデータセットのインポート画面に移ります。ここで画像分類の学習用の画像をアップロードできます。画面を下にスクロールし、「パソコンから画像をアップロード」が選択されていることを確認します。

画像をアップロードする前に、画像をクラウドに保存するためのGoogle Cloud Storageを作成します。「Cloud Storage上の宛先」の右側にある「参照」を選択します。

右側にウィンドウが出てくるので、画像のように「新しいバケットを作成」を選択します。

バケット作成画面に移るので、任意の名前をつけます。そのほかの設定は以下のようにします。

  • ロケーションタイプ:Regionのus-central1(アイオワ)
  • デフォルトのストレージクラス:Standard
  • オブジェクトへのアクセス制御:均一
  • オブジェクトデータを保護する方法:なし

設定が終わったら、「作成」を選択します。

フォルダの選択画面に移りました。「親リソースに戻る」を選択します。

この画面で、先ほど作ったバケットフォルダが選択され、水色になっていることを確認します。確認できたら、下にある「選択」をクリックします。

先ほど作ったフォルダが宛先になっていますね。それでは、「ファイルを選択」をクリックし、AIの学習に使う画像をアップロードします。

アップロードが開始すると、右下に画像のアップロード状況が出てきます。今回は1枚のみのアップロードですが、1回のアップロードで最大500枚のアップロードが可能です。アップロード状況がすべて「完了」になったら、「イメージ」タブに自動で遷移します。もし、自動で遷移しなかった場合は、データセット名の下にある「イメージ」タブを手動で選択してください。

イメージタブに移動すると、「実行中:画像のインポート」と出るので、インポートが完了するまで待機します。

インポートが完了すると、アップロードしたすべての画像が並んでいるはずです。次は、アップロードした画像を「ラベル」に分類します。画像の横にある「新規ラベルを追加」を選択します。「新規ラベルを追加」ウィンドウが出てくるので、任意の名前をつけます。

今回、AIで判定するのは「俺か、俺以外か」なので、「kawaguchi」と「others」のラベルにしました。アップロードした画像すべてにどちらかのラベルを付けます。今アップロードした画像は自分の顔なので、「kawaguchi」のラベルに追加していきます。ラベルに追加する際、複数の画像を同時に選択する方法と、画像を1枚ずつ選択する方法の2種類の方法があります。

複数画像のラベルを選択するには、イメージ画面で選択したい画像にマウスカーソルを合わせます。画像の左上に「〇」が表示されるのでクリックし、選択したい画像すべてにチェックマークがついたら、画像の上の「ラベルの割り当て」をクリックし、選択した画像が入るラベルを1つ選択して保存します。

また、「ラベルなし」タブで「すべて選択」をクリックすることでラベルが割り当てられていない画像をすべて選択できます。今回の例では、先に「kawaguchi」に入れる予定の画像をすべてアップロードし、この「すべて選択」機能を使ってラベルを一度につけるのがおすすめです。

「1枚ずつラベルをつけたい」と思った場合は、対象の画像をクリックしてください。ラベル選択画面に移るので、ここで画像がどのラベルに入るのかを選択します。選択できたら画面下の「保存」をクリックした後、上の「×」をクリックしてイメージ画面に戻りましょう。

AIのトレーニング

すべての画像にラベルを割り当てたら、「トレーニング」タブに移動します。トレーニングには、ラベルごとに最低10枚の画像が必要です。また、今回のように、人の顔などの判断が難しい題材については、50枚以上の多くの素材が必要となる場合があるので、注意してください。

「トレーニングを開始」をクリックします。トレーニングの設定画面が右側に表示されるので、AIに任意の名前をつけ、モデルの種類の「Edge」を選択します。モデル最適化のオプションは「Higher accuracy」を選択します。ノード時間予算の設定は、最初は「1」や「2」がおすすめです。ノード時間が大きすぎると、トレーニングに時間が長くかかってしまいます。また、ノード時間あたりの料金が18ドル(2022年10月現在)かかるので、複数のAIを作りたい場合は注意が必要です。

設定が完了したら「トレーニングを開始」をクリックして、トレーニングが完了するまで待ちます。

トレーニングが完了したら、トレーニング画面にAIの学習結果が表示されます。詳しい学習結果は「評価」タブなどから確認できます。これで、Vision AIを使用したAIが完成しました。

次は、作成した推論モデルをGravioに取り込んで実際に使ってみましょう!

作成した推論モデルをGravioで使ってみよう

作成した推論モデルをGravioで利用するには、TensorFlow Liteという形式に変換する必要があります。「テストと使用」タブに移動して、「TF Lite」をクリックします。

エクスポートの設定画面が表示されるので、画像のアップロード時に使用したバケットフォルダを「参照」から選択します。選択したら、「EXPORT」をクリックします。少ししたら画面の下に「Export operation finished」と表示されます。エクスポートが完了して、バケットフォルダ内にAIのモデルが保存されました。「OPEN IN GCS」をクリックして、バケットフォルダの中身を確認します。

バケットフォルダを開くと、アップロードした画像があり、どれがAIのファイルかすぐにわかりません。「フィルタ」の右側に「model」と入力すると、今回作成したAIのモデルフォルダを表示できます。「model-export」→「icn/」と進むと、「tflite」から始まるフォルダがあるので、開きます。

3つのファイルが確認できます。この3つのファイルすべてを画像で赤く囲ったダウンロードボタンをクリックしてダウンロードします。ダウンロード/エクスポートしたファイルが、Gravioに取り込める「TF Lite仕様」の画像推論モデルであることを確認。ここまでできたら、Vision AIでの作業は全て終了です。

次は、Gravio Studioでの作業に移動します。

Gravioに作成した画像推論AIを適用

今回のAIシステムでは、作成した推論モデルを利用するために、Gravio Hubというエッジゲートウェイを使用します。Gravio Hubでは、カメラやセンサーなどから取り込んだ情報を集約し制御するだけでなく、推論モデルの実行も行います。

Gravio Hubとネットワークカメラの詳しい接続方法は、こちらの関連記事から確認できます。👇

新GravioはAI画像推論機能がすごい!ワイン大好きライターが「ワインラベルを自動で読み取るAIシステム」を作ってみた

Gravio Studioの「設定」から、「画像推論モデル」タブに移動します。「モデルパッケージを作成」をクリックし、「推論モデルパッケージの作成」画面を表示します。

認識タスクを「画像分類」に設定します。任意のモデルパッケージ名をつけて、Lite.tffilieファイルの「選択」をクリックすると、エクスプローラーウィンドウが表示されるので、Vision AIからダウンロードした3つのファイルの中の名前が「~_model.tflite」で終わるファイルを選択します。出力方式は「JSON」と「Label」の2種類があります。

・画像が分類されたラベルのみを知りたい場合
出力形式は「Label」を選択し、「検出値を含める」や「信頼度の域値」はデフォルトのままでOKです。

・画像が分類されたラベルとその信頼度を知りたい場合
出力形式は「JSON」を選択し、「検出値を含める」にチェックマークをいれてください。

「信頼度の域値」は、画像がラベルに分類された際の信頼度が域値未満だった場合に、出力結果が「unknown」になる機能です。「90%以上の信頼度がないとラベルを認めない!」という場合に変更してください。

設定が完了したら「Hubkitへアップロード」をクリックします。

画像のように「Added custom inference model 〇〇」と表示されたら、推論モデルパッケージの作成が成功です! さっそくカメラにAIを割り当てましょう。

「デバイス」画面に移動し、画面上部にある「+」をクリックした後、「エリアの追加」をクリックします。任意のエリア名を入力し、保存すると、自動で「レイヤーの追加」画面が表示されます。すでにあるエリアにレイヤーを追加したい場合は、同じく「+」をクリックした後、「レイヤーの追加」をクリックするとレイヤーを追加できます。

任意のレイヤー名を入力したら、「SENSING DEVICE TYPE」の中から「推論モデルパッケージの作成」で決めたモデルパッケージ名を探して選択し、保存します。

追加したレイヤーが選択されていることを確認し、右上の「⊕」をクリックします。レイヤーであるAIに対応できるデバイスが表示されるため、設定しておいたネットワークカメラを選択し、「Bind」をクリックします。

レイヤーの論理デバイス欄にネットワークカメラが表示されました。右側のスイッチをクリックして緑色にし、カメラが利用できるようにします。

これでGravio Studioの設定も完了です!

AIに「俺か、俺以外か」を判定してもらう  

それでは、作成したAIを使って、カメラに映っている人物が「俺か、俺以外か」を判定してみます!

今回、AIで判定した「俺か、俺以外か」をわかりやすく可視化するために、Gravio LEDマトリックスを利用しました。Gravioブログの記事を参考にして設定しました。

判定が「俺」の場合は「◎」、「俺以外」の場合は「×」を表示させます(LEDマトリックスの設定方法は、次の章でくわしく解説します)。

まずは、変装などをせずに判定してみます。その結果……

無事に「俺」と判定できました!

Gravio Studioの「データビューワ」を確認すると「kawaguchi」と表示されていました。信頼度は約89%となっています。

次は、マスクをした場合です。

顔が半分近く隠れていますが、結果はどうでしょう。

これも無事に「俺」と判定できました! 信頼度は、約79%でした。マスクをしていても、AIは「俺」と判定してくれることがわかりました。

ここからは、変装した場合に、AIは「俺」と判定するのかどうかを検証していきます。

まずは「つけヒゲ」です。

大きな変化ではないので、おそらく「俺」と判定できる予想ですが、結果はどうでしょうか。

予想通り、「俺」という判定です。信頼度は83%でした。

このくらいの変装では、AIはだまされないようです。

次に、ブルーのウィッグを被ってみました。

髪の色が変わったことに加え、前髪が顔にかかっています。

結果は「俺以外」でした! AIをだますことに成功しました(笑)。

信頼度を見ると約58%で「俺以外」と判定されているようです。信頼度が低いことから、AIが悩んだ結果、「俺以外」と判定したことがわかります。

では、カニの被り物ではどうでしょうか。

顔は見えているものの、色や輪郭などが今までとかなり違っています。はたして結果は……?

なんと結果は「俺」でした!

信頼度を見ると約67%で「俺」と判定されています。ウィッグよりも顔が隠れていないことが結果に反映されたものと思われます。

Gravioの「トリガー」と「アクション」機能で判定を可視化

Gravioのトリガーとアクション機能を組み合わせることで、AIの判定に応じて、LED表示パネルや警告灯に通知したり、LINE、Slack、Microsoft Teamsなどでメッセージ通知したり、クラウド型BIツールでデータ表示したりできます。

GravioならAIで推論した結果を、ノーコードでかんたんに可視化できるのでおすすめです。

今回はAIの判定結果をわかりやすく可視化するために、Gravio LEDマトリックスを利用しましたが、このLEDマトリックスを含め、Gravioでは各種センサーやデバイス類を無償で貸し出してくれるのもうれしいですね!

では、この章では、LEDマトリックスに「◎」「×」を表示させるためのトリガーとアクションの設定方法を説明します。

上記のように、Gravio Studioの「アクション」で、LEDマトリックスに◎を表示させる動作を設定します。

画像はGravioブログより

ちなみに、LEDマトリックスに表示させるコンテンツとして、自分で作った、さまざまなドット絵(16×16bmpファイル、解像度72×72dpi)を使うこともできます。くわしい設定方法は、Gravioブログの記事「【初心者が10分で実践するIoT・番外編】Gravio 4で取得したCO2センサーのデータを、一目で分かる視認性を誇る”Gravio LEDマトリックス”を使ってわかりやすく可視化してみた!」をご覧ください。

続いて、トリガーは上記のように設定しました。

エリアとキーレイヤーを、それぞれカメラを対応させたエリアとレイヤーに設定します。上の画像では、AIが「俺(=kawaguchi)」と判定したときを条件としています。

このまま「アクション」タブに移動し、「俺」のときのアクション、つまり先ほど設定した「◎」のアクションを選択します。

最後に、トリガー画面で右側の「状態」を緑色にしたら、設定は完了です。

カメラが画像を認識するまで待つと……

Gravio LEDマトリックスに「◎」が出ました!

このように、Gravioでは、オリジナルの学習モデルを使ったAIシステムをかんたんに構築できます。

「ノーコード」なので、推論モデル生成から推論モデルに応じたGravioによる通知や可視化などのAIシステムまで、大学生の僕にもかんたんにできました。また、結果に応じたトリガーやアクションを設定することで、可視化もスムーズに実現できます。

今まではAIを難しいものだと感じていた方も、この記事を参考に、Gravioを活用して、さまざまな課題を解決するAIシステム作りに挑戦してみてはいかがでしょうか。