はじめに
本記事は、機械学習の自動化プラットフォームDataRobotを使って楽しむ冬のイベント予測チャレンジ 【PR】 DataRobot Advent Calendar 2020のための記事で、「冬の風物詩にちなんだテーマで、DataRobot のAuto MLを使って分類・回帰問題に挑戦しよう」というテーマです。
私自身、機械学習は業務で使用したこともないし、勉強もそこまでやっていません。
そこで今回のイベントを良い機会だと思い、応募しました。
冬の風物詩がテーマなので色々考えましたが、冬の定番の料理**「しゃぶしゃぶ」**に決定しました。
きっかけ ~なぜ、しゃぶしゃぶ?~
先週、妻と一緒にとあるしゃぶしゃぶ屋さんに行った際に、事件(?)が発生しました。
三元豚ロースの食べ放題を注文していたはずが、途中から三元豚肩バラがテーブルに配膳されていました。
私も最初は気付かず、「ロースはうまいね」とか言いながら食べていたのですが、妻に指摘されてから初めてバラ肉を食べていることに気が付きました。
このような事件を発生させないために、カメラなどで事前に部位を確認できないかと考えました。
そして、我々はどこを見て部位を類別しているのか気になりました。
実際に私はロース⇒バラの変化に気づきませんでしたし、興味が湧いてきました。
ちょうどDataRobotを使用したコンテストがあったので、機械学習を使って上記問題の解決を試みることとしました。
目 的
今回の目的はDataRobotを用いて、
・配膳された肉の部位を分類できるか検証する。
・分類の際、肉のどこを重視しているか確認する。
ことです。
先行事例
yonellさんが、機械学習を使って肉が焼けたかどうかを判定できるのか挑戦していました。
”機械学習を使って焼肉で肉が焼けたかどうかを区別してみた”
https://qiita.com/yonell/items/682f65b97f35d6191936
結果、肉が焼かれているかどうかの二値分類に成功しています。
都築電気株式会社と株式会社イシダは、コンベアに流れる肉の部位を判別する、部分肉認識システムを開発しました。
コンベアに流れる肉の部位を判別する装置 ロースをAIが見分ける
https://ledge.ai/tsuzuki-ishida-ai/
詳細なモデル等の内容までは分かりませんが、実用可能なレベルまで判断可能だそうです。
配膳された肉の部位を分類した事例はないですが、上記先行事例をみると、かなりいけそうな気がします。
データセット準備
今回は実際にしゃぶしゃぶブッフェ「しゃぶ葉」に行って、スマホで写真を撮ってきました。
・使用スマホ:京セラQua phoneh
・メインカメラ:約1,300万画素CMOS
・静止画:最大4,160×3,120ドット(13M)
撮影方法
1つの皿につき、斜め上からと真上からとり、更に皿の角度を90度変えて撮影し、計4回撮影しました。
食べ切れる分だけ撮影し、三元豚肩ロース×5皿、三元豚バラ×5皿、計40回撮影しました。
データの水増し
DataRobotは最低でもサンプルが100枚以上必要です。
今回はそんなに食べれないので、反転画像を作成し、データの水増しを行います。
撮影画像をそれぞれ、左右、上下、左右上下反転し、データ数を4倍に増やしました。
最終的にデータ数は40×4=160になりました。
モデル生成
つづいて、DataRobotを使用し、学習モデルを生成します。
アップロードデータの準備
上記で作成した画像をDataRobotにアップロードするために、フォルダ構成を整えます。
DataRobotのモデルの構築を参考にして、アップロード用のzipファイルを作成します。
分類したい画像をフォルダごと分けて、zipで保存するだけでOKです。
とても簡単です。
フォルダの名前がそのままクラス名になります。
画像データの名前は何でも大丈夫です。
プロジェクトの作成、データのアップロード
続いてDataRobotのプロジェクトを作成します。
ホームにアクセスし、「新しいプロジェクトを作成」します。
今回はローカルのPCからアップロードするので、「ローカルファイル」を選択し、先ほど作成したzipファイルを選択します。
下記画像はアップロードした画像の読み込み中の様子です。
この内に、右上のワーカー数(現在開いているプロジェクトにどの程度リソースを割くか)を増やしておきます。
デフォルトでは2つですので、最大の8にしておきます。
読み込みが終わると、「何を予測しますか?」と表示されるので、「クラス」と入力し、開始します。
あとは待つだけで勝手に学習モデルを複数、生成してくれます。
なんて便利なんでしょう。
画面上の「モデル」を選択すると、その様子が確認できます。
モデルの選択
DataRobotの公式サイトのモデル最適化指標・評価指標の選び方などを参考に、モデルを選択します。
今回は二値分類なので、上記サイトの*「二値分類問題における指標の一覧」*を参考にし、LogLossが最も低い(=精度が高い)モデルを選択しました。
こちらが上記で選択したモデルのリフトチャートです。
予測と実測が重なっているほど精度が良いのですが、不気味なほど重なっています。
モデル生成が終了しました。
検 証
つづいて、肉のどこを重視しているか?の確認と、モデルの精度評価を行います。
どこを見ているのか?
まずは、「解釈>画像埋め込み」でどのように分類しているか確認します。
まったく分かりません。
赤色ばっかりで見にくいです。
そこで、分かりやすいようにロースのみ青色で着色してみました。
(着色はパワーポイントで背景削除&色の変更で実現しています。)
やはり分かりません。
どうやら画像埋め込みでは確認できないそうです。
続いて、「解釈>アクティベーションマップ」でどこを重視しているか確認します。
※コントラストを調整して、見やすいようにしています。
バラのアクティベーションマップです。
人間と同じように脂身が織りなす波模様も見ているようです。
重視度の高い領域が脂身の方向に沿ってことが分かります。
フーリエ変換でもしているのでしょうか。
続いて、ロースのアクティベーションマップです。
こちらも脂身の模様をみています。
バラと違い、網目模様の部分を重視していることがわかります。
結果ですが、バラは波模様、ロースは網目模様と、それぞれの脂身の模様を重視していました。
精 度
リフトチャートが重なっていることから、過学習の可能性を疑いました。
そこで、Google検索でヒットした「しゃぶ葉」のロース、バラ肉の画像を精度検証に使用します。
今回は精度検証用にバラ22枚、ロース22枚、44枚の画像を集めました。
なお、ロースはバラに比べて集めにくかったため、一部左右反転画像で水増ししました。
(おそらく経済的な理由で、ロースを食べる人が少ないのではないでしょうか。)
学習時と同様に各フォルダに画像を格納してzipで圧縮し、
「予測>予測を作成」からアップロードします。
結果のcsvファイルをダウンロードすると、下記のようになってます。
A列(row_id):インデックス
B列(逕サ蜒上ヵ繧。繧、繝ォ繝代せ):画像ファイルパス(日本語が文字化けしていますが、UTF-8で読み込みと「画像ファイルパス」と表示されます。)
C列(Prediction):予測値(今回は閾値を0.5で設定しています)
D列(PredictedLabel):分類結果(今回は二値分類であるため0または1が入ります)
検証した結果、データ数44個に対し、正解数は41個、**正解率93.18%**でした。
過学習ではなさそうです。
なお、間違えた3個は全て、ロースをバラと勘違いしていました。
間違えた画像は下記のとおりです。
ロースの特徴の網目模様よりもバラの特徴の波模様が強く表れており、人間が見てもバラっぽい感じはあります。
(私だけ??)
データ数をもっと増やせば解決できると考えます。
まとめ
配膳された肉の部位を分類できるか検証しました。
検証した結果、少ないデータ数でも正解率が9割を超えたことから、十分可能であると考えます。
また、肉のどこを重視して分類しているか確認しました。
アクティベーションマップを確認した結果、脂身の模様を重視しており、バラは波模様、ロースは網目模様を認識していました。
おわりに
DataRobotを使用した感想
トライアル版でサンプルや自分で用意したデータなどを用いて実装しましたが、結構楽しかったです。
実装がとても楽で、すぐに試すことができます。
画像分類なら、フォルダに画像を入れてアップロードするだけでそれなりの物ができます。
結果の確認も容易で、トライ&エラーがすぐできます。
上司から「会社にAIは導入できないのか?」と日々言われている社員(私もです)は、一度トライアル版で試すことをおすすめします。
おまけ
こちらの記事でデプロイもしてみました。
撮影時は、店員さんから変な目で見られていたような気がします。
しゃぶ葉のワッフルドッグにめっちゃはまりました。
おいしい思いもして勉強もできて最高でした。
追記
本記事が、DataRobot Advent Calendar 2020でDataRobot優秀賞をいただきました。
ご支援ありがとうございました!!
Qiitaアドカレ DataRobot賞 結果発表
DataRobotサンタから、「NVIDIA Jetson Xavier NX Developer Kit 開発キット」をプレゼントしてもらいました。
今度はこれを使って、AIかROSに関する記事を書こうかなと思います。