پست وبلاگ

آموزش نحوه تبدیل یا ایجاد یک دیتاست ازتصاویر با فرمت lmdb‌ یا leveldb‌ در Caffe

آموزش نحوه تبدیل یا ایجاد یک دیتاست ازتصاویر با فرمت lmdb‌ یا leveldb‌ در Caffe

بسم الله الرحمن الرحیم

تعداد سوالهایی که از من در مورد تبدیل یکسری تصاویر به دیتابیسی که caffe‌ با اون کار میکنه خیلی زیاد شده و اینجا میخوام توضیحاتی در این باره بدم و نشون بدیم چطور میشه از تصاویری که خودمون داریم یک دیتابیس به فرمت leveldb یا lmdb‌ تهیه و بعد در Caffe‌ استفاده کنیم .

قبل از هرچیزی ما میدونیم که اگر مجموعه تصاویری داشته باشیم الزامی نداریم که حتما اونو به فرمت lmdb‌ یا  leveldb‌ یا حتی hdf5 در بیاریم اما دلایل خوبی وجود داره که این کارو بکنیم . ما میدونیم که میتونیم خیلی راحت با استفاده از لایه ImageDataLayer‌که در بخش لایه ها توضیح کامل در موردش داد شد استفاده کنیم . کافیه پوشه هایی که تصاویر ما در اون قرار دارن رو در اون لایه مشخص کنیم و بعد لیبل ها رو هم در قالب یک فایل متنی که آدرس هر تصویر و لیبل متناظر با اون رو در خودش داره به اون لایه معرفی کنیم. این لایه یکسری عملیاتهای خاص رو هم در اختیار ما قرار میده مثل resize ‌کردن و… که در لایه Data که مخصوص استفاده از دیتابیس های lmdb و… هست وجود نداره .

اما تبدیل محسنات خودش رو داره مهمترین اونها افزایش کارایی هست و همچنین انتقال راحت تر فایلها .

ما در Caffe‌ یکسری نمونه مثال داریم مثل mnist  یا CIFAR10 و اگر برنچ من رو استفاده کرده باشید مثال CIFAR100‌. این مثالها اسکریپتهایی و برنامه هایی دارن که از اون برای دانلود و تبدیل فایلها به دیتاست استفاده میشه. برنامه های مورد نظر همراه caffe‌ کامپایل میشن و در پوشه build‌ شما قرا ردارن. به ترتیب convert_mnist_data.exe و convert_cifar_data .exe‌و  convert_cifar100_data.exe  برنامه هایی هستن که تو زمینه تبدیل دیتاهای این دیتاست ها به فرمت lmdb‌ یا leveldb استفاده میشن . استفاده از اونها هم خیلی راحته و کافیه ارگومانهای مورد نیاز اونها رو بهشون بدید. برای دونستن اینکه چه آرگومانهایی هم لازم دارن میتونید اونها رو در cmd‌ بدون ارگومان اجرا کنید تا برنامه چیزهایی که نیاز داره رو نشون بده .

بعنوان مثال برای مثال mnist ما این داده ها رو داریم و به این شکل استفاده میکنیم :‌

نحوه کار به این صورت هست که شما باید به این فایل پارامترهای مورد نیازش رو ارسال کنید تا یک دیتاست با فرمت مورد نظر شما بشما اراپه کنه . اگر اون فایل رو بدون هیچ ارگومانی اجرا کنید با لیستی مواجه میشید که بشما میگیه چه چیزی نیاز هست.
زمانی که شما دیتای mnist رو دانلود میکنید ۴ تا فایل بدست میارید . دو فایل مربوط به training  دو فایل هم مربوط به test set شما هست . که یکی دیتاست و دیگری لیبل مربوط به هر کدوم هست.
نحوه فراخونی هم خیلی ساده اس و میتونید بشکل زیر این کار رو انجام بدید . من هر ارگومان رو جداگونه زیر هم مینویسم تا مشخص باشه . شما موقع استفاده همه رو در یک خط بنویسید با یک اسپیس فاصله!.

  • بخش اول مسیر خود فایل اجرایی ما هست .
  • بخش دوم فایل حاوی تصاویر آموزشی ما هست .
  • بخش سوم هم لیبل مربوط به تصاویر آموزشی ما هست .
  • بخش چهارم هم نامی هست که دیتاست با اون نام ایجاد میشه.
  • بخش آخر هم فرمت دیتابیس ما هست در اینجا ما lmdb‌ رو مشخص کردیم . (میتونستیم leveldb‌هم بنویسیم.)

که اگه همه اینا رو کنار هم بزاریم به شکل زیر در میاد

برای تست ست هم به همین شکل عمل میکنیم .


