😸

【スーパー猫の日記念】SageMaker JumpStartで特定の猫の種類を当てる機械学習モデルを作成してみた with LINE

2022/02/22に公開

こんにちは、河本(もっちゃん)と申します。

ついに来ました2022年2月22日、ということでスーパー猫の日タイムが始まりましたね!🎊

記念すべき日に下記のような素晴らしいイベントも待ち受けているといいうことで、猫好きな私はAWS Nyantechな内容で記事を書いてスーパー猫の日の盛り上げに貢献したいと思います!(イベントは中川翔子さんも出られるとのことで楽しみですね♪)

ということでAWSの機械学習系のサービス使っていきますよー、使うサービスはSageMaker JumpStartですー
最終的には下記のようなLINEのBotまで出来上がりますー、お楽しみに!

SageMaker JumpStart とは

SageMaker JumpStart では、経験豊富なプラクティショナーも初心者の方も、モデルやソリューションをきわめて簡単にすばやくデプロイして評価できるため、作業量が数日分または数週間分削減されます。SageMaker JumpStart は、実験から本番稼働までのパスを大幅に短縮することで、機械学習を活用したイノベーションを加速します。特に、機械学習ジャーニーの初期段階にあり、まだ多くのスキルや経験を蓄積していない組織やチームに適しています。

いわゆる機械学習の専門的な知識が無い人でも機械学習のモデルを作ることができるAutoML系のサービスですね。
事前学習済みのモデルから、自分で用意したデータでカスタマイズしたモデルを作成できるFine-Tuneを行うことができます。(事前学習済みのモデルからのFine-Tuneならトレーニングデータが少なくても精度の高いモデルを作ることができるのが良いですよね!)

SageMaker JumpStartで使える事前学習済みモデルの情報は下記の公式ドキュメントにも記載されています。

https://docs.aws.amazon.com/sagemaker/latest/dg/studio-jumpstart.html#jumpstart-models

(参考) モデル(タスク)の情報抜粋
  • Tabular Models
    • Classification Models
    • Regression Models
  • Text Models
    • Text Classification Models
    • Text Embedding Models
    • Text Generation Models
    • Extractive Question Answering Models
    • Machine Translation Models
    • Named Entity Recognition Models
    • Sentence Pair Classification Models
    • Text Summarization Models
  • Vision Models
    • Image Classification Models
    • Image Embedding Models
    • Instance Segmentation Models
    • Object Detection Models
    • Semantic Segmentation Models

さっそくやってみよう

それではさっそくSageMaker JumpStartを使っていきましょう!
今回はとある猫の種類のみを当てる機械学習のモデルを作っていきますよー
その種類は下記!..見てわからないとおり左がシャルトリュー(Chartreux)、右がロシアンブルー(Russian Blue)です。

【引用1:比較のため画像を結合(左元画像はコチラ, 右元画像はコチラ) by Takashi Kawamoto, CC BY-SA 3.0

この後の作業の参考情報としては下記の情報を使わせていただきました!

1. まずは前処理から〜

猫の種類を当てる機械学習モデルを作成するにあたり、トレーニングに使うデータのラベリング作業が必要です。
AWSでは SageMaker Ground Truth というデータラベリングサービスが提供されていますのでこちらを使います。

データのラベリング作業についてはここでは割愛しますが、下記の情報を参考に実施いただければと思います!
(この作業は難しいものではありませんー)

(ちなみに、猫の画像データはインターネットを検索し、Chrome拡張のImage Downloaderを使って集めました。)

ラベリング作業が完了すると下記のようにoutput.manifestのファイルができていると思います。このファイルを後ほどの作業で使っていきます。

2. 事前学習済みモデルの選択と学習データの整形

いよいよココからSageMaker JumpStartを使う場面に入っていきます。

事前学習済みのモデルを画面から選択できるので、今回は気になっていたEfficientNetをFine-Tuneして使ってみようと思います!

選択すると下記の画面が表示されると思いますが、下の方にスクロールしていくと、データセットの配置で遵守しなければならないルールが記載されており...

(参考) Fine-Tune用のデータセットの遵守事項

