Datasets documentation
إنشاء مجموعة بيانات فيديو
إنشاء مجموعة بيانات فيديو
ستُظهر لك هذه الدليل كيفية إنشاء مجموعة بيانات فيديو باستخدام VideoFolder وبعض البيانات الوصفية. هذا حل بدون كتابة أكواد لإنشاء مجموعة بيانات فيديو بسرعة تحتوي على آلاف مقاطع الفيديو.
يمكنك التحكم في الوصول إلى مجموعة بياناتك من خلال اشتراط مشاركة المستخدمين لمعلومات التواصل الخاصة بهم أولاً. اطّلع على دليل مجموعات البيانات المُقيَّدة لمزيد من المعلومات حول كيفية تفعيل هذه الميزة على Hub.
VideoFolder
VideoFolder هو مُنشئ مجموعة بيانات مصمّم لتحميل مجموعة بيانات فيديو تضم آلاف مقاطع الفيديو بسرعة دون الحاجة إلى كتابة أي كود.
💡 اطّلع على تسلسل هرمية نمط التقسيم لمعرفة المزيد حول كيفية إنشاء
VideoFolderلتقسيمات مجموعة البيانات بناءً على بنية مستودع مجموعة البيانات الخاص بك.
يستنتج VideoFolder تلقائيًا تسميات الفئات في مجموعة بياناتك بناءً على اسم المجلد. قم بتخزين مجموعة بياناتك في بنية مجلدات على النحو التالي:
folder/train/dog/golden_retriever.mp4
folder/train/dog/german_shepherd.mp4
folder/train/dog/chihuahua.mp4
folder/train/cat/maine_coon.mp4
folder/train/cat/bengal.mp4
folder/train/cat/birman.mp4إذا كانت مجموعة البيانات تتبع بنية VideoFolder، فيمكنك تحميلها مباشرةً باستخدام load_dataset():
>>> from datasets import load_dataset
>>> dataset = load_dataset("path/to/folder")يعادل هذا تمرير videofolder يدويًا في load_dataset() والمجلد في data_dir:
>>> dataset = load_dataset("videofolder", data_dir="/path/to/folder")يمكنك أيضًا استخدام videofolder لتحميل مجموعات بيانات تتضمن تقسيمات متعددة. للقيام بذلك، يجب أن يكون لمجلد مجموعة البيانات البنية التالية:
folder/train/dog/golden_retriever.mp4
folder/train/cat/maine_coon.mp4
folder/test/dog/german_shepherd.mp4
folder/test/cat/bengal.mp4إذا كانت جميع ملفات الفيديو موجودة في مجلد واحد أو لم تكن على نفس مستوى هيكل المجلدات، فلن يتم إضافة عمود
labelتلقائيًا. إذا كنت بحاجة إليه، فقم بتعيينdrop_labels=Falseبشكل صريح.
إذا كانت هناك معلومات إضافية ترغب في تضمينها حول مجموعة بياناتك، مثل التسميات النصية أو صناديق الحدود، أضفها كملف metadata.csv في مجلدك. يتيح لك ذلك إنشاء مجموعات بيانات بسرعة لمهام مختلفة في مجال الرؤية الحاسوبية مثل التسمية النصية أو كشف الكائنات. يمكنك أيضًا استخدام ملف JSONL metadata.jsonl أو ملف Parquet metadata.parquet.
folder/train/metadata.csv
folder/train/0001.mp4
folder/train/0002.mp4
folder/train/0003.mp4يجب أن يحتوي ملف metadata.csv الخاص بك على حقل file_name أو *_file_name يربط ملفات الفيديو ببياناتها الوصفية:
file_name,additional_feature
0001.mp4,This is a first value of a text feature you added to your videos
0002.mp4,This is a second value of a text feature you added to your videos
0003.mp4,This is a third value of a text feature you added to your videosأو باستخدام metadata.jsonl:
{"file_name": "0001.mp4", "additional_feature": "This is a first value of a text feature you added to your videos"}
{"file_name": "0002.mp4", "additional_feature": "This is a second value of a text feature you added to your videos"}
{"file_name": "0003.mp4", "additional_feature": "This is a third value of a text feature you added to your videos"}هنا يجب أن يكون file_name اسم ملف الفيديو المجاور لملف البيانات الوصفية. وبشكل أكثر عمومية، يجب أن يكون المسار النسبي من المجلد الذي يحتوي على البيانات الوصفية إلى ملف الفيديو.
من الممكن الإشارة إلى أكثر من فيديو في كل صف في مجموعة البيانات الخاصة بك، على سبيل المثال إذا كان كلٌّ من مدخلاتك ومخرجاتك مقاطع فيديو:
{"input_file_name": "0001.mp4", "output_file_name": "0001_output.mp4"}
{"input_file_name": "0002.mp4", "output_file_name": "0002_output.mp4"}
{"input_file_name": "0003.mp4", "output_file_name": "0003_output.mp4"}يمكنك أيضًا تعريف قوائم من مقاطع الفيديو. في هذه الحالة، يجب تسمية الحقل file_names أو *_file_names. إليك مثال:
{"videos_file_names": ["0001_left.mp4", "0001_right.mp4"], "label": "moving_up"}
{"videos_file_names": ["0002_left.mp4", "0002_right.mp4"], "label": "moving_down"}
{"videos_file_names": ["0003_left.mp4", "0003_right.mp4"], "label": "moving_right"}وصف الفيديو
تحتوي مجموعات بيانات وصف الفيديو على نصوص تصف مقطع فيديو. قد يبدو مثال metadata.csv على النحو التالي:
file_name,text
0001.mp4,This is a golden retriever playing with a ball
0002.mp4,A german shepherd
0003.mp4,One chihuahuaحمّل مجموعة البيانات باستخدام VideoFolder، وسيتم إنشاء عمود text لعناوين الفيديو:
>>> dataset = load_dataset("videofolder", data_dir="/path/to/folder", split="train")
>>> dataset[0]["text"]
"This is a golden retriever playing with a ball"رفع مجموعة البيانات إلى Hub
بمجرد إنشاء مجموعة بيانات، يمكنك مشاركتها باستخدام huggingface_hub على سبيل المثال. تأكد من تثبيت مكتبة huggingface_hub وتسجيل الدخول إلى حسابك على Hugging Face (راجع دليل رفع الملفات باستخدام Python لمزيد من التفاصيل).
ارفع مجموعة بياناتك باستخدام huggingface_hub.HfApi.upload_folder:
from huggingface_hub import HfApi
api = HfApi()
api.upload_folder(
folder_path="/path/to/local/dataset",
repo_id="username/my-cool-dataset",
repo_type="dataset",
)WebDataset
يعتمد تنسيق WebDataset على أرشيفات TAR وهو مناسب لمجموعات بيانات الفيديو الكبيرة. فعلاً يمكنك تجميع مقاطع الفيديو في أرشيفات TAR (مثلاً 1 جيجابايت من الفيديو لكل أرشيف TAR) ولديك آلاف من أرشيفات TAR:
folder/train/00000.tar
folder/train/00001.tar
folder/train/00002.tar
...في الأرشيف، يتكوّن كل مثال من ملفات تتشارك نفس البادئة:
e39871fd9fd74f55.mp4
e39871fd9fd74f55.json
f18b91585c4d3f3e.mp4
f18b91585c4d3f3e.json
ede6e66b2fb59aab.mp4
ede6e66b2fb59aab.json
ed600d57fcee4f94.mp4
ed600d57fcee4f94.json
...يمكنك إدخال تسميات/وصف/مواصفات مقاطع الفيديو الخاصة بك باستخدام ملفات JSON أو نصية، على سبيل المثال.
لمزيد من التفاصيل حول صيغة WebDataset ومكتبة python، يرجى الاطلاع على توثيق WebDataset.
حمّل WebDataset الخاص بك وسيُنشئ عمودًا لكل لاحقة ملف (هنا “mp4” و “json”):
>>> from datasets import load_dataset
>>> dataset = load_dataset("webdataset", data_dir="/path/to/folder", split="train")
>>> dataset[0]["json"]
{"bbox": [[302.0, 109.0, 73.0, 52.0]], "categories": [0]}Lance
Lance هو تنسيق جداول مفتوح المصدر متعدد الوسائط. يمكن لجداول Lance تخزين القيم النصية والقياسية بشكل أصلي، بل أيضًا تخزين كائنات ثنائية كبيرة (blobs) مثل الصور والصوت والفيديو إلى جانب بياناتك الجدولية.
توفّر Lance واجهة برمجة تطبيقات blob API تجعل تخزين واسترجاع الكتل الكبيرة (blobs) في مجموعات بيانات Lance أمرًا ميسّرًا. يُظهر المثال التالي كيفية تصفح البيانات الوصفية (metadata) بكفاءة دون تحميل كتل الفيديو الأثقل، ثم جلب كتل الفيديو ذات الصلة عند الحاجة.
إليك نظرة تمثيلية على شكل جدول Lance يخزّن مقاطع الفيديو (عمود video_blob يستخدم ترميز blob الخاص بـ Lance):
+------------------------------------------+-----------------+-----+------------------------------------------+
| caption | aesthetic_score | ... | video_blob |
+------------------------------------------+-----------------+-----+------------------------------------------+
| "a breathtaking view of a mounta..." | 5.2401 | ... | {position: 0, size: 4873879} |
| "a captivating view of the sun, b..." | 5.2401 | ... | {position: 4873920, size: 3370571} |
+------------------------------------------+-----------------+-----+------------------------------------------+اكتب مجموعة بيانات Lance من ملفات فيديو خام
بدءًا من ملفات الفيديو الخام على القرص بالإضافة إلى البيانات الوصفية المرتبطة بها (مثل التسميات والنقاط)، يمكنك كتابة مجموعة بيانات Lance مكتفية ذاتيًا إلى مجلد محلي *.lance (مجموعة بيانات Lance هي مجلد على القرص، ومن الشائع تسميتها بلاحقة .lance):
import lance
import pyarrow as pa
import urllib.request
schema = pa.schema(
[
pa.field("caption", pa.utf8()),
pa.field("aesthetic_score", pa.float64()),
pa.field(
"video_blob",
pa.large_binary(),
metadata={"lance-encoding:blob": "true"},
),
]
)
# Provide video files alongside metadata
rows = [
{
"video_path": "/path/to/videos/0001.mp4",
"caption": "a breathtaking view of a mountainous landscape ...",
"aesthetic_score": 5.240138053894043,
},
{
"video_path": "0002.mp4",
"caption": "a captivating view of the sun, bathed in hues ...",
"aesthetic_score": 5.240137100219727,
},
]
video_bytes = []
for r in rows:
with open(r["video_path"], "rb") as f:
video_bytes.append(f.read())
table = pa.table(
{
"caption": [r["caption"] for r in rows],
"aesthetic_score": [r["aesthetic_score"] for r in rows],
"video_blob": video_bytes,
},
schema=schema,
)
ds = lance.write_dataset(
table,
"./videos.lance",
schema=schema,
mode="create",
)يُخزّن هذا البيانات الوصفية وبيانات الفيديو معًا داخل videos.lance/، مما يتيح لك نقل/نسخ مجلد واحد دون الحاجة إلى الحفاظ على مزامنة ملفات *.mp4 منفصلة.
إليك نظرة تمثيلية على شكل جدول Lance يخزّن مقاطع الفيديو (عمود video_blob يحتوي على بيانات مخزّنة بشكل أصلي على شكل كتل داخل مجموعة بيانات Lance):
+------------------------------------------+-----------------+-----+------------------------------------------+
| caption | aesthetic_score | ... | video_blob |
+------------------------------------------+-----------------+-----+------------------------------------------+
| "a breathtaking view of a mounta..." | 5.2401 | ... | {position: 0, size: 4873879} |
| "a captivating view of the sun, b..." | 5.2401 | ... | {position: 4873920, size: 3370571} |
+------------------------------------------+-----------------+-----+------------------------------------------+يمكنك رفع المجلد الناتج videos.lance/ إلى Hub (على سبيل المثال باستخدام huggingface_hub.HfApi.upload_folder) ومشاركته كمستودع بيانات، مع إبقاء البيانات الوصفية والفيديوهات معًا كقطعة واحدة.
تتميز مجموعات بيانات Lance بقدرتها على التوسع إلى أحجام كبيرة جداً (تيرابايت وما فوق) نظراً لتخزين البيانات بتنسيق أعمدة على القرص. راجع دليل blob API للحصول على أحدث المعلومات حول أفضل الممارسات لتخزين واسترجاع الكتل الكبيرة (blobs) في Lance.
عند كتابة مجموعات بيانات كبيرة، يُفضَّل عادةً تحديد حجم كل ملف *.lance على حدة بعدة غيغابايت كحد أقصى.
يكفي تجميع البيانات عبر مُتسلسِل (iterator) وتحديد معامل max_bytes_per_file عند كتابة مجموعة البيانات:
MAX_BYTES_PER_FILE = 5 * 1024 * 1024 * 1024 # ~5 GB per file
# Write as Lance dataset with file size limits for each *.lance file
ds = lance.write_dataset(
table,
"./videos.lance",
schema=schema,
mode="create",
max_bytes_per_file=MAX_BYTES_PER_FILE,
)لمزيد من التفاصيل حول العمل مع مجموعات بيانات Lance، راجع توثيق Lance.
Update on GitHub