Amazon Web Services ブログ

Amazon Rekognition Custom Labelsを利用した動物の特徴的な行動検出

従来、人間は動物の動きを観察し、様々な目的のために利用してきました。例えば、生態学において動態観察は重要であり、いつその行動が起こるのか、どれぐらいの頻度か、個体差があるのかを観察しています。しかしながら、このような動態や動きを識別してモニタリングする事は難しく、長い時間を要する場合があります。そこで、このワークフローを自動化するために、大日本住友製薬株式会社のアジャイルチームのメンバーとAWSのソリューションアーキテクトで、 Amazon Rekognition Custom Labelsを利用したソリューションを開発しました。Amazon Rekognition Custom Labelsは、画像内の特定の動きのラベル付け、そのデータを元にしたトレーニング、検知したい動きのモデル作成を簡単に行う事ができます。

このブログでは、機械学習(ML)がどのようにしてこのワークフローの自動化に役立つのかを楽しく単純な方法で示すために、我々はAmazon Rekognition Custom Labelsを利用して動画に映る猫の特徴的な行動を検知するカスタムモデルを作成しました。我々はこのソリューションのアーキテクチャ、構築手順、ソースコードを公開する事で、上述の領域や生物学、それ以外の領域に寄与できればと考えています。

Amazon Rekognition Custom Labelsとは

Amazon Rekognition Custom Labelsは、機械学習の専門的技術は不要でAuto ML機能によりビジネスニーズに合わせた画像の物体やシーンを特定するお客様独自のカスタムモデルを素早く学習・構築する事ができます。例えば、カスタムモデルを作成する事で、ソーシャルメディアの記事から自社のロゴを検索したり、店頭で商品を特定したり、アセンブリラインで機械部品を分類する事ができます。

Amazon Rekognition Custom Labelsは、様々なカテゴリにわたる数千枚の画像を用いてトレーニングさせたAmazon Rekognitionの既存の機能を元に構築されています。そのため、数千枚の画像の代わりに、ご自身のユースケースに合わせた少量のトレーニング学習セット(通常は数百枚以下)をアップロードするだけです。既に画像にラベル付けされている場合は、数クリックでAmazon Rekognition Custom Labelsでの学習を開始する事ができます。ラベル付けされていない場合は、 Amazon Rekognition Custom Labelsのインターフェイスで直接ラベル付けするか、 Amazon SageMaker Ground Truthを使用してラベル付けする事ができます。

画像セットからAmazon Rekognitionがトレーニングを開始すると、わずか数時間でカスタム画像分析モデルが作成されます。その裏では、Amazon Rekognition Custom Labelsが自動的にトレーニングデータを読み込んで検証し、適切な機械学習アルゴリズムを選択してモデルのトレーニングを行い、モデルパフォーマンスメトリクスを提供します。トレーニング後は、Amazon Rekognition Custom LabelsのAPI経由でご自身のカスタムモデルを使用できるようになり、それをアプリケーションに統合する事が可能です。

ソリューション概要

以下の図がソリューションのアーキテクチャです。ご自身が作成したモデルをご用意頂ければ、動画ファイル(.mp4)をアップロードするだけで、動画内の特定行動の検出までのプロセスを自動化します。

ワークフローは次のステップです:

  1. Amazon Simple Storage Service (Amazon S3)への動画ファイル(.mp4)のアップロードによりAWS Lambdaを呼び出し、Amazon Rekognition Custom Labelsの推論エンドポイントとAmazon Simple Queue Service (Amazon SQS)を起動します。推論エンドポイントの起動には10分程度かかるため、ここではAmazon SQSの遅延実行を利用しています。
  2. Amazon SQSからAWS Lambdaを呼び出して推論エンドポイントのStatusチェックを行い、RunningであればAmazon Elastic Compute Cloud (Amazon EC2) を起動します。
  3. Amazon EC2のRunning StatusをAmazon CloudWatch Eventsで検知してAWS Lambdaを呼び出し、AWS Systems ManagerのRun CommandによりAmazon EC2上のスクリプトを起動します。
  4. EC2上ではスクリプト内でAmazon Rekognition Custom Labelsの推論エンドポイントを呼び出し、Amazon S3にアップロードされた動画の特定行動を検出して、その推論結果を動画に書き込みます.
  5. Amazon S3に推論結果のファイルがアップロードされると、AWS Lambdaが起動してAmazon EC2とthe Amazon Rekognition Custom Labelsの推論エンドポイントを停止します。