つまり下記のようにS3上にデータを配置してくださいとのことですね。

input_directory
    |--Chartreux
        |--img1.jpg
        |--img2.jpg
    |--RussianBlue
        |--img1.jpg
        |--img2.jpg

ですので例えば下記のようなコマンドで、ラベリング結果のoutput.manifestにもとづいてS3にデータをセットしていきます!

$ S3_BASE=<your bucket name>
$ S3_CHARTREUX="${S3_BASE}/input_directory/Chartreux/"
$ S3_RUSSIAN_BLUE="${S3_BASE}/input_directory/RussianBlue/"

$ for i in $(cat output.manifest | jq -r '. | select(.["Nyantech-20220222-metadata"]["class-name"] == "Chartreux") | .["source-ref"]'); do aws s3 cp ${i} ${S3_CHARTREUX}; done
$ for i in $(cat output.manifest | jq -r '. | select(.["Nyantech-20220222-metadata"]["class-name"] == "Russian Blue") | .["source-ref"]'); do aws s3 cp ${i} ${S3_RUSSIAN_BLUE}; done
(参考) output.manifestの内容抜粋

output.manifestの中身は下記のようなデータになっています。

{"source-ref":"s3://buket-name/cats/img1.jpeg","Nyantech-20220222":0,"Nyantech-20220222-metadata":{"class-name":"Chartreux","job-name":"labeling-job/nyantech-20220222","confidence":0,"type":"groundtruth/image-classification","human-annotated":"yes","creation-date":"2022-02-19T10:29:30.987489"}}
{"source-ref":"s3://buket-name/cats/img2.jpeg","Nyantech-20220222":0,"Nyantech-20220222-metadata":{"class-name":"Chartreux","job-name":"labeling-job/nyantech-20220222","confidence":0,"type":"groundtruth/image-classification","human-annotated":"yes","creation-date":"2022-02-19T09:56:16.094920"}}
{"source-ref":"s3://buket-name/cats/img3.jpeg","Nyantech-20220222":1,"Nyantech-20220222-metadata":{"class-name":"Russian Blue","job-name":"labeling-job/nyantech-20220222","confidence":0,"type":"groundtruth/image-classification","human-annotated":"yes","creation-date":"2022-02-19T10:21:14.959206"}}
{"source-ref":"s3://buket-name/cats/img4.jpeg","Nyantech-20220222":1,"Nyantech-20220222-metadata":{"class-name":"Russian Blue","job-name":"labeling-job/nyantech-20220222","confidence":0,"type":"groundtruth/image-classification","human-annotated":"yes","creation-date":"2022-02-19T10:12:36.743075"}}

コマンドを実行する場所としては AWS CloudShell を使うのが便利かもしれません。

3. トレーニングの実施(Fine-Tuneの実施)

そして、ついにFine-Tuneを実施する時ですここまで早いですね〜

Train Model と記載があるところがあると思いますので、必要な情報を下記のように埋めていただければと!!
入力終わりましたらTrainボタンをポチッと押してくださいませ!

4. モデルのデプロイ

しばらくすると、Fine-Tuneが終わりデプロイができる状態になります。
ここでも必要な情報を入力してボタンをポチッとするだけです。
おもむろにDeployボタンを押しましょう!

5. モデルを使ってみよう♪

これまたしばらくすると、In Serviceの表示になってデプロイが完了します。
ここでOpen Notebookのボタンを押すとモデルを使用するサンプルのコードが提示されます。とても親切ですね^^

サンプルコードを少しいじってコードを実行してみると、先ほど作った機械学習モデルで推論されており、ちゃんと正解もしていますね🎉
(ここで使用している猫の画像は、トレーニングに使用していないものを使います)

(参考) サンプルコード修正後のコード
import boto3
from IPython.core.display import HTML

CHARTREUX_jpg, RUSSIAN_BLUE_jpg = "CHARTREUX.jpg", "RUSSIAN_BLUE.jpg"
HTML('<table><tr><td> <img src="CHARTREUX.jpg" alt="cat" style="height: 250px;"/> <figcaption>CHARTREUX.jpg</figcaption>'
     '</td><td> <img src="RUSSIAN_BLUE.jpg" alt="dog" style="height: 250px;"/> <figcaption>RUSSIAN_BLUE.jpg</figcaption>'
     '</td></tr></table>')

