隨著深度學習技術的發展,自動化影片分析和評論生成已成為可能。本文介紹的技術方案,結合了 OpenAI 強大的視覺模型和影片處理技術,能有效地針對影片內容生成相關評論。此方案首先下載影片並分割成幀,接著利用預先訓練的 GPT-4 Vision 模型對每一幀進行分析,並生成描述性的評論。這些評論會被儲存到 CSV 檔案中,方便後續的檢索和分析。透過此技術,可以自動化地理解影片內容,並生成具有參考價值的評論,為影片分析和內容理解提供了新的途徑。

視覺化分析擴散變換器(Diffusion Transformer)模型生成的影片資料集

在前面的章節中,我們探討了擴散變換器如何生成高保真度的影片。現在,我們將深入分析由擴散變換器模型生成的影片資料集。首先,我們需要下載並顯示這些影片。

下載和顯示影片的函式

我們定義了三個主要的函式,分別用於下載影片、顯示影片和顯示影片中的特定幀。

下載影片

def download_video(filename):
    directory = "Chapter10/videos"
    filename = file_name
    download(directory, filename)

此函式從 GitHub 資料集下載指定的影片檔案。

顯示影片

def display_video(file_name):
    with open(file_name, 'rb') as file:
        video_data = file.read()
    video_url = b64encode(video_data).decode()
    html = f'''
    <video width="640" height="480" controls>
    <source src="data:video/mp4;base64,{video_url}" type="video/mp4">
    Your browser does not support the video tag.
    </video>
    '''
    return HTML(html)

顯示影片中的特定幀

def display_video_frame(file_name, frame_number, size):
    cap = cv2.VideoCapture(file_name)
    cap.set(cv2.CAP_PROP_POS_FRAMES, frame_number)
    success, frame = cap.read()
    if not success:
        return "Failed to grab frame"
    
    # 將顏色從 BGR 轉換為 RGB
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    img = Image.fromarray(frame)
    img = img.resize(size, Image.LANCZOS)
    
    # 將 PIL 影像轉換為 base64 字串以嵌入 HTML
    buffered = BytesIO()
    img.save(buffered, format="JPEG")
    img_str = base64.b64encode(buffered.getvalue()).decode()
    html_str = f'''
    <img src="data:image/jpeg;base64,{img_str}" width="{size[0]}" height="{size[1]}">
    '''
    return HTML(html_str)

內容解密:

  1. download_video 函式負責從 GitHub 資料集下載指定的影片檔案。它需要指設定檔名和下載目錄。
  2. display_video 函式用於顯示下載的影片。它首先以二進位制模式開啟檔案,然後將影片資料編碼為 base64 格式,最後在 HTML 中顯示影片。
  3. display_video_frame 函式允許我們顯示影片中的特定幀。它需要指設定檔名、幀編號和顯示大小。該函式首先開啟影片檔案,然後移動到指定的幀編號,接著讀取該幀並將其轉換為 RGB 格式,最後將其調整為指定的大小並在 HTML 中顯示。

分析擴散變換器模型生成的影片資料集

我們首先下載並顯示一個介紹影片,以驗證我們的函式是否正常工作。

file_name = "AI_Professor_Introduces_New_Course.mp4"
download_video(file_name)
display_video_frame(file_name, 5, size=(135, 90))
display_video(file_name)

內容解密:

  1. 我們選擇了一個介紹影片進行下載和顯示。
  2. 使用 display_video_frame 函式顯示影片的第 5 幀作為縮圖。
  3. 使用 display_video 函式顯示完整的影片。

擴散變換器生成的教育影片資料集

我們列出了 /videos 目錄中的 AI 生成的影片檔案:

lfiles = [
    "jogging1.mp4",
    "jogging2.mp4",
    "skiing1.mp4",
    ...
    "female_player_after_scoring.mp4",
    "football1.mp4",
    "football2.mp4",
    "hockey1.mp4"
]

內容解密:

  1. 列出了擴散變換器模型生成的教育影片資料集中的部分影片檔案。
  2. 這些影片涵蓋了不同的運動場景,如慢跑、滑雪、足球和冰球等。

AI生成影片資料集的視覺化與評論生成系統

顯示縮圖與影片

本文將介紹如何下載並顯示AI生成的影片資料集中的縮圖與影片。首先,程式會收集影片資料集,下載所有影片並顯示其縮圖。使用者可以從列表中選擇一個影片並顯示它。

程式碼實作

for i in range(lf):
    file_name = lfiles[i]
    print("Collecting video", file_name)
    print("Downloading video", file_name)
    download_video(file_name)

內容解密:

此段程式碼用於下載影片資料集。首先,迴圈遍歷影片檔案列表 lfiles,並對每個影片檔案呼叫 download_video 函式進行下載。下載過程中,會印出收集和下載影片的檔案名稱。

顯示影片資訊與縮圖

程式會遍歷影片列表,顯示每個影片的資訊及其縮圖。

for i in range(lf):
    file_name = lfiles[i]
    video_capture.release()
    display_video_frame(file_name, frame_number=5, size=(100, 110))

內容解密:

此段程式碼用於顯示影片的資訊和縮圖。首先,釋放 video_capture 物件,然後呼叫 display_video_frame 函式顯示指定幀號(此例中為第5幀)的影片畫面,並設定顯示大小為 (100, 110)。

選擇並顯示特定影片

使用者可以選擇列表中的一個影片進行顯示。

file_name = "football1.mp4"  # 輸入要顯示的影片檔案名稱
display_video(file_name)

內容解密:

此段程式碼用於顯示指定的影片檔案。首先,將要顯示的影片檔案名稱指定給 file_name 變數,然後呼叫 display_video 函式進行顯示。

生成器與評論員

