بحث الفيديو المتقدم: الاستفادة من مختبرات Twelve Labs و Milvus للاسترجاع الدلالي
مقدمة
مرحبًا بكم في هذا البرنامج التعليمي الشامل حول تنفيذ البحث الدلالي عن الفيديو باستخدام واجهة برمجة تطبيقات Twelve Labs Embed API و Milvus. في هذا الدليل، سنستكشف في هذا الدليل كيفية تسخير قوة التضمينات متعددة الوسائط المتقدمة من Twelve Labs وقاعدة بيانات Milvus الفعالة المتجهة لإنشاء حل بحث فيديو قوي. من خلال دمج هذه التقنيات، يمكن للمطورين فتح إمكانيات جديدة في تحليل محتوى الفيديو، مما يتيح تطبيقات مثل استرجاع الفيديو القائم على المحتوى، وأنظمة التوصيات، ومحركات البحث المتطورة التي تفهم الفروق الدقيقة في بيانات الفيديو.
سيرشدك هذا البرنامج التعليمي خلال العملية بأكملها، بدءًا من إعداد بيئة التطوير الخاصة بك إلى تنفيذ تطبيق بحث دلالي وظيفي للفيديو. سنغطي المفاهيم الأساسية مثل توليد تضمينات متعددة الوسائط من مقاطع الفيديو، وتخزينها بكفاءة في ميلفوس، وإجراء عمليات البحث عن التشابه لاسترداد المحتوى ذي الصلة. سواء كنت تقوم ببناء منصة لتحليلات الفيديو، أو أداة لاكتشاف المحتوى، أو تحسين تطبيقاتك الحالية بقدرات البحث عن الفيديو، سيزودك هذا الدليل بالمعرفة والخطوات العملية للاستفادة من نقاط القوة المشتركة ل Twelve Labs و Milvus في مشاريعك.
المتطلبات الأساسية
قبل أن نبدأ، تأكد من حصولك على ما يلي:
مفتاح Twelve Labs API (قم بالتسجيل في https://api.twelvelabs.io إذا لم يكن لديك واحد) بايثون 3.7 أو أحدث مثبت على نظامك
إعداد بيئة التطوير
قم بإنشاء دليل جديد لمشروعك وانتقل إليه:
mkdir video-search-tutorial
cd video-search-tutorial
قم بإعداد بيئة افتراضية (اختياري ولكن يوصى به):
python -m venv venv
source venv/bin/activate # On Windows, use `venv\Scripts\activate`
تثبيت مكتبات بايثون المطلوبة:
pip install twelvelabs pymilvus
قم بإنشاء ملف بايثون جديد لمشروعك:
touch video_search.py
سيكون ملف video_search.py هذا هو البرنامج النصي الرئيسي الذي نستخدمه في البرنامج التعليمي. بعد ذلك، قم بإعداد مفتاح Twelve Labs API الخاص بك كمتغير بيئة للأمان:
export TWELVE_LABS_API_KEY='your_api_key_here'
الاتصال بـ Milvus
لإنشاء اتصال مع Milvus، سنستخدم فئة MilvusClient. يبسط هذا النهج عملية الاتصال ويسمح لنا بالعمل مع مثيل Milvus محلي قائم على ملف محلي، وهو مثالي لبرنامجنا التعليمي.
from pymilvus import MilvusClient
# Initialize the Milvus client
milvus_client = MilvusClient("milvus_twelvelabs_demo.db")
print("Successfully connected to Milvus")
يقوم هذا الرمز بإنشاء مثيل عميل Milvus جديد يقوم بتخزين جميع البيانات في ملف باسم milvus_twelvelvelabs_demo.db. هذا النهج القائم على الملفات مثالي لأغراض التطوير والاختبار.
إنشاء مجموعة ميلفوس لتضمين الفيديو
الآن بعد أن أصبحنا متصلين ب Milvus، دعونا ننشئ مجموعة لتخزين تضمينات الفيديو والبيانات الوصفية المرتبطة بها. سنقوم بتعريف مخطط المجموعة وإنشاء المجموعة إذا لم تكن موجودة بالفعل.
# Initialize the collection name
collection_name = "twelvelabs_demo_collection"
# Check if the collection already exists and drop it if it does
if milvus_client.has_collection(collection_name=collection_name):
milvus_client.drop_collection(collection_name=collection_name)
# Create the collection
milvus_client.create_collection(
collection_name=collection_name,
dimension=1024 # The dimension of the Twelve Labs embeddings
)
print(f"Collection '{collection_name}' created successfully")
في هذه الشيفرة، نتحقق أولًا مما إذا كانت المجموعة موجودة بالفعل ونحذفها إذا كانت موجودة بالفعل. هذا يضمن أن نبدأ بسجل نظيف. ننشئ المجموعة ببُعد 1024، وهو ما يطابق بُعد الإخراج لتضمينات Twelve Labs.
توليد التضمينات باستخدام واجهة برمجة تطبيقات Twelve Labs Embed API
لتوليد تضمينات لمقاطع الفيديو الخاصة بنا باستخدام واجهة برمجة تطبيقات Twelve Labs Embed API، سنستخدم مجموعة أدوات تطوير البرمجيات الخاصة ب Twelve Labs Python SDK. تتضمن هذه العملية إنشاء مهمة تضمين، وانتظار اكتمالها، واسترداد النتائج. إليك كيفية تنفيذ ذلك:
أولاً، تأكد أولاً من تثبيت Twelve Labs SDK واستيراد الوحدات النمطية اللازمة:
from twelvelabs import TwelveLabs
from twelvelabs.models.embed import EmbeddingsTask
import os
# Retrieve the API key from environment variables
TWELVE_LABS_API_KEY = os.getenv('TWELVE_LABS_API_KEY')
قم بتهيئة عميل Twelve Labs:
twelvelabs_client = TwelveLabs(api_key=TWELVE_LABS_API_KEY)
إنشاء دالة لإنشاء تضمينات لعنوان URL فيديو معين:
def generate_embedding(video_url):
"""
Generate embeddings for a given video URL using the Twelve Labs API.
This function creates an embedding task for the specified video URL using
the Marengo-retrieval-2.6 engine. It monitors the task progress and waits
for completion. Once done, it retrieves the task result and extracts the
embeddings along with their associated metadata.
Args:
video_url (str): The URL of the video to generate embeddings for.
Returns:
tuple: A tuple containing two elements:
1. list: A list of dictionaries, where each dictionary contains:
- 'embedding': The embedding vector as a list of floats.
- 'start_offset_sec': The start time of the segment in seconds.
- 'end_offset_sec': The end time of the segment in seconds.
- 'embedding_scope': The scope of the embedding (e.g., 'shot', 'scene').
2. EmbeddingsTaskResult: The complete task result object from Twelve Labs API.
Raises:
Any exceptions raised by the Twelve Labs API during task creation,
execution, or retrieval.
"""
# Create an embedding task
task = twelvelabs_client.embed.task.create(
engine_name="Marengo-retrieval-2.6",
video_url=video_url
)
print(f"Created task: id={task.id} engine_name={task.engine_name} status={task.status}")
# Define a callback function to monitor task progress
def on_task_update(task: EmbeddingsTask):
print(f" Status={task.status}")
# Wait for the task to complete
status = task.wait_for_done(
sleep_interval=2,
callback=on_task_update
)
print(f"Embedding done: {status}")
# Retrieve the task result
task_result = twelvelabs_client.embed.task.retrieve(task.id)
# Extract and return the embeddings
embeddings = []
for v in task_result.video_embeddings:
embeddings.append({
'embedding': v.embedding.float,
'start_offset_sec': v.start_offset_sec,
'end_offset_sec': v.end_offset_sec,
'embedding_scope': v.embedding_scope
})
return embeddings, task_result
استخدم الدالة لإنشاء تضمينات لمقاطع الفيديو الخاصة بك:
# Example usage
video_url = "https://example.com/your-video.mp4"
# Generate embeddings for the video
embeddings, task_result = generate_embedding(video_url)
print(f"Generated {len(embeddings)} embeddings for the video")
for i, emb in enumerate(embeddings):
print(f"Embedding {i+1}:")
print(f" Scope: {emb['embedding_scope']}")
print(f" Time range: {emb['start_offset_sec']} - {emb['end_offset_sec']} seconds")
print(f" Embedding vector (first 5 values): {emb['embedding'][:5]}")
print()
يسمح لك هذا التطبيق بإنشاء تضمينات لأي عنوان URL للفيديو باستخدام واجهة برمجة تطبيقات Twelve Labs Embeding API. تعالج الدالة gener_embedding العملية بأكملها، بدءًا من إنشاء المهمة إلى استرداد النتائج. تقوم بإرجاع قائمة من القواميس، يحتوي كل منها على متجه التضمين مع بياناته الوصفية (النطاق الزمني والنطاق).تذكر أن تتعامل مع الأخطاء المحتملة، مثل مشاكل الشبكة أو حدود واجهة برمجة التطبيقات، في بيئة الإنتاج. قد ترغب أيضًا في تنفيذ عمليات إعادة المحاولة أو معالجة أخطاء أكثر قوة بناءً على حالة الاستخدام الخاصة بك.
إدراج التضمينات في ميلفوس
بعد إنشاء التضمينات باستخدام واجهة برمجة تطبيقات Twelve Labs Embed API، فإن الخطوة التالية هي إدراج هذه التضمينات مع بياناتها الوصفية في مجموعة Milvus الخاصة بنا. تسمح لنا هذه العملية بتخزين وفهرسة تضمينات الفيديو الخاصة بنا للبحث الفعال عن التشابه لاحقًا.
إليك كيفية إدراج التضمينات في Milvus:
def insert_embeddings(milvus_client, collection_name, task_result, video_url):
"""
Insert embeddings into the Milvus collection.
Args:
milvus_client: The Milvus client instance.
collection_name (str): The name of the Milvus collection to insert into.
task_result (EmbeddingsTaskResult): The task result containing video embeddings.
video_url (str): The URL of the video associated with the embeddings.
Returns:
MutationResult: The result of the insert operation.
This function takes the video embeddings from the task result and inserts them
into the specified Milvus collection. Each embedding is stored with additional
metadata including its scope, start and end times, and the associated video URL.
"""
data = []
for i, v in enumerate(task_result.video_embeddings):
data.append({
"id": i,
"vector": v.embedding.float,
"embedding_scope": v.embedding_scope,
"start_offset_sec": v.start_offset_sec,
"end_offset_sec": v.end_offset_sec,
"video_url": video_url
})
insert_result = milvus_client.insert(collection_name=collection_name, data=data)
print(f"Inserted {len(data)} embeddings into Milvus")
return insert_result
# Usage example
video_url = "https://example.com/your-video.mp4"
# Assuming this function exists from previous step
embeddings, task_result = generate_embedding(video_url)
# Insert embeddings into the Milvus collection
insert_result = insert_embeddings(milvus_client, collection_name, task_result, video_url)
print(insert_result)
تقوم هذه الدالة بإعداد البيانات للإدراج، بما في ذلك جميع البيانات الوصفية ذات الصلة مثل متجه التضمين والنطاق الزمني وعنوان URL لمصدر الفيديو. ثم يستخدم عميل Milvus لإدراج هذه البيانات في المجموعة المحددة.
إجراء بحث التشابه
بمجرد أن نحصل على التضمينات المخزنة في Milvus، يمكننا إجراء عمليات بحث عن التشابه للعثور على مقاطع الفيديو الأكثر صلة بناءً على متجه الاستعلام. إليك كيفية تنفيذ هذه الوظيفة:
def perform_similarity_search(milvus_client, collection_name, query_vector, limit=5):
"""
Perform a similarity search on the Milvus collection.
Args:
milvus_client: The Milvus client instance.
collection_name (str): The name of the Milvus collection to search in.
query_vector (list): The query vector to search for similar embeddings.
limit (int, optional): The maximum number of results to return. Defaults to 5.
Returns:
list: A list of search results, where each result is a dictionary containing
the matched entity's metadata and similarity score.
This function searches the specified Milvus collection for embeddings similar to
the given query vector. It returns the top matching results, including metadata
such as the embedding scope, time range, and associated video URL for each match.
"""
search_results = milvus_client.search(
collection_name=collection_name,
data=[query_vector],
limit=limit,
output_fields=["embedding_scope", "start_offset_sec", "end_offset_sec", "video_url"]
)
return search_results
# define the query vector
# We use the embedding inserted previously as an example. In practice, you can replace it with any video embedding you want to query.
query_vector = task_result.video_embeddings[0].embedding.float
# Perform a similarity search on the Milvus collection
search_results = perform_similarity_search(milvus_client, collection_name, query_vector)
print("Search Results:")
for i, result in enumerate(search_results[0]):
print(f"Result {i+1}:")
print(f" Video URL: {result['entity']['video_url']}")
print(f" Time Range: {result['entity']['start_offset_sec']} - {result['entity']['end_offset_sec']} seconds")
print(f" Similarity Score: {result['distance']}")
print()
يقوم هذا التنفيذ بما يلي:
- يُعرّف الدالة perform_similarity_search التي تأخذ متجه استعلام وتبحث عن تضمينات مشابهة في مجموعة Milvus.
- يستخدم طريقة بحث عميل Milvus للعثور على المتجهات الأكثر تشابهًا.
- يحدد حقول الإخراج التي نريد استردادها، بما في ذلك البيانات الوصفية حول مقاطع الفيديو المطابقة.
- يقدم مثالاً على كيفية استخدام هذه الدالة مع فيديو استعلام، حيث يتم أولاً إنشاء تضمينها ثم استخدامها للبحث.
- يطبع نتائج البحث، بما في ذلك البيانات الوصفية ذات الصلة ودرجات التشابه.
من خلال تنفيذ هذه الدوال، تكون قد أنشأت سير عمل كامل لتخزين تضمينات الفيديو في ملفوس وإجراء عمليات البحث عن التشابه. يسمح هذا الإعداد باسترجاع فعال لمحتوى الفيديو المتشابه بناءً على التضمينات متعددة الوسائط التي تم إنشاؤها بواسطة واجهة برمجة تطبيقات التضمين في Twelve Labs.
تحسين الأداء
حسنًا، لننتقل بهذا التطبيق إلى المستوى التالي! عند التعامل مع مجموعات الفيديو واسعة النطاق، فإن الأداء هو المفتاح. ولتحسين الأداء، يجب علينا تنفيذ المعالجة المجمعة لتوليد التضمين والإدراج في Milvus. بهذه الطريقة، يمكننا التعامل مع العديد من مقاطع الفيديو في وقت واحد، مما يقلل بشكل كبير من وقت المعالجة الإجمالي. بالإضافة إلى ذلك، يمكننا الاستفادة من ميزة التقسيم في ميلفوس لتنظيم بياناتنا بشكل أكثر كفاءة، ربما حسب فئات الفيديو أو الفترات الزمنية. سيؤدي ذلك إلى تسريع الاستعلامات من خلال السماح لنا بالبحث في الأقسام ذات الصلة فقط.
هناك حيلة تحسين أخرى تتمثل في استخدام آليات التخزين المؤقت للتضمينات أو نتائج البحث التي يتم الوصول إليها بشكل متكرر. يمكن أن يؤدي ذلك إلى تحسين أوقات الاستجابة للاستعلامات الشائعة بشكل كبير. لا تنسَ أن تضبط معلمات فهرس ميلفوس بدقة بناءً على مجموعة بياناتك وأنماط الاستعلام الخاصة بك - يمكن أن يؤدي القليل من التعديل هنا إلى قطع شوط طويل في تعزيز أداء البحث.
الميزات المتقدمة
والآن، دعونا نضيف بعض الميزات الرائعة لجعل تطبيقنا مميزاً! يمكننا تنفيذ بحث هجين يجمع بين الاستعلامات النصية والفيديو. في واقع الأمر، يمكن لـ Twelve Labs Embed API أيضًا إنشاء تضمينات نصية لاستعلاماتك النصية. تخيّل السماح للمستخدمين بإدخال وصف نصي ونموذج لمقطع فيديو - سنقوم بإنشاء تضمينات لكليهما وإجراء بحث مرجح في ميلفوس. سيعطينا هذا نتائج فائقة الدقة.
إضافة رائعة أخرى ستكون البحث الزمني داخل مقاطع الفيديو. يمكننا تقسيم مقاطع الفيديو الطويلة إلى مقاطع أصغر، لكل منها تضمين خاص به. بهذه الطريقة، يمكن للمستخدمين العثور على لحظات محددة داخل مقاطع الفيديو، وليس فقط مقاطع كاملة. ولمَ لا نضيف بعض تحليلات الفيديو الأساسية؟ يمكننا استخدام التضمينات لتجميع مقاطع الفيديو المتشابهة، أو اكتشاف الاتجاهات، أو حتى تحديد القيم المتطرفة في مجموعات الفيديو الكبيرة.
معالجة الأخطاء وتسجيلها
دعونا نواجه الأمر، يمكن أن تسوء الأمور، وعندما تسوء، يجب أن نكون مستعدين. تنفيذ معالجة قوية للأخطاء أمر بالغ الأهمية. يجب أن نغلف مكالمات واجهة برمجة التطبيقات وعمليات قاعدة البيانات في كتل "حاول إلا"، مع توفير رسائل خطأ مفيدة للمستخدمين عند فشل شيء ما. بالنسبة للمشكلات المتعلقة بالشبكة، يمكن أن يساعد تنفيذ عمليات إعادة المحاولة مع إعادة التشغيل الأسية في التعامل مع مواطن الخلل المؤقتة بأمان.
أما بالنسبة للتسجيل، فهو أفضل صديق لنا لتصحيح الأخطاء والمراقبة. يجب أن نستخدم وحدة تسجيل Python لتتبع الأحداث المهمة والأخطاء ومقاييس الأداء في تطبيقنا. لنقم بإعداد مستويات سجلات مختلفة - DEBUG للتطوير، و INFO للتشغيل العام، و ERROR للمشاكل الحرجة. ولا تنسَ تنفيذ تدوير السجل لإدارة أحجام الملفات. مع وجود السجل المناسب، سنتمكن من تحديد المشكلات وحلها بسرعة، مما يضمن تشغيل تطبيق البحث عن الفيديو بسلاسة حتى مع زيادة حجمه.
الخاتمة
تهانينا! لقد أنشأت الآن تطبيقًا قويًا للبحث عن الفيديو الدلالي باستخدام واجهة برمجة تطبيقات Twelve Labs Embed API و Milvus. يتيح لك هذا التكامل معالجة محتوى الفيديو وتخزينه واسترجاعه بدقة وكفاءة غير مسبوقة. وبالاستفادة من التضمينات متعددة الوسائط، تكون قد أنشأت نظامًا يفهم الفروق الدقيقة في بيانات الفيديو، مما يفتح لك إمكانيات مثيرة لاكتشاف المحتوى وأنظمة التوصيات وتحليلات الفيديو المتقدمة.
بينما تستمر في تطوير تطبيقك وتحسينه، تذكّر أن الجمع بين توليد التضمين المتقدم من Twelve Labs والتخزين المتجه القابل للتطوير من Milvus يوفر أساسًا قويًا لمعالجة تحديات فهم الفيديو الأكثر تعقيدًا. نحن نشجعك على تجربة الميزات المتقدمة التي تمت مناقشتها وتخطي حدود الممكن في البحث عن الفيديو وتحليله.