見出し画像

【お試しコード付き②】Qwen2-VLで動画内容を自動解釈


はじめに

ソフトウェアエンジニアのホーリーデイです。
前回の記事【お試しコード付き①】では、Qwen2-VLを使って画像を解析し、その内容を自動で解釈する手法をご紹介しました。今回はその続編として、動画データを使った解析方法に焦点を当てます。
動画の内容をモデルに理解させ、自動で解釈を行うプロセスを、Colabを使用して実際に試してみましょう!

Qwen2-VLは、動画や画像の内容を解析し、それを言語に変換する強力なAIモデルです。これにより、画像・動画データから詳細な情報を抽出し、説明文やサマリーを生成することが可能です。

Google Colabのノートブックも添付します。
このコードを参考に実行してみてください。

動画解析の流れ

今回のデモでは、以下の流れでQwen2-VLを使用して動画の内容を解釈します。デモ動画のURLはこちら

  1. 動画を低画質化・フレームレートを調整してメモリ負荷を軽減。

  2. 調整した動画をQwen2-VLに入力し、その内容をモデルに解析させる。

  3. モデルの出力を確認。

それでは、具体的なコードとともにこのプロセスを詳しく解説していきます。

ステップ①: 動画の低画質化とFPS調整

Qwen2-VLは、高解像度の動画や高いFPSのデータを扱うと、メモリの負荷が大きくなり、処理が重くなってしまうことがあります。そこで、動画を一旦低画質化し、フレームレートを0.1fpsに調整することで、モデルに適したサイズでデータを処理します。

import cv2

def resize_video(input_path, output_path, target_size=(320, 180), target_fps=0.1):
    cap = cv2.VideoCapture(input_path)
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    fps = int(cap.get(cv2.CAP_PROP_FPS))
    
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    out = cv2.VideoWriter(output_path, fourcc, target_fps, target_size)
    
    frame_interval = int(fps / target_fps)
    frame_count = 0
    
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        
        if frame_count % frame_interval == 0:
            resized_frame = cv2.resize(frame, target_size)
            out.write(resized_frame)
        
        frame_count += 1
    
    cap.release()
    out.release()

resize_video('/content/space_woaudio.mp4', '/content/output.mp4')

opencvを用いて入力動画を320x180の低解像度にリサイズし、フレームレートを0.1fpsに変更します。これにより、メモリの負荷を軽減し、Qwen2-VLでの解析がスムーズに行えるようになります。

ステップ②: Qwen2-VLで動画解析

次に、上記の低画質化した動画をQwen2-VLに入力し、内容を解析してもらいます。使用するモデルは、Qwen2-VL-7B-Instructです。これにより、動画の中で何が起こっているかを文章として出力することができます。

from transformers import Qwen2VLForConditionalGeneration, AutoProcessor
from qwen_vl_utils import process_vision_info
import torch

# Qwen2-VL-7B-Instructモデルの読み込み
model = Qwen2VLForConditionalGeneration.from_pretrained(
    "Qwen/Qwen2-VL-7B-Instruct", torch_dtype="auto", device_map="auto"
)

# プロセッサの設定
processor = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-7B-Instruct")

# 動画ファイルとテキスト入力の準備
messages = [
    {
        "role": "user",
        "content": [
            {
                "type": "video",
                "video": "/content/output.mp4",
            },
            {"type": "text", "text": "Describe this video."},
        ],
    }
]

# テキストと動画の情報を処理
text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
image_inputs, video_inputs = process_vision_info(messages)
inputs = processor(
    text=[text],
    images=image_inputs,
    videos=video_inputs,
    padding=True,
    return_tensors="pt",
)

inputs = inputs.to("cuda")

# モデル推論
generated_ids = model.generate(**inputs, max_new_tokens=128)
generated_ids_trimmed = [
    out_ids[len(in_ids):] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
]
output_text = processor.batch_decode(
    generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
)
print(output_text)


ステップ③: 結果の確認

上記のコードを実行すると、Qwen2-VLが動画を解析し、その内容をテキストで出力します。たとえば、以下のような結果が得られます。

出力結果 (英語):

The video shows two men inside a space station, holding microphones and speaking to the camera. They are wearing space suits and appear to be in a clean and well-lit environment. The video also features a shot of the space station itself, with a flag visible in the background.

英語:出力例

日本語訳: Qwen2-VLの出力結果

ビデオには、宇宙ステーションの中でマイクを持ち、カメラに向かって話す2人の男性が映っている。彼らは宇宙服を着ており、清潔で明るい環境にいるように見える。ビデオには宇宙ステーション自体も写っており、背景には旗が見える。

日本語:出力例

コードのポイント

このデモコードでは、Qwen2-VLの持つビジョン言語処理能力を活かし、動画の内容をテキストで表現することができます。具体的には、動画内に映る人の行動や周囲の環境、視覚的な要素などを自然言語に変換しています。

モデルの強み:

  • 多様なメディア解析: 静止画だけでなく、動画まで対応可能。

  • 高精度な説明: 人物や物体の状況を的確に記述。

Qwen2-VLの機能やパフォーマンスについてさらに知りたい方は、以下のリンクからGitHubや関連リソースを参照してください。


まとめ

今回は、Qwen2-VLを使って動画の内容を解析し、テキストでの解釈を行う方法を紹介しました。動画の低画質化・フレームレート調整から、モデルへの入力、そして出力結果までを順を追って解説しました。

このように、Qwen2-VLを使えば、画像や動画の内容を自動的に解析して、それを言語化することが可能です。今後のプロジェクトで、視覚情報の自動解釈が求められる場面で大いに役立つと思います。

Qwen2-VLのさらなる活用方法についても、ぜひチャレンジしてみてください!


この記事が気に入ったらサポートをしてみませんか?