隨著深度學習技術的發展,自動化影片分析和評論生成已成為可能。本文介紹的技術方案,結合了 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)
內容解密:
download_video
函式負責從 GitHub 資料集下載指定的影片檔案。它需要指設定檔名和下載目錄。display_video
函式用於顯示下載的影片。它首先以二進位制模式開啟檔案,然後將影片資料編碼為 base64 格式,最後在 HTML 中顯示影片。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)
內容解密:
- 我們選擇了一個介紹影片進行下載和顯示。
- 使用
display_video_frame
函式顯示影片的第 5 幀作為縮圖。 - 使用
display_video
函式顯示完整的影片。
擴散變換器生成的教育影片資料集
我們列出了 /videos
目錄中的 AI 生成的影片檔案:
lfiles = [
"jogging1.mp4",
"jogging2.mp4",
"skiing1.mp4",
...
"female_player_after_scoring.mp4",
"football1.mp4",
"football2.mp4",
"hockey1.mp4"
]
內容解密:
- 列出了擴散變換器模型生成的教育影片資料集中的部分影片檔案。
- 這些影片涵蓋了不同的運動場景,如慢跑、滑雪、足球和冰球等。
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代理,分別負責生成影片和對影片幀進行評論。
工作流程
- 生成器根據輸入的文字生成影片。
- 生成器將生成的影片分割成幀(圖片)。
- 評論員對分割出的幀進行評論。
程式碼實作
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} 秒")
#### 內容解密:
此部分程式碼計算並顯示了總影格數、生成的評論內容,以及整個處理流程的回應時間和總耗時,為系統效能評估提供了重要依據。