مثال على استكشاف VOC
مرحباً بك في دفتر ملاحظات Ultralytics Explorer API. يقدم هذا الدفتر الموارد المتاحة لاستكشاف مجموعات البيانات باستخدام البحث الدلالي، والبحث المتجهي، واستعلامات SQL.
جرب yolo explorer (مدعوم بواجهة برمجة تطبيقات Explorer)
تثبيت ultralytics وشغل yolo explorer في جهازك الطرفي لتشغيل استعلامات مخصصة والبحث الدلالي في متصفحك.
ملاحظة من المجتمع ⚠️
اعتبارًا من ultralytics>=8.3.10، تم إهمال دعم Ultralytics Explorer. تتوفر ميزات استكشاف مجموعات البيانات المماثلة (والموسعة) في منصة Ultralytics.
الإعداد
تثبيت ultralytics والمتطلبات التبعيات، ثم تحقق من البرامج والأجهزة.
!uv pip install ultralytics[explorer] openai
yolo checks
البحث عن الصور المتشابهة
استخدم قوة البحث عن التشابه المتجه للعثور على نقاط البيانات المتشابهة في مجموعة البيانات الخاصة بك جنبًا إلى جنب مع المسافة بينها في فضاء التضمين. ما عليك سوى إنشاء جدول تضمينات لزوج مجموعة البيانات والنموذج المحدد. هذا مطلوب مرة واحدة فقط، ويتم إعادة استخدامه تلقائيًا.
exp = Explorer("VOC.yaml", model="yolo26n.pt")
exp.create_embeddings_table()
بمجرد بناء جدول التضمينات، يمكنك تشغيل البحث الدلالي بأي من الطرق التالية:
- على فهرس معين/قائمة فهارس في مجموعة البيانات، على سبيل المثال،
exp.get_similar(idx=[1, 10], limit=10) - على أي صورة / قائمة صور ليست في مجموعة البيانات - exp.get_similar(img=["path/to/img1", "path/to/img2"], limit=10) في حالة وجود مدخلات متعددة، يتم استخدام مجموع تضميناتها.
تحصل على إطار بيانات Pandas مع العدد المحدد من نقاط البيانات الأكثر تشابهاً مع المدخلات، بالإضافة إلى مسافتها في مساحة التضمين. يمكنك استخدام مجموعة البيانات هذه لإجراء المزيد من التصفية.

# Search dataset by index
similar = exp.get_similar(idx=1, limit=10)
similar.head()
يمكنك أيضًا رسم العينات المماثلة مباشرةً باستخدام plot_similar أداة

exp.plot_similar(idx=6500, limit=20)
exp.plot_similar(idx=[100, 101], limit=10) # Can also pass list of idxs or imgs
exp.plot_similar(img="https://ultralytics.com/images/bus.jpg", limit=10, labels=False) # Can also pass external images

اسأل الذكاء الاصطناعي: ابحث أو قم بالتصفية باستخدام اللغة الطبيعية
يمكنك توجيه كائن Explorer بنوع نقاط البيانات التي ترغب في رؤيتها، وسيحاول إعادة إطار بيانات بتلك النتائج. نظراً لأنه مدعوم بنماذج اللغات الكبيرة (LLMs)، فإنه لا يصيب دائماً. في هذه الحالة، سيعيد None.

df = exp.ask_ai("show me images containing more than 10 objects with at least 2 persons")
df.head(5)
لرسم هذه النتائج، يمكنك استخدام الـ plot_query_result الأداة المساعدة. مثال:
plt = plot_query_result(exp.ask_ai("show me 10 images containing exactly 2 persons"))
Image.fromarray(plt)

# plot
from PIL import Image
from ultralytics.data.explorer import plot_query_result
plt = plot_query_result(exp.ask_ai("show me 10 images containing exactly 2 persons"))
Image.fromarray(plt)
تشغيل استعلامات SQL على مجموعة البيانات الخاصة بك
قد ترغب أحيانًا في التحقيق في إدخالات معينة في مجموعة البيانات الخاصة بك. لهذا الغرض، يتيح لك مستكشف البيانات (Explorer) تنفيذ استعلامات SQL. وهو يقبل أحد التنسيقين التاليين:
- الاستعلامات التي تبدأ بـ "WHERE" ستحدد جميع الأعمدة تلقائيًا. يمكن اعتبار هذا استعلامًا مختصرًا.
- يمكنك أيضًا كتابة استعلامات كاملة حيث يمكنك تحديد الأعمدة التي تريد اختيارها.
يمكن استخدام هذا للتحقق من أداء النموذج ونقاط بيانات محددة. على سبيل المثال:
- لنفترض أن النموذج الخاص بك يعاني من صور بها بشر وكلاب. يمكنك كتابة استعلام مثل هذا لتحديد النقاط التي تحتوي على 2 من البشر على الأقل وكلب واحد على الأقل.
يمكنك الجمع بين استعلام SQL والبحث الدلالي لتصفية النتائج وصولًا إلى نوع معين.
table = exp.sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10")
exp.plot_sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10", labels=True)

table = exp.sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10")
print(table)
تمامًا مثل البحث عن التشابه، يمكنك أيضًا الحصول على أداة لرسم استعلامات SQL مباشرةً باستخدام exp.plot_sql_query

exp.plot_sql_query("WHERE labels LIKE '%person, person%' AND labels LIKE '%dog%' LIMIT 10", labels=True)
العمل مع جدول التضمينات (متقدم)
يعمل المستكشف على LanceDB جداول داخليًا. يمكنك الوصول إلى هذا الجدول مباشرةً باستخدام Explorer.table الكائنات وتشغيل الاستعلامات الأولية، ودفع عوامل التصفية المسبقة واللاحقة، وما إلى ذلك.
table = exp.table
print(table.schema)
تشغيل الاستعلامات الأولية¶
يجد بحث المتجهات أقرب المتجهات من قاعدة البيانات. في نظام التوصية أو محرك البحث، يمكنك العثور على منتجات مماثلة للمنتج الذي بحثت عنه. في نماذج اللغة الكبيرة (LLM) وتطبيقات الذكاء الاصطناعي الأخرى، يمكن تمثيل كل نقطة بيانات بواسطة التضمينات التي تم إنشاؤها من بعض النماذج، ويعيد الميزات الأكثر صلة.
البحث في فضاء متجهي عالي الأبعاد هو إيجاد أقرب K جار (KNN) لمتجه الاستعلام.
في LanceDB، المقياس (Metric) هو الطريقة التي تصف المسافة بين زوج من المتجهات. وهو يدعم حاليًا المقاييس التالية:
- L2
- جيب التمام
- يستخدم البحث عن التشابه في Dot Explorer's معيار L2 افتراضيًا. يمكنك تشغيل الاستعلامات على الجداول مباشرةً، أو استخدام تنسيق lance لإنشاء أدوات مخصصة لإدارة مجموعات البيانات. مزيد من التفاصيل حول عمليات جدول LanceDB المتاحة في الوثائق

dummy_img_embedding = [i for i in range(256)]
table.search(dummy_img_embedding).limit(5).to_pandas()
التحويل المتبادل إلى تنسيقات البيانات الشائعة
df = table.to_pandas()
pa_table = table.to_arrow()
العمل مع التضمينات
يمكنك الوصول إلى التضمين الخام من جدول lancedb وتحليله. يتم تخزين تضمينات الصور في العمود vector
import numpy as np
embeddings = table.to_pandas()["vector"].tolist()
embeddings = np.array(embeddings)
مخطط التشتت
تتمثل إحدى الخطوات الأولية في تحليل التضمينات في رسمها في فضاء ثنائي الأبعاد عبر تقليل الأبعاد. لنجرب مثالًا.

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA # pip install scikit-learn
# Reduce dimensions using PCA to 3 components for visualization in 3D
pca = PCA(n_components=3)
reduced_data = pca.fit_transform(embeddings)
# Create a 3D scatter plot using Matplotlib's Axes3D
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection="3d")
# Scatter plot
ax.scatter(reduced_data[:, 0], reduced_data[:, 1], reduced_data[:, 2], alpha=0.5)
ax.set_title("3D Scatter Plot of Reduced 256-Dimensional Data (PCA)")
ax.set_xlabel("Component 1")
ax.set_ylabel("Component 2")
ax.set_zlabel("Component 3")
plt.show()
مؤشر التشابه
إليك مثال بسيط لعملية مدعومة بجدول التضمينات. يأتي المستكشف مزودًا بـ similarity_index عملية-
- تحاول تقدير مدى تشابه كل نقطة بيانات مع بقية مجموعة البيانات.
- يقوم بذلك عن طريق حساب عدد تضمينات الصور التي تقع على مسافة أقرب من max_dist إلى الصورة الحالية في فضاء التضمين الذي تم إنشاؤه، مع الأخذ في الاعتبار أفضل top_k من الصور المتشابهة في كل مرة.
بالنسبة لمجموعة بيانات معينة، نموذج، max_dist & top_k سيتم إعادة استخدام فهرس التشابه بمجرد إنشائه. في حال تغيرت مجموعة البيانات الخاصة بك، أو كنت بحاجة ببساطة إلى إعادة إنشاء فهرس التشابه، يمكنك تمرير force=True. على غرار البحث المتجه و SQL، يأتي هذا أيضًا مع أداة لرسمه مباشرةً.
sim_idx = exp.similarity_index(max_dist=0.2, top_k=0.01)
exp.plot_similarity_index(max_dist=0.2, top_k=0.01)

لننظر إلى الحبكة أولاً
exp.plot_similarity_index(max_dist=0.2, top_k=0.01)
الآن دعونا نلقي نظرة على ناتج العملية
sim_idx = exp.similarity_index(max_dist=0.2, top_k=0.01, force=False)
sim_idx
لنقم بإنشاء استعلام لمعرفة نقاط البيانات التي لديها عدد تشابه أكثر من 30 ورسم صور مشابهة لها.
import numpy as np
sim_count = np.array(sim_idx["count"])
sim_idx["im_file"][sim_count > 30]
يجب أن ترى شيئًا كهذا

exp.plot_similar(idx=[7146, 14035]) # Using avg embeddings of 2 images