前提条件

こちらのソリューションを利用するには、以下が必要です:

  • AWSアカウント – 作成されていない方は、こちらからアカウントを作成してください。
  • Key pair – Amazon Rekognition Custom Labelsを利用して特定行動の検出を行うEC2インスタンスへログインするためにはキーペアが必要です。既存のキーペアの利用もしくは、新規にキーペアを作成しても構いません。詳細はこちらを参照ください。
  • 推論用の動画 – このソリューションでは推論のための動画(MP4フォーマット)が必要です。ご自身で用意した動画もしくは、本ブログで利用している動画を利用してください。

AWS CloudFormation stackの起動

AWS CloudFormation提供しているので、以下の「Launch Stack」をクリックしてください。

テンプレートの起動後、以下のパラメータ入力が求めらます:

  • KeyPair – EC2接続用の作成したキーペア名(例:ubuntu)
  • ModelName – Amazon Rekognition Custom Labelsのモデル名(例: my-model.2020-01-21T09.10.15)
  • ProjectARN – Amazon Rekognition Custom LabelsのプロジェクトARN (例: arn:aws:rekognition:us-east-1:123456789012:project/getting-started/1234567890123)
  • ProjectVersionARN – Amazon Rekognition Custom LabelsのモデルバージョンARN(例:arn:aws:rekognition:us-east-1:123456789012:project/getting-started/version/my-model.2020-01-21T09.10.15/1234567890123)
  • YourCIDR – ご自身のパブリックIPアドレスを含むCIDR(例:x.x.x.x/24)

このブログでは、こちらの動画を利用して 猫がパンチしているかどうかを検出しています。我々の動態検知モデルでは、次のセクションで示すように事前にアノテーションしたデータセットを用意して学習させています。

このソリューションはUS East (N. Virginia) Regionを利用しているので、以下の作業をする際はUS Eastで実施してください。

動画内の画像のアノテーション

画像のアノテーションから、動物の特徴的な行動を検出する機械学習モデルを作成するまでの手順は、こちらのブログで詳しく解説しています。

画像のアノテーションには以下の手順を実施します:

  1. 学習用の画像作成のため、動画を一連の画像に分割する必要があります。このブログでは、377枚の画像(NormalとPunchの割合は2:1) を準備してアノテーションしました。
  2. Amazon S3に一連の画像をアップロードしてアノテーションします。アノテーションには Amazon SageMaker Ground Truthを利用できます。
  3. 動態検知モデル作成のため、Task typeの設定でBounding boxを選択します。
  4. 今回のケースでは、動画内で猫がパンチしているかどうかを識別したかったので、次の2つのラベル使用してラベリングジョブを作成しました。normal は通常の静止している状態、punch は猫がパンチをしている状態を定義しています。
  5. アノテーションのため、猫がパンチしていない場合はnormalラベルのバウンディングボックスで猫を囲み、パンチしている場合はpunchラベルのバウンディングボックスで猫を囲みます。

猫がパンチしている時は猫の手がブレて写っているので、ブレ具合を確認しながらpunchnormalかを判断してアノテーションします。

カスタムモデルのトレーニング

カスタムモデルのトレーニングを開始するには、以下の手順を実施します:

  1. Amazon Rekognition Custom Labelsを利用してこちらの手順に従って行動検出モデルを作成します。
  2. データセットを作成する際、Image locationの設定でImport images labeled by SageMaker Ground Truthを選択します。
  3. Amazon SageMaker Ground Truthのラベリングジョブから出力されたoutput.manifestファイルパスを指定します。

