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

63 6,355

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

تعداد سوالهایی که از من در مورد تبدیل یکسری تصاویر به دیتابیسی که 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‌هم ویندوز قبول میکنه برای همین برای نزدیکی بیشتر ویندوز و لینوکس ادرسها به فرمتی که میبینید قرار دادم.

درخواست و همینطور سوالهای زیادی داشتم که چطور خود ما لیبل ها رو درست کنیم . ما فقط یکسری پوشه از تصاویر داریم و تعداد تصاویر هم زیاده و دستی نمیشه کار کرد چیکار باید بکنیم ؟
خب نوشتن برنامه ای که لیست پوشه هایی رو بگیره و خودش عمل لیبل گذاری رو انجام بده کار سختی نیست اما به هر حال میتونید از اسکریپتهایی که من نوشتم استفاده کنید و اگر چیزی نیاز به تغییر باشه خودتون تغییر بدید .

اگه بخش ترینینگ و تست شما جدا هست میتونید خیلی ساده از این کد استفاده کنید نحوه استفاده هم سر راست و مشخص هست با کامنت همه بخشارو مشخص کردم . کد زیر رو یکبار برای تست و یکبار هم برای ترینینگ استفاده کنید (یکبار پوشه تست رو بدید و اجرا کنید و دفعه بعد پوشه ترینینگ اسم فایلها رو هم تغییر بدید. یا بهتر اینو تبدیل به تابع کنید و هربار پارامترها رو براش بفرستید اینطور راحت ترید):

 

اگه بخش ترینینگ و تست رو جدا نکردید و کلا همه تصاویر با هم هستن از این استفاده کنید . اینجا خودش از تصاویری که دارید میاد ترینینگ ست و تست ست رو مشخص میکنه . پیشفرض هم ۷۰ به ۳۰ هست . میتونید این مقدار رو تغییر بدید خودتون. فکر نمیکنم توضیح خاصی نیاز باشه همه چیز مشخصه :

 

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

 

نکات : 

نکته ۱: در پوشه datamnist در آخرین ورژن کفی یک اسکریپت برای دانلود دیتاست mnist قرار داده شده که از آون میشه برای دانلود دیتاست استفاده کرد.
نکته ای که باید بدونید این هست که اگر از این اسکریپت برای دانلود دیتاست استفاده کنید لازم هست در پوشه mnist هم از اسکریپت پاورشل مربوطه برای ایجاد دیتاست استفاده کنید چون وقتی که فایلهای mnist دانلود شدن و از حالت فشرده خارج شدند. فایلها به فرم train-images.idx3-ubyte هستن. این فرمت در زمانی که خود شما بصورت دستی فایلهای مربوطه رو دانلود و اکسترکت کنید هم وجود داره.
اما در اسکریپتی که من نوشتم این مساله وجود نداره . بنابر این پیشنهاد من استفاده از اسکریپت هایی هست که من نوشتم تا با مشکلی مواجه نشید.
با تشکر از آقای پازوکی که یادآوری کردن این نکته رو.

نکته دوم : در زمان ایجاد لیست لیبل های ترین و تست اگر در ویندوز هستید از  استفاده کنید تا به خطا نخورید. اگر در لینوکس هستید که از همون / میتونید استفاده کنید.(منظور در اسکریپت پایتونی هست که بالا برای همین کار نوشتم)

نکته سوم :لینک مربوط ورژن قدیمی برنچ ویندوز (مربوط به بیش از یکسال پیش_جهت ارجاعات آینده)

بروز رسانی اول : 
تغییرات مربوط به آخرین بیلد کفی(Caffe 1.0) در آموزش بالا اعمال شد :
۱٫تغییر مسیر   BuildX64Release   به buildinstallbin

63 نظرات
  1. Farideh می گوید

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

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

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

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

  2. سمیع می گوید

    تو فایل train_label.txt باید نام تمامی عکس ها وارد شود؟ مثلا اگه از horse ده تا عکس داریم باید تک تک اونا رو وارد کنیم؟
    با تشکر

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

      بله نام تمام تصاویر رو باید وارد کنید. در اصل از طریق این نامها تصاویر پیدا میشن و لود و بعد در دیتاست ذخیره میشن.
      یادتون هم باشه shuffle رو انجام بدید.

  3. سمیع می گوید

    ایا باید پسوند تمام عکسها در پوشه ها یکسان باشد؟ مثلا همه png یا jpg باشد یا مختلف؟

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

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

  4. سجاد می گوید

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

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

      اون مشکلی ایجاد نمیکنه. و خطا نیست. چک کنید دیتاست ایجاد شده یا نه . اگر نشده خطا چیز دیگه ای هست.

  5. سجاد می گوید

    سلام
    دو تا فایل data.mdb و lock.mdb با حجم ۱mb و ۸kb ساخته.
    البته a total of 0 image نیز جزو خطاها است
    ممنون از راهنمایی هاتون

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

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

  6. محمد می گوید

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

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

      سلام
      من متوجه نشدم منظورتون رو !
      بیشتر کارهای بالا مربوط به اماده سازی تصاویر و برچسب های اونهاس.
      اگه منظورتون اینه ، شما میتونید این بخش رو با متلب پیش ببرید

  7. محمد می گوید

    سلام
    منظورم اینه که فرمودید سعی بشه تمام عکسها یه فرمت داشته باشند، مثلا همهjpg باشند
    از تونجایی که دیتا بیس من بزرگه و البته تعداد کلاسها نیز زیاد هستند میخوام دستی فرمت رو یکسان نکنم
    با متلب میشه کدشو زد؟ راهی هست
    ممنون

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

      سلام
      بله به پایتون هست به متلب هم باید باشه و مشکلی نداشته باشید
      کافیه یه سرچ ساده کنید

  8. مهرداد می گوید

    با سلام و خسته نباشید…
    من فولدرهامو طبق صحبت های شما درست کردم اما خطا زیر را می دهد
    the procedure entry point
    ??۰FlagRegistere @google@@QEAA Could not be located in the dynamic link library

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

      سلام. خطای شما بخاطر ست نبودن dependency های شماس. کتابخونه هایی که بیلد کردید رو به path اضافه کنید که این مشکلتون برطرف بشه.
      لطفا این سوال رو تو سایت پرش و پاسخ بپرسیدhttp://qa.deeplearning.ir/

  9. علی کیانی می گوید

    با سلام
    من دیتاست از تصاویر دارم که همه در یک فولدر هستند ولی دو فایل train.txt و test.txt رو با ادرس دهی کامل درست کردم ولی زمانی که می خواهم از convert_imageset.exe استفاده کنم هیچ دیتابیسی ساخته نمیشه!؟
    این دستور و خروجی که اجرا می کنم هست:
    D:\Software Instaltion\caffe-windows\caffe-windows\build\tools\Release>convert_imageset.exe –shuffle fei_train.txt fei_lmbd
    convert_imageset.exe: Convert a set of images to the leveldb/lmdb
    format used as input for Caffe.
    Usage:
    convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
    The ImageNet dataset for the training demo is at
    http://www.image-net.org/download-images

    No modules matched: use -help

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

      سلام دستور رو درست نمیزنید. یکبار دیگه خوب به مثالی که زدم توجه کنید و ارگومانهای مورد نیاز رو بفرستید. شما پوشه تصاویر رو بعد از دستور shuffle جا انداختید و یکسره لیبلها رو دادید .

      1. علی کیانی می گوید

        سلام این بار این خطا رو بهم میده زمانی که دستور زیر رو میزنم
        convert_imageset.exe –shuffle D:\Datasets\Accepted\FEI\All fei_train.txt fei_lmbd

        I0310 14:59:15.695531 7664 convert_imageset.cpp:86] Shuffling data
        I0310 14:59:16.612352 7664 common.cpp:36] System entropy source not available, using fallback algorithm to generate seed instead.
        I0310 14:59:16.613373 7664 common.cpp:36] System entropy source not available, using fallback algorithm to generate seed instead.
        I0310 14:59:16.614357 7664 convert_imageset.cpp:89] A total of 0 images.
        F0310 14:59:16.614357 7664 db_lmdb.cpp:18] Check failed: _mkdir(source.c_str()) == 0 (-1 vs. 0) mkdir Detection failed
        *** Check failure stack trace: ***
        The system cannot find the path specified.

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

          به مسیرتون گیر داده . دو نکته رو همیشه رعایت کنید.
          ۱٫اول چک کنید از مرحله قبل که اسکریپت رو ران کردید پوشه یا فایل جدیدی ایجاد نشده باشه اگه شده پاکش کنید.
          ۲٫بجای \ از / برای مسیرها استفاده کنید. مثلا
          D:\DataSets\Accepted\FEI\All رو بصورت D:/DataSets/Accepted/FEI/All بدید.

          1. علی کیانی می گوید

            ممنون از کمک شما بلاخره انجام شد یه نکته دیگر علاوه بر مواردی که دوست خوبمون آقای کلایی در مورد مسیرها گفتند اینکه نباید مسیری که دیتا بیس در آن قرار دارد حاوی کاراکتر فاصله باشد یعنی مثلا بجای
            D:/Data Sets باید به صورت D:/DataSets باشد.

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

              خواهش میکنم . من حسن پور هستم (متی کلایی پسوند اسم بنده اس 🙂 )

  10. نرگس می گوید

    سلام
    من هم مشکل اقای کیانی دارم و راه حل های گفته شده متاسفانه کار ساز نیس و ارور System entropy source not available رو دو بار میده . بعد فولدر دیتاست رو تو فولدر EXAMPLE ایجاد میکنه و سر سه تا عکس گیر میده که پیداش نمیکنم. در صورتی که هم تو فایل عکسا هست هم درست توی فایل تکست نوشته شده ( چند بار چک کردم). ادرس دهی هم درسته. بدون کاراکتر فاصله است و از / استفاده کردم. نمیدونم چرا برای این سه تا عکس به مشکل بر میخوره. مثل سایر عکسا درست و دقیق نوشته شده. ارور مربوطه: COULD NOT OPEN OR FIND *.JPG LABLE
    که بجای ستاره اسم عکس هست و به جای لیبل هم یک عدد

    مشکل از کجاست به نظر شما؟

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

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

      1. نرگس می گوید

        مشکلم حل شد. دوستان توجه کنید که بعد از لیبل ها هم نباید هیچ گونه فاصله ای باشه. بر فرض مثال خط زیر را توجه کنید :
        /۱/۰۰۱٫۱_Left_Down.JPG 1
        بعد از ۱ که لیبل هست هیچگونه فاصله ای قرار ندید. من سهوا دستم خورده بود و بعضیاشون بعد از لیبل یک کاراکتر فاصله داشتند.
        و من فکر میکردم که فقط تا قبل از لیبل مهمه

  11. Pazoki می گوید

    باسلام
    در کدهایی که برای تبدیل دیتاست mnist به فرمت lmdb ارايه شده، در نام فایل های دانلود شده بصورت زیپ قبل از idx ها علامت منها هست وپس از extract قبل از idx علامت دات میشود که در صورتیکه این تغییر را اعمال نکنیدومستقیما دستورات بالا را کپی کنید، خطا میدهد.
    با تشکر

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

      سلام .
      خیلی ممنون . به نکته خوبی اشاره کردید . درسته. من این نکته رو فراموش کردم تو متن وارد کنم.(ورژن اولیه اسکریپت دانلود نقاط رو به – تبدیل میکرد برای همین کدهای دیگه بر همین اساس کار میکنن (در برنچ من))
      توضیح به متن اضافه شد.

  12. محمد می گوید

    سلام
    من میخوام در داخل فایل متنی مشخصات عکسهام وارد کنم مثلا
    img1 1
    img2 2
    مشکل من اینه که چون تعداد عکسهام زیاده نمیخوام دستی وارد کنم.البته باید رندم هم باشه. با متلب هم نتونستم
    کسی میدونه چطوری باید انجام بدم؟
    ممنون

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

      سلام . من که دقیقا آموزش همین رو در پرسش و پاسخ دادم ! نباید هیچ مشکلی داشته باشید شما!

  13. محمد می گوید

    مشکل من ساخت فایل txt به صورت خودکار است.مثلا من ۳۲ تا کلاس دارم و ۳۲ پوشه .میخوام برنامه بره مسیر پوشه ها رو بخونه و به صورت تصادفی اسم عکسها رو باتوجه به پوشه ای ک قرار داره توی فایل متنی بنویسه .

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

      سلام .
      شما اصلا نیازی ندارید که اسمهای هر کلاس رو تصادفی انتخاب کنید! کافیه مسیر هر عکس با لیبلش مشخص بشه . اگه برنامه نویسی سخته براتون بصورت زیر هم برید خوبه .
      شما یه پوشه میسازید مثلا با نام mydataset در داخل این پوشه ۳۲ پوشه دیگه میسازید که مربوط به کلاسهای مختلف شماست. هر کلاس هم عکسهای خودشو داره .
      حالا کافیه شما مسیر پوشه mydataset رو بگیرید و سرچ کنید هرچندتا پوشه هست پیدا کنید. اسامی پوشه ها رو بریزید تو یه لیست مثلا. حالا یه loop بزنید داخل این پوشه ها، و نام تصاویر هرکدوم رو بخونید (بصورت esme_poshe_classe_morede_nazar\esme_tasvir ) و برای لیبل هم میتونید مثلا از ۰ شروع کنید برای فولدر اول و هربار یکی افزایشش بدید.
      بعد فایل رو سیو کنید. تو مرحله بعد هم میتونید مثلا از atom یا sublime استفاده کنید فایل مربوط به رو باز کنید بعد از منو shuffle کنید بعدش یه مقدار رو برای ترینینگ بگیرید و یک مقدار رو برای تست . اینکارو برای بقیه انجام بدید و نهایتا فایلها رو ترکیب کنید که یک فایل واحد بشه .البته اینو هم دوست داشته باشید با برنامه نویسی میتونید انجام بدید.

      (اگر هم همه تصاویر هم نام هستن. خیلی راحت با یه لوپ خودتون فایل رو بسازید . بجای اینکه نام تصاویر رو بدید (مثلا بدید img1.png 1 مسیر نسبی رو بدید . مثلا بدید class1\img1.png 1 ) اینم میتونید انجام بدید)

  14. محمد می گوید

    ممنون.اینloop زدن رو نفهمیدم یعنی چی؟
    حلقه for منظور هست؟
    هر پوشه ۷۰ عکس هست.
    for i=1:1: 70

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

      لوپ منظور for یا while هست. این دیگه یه مثال ساده برنامه نویسی هست . روش فکر کنیدامکان نداره یک همچین چیزی رو کسی نتونه بنویسه .
      نیازی هم نیست حتما به پایتون بنویسید به هر زبانی که تسلط دارید برید کدشو بزنید

  15. محمد می گوید

    ممنون

  16. صیاد می گوید

    با سلام
    من میخوام داده هاو رو به فرمت lmdb ببرم اما با این ارور مواجه میشم ::
    *** Check failure stack trace: ***
    @ ۰x7fb26b5ea5cd google::LogMessage::Fail()
    @ ۰x7fb26b5ec433 google::LogMessage::SendToLog()
    @ ۰x7fb26b5ea15b google::LogMessage::Flush()
    @ ۰x7fb26b5ece1e google::LogMessageFatal::~LogMessageFatal()
    @ ۰x7fb26bb19468 caffe::db::LMDB::Open()
    @ ۰x403aaf main
    @ ۰x7fb26a55b830 __libc_start_main
    @ ۰x404b59 _start
    @ (nil) (unknown)
    Aborted (core dumped)
    نمیدونم کجاش مشکلی داره. ممنون میشم اگه راهنمایی کنید

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

      سلام . این که نشد. شما در سایت پرسش و پاسخ متن کامل خطا رو قرار بدید و بگید چه گامهایی رو برداشتید تا بشه بهتون کمک کرد.

  17. adeljoon می گوید

    این دو خط چیکار میکنن؟
    training_label.write(‘{0}\{1} {2}\n\r’.format(folder, img, class_index))
    else:
    testing_label.write(‘{0}\{1} {2}\n\r’.format(folder, img, class_index))

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

      سلام
      کار اینها ایجاد فایلهای لیبل هست که در هر سطرش مسیر یک تصویر با لیبل مورد نظرش رو قرار میدن و به سطر بعد میرن.
      مسیر هم اینطور مشخص میشه بجای {۰} اسم پوشه میاد بعد یه \ و بعد هم اسم تصویر میاد و نهایتا یک اسپیش و بعدش هم که بجای {۲} لیبل مورد نظر قرار میگیره .
      هر جا نمیدونید که کد چیکار میکنه میتونید از دیباگ استفاده کنید یا اینکه خیلی ساده از یه دستور print() استفاده کنید و محتویاتش رو پرینت کنید.

  18. زیبا می گوید

    خیلی آموزش کامل و مفیدی بود خیلی ممنونم. ان شاالله همیشه موفق باشید.

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

      سلام
      خواهش میکنم
      در پناه خداوند انشاءالله شما هم موفق و سربلند باشید

  19. احسان می گوید

    سلام
    مطالبتون بسیار آموزنده هست و کاربردی.
    سوال من در مورد LMDB هست. من ۸۰۰۰۰ هزار تصویر دارم که خودم تهیه کردم.
    ۱) در کفه نیازی نیست که فایل تکستی تهیه بشه و نام تصاویر در آنها نوشته بشه ؟ یا خود تصاویر درون فولدر کافی هست؟
    ۲) اگر بخواهیم ۸۰۰۰۰ تصویر ۵۰۰۰۰ برای آموزش و ۲۰۰۰۰ برای ولیدیشن و ۱۰۰۰۰ برای تست باشه چیکار باید کرد؟ فکر کنم فرمودید مدل دوم که خودش اتوماتیک ۷۰ درصد برای آموزش میزاره و ۳۰ درصد هم برای آزمون همین مورد باید باشه؟
    ۳) کدوم مورد استاندارد تر هست (۱) تدرست کردن دو فولدر آموزش و آزمون (۲) تهیه یک فولدر شامل تمامی تصاویر و به صورت اتوماتیک؟ البته من با مدل اول را بهتر ترجیح میدم.
    ۴) دقیقا بفرمایید خروجی LMDB چیست؟
    ۵) برای نوشتن کد آیا همین قسمت کافی هست ؟
    from random import shuffle
    import os
    root = ‘G:/hossein/data/cifar10/data_train_and_test/’
    # lets get all the sub-directories first
    subfolders = [name for name in os.listdir(root) if os.path.isdir(os.path.join(root,name)) ]
    #specify training/validation ratio
    training_ratio = 0.7
    # files for training and validation(testing) labels
    training_label = open(os.path.join(root,’labels_train.txt’),’a+’)
    testing_label = open(os.path.join(root,’labels_test.txt’),’a+’)

    # now lets enter each folder and read their images and populate our label file
    for class_index ,folder in enumerate(subfolders):
    #print (folder, str(class_index))
    images = [f for f in os.listdir(os.path.join(root,folder)) if f.endswith(‘.png’)]
    item_count = len(images)
    #shuffle images
    shuffle(images)
    training_count = item_count * training_ratio
    test_count = item_count – training_count
    #create a label
    for i, img in enumerate(images):
    if i < training_count:
    training_label.write('{0}\{1} {2}\r\n'.format(folder, img, class_index))
    else:
    testing_label.write('{0}\{1} {2}\r\n'.format(folder, img, class_index))
    #print some info
    #print ('{0}: item #{1} processed'.format(folder, i))
    training_label.close()
    testing_label.close()
    یا باید این قسمت ها قبل از این کد اضاف شود ؟تعریف لیبل برای دیتاستShell

    ۱
    ۲
    ۳
    ۴
    ۵
    horse/lippizaner_s_001297.png 2
    airplane/fighter_aircraft_s_000924.png 0
    ship/container_ship_s_002089.png 1
    dog/chihuahua_s_000780.png 4
    cat/domestic_cat_s_001116.png 3

    /convert_imageset –resize_height=٪RESIZE_HEIGHT٪ –resize_width=٪RESIZE_WIDTH٪ –shuffle ٪TRAIN_DATA_ROOT٪ ٪TRAIN_DATA_ROOT٪/train_label.txt ٪MyDataSet٪/mydataset_train_lmdb

    convert_imageset.exe –resize_height=32 –resize_width=32 –shuffle E:/DeepLearning.ir/MyDataSet/train E:/DeepLearning.ir/MyDataSet/train/train_label.txt mydataset_train_lmdb

    ۱
    build/x64/Release/convert_imageset.exe –resize_height=32 –resize_width=32 –shuffle Examples/MyDataSet/train Examples/MyDataSet/train/train.txt Examples/MyDataSet/mydataset_train_lmdb

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

      سلام . نه نیازی نیست . میشه براحتی با یک زبان برنامه نویسی لیست مورد نظر رو ایجاد کرد. یک برنامه ساده هم من اینجا به پایتون نوشتم که میتونید برای کار خودتون تغییرش بدید
      بهترین کار اینه که اول یک لیست از تمام تصاویر مشخص بشه. اگه ماهیت تصاویر یکی هست بله میشه از همین طریق براحتی درصدها رو مشخص کرد. اما اگه در تصاویرتون دسته های مختلفی دارید
      اول سعی کنید از هر دسته این رنج رو جدا کنید بعد ترین رو جداو تست رو جدا با هم ترکیب کنید. و بعد اینکه ترکیب شد میتونید شافل کنید و در ال ام دی بی ذخیره کنید
      مهم پوشه نیست مهم اون لیستی هست که میسازید . حالا اینکه چطور مدیریت میخوایید بکنید با خودتونه . من خودم ترجیم یک فولدره که همه تصاویر در اون باشه. اگه دیتاست شما دسته های مختلفی داره (فرض کنید شما دوتا کلاس دارید که میخوایید دسته بندی کنید
      اما همین دوتا کلاس خودشون انواع مختلف دارن مثلا سگ و گربه دوتا کلاس هستن. اما نژاد های مختلف سگ و گربه دارید . ) خیلی بهتره برای هر کلاس یک فولدرجداگانه در نظر بگیرید. سگ جدا گربه جدا و در داخل اینها هم هر دسته فولدر خودشو داشته باشه . اینطوری دستتون خیلی بازتره و اجازه تفکیک بیشتری دارید

      lmdb یه دیتابیس هست خروجی خاصی نداره.
      این اسکریپت فقط برای ایجاد لیست تصاویر هست که بعدا ازش برای ایجاد دیتاست lmdb استفاده کنید. لطفا یکبار دیگه خوب اموزش رو مطالعه کنید متوجه میشید

  20. زکی زاده می گوید

    سلام من برنامه رو اجرا کردم و دو تا فایل به نام های data.mdb و lock.mdb ساخته . حالا اینارو چه جوری استفاده کنم ؟
    من میخوام از faster r-cnn استفاده کنم :
    https://github.com/rbgirshick/py-faster-rcnn
    حالا چه جوری دیتابیس رو استفاده کنم برای faster r-cnn ؟؟

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

      سلام . لطفا اموزش های کفی رو مطالعه کنید.
      برای استفاده از دیتاست lmdb در کفی از لایه Data استفاده میشه.

  21. masoumeh می گوید

    سلام
    ببخشید شما بیشتر درمورد ورودی هایی صحبت کردید که به صورت تصویر هستن، اگر ورودی به صورت داده باشه چی،؟ من داده هام در متلب باز میشن چجوری اونا رو تبدیل به CSV فایل کنم؟؟

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

      سلام .
      یعنی چی به چه صورتی؟

      1. masoumeh می گوید

        من داده هام پسون متلب دارن ، حالا بخوام در پایتون برنامه بنویسم، همین فایل متلب رو بهش بدم اوکی هست یا اینکه باید تبدیلش کنم به csv فایل؟؟

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

          سلام
          خیلی گنگه فرمایش شما .
          فایل متلب یعنی چی ؟
          ببینید شما یک سری تصویر باید داشته باشید و یکسری برچسب که ما بهش میگیم label
          تصاویر ممکنه بصورت معمول و عادی باشن تو یک پوشه جداگانه
          بعضی موارد هم ممکنه تصاویر در قالب بایت ذخیره شده باشن بصورت باینری
          که در اصل کار تفاوتی ایجاد نمیکنه فقط نحوه خوندن متفاوت میشه و در مورد حالت دوم عموما مشخصات ساختار داده ای که تصاویر در اون ذخیره شدن هم بیان میشه تا فرد بدونه چطور باید چیزی رو بخونه .
          فایلهای csv عموما حاوی برچسب ها یا اطلاعات کلی تصاویر هستن که فرد میتونه یک قلم یا تعداد بیشتری قلم داده از اون برای کارش استخراج کنه.
          در مورد اینکه فایل متلب رو به پایتون بدید کار میکنه یا نه بستگی به فایل داره .
          ولی شما باید بتونید همین کد رو براحتی به متلب ترجمه کنید الزامی نیست که حتما همین کد رو اجرا کنید .

  22. masoumeh می گوید

    سلام، خسته نباشید
    من ۱۲۷ تا سمپل با لیبل های مجزا دارم،که هرکدوم از این سمپل ها، یک ماتریس سطری(یک سطر و ۱۲۰۰۰۰۰۰۰ستون)هست که من میخوام هرکدوم از این ماتریس ها را به ۱۲۰ تا دسته ۱۰۰۰۰۰۰ تایی تقسیم کنم و بعد از هر دسته fft بگیره و تصویر خروجی از هر دسته رو در یک فولدر برای من ذخیره کنه،که درواقع بعد از اینکه یک مجموعه از تصاویر بدست اوردم شروع به classify کردن کنم، حالا این رو با استفاده از کراس و تنسورفلو چجوری بنویسم؟؟
    خیلی لطف میکنید اگر در نوشتن این برنامه کمکم کنید.
    با احترام

  23. masoumeh می گوید

    سلام
    من الان ۱۵۲۴۰ تا ماتریس ۱ در ۱۰۰۰ دارم، حالامن میخوام که اینها رو به عنوان ورودی بدم به ۱d cnn، خوب فکر میکنم باید ابتدا داده های ترین و تست جدا بشه و بعد داده های ترین رو بدیم به مدلمون، لطف میکنید در این مورد راهنمایی بفرماییدکه چجوری این مراحل رو در پایتون انجام بدم ، خیلی به راهنمایی شما نیاز دارم اقای کلایی.

    با احترام

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

      سلام
      جداسازی داده ترین از تست که مشخصه! قبلا یک نمونه کد در انتهای آموزش تبدیل بهlmdb در کفی قرار داده بودم و لینک هم خدمت شما دادم.
      ببینید شما کافیه بصورت رندوم به تعدادی که نمونه برای فاز ازمایشی نیاز دارید سطر از اون ماتریس بخونید و به لیست ترینینگتون اضافه کنید این رو هم میتونید خیلی ساده با یک حلقه for در پایتون انجام بدید
      برای رندوم کردن هم میتونید از روشهای مختلفی استفاده کنید میتونید هم از shuffle() در پایتون استفاده کنید و اگه دیتای شما در قالب یک لیست هست اونجا سطرها رو شافل کنید و بعد خیلی معمولی در یک حلقه for مثلا به تعداد ۱۴۰۰۰ نمونه بخونید بزارید برای ترینینگ ست و بقیه اش هرچی موند بزارید برای تست ست (که اگه به کدی که من قبلا ارجاع دادم نگاه کنید میتونید ایده بگیرید )
      اگر هم از شافل استفاده نمیکنید میتونید خیلی راحت هر بار یک عدد به تصادف انتخاب کنید و سطر مربوطه (اگه قبلا انتخاب نشده باشه ) رو در ترینینگ ست بزارید و به همین صورت پیش برید
      ضمنا بنده حسن پور هستم

      1. masoumeh می گوید

        ممنون از راهنمایی اقای حسن پور
        در مورد قسمت cnn یک بعدی چی؟ یک نمونه مثال ممکنه برام بفرستید که ورودی سیگنال گرفته باشه و classify انجام داده، تو اینترنت اینقدر ۱d cnn، سرچ کردم و همشون رو بالا پایین کردم که گیج شدم، اگر لطف کنید فقط یک نمونه مثال برام در این مورد هم بفرستید ممنون میشم

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

          سلام
          شما باید conv1d رو سرچ میکردید .
          به هر حال هم در صفحه توضیحات خود تنسورفلو اومده توضیحات conv1d و هم اینجا یک مثال و توضیحات بیشتر داده شده و میتونید چک کنید :
          https://stackoverflow.com/questions/38114534/basic-1d-convolution-in-tensorflow

          1. masoumeh می گوید

            ببخشید من از نمونه برنامه ای که برای جدا کردن داده های ترین و تست گذاشتید رو متوجه نمیشم، دیتاست من به صورت ماتریس های ۱در ۱۰۰۰ هستن و ۱۵۲۴۰ تا از این ماتریس ها دارم، ممکنه لطف کنید راهنمایی بفرمایید که چجوری جدا کنم و به عنوان داده ورودی مدلم تعریف کنم؟
            این یک قسمت از برنامه هست:fft_array_full، همون دیتاست من هست

            # Combine the feature_arrays for all the 127 files. The resultant array will be 120*127 rows.
            fft_array_full = np.append(fft_array_full, FFT_array, axis=0)

            #specify training/validation ratio
            training_ratio = 0.7
            total_set = len(fft_array_full)
            X_train = total_set * training_ratio
            X_test = total_set – X_train
            X_train = X_train.reshape(X_train.shape[0], 1, 1000).astype(‘float32’)
            X_test = X_test.reshape(X_test.shape[0], 1, 1000).astype(‘float32’)
            # normalize inputs from 0-255 to 0-1
            X_train = X_train / 255
            X_test = X_test / 255

  24. علی می گوید

    سلام خسته نباشید
    تشکر از آموزش عالیتون
    من دیتاست ها رو همونطور که توضیح دادین ایجاد کردم همینطور سالور و نت رو نوشتم و گذاشتم واسه تست بعد حدودا ده دقیقه بدون این که خطایی در cmd بده از کافه خارج میشه یعنی مینویسه caffe exe has stopped working و اینکه توی ویندوز ۱۰ من کامپایل کردم
    ممنون از توجهتون

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

      سلام.
      لاگ رو تماما قرار بدید تا بشه نظر بهتری داد.

  25. هومن می گوید

    سلام
    من یک دیتاست متشکل از ۱۰۰۰۰ تصویر گربه و سگ دارم و می خوام این دیتاست به فرمت HDF5 یا CSV تبدیل کنم,میشه بگین چطور باید این کار انجام بدم؟

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

      سلام.
      فرمت CSV که چیزی جز نام تصاویر نیست عموما بایدببینید فریم ورک مورد نظر شما ورودی رو به چه صورتی دریافت میکنه تا بعدش بتونید دیتاست رو بسازید. کار با csv هم مثل فایل ساده است و نکته خاصی نداره.
      در مورد HDF5 هم میتونید اینجا رو ببینید

  26. امیر می گوید

    با سلام و خسته نباشید.
    فایل convert_imageset.exe رو از کجا میشه دان کرد؟
    من کارم کفه نیست و برای ترین کردن نیاز به فرمت lmdb و فایل convert_imageset.exe دارم. ممنون میشم راهنمایی کنید.

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

      سلام
      میتونید از اینجا نسخه از پیش کامپایل شده کفی رو دانلود کنید و داخل اون فایل مورد نظر رو پیدا و استفاده کنید.

      1. امیر می گوید

        ممنون ولی اون یه فایل cpp هستش. فایل exe نیست…

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

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

        2. امیر می گوید

          حل شد آقا
          خدا خیرت بده

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.