今まで食べた飯を名古屋めしかそれ以外かに分類するモデルを作ってみた

2023.07.12

はじめに

この記事では、私がこれまでに食べたものを、名古屋めしかそれ以外かに分類するモデルを構築し、実際に画像が分類できるか試してみたいと思います。

SageMakerでPythonコードを書いていくにはまだまだ勉強が足りないので、今回はSageMaker Canvasという、ノーコードで予測を作成できるサービスを使ってやってみたいと思います。

SageMaker Canvasを起動するまで

SageMakerのページで、「Canvas」⇒「SageMakerドメインを作成」をクリックします。

今回はサクッと構築したいので、「高速セットアップ」を選択します。

ドメイン名に任意の名前を入力します。ここではnagoya-foodsと入力しました。

ユーザプロファイルはデフォルトのままにします。

実行ロールは「新しいロールの作成」を選択します。

「IAMロールを作成する」の画面がポップアップで表示されます。本来はS3バケットを指定した方が良いと思いますが、今回はお試しなので「任意のS3バケット」を選択します。

IAMロールが作成されました。右下の「送信」をクリックします。

ドメインが「InService」になるまで待ちます。

「InService」になったら、ドメイン名(nagoya-foods)をクリックし、「ドメインの詳細」画面を表示します。

ユーザプロファイルの右端の「起動」⇒「Canvas」をクリックしてCanvasを起動します

Canvasの起動中画面です。起動するまで少し時間がかかるので待ちます。

このような画面が表示されます。

データセットの準備

モデルを構築する前にまずは学習に使うデータセットを用意する必要があります。

SageMaker Canvasでは最低2つのラベルが必要で、1つのラベルにつき最低25枚の画像が必要になります。

画像データセットの編集 - Amazon SageMaker

今回は「名古屋めし」と「それ以外」を分類したいので、私が今まで撮った食べ物の写真をかき集めて、各ラベルに分類していきます。

「名古屋めし」に分類した画像がこちら(60枚)

「それ以外」に分類した画像がこちら(69枚)

また、最後に構築したモデルに予測してもらうために、「名古屋めし」と「それ以外」の予測用画像を2枚ずつ用意しました。

ではこれらの画像をCanvasにデータセットとしてインポートします。

左端のアイコンから「Datasets」を選択し、「Create」⇒「Image」をクリックします。

データセット名を入力します。

「Create」をクリックするとアップロード画面に遷移しますが、下記の画像のように「Local file upload needs to be setup」と表示されている場合があります。

この場合はS3バケットに追加の設定が必要となります。

S3を開き、sagemaker-{region}-{account id}という名前のバケットをクリックします。

「アクセス許可」⇒「Cross-Origin Resource Sharing (CORS)」⇒「編集」をクリックし、以下のポリシーを入力します。

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "POST"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    }
]

ローカルファイルをアップロードする権限をユーザーに付与 - Amazon SageMaker

さて、再度データセットをCreateすると、下記のようにドラッグ&ドロップができそうな画面が表示されます。

フォルダのままアップロードできるので、こんな感じにドラッグ&ドロップします。

右側にアップロードしたファイル名一覧が表示されます。すべてアップロードし終わったら、「Create dataset」をクリックします。

作成直後はステータスが「Processing」になるので、「Ready」になるまで待ちます。

データセット名(foods)をクリックして中を見てみると、既にラベル付けが完了しています。フォルダごとドラッグ&ドロップしたことで、自動的にフォルダ名のラベルを付けてくれたようです。

これでデータセットの準備は完了です。

モデルの構築

いよいよモデルを構築していきます。

左端メニューの「My models」アイコンを選択し、「New model」をクリックします。

モデル名を入力し、タイプは「Image analysis」を選択します。

まずは学習に使うデータセットを選択します。先ほど作成した「foods」データセットを選択し、右下の「Select dataset」をクリックします。

次にビルドです。もしも画像が足りなかったり、ラベルがついていない場合はここでデータセットを編集できます。今回は既にラベル付けも完了しているので、そのまま「Quick build」をクリックします。

ビルドに15分~30分時間がかかると表示されます。完了するまで待ちます。

完了するとこのような画面が表示されます。どうやらこのモデルは88.5%の確率で正しいラベルを予測できるようです。

「Predict」をクリックしていよいよ予測に進みます。

予測する

この4枚が予測用にとっておいた画像です。

左から順番にインポートしてみます。

まず1枚目。こちらはコメダ珈琲のシロノワールであり、期待するラベルは名古屋めしです。

結果は…

nagoya-food 52%
other-food 48%

ギリギリ名古屋めしと判定されましたが、ほぼ半々なのでちゃんと予測できたかというと微妙なところですね。

続いて2枚目です。こちらは味噌煮込みうどんで、期待するラベルは名古屋めしです。

結果は…

nagoya-food 56%
other-food 44%

こちらも正解ではあるものの、微妙な数値となりました。

続いて3枚目です。こちらはオムライスで、期待するラベルはそれ以外です。

結果は…

other-food 60%
nagoya-food 40%

名古屋めしよりは確信をもって予測できたようです。

最後、4枚目です。こちらはハニトーで、期待するラベルはそれ以外です。

結果は…

other-food 93%
nagoya-food 7%

こちらは完全に名古屋めしではないと確信して予測できたみたいですね。

リソースの削除

無事に予測まで終えたので、最後にリソースを削除します。リソースの削除は初めどうやれば良いのか少し戸惑いました。

まず、SageMaker⇒Domainsからドメイン名をクリックし、さらにユーザプロファイルの名前をクリックします。

すると「アプリケーションを削除」というボタンが表示されるので、クリックして削除します。

アプリケーションが「Deleted」になったら、右下の「編集」をクリックします。

「ユーザを削除」というボタンが表示されるのでクリックして削除します。

ドメインのページに戻り、ドメインを選択して「編集」をクリックします。

「ドメインを削除」から削除します。

また、「エンドポイント」を開き、エンドポイントを選択して「アクション」⇒「削除」で削除します。

「エンドポイント設定」「モデル」も同様に削除します。

さらに、S3バケットに「sagemaker-」と「sagemaker-studio-」から始まるバケットが作成されているので、それらのバケットを削除します。

画像は割愛しますが、まずバケットを「空にする」を行ってからバケットの削除を行います。

おわりに

この記事の内容を実践するにあたって一番苦労したのは、トレーニング用の画像集めでした。普段あまり写真を撮る習慣がないので、昔のフォルダを漁ったり、知人に画像を送ってもらうなどして集めました。いつトレーニングデータが必要になっても良いように、普段から写真を撮りためる癖をつけないとと思いました。

また、過去に食べた名古屋めしでは圧倒的に台湾まぜそば鉄板ナポリタンが多かったので、トレーニングデータとして偏りがあったために名古屋めしの予測が少し弱かったのかもしれません。正しい予測をするためにも、食生活を見直す必要を感じました。

機械学習部分については、GUIベースでデータの用意、モデルの構築、予測までできて感動しました。もちろんもっと本格的にやる場合はコードを書いたりして細かな調整が必要になるのでしょうが、簡単なものをサクッと作れるのはすごいなと思いました。

名古屋で会社説明会を開催します

さて、今回このようなテーマを取り上げた理由ですが、弊社は今年の4月1日に名古屋オフィスを開設しました。

クラスメソッド名古屋オフィス開設のお知らせ | DevelopersIO

そして、名古屋の仲間を増やして盛り上げていきたい!ということで、今年の8月に名古屋で会社説明会が開催されることになりました。

【8/1(火) 名古屋】クラスメソッドグループの会社説明会を開催します! | DevelopersIO

クラスメソッドグループに興味のある方はぜひチェックしてみてください。

※こちらのイベントは終了しました。ご参加頂いた方ありがとうございました。

次回の開催をお楽しみに!