[Amazon Sagemaker] Ground Truthによるビデオラベル付けを試してみました

2020.07.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

CX事業本部の平内(SIN)です。

先日、Amazon Sagemaker Ground Truth(以下、Ground Truth)でビデオのラベル付けがサポートされるようになりました。


新機能 – Amazon SageMaker Ground Truth による動画のラベル付け

こちらを利用すると、動画に対するアノテーション作業が、効率的に行えるということで、とりあえず、試してみました。

以下、作業している様子です。

2 動画の配置

元となる画像データは、動画(MP4)のままでも、また、フレームごと切り出した連続した画像のセットでも利用可能です。

今回は、動画(MP4)を元データとし、Ground Truthでフレームごとの画像を自動的に生成する要領で試してみました。

※使用するGround Truthと同じリージョンに配置する必要があります。

3 ラベリングジョブ作成

(1) 入力

ジョブ名(今回は、Video-Annotation-Sample-001としました)を指定し、S3 location for input datasetsで動画を配置したS3をバケットを選択します。

(2) 出力先

S3 location for output datasetsには、出力先を指定します。

(3) データセット

下記のように設定し、下記のsetupボタンを押すことで、入力バケットにある動画(MP4)からフレームを抽出してデータ画像を生成します。

Frame extractionでは、切り出すフレームの間隔を指定できますが、あまり間隔を開けすぎると、せっかくの自動推定がうまく機能しないので、動画の変化具合によって注意が必要そうです。

  • Data type : Video - individual frames
  • Video frames : Extract frames from videoInfo
  • Frame extraction : Use every 60 frame from a video to create a labeling task.

なお、Use all frames extracted from the video to create a labeling task.の方にチェックすると、時前で抽出したフレームを使用して、ラベリングタスクを作成します。

使用するロールを指定して、Complate data setupボタンを押すと、フレームの切り出しが開始されます。

下記は、生成が完了した様子です。

生成されたデータは、入力に指定したバケットに展開されます。

dataset-20200731T073094.manifest

{
    "source-ref": "s3://sagemaker-working-bucket-000/VideoAnotation/input/AHIRU_AND_TOMATO.mp4/AHIRU_AND_TOMATO.mp4-sequence-1596148398.json"
}

dataset-20200731T073094.manifest.json

{
    "document-version": "2018-11-28",
    "labels": [
        {
            "label": "test_label"
        },
        {
            "label": "nested"
        },
        {
            "label": "nested2"
        }
    ]
}

動画ファイルと同じ名前のフォルダには、切り出された画像が出力されています。

AHIRU_AND_TOMATO.mp4-sequence-1596148398.json

{ 
    "seq-no":1,
    "prefix":"s3://sagemaker-working-bucket-000/VideoAnotation/input/AHIRU_AND_TOMATO.mp4/",
    "number-of-frames":540,
    "frames":[
        {
            "frame-no":0,
            "frame":"frame_0000.jpeg"
        },
        {
            "frame-no":1,
            "frame":"frame_0001.jpeg"
        },
        {
            "frame-no":2,
            "frame":"frame_0002.jpeg"
        },

(4) タスク

タスクのタイプVideoとし、Video object detection

(5) ワーカ

今回は、自分で作業してみるということで、プライベートなチームをワーカーとしました。

説明と、ラベル(ここでは、AHIRUとTOMATOの2つを設定しました)を指定してジョブを生成します。

4 ラベリング作業

チームに登録されているユーザーでログインすると、作成したジョブが確認できます。

ラベルを選択してアノテーションの作業に入ります。

コマごとにラベリング作業を行いますが、次を予測のボタンを押すと、次のフレームに移動すると同時に、現在のフレームで設定されているアノテーションを元に、予測されたアノテーションが自動的に追加されます。

予測されたアノテーションが、問題なければ、そのフレームでの作業は完了です。もし、ズレがある場合は、ここで修正して、また次のフレームに移ります。

ちょっと注意が必要なのは、既にアノテーションが設定されているフレームに、次を予測で移動すると、更に予測されたアノテーションも追加されるので、ボックスがダブルことになります。 右側の設定済みラベル数に注意しながら作業を進めて下さい。

次を予測で追加されるアノテーションは、時々大きくずれる事もありますが、うまく追従していると思います。

今回試した動画は、540フレームでしたが、2種類のラベルを設定するぐらいなら、正直な所、大した作業では無いという印象です。

最後に作業完了のボタンを押すと、ジョブは完了となります。

5 出力データ

完了したデータセットは、出力先に指定した場所に「ジョブ名」のフォルダ配下に出力されます。

output/Video-Anotation-Sample-001/manifests/output/output.manifest

output.manifestを確認すると、ソースが、先に確認したフレーム画像の一覧jsonとなっており、アノテーション情報は、SeqLabel.jsonとなっています。また、クラス名が記録されています。

{
    "source-ref": "s3://sagemaker-working-bucket-000/VideoAnotation/input/AHIRU_AND_TOMATO.mp4/AHIRU_AND_TOMATO.mp4-sequence-1596148398.json",
    "Video-Anotation-Sample-001-ref": "s3://sagemaker-working-bucket-000/VideoAnotation/output/Video-Anotation-Sample-001/annotations/consolidated-annotation/output/0/SeqLabel.json",
    "Video-Anotation-Sample-001-ref-metadata": {
        "class-map": {
            "0": "AHIRU",
            "1": "TOMATO"
        },
        "job-name": "labeling-job/video-anotation-sample-001",
        "human-annotated": "yes",
        "creation-date": "2020-07-31T01:51:26.543000",
        "type": "groundtruth/video-object-detection"
    }
}

SeqLabel.jsonでは、、各画像ごとのアノテーション情報が確認できます。

frame-noは、0から順に並んでいるわけでは無いようなので、フレーム順に何かを検討する場合は、注意が必要です。

output/Video-Anotation-Sample-001/annotations/consolidated-annotation/output/0/SeqLabel.json

{
    "detection-annotations": [
        {
            "annotations": [
                {
                    "height": 220,
                    "width": 268,
                    "top": 377,
                    "left": 24,
                    "class-id": "1",
                    "label-category-attributes": {}
                }
            ],
            "frame-no": "0",
            "frame": "frame_0000.jpeg"
        },
        {
            "annotations": [
                {
                    "height": 220,
                    "width": 268,
                    "top": 377,
                    "left": 24,
                    "class-id": "1",
                    "label-category-attributes": {}
                }
            ],
            "frame-no": "1",
            "frame": "frame_0001.jpeg"
        },
        {
            "annotations": [
                {
                    "height": 220,
                    "width": 268,
                    "top": 377,
                    "left": 24,
                    "class-id": "1",
                    "label-category-attributes": {}
                }
            ],
            "frame-no": "2",
            "frame": "frame_0002.jpeg"
        },
        {
            "annotations": [
                {
                    "height": 220,
                    "width": 268,
                    "top": 377,
                    "left": 24,
                    "class-id": "1",
                    "label-category-attributes": {}
                }
            ],
            "frame-no": "3",
            "frame": "frame_0003.jpeg"
        },

6 最後に

今回は、Ground Truthの新しい機能で、動画から物体検出用のデータセットの作成を試してみましたが、推測により、アノテーション作業が格段に捗ることが体験できました。

なお、残念ながら、SageMaker組み込みのObject Detectionでも、ここで生成されたoutput.manifestを、そのまま利用することは出来ないようなので、適切な変換は必要です。