output.manifestファイルのパスは、Amazon SageMakerコンソール上のLabeling jobsページで該当するラベリングジョブを選択すると、下図のようにLabeling job summaryページに情報が記載されています。

  1. モデルの学習が完了すると、モデル詳細画面の下部にあるUse your modelにAmazon Resource Name(ARN)をメモしてください。このARNはCloudFormationで求められるパラメータ入力で利用します。

参考までに我々のケースでは、normalpunchのF1 scoreは0.9以上でした。

Amazon S3へ推論用動画をアップロード

推論用の動画をアップロードする準備を行います。

  1. Amazon S3のコンソール画面から、CloudFormationで作成されたバケット(下図のように名前にrekognition が含まれています)を選択します.
  2. Create folderを選択します。
  3. inputMovieフォルダを作成します。
  4. このフォルダに推論したい動画をアップロードします。

Amazon EC2上のスクリプトのセットアップ

このソリューションでは、Amazon EC2でAmazon Rekognition APIを呼び出して動画を推論するため、Amazon EC2でのスクリプトのセットアップが必要です。

  1. 作成したキーペアを利用して以下のコマンドでSSHでAmazon EC2にログインします:
ssh -i <Your key Pair> ubuntu@<EC2 IPv4 Public IP>
Are you sure you want to continue connecting (yes/no)? yes
Welcome to Ubuntu 18.04.4 LTS (GNU/Linux 4.15.0-1065-aws x86_64)
ubuntu@ip-10-0-0-207:~$ cd code/
ubuntu@ip-10-0-0-207:~/code$ vi rekognition.py

インスタンスの設定に必要なライブラリのインストールやビルドには30分ほど時間がかかります。

  1. 下記のコードをrekognition.pyにコピーし、<BucketName> の箇所をAWS CloudFormationで作成されたAmazon S3バケットの名前に置換します。このコードではOpenCVを利用して動画をフレーム分割し、各フレームをAmazon Rekognition Custom Labelsの推論エンドポイントに投げて行動検出を行っています。推論結果をフレームにマージして、各フレームを繋ぎ合わせて動画を再構築しています。
import boto3
import cv2
import json
from decimal import *
import os
import ffmpeg

def get_parameters(param_key):
    ssm = boto3.client('ssm', region_name='us-east-1')
    response = ssm.get_parameters(
        Names=[
            param_key,
        ]
    )
    return response['Parameters'][0]['Value']

def analyzeVideo():
    ssm = boto3.client('ssm',region_name='us-east-1')
    s3 = boto3.resource('s3')
    rekognition = boto3.client('rekognition','us-east-1')
   
    parameter_value = get_parameters('/Movie/<BucketName>')
    dirname, video = os.path.split(parameter_value)
    bucket = s3.Bucket('<BucketName>')
    bucket.download_file(parameter_value, video)

    customLabels = []
    cap = cv2.VideoCapture(video)
    frameRate = cap.get(cv2.CAP_PROP_FPS)
    width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
    height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    writer = cv2.VideoWriter( video + '-output.avi', fourcc, 18, (int(width), int(height)))

    while(cap.isOpened()):
        frameId = cap.get(cv2.CAP_PROP_POS_FRAMES)
        print(frameId)
        print("Processing frame id: {}".format(frameId))
        ret, frame = cap.read()
        if (ret != True):
            break
        hasFrame, imageBytes = cv2.imencode(".jpg", frame)

        if(hasFrame):
            response = rekognition.detect_custom_labels(
                Image={
                    'Bytes': imageBytes.tobytes(),
                },
                ProjectVersionArn = get_parameters('ProjectVersionArn')
            )

            for output in response["CustomLabels"]:
                Name = output['Name']
                Confidence = str(output['Confidence'])
                w = output['Geometry']['BoundingBox']['Width']
                h = output['Geometry']['BoundingBox']['Height']
                left = output['Geometry']['BoundingBox']['Left']
                top = output['Geometry']['BoundingBox']['Top']
                w = int(w * width)
                h = int(h * height)
                left = int(left*width)
                top = int(top*height)

                output["Timestamp"] = (frameId/frameRate)*1000
                customLabels.append(output)
                if Name == 'Moving':
                    cv2.rectangle(frame,(left,top),(left+w,top+h),(0,0,255),2)
                    cv2.putText(frame,Name + ":" +Confidence +"%",(left,top),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0, 0, 255), 1, cv2.LINE_AA)
                else:
                    cv2.rectangle(frame,(left,top),(left+w,top+h),(0,255,0),2)
                    cv2.putText(frame,Name + ":" +Confidence +"%",(left,top),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0, 255, 0), 1, cv2.LINE_AA)

        writer.write(frame)
    print(customLabels)

    with open(video + ".json", "w") as f:
        f.write(json.dumps(customLabels))
    bucket.upload_file(video + ".json",'output-json/ec2-output.json')
    stream = ffmpeg.input(video + '-output.avi')
    stream = ffmpeg.output(stream, video + '-output.mp4', pix_fmt='yuv420p', vcodec='libx264')
    stream = ffmpeg.overwrite_output(stream)
    ffmpeg.run(stream)
    bucket.upload_file( video + '-output.mp4','output/' +video + '-output.mp4')

    writer.release()
    cap.release()

analyzeVideo()

EC2インスタンスの停止

スクリプトのセットアップが完了したらEC2インスタンスを停止します。Amazon S3に動画ファイルがアップロードされると、EC2インスタンスは自動的に起動します。

これでソリューションを利用する準備が整いました。

動画内の行動検出

ソリューションを実行するには、動画ファイル(.mp4) を先程作成したinputMovieフォルダにアップロードします。そうすると、下図のようにAmazon Rekognition Custom Labelsが起動されます。

エンドポイントのStatusがRunningに遷移すると、Amazon EC2が起動して行動検出の処理が行われます。行動検出された動画はAmazon S3のoutputにアップロードされます。

Amazon EC2にログインすると、下図のようにcodeフォルダに推論結果がマージされた動画ファイルが作成されている事を確認する事ができます。

Amazon S3に作成されたoutputフォルダに動画ファイルは格納されます。これをトリガーとしてAmazon Rekognition Custom LabelsとAmazon EC2が停止します。

下記の動画は、猫の特定の動き(punch)を検出した結果です。以下の画像をクリックすると新しいタブで動画が再生されます。

クリーンアップ

今後の不要な請求を避けるために、作成したリソースを削除してください。

結論と展望

このソリューションにより、動画内の特定行動の検出を自動化する事ができました。このブログでは、Amazon Rekognition Custom Labelsを利用して猫の特定行動を検出するモデルを作成しましたが、研究領域で大量にデータが存在する細胞画像の識別にも利用する事ができます。例えば、下図は白血球、赤血球、血小板を学習させたモデルでの推論結果です。学習させたデータセットは20枚程度ですが、人間の目でも判別可能な特徴を持つ細胞は検知できています。さらに高解像度のデータを増やし、より丁寧なアノテーションにより精度が高まる事が推察されます。

Amazon Rekognition Custom Labelsは研究領域において、幅広いユースケースで利用できます。Amazon Rekognition Custom Labelsを利用したい場合やご質問がある場合は、こちらにご連絡ください。
また、本ブログに記載しました動物の行動検出にご質問のある場合は、こちらにご連絡ください。


著者について

小泉 秀徳(Hidenori Koizumi)は、日本のヘルスケア・ライフサイエンスチームのソリューションアーキテクトです。理学のバックグラウンド(生物学、化学など)を活かした研究領域でのソリューション作成を得意としています。得意分野は機械学習で、最近ではReactやTypeScriptを利用したアプリケーション作成も行っています。趣味は旅行と写真撮影です。

 

 

 

 

大渕 麻莉(Mari Ohbuchi)は、機械学習ソリューションアーキテクトです。AWS にジョインする前は製造業での画像処理アルゴリズム開発に 10 年ほど従事。現在は、製造業および ISV/SaaS のお客様の機械学習導入をサポートしています。無類の猫好きで、AWS の AI/ML サービスと猫を絡めたブログやハンズオンコンテンツを作成しています。