這個系統的核心功能在於自動化處理影片並產生相關評論,涵蓋了影片下載、拆幀、評論生成和結果展示等流程。系統採用模組化設計,包含生成器、評論器和控制中心等核心元件。評論生成器利用 OpenAI 的 GPT-4 Vision Preview 模型分析影片幀,並生成簡潔的評論。系統利用取樣機制提高處理效率,並將評論結果儲存至 CSV 檔案。控制中心協調整個流程,包含影片準備、拆幀處理、評論生成和結果彙總等階段,並提供效能評估指標。此外,系統還支援彈性的資料儲存選項,可根據需求儲存評論和影片幀。
自動化影片處理與評論生成系統架構解析
系統概述
本系統主要功能為自動化處理影片並生成評論,涵蓋影片下載、拆幀、評論生成及結果展示等流程。系統採用模組化設計,主要包含Generator(生成器)、Commentator(評論器)及Pipeline1 Controller(控制中心)等核心元件。
評論生成器(Commentator)實作細節
評論生成器是系統的核心功能模組,負責呼叫OpenAI視覺模型分析影片幀並生成評論。以下是其主要實作細節:
1. 幀取樣策略
nb = 3 # 取樣頻率
counter = 0 # 取樣計數器
系統並非處理影片中的每一幀,而是採用取樣機制以提高效率。
2. OpenAI視覺模型呼叫
response = openai.ChatCompletion.create(
model="gpt-4-vision-preview",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "What is happening in this image?"},
{"type": "image", "image_url": f"data:image/jpeg;base64,{base64_image}"}
]
}
],
max_tokens=150,
)
模型呼叫採用GPT-4 Vision Preview版本,輸入包含文字提示與影像資料,輸出限制在150個token以內。
3. 評論處理流程
comment = generate_comment(response)
save_comment(comment, frame_number, file_name)
系統對模型的回應進行處理,先提取評論內容,再儲存至對應檔案。
4. 評論結果展示
def display_comments(file_name):
path = f"{file_name}.csv"
df = pd.read_csv(path)
return df
評論結果以CSV格式儲存,並可透過Pandas DataFrame進行載入與展示。
管道控制中心(Pipeline1 Controller)運作機制
控制中心負責協調整個影片處理流程,主要包含以下階段:
1. 影片準備階段
file_name = "skiing1.mp4"
download(directory, file_name)
display_video(file_name)
此階段包含影片檔案的選取、下載及播放展示。
2. 影片拆幀處理
print("Step2: Splitting the video into frames")
split_file(file_name)
將影片拆分為單幀影像以供後續分析使用。
3. 評論生成階段
print("Step3: Commenting on the frames")
start_time = time.time()
generate_openai_comments(file_name)
呼叫評論生成器對影片幀進行分析並產生評論。
4. 結果彙總與效能評估
response_time = time.time() - session_time
total_time = time.time() - start_time
print(f"Response Time: {response_time:.2f} seconds")
print(f"Total Time: {total_time:.2f} seconds")
系統會記錄並輸出處理時間,以評估整體效能表現。
資料儲存機制
系統提供靈活的資料儲存選項:
save = True # 是否儲存評論
save_frames = True # 是否儲存幀影像
可根據實際需求選擇是否儲存評論結果及影片幀影像。
資料儲存實作
if save:
cpath = f"{file_name}.csv"
if os.path.exists(cpath):
!cp {cpath} /content/drive/MyDrive/files/comments/{cpath}
print(f"File {cpath} copied successfully.")
評論結果以CSV格式儲存,並可複製至指定儲存路徑。
#### 內容解密:
此段程式碼主要實作了自動化影片處理與評論生成系統的核心功能。首先,系統透過取樣機制選取影片中的部分幀進行分析,有效提升處理效率。接著,利用OpenAI的視覺模型對選取的幀進行分析並生成相應的評論。整個處理流程由控制中心進行協調,從影片下載、拆幀到評論生成及結果展示均實作了自動化。系統還提供了靈活的資料儲存選項,可根據需求選擇是否儲存評論結果及影片幀影像。最後,系統會輸出處理時間以評估整體效能表現。
系統最佳化方向
-
影片拆幀最佳化:可考慮採用更高效的拆幀演算法或平行處理機制來提升處理效率。
-
模型呼叫最佳化:可探索使用更先進的視覺模型或對模型輸出進行後處理以提升評論品質。
-
儲存機制最佳化:可考慮採用更高效的儲存格式或分散式儲存方案來處理大量影片資料。
-
引入動態RAG機制:可參考第五章的內容,將動態RAG(Retrieval-Augmented Generation)機制引入評論生成流程,以進一步提升評論的品質與相關性。
-
多模態融合分析:未來可考慮結合音訊、字幕等多模態資訊,進行更全面的影片內容分析。
-
自訂化評論生成:可開發自訂化評論生成模型,以滿足不同應用場景的需求。
管道2:向量儲存管理員(The Vector Store Administrator)
向量儲存管理員的功能與實作
向量儲存管理員(Vector Store Administrator)是一個AI代理,負責執行我們在第6章中實作的任務。該代理的核心功能建立在生成器(Generator)和評論器(Commentator)AI代理之上,其工作流程分為四個主要步驟,如下圖所示:
圖10.7:向量儲存管理員從處理到查詢影片幀註解的工作流程
步驟1:處理影片註解
向量儲存管理員會載入並準備註解資料,以便進行分塊處理。這一步驟與第6章中擴充套件Pinecone索引(向量儲存)的過程相似。由於我們在管道中一次處理一個影片,因此係統會刪除已處理的檔案,以保持磁碟空間的恆定。這種功能可以根據需求無限擴充套件。
步驟2:分塊和嵌入資料集
資料集的欄位名稱(‘ID’、‘FrameNumber’、‘Comment’、‘FileName’)已經由管道1中的評論器AI代理準備好。該程式使用與第6章中相同的功能對資料集進行分塊和嵌入處理。
步驟3:建立Pinecone索引
建立Pinecone索引並將資料上傳到索引中,這與第6章中的建立Pinecone索引和上傳資料的步驟相同。
步驟4:查詢向量儲存
查詢向量儲存的過程與第6章中的過程相似,但在本案例中,我們採用混合查詢的方式,同時使用Pinecone向量儲存和單獨的檔案系統來儲存影片和影片幀。
查詢Pinecone索引
在GitHub的筆記本中,步驟4:查詢Pinecone索引實作了查詢與使用者輸入匹配的註解並追蹤到影片幀的功能。這使得我們可以顯示影片源和影片幀。影片和幀檔案可以從我們希望的位置檢索和顯示。這種混合方法涉及查詢Pinecone索引以檢索資訊,並從另一個位置檢索媒體檔案。
# 定義要檢索的前k個結果的數量
k = 1 # 結果數量
# 設計一個查詢提示
query_text = "Find a basketball player that is scoring with a dunk."
# 將查詢文字嵌入以匹配向量儲存中的資料格式
import time
# 開始計時
start_time = time.time()
# 目標向量
query_embedding = get_embedding(query_text, model=embedding_model)
# 執行相似度向量搜尋
query_results = index.query(vector=query_embedding, top_k=k, include_metadata=True)
# 列印查詢結果和後設資料
print("Query Results:")
for match in query_results['matches']:
print(f"ID: {match['id']}, Score: {match['score']}")
# 檢查是否有後設資料
if 'metadata' in match:
metadata = match['metadata']
text = metadata.get('text', "No text metadata available.")
frame_number = metadata.get('frame_number', "No frame number available.")
file_name = metadata.get('file_name', "No file name available.")
# 顯示查詢結果和回應時間
print(f"Text: {text}")
print(f"Frame Number: {frame_number}")
print(f"File Name: {file_name}")
else:
print("No metadata available.")
# 測量回應時間
response_time = time.time() - start_time
print(f"Querying response time: {response_time:.2f} seconds")
內容解密:
此段程式碼展示瞭如何查詢Pinecone索引以找到與查詢文字匹配的影片幀註解。首先,我們定義了要檢索的前k個結果的數量,並設計了一個查詢提示。然後,我們將查詢文字嵌入到向量中,以便與向量儲存中的資料進行匹配。接著,我們執行相似度向量搜尋,並列印查詢結果和相關的後設資料,包括ID、評分、文字、幀編號和檔名。最後,我們測量並顯示查詢的回應時間。
圖表翻譯:
此圖示呈現了向量儲存管理員的工作流程,包括處理影片註解、分塊和嵌入資料集、建立Pinecone索引以及查詢向量儲存等步驟。該流程展示瞭如何透過混合查詢方式檢索影片幀註解和相關的媒體檔案。
向量儲存的應用與決策
在這個案例中,影片和幀檔案被儲存在GitHub倉函式庫中。在實際生產環境中,這些檔案可以從任何需要的儲存系統中檢索。是否將影像儲存在向量儲存或單獨的位置,取決於專案的需求和成本效益分析。
儲存決策的考量
- 成本考量:將媒體檔案儲存在單獨的儲存系統中可能更具成本效益,尤其是對於大型檔案。
- 系統整合:需要考慮儲存解決方案與現有系統的整合程度。
- 資料管理:單獨儲存媒體檔案可以簡化資料管理流程。
透過仔細評估這些因素,可以根據具體需求選擇最合適的儲存策略。
管道3:影片專家(Video Expert)
影片專家的角色與工作流程
OpenAI GPT-4o 影片專家的角色是分析由註解器(Commentator)代理產生的註解,指出其中的認知失調(即描述中不相符的部分),重寫註解,並提供標籤。影片專家的工作流程包含與第七章「使用Wikipedia API和LlamaIndex建立可擴充套件的知識圖譜RAG」中計算和顯示部分的程式碼。
註解器的角色僅限於描述其所看到的內容,而影片專家則負責確保描述的合理性,並為影片標籤以便後續分類別。
圖10.10:影片專家自動化動態描述和標籤的工作流程
-
連線Pinecone索引:如同管道2中的向量儲存管理員(Vector Store Administrator)部分所述,連線到Pinecone索引,但這次不是插入資料,而是連線到向量儲存。
-
定義RAG函式:使用在管道1和管道2中建立的直接函式來定義RAG函式。
-
查詢向量儲存:查詢Pinecone索引,如同管道2所述。
-
檢索增強生成:最終確定影片專家GPT-4o的主要角色,即分析和改進向量儲存查詢回應。此步驟包含評估和指標功能。
增強檢索生成(Augmented Retrieval Generation)
在GitHub上的Open Pipeline_3_The_Video_Expert.ipynb中,進入步驟2:定義RAG函式的「增強檢索生成」部分。
該函式進行OpenAI GPT-4o呼叫,類別似於管道1中的註解器,但這次LLM的角色不同:
{
"role": "system",
"content": "You will be provided with comments of an image frame taken from a video."
}
給GPT-4o的指令:
-
分析AI生成的註解:註解器保持中立,描述其所看到的幀。影片專家的角色則是分析並增強這些註解。
-
指出認知失調:找出註解中的矛盾或不一致之處,這些可能源於AI生成影片的方式(例如影片中的邏輯缺失)。
-
以邏輯和吸引人的風格重寫註解:將技術性註解轉換為描述性文字。
-
為該影像提供標籤:例如標籤:籃球、足球或其他標籤,以便後續使用。
在GitHub的步驟3:查詢向量儲存,重現了管道2中對籃球運動員扣籃的查詢和輸出,以及對應的影片和幀。
輸出結果為:
ID=f104138b-0be8-4f4c-bf99-86d0eb34f7eescore=0.866193652text=In this image, there is a person who appears to be in the process of dunking a basketball.frame_number=191file_name=basketball3.mp4
影片專家的見解:
-
認知失調:
- 該註解多餘地描述了扣籃的動作。
- 提到了「dunk」這個詞疊加在影像上。
- 背景細節,如晴朗的天空和現代建築,對於理解動作並非必要。
-
重寫的註解:
程式碼範例與詳細解說
# 定義函式以下載影片
def download(directory, file_name):
# 從GitHub下載影片檔案
url = f"https://github.com/your-repo/raw/main/{directory}/{file_name}"
response = requests.get(url)
if response.status_code == 200:
with open(file_name, 'wb') as file:
file.write(response.content)
print(f"Downloaded {file_name}")
else:
print(f"Failed to download {file_name}")
# 定義函式以顯示影片
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)
# 下載並顯示影片
file_name = "basketball3.mp4"
download("Chapter10/videos", file_name)
display_video(file_name)
內容解密:
-
download函式:該函式用於從指定的GitHub倉函式庫下載影片檔案。首先,它建構下載URL,然後傳送GET請求以下載檔案。如果請求成功(狀態碼200),則將檔案內容寫入本地檔案。 -
display_video函式:該函式用於在Jupyter Notebook中顯示下載的影片。它以二進位制模式開啟影片檔案,讀取其內容,並將其編碼為Base64格式。然後,它建立一個HTML字串,其中包含一個嵌入Base64影片的<video>標籤。 -
呼叫函式:首先呼叫
download函式以下載指定的影片檔案。然後呼叫display_video函式以顯示該影片。
圖表翻譯:影片處理流程圖
graph LR;
A[開始] --> B[下載影片];
B --> C[顯示影片];
C --> D[分析影片幀];
D --> E[生成註解];
E --> F[影片專家分析];
F --> G[重寫註解並標籤];
圖表翻譯: 此圖示描述了影片處理的整個流程,包括下載和顯示影片、分析影片幀、生成初始註解、由影片專家進行分析,最後重寫註解並為影片標籤。