Datasets documentation
إنشاء مجموعة بيانات للصور
إنشاء مجموعة بيانات للصور
توجد طريقتان لإنشاء مجموعة بيانات للصور ومشاركتها. سيوضح لك هذا الدليل كيفية:
أنشئ مجموعة بيانات للصور من ملفات محلية بلغة بايثون باستخدام Dataset.push_to_hub(). هذه طريقة سهلة تتطلب بضع خطوات فقط في بايثون.
أنشئ مجموعة بيانات للصور باستخدام
ImageFolderمع بعض البيانات الوصفية. هذا حل بدون كتابة أكواد لإنشاء مجموعة بيانات للصور تحتوي على آلاف الصور بسرعة.
يمكنك التحكم في الوصول إلى مجموعة بياناتك من خلال اشتراط مشاركة المستخدمين لمعلومات التواصل الخاصة بهم أولاً. اطّلع على دليل مجموعات البيانات المُقيَّدة لمزيد من المعلومات حول كيفية تفعيل هذه الميزة على Hub.
ImageFolder
يُعدّ ImageFolder أداة لبناء مجموعات البيانات مصممة لتحميل مجموعة بيانات صور تضم آلاف الصور بسرعة دون الحاجة إلى كتابة أي كود.
💡 اطّلع على تسلسل هرمية نمط التقسيم لمعرفة المزيد حول كيفية إنشاء
ImageFolderلتقسيمات مجموعة البيانات بناءً على بنية مستودع مجموعة البيانات الخاص بك.
ImageFolder يستنتج تلقائيًا تسميات الفئات في مجموعة بياناتك بناءً على اسم المجلد. قم بتخزين مجموعة بياناتك في بنية مجلدات على النحو التالي:
folder/train/dog/golden_retriever.png
folder/train/dog/german_shepherd.png
folder/train/dog/chihuahua.png
folder/train/cat/maine_coon.png
folder/train/cat/bengal.png
folder/train/cat/birman.pngإذا اتبع مجموعة البيانات بنية ImageFolder، فيمكنك تحميلها مباشرةً باستخدام load_dataset():
>>> from datasets import load_dataset
>>> dataset = load_dataset("path/to/folder")يعادل هذا تمرير imagefolder يدويًا في load_dataset() والمجلد في data_dir:
>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder")يمكنك أيضًا استخدام imagefolder لتحميل مجموعات بيانات تتضمن تقسيمات متعددة. للقيام بذلك، يجب أن يكون لمجلد مجموعة البيانات البنية التالية:
folder/train/dog/golden_retriever.png
folder/train/cat/maine_coon.png
folder/test/dog/german_shepherd.png
folder/test/cat/bengal.pngإذا كانت جميع ملفات الصور موجودة في مجلد واحد أو لم تكن على نفس مستوى هيكل المجلدات، فلن يتم إضافة عمود
labelتلقائيًا. إذا كنت بحاجة إليه، فقم بتعيينdrop_labels=Falseبشكل صريح.
إذا كانت هناك معلومات إضافية ترغب في تضمينها حول مجموعة بياناتك، مثل التسميات النصية أو صناديق الحدود، أضفها كملف metadata.csv في مجلدك. يتيح لك ذلك إنشاء مجموعات بيانات بسرعة لمهام مختلفة في مجال الرؤية الحاسوبية مثل التسمية النصية أو كشف الكائنات. يمكنك أيضًا استخدام ملف JSONL metadata.jsonl أو ملف Parquet metadata.parquet.
folder/train/metadata.csv
folder/train/0001.png
folder/train/0002.png
folder/train/0003.pngيمكنك أيضًا ضغط صورك في ملف مضغوط (zip)، وفي هذه الحالة يجب أن يحتوي كل ملف مضغوط على الصور وبيانات الوصف (metadata) معًا.
folder/train.zip
folder/test.zip
folder/validation.zipيجب أن يحتوي ملف metadata.csv الخاص بك على حقل file_name أو *_file_name يربط ملفات الصور ببياناتها الوصفية:
file_name,additional_feature
0001.png,This is a first value of a text feature you added to your images
0002.png,This is a second value of a text feature you added to your images
0003.png,This is a third value of a text feature you added to your imagesأو باستخدام metadata.jsonl:
{"file_name": "0001.png", "additional_feature": "This is a first value of a text feature you added to your images"}
{"file_name": "0002.png", "additional_feature": "This is a second value of a text feature you added to your images"}
{"file_name": "0003.png", "additional_feature": "This is a third value of a text feature you added to your images"}هنا يجب أن يكون file_name اسم ملف الصورة المجاور لملف البيانات الوصفية. وبشكل أكثر عمومية، يجب أن يكون المسار النسبي من المجلد الذي يحتوي على البيانات الوصفية إلى ملف الصورة.
من الممكن الإشارة إلى أكثر من صورة في كل صف من صفوف مجموعة البيانات الخاصة بك، على سبيل المثال إذا كانت كلتا المدخلات والمخرجات صورًا:
{"input_file_name": "0001.png", "output_file_name": "0001_output.png"}
{"input_file_name": "0002.png", "output_file_name": "0002_output.png"}
{"input_file_name": "0003.png", "output_file_name": "0003_output.png"}يمكنك أيضًا تعريف قوائم من الصور. في هذه الحالة، يجب أن تسمي الحقل file_names أو *_file_names. إليك مثال:
{"frames_file_names": ["0001_t0.png", "0001_t1.png"], label: "moving_up"}
{"frames_file_names": ["0002_t0.png", "0002_t1.png"], label: "moving_down"}
{"frames_file_names": ["0003_t0.png", "0003_t1.png"], label: "moving_right"}وصف الصور
تحتوي مجموعات بيانات وصف الصور على نصوص تصف صورة. قد يبدو مثال metadata.csv على النحو التالي:
file_name,text
0001.png,This is a golden retriever playing with a ball
0002.png,A german shepherd
0003.png,One chihuahuaحمّل مجموعة البيانات باستخدام ImageFolder، وسيُنشئ عمودًا باسم text لتعليقات الصور:
>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder", split="train")
>>> dataset[0]["text"]
"This is a golden retriever playing with a ball"كشف الكائنات
تحتوي مجموعات بيانات كشف الكائنات على صناديق محيطة وفئات تحدد الكائنات في صورة. قد يبدو مثال metadata.jsonl على النحو التالي:
{"file_name": "0001.png", "objects": {"bbox": [[302.0, 109.0, 73.0, 52.0]], "categories": [0]}}
{"file_name": "0002.png", "objects": {"bbox": [[810.0, 100.0, 57.0, 28.0]], "categories": [1]}}
{"file_name": "0003.png", "objects": {"bbox": [[160.0, 31.0, 248.0, 616.0], [741.0, 68.0, 202.0, 401.0]], "categories": [2, 2]}}حمّل مجموعة البيانات باستخدام ImageFolder، وسيتم إنشاء عمود objects يحتوي على صناديق الحدود والفئات:
>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder", split="train")
>>> dataset[0]["objects"]
{"bbox": [[302.0, 109.0, 73.0, 52.0]], "categories": [0]}رفع مجموعة البيانات إلى Hub
بمجرد إنشاء مجموعة بيانات، يمكنك مشاركتها على Hub باستخدام طريقة push_to_hub(). تأكد من تثبيت مكتبة huggingface_hub وتسجيل الدخول إلى حسابك على Hugging Face (راجع دليل رفع الملفات باستخدام Python لمزيد من التفاصيل).
ارفع مجموعة بياناتك باستخدام push_to_hub():
>>> from datasets import load_dataset
>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder", split="train")
>>> dataset.push_to_hub("stevhliu/my-image-captioning-dataset")WebDataset
يعتمد تنسيق WebDataset على أرشيفات TAR وهو مناسب لمجموعات بيانات الصور الكبيرة. فعلاً يمكنك تجميع صورك في أرشيفات TAR (مثلاً 1 جيجابايت من الصور لكل أرشيف TAR) ولديك آلاف من أرشيفات TAR:
folder/train/00000.tar
folder/train/00001.tar
folder/train/00002.tar
...في الأرشيف، يتكوّن كل مثال من ملفات تتشارك نفس البادئة:
e39871fd9fd74f55.jpg
e39871fd9fd74f55.json
f18b91585c4d3f3e.jpg
f18b91585c4d3f3e.json
ede6e66b2fb59aab.jpg
ede6e66b2fb59aab.json
ed600d57fcee4f94.jpg
ed600d57fcee4f94.json
...يمكنك إدخال تسميات/وصف/صناديق الحدود الخاصة بصورك باستخدام ملفات JSON أو نصية، على سبيل المثال.
حمّل WebDataset الخاص بك وسيُنشئ عمودًا لكل لاحقة ملف (هنا “jpg” و “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]}كما يمكن تضمين عدة صور لكل مثال على النحو التالي:
e39871fd9fd74f55.input.jpg
e39871fd9fd74f55.output.jpg
e39871fd9fd74f55.json
f18b91585c4d3f3e.input.jpg
f18b91585c4d3f3e.output.jpg
f18b91585c4d3f3e.json
...لمزيد من التفاصيل حول صيغة WebDataset ومكتبة python، يرجى الاطلاع على توثيق WebDataset.
Lance
Lance هو تنسيق جداول مفتوح المصدر متعدد الوسائط. يمكن لجداول Lance تخزين القيم النصية والقياسية بشكل أصلي، بل أيضًا تخزين كائنات ثنائية كبيرة (blobs) مثل الصور والصوت والفيديو إلى جانب بياناتك الجدولية.
بدءًا من ملفات الصور على القرص بالإضافة إلى البيانات الوصفية المرتبطة بها (مثل التسميات والأبعاد)، يمكنك كتابة مجموعة بيانات Lance مكتفية ذاتيًا إلى مجلد *.lance محلي. يمكن للجدول الناتج تخزين أعمدة البيانات الوصفية الخاصة بك إلى جانب عمود image يحتوي على بايتات الصورة المشفّرة.
على سبيل المثال، قد تبدأ ببيانات وصفية مثل:
{'caption': 'Cordelia and Dudley on their wedding day last year', 'height': 315, 'width': 233}
{'caption': 'Statistics on challenges for automation in 2021', 'height': 299, 'width': 701}يمكنك تحديد مخطط pyarrow لبياناتك الوصفية وبيانات الصور، وبناء جدول، ثم كتابته كمجموعة بيانات Lance:
import lance
import pyarrow as pa
schema = pa.schema(
[
pa.field("caption", pa.utf8()),
pa.field("height", pa.int32()),
pa.field("width", pa.int32()),
# ... add any additional metadata columns you want here ...
pa.field("image", pa.binary()),
]
)
# Provide image files alongside metadata
rows = [
{
"image_path": "/path/to/images/0001.jpg",
"caption": "Cordelia and Dudley on their wedding day last year",
"height": 315,
"width": 233,
},
{
"image_path": "/path/to/images/0002.jpg",
"caption": "Statistics on challenges for automation in 2021",
"height": 299,
"width": 701,
},
]
image_bytes = []
for r in rows:
with open(r["image_path"], "rb") as f:
image_bytes.append(f.read())
table = pa.table(
{
"caption": [r["caption"] for r in rows],
"height": [r["height"] for r in rows],
"width": [r["width"] for r in rows],
"image": image_bytes,
},
schema=schema,
)
ds = lance.write_dataset(
table,
"./images.lance",
schema=schema,
mode="create",
)إليك نظرة تمثيلية على شكل جدول Lance يخزّن الصور (عمود image يحتوي على بايتات مشفّرة):
+-----------------------------------------------+--------+-------+-----+------------------------------+ | caption | height | width | ... | image | +-----------------------------------------------+--------+-------+-----+------------------------------+ | "Cordelia and Dudley on their wedding ..." | 315 | 233 | ... | b"\\xff\\xd8\\xff...\\xd9" | | "Statistics on challenges for automation ..." | 299 | 701 | ... | b"\\xff\\xd8\\xff...\\xd9" | +-----------------------------------------------+--------+-------+-----+------------------------------+
باستخدام هذه الطريقة، يمكنك تخزين مجموعات بيانات صور كبيرة الحجم بشكل غير محدود في Lance. يمكن رفع المجلد الناتج images.lance/ مع ملفات *.lance الخاصة به إلى Hugging Face Hub، تمامًا مثل الأمثلة الأخرى المذكورة أعلاه. راجع مجموعة بيانات lance-format/laion-1m على Hub كمثال على مجموعة بيانات صور بصيغة Lance.
لمزيد من التفاصيل حول العمل مع مجموعات بيانات Lance، راجع توثيق Lance.
Update on GitHub