Amazon Web Services ブログ

[詳解] Amazon Rekognition Custom Labels で特定の動作を認識する機械学習モデルを作る

このブログは、AWS ブログ「Amazon Rekognition Custom Labelsを利用した動物の特徴的な行動検出」における物体検知モデルを作る手順を詳細に説明したものです。

画像に何が写っているのかや、特定の物体が写っているか、どこに写っているのかを知るために機械学習を使うことがよくあります。しかし、機械学習の知識や経験を得ることは簡単ではないため、自分で機械学習モデルを作ることを諦めている方もいらっしゃるかもしれません。

Amazon Rekognition は、機械学習に詳しくない方でも簡単に機械学習を使った画像分析をご利用いただくためのサービスです。Amazon Rekognition に画像を入力すると、画像に何が写っているのか、有名人の誰が写っているのか、写っている人がどんな表情なのかなどを知ることができます。これらの機能は、あらかじめ決められている対象を分析することができるものですが、お客様が独自に定義した被写体を抽出したり、画像のシーンを特定したい場合は、Amazon Rekognition Custom Labels をお使いいただくことができます。お客様によって用意された画像と各画像に紐づけられたラベル情報を使用して、Amazon Rekognition Custom Labels はお客様独自の機械学習モデル(物体検知モデル、もしくは、シーン分類モデル)を作成します。

2020年8月現在、Amazon Rekognition Custom Labels は静止画のみに対応しており、動画を入力とすることはできません。しかし、動画を連続する静止画に分割してその静止画を使ってモデルを作成することで、指定した動作を検出することができます。動作を検知するモデルを作るおおまかな手順は以下の通りです。(1) まず動画ファイルを準備し、(2) それをフレーム単位などで連続静止画に分割します。25 fps で撮影された 10秒の動画をフレーム単位で静止画に分割した場合、250 枚の連続静止画を取得できます。次に、(3) 連続静止画に対して検知したい動作に対するアノテーションを行います。(4) 最後にアノテーションデータと画像を入力として物体検知モデルを学習させます。

物体検知モデルの学習が終わったら、以下の手順で動作の検知を行います。(5) 検知したい動画がある動画を連続静止画にし、それを物体検知モデルを使って推論させます。(6) その結果得られた物体検知済みの連続静止画を、(7) ツールを使って動画に変換します。

動作を検知するモデルの作成

さて、ここからは上記手順を詳しくみていきます。以降の手順は、すべて同じリージョンを使用してください。この記事ではバージニア北部リージョンを使用して説明します。まずは (1) 動画ファイルの準備です。本ブログでは、こちらの動画を使用します。この動画は mixkit からお借りしました。

動画を連続静止画に分割してラベリング

次は手順 (2)(3) の、動画を連続静止画に分割してラベリングする部分です。動画を連続静止画に分割してラベリングする方法はいくつかありますが、今回は OpenCV を使って自分で動作を静止画に分割し、Amazon SageMaker Ground Truth の静止画ラベリングツールを使ってラベリングする方法をご紹介します。

まず AWS コンソールから AWS Cloud9 のコンソールにアクセスし、Create environment ボタンから環境を作成します。はじめに環境の名前を入力する必要があるので任意の名前を入力して Next step に進み、次のページの Environment settings はデフォルトのままで Next step に進み、最後に Create environment をクリックします。数分待って環境が起動したら、画面の下部に表示されたターミナルで以下のコマンドを実行して OpenCV をインストールします。AWS Cloud9 の環境立ち上げ方法は、こちらの記事(【Nyantech ハンズオンシリーズ】機械学習を使って写真に写っている猫を見分けてみよう!) の「AWS Cloud9 の環境の立ち上げ」部分で詳しく説明されていますのでご参照ください。

python3 -m pip install opencv-python

AWS Cloud9 の環境が立ち上がったら、File → New File を選択して新しいファイルを作成し、以下のコードの 5 行目の videoFile = “cat_punch.mp4” を実際に使用するファイル名に書き換えて mov2stills.py として保存します。次に、AWS Cloud9 の左側のファイルエクスプローラの mov2stills.py と同じ階層に動画ファイルをローカル PC からドラッグ&ドロップでアップロードします。

import os
import cv2

# set movie file path
videoFile = "cat_punch.mp4"

def divideVideo():

    if not os.path.isdir('image'):
        os.mkdir('image')

    # read movie file
    cap = cv2.VideoCapture(videoFile)
    
    # divide into the continuous still images and save them as PNG format image.
    while(cap.isOpened()):
        frameId = cap.get(1) #current frame number
        print("Processing frame id: {}".format(frameId))
        ret, frame = cap.read()
        if (ret != True):
            break
        name = 'image/image_' + str(int(frameId)).zfill(4) + '.png'
        cv2.imwrite(name, frame)
    
    cap.release()

divideVideo()

AWS Cloud9 のターミナルで以下のコマンドを実行すると、image フォルダに連続静止画が保存されます。

python mov2stills.py 

上記コマンドがエラーなく完了できたら、AWS Cloud9 のターミナルで以下のコマンドを実行して連続静止画を Amazon S3 にアップロードします。以下のコマンドの <BUCKET_NAME> 部分は、自分のバケット名に書き換えてください。

aws s3 cp image s3://<BUCKET_NAME>/catmov —recursive

Amazon SageMaker Ground Truth を使ったアノテーション

ここからは、手順 (3) のアノテーション部分です。以下の図は今回のサンプルを使用して Amazon SageMaker Ground Truth でラベリングする例です。猫がパンチしていない場合は normal というラベルを選択して猫を囲み、パンチをしている場合は punch というラベルを選択して猫を囲みます。Amazon SageMaker Ground Truth でラベリングジョブを作成するには、こちらの記事 の「ステップ 2 : 画像にラベルをつける」の手順を実施してください。リンク先の記事の手順において画像が保存されている Amazon S3 パスを指定する際は、連続静止画が保存されている S3 パスを指定します。リンク先の記事では、タスクの選択時に「イメージの分類」を選択していましたが、今回静止画ラベリングツールを使用する場合は「境界ボックス」を選択することで、今回必要な物体検知のためのラベリングジョブを作成することができます。

 

 

こちらは、猫がパンチをしている画像としていない画像の例です。パンチ中は動きが早いため、手がブレて写っていることがわかります。このブレ具合を頼りにアノテーションをしていきます。

 

Amazon Rekognition Custom Labels で物体検知モデルの作成

こちらでは、手順 (4) のモデルの学習を行います。こちらの記事 に詳しい手順が記載されているので、その手順に従って「モデルの確認」の手順まで実施します。ここまでで、指定した動作を検知するモデルを作成できました。

推論(動作検知)と結果の確認

こちらでは、手順 (5) から (7) までをまとめて行います。今回は非常に少ない枚数の画像しかモデルの学習に使用していないため、汎用的な画像に対する精度は望めません。そのため、作成したモデルの推論結果の確認には、モデルの学習に使用した動画を使って以下の手順で行います。

  • Amazon Rekognition Custom Labels の推論エンドポイントを起動する
  • モデルの学習に使用した画像を使って推論する
  • 得られた推論結果を画像に重畳して動画に変換する

推論エンドポイントの起動

こちらでは、推論を行うために使用する推論エンドポイントを起動します。Amazon Rekognition Custom Labels のコンソールの左側のメニューの Projects をクリックし、今回作成したモデルをクリックすると、モデルの詳細画面が表示されます。こちらの画面を一番下までスクロールすると、API Code と書かれた部分があるのでこちらをクリックして展開します。このとき、Amazon Resource Name (ARN) の部分に、arn: で始まる文字列が書かれているので、それをメモしておきます。

すると、Start model、Analyze image、Stop model の 3つのコマンドが表示されます。ここの Start model のコマンドをコピーし、AWS Cloud9 のターミナルから実行して推論エンドポイントを起動します。ターミナルに “Status”: “STARTING” というログが表示されれば OK です。推論エンドポイントが起動するまでには 5分から 10分程度かかります。

推論の実行と動画への変換

こちらでは、先ほど起動した推論エンドポイントに画像を入力して推論し、得られた結果を画像に重畳したものを動画として出力します。AWS Cloud9 で File → New File をクリックして新しいファイルを作成し、以下のコードを記載し、projectVersionArn = “<MODEL ARN>” の部分に、推論エンドポイントの起動 の手順でメモしておいた ARN に書き換えます。また、9 から 11行目の、動画のフレームレートやサイズの情報も使用する動画に合わせて書き換えます。最後に、motion_detect.py として保存します。

import boto3
import cv2
import glob

# set Amazon Rekognition Custom Labels's project ARN
projectVersionArn = "<MODEL ARN>"

# set movie's information
frame_rate = 25
width = 1920
height = 1080

def analyzeVideo():

    # settings for make video file
    fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
    writer = cv2.VideoWriter('sample.mp4', fourcc, frame_rate, (width, height))
    
    rekognition = boto3.client('rekognition')
    file_list = sorted(glob.glob("image/*"))

    # analyze each image
    for i, d in enumerate(file_list):
        frameId = i+1 #current frame number
        print("Processing frame id: {}".format(frameId))
        frame = cv2.imread(d)
        hasFrame, imageBytes = cv2.imencode(".png", frame)
        
        # analyze an image using Amazon Rekognition Custom Labels endpoint
        response = rekognition.detect_custom_labels(
            Image={
                'Bytes': imageBytes.tobytes(),
            },
            MinConfidence = 87,
            ProjectVersionArn = projectVersionArn
        )
    
        # draw rectangles on an image using the analysis results
        for output in response["CustomLabels"]:
            print(output)
            Name = output['Name']
            Confidence = 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)
            
            if Name == 'normal':
                cv2.rectangle(frame,(left,top),(left+w,top+h),(0,255,0),2)
                cv2.putText(frame, Name + ': ' + str(round(Confidence, 2)), (left+w+10, 200)
                , cv2.FONT_HERSHEY_SIMPLEX,2,(0, 255, 0), 2, cv2.LINE_AA)
            else:
                cv2.rectangle(frame,(left,top),(left+w,top+h),(0,0,255),2)
                cv2.putText(frame, Name + ': ' + str(round(Confidence, 2)), (left+w+10, 200)
                , cv2.FONT_HERSHEY_SIMPLEX,2,(0, 0, 255), 2, cv2.LINE_AA)
                           
        writer.write(frame)

    writer.release()

analyzeVideo()

ターミナルで以下のコマンドを実行すると、sample.mp4 が保存されます。

python motion_detect.py 

AWS Cloud9 の画面の左側のファイルエクスプローラで sample.mp4 を右クリックして、Download を選択するとローカルに動画を保存することができます。ダウンロードが終わったら、sample.mp4 を再生します。

ダウンロードした sample.mp4 を再生してみます。猫がパンチをしているときに赤い枠が、パンチをしていないときに緑の枠が表示されていることがわかります。motion_detect.py の 34 行目の MinConfidence = 87 の数値を小さくすると Confidence value が小さい枠も表示されるようになるため、猫の顔などの不要な部分に枠が表示されることがあります。

リソースの削除

Amazon Rekognition Custom Lables エンドポイントの停止

Amazon Rekognition Custom Labels のエンドポイントは起動中継続して課金されるため、使用しなくなったら停止させる必要があります。停止の際は、AWS Cloud9 のコンソールで Stop model のコマンドを実行します。Stop model のコマンドは、推論エンドポイントの起動 で使用した Start model のコマンドの下に記載されているので、そちらをコピーして使用します。

AWS Cloud9 の環境の削除

AWS Cloud9 のコンソールから今回使用した環境を選択し、画面の上側にある Delete をクリックします。削除の確認画面が出たらテキストボックスに Delete と入力して Delete ボタンをクリックします。

Amazon S3 に保存したデータの削除

Amazon S3 のコンソールでバケット一覧画面を表示し、以下の手順でバケットを削除します。今後このデータを一切使用しないことが確実になってからこの作業を実施してください。

  1. バケット名の左側のラジオボタンを選択し、 [削除] ボタンをクリック
  2. テキストボックスにバケット名を入力し、[バケットを削除する] ボタンをクリック

まとめ

Amazon Rekognition Custom Labels を使って、特定の動作を検知するモデルを作成することができました。今回は学習データが少なかったため、学習で使用した動画を使って推論まで行いましたが、実際は汎用的なモデルを作ることが目的になります。その場合はより多くの画像を学習させる必要がありますので、Amazon SageMaker Ground Truth を使って複数のワーカーでアノテーションし、十分な量の教師データを使ってモデルを学習させるなどの対応が必要です。
このブログの内容がみなさまのお役に立てば幸いです。

 


著者について

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

 

 

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