概要
Google Cloud Next Tokyo ’24の2日目に行われた、「マルチモーダル生成 AI Gemini による映像解析 How-To」のセッション内で、Geiminiは動画ファイルを処理する際に1秒間に1フレームしかサンプリングされないという解説がされていました。
これは、多くの場合1fps以内に動画内の情報が大きく変化することが少なく、これ以上の粒度でデータ処理にコストを掛けてサンプリング処理を行っても、AIの動画に対する理解度に大きく差がなかったことが理由だそうです。
ですが、動画内で1秒以内に一瞬写るシーンを対象とした処理を行いたい場合、そのままインプットしてしまうと検知が行われない可能性が高くなってしまいます。
本記事ではその対策を考えていきたいと思います。
なお、セッションの内容については、弊社の小菅よりセッションレポート記事が投稿されていますのでそちらをご覧ください。
対策1:フレームレートを落とす
これがセッション内で提示されている対策です。
「フレームレートを落として実時間あたりのサンプリング数を増やす等の事前処理が必要」と記載されています。
これはおそらく6fsp(1秒間に6フレーム)の動画の場合、そのままインプットすると6フレームのうちのいずれかがサンプリングされるので、もともと1秒間に6フレームあったものを1秒1フレームにして6秒に引き伸ばす処理を行うという意味と推測されます。
ただし、その際は音声と時間的なズレが発生するため、音声も含めた動画の処理を行う場合は精度が低下する可能性が高そうです。
なお、上記の処理はOpenCVと呼ばれる動画や画像の処理を行うOSSライブラリで実現できるかと思います。なお、OpenCVはPythonでも利用可能です。
対策2:動画内で短時間で情報が大きく変化したシーンを抽出する
これは動画のフレームレートは変更せずに、動画を1秒ごとにフレームに切り出してそのフレーム間で画像の一致度が低いフレームを切り出して、動画とは別で画像としてインプットするという方法です。Geminiへのプロンプトに元の動画と切り出したフレーム画像が複数インプットされるイメージです。
ただし、この方法にもデメリットがあり、その切り出したフレームは1秒内で一瞬しか映らなかったフレームのためGeminiが認識しておらず、元の動画と切り出した画像を関連付けて処理する場合はうまく以下ない可能性が高いです。(添付した画像は動画の何秒に表示されているか等の処理)
上記の処理もPythonであればOpenCVやNumPyなどのライブラリを組み合わせて実装可能です。
対策3:動画は画像に変換して処理する
これは苦肉の策ですが、動画内の音声を利用しない場合は、動画はすべて画像に変換してから画像をGeminiにインプットするという方法です。
5fspであれば、1秒あたり5フレームに切り出してその画像をすべてインプットすることで、瞬時に移り変わる内容の場合はそのまま動画としてインプットするよりは精度が高くなると推測されます。
これもOpenCVを使うことで難なく実現可能かと思いますが、上2つと比較して処理時間やGeminiの1回あたりのコストの増加は免れないです。
対策4:モデルを変更する
結論からいうと、この対策はあまり有効ではありません。
というのも、GPT-4oやClaude 3などの主要なクローズドモデルでは、現状APIやSDK経由で動画を直接インプットできず、ユーザー側で一度画像に変換してからモデルにインプットする必要があるからです。オープンモデルのLlama 3.1などでも同様です。
そうなんです。Geminiは動画をそのまま処理できる数少ないマルチモーダルLLMなのです。すべてのLLMを調査したわけではないですが、おそらく唯一のモデルかもしれないです。
また、Gemini以外のLLMは基本的に数十万トークンが上限となっており、仮に動画をそのままインプットできても長時間の動画は直接処理できず、ユーザー側で事前に分割する等の処理が必要となります。
まとめ
Geminiにおける1fsp問題の対策を紹介しましたが、いかがでしょうか。
対策1〜3は事前処理としてユーザー側で加工する必要があるので、その分のコンピューティングリソースや処理時間がかかってきしまうのがネックになりそうです。
個人的には動画を処理する際のサンプリング数は、パラメータ化してユーザー側で指定できるようになると、もっと生成AI利用の汎用性が高まると考えていますので、今後のアップデートに期待したいですね。
ただその場合、サンプリング数を増やした際の動画処理の料金が1fsp時より増加してしまうかと思いますが、これは精度の向上というメリットを考えれば許容範囲ではないでしょうか。