Amazon Web Services ブログ

アセットライブラリにおける課題:機械学習を利用したプロダクションパイプラインの高速化

利用したいテクスチャをライブラリから探す作業は非常に手間がかかる作業です。Amazon RekognitionやAmazon Machine Learning APIを利用することで、テクスチャへのタグ付けを行い、高速な検索が実現できます。

ゲーム開発では一般的に”painter’s pallet(画家のパレット)”として扱われるテクスチャやシーンを扱う巨大なアセットライブラリを持っています。これらは3Dのランドスケープや地形を表現するために利用されており、データの選択によって世界観をを変えることができるため、非常に重要なものとなります。テクスチャによっては実生活の風景や漫画の陰影、セル画調での世界滅亡の風景などを自由に表現することができます。

膨大な数のデータが保存されているライブラリから、何千ものテクスチャを選ぶことも珍しいことではありません。その場合、まれに正しいタグが付与されていなかったり、ファイルやフォルダ名に依存することで生じる誤解などが問題となります。より正確性を向上するために、正確なタグ付けを手作業によって行うことは非現実的でとてつもない作業になるでしょう。

正確なタグ付けを実現するために、1人または複数人でデータを確認し、意見を集め、その情報によって各ファイルにタグ付けをする必要がありますが、どんなシナリオでも非常に多くの時間がかかります。

しかし、機械学習を利用したAmazonの画像認識サービスであるAmazon Rekognitionを使えば、これらの作業を非常に簡単に高速に行うことができます。アーティストがファイルを開くのに40秒かかり、画像を見て意見を集め、複数のタグを書き込んでデータベースに格納する場合、5,000ファイルを処理するのに約55時間を要します。Amazon Rekognitionを利用する場合、画像のアップロードをバッチ処理することが可能で、私たちのテストコードでは200Mbpsの速度でアップロードしたところ3分未満で完了しました。


試してみましょう!

もし1枚の画像で試す場合、こちらをご確認ください。画像をアップロードし、レスポンスを確認するだけです。

https://console.aws.amazon.com/rekognition/home?region=us-east-1#/label-detection

もちろん、SDKもご利用になれます。こちらのページからインストールできるAWS SDKを利用します。

https://aws.amazon.com/tools/#sdk

それでは、特定のフォルダで簡単なサンプルを動かしてみましょう。ご紹介するサンプルはフォルダの中のすべてのJPEG/PNGファイルをAmazon Rekognitionにアップロードし、メタタグをファイル名と一緒にSQLiteに保存します。また、簡単な検索機能も提供します。

今回はPythonを使ったシンプルな例をご紹介します。もしあなたがPythonのファンではない場合は、AWS SDKでサポートされているお好みの言語を利用いただくことができます。

まずはAWS SDK for Pythonをこちらの手順に沿ってインストールします。

https://boto3.readthedocs.io/en/latest/guide/quickstart.html

最も早い方法は”Boto3″パッケージのインストールです。

pip install boto3

また、AWSアクセスキーの設定をAWSマネージメントコンソール(https://console.aws.amazon.com)から行います。

[IAM]-[ユーザー]-[認証情報]-[アクセスキーの作成]をクリックしてください。

アクセスキーIDとシークレットアクセスキーをメモし、以下のクイックスタートの設定ファイルを編集してください。(Macの場合は”~/.aws/credentials”、Windowsの場合は”%USERPROFILE%\.aws\credentials”となります。)

あとは数行のコードで実行することができます。

1. boto3のライブラリをインポートします。

import boto3

 

2.  利用するリージョンをRekognition APIに設定します。

def detect_labels(bucket, key, imagebytes=None, max_labels=6, min_confidence=70, region="us-east-1"):
rekognition = boto3.client("rekognition", region)

 

3. “detect_labels”の呼び出しで検出するイメージのサイズ(バイト)とS3バケット,ファイルを渡します。ラベルの最大数と最小限の信頼度を含めることができます。

詳しい解説はこちらをご覧ください。http://boto3.readthedocs.io/en/latest/reference/services/rekognition.html

(base64-encodedイメージの場合はサイズのみを渡すだけとなります。)

もしイメージのサイズがない場合、は以下のいずれかになります。

request = {"S3Object": {"Bucket": bucket, "Name": key, }}

もしくは

request = {"Bytes": imagebytes}

response = rekognition.detect_labels(
        Image=request,
        MaxLabels=max_labels,
        MinConfidence=min_confidence,
)

4. レスポンスの中にラベルと信頼度:confidence(%)が含まれている’Labels”リストがあるので、パースします。


最後に

特定のフォルダの画像を選択し、各画像のタグ情報でローカルのデータベースを更新、フレーズに一致するすべての画像を表示するデモを用意しました。コードはこちらになります。

https://github.com/AmazonGameTech/AWSTextureML

また、こちらの動画でコードを解説しています。

Amazon Rekognitionのドキュメントも参考にしてください。

https://docs.aws.amazon.com/rekognition/latest/dg/what-is.html

もしいいアイデアやご要望がありましたら、ぜひAWSまでご連絡ください。


ブログ投稿者について

Royal O’Brienは、1978年の最初のTRS-80以来ソフトウェア開発に従事。10代の頃から複数のソフトウェア言語やハードウェアのハッキングを行う。米国海兵隊の訓練やF/A-18機関連での4年間の仕事を経て、起業家となる。複数の起業で、VoIP、ビデオ補正、ビデオゲームソフトウェアの配信技術のためのプロセス関連の特許を取得。現在はコード、プロセス、インフラストラクチャーレベルで複数のゲーム会社と仕事をしており、ビジネス・マーケティング、財務の側面についての指針も提供している。また、複数のゲームで世界トップランクのギルドをリードするなどのハードゲーマーでもある。

 

– ソリューションアーキテクト 吉田