• home
  • AWS Rekognitionでの動画解析やってみた

AWS Rekognitionでの動画解析やってみた

伏見です。遅ればせながら先日Wanoグループの技術合宿でやったことのフィードバックをしてみます。

先日行った弊社合宿では個々人がそれぞれのタスクをやっていたわけですが、私は前半主にAWS Rekognitionを触っていました。

AWS Rekognitionとは、画像や動画を解析するサービスです。
メディアの節度判定や写っている物体の検知、有名人が映っているかどうかなどを判定できるサービスです。GCPにも似たようなのがありますね。

弊社のVideoKicksというサービスで、ユーザーさんがアップロードした動画内容自体を検品するのにこの辺のプロダクトが何か使えないかな?と考えてみたわけです。

やってみよう

今回「映っているもの」判定してみたのは以下の動画です。
弊社事業部の一つ、「TuneCore Japan」のプロモーション動画になります。

このように、ロゴやテキストが乱舞するモーショングラフィックスになっております。

Rekognition(video) はwebコンソールから気軽に解析を試すにはUIが貧弱なため、愚直にドキュメントをみながら、aws-sdk-goでjobを投げ、ポーリングして解析結果を確認することにしました。解析信頼度の設定なども、cliやSDK経由でしかできないようですね。

api一覧

今回は「Label検出」というのを試してみます。
jobを投げて

 ....
    input := rekognition.StartLabelDetectionInput{}
    input.SetVideo(&rekognition.Video{
        S3Object: &rekognition.S3Object{
            Bucket: aws.String(bucket),
            Name:   aws.String(key),
        },
    })

    input.SetMinConfidence(75) // 取得する最低信頼度(%)
    output, err := self.rekognitionSdk.StartLabelDetection(&input)
    if err != nil {
        log.Error(err)
        return nil, err
    }

    return output.JobId, nil


ひたすら待ち。

...
        for {

            resp, err := sdk.GetLabelDetection(&rekognition.GetLabelDetectionInput{
                JobId: jobId,
            })
            if err != nil {
                log.Error(err)
            }

            if *resp.JobStatus != `IN_PROGRESS` {

                if *resp.JobStatus == `SUCCEEDED` {
                    log.Infof(`jobId : %s`, *jobId)
                    return
                }

                pp.Println(resp)
                return
            }

            time.Sleep(time.Second * 5)
            fmt.Println(`loop...`)
        }


結果

result.json

概観

解析結果は、以下のように、時系列ベースのarrayが延々と羅列されたjsonとして返ってきます。

{
    "Labels": [
        {
            "Timestamp": 0, 
            "Label": {
                "Instances": [], 
                "Confidence": 89.10456848144531, 
                "Parents": [], 
                "Name": "Text"
            }
        }, 
        {
            "Timestamp": 166, 
            "Label": {
                "Instances": [], 
                "Confidence": 89.32714080810547, 
                "Parents": [], 
                "Name": "Text"
            }
        }, 
        {
            "Timestamp": 367, 
            "Label": {
                "Instances": [], 
                "Confidence": 89.16315460205078, 
                "Parents": [], 
                "Name": "Text"
            }
        }, 
        {
            "Timestamp": 567, 
            "Label": {
                "Instances": [], 
                "Confidence": 88.99774932861328, 
                "Parents": [], 
                "Name": "Text"
            }
        }, 
        {
            "Timestamp": 767, 
            "Label": {
                "Instances": [], 
                "Confidence": 89.03606414794922, 
                "Parents": [], 
                "Name": "Text"
            }
        }, 

文字が多めの動画なので、基本的に検知されたオブジェクトはほとんど「Text」として認識されていました。

5-6秒周辺

冒頭でブランドロゴが現れ始めた際(5-6秒周辺)のjsonはこのようになっていました。

        {
            "Timestamp": 3770, 
            "Label": {
                "Instances": [], 
                "Confidence": 88.16947937011719, 
                "Parents": [
                    {
                        "Name": "Text"
                    }, 
                    {
                        "Name": "Symbol"
                    }
                ], 
                "Name": "Number"
            }
        }, 
        {
            "Timestamp": 3770, 
            "Label": {
                "Instances": [], 
                "Confidence": 88.16947937011719, 
                "Parents": [], 
                "Name": "Symbol"
            }
        }, 
...
        {
            "Timestamp": 6773, 
            "Label": {
                "Instances": [], 
                "Confidence": 78.73004913330078, 
                "Parents": [
                    {
                        "Name": "Art"
                    }
                ], 
                "Name": "Graphics"
            }
        }, 

頻出する Textに加えて、 SymbolArt と言ったlabelが散見されます。

9秒周辺

各ストアさんのロゴが並ぶ9秒周辺はどうでしょうか。

        {
            "Timestamp": 8575, 
            "Label": {
                "Instances": [], 
                "Confidence": 92.07150268554688, 
                "Parents": [], 
                "Name": "Text"
            }
        }, 
        {
            "Timestamp": 8775, 
            "Label": {
                "Instances": [], 
                "Confidence": 92.7065200805664, 
                "Parents": [], 
                "Name": "Text"
            }
        }, 
        {
            "Timestamp": 8975, 
            "Label": {
                "Instances": [], 
                "Confidence": 92.6703872680664, 
                "Parents": [], 
                "Name": "Text"
            }
        }, 
        {
            "Timestamp": 9175, 
            "Label": {
                "Instances": [], 
                "Confidence": 92.47152709960938, 
                "Parents": [], 
                "Name": "Text"
            }
        }, 
        {
....

あれ、 Text 以外見当りません。

14-15秒周辺

iTunesさんのロゴが右から現れるあたりです。

        }, 
        {
            "Timestamp": 14781, 
            "Label": {
                "Instances": [], 
                "Confidence": 78.88565826416016, 
                "Parents": [], 
                "Name": "Art"
            }
        }, 
        {
            "Timestamp": 14781, 
            "Label": {
                "Instances": [], 
                "Confidence": 78.88565826416016, 
                "Parents": [
                    {
                        "Name": "Art"
                    }
                ], 
                "Name": "Graphics"
            }
        }, 
        {
            "Timestamp": 14781, 

サイズの問題もあるのか、ここではまた GraphicsArt といったlabelが検出できています。

52秒周辺

        {
            "Timestamp": 51751, 
            "Label": {
                "Instances": [], 
                "Confidence": 81.01947021484375, 
                "Parents": [
                    {
                        "Name": "Paper"
                    }, 
                    {
                        "Name": "Poster"
                    }, 
                    {
                        "Name": "Advertisement"
                    }
                ], 
                "Name": "Flyer"
            }
        }, 
        {
            "Timestamp": 51751, 
            "Label": {
                "Instances": [], 
                "Confidence": 97.2920150756836, 
                "Parents": [], 
                "Name": "Human"
            }
        }, 


人物のジャケットが表示される箇所では Advertisement , Flyer , Human といったものが検出されています。

感想

合宿で「やってみた」ということで、普段使い慣れないサービスを触ってみました。
今回は基本的にテキスト、文字アニメーション、ロゴのみで構成される動画を解析にかけてみましたわけですが、信頼度設定によっては動画の検品に一役買うかもしれません。
Rekognition周りの機能は気づくと性能が向上しているので、たまに追ってみると面白そうですね。