Datasets documentation
تحميل بيانات الصور
تحميل بيانات الصور
تحتوي مجموعات بيانات الصور على أعمدة من نوع Image، والتي تحتوي على كائنات PIL.
للتعامل مع مجموعات بيانات الصور، يجب أن يكون لديك اعتمادية
visionمثبّتة. اطّلع على دليل التثبيت لمعرفة كيفية تثبيتها.
عند تحميل مجموعة بيانات للصور واستدعاء عمود الصور، يتم فك ترميز الصور كصور PIL:
>>> from datasets import load_dataset, Image
>>> dataset = load_dataset("AI-Lab-Makerere/beans", split="train")
>>> dataset[0]["image"]استخدم فهرس الصف أولاً ثم عمود
imageللوصول إلى مجموعة بيانات الصور -dataset[0]["image"]- لتجنب فك ترميز وإعادة أخذ عينات جميع كائنات الصور في مجموعة البيانات. وإلا، فقد يكون هذا الأمر بطيئاً ومستهلكاً للوقت إذا كانت لديك مجموعة بيانات كبيرة.
للاطلاع على دليل حول كيفية تحميل أي نوع من مجموعات البيانات، راجع دليل التحميل العام.
الملفات المحلية
يمكنك تحميل مجموعة بيانات من مسار الصورة. استخدم دالة cast_column() لقبول عمود من مسارات ملفات الصور، وفكّ ترميزه إلى صورة PIL باستخدام ميزة Image:
>>> from datasets import Dataset, Image
>>> dataset = Dataset.from_dict({"image": ["path/to/image_1", "path/to/image_2", ..., "path/to/image_n"]}).cast_column("image", Image())
>>> dataset[0]["image"]
<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=1200x215 at 0x15E6D7160>]إذا كنت ترغب فقط في تحميل المسار الأساسي لمجموعة بيانات الصور دون فك ترميز كائن الصورة، فاضبط decode=False في ميزة Image:
>>> dataset = load_dataset("AI-Lab-Makerere/beans", split="train").cast_column("image", Image(decode=False))
>>> dataset[0]["image"]
{'bytes': None,
'path': '/root/.cache/huggingface/datasets/downloads/extracted/b0a21163f78769a2cf11f58dfc767fb458fc7cea5c05dccc0144a2c0f0bc1292/train/bean_rust/bean_rust_train.29.jpg'}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أو ينبغي أن يحتوي على بيانات وصفية، على سبيل المثال:
folder/train/metadata.csv
folder/train/0001.png
folder/train/0002.png
folder/train/0003.pngإذا اتبع مجموعة البيانات بنية ImageFolder، فيمكنك تحميلها مباشرةً باستخدام load_dataset():
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_name")
>>> # OR locally:
>>> dataset = load_dataset("/path/to/folder")بالنسبة إلى مجموعات البيانات المحلية، يعادل هذا تمرير imagefolder يدويًا في load_dataset() والمجلد في data_dir:
>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder")ثم يمكنك الوصول إلى مقاطع الفيديو ككائنات PIL.Image:
>>> dataset["train"][0]
{"image": <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=1200x215 at 0x15E6D7160>, "label": 0}
>>> dataset["train"][-1]
{"image": <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=1200x215 at 0x15E8DAD30>, "label": 1}لتجاهل المعلومات في ملف البيانات الوصفية، اضبط drop_metadata=True في load_dataset():
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_with_metadata", drop_metadata=True)إذا لم يكن لديك ملف بيانات وصفية، يستنتج ImageFolder تلقائيًا اسم التسمية من اسم المجلد.
إذا كنت ترغب في إسقاط التسميات المُنشأة تلقائيًا، اضبط drop_labels=True.
في هذه الحالة، لن يحتوي مجموعة البيانات الخاصة بك إلا على عمود للصور:
>>> from datasets import load_dataset
>>> dataset = load_dataset("username/dataset_without_metadata", drop_labels=True)وأخيرًا، يتيح لك الحجة filters تحميل مجموعة فرعية فقط من مجموعة البيانات، بناءً على شرط يتعلق بالتسمية أو البيانات الوصفية. وهذا مفيد بشكل خاص إذا كانت البيانات الوصفية بصيغة Parquet، لأن هذه الصيغة تتيح التصفية السريعة. كما يُنصح باستخدام هذه الحجة مع streaming=True، لأن مجموعة البيانات تُحمَّل بالكامل قبل التصفية افتراضيًا.
>>> filters = [("label", "=", 0)]
>>> dataset = load_dataset("username/dataset_name", streaming=True, filters=filters)لمزيد من المعلومات حول إنشاء مجموعة بيانات
ImageFolderخاصة بك، راجع دليل إنشاء مجموعة بيانات صور.
WebDataset
يعتمد تنسيق WebDataset على مجلد من أرشيفات TAR وهو مناسب لمجموعات بيانات الصور الكبيرة.
ونظرًا لحجمها، يتم تحميل WebDatasets بشكل عام في وضع البث (باستخدام streaming=True).
يمكنك تحميل WebDataset على النحو التالي:
>>> from datasets import load_dataset
>>> dataset = load_dataset("webdataset", data_dir="/path/to/folder", streaming=True)Lance
Lance هو تنسيق جداول مفتوح المصدر متعدد الوسائط. يمكن لجداول Lance تخزين القيم النصية والقياسية بشكل أصلي، بل أيضًا تخزين كائنات ثنائية كبيرة (blobs) مثل الصور والصوت والفيديو إلى جانب بياناتك الجدولية.
يحافظ Lance على بياناتك الوصفية (metadata) ومقاطع الصور (image blobs) معًا في مكان واحد، مع السماح لك في الوقت نفسه بمسح أعمدة البيانات الوصفية التي تهتم بها فقط بكفاءة دون تحميل بايتات الصور. وعندما تكون مستعدًا، يمكنك استرجاع مجموعة صغيرة من الصفوف (بما في ذلك مقاطع الصور) وكتابتها مباشرةً إلى ملفات على نظام الملفات المحلي لديك.
from datasets import load_dataset
# Return as a Hugging Face dataset
ds = load_dataset(
"lance-format/laion-1m",
split="train",
streaming=True
)
dir_name = "laion_samples"
Path(dir_name).mkdir(exist_ok=True)
for idx, row in enumerate(ds.take(3)):
with open(f"{dir_name}/{idx}.jpg", "wb") as f:
f.write(row["image"])في هذا المثال، تحتوي عمود image على بايتات الصورة المُرمّزة، لذا يمكنك كتابتها مباشرةً في ملفات .jpg.
لا تدعم واجهة
datasetsحاليًا دفع العمليات إلى جدول Lance، لذا قد تكون بطيئة في حالة مجموعات البيانات الأكبر. لحظي، ستحصل على أداء أفضل بكثير باستخدام حزمةlanceبلغة بايثون مباشرة. راجع التوثيق على الهاب للحصول على أمثلة على الاستخدام.
فك ترميز الصور
بشكل افتراضي، يتم فك ترميز الصور بشكل تسلسلي على شكل PIL.Images عند تكرار مجموعة البيانات.
ومع ذلك، من الممكن تسريع مجموعة البيانات بشكل كبير باستخدام فك الترميز متعدد الخيوط:
>>> import os
>>> num_threads = num_threads = min(32, (os.cpu_count() or 1) + 4)
>>> dataset = dataset.decode(num_threads=num_threads)
>>> for example in dataset: # up to 20 times faster !
... ...يمكنك تفعيل تعدد الخيوط باستخدام num_threads. وهذا مفيد بشكل خاص لتسريع بث البيانات عن بُعد.
ومع ذلك، قد يكون أبطأ من num_threads=0 للبيانات المحلية على الأقراص سريعة.
إذا لم تكن مهتمًا بالصور المُفكَّكة كـPIL.Images وأردت الوصول إلى المسار/البايتات بدلاً من ذلك، يمكنك تعطيل فك الترميز:
>>> dataset = dataset.decode(False)ملاحظة: IterableDataset.decode() متاح حاليًا فقط لمجموعات البيانات التي يتم بثها.
Update on GitHub