images = {}
with open(CHARTREUX_jpg, 'rb') as file: images[CHARTREUX_jpg] = file.read()
with open(RUSSIAN_BLUE_jpg, 'rb') as file: images[RUSSIAN_BLUE_jpg] = file.read()

import json

def query_endpoint(img):
    endpoint_name = 'jumpstart-ftc-nyantech-classification-model-endpoint'
    client = boto3.client('runtime.sagemaker')
    response = client.invoke_endpoint(EndpointName=endpoint_name, ContentType='application/x-image', Body=img, Accept='application/json;verbose')
    return response
    

def parse_prediction(query_response):
    model_predictions = json.loads(query_response['Body'].read())
    predicted_label = model_predictions['predicted_label']
    labels = model_predictions['labels']
    probabilities = model_predictions['probabilities']
    return predicted_label, probabilities, labels 

for filename, img in images.items():
    query_response = query_endpoint(img)
    predicted_label, probabilities, labels = parse_prediction(query_response)
    display(HTML(f'<img src={filename} alt={filename} align="left" style="width: 250px;"/>' 
                 f'<figcaption>Predicted Label is : {predicted_label}</figcaption>'))

LINE Botを活用して簡単にアプリまで作っちゃおう♪

機械学習ってこんなに簡単なんでしたっけ?って感じでしたが
SageMaker JumpStartで楽できたおかげで余力が残っていますので、アプリ化まで一気にいきたいと思います!
この後もとことん効率よく進めていきますよー

今度はLINEです。LINEのBotを活用するとアプリ化までがめちゃくちゃ簡単なのでさっそく使っていきましょう!

LINE Botの作成

先にLINE Botを動かす環境ですが、下記のような構成になります。
(ちなみに、LINEを使うからと言っても通常のシステム開発とそこまで大きな違いはありません!)

  • システム構成図(だいぶ簡単に書いてます笑)

サーバーの構成はプロビジョニングツールを使って構築するのも一つおすすめかなと思うのですが、今ですとAWSにはCDKがあるので本当に良い感じにAWS環境を構築できます。
(CloudFormationのYAMLや、古くはPuppetやChefでオンプレ環境構築していた時はこういうの特段好きでは無い私でしたがCDKはちょっと楽しいんですよねー)

今回使用したコードは下記に置きました。(あまり良いコードでは無いですが汗)

https://github.com/mochan-tk/sagemaker-jumpstart-nyantech-bot

コードは下記あたりをご自分の情報に書きかえていただいて

CDK Deployコマンド打てば環境構築&アプリのデプロイが完了するのでは無いかと思います。ちなみに作業はAWS Cloud9で実施しました!

😸そして出来ました!とある猫の種類をあてる LINE Bot😸

LINE Botでサクッと完了!これで作成した機械学習モデルを活用したアプリが仕上がりました!🎉🎉🎉

まとめ

機械学習の専門的な知識が無い方でもSageMaker JumpStartを使えばサクッと機械学習モデルが作成できるのがお分かりいただけたと思います。
そして、SageMakerの領域で実施できているので今後、他のSageMakerの機能との連携も期待できますかね^^

アプリケーションを動かすプラットフォームとしてクラウドはやはり大変便利というのと、そこにLINEも組み合わせとして相性が良いですので是非活用してみてはいかがでしょうか!

ちなみに先日行われていた、AWS Builders Online Series内の下記のSageMaker JumpStartのセッションが大変面白い内容w..じゃなくて大変分かりやすい内容なので是非ご覧いただくと良いと思います!

  • セッションタイトル:Amazon SageMaker JumpStart を用いた IT エンジニアによる機械学習 PoC のすゝめ ~ たけのこの里好きに向けたきのこの山検出問題を添えて ~
  • スピーカー:呉 和仁

https://builders-apj.virtual.awsevents.com/media/t/1_u2ojmp40/238609913

それでは記念すべきスーパー猫の日をお楽しみくださいませ〜😸

Discussion