生成器(Generator)與評論員(Commentator)是兩個協同工作的AI代理,分別負責生成影片和對影片幀進行評論。

工作流程

  1. 生成器根據輸入的文字生成影片。
  2. 生成器將生成的影片分割成幀(圖片)。
  3. 評論員對分割出的幀進行評論。

程式碼實作

def display_video(file_name):
    with open(file_name, 'rb') as file:
        video_data = file.read()
    # 傳回HTML物件
    return HTML(html)

def split_file(file_name):
    video_path = file_name
    cap = cv2.VideoCapture(video_path)
    frame_number = 0
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        cv2.imwrite(f"frame_{frame_number}.jpg", frame)
        frame_number += 1
        print(f"Frame {frame_number} saved.")
    cap.release()

def generate_comment(response_data):
    try:
        caption = response_data.choices[0].message.content
        return caption
    except (KeyError, AttributeError):
        print("Error extracting caption from response.")
        return "No caption available."

def save_comment(comment, frame_number, file_name):
    path = f"{file_name}.csv"
    write_header = not os.path.exists(path)
    with open(path, 'a', newline='') as f:
        writer = csv.writer(f, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
        if write_header:
            writer.writerow(['ID', 'FrameNumber', 'Comment', 'FileName'])
        unique_id = str(uuid.uuid4())
        writer.writerow([unique_id, frame_number, comment, file_name])

內容解密:

  • display_video 函式用於顯示指定的影片檔案。
  • split_file 函式將輸入的影片檔案分割成幀,並將每幀儲存為JPEG圖片。
  • generate_comment 函式從GPT-4 Vision模型的回應中提取評論內容。
  • save_comment 函式將提取的評論儲存到CSV檔案中,包含唯一ID、幀號、評論內容和檔案名稱。

利用OpenAI視覺模型自動生成影片評論的技術實踐

在現代人工智慧技術的推動下,影片分析與自動化評論生成已成為一項重要的研究與應用領域。本文將探討如何利用OpenAI的視覺模型,結合影片處理技術,實作自動化評論生成,並詳細解析相關程式碼的設計邏輯與實作細節。

評論生成器(Commentator)的主要功能

評論生成器的核心任務是利用OpenAI的視覺模型對影片的關鍵影格進行分析並生成評論。首先,程式會根據設定的取樣頻率,從影片中提取代表性的影格。

影格取樣與評論生成

def generate_openai_comments(filename):
    video_folder = "/content"  # 存放影片影格的資料夾
    total_frames = len([file for file in os.listdir(video_folder) if file.startswith("frame_")])
    nb = 3  # 取樣頻率
    counter = 0  # 取樣計數器
    
    for frame_number in range(total_frames):
        counter += 1
        if counter == nb and counter < total_frames:
            counter = 0
            print(f"正在分析影格 {frame_number}...")
            image_path = os.path.join(video_folder, f"frame_{frame_number}.jpg")
            try:
                with open(image_path, "rb") as image_file:
                    image_data = image_file.read()
                    response = openai.ChatCompletion.create(
                        model="gpt-4-vision-preview",
                        messages=[
                            {
                                "role": "user",
                                "content": [
                                    {"type": "text", "text": "圖中發生了什麼?"},
                                    {"type": "image", "image_url": f"data:image/jpeg;base64,{base64.b64encode(image_data).decode()}"}
                                ]
                            }
                        ],
                        max_tokens=150,
                    )
                    comment = generate_comment(response)
                    save_comment(comment, frame_number, filename)
            except FileNotFoundError:
                print(f"錯誤:找不到影格 {frame_number}")
            except Exception as e:
                print(f"發生意外錯誤:{e}")

#### 內容解密:

此函式首先計算影片影格的總數,並根據設定的取樣頻率(nb=3)對影格進行取樣分析。對於每個被選中的影格,程式會呼叫OpenAI的視覺模型,傳入影格圖片並詢問「圖中發生了什麼?」。模型的回應會被進一步處理並儲存為評論。

評論顯示功能

評論生成後,系統會將評論結果儲存於CSV檔案中,並提供顯示功能以便檢視。

def display_comments(file_name):
    path = f"{file_name}.csv"
    df = pd.read_csv(path)
    return df

#### 內容解密:

此函式讀取儲存評論的CSV檔案,並將其載入為pandas DataFrame格式,方便進一步分析和展示。

管道控制器(Pipeline 1 Controller)的運作流程

管道控制器的主要任務是協調影片下載、影格分割、評論生成等步驟的執行。

session_time = time.time()  # 開始計時
# 步驟1:顯示影片
file_name = "skiing1.mp4"
print(f"影片:{file_name}")
download(directory, file_name)
display_video(file_name)

# 步驟2:分割影片為影格
print("步驟2:分割影片為影格")
split_file(file_name)

# 步驟3:為影片影格生成評論
print("步驟3:為影格生成評論")
start_time = time.time()
generate_openai_comments(file_name)
response_time = time.time() - session_time

#### 內容解密:

控制器首先下載並顯示指定影片,接著將影片分割為多個影格,並呼叫generate_openai_comments函式為這些影格生成評論。過程中會記錄時間,以評估系統效能。

結果輸出與效能評估

系統完成評論生成後,會輸出相關結果,包括影格數量、評論內容、內容生成時間等。

total_frames = len([file for file in os.listdir(video_folder) if file.startswith("frame_")])
print(total_frames)
print("顯示評論:")
display_comments(file_name)
total_time = time.time() - start_time
print(f"回應時間:{response_time:.2f} 秒")
print(f"總處理時間:{total_time:.2f} 秒")

#### 內容解密:

此部分程式碼計算並顯示了總影格數、生成的評論內容,以及整個處理流程的回應時間和總耗時,為系統效能評估提供了重要依據。