پست وبلاگ

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

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

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


نکته مهم : وقتی که فایلهای mnist دانلود شدن و از حالت فشرده خارج کردید. قبل از idx یه . (نقطه) وجود داره .  یعنی فایلها به فرم train-images.idx3-ubyte هستن که یا شما نقطه قبل از idx  رو به – تغییر میدید مثل مثال بالا یا اینکه از همین نام استفاده میکنید. (به – تغییر بدید بهتره چون کدهایی که من اماده کردم تو برنچ خودم اینطور ست شدن و کار میکنن و اگه نقطه بزارید تو ویندوز مشکل ایجاد میکنه). با تشکر از آقای پازوکی که یادآوری کردن این نکته رو.

شیوه کار در مورد 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 . برای ارتباط از بخش تماس با ما یا در باره من استفاده کنید.

مقالات مرتبط

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

پاسخ دهید

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