多模態資料集的處理通常涉及多種資料型別的整合,例如影像、文字和數值資料。理解資料集結構和內容是有效利用資料的關鍵。本文以VisDrone資料集為例,示範如何使用Python和相關函式庫載入和處理資料,包含影像、邊界框和標籤等資訊。透過解析資料集結構,我們可以理解不同資料型別之間的關係,並利用這些資訊建立多模態查詢引擎。此引擎能根據使用者輸入的文字查詢相關影像,並在影像上標示出對應的邊界框,方便使用者快速定位和理解查詢結果。此外,文章也探討瞭如何使用LlamaIndex建立多模態向量儲存和實作高效查詢,並提供效能評估方法,以確保查詢引擎的準確性和效率。
多模態資料集處理與查詢引擎建立
在進行多模態資料集處理時,我們首先需要了解資料集的結構以及如何有效地利用這些資料。本文將以VisDrone資料集為例,介紹如何載入資料集、導航資料集結構、以及建立多模態查詢引擎。
載入VisDrone資料集
首先,我們需要載入VisDrone資料集。VisDrone資料集是一種多模態資料集,包含影像、邊界框以及標籤等資訊。以下是一個範例程式碼,展示如何載入VisDrone資料集:
import pandas as pd
# 建立一個空的DataFrame,定義資料集的結構
df = pd.DataFrame(columns=['image', 'boxes', 'labels'])
# 遍歷資料集中的樣本
for i, sample in enumerate(ds):
# 影像資料(選擇路徑或壓縮表示)
df.loc[i, 'image'] = sample.images.tobytes() # 儲存壓縮的影像資料
# 邊界框資料(以列表形式儲存)
boxes_list = sample.boxes.numpy(aslist=True)
df.loc[i, 'boxes'] = [box.tolist() for box in boxes_list]
# 標籤資料(以列表形式儲存)
label_data = sample.labels.data()
df.loc[i, 'labels'] = label_data['text']
內容解密:
- 我們使用
pandas函式庫建立一個空的DataFrame,定義了三個欄位:image、boxes和labels,分別用於儲存影像資料、邊界框資料和標籤資料。 - 遍歷資料集中的每個樣本,將影像資料、邊界框資料和標籤資料儲存到DataFrame中。
- 影像資料以位元組流的形式儲存,邊界框資料和標籤資料則以列表形式儲存。
瞭解VisDrone資料集的內容
載入資料集後,我們需要了解資料集的內容。VisDrone資料集包含6471張影像,每張影像都有對應的邊界框和標籤。以下是資料集的範例輸出:
# 顯示資料集中的標籤列表
labels_list = ds.labels.info['class_names']
print(labels_list)
輸出結果如下:
['ignored regions', 'pedestrian', 'people', 'bicycle', 'car', 'van', 'truck', 'tricycle', 'awning-tricycle', 'bus', 'motor', 'others']
內容解密:
- 資料集中的標籤列表包含了12種類別,分別對應不同的物體,如行人、車輛等。
- 這些標籤將用於後續的邊界框標註和查詢引擎建立。
導航多模態資料集結構
接下來,我們將選取一張影像並顯示它,同時在影像上新增邊界框。
選取並顯示影像
# 選取第一張影像
ind = 0
image = ds.images[ind].numpy()
# 顯示影像
import cv2
from PIL import Image
from IPython.display import display
# 將影像從BGR轉換為RGB
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 建立PIL影像並顯示
img = Image.fromarray(image_rgb)
display(img)
內容解密:
- 我們選取資料集中的第一張影像,並將其轉換為RGB格式。
- 使用PIL函式庫建立影像並顯示。
新增邊界框
# 定義一個函式,用於在影像上新增邊界框
def display_image_with_bboxes(image_data, bboxes, labels, label_name):
# ...
# 新增邊界框
draw = ImageDraw.Draw(img)
for idx, box in enumerate(bboxes):
if idx in relevant_indices:
x1, y1, w, h = box
x2, y2 = x1 + w, y1 + h
draw.rectangle([x1, y1, x2, y2], outline="red", width=2)
draw.text((x1, y1), label_name, fill="red")
# 儲存影像
save_path = "boxed_image.jpg"
img.save(save_path)
display(img)
# 新增邊界框並顯示
labels = ds.labels[ind].data()['value']
image_data = ds.images[ind].tobytes()
bboxes = ds.boxes[ind].numpy()
label_name = "truck"
display_image_with_bboxes(image_data, bboxes, labels, label_name)
內容解密:
- 我們定義了一個函式
display_image_with_bboxes,用於在影像上新增邊界框。 - 函式根據指定的標籤名稱篩選邊界框,並在影像上繪製紅色的邊界框。
- 最後儲存並顯示新增邊界框後的影像。
建立多模態查詢引擎
最後,我們將建立一個多模態查詢引擎,用於檢索VisDrone資料集中的影像。查詢引擎將根據使用者輸入的文字,檢索相關的影像資訊並提供文字回應。
建立向量索引
# 為DataFrame中的每一行建立向量索引
# ...
建立查詢引擎
# 建立查詢引擎
# ...
查詢引擎工作流程
- 根據使用者輸入的文字,檢索相關的影像資訊。
- 解析查詢結果中的節點,找出與使用者輸入相關的關鍵字。
- 解析查詢結果中的節點,找出原始影像。
透過以上步驟,我們成功建立了一個多模態查詢引擎,可以根據使用者輸入的文字檢索VisDrone資料集中的影像。
多模態向量儲存與查詢引擎的實作
在現代人工智慧應用中,多模態資料處理已成為關鍵技術之一。本章將探討如何使用LlamaIndex建立多模態向量儲存並實作高效查詢。
建立向量索引與查詢引擎
首先,我們需要建立一個包含多模態資料的向量索引。這個過程涉及以下幾個關鍵步驟:
1. 資料準備
我們首先載入並處理多模態資料集。在這個範例中,我們使用VisDrone資料集,其中包含無人機拍攝的影像及其相關標籤。
# 為DataFrame新增唯一ID
df['doc_id'] = df.index.astype(str)
2. 建立檔案物件
接下來,我們將資料集中的每一筆記錄轉換為LlamaIndex的檔案物件。
documents = []
for _, row in df.iterrows():
text_labels = row['labels']
text = " ".join(text_labels)
document = Document(text=text, doc_id=row['doc_id'])
documents.append(document)
3. 建立向量索引
使用LlamaIndex的GPTVectorStoreIndex建立向量索引。
from llama_index.core import GPTVectorStoreIndex
vector_store_index = GPTVectorStoreIndex.from_documents(documents)
4. 設定查詢引擎
建立查詢引擎以便對向量索引進行查詢。
vector_query_engine = vector_store_index.as_query_engine(similarity_top_k=3)
執行查詢操作
現在我們可以使用建立好的查詢引擎對多模態資料集進行查詢。
start_time = time.time()
response = vector_query_engine.query(user_input)
end_time = time.time()
elapsed_time = end_time - start_time
print(f"查詢執行時間:{elapsed_time:.4f} 秒")
查詢結果將提供相關的文字回應和來源節點資訊。
查詢結果處理
我們可以進一步解析查詢結果中的節點資訊,提取唯一的詞彙。
def get_unique_words(text):
text = text.lower().strip()
words = text.split()
unique_words = [word for word, _ in groupby(sorted(words))]
return unique_words
for node in response.source_nodes:
node_text = node.get_text()
unique_words = get_unique_words(node_text)
print("節點中的唯一詞彙:", unique_words)
顯示來源影像
最後,我們可以根據查詢結果中的來源節點資訊,顯示相關的影像並加上邊界框。
def process_and_display(response, df, ds, unique_words):
# 處理節點並顯示相關影像
for node in response.source_nodes:
# 找到對應的影像索引
doc_id = node.node_id
# 顯示影像並加上邊界框
display_image_with_bboxes(image_data, bboxes, labels, label_names)
process_and_display(response, df, ds, unique_words)
顯示結果
最終輸出將包括:
- 使用者輸入
- LLM回應
- 相關來源影像(包含邊界框)
# 1. 使用者輸入
print(user_input)
# 2. LLM回應
print(textwrap.fill(str(llm_response), 100))
# 3. 多模態回應(顯示影像)
image_path = "/content/boxed_image.jpg"
display_source_image(image_path)
內容解密:
-
查詢流程:首先建立多模態向量索引,然後使用查詢引擎進行查詢,最後處理查詢結果。
-
結果呈現:查詢結果包括文字回應和相關影像,影像中標示出相關目標的邊界框。
-
技術優勢:這種多模態查詢系統能夠有效整合文字和影像資訊,提供更豐富的查詢結果。
-
擴充套件多模態資料型別:目前系統主要處理影像和文字資料,未來可以擴充套件到更多資料型別,如音訊、視訊等。
-
最佳化查詢效能:透過改進索引結構和查詢演算法,提高查詢效率和準確性。
-
增強結果視覺化:開發更豐富的視覺化工具,以更直觀的方式呈現查詢結果。
多模態RAG系統的效能評估:從文字到影像的全面解析
在開發多模態RAG(檢索增強生成)系統時,效能評估是一項至關重要的任務。與傳統的文字生成模型不同,多模態系統不僅需要處理文字資訊,還需要處理影像等多模態資料。因此,評估指標的設計必須同時考慮文字和影像的品質。本文將詳細介紹如何評估多模態RAG系統的效能,包括文字相似度評估、影像分析以及整體系統效能的計算。
LLM效能評估指標
首先,我們需要評估大語言模型(LLM)的效能。LLM負責生成文字回應,因此我們需要一個合適的指標來衡量生成的文字與輸入提示之間的相關性。餘弦相似度(Cosine Similarity)是一種常用的評估文字相似度的方法。
餘弦相似度計算
我們使用sklearn和sentence_transformers函式庫來計算文字之間的餘弦相似度。首先,我們定義一個函式calculate_cosine_similarity_with_embeddings來計算兩個文字之間的相似度:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
def calculate_cosine_similarity_with_embeddings(text1, text2):
embeddings1 = model.encode(text1)
embeddings2 = model.encode(text2)
similarity = cosine_similarity([embeddings1], [embeddings2])
return similarity[0][0]
實際應用範例
假設我們有一個使用者輸入和對應的LLM回應:
user_input = "無人機如何識別卡車?"
llm_response = "無人機可以透過視覺檢測和跟蹤來識別卡車。"
llm_similarity_score = calculate_cosine_similarity_with_embeddings(user_input, llm_response)
print(f"Cosine Similarity Score: {llm_similarity_score:.3f}")
輸出結果為:
Cosine Similarity Score: 0.691
這個分數表示LLM生成的文字與使用者輸入之間的相似度。
多模態效能評估指標
評估多模態RAG系統的效能不僅需要考慮文字回應,還需要評估生成的影像是否符合預期。由於影像評估比文字評估更具挑戰性,我們需要藉助先進的電腦視覺技術。
影像分析與評估
我們使用GPT-4o模型來分析影像並生成描述。首先,我們需要將影像編碼為Base64格式,以便傳輸給GPT-4o:
import base64
IMAGE_PATH = "/content/boxed_image.jpg"
def encode_image(image_path):
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode("utf-8")
base64_image = encode_image(IMAGE_PATH)
接下來,我們呼叫GPT-4o模型來分析影像:
from openai import OpenAI
client = OpenAI(api_key=openai.api_key)
MODEL = "gpt-4o"
response = client.chat.completions.create(
model=MODEL,
messages=[
{"role": "system", "content": "你是一個有幫助的助手。"},
{"role": "user", "content": [
{"type": "text", "text": "分析以下影像並描述其中包含的物件。"},
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{base64_image}"}}
]}
],
temperature=0.0,
)
response_image = response.choices[0].message.content
print(response_image)
影像描述範例
GPT-4o生成的影像描述可能如下:
該影像包含兩個卡車,分別位於兩個邊界框內。
1. **第一個卡車(上邊界框)**:
- 該卡車似乎是一個平板電腦卡車。
- 它裝載了各種材料,可能與建築相關。
- 卡車停放在一個有其他建築材料的區域。
2. **第二個卡車(下邊界框)**:
- 該卡車也是平板電腦卡車。
- 它運載了不同型別的材料,與第一個卡車類別似。
- 卡車所處的環境相似,周圍有建築材料。
兩個卡車都位於建築或工業區域,可能用於建築用途。
影像評估
我們可以使用餘弦相似度來評估GPT-4o生成的影像描述與預期標籤之間的相似度:
u_word = "卡車"
resp = u_word + "s"
multimodal_similarity_score = calculate_cosine_similarity_with_embeddings(resp, response_image)
print(f"Cosine Similarity Score: {multimodal_similarity_score:.3f}")
輸出結果為:
Cosine Similarity Score: 0.505
這個分數表示影像描述與預期標籤之間的相似度。
整體系統效能評估
為了獲得多模態RAG系統的整體效能,我們可以計算LLM文字相似度和多模態影像相似度的平均值:
score = (llm_similarity_score + multimodal_similarity_score) / 2
print(f"Multimodal, Modular Score: {score:.3f}")
輸出結果為:
Multimodal, Modular Score: 0.598
這個綜合分數反映了系統的整體效能。
未來,我們可以進一步最佳化多模態RAG系統的效能評估方法,例如:
- 改進影像分析技術:使用更先進的電腦視覺模型來提高影像描述的準確性。
- 多模態融合評估:開發能夠同時考慮文字和影像資訊的綜合評估指標。
- 人工評估與自動評估結合:結合人工評估和自動評估方法,以提高評估的準確性和可靠性。
透過這些改進,我們可以進一步提升多模態RAG系統的效能和實用性,使其在更多領域發揮重要作用。