:AWSTL;DR部屋の実例写真の中から特定の商品を機械学習により検出する実験をしてみた。Truthを、モデルはSageMakerビルトイン物体検出アルゴリズムを用いた。その中で得られた知見のまとめ。イントロRoomClipで機械学習周りの業務を中心に取り組んでおりますインターン生の松本です。RooomClipにはユーザーの皆様から投稿していただいた素敵なお部屋の写真や、アイテム・商品の実例写真がたくさん蓄えられております。お部屋の実例写真が360万枚以上、という世界的にもレアなデータセットを抱える弊社では、現在このデータセットから新しい示唆を得るためにここ数年話題の機械学習を導入するプロジェクトを進めています。SageMakerを試しに使ってみようということになりました。今回はSageMakerを用いる題材として、ユーザーの皆様から投稿していただいた画像から特定の商品を検出するというお題に取り組んでみました。Truthを採用してみました。物体検出アルゴリズムそのものは、SageMakerのビルトインアルゴリズム(SSD)を使用しました。これらを連携させて使用していく中で、便利な点・不便な点などが見えてきたので、得られた知見についてここで共有していきたいと思います。実際にサービスを使用する方の参考になればと思います。本記事の情報はあくまで2019年5月末時点でのもので、AWSのサービス(特にSageMaker周り)は相当早いペースで顧客からのフィードバックを受けながらアップデートで強くなっていくので、常に最新の情報を追っていただく必要があるという点についてはここで一応言及させていただきます。SageMakerの使い方の概略https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/whatis.htmlサービスの詳しい説明自体は↑をご参照いただければと思います。した理解としては機械学習のワークフローをノートブックインスタンストレーニングジョブエンドポイントという3つの形で提供するサービスです。1つのサービスを使用するために残り2つも使わなければならないというわけではなく、どれか1つだけ使用するといった使い方にも対応しています。jupyterlab)をクラウド上で使用するためのインスタンスになりますが、SageMakerの本来の使い方としては、このインスタンス上で学習を行うわけではありません。SDKなるライブラリを用いて、トレーニングジョブと呼ばれる「学習用コンテナ」をノートブックインスタンスとは別に立ち上げ、その中で行います。その際の学習・推論データの置き場所はS3のPathを指定することになります。学習したモデルをデプロイする手段として「エンドポイント」を立ち上げることができます。推論タスクはトレーニングジョブとは別の「推論用コンテナ」を立ち上げることで、その中で行います。一般的に、推論には学習の時に必要となるほどのマシンリソースを要さないので、軽めのインスタンスで問題ありません。Truthでラベリングジョブを作成SageMakerについての簡単な説明を終えたところで、今回の実験の手順の話に入ります。今回は画像に対する「物体検出アルゴリズム」を使用していくので、アノテーション作業を行う必要があります。Truthというサービスの一環としてAWSから提供されています。Truthでアノテーションを行う際には「ラベリングジョブ」を立ち上げることになります。このジョブに「ワーカー」を招待することによってチームで分担してアノテーション作業を行なっていくことができます。アノテーション作業を外注したいというケースにも対応しており、コンソール画面から直接ベンダーにアノテーション作業の発注を行うことができます。自動ラベリング機能も搭載されています。確実性の面では全て手動で行うのが良いので今回は自動ラベリング機能を使用せず、自分たちで直接アノテーションを行いました。使用して、良かった点と改善が望まれる点を整理してみました。各行(各オブジェクト)は一枚の画像のアノテーション情報を含んでいます。SageMakerビルトインアルゴリズムと相性がよいように作られていますが、一般的にgithubなどで公開されている物体検出アルゴリズムはVOCデータセットの形式(xml)かCOCOデータセット形式(json)のアノテーションファイルの存在を前提としている場合が多く、.manifestから変換するのは若干厄介です。物体検出用によく使われるアノテーションファイルの書式に対応してもらえると大変助かるなと思いました。ラベリングジョブが再開できない、といった仕様によって次のようなケースで困ることがあります。「ある物体を検出するために300枚アノテーションすれば十分かな?と思ったが、足りなかった時のために多めに600枚の画像をプールしてラベリングジョブを立ち上げた。枚数が足りなかった場合アノテーションを一からやり直し?」このあたりは不便に思っているユーザーは多いと思うので、さほど遠くないうちにアップデートで解決されるのではないでしょうか。Truthは非常に快適な環境を提供してくれるので、今後のアップデート次第ではスタンダードとして定着する可能性のあるサービスだと思います。SDKを使うという方法の選択肢がありますが、前者はあまりオススメしません。立ち上げ〜エンドポイント立ち上げまで行ってしまうとデータの形式などが何もわからないまま進んでしまうため、立ち上げたエンドポイントにどんな形式でPOSTすれば求める出力が返ってくるのかが見えづらくなる。ドキュメンテーションにたまに誤りがあり、GUIコンソールだとデバッグの手立てがないことが挙げられます。SDKの使用がオススメです。https://sagemaker.readthedocs.io/en/stable/↑readthedocsのドキュメントはかなりわかりやすく書かれており、痒いところに手が届きます。cliをインストールすればローカルマシンの実行環境から立ち上げることが可能です。学習に使用するデータを細かく手元でいじりたいという場合にはローカルマシンを開発環境とすることをお勧めします。SDKを使用する場合、一からドキュメンテーションをみながらコードを書くのは骨が折れるので、AWSが用意している以下のリポジトリを最大限活用しましょう。https://github.com/awslabs/amazon-sagemaker-examplesSageMakerのよくある使い方について、テンプレートとなるipynbファイルが豊富に用意されています。これを適宜ご自身の目的に合わせてmodifyしながら使っていくのが一番早いかと思います。今回のように、.manifestファイルから物体検出のトレーニングジョブを生成する場合↓の後半部分を参考にされると良いと思います。今回は1種類の物体(電子ケトル)のみを検出する実験を行いました。学習により作成したモデルを用いて、学習に使用していない画像約150枚について推論させてみたところ、結果は以下のようになりました。threshold(閾値)は0.5としています。検出できなかった写真の中にも、がっつりケトルの全体像が写っているものも存在しているのが不思議ですね。以上から、簡単に代表的なモデルの評価指標をサクッと計算してみます。1Precision(適合率)これは「モデルが検出した物体のうち、何割が本当にその物体であったか」を意味する指標になります。0.941と計算できます。モデルが検出した物体のうち94%は実際に検出を試みたケトルであったということになります。2Recall(再現率)これは「実際に写っていたケトルのうち、いくつが検出されたか」を意味する指標になります。0.74574.5%が検出できたということになりますね。3F値これは適合率と再現率の調和平均になります。0~1の間の値をとり、1に近いほど良い値となります。0.831(補足:本来は物体検出の場合mAPという平均適合率を計算することで評価するべきではあります)このモデルの私たちの使用用途としては、「膨大な画像データセットの中から目的のものを見つけ出す」という使い方になるかと思います。それを念頭においたとき、「見落とし」の多さはさほど重要ではなく、「モデルが検出した画像が間違った物体を認識していないこと」が私たちにとっては重要な指標となります。それを考えると、SSDは現在最新・最良のアルゴリズムではないとはいえ私たちの目的には十分役立つものである可能性があります。その評価には・今回のデータセットは特定のケトルのタグがついた画像をクエリで取得することによって形成したものですが、条件を指定せずに適当に持ってきた画像の中から正しくケトルを検出できるか・他社製の別のケトルとラベルを貼り分けて学習させることによって、「一般的なケトル」を検出せず「特定のケトル」を検出するに至るかといった検証を追加で行う必要がありそうです。SageMakerを用いたワークフローの確認がメインの目的であったため、簡素な検証に留めました。まとめいかがでしたでしょうか。Detector)というアルゴリズムを基にしており、現在最良とされている物体アルゴリズムではありませんが、そこそこの精度で物体を検出できます。AWS上で提供されるモデルの学習およびデプロイを行うためのワークフローはとてもスムーズでした。情報がまとまっていなかったり不足している部分があると感じていたので、本記事ではこれからSageMakerを使う人向けに補足情報をまとめてみました。TensorFlowやPyTorchの書き方やその裏の原理を把握していなくても、サービスとしてある程度のAIシステムが導入できてしまうのは非常に画期的だと思います。気になっている方がおりましたら試しに一度使用してみてはいかがでしょうか。この記事を書いた人:まつもとRoomClipで機械学習周りでインターンしてます。〜アーキテクチャ編〜」に参加し、『アプリのための「レイヤー化」アーキテクチャ』というタイトルで発表させてもらいました。どのように解決してきたかという内容になります。興味があれば見ていただけたら幸いです。この記事を書いた人:鷲田ルームクリップのアプリケーションエンジニア。