داده افزایی تصویری
آموزش‌های پیشرفته هوش مصنوعیبینایی ماشین

داده افزایی تصویری و چگونگی انجام آن در کتابخانه‌ی OpenCV

    0
    مدت زمان مطالعه: ۷ دقیقه

    چند روز پیش در حال نوشتن مقاله‌­ای بودم که به استفاده از فضای رنگی Color spaces متفاوت به عنوان ورودی شبکه های عصبی پیچشی (CNN) می‌پرداخت و به همین دلیل لازم بود از یک مولد داده برای داده افزایی تصویری استفاده کنم؛ چون نمی‌توانستم از مولد داده داخلی تنسورفلو بدین منظور استفاده کنم. بعد از جست‌وجو، چندین مقاله‌ی مرتبط پیدا کردم، اما هیچ کدام آن­ها به طور کامل این موضوع را پوشش نداده بودند؛ بنابراین تصمیم گرفتم شخصاً این کار را انجام دهم.

    فهرست محتوا

    • جابجایی افقی
    • جابجایی عمودی
    • روشنایی
    • زوم
    • جابجایی کانالی
    • چرخش افقی
    • چرخش عمودی
    • گردش
    • حالت تمام­‌صفحه

    در صورت تمایل به آشنایی با نحوه‌ی کار هر کدام از این توابع می‌­توانید به این مقاله مراجعه کنید. برای مصورسازی از تصویر طاق پیروزی (تصویر اصلی آن­‌را پایین مشاهده می‌­کنید) استفاده خواهیم کرد.

    داده افزایی تصویری

    تصویر آزمایشی

    جابجایی افقی

    در اولین بخش از بحث داده افزایی تصویری به جابجایی افقی خواهیم پرداخت. جابجایی یا برگردان translation افقی به جابه‌جا کردن یک تصویر به چپ یا راست بر اساس یک نسبت گفته می­‌شود؛ این نسبت حداکثر میزان جابجایی را مشخص می­‌کند. به منظور تنظیم مجدد تصویر و برگشت به ابعاد اصلی، Keras به صورت پیش‌­فرض از یک مقدار ورودی به نام nearest استفاده می‌کند که قسمت‌های از دست رفته عکس را پر می‌کند.

    داده افزایی تصویری

    نتیجه‌ی حالت تمام‌صفحه nearest

    این عمل باعث می‌­شود قسمتی از تصویر بلا­استفاده باقی بماند، به همین دلیل تصویر را به اندازه‌ی اصلی باز می­‌گردانم. پس آموختیم که برای انجام این کار باید یک عدد تصادفی تولید کنیم و سپس تصویر را از طریق شاخص­‌گذاری indexing به سمت چپ یا راست جابجا کنیم.

    داده افزایی تصویری

    جابجایی افقی

    جابجایی عمودی

    دیگر بحثی که برای داده افزایی تصویری از اهمیت زیادی برخوردار است، جابجایی عمودی است. اجرای جابجایی عمودی تفاوت چندانی با نحوه­‌ی جابجایی افقی ندارد.

    داده افزایی تصویری

    جابجایی عمودی

    روشنایی

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

    برای انجام این مسئله باید از فضای رنگی HSV استفاده کنیم. هرچه مقدار اشباع رنگ Value of saturation و ماتریس­‌های مقادیر Value matrices بالاتر باشد، روشنایی هم بیشتر خواهد بود. بنابراین به منظور افزایش روشنایی باید این مقادیر را در عددی بزرگ­تر از ۱ و برای کاهش آن در عددی کوچک­تر از ۱ ضرب کنیم. در کتابخانه‌ی تنسورفلو ابتدا یک بازه مشخص شده و سپس از درون این بازه یک مقدار به صورت تصادفی انتخاب می­‌گردد.

    داده افزایی تصویری

    روشنایی

    زوم

    در کتابخانه‌ی تنسورفلو برای اجرای تابع زوم ابتدا یک بازه را در نظر گرفته و از درون آن مقادیری به صورت تصادفی انتخاب می‌کنیم. اگر این مقادیر از ۱ کوچک­تر باشند، تصویر بزرگ­نمایی می‌­شود و اگر بزرگ­تر از ۱ باشند، تصویر کوچک شده و سپس با nearest به ابعاد واقعی خود برمی‌گردد. با این حال، از آن‌جایی که می­‌خواهیم تصاویر را به اندازه­‌ی واقعی آن­ها برگردانیم، فقط مقادیر کمتر از ۱ را انتخاب می­‌کنیم. برای نمونه مقدار ۰.۶ بدین معنی است که ۶۰% از کل تصویرگرفته خواهد شد و سپس تصویر به ابعاد اصلی بر خواهد گشت.

    داده افزایی تصویری

    زوم

    جابجایی کانالی

    دیگر مورد لازم برای داده افزایی تصویری جابجایی کانالی است. برای اجرای جابجایی کانالی، یک مقدار را به صورت تصادفی از بازه‌ای معین انتخاب کرده و به همه­‌ی کانال­‌های تصویر اضافه می­‌کنیم. نتیجه تقریباً شبیه تابع روشنایی است:

    داده افزایی تصویری

    جابجایی کانالی

    چرخش افقی

    برای اجرای این تابع چرخش افقی در مبحث داده افزایی تصویری به یک متغیر بولی Boolean variable نیاز داریم؛ این متغیر مشخص می­‌کند یک چرخش افقی انجام می‌شود یا خیر. یک تابع داخلی در OpenCV  (cv2.flip)  وجود دارد که صرفاً برای اجرای این عملیات مورد استفاده قرار می­‌گیرد.

    داده افزایی تصویری

    چرخش افقی

    چرخش عمودی

    این تابع نیز همچون تابع چرخش افقی با استفاده از cv2.flip  برای داده افزایی تصویری انجام می­‌شود. اما آرگومانargument دوم آن باید ۰ باشد.

    داده افزایی تصویری

    گردش عمودی

    گردش

    برای اجرای تابع گردش در بحث داده افزایی تصویری در OpenCV باید یک ماتریکس گردش ایجاد کنیم و سپس تبدیلات آفین Affine transformations را روی آن اعمال نماییم.

    داده افزایی تصویری

    گردش

    تمام­‌صفحه

    پیش­تر از حالت تمام­‌صفحه‌­ی nearest گفتیم و اشاره کردم که به جای استفاده از آن، اندازه­‌ی تصاویر را تغییر می­‌دهم. با این حال از آن­جایی که قصد دارم لیست کاملی را در این مقاله ارائه کرده باشم، نحوه­‌ی ساخت همه­‌ی حالت­‌های تمام­‌صفحه را (اعم از nearest) توضیح خواهم داد. متن پایین از مستندات تنسورفلو گرفته شده است:

    fill_mode: One of {“constant”, “nearest”, “reflect” or “wrap”}. Default is ‘nearest’. Points outside the boundaries of the input are filled according to the given mode:

    ‘constant’: kkkkkkkk|abcd|kkkkkkkk (cval=k)

    ‘nearest’: aaaaaaaa|abcd|dddddddd

    ‘reflect’: abcddcba|abcd|dcbaabcd

    ‘wrap’: abcdabcd|abcd|abcdabcd

    این موارد را با جابجایی افقی درست می‌­کنم. تابع cv2.copyMakeBorder  در تمام‌­صفحه کردن تصویر کاربرد دارد؛ این تابع آرگومان‌ها را به عنوان وضعیت بالا، پایین، چپ، راست و حالت تصویر در نظر می­‌گیرد. بالا، پایین، چپ و راست به اندازه­‌ی مرز تصویر اشاره دارند.

    داده افزایی تصویری

    حالت‌های تمام‌صفحه

     

    در صورت تمایل به آشنایی با نحوه­‌ی ایجاد یک مولد دیتای ساختگی، به این مقاله مراجعه کنید.

    این مطلب چه میزان برای شما مفید بوده است؟
    [کل: ۰ میانگین: ۰]

    شبکه پیچشی متراکم یا DenseNet و مروری بر آن (در مسائل رده‌‎بندی تصویر)

    مقاله قبلی

    چطور ماشین یادگیری عمیق خودمان را بسازیم؟

    مقاله بعدی

    شما همچنین ممکن است دوست داشته باشید

    نظرات

    پاسخ دهید

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