1. はじめに
前回、Amazon Rekognition Custom Labels を使って
「ウォーリーを探せ」を画像認識させてみました。
👉 前回の記事
https://qiita.com/w118g1135/items/44e11ec9bd7884bdebcc
その時に、
動画分析って、結局「連続した画像認識」から始まるのでは?
と思ったかつ、AWS公式が以下の通りサンプルを出していたので動画分析も試してみました。
https://docs.aws.amazon.com/ja_jp/rekognition/latest/customlabels-dg/ex-video-extraction.html
やりたいこととしては、
- 動画を一定間隔でフレーム分解
- 各フレームを Rekognition に渡す
- 時系列で結果を見る
というシンプルなものです。
2. 環境
今回も、なるべくAWS上で完結する構成にしました。
■ 使用したサービス
Lambda
Amazon Rekognition
■ 使用したライブラリ
opencv-python-headless
動画のフレーム分解には OpenCV を利用。
ただし通常版の OpenCV はサイズがかなり大きく、
Lambda Layer 制限に引っかかります。
そのため今回は計量版であるopencv-python-headlessを利用しました。
3. やってみたこと
■ 下準備で動画作成
まずは検証用の動画を用意。
本格的にやる前に、
とりあえず動画から検出できるのか?
を確認したかったので、
今回は簡易的な検証動画を作成しました。
動画素材やアイデア出しには Grok も活用。
最近こういう「試作の壁打ち」にAIがかなり便利だなと感じています。
■ Lambdaで動画をフレーム分解
今回の流れはこんな感じです。
S3動画
↓
Lambda
↓
OpenCVでフレーム取得
↓
Rekognition Custom Labels
↓
結果を時系列で取得
■ コード作成は ChatGPT を活用
サンプルコードの変換から、すべて実施してもらいました!
Lambdaに付与するポリシーや、細かい修正のみ手を動かした感じです。
■ 実装
今回のポイントは、
👉 「1秒ごとにフレームを切り出して Rekognition に渡す」
部分です。
frame_rate = int(cap.get(5) or 30)
while cap.isOpened():
frame_id = int(cap.get(1))
ret, frame = cap.read()
if not ret:
break
# 1秒ごとに処理
if frame_id % frame_rate == 0:
FPS を利用して、
1秒ごとに画像認識しています。
さらに、
response = rek_client.detect_custom_labels(
Image={'Bytes': image_bytes.tobytes()},
ProjectVersionArn=project_version_arn,
MinConfidence=0,
)
で Rekognition Custom Labels を呼び出しています。
「動画を分解 → 画像として分析」
という形です。
実際に動きを見ても、動画分析は画像分析の繰り返し
という実感がかなりありました。
4. プログラム実行結果
opencv と Custom Labels を組み合わせることで、
動画からウォーリーを探すことに成功しました。
しかも動画内容的にも、
3秒付近が一番正面を向いており
そこが高Confidenceになっていました。
{
"statusCode": 200,
"body": "[{\"Name\": \"n_w\", \"Confidence\": 57.22800064086914, \"Timestamp\": 0.0}, {\"Name\": \"w\", \"Confidence\": 42.77199935913086, \"Timestamp\": 0.0}, {\"Name\": \"w\", \"Confidence\": 50.81999969482422, \"Timestamp\": 1000.0}, {\"Name\": \"n_w\", \"Confidence\": 49.18000030517578, \"Timestamp\": 1000.0}, {\"Name\": \"w\", \"Confidence\": 52.53300094604492, \"Timestamp\": 2000.0}, {\"Name\": \"n_w\", \"Confidence\": 47.46699905395508, \"Timestamp\": 2000.0}, {\"Name\": \"w\", \"Confidence\": 58.429996490478516, \"Timestamp\": 3000.0}]"
}
特にこの部分。
{
"Name": "w",
"Confidence": 58.429996490478516,
"Timestamp": 3000.0
}
3秒地点で最も高いスコアになっていました。
👉 「それっぽく動いてる」感があって感動しました。
5. 学び
■ 動画分析の入口が見えた
前回は画像単体でしたが、
今回は動画を扱えたことで、
👉 「動画分析っぽいこと」
まで来れた感覚があります。
■ 時系列が入ると一気に面白い
画像認識だけだと「その瞬間」しか見れませんが、
動画になると、
- いつ出現したか
- どのタイミングで見えやすいか
- 動きと特徴の関係
が見えてきます。
今回は単純に1秒ごとでしたが、
フレーム間の変化も追えるようになると、
かなり面白そうです。
■ AI × AWS の試作速度がすごい
今回かなり感じたのがこれです。
- Grok → 素材作成
- ChatGPT → 実装
- AWS → 実行環境
で、とりあえず試すまでがかなり早い。
以前なら「環境構築で終わる」みたいなことも多かったですが、
今は思いついたものをすぐ試せる時代だなと思いました。
まとめ
今回は、
- OpenCVで動画を分解
- Lambdaで実行
- Rekognition Custom Labels で分析
を試してみました。
もともとの始まりだったスケートのジャンプ判定は、
- 各ジャンプの判断となる特徴をカスタムラベル化する
- フレーム毎にカスタムラベル判定する
- カスタムラベルの連続した順番でジャンプ判定する
で実現できそうな気がしたのでだいぶ満足です!
(リアルタイム分析の場合はKinesis Video Streamsを使うとよさそうでした。)