شیوه کار در مورد CIFAR10 و CIFAR100‌ هم به همین شکل هست که میتونید از بخش نمونه ها در برنچ من (کلیک کنید) ببینید

خب حالا اگر ما بخواییم روی تصاویر خودمون کار کنیم چیکار باید کرد؟‌

اینجا ما میتونیم از convert_imageset.exe استفاده کنیم که در همون پوشه build‌ قرار داره و همراه بقیه فایلهای Caffe‌ کامپایل میشه . شیوه کار هم مثل قبله اما من سعی میکنم با یک مثال اونو نشون بدم

فرض کنید من یک دیتاست دارم اولین کاری که میکنم اینه که دوتا پوشه ایجاد میکنم یکی برای training‌ و دیگری برای test.

در داخل هرکدوم از این پوشه ها ما هر کلاس رو بصورت یک پوشه ایجاد میکنیم و تصاویر اون رو در اون پوشه میزاریم . مثلا فرض کنید من ۵ تا کلاس دارم . سگ گربه هواپیما کشتی و اسب !‌ من ۵ تا پوشه درست میکنم با همین نامها و تصاویر هر گروه رو در پوشه متناظر با خودش قرار میدم . همین کار رو هم برای test‌ انجام میدیم و تصاویر هرکدوم رو هم درون این پوشه ها میزارم. حالا دوتا فایل متنی ایجاد میکنم . یکی بنام train_label.txt  و دیگری test_label.txt که در اولی لیبل های مربوط به تصاویر training ‌و در دومی هم لیبل های مربوط به تصاویر Test set‌ ما قرار میگیره این فایلها رو در داخل پوشه train و test قرار میدیم.

پس من یک پوشه میسازم بنام MyDataSet و در داخل اون دوتا پوشه دیگه بنام train  و test ‌ایجاد میکنم.وارد پوشه train و test ‌که بشیم به تعداد کلاسهایی که داریم پوشه داریم و دوتا فایل متنی هم با نامهای  train_label.txt  و  test_label.txt در کنار این پوشه ها در داخل train‌و test قرار میدم.

deeplearning.ir_training_test_sets

deeplearning.ir_training_set

deeplearning.ir_test_set

برای پر کردن فایل های لیبل ما آدرس نسبی تصاویر رو با لیبل هر کلاس در یک خط مشخص میکنیم . مثل زیر :‌

و بعد تنها کاری که الان باقی میمونه اراپه این موارد بعنوان پارامتر به برنامه convert_imageset.exe هست .

اگر این برنامه رو بدون پارامتر اجرا کنید میبینید که ما به پارامترهایی که تو مثال های mnist دیدم سروکار داریم تقریبا مثل هم هستن با کمی تفاوت .فرمت کلی اجرای دستور بصورت زیر هست :‌

اینجا ما چندتا پارامتر داریم:

  • resize_height
  • resize_width
  • shuffle
پارامتر  resize_height  مقدار طول رو مشخص میکنه که اینجا برابر متغییر RESIZE_HEIGHT  قرار داده شده (یعنی هر چیزی که مد نظر شماس جای این میتونید بزارید مثلا ۲۵۶ )
پارامتر  resize_width   هم مقدرا پهنای عکس رو مشخص میکنه که مثل قبل برابر متغییر RESIZE_WIDTH  قرار داده شده .
بعد از اینا ما پارامتر  shuffle  رو داریم که کاری که میکنه خیلی ساده اس با این پارامتر ما به برنامه میگیم عکسا رو بصورت رندوم تو دیتابیس ذخیره کنه .یعنی ترتیبشون رندوم باشه . مثلا ما تو پوشه عکس ۱ ۲ ۳ ۴ ۵ داریم .وقتی shuffle میکنیم ممکنه بشه ۲ ۱ ۳ ۵ ۴ یعنی ترتیبشون بهم میخوره (این برای اموزش خیلی مفید و مهمه).
بعد از این پارامتر ما پوشه ای که عکسهای ترین ما توش هست رو میخوایم . اینجا از متغییر TRAIN_DATA_ROOT  استفاده کردیم یعنی مسیر پوشه train
بعدش نوبت به لیبل ها هست. که اینجا آدرس فایل تکست حاوی لیبلها رو دادیم .‌
پارامتر بعدی هم نام و مکان ذخیره سازی دیتابیس ماست . ما میگیم یک دیتابیس با نام mydataset_train_lmdb  تو پوشه ای که متغییر MyDataSet  داره بهش اشاره میکنه ذخیره کن .اگه فقط نام رو بنویسیم تو پوشه جاری برای ما اون دیتاست رو ایجاد میکنه. ما معمولا یه مسیر میدیم که مستقیما دیتاست رو در همون پوشه و مکان مورد نظر ما ایجاد کنه.
حالا برای اینکه بیشتر مشخص باشه ما از اسم پوشه های خودمون استفاده میکنیم که میشه این :‌

خب من فرض کردم ما وارد پوشه ای شدیم که convert_imageset در داخلش هست و اونجا cmd‌ رو اجرا کردیم و پارامترها رو دادیم . در اینصورت در کنار همین فایل convert_imageset دیتاست ما با نامی که مشخص کردیم ایجاد میشه . یک پوشه با این نام ایجاد میشه که یکسری فایل در داخلش هست .  کل این پوشه دیتاست ما هست! نه فقط فایلهای داخلش.

معمولا شیوه کار به این صورته که ما یه پوشه جدید مثلا MyDataSet  رو در پوشه examples کفی ایجاد میکنیم . بعد خیلی راحت وارد روت caffe‌میشیم و از اونجا دستور رو مثلا به شکل زیر اجرا میکنیم . اینطوری هر فایلی سر جای خودش قرار میگیره و دردسرهای شما هم کمتر میشه .

و همین کار رو برای test ‌set‌ انجام میدیم . به این شکل شما میتونید نه فقط train‌و test‌ بلکه validation و ورژن های مختلف از دیتاستتون رو ایجاد کنید و براحتی از اونها استفاده کنید.

پ.ن :‌ تصاویری که گرفتم از اوبونتو هست چون موقع نوشتن این آموزش تو این سیستم عامل بودم برای همین نشد تصویر از ویندوز بگیرم . آموزش به فرمت ویندوز هست اما براحتی در لینوکس هم قابل استفاده اس (فقط .exe حذف میشه . forward slash‌هم ویندوز قبول میکنه برای همین برای نزدیکی بیشتر ویندوز و لینوکس ادرسها به فرمتی که میبینید قرار دادم.

امیدوارم مفید بوده باشه و در پناه خداوند همیشه موفق و سربلند باشید
سید حسین حسن پور ۹ آبان ۱۳۹۵

سید حسین حسن پور متی کلایی

درباره ی سید حسین حسن پور متی کلایی

من سید حسین حسن پور هستم موسس و مدیر سایت. اطلاعات بیشتر در مورد فعالیت های کاری و تحصیلی من رو میتونید از صفحه linkedIn من بدست بیارید. برای ارتباط با بنده هم میتونید از بخش تماس با ما یا در باره من استفاده کنید.

مقالات مرتبط

10 دیدگاه در “آموزش نحوه تبدیل یا ایجاد یک دیتاست ازتصاویر با فرمت lmdb‌ یا leveldb‌ در Caffe

  1. آموزش خیلی خوبی بود ….
    خدا قوت

    فقط یه سوالی اینکه از چه تبدیلی برلی کانورت تصویر به دیتا استفاده میشه! منظورم اینه که در این فایل .exe از چه متدی برای این تبدیل استفاده میشه ؟

    1. خواهش میکنم
      میتونید خیلی راحت کد مربوطه رو ببنید چیز خاصی نداره . تصاویر در قالب بایت ذخیره میشن و عمل ذخیره سازی هم خیلی ساده فراخونی توابع (api) مربوط به lmdb یا leveldb هست.
      اگر کسی بخواد خودش هم میتونه با پایتون بعنوان مثال این کارو انجام بده .

    1. ترجیحا تا جایی که ممکنه سعی کنید تمام تصاویر از یک فرمت باشن اما اگر نباشن مشکل انچنانی نباید داشته باشید در اموزش.(دقت کنید عدم یکی بودن فرمت تصاویر در عملیاتهای پیش پردازش اینده مشکل ایجاد میکنه و خیلی بهتره بعد از اینکه تصاویر رو جمع کردید با استفاده از یه نرم افزار (یا اینکه خودتون کدش رو بزنید تو متلب یا پایتون و…) تصاویر رو به یه فرمت واحد در بیارید و بعد استفاده کنید. )

  2. سلام
    در هنگام تولید دیتاست lmdb به خطای system entropy not available, using fallback algorithm to generate seed instead بر میخورم. برای حل آن چه راه حلی وجود دارد؟

    1. خواهش میکنم .
      ببینید برای اینکه بشه راهنمایی کرد باید کل پیام ها رو نمایش بدید . قبلا هم عرض کردم چیزایی که تو صفحه میبنید الزاما خطا نیستن. اینکه خطا هستن یا نه وقتی مشخص میشه که شما کل پیامهایی که رو صفحه در حین عملیات مشاهده میکنید رو لطف کنید و ارائه کنید.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *