[Cognitive Services] Custom Visionで簡単にネコの種類を分類する機械学習のモデルを作る with LINE
こんにちは、もっちゃんと申します。
コチラの記事は下記のQiita Advent Calendar 2021の25日目の記事でもあります。
(ニッチすぎていつ役に立つのか分からないアプリの記事ですw)
機械学習って興味あるけど難しくて中々手が出しづらいイメージですよね。実はここ数年で機械学習はどんどん身近になってきていて簡単に使える方法もあったりします。特に優れたサービスとしてAzureのCognitive Servicesがあり、様々なシュチュエーションで活用できるAI機能が展開されています。本エントリではこの優れた機能のうち、Vision系それもCustomの機械学習モデルが作成できるCustom Visionのサービスを使ってみます。
ちなみに以前、AzureのAIサービスをまとめてみたものがあるので参考まで!
Custom Visionとは
Azure Custom Vision は、独自の画像識別子モデルを構築、デプロイ、改良できるようにする画像認識サービスです。 画像識別子は、検出された視覚特性に従って画像に (分類またはオブジェクトを表す) ラベルを適用します。 Computer Vision サービスとは異なり、Custom Vision ではユーザーが独自ラベルを指定し、それらを検出するためのカスタム モデルをトレーニングできます。
Vision系のサービスにComputer Visionというものもあり、こちらも用意されている優れた機械学習のモデルが今すぐ簡単に使えてしまうのですが、もう少しニッチな画像分類を実施したい、例えば犬、猫のような比較的汎用な分類ではなく、猫の種類といった込み入った分類をしたい時はCustom Visionであれば、自分で学習用のデータを用意するだけで機械学習の専門的な知識がそれほど無くてもカスタマイズした機械学習のモデルを作ることができます。
Custom Vision で出来ること
Custom Visionでは下記のタスクに対応しています。
- 分類(Classification): 画像全体が何に分類されるか
- オブジェクト検出(Object Detection): 画像内にある物体の検出
料金・制限など
プロジェクト2つまでですが、無料のプラン(F0)が用意されています。また、用意する学習用の画像データですが、一般的に機械学習の学習データは大量に用意しなければならないというイメージがあると思います。しかし、Custom Visionでは最小5個、推奨50個以上と始めるハードルが高くありません!
さっそくやってみよう
さっそく Custom Vision で独自の画像分類を行える機械学習のモデルを作っていきましょう。今回はネコが好きなのでネコの種類を分類するモデルを作っちゃいます!
(ちなみに最近妻が猫アレルギーだということを知りました。。ネコを飼うの憧れてたんですがたぶん一生叶わないのかもしれません😹)
今回は2種類のネコを分類しようと思います。下記は見てわからないとおり左がシャルトリュー(Chartreux)、右がロシアンブルー(Russian Blue)です。
【引用1:比較のため画像を結合(左元画像はコチラ, 右元画像はコチラ) by もっちゃん, CC BY-SA 3.0】
ちなみに、画像データはインターネットを検索し、Chrome拡張のImage Downloaderを使って集めました。
作業は公式のクイックスタートを参考に進めていきます。
Custom Vision リソースを作成する
まずはCustom Visionのリソースを作成していきます。コチラにアクセスしてください。
入力項目は下記を参考に埋めてください。下にあるボタン、[確認と作成] → [作成]を押してリソースを作成します。
Custom Vision 専用ポータルを使う
次にコチラからCustom Vision 専用ポータルにアクセスします。このポータルでは学習用のデータの管理、機械学習モデルのトレーニングを行うことができます。
ポータルを開いたら、[NEW PROJECT]からプロジェクトの新規作成を行います。入力項目は下記を参考に埋めてください。最後に右下のCreate project ボタンを押します。
- Resource: 先ほどAzureのPortalで作成した、リソースグループを選択
- Project Types: 今回は画像の分類を行うのでClassificationを選択
- Classification Types: 今回は単一のラベルを扱うのでSingle tagの方を選択
- Domains: トレーニング時間の短いGeneral[A2]を選択。詳細はコチラ
学習用のデータの作成
下記の容量で学習用の画像データをアップして作成していきます。アップするタイミングで一括でタグ付けできるので、ローカルで画像を種類ごとにまとめておくと作業が楽になると思います!
ちなみに、画像をアップした後もポータル上で画像の削除
やタグ付け操作
などいくつか操作が可能です。
今回は推奨である約50個の学習用の画像データを用意しました。
モデルのトレーニング
学習用のデータの準備ができたので、トレーニングを行い機械学習のモデルを作っていきます。トレーニングは非常に簡単で右上のTrainボタンからポチポチ押していくだけです!
ちなみに、トレーニングのタイプを選択できます、ご参考まで!
(参考)トレーニングタイプの選択
トレーニング後のモデルの評価
トレーニング後はしっかりとモデルの評価も可視化してくれます。この辺りの情報を参考に、モデルの精度を把握して、必要なら学習データを増やしたりなど行います。
モデルのクイックテスト
ポータルでは作成したモデルのクイックテストも可能です。テストを行うにあたり、トレーニングに使用していない画像データを用いてテストを行います。すると..下記のように見事にネコの種類を分類できていますね!🎉
【引用2:画像の分類結果をわかり易く加工(元画像はコチラ) by もっちゃん, CC BY-SA 3.0】
【引用3:画像の分類結果をわかり易く加工(元画像はコチラ) by もっちゃん, CC BY-SA 3.0】
トレーニング済みイテレーションを発行する
モデルの精度もなかなか良さそうでしたので、この状態で公開を行いプログラムなどから実行できる状態にしようと思います。
Endpointなどの情報は下記あたりにあります。
curlで実行してみる
いったんcurlで今回作った機械学習のモデルのpredictionのEndpointを実行してみましょう。上手く結果が返ってきましたね!
- 実行するコマンド
PREDICTION_KEY=558e504bf6f448e8839004273b7adff
ENDPOINT="https://customvision20211031-prediction.cognitiveservices.azure.com/customvision/v3.0/Prediction/85bbeb50-c1a9-476c-a143-42cd2d1de091/classify/iterations/Iteration1/url"
curl -v -X POST "${ENDPOINT}" \
-H "Content-Type: application/json" \
-H "Prediction-Key: ${PREDICTION_KEY}" \
-d '{"Url": "https://upload.wikimedia.org/wikipedia/commons/3/3c/IC_Blue_Melody_Flipper_CHA_male_EX1_CACIB.jpg"}' | jq
- 実行結果(json)
LINE Botを活用してネコの種類を分類するアプリを作る
curlで上手く動いているのでこのまま終わりでも良いのですが、実際にユーザさんに使ってもらうにはやはり何かしらアプリのようなものが必要です。(curl叩いてもらうわけにいきませんから!)
そこでLINEのBotを活用するとアプリ化がめちゃくちゃ簡単なのでさっそく使っていきましょう!
LINE Botの作成
先にLINE Botを動かす環境ですが、下記のような構成になります。(だいぶ簡単に書いてます笑)
- システム構成図
それではまず下記のコマンドを実行してBot用のサーバーリソースを構築します。ここでは優れたクラウドサービスであるAzureをBicepというプロビジョニングツールを使ってコマンド数回打つだけでサクッと構築してしまいます。ここから先はあまり詳細に書きませんが、手を動かせそうな方はぜひ!
事前にLINEの開発者用コンソールで必要な設定を済ませておきます。(設定はコチラを参考に)
- 実行するコマンド
az login --use-device-code
## Get subscription id
az account list \
--refresh \
--query "[].id" \
--output table
az account set --subscription <your subscription id>
group_name=customvision20211031
az configure --defaults group=${group_name}
## randam値はコチラで取得 > https://1password.com/jp/password-generator/
## projectId,publishedName,predictionKey,predictionEndpointは 作業したCustom Visionの値で埋める
## secret,accessはLINEの開発用コンソール画面から取れる値、チャネルシークレット、アクセストークン > 参考:https://zenn.dev/mochan_tk/articles/d01a24bb576d18#4.messaging-api-%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90
az deployment group create --name deployPrj01 --template-file main.bicep \
--parameters random=<random> \
--parameters projectId=<projectId> \
--parameters publishedName=<publishedName> \
--parameters predictionKey=<predictionKey> \
--parameters predictionEndpoint=<predictionEndpoint> \
--parameters secret=<secret> \
--parameters access=<access>
(参考) 実際に実行した az deployment group create コマンド
az deployment group create --name deployPrj01 --template-file main.bicep \
--parameters random=47ZdbU590znU0PaJeW8i \
--parameters projectId=85bbeb50-c1a9-476c-a143-42cd2d1de091 \
--parameters publishedName=Iteration1 \
--parameters predictionKey=558e504bf6f448e8839004273b7adffa \
--parameters predictionEndpoint="https://customvision20211031-prediction.cognitiveservices.azure.com/customvision/v3.0/Prediction/85bbeb50-c1a9-476c-a143-42cd2d1de091/classify/iterations/Iteration1/url" \
--parameters secret=e320a78519befc3d499a109ebcad026f \
--parameters access=4y+zs8odRlKfAoEqu8Z7j7kztY3run91k46xVUiKJe575ObaHuo6DtM/ryqsHpIaQ4MW+TWNnVDU1h2cV166FO3Uipxyae2lgSsHMmfryjNs1A67+vNC8fr6YjNv63T/b+e7hjkPnAvfuSvNVowbwAdB04t89/1O/w1cDnyilFU=
そして下記のコマンドでアプリのコードをデプロイします。最後に表示されたURLをLINEの開発者コンソールのwebhookに設定します。(webhookの設定はコチラを参考にしてください。)
- 実行するコマンド
cd deployPrj01
## Get functionAppName
az deployment group show \
-g ${group_name} \
-n deployPrj01 \
--query properties.outputs.functionAppName.value
## functionAppNameのところは1つ上のコマンドで取得した実際の名前で置き換えてください
func azure functionapp publish <functionAppName> --build remote
- 実行結果(webhookに設定するURL)
使用したコードは下記に置きました!
コードの中で重要な部分を下記にピックアップしました!
- https://github.com/mochan-tk/Azure-Custom-Vision-LINE-Bot/blob/master/deployPrj01/LineHttpTriggeredFunction/index.js#L59
- https://github.com/mochan-tk/Azure-Custom-Vision-LINE-Bot/blob/master/deployPrj01/LineHttpTriggeredFunction/index.js#L70
- https://github.com/mochan-tk/Azure-Custom-Vision-LINE-Bot/blob/master/deployPrj01/LineHttpTriggeredFunction/index.js#L85
さっそく LINE Bot でネコの種類を判定してみる
LINE Botでサクッと完了!これで作成した機械学習モデルを誰でも使えるアプリが仕上がりました!🎉🎉🎉
ちなみに下記のQRコードを読み込んでBotと友達になると試していただけます!
まとめ
AzureのAIサービスであるCustom Visionを使うとデータを用意するだけで独自の機械学習モデルの作成が簡単にできてしまうことがおわかりいただけましたでしょうか。さらにユーザに使ってもらうための媒体をLINE Botでやってしまえばめちゃめちゃ簡単にアプリ・サービス化ができてAIや機械学習と相性抜群です!
Discussion