Amazon SageMakerとAmazon Rekognitionを使用して、画像内の車の位置を検出するためのコンピュータビジョンモデルを構築してトレーニングする

Amazon SageMakerとAmazon Rekognitionを使用して、車の位置を検出するためのコンピュータビジョンモデルを構築・トレーニングする

コンピュータビジョン(CV)は、機械学習(ML)やディープラーニングの最も一般的な応用の1つです。使用例は、自動運転車、ソーシャルメディアプラットフォームでのコンテンツモデレーション、がん検出、自動欠陥検出などがあります。Amazon Rekognitionは、事前のMLの経験を必要とせずに、オブジェクト検出、ビデオセグメント検出、コンテンツモデレーションなどのCVタスクを実行できるフルマネージドサービスです。一部の場合では、非常に特定の問題を解決するために、サービスと一緒によりカスタムなソリューションが必要になることもあります。

この記事では、オブジェクトの姿勢、位置、方向が重要な使用例にCVを適用できる領域について取り上げます。そのような使用例の1つは、画像のアップロードが必要な顧客向けモバイルアプリケーションです。これは、コンプライアンスのためであるか、一貫したユーザーエクスペリエンスを提供し、エンゲージメントを向上させるためかもしれません。たとえば、オンラインショッピングプラットフォームでは、製品が画像で表示される角度がこの製品の購入率に影響を与えます。車の位置を検出するというケースもあります。AWSクラウド上でこの問題を解決するために、よく知られたMLソリューションをポストプロセッシングと組み合わせてどのように対処するかを示します。

この問題を解決するために、ディープラーニングモデルを使用します。ポーズ推定のためのMLアルゴリズムのトレーニングには、多くの専門知識とカスタムトレーニングデータが必要です。どちらの要件も入手が困難でコストがかかります。したがって、2つのオプションを提案します。1つはMLの専門知識を必要とせずにAmazon Rekognitionを使用し、カスタムのMLモデルをトレーニングおよび展開するためにAmazon SageMakerを使用するものです。最初のオプションでは、Amazon Rekognitionを使用して車のホイールを検出します。次に、ルールベースのシステムを使用して、ホイールの位置から車の方向を推論します。2番目のオプションでは、Detectronモデルを使用してホイールおよび他の車の部品を検出します。これらは再びルールベースのコードを使用して車の位置を推論するために使用されます。2番目のオプションはMLの経験を必要としますが、よりカスタマイズ可能です。たとえば、画像から車全体を切り取るための追加のポストプロセッシングに使用できます。これらのオプションの両方は、公開されているデータセットでトレーニングすることができます。最後に、Amazon API GatewayやAWS Amplifyなどのサービスを使用して、この車の姿勢検出ソリューションを既存のWebアプリケーションに統合する方法を示します。

ソリューションの概要

以下の図は、ソリューションアーキテクチャを示しています。

このソリューションは、AmplifyのモックWebアプリケーションで、ユーザーが画像をアップロードし、Amazon RekognitionモデルまたはカスタムのDetectronモデルを呼び出して車の位置を検出できるようにするものです。各オプションに対して、モックアプリケーションに公開されるAPI Gatewayの背後にAWS Lambda関数をホストします。Lambda関数は、SageMakerでトレーニングされたDetectronモデルまたはAmazon Rekognitionと共に実行されるように設定されています。

前提条件

この手順では、次の前提条件を満たしている必要があります。

  • AWSアカウント。
  • インフラストラクチャを展開およびプロビジョニングするための権限を持つAWS Identity and Access Management(IAM)ユーザー(たとえば、PowerUserAccessです)(本番用のアプリケーションにはパーミッションをさらに制限し、他のサービスとの統合に依存する可能性があります)。
  • 開発環境(ローカルマシンまたはSageMakerノートブックインスタンス)にDockerがインストールされていること。
  • AWS Cloud Development Kit(AWS CDK)がインストールされていること。GitHubリポジトリで説明されているように、npmを使用してインストールできます。

Amazon Rekognitionを使用したサーバーレスアプリの作成

最初のオプションでは、Amazon Rekognitionを使用して画像内の車の方向を検出する方法を示します。アイデアは、Amazon Rekognitionを使用して車の位置とホイールを検出し、この情報から車の方向を導出するためにポストプロセッシングを行うことです。このソリューション全体は、Lambdaを使用して展開されるため、Githubリポジトリに示されているようにデプロイされます。このフォルダには、Lambda関数で実行されるDockerイメージを定義するDockerfileと、Lambda関数のメインエントリポイントであるapp.pyファイルの2つの主要なファイルが含まれています:

def lambda_handler(event, context):
    body_bytes = json.loads(event["body"])["image"].split(",")[-1]
    body_bytes = base64.b64decode(body_bytes)

    rek = boto3.client('rekognition')
    response = rek.detect_labels(Image={'Bytes': body_bytes}, MinConfidence=80)
    
    angle, img = label_image(img_string=body_bytes, response=response)

    buffered = BytesIO()
    img.save(buffered, format="JPEG")
    img_str = "data:image/jpeg;base64," + base64.b64encode(buffered.getvalue()).decode('utf-8')

Lambda関数は、ヘッダーとボディを含むイベントを期待しています。ボディは、base64でデコードされたオブジェクトとしてラベル付けする必要のある画像である必要があります。画像が与えられた場合、Lambda関数からBoto3を使用してAmazon Rekognitionのdetect_labels関数が呼び出されます。この関数は、画像内の各オブジェクトに対して1つ以上のラベルと、検出されたオブジェクトラベルのバウンディングボックスの詳細など、応答の一部として検出されたすべてのオブジェクトラベルのバウンディングボックスの詳細を返します。割り当てられたラベルの信頼度、検出されたラベルの祖先ラベル、ラベルの可能なエイリアス、検出されたラベルが属するカテゴリなど、その他の情報も返されます。Amazon Rekognitionによって返されるラベルに基づいて、label_image関数を実行し、次のように検出されたホイールから車の角度を計算します:

n_wheels = len(wheel_instances)

wheel_centers = [np.array(_extract_bb_coords(wheel, img)).mean(axis=0)
for wheel in wheel_instances]

wheel_center_comb = list(combinations(wheel_centers, 2))
vecs = [(k, pair[0] - pair[1]) for k,pair in enumerate(wheel_center_comb)]
vecs = sorted(vecs, key = lambda vec: np.linalg.norm(vec[1]))

vec_rel = vecs[1] if n_wheels == 3 else vecs[0]
angle = math.degrees(math.atan(vec_rel[1][1]/vec_rel[1][0]))

wheel_centers_rel = [tuple(wheel.tolist()) for wheel in
wheel_center_comb[vec_rel[0]]]

アプリケーションでは、画像には車が1台だけ存在することが求められ、それ以外の場合はエラーが返されます。ただし、ポスト処理はより詳細な方向の記述、複数の車のカバー、またはより複雑なオブジェクトの方向を計算するように適応させることができます。

ホイール検出の改善

ホイール検出の精度をさらに向上させるには、Amazon Rekognitionカスタムラベルを使用することができます。カスタムMLモデルのトレーニングと展開にSageMakerを使用してファインチューニングすることと同様に、独自のラベル付きデータを持ち込んで、Amazon Rekognitionがわずか数時間でカスタム画像分析モデルを生成できるようにすることができます。Rekognitionカスタムラベルでは、特定の使用ケースに固有の少数のトレーニング画像が必要であり、これはこの場合、特定の角度を持つ車の画像です。なぜなら、Amazon Rekognitionは多くのカテゴリを横断した数千万枚の画像でトレーニングされている既存の機能を使用しているからです。Rekognitionカスタムラベルは、わずか数回のクリックと、標準のAmazon Rekognitionソリューションに使用するLambda関数への小さな適応で統合することができます。

SageMakerトレーニングジョブを使用してモデルをトレーニングする

2番目のオプションでは、SageMakerでカスタムディープラーニングモデルをトレーニングします。カーパーツのセグメンテーションにはDetectron2フレームワークを使用します。これらのセグメントを使用して車の位置を推測します。

Detectron2フレームワークは、最先端の検出およびセグメンテーションアルゴリズムを提供するライブラリです。Detectronには、有名なCOCO(Common objects in Context)データセットでトレーニングされたさまざまなMask R-CNNモデルがあります。私たちの車両オブジェクト検出モデルを構築するために、車両パーツセグメンテーションデータセットで事前学習されたMask R-CNNモデルを転移学習して微調整します。このデータセットを使用して、ホイールだけでなく他の車のパーツも検出できるモデルを訓練することができます。この追加の情報は、画像に対する車の角度計算にさらに使用することができます。

データセットには、オブジェクト検出およびセマンティックセグメンテーションタスクに使用するための車のパーツの注釈付きデータが含まれています。セダン、ピックアップ、スポーツユーティリティビークル(SUV)の約500枚の画像があり、複数のビュー(フロント、バック、サイドビュー)で撮影されています。各画像は、ホイール、ミラー、ライト、フロントガラス、バックガラスなどの車の異なる部分を表す18のインスタンスマスクとバウンディングボックスで注釈が付けられています。ホイールのベース注釈を変更し、画像内のすべての利用可能なホイールを1つのオブジェクトとして考慮するのではなく、各ホイールを個別のオブジェクトとして扱います。

トレーニングに使用するデータセットとトレーニング済みモデルのアーティファクトを保存するために、Amazon Simple Storage Service(Amazon S3)を使用します。さらに、Lambda関数で実行されるDockerコンテナは、Amazon Elastic Container Registry(Amazon ECR)に格納されます。Lambda関数で使用するDockerコンテナには、コードを実行するために必要なライブラリと依存関係が含まれています。Lambdaレイヤーを使用することもできますが、Lambda関数に追加できるレイヤーの最大数は5つで、解凍された展開パッケージのサイズクォータは250 MBに制限されています。

私たちのソリューションはSageMaker上に構築されており、カスタムPyTorchトレーニングコードを実行するために、事前構築されたSageMaker Dockerコンテナを拡張しています。次に、SageMaker Python SDKを使用してトレーニングイメージをSageMaker PyTorchエスティメータにラップします。以下のコードスニペットに示すように:

d2_estimator = Estimator(
        image_uri=training_image_uri,
        role=role,
        sagemaker_session=sm_session,
        instance_count=1,
        instance_type=training_instance,
        output_path=f"s3://{session_bucket}/{prefix_model}",
        base_job_name=f"detectron2")

d2_estimator.fit({
            "training": training_channel,
            "validation": validation_channel,
        },
        wait=True)

最後に、作成したPyTorch Estimatorのfit()関数を呼び出してトレーニングジョブを開始します。トレーニングが終了すると、トレーニング済みモデルのアーティファクトがAmazon S3のセッションバケットに保存され、推論パイプラインで使用するために使用されます。

SageMakerと推論パイプラインを使用してモデルを展開する

独自のDetectronモデルを実行する推論エンドポイントをホストするために、SageMakerも使用します。ソリューションを展開するために使用される完全なインフラストラクチャは、AWS CDKを使用してプロビジョニングされます。PyTorch Estimatorのdeployを呼び出すことで、SageMakerリアルタイムエンドポイントを介してカスタムモデルをホストできます。これは、PyTorch Detectronを含めたプリビルドのSageMaker PyTorchコンテナを拡張する2回目の機会です。以下のように推論スクリプトを実行し、トレーニング済みのPyTorchモデルをホストします:

model = PyTorchModel(
        name="d2-sku110k-model",
        model_data=d2_estimator.model_data,
        role=role,
        sagemaker_session=sm_session,
        entry_point="predict.py",
        source_dir="src",
        image_uri=serve_image_uri,
        framework_version="1.6.0")

    predictor = model.deploy(
        initial_instance_count=1,
        instance_type="ml.g4dn.xlarge",
        endpoint_name="detectron-endpoint",
        serializer=sagemaker.serializers.JSONSerializer(),
        deserializer=sagemaker.deserializers.JSONDeserializer(),
        wait=True)

デモ用に最小の利用可能なGPUであるml.g4dn.xlargeを展開に使用したことに注意してください。推論スクリプトでは、2つのコンポーネントを設定する必要があります。モデルのロードとモデルの提供です。関数model_fn()は、ホストされているDockerコンテナの一部であるトレーニング済みモデルを読み込み、Amazon S3にも見つかるモデルオブジェクトを返してモデルの提供に使用されます。以下のようになります:

def model_fn(model_dir: str) -> DefaultPredictor:
  
    for p_file in Path(model_dir).iterdir():
        if p_file.suffix == ".pth":
            path_model = p_file
        
    cfg = get_cfg()
    cfg.MODEL.WEIGHTS = str(path_model)

    return DefaultPredictor(cfg)

関数predict_fn()は、予測を実行して結果を返します。トレーニング済みモデルの他にも、COCOデータセットでトレーニングされたMask R-CNNモデルの事前学習バージョンを使用して、画像のメインカーを抽出します。これは、複数の車が存在する画像に対処するための追加の事後処理ステップです。以下のコードを参照してください:

def predict_fn(input_img: np.ndarray, predictor: DefaultPredictor) -> Mapping:
    
    pretrained_predictor = _get_pretraind_model()
    car_mask = get_main_car_mask(pretrained_predictor, input_img)
    outputs = predictor(input_img)
    fmt_out = {
        "image_height": input_object.shape[0],
        "image_width": input_object.shape[1],
        "pred_boxes": outputs["instances"].pred_boxes.tensor.tolist(),
        "scores": outputs["instances"].scores.tolist(),
        "pred_classes": outputs["instances"].pred_classes.tolist(),
        "car_mask": car_mask.tolist()
    }
    return fmt_out

Amazon Rekognitionソリューションと同様に、wheelクラスに対して予測されたバウンディングボックスは検出出力からフィルタリングされ、出力に対して車の位置を評価するために事後処理モジュールに供給されます。

最後に、Detectronソリューションの事後処理も改善しました。異なる車の部品のセグメントを使用してソリューションを推論します。たとえば、フロントバンパーが検出されたが、バックバンパーがない場合、車のフロントビューと対応する角度が計算されます。

ソリューションをWebアプリケーションに接続する

モデルエンドポイントをAmplifyに接続する手順は次のとおりです:

  • AWS CDKスタックによって作成されたアプリケーションリポジトリであるcar-angle-detection-website-repoをクローンします。展開に使用したリージョンで検索していることを確認してください。
  • デプロイされた各Lambda関数のAPI Gatewayエンドポイントを、前述のリポジトリのindex.htmlファイルにコピーします(エンドポイントを配置する場所にプレースホルダがあります)。次のコードは、.htmlファイルのこのセクションの例です:
<td align="center" colspan="2">
<select id="endpoint">
<option value="https://ey82aaj8ch.execute-api.eu-central-1.amazonaws.com/prod/">
                Amazon Rekognition</option>
<option value="https://nhq6q88xjg.execute-api.eu-central-1.amazonaws.com/prod/">
                Amazon SageMaker Detectron</option>
</select>
<input class="btn" type="file" id="ImageBrowse" />
<input class="btn btn-primary" type="submit" value="アップロード">
</td>
  • HTMLファイルを保存し、コード変更をリモートのメインブランチにプッシュしてください。

これにより、デプロイメント内のHTMLファイルが更新されます。アプリケーションは今すぐ使用できる状態です。

  • Amplifyコンソールに移動し、作成したプロジェクトを見つけてください。

デプロイメントが完了すると、アプリケーションのURLが表示されます。

  • URLに移動し、UIを楽しんでください。

結論

おめでとうございます!完全なサーバーレスアーキテクチャをデプロイしました。Amazon Rekognitionを使用しましたが、独自のカスタムモデルのオプションも提供しました。この例はGitHubで利用可能です。チームにMLの専門知識がない、またはモデルをトレーニングするための十分なカスタムデータがない場合は、Amazon Rekognitionを選択できます。モデルに対してより制御を持ちたい、さらにカスタマイズしたい、十分なデータがある場合は、SageMakerのソリューションを選択できます。データサイエンティストのチームがいる場合は、モデルをさらに強化し、よりカスタムで柔軟性のあるオプションを選ぶこともできます。Lambda関数とAPI Gatewayをウェブアプリケーションの背後に配置するには、2つのオプションのいずれかを使用できます。また、このアプローチはコードを適応したい別のユースケースにも使用できます。

このサーバーレスアーキテクチャの利点は、ビルディングブロックが完全に交換可能であることです。機会はほぼ無限です。さあ、今日から始めましょう!

いつものように、AWSではフィードバックを歓迎しています。ご意見やご質問がありましたら、お知らせください。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

人工知能

X / Twitterでお金を稼ぐ方法

X(別名Twitter)は、クリエイターに広告収益の一部を支払い始めましたここでは、その一部を手に入れる方法を紹介します

機械学習

「深層学習を用いた深層オブジェクト:ZoeDepthはマルチドメインの深度推定のためのAIモデルです」

画像に子供が大人よりも高くて大きく見える錯覚に出くわしたことはありますか?エームスの部屋の錯視は、台形の形状をした部...

AI研究

『このAI研究は、IFPおよびリポソーム蓄積を予測するための物理ベースの深層学習を発表します』

がん治療の精緻化を追求する中、研究者たちは、腫瘍のダイナミクスを飛躍的に向上させる画期的な解決策を導入しました。この...

機械学習

BYOL(Bootstrap Your Own Latent)— コントラスティブな自己教示学習の代替手段

『今日の論文分析では、BYOL(Bootstrap Your Own Latent)の背後にある論文に詳しく触れますこれは、対比的な自己教師あり学...

機械学習

「NVIDIA BioNeMoがAWS上での薬剤探索のための生成型AIを可能にする」

主要な製薬会社やテクバイオ企業の研究者や開発者は、Amazon Web Servicesを通じてNVIDIA Claraソフトウェアとサービスを簡単...

機械学習

このAI論文では、革新的なAIフレームワークを使用したDeWaveが公開単語彙BCIのためのEEGからテキストへの翻訳を革新しています

GrapheneX-UTSヒューマンセントリック人工知能センター(シドニー工科大学(UTS))の研究者たちは、沈黙した思考を解読し、...