سه روش ذخیره و دسترسی به مجموعه‌های بزرگ تصویر در Python

چرا مهم است

اگر تو با datasetهای تصویری بزرگ کار می‌کنی، فقط پردازش تصویر مهم نیست؛ خواندن مکرر داده‌ها هم زمان می‌برد. شناخت گزینه‌های ذخیره‌سازی کمک می‌کند این بخش از کار را هم در انتخاب‌هایت لحاظ کنی.

قبل از خواندن، این‌ها را بدان۴ مفهوم
LMDB

نوعی database مبتنی بر memory-mapped files که برای ذخیره و دسترسی به داده‌ها به کار می‌رود.

بیشتر درباره این مفهوم

HDF5

فرمتی برای ذخیره و سازمان‌دهی داده‌ها به‌صورت سلسله‌مراتبی که می‌تواند برای مجموعه‌های تصویری هم استفاده شود.

بیشتر درباره این مفهوم

convolutional neural networks

نوعی neural network که در پردازش تصاویر و یادگیری الگوهای آن‌ها کاربرد دارد و با نام CNNs هم شناخته می‌شود.

بیشتر درباره این مفهوم

pickle

یک module در Python برای تبدیل objectها به قالبی قابل ذخیره و بازسازی آن‌ها؛ استفاده از آن می‌تواند خطر امنیتی داشته باشد.

بیشتر درباره این مفهوم

ذخیرهٔ تصاویر به‌صورت فایل‌های .png یا .jpg برای کار با تعداد کمی تصویر، یا حتی ویرایش چندصد عکس با Python Imaging Library (PIL)، انتخاب مناسبی است. اما آموزش Real Python توضیح می‌دهد که با بزرگ‌شدن dataset، شیوهٔ ذخیره و دسترسی به تصاویر به موضوع مهم‌تری تبدیل می‌شود؛ به‌ویژه وقتی لازم است داده‌ها بارها برای آموزش مدل خوانده شوند.

این مسئله در کار با convolutional neural networks یا CNNs پررنگ است. مقاله برای نشان‌دادن مقیاس چنین کارهایی به ImageNet اشاره می‌کند: یک database عمومی با بیش از ۱۴ میلیون تصویر که برای آموزش مدل‌ها در کارهایی مثل تشخیص و دسته‌بندی اشیا استفاده می‌شود. خواندن مکرر چنین مجموعه‌ای در batchهای متعدد می‌تواند زمان زیادی بگیرد.

آموزش سه مسیر را معرفی می‌کند: ذخیرهٔ تصاویر به‌شکل فایل‌های PNG روی دیسک، استفاده از LMDB و استفاده از HDF5. محورهای مقایسهٔ اعلام‌شده شامل خواندن و نوشتن یک تصویر، خواندن و نوشتن تعداد زیادی تصویر و فضای مصرفی دیسک است. بااین‌حال، بخش موجود از مقاله هنوز نتیجهٔ این مقایسه‌ها یا برتری یکی از روش‌ها را ارائه نمی‌کند.

برای اجرای مثال‌ها، CIFAR-10 انتخاب شده است؛ datasetی شامل ۶۰ هزار تصویر رنگی با ابعاد ۳۲ در ۳۲ pixel از گروه‌هایی مانند سگ، گربه و هواپیما. نسخهٔ Python این مجموعه، تصاویر را نه به‌شکل فایل‌های تصویری معمول، بلکه به‌صورت داده‌های ذخیره‌شده با cPickle در اختیار می‌گذارد. نمونهٔ کد ارائه‌شده پنج فایل batch آموزشی را می‌خواند، تصاویر را با NumPy بازسازی می‌کند و تصاویر و labelهای متناظر را در RAM قرار می‌دهد.

مقاله همچنین یادآوری می‌کند که pickle می‌تواند objectهای Python را بدون تبدیل اضافی ذخیره کند، اما خطر امنیتی بالقوه دارد و برای حجم بسیار زیاد داده هم محدودیت‌هایی دارد. در این آموزش، استفاده از آن صرفاً برای استخراج CIFAR-10 است، نه به‌عنوان یکی از سه روش اصلی ذخیرهٔ تصویر. برای جزئیات پیاده‌سازی و ادامهٔ مقایسه‌ها، به مقالهٔ اصلی مراجعه کن: https://realpython.com/storing-images-in-python/

نکته کلیدی

برای چند تصویر لازم نیست فوراً سراغ روش پیچیده‌تر بروی. اگر dataset تو بزرگ شد، گزینه‌ها را از نظر خواندن و نوشتن تکی و گروهی و مصرف دیسک مقایسه کن؛ این بخش از مقاله هنوز برنده‌ای معرفی نمی‌کند.

خواندن مقاله اصلی (در زبانه‌ی جدید باز می‌شود)
برچسب‌ها (۴)