こんにちは、BBです。
みなさん、動画解析やってますか?
何を解析するのかにもよりますが、ライブラリやAPIが充実していますので選択肢はたくさんは提示されている環境になったと思います。でも、選択肢が広がる半面、提示された中から最適解を選ぶのって結構しんどいですよね。
今回は動画解析APIの一つ、Amazon Rekognition Videoのデモを試してみたのでその所感をまとめていきたいと思います。みなさんの選択基準のひとつに加えていただればうれしいです。
Amazon Rekognition Video
動画解析用のAPIとして泣く子も黙るAWSが提供しているサービスです。もともと画像解析用のAmazon Rekognitionというサービスがありましたが、これを動画用に拡張したサービスの位置づけのようです。目玉となる機能は以下の3つ。
- チーム:動画に登場する人物を識別、追跡
- 有名人:登場人物が有名人か判定
- オブジェクトとアクティビティ:動画内にある人、モノ、シチュエーションまでを解析
なんともリッチな機能が盛りだくさんですね!中でも「チーム」は説明通りであれば利用できるシーンはかなり広そうです。
デモ実験
Amazon Rekognition Videoでは先述した機能3つをデモ画面で試すことができます。Amazonが用意したサンプル動画を使うこともできますし、手持ちの動画ファイルをアップロードして使うこともできます。しかも、デモ画面は無料で使用することができますので安心ですね。今回は「チーム:動画に登場する人物を識別、追跡」の検証を行っていきたいと思います。動画の解析結果は画面上でも確認することができますが、JSONファイルとしてダウンロードすることもできます。画面上に出てくる情報よりJSONファイルのほうが情報量が多いのでこちらを使っていきます。
実験1:フレームアウトした人の認識は??
来場者調査など行き来する人の中で同じ人がきたらそのことを判定したい、なんてことありませんか?同一の人物を追跡する場合は、画面上の人物を物体検出した後、フレーム間の差分を使って追跡したりと工夫すればある程度の精度で実装できそうです。しかし、画面外に出てしまったり、たくさんの人が重なったりしていると同一人物の検出はかなり困難になります。そこんとこどんな感じになっているのかを著作権フリーのこちらの動画を使って検証していきたいと思います。
水辺の歩道を人々が行き来している動画となっています。動画に現れる人物は9人です。動画の途中からカメラアングルが変化し、一度フレームアウトした人が再び画面上に現れますが、この人を同一人物として認識してくれるのかが注目ポイントとなっています。1枚目の画像で映っている人が、2枚目ではカメラアングルが変わり小さいですが後ろ姿で映っています。
結果はというと……フレームアウトした人を同一人物として識別することはできませんでした!うーん。
解析結果の動画から画像を切り出したものを下に張り付けています。白い矩形で囲まれているのが人物と判定された部分です。人物の検出という観点でいうと、9人中8人を検出できていました。こちらはまずまずですね。
四角の上に表示されている数字が認識した人の番号になっており同一人物と判断した場合は同じ番号が振られます。番号は最終的に0~13まで振られ動画内で14人を認識したことになります。ほんとは検出された人数の8人と同じになってほしいところ。しかし、いったんフレームアウトしてまた映り込んだ人物はすべて異なる番号が振られており別人として扱われています。実験1で使用した動画では再びフレームインした際に後ろ姿になっており顔も判定できません。かつ、だいぶ小さいので難易度は結構高かったのかもしれません。
実験2:シーン切り替え前後の認識は??
実験1では試したサンプルがよくなかった!というわけで気を取り直して実験2です。実験2の動画はこちら。何回かシーンが切り替わっていますが、かなりしっかり顔が映っています。ただ、ちょっと見分けるのが大変な気がしますが……では早速結果を見ていきましょう。
上の画像と下の画像では映り込んでいる人物はほぼ同じなのですが、カメラアングルが下の画像の方が引きになっています。シーンの切り替え前後でカメラアングルが変化しており、上の画像が切り替え前、下の画像が切り替え後です。今度はシーンが切り替わってもきちんと同一人物を追跡できているようです。特に0番と2番の人は比較的精度よく追跡できているようです。シーンが切り替わっても顔を検出することで同一人物であることを確かめているようです。一方でうまくいっていない例もあり、1番の人に注目すると全く別人の場合でも同一人物として扱われているようでした。
ヘルメットのあるなしの差があるにも関わらず同一人物と判断されているので精度的に不安が残る結果となります。あたかも背後に映っている8番の人に番号を奪われたような形になっているので個人の認識という観点でも人物が重なり合った動画の解析は難しいようですね。
実験2から個人の識別は顔が検出できるか否かがキーになっていることがわかりました。また、画面に顔が映り込んでいても、顔の検出は人間の検出に対してかなり頻度が低いこともこの実験からわかりました。
活用シーン考察
実験によってAmazon Rekognition Videoを用いて人物の識別や追跡を効果的に行うには以下の条件が必要であることがわかってきました。
- 登場人物の顔がどのシーンでも映っていること
- 画面に映る人数は少ないほうがよい
上記の条件を考えるとトークショーのようなテレビ番組や、人が少ないところでとったホームビデオなどは解析対象として向いているように思います。人が重なり合う人混みや顔が判断できないような高い視点からの映像などの解析には折角の機能が生かせない可能性がありますね。
また、解析結果の動画を見てみると人物が映っているすべてのフレームで人物の矩形を選択できているわけではないようです。計算量を節約するために間引きを行っているのかもしれませんが、フレーム毎に抽出した矩形データを用いたい場合などには不向きであるように思います。人物の矩形以上に顔の矩形を抽出しているフレームは少ないので注意が必要です。
解析で使ったコード
解析は以下のコードを用いています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
#!/usr/bin/env python # -*- coding: utf-8 -*- import json import numpy as np import cv2 file_name = 'PexelsVideos1466210' # 動画読込 video = cv2.VideoCapture('{}.mp4'.format(file_name)) video_fps = video.get(cv2.CAP_PROP_FPS) frame = [] while True: is_good, f = video.read() if not is_good: break frame.append(f) print(np.array(frame)) frame = np.array(frame) _, height, width, _ = frame.shape # JSONデータ読込 with open('{}.json'.format(file_name), 'r') as f: json_data = json.load(f) persons = json_data['Persons'] target = [] for i, person in enumerate(persons): person['Timestamp'] = int(person['Timestamp']*video_fps/1000) print(person) target.append(person) # 動画にJSONの情報を書き込む for t in target: i = t['Timestamp'] if 'BoundingBox' in t['Person']: box = t['Person']['BoundingBox'] x = round(width * box['Left']) y = round(height * box['Top']) w = round(width * box['Width']) h = round(height * box['Height']) cv2.rectangle(frame[i], (x, y), (x + w, y + h), (255, 255, 255), 3) cv2.putText(frame[i], str(t['Person']['Index']), (x, y - 9), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (255, 255, 255), 3) if 'Face' in t['Person']: box = t['Person']['Face']['BoundingBox'] x = round(width * box['Left']) y = round(height * box['Top']) w = round(width * box['Width']) h = round(height * box['Height']) cv2.rectangle(frame[i], (x, y), (x + w, y + h), (255, 0, 0), 3) cv2.putText(frame[i], str('Face {}'.format(t['Person']['Index'])), (x, y - 9), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (255, 0, 0), 3) # 解析結果動画出力 fourcc = cv2.VideoWriter_fourcc(*'mp4v') video = cv2.VideoWriter('{}_rect.mp4'.format(file_name), fourcc, video_fps, (width, height)) for d in frame: video.write(d) video.release() |
まとめ
Amazon Rekognition Videoのデモを使って人物の追跡と識別の機能を試してみました。精度をかっちり求められるシステムへの組み込みは難しいと思う反面、手軽さを武器にアイデア次第で動画解析の可能性を広げてくれる印象を受けました。これからの展望が楽しみですね!
今回は以上となります!