با یادگیری عمیق پول کم‌تر خرج کن!

تصویر ۱ - ترکیبی از نقشه‌ی عادی و نقشه‌ی ماهواره‌ای بلد (منبع هر دو عکس: وب‌سایت balad.ir)
تصویر ۱ - ترکیبی از نقشه‌ی عادی و نقشه‌ی ماهواره‌ای بلد (منبع هر دو عکس: وب‌سایت balad.ir)

من عرفان علی‌محمدی، دانشمند داده (data scientist) در شرکت بلد هستم و قصد دارم در این مطلب درمورد یکی از مسائل مربوط به تصاویر ماهواره‌ای بلد توضیح بدهم.

مسئله‌ی ما چه بود؟

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

تصویر ۲ - در اپلیکیشن اندروید بلد، با باز کردن تنظیمات نمایش نقشه می‌توانید از نقشه‌ی ماهواره‌ای به جای نقشه‌ی پیش‌فرض استفاده کنید.
تصویر ۲ - در اپلیکیشن اندروید بلد، با باز کردن تنظیمات نمایش نقشه می‌توانید از نقشه‌ی ماهواره‌ای به جای نقشه‌ی پیش‌فرض استفاده کنید.


داده‌های نقشه‌ی پیش‌فرض و نقشه‌ی ماهواره‌ای ما در قالب کاشی‌هایی ذخیره شده‌اند که این موضوع در یکی از مطالب پیشین بلاگ بلد توضیح داده شده بود:

وقتی در زوم کم‌تر به ایران نگاه می‌کنید، کافی است اطلاعات کلی ایران دانلود شوند و لازم نیست اطلاعات جزئی‌تر مانند پلاک خانه‌ها دانلود شوند. هم چنین هنگامی که نقشه در سطح تهران را مشاهده می‌کنید لازم نیست اطلاعات شهر دیگری مثل یزد دانلود شود. به همین دلیل است که داده‌ها تقسیم شده‌اند. اولاً برای هر مقیاس (زوم) از نقشه داده‌هایی برای آن دقت ساخته شده‌اند. ثانیاً داده‌های هر مقیاس خاص بین ناحیه‌های مختلف تقسیم شده‌اند تا وقتی شما بخشی از تهران را می‌بینید فقط داده‌های آن بخش از تهران دانلود شوند.
تصویر ۳ - هر کدام از مربع‌های قرمز یک کاشی هستند که داده‌های نقشه در آن ذخیره شده‌اند، وقتی نمای کلی ایران را می‌بینید کاشی‌ها مساحت بزرگی را شامل می‌شوند و شامل اطلاعات کلی هستند. وقتی به سطح شهر می‌رسید، کاشی‌ها شامل مساحت کم‌تری از نقشه‌اند و جزئیات بیش‌تری دارند. با وجود این که سه عکس نمونه مربوط به نقشه‌ی پیش‌فرض است، همین قاعده درمورد نقشه‌ی ماهواره‌ای هم صادق است.
تصویر ۳ - هر کدام از مربع‌های قرمز یک کاشی هستند که داده‌های نقشه در آن ذخیره شده‌اند، وقتی نمای کلی ایران را می‌بینید کاشی‌ها مساحت بزرگی را شامل می‌شوند و شامل اطلاعات کلی هستند. وقتی به سطح شهر می‌رسید، کاشی‌ها شامل مساحت کم‌تری از نقشه‌اند و جزئیات بیش‌تری دارند. با وجود این که سه عکس نمونه مربوط به نقشه‌ی پیش‌فرض است، همین قاعده درمورد نقشه‌ی ماهواره‌ای هم صادق است.



نقشه‌ی ما اصطلاحاً tiled web map است. یعنی تصاویر ماهواره‌ای ما در قالب کاشی‌هایی ذخیره شده‌اند که ابعاد هر یک از آن‌ها ۲۵۶ پیکسل در ۲۵۶ پیکسل است. وقتی در نقشه‌ی ماهواره‌ای روی قسمتی از نقشه زوم کنید عکس ۲۵۶ در ۲۵۶ مربوط به آن بارگیری می‌شود. بلد تصاویر ماهواره‌ای را از شرکت‌های دیگر (مانند شرکت‌های داخلی و خارجی‌ای که کارشان تصویربرداری و نقشه‌برداری است) خریداری می‌کند. به دلایل مختلف، ما به بعضی از تصاویر با جزئیات بالا دسترسی نداریم. یعنی برخی عکس‌های ماهواره‌ای مربوط به بزرگ‌نمایی‌های زیاد در بلد موجود نیست. یکی از مهمترین علت‌ها برای این موضوع، هزینه‌ی بالای تهیه و خریداری این تصاویر است. این مسئله باعث می‌شود که اگر کاربر زوم خیلی زیادی انجام دهد، عکس باکیفیت‌تری لود نشود و تصویر را به صورت تار مشاهده کند که موجب نارضایتی کاربر خواهد شد. برای مثال، اگر کاربر بخواهد سه تصویر زیر را دقیق‌تر ببیند با عکس‌های تارشده مواجه می‌شود:

تصویر ۴ - سه عکس ماهواره‌ای
تصویر ۴ - سه عکس ماهواره‌ای
تصویر ۵ - سه عکس ماهواره‌ای موجود در تصویر ۴، پس از بزرگ‌نمایی عادی که موجب تار شدن آن‌ها شده است
تصویر ۵ - سه عکس ماهواره‌ای موجود در تصویر ۴، پس از بزرگ‌نمایی عادی که موجب تار شدن آن‌ها شده است

برای جلوگیری از این تار شدن دو راه داریم. انتخاب اول این است که پول بیشتری خرج کنیم و عکس‌های ماهواره‌ای بیشتری بخریم. انتخاب دوم هم این است که نهایت سعیمان را بکنیم تا با استفاده از عکس‌های کنونی عکس‌های باکیفیت‌تری تولید کنیم. به دلیل هزینه‌ی بسیار زیاد روش نخست، ما به سراغ راه دوم می‌رویم تا امکان‌پذیر بودن یا نبودن آن را بسنجیم.

چه روش‌هایی برای بزرگ‌نمایی تصویر وجود دارد؟

موقع بزرگ‌نمایی تصاویر ماهواره‌ای در حالت عادی از روش‌هایی برای پر کردن اطلاعاتی که از قبل نداریم استفاده می‌شود. مثلاً اگر بخواهیم یک عکس ۲ در ۲ را به یک عکس ۴ در ۴ تبدیل کنیم، باید از روی ۴ عدد قبلی ۱۶ عدد جدید بسازیم و راه یکتایی هم برای این کار وجود ندارد.

تصویر ۶ - بزرگ‌نمایی یک عکس ۲ در ۲ (منبع: theailearner.com)
تصویر ۶ - بزرگ‌نمایی یک عکس ۲ در ۲ (منبع: theailearner.com)

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

تصویر ۷ - یک راه پیشنهادی برای بزرگ‌نمایی عکس ۲ در ۲ این است که رنگ پیکسل‌های گوشه‌ای را کاملاً مشخص کنیم.
تصویر ۷ - یک راه پیشنهادی برای بزرگ‌نمایی عکس ۲ در ۲ این است که رنگ پیکسل‌های گوشه‌ای را کاملاً مشخص کنیم.

همان طور که در تصویر ۷ می‌بینید، یک راه پیشنهادی این است که فقط ۱۲ خانه‌ی خالی جدول جدید را پر کنیم. این نوع مسائل به مسائل درون‌یابی (interpolation) معروف هستند زیرا می‌خواهیم چیزی که درون خانه‌های میانی می‌افتد را پیش‌بینی کنیم. یکی از راه‌های پیشنهادی این است که با شیب ثابتی از سمت ۱۰ به سمت ۲۰ و ۳۰ و ۴۰ برویم تا در تصویر نهایی شیب رنگی ایجاد شود. روش دیگر این است که خانه‌های نزدیک ۱۰ را با ۱۰، خانه‌های نزدیک ۲۰ را با ۲۰، خانه‌های نزدیک ۳۰ را با ۳۰ و خانه‌های نزدیک ۴۰ را با ۴۰ پر کنیم. این دو روش به ترتیب به نام‌های درون‌یابی خطی و درون‌یابی نزدیک‌ترین همسایه شناخته می‌شوند. درون‌یابی‌های معروف دیگری نیز برای این کار وجود دارند، مثل درون‌یابی دومکعبی (bicubic interpolation).

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

ما تصمیم گرفتیم که از یادگیری ماشین (machine learning) برای حل مسئله‌ی خود استفاده کنیم چون یادگیری ماشین ممکن است بتواند یک نوع ورودی خاص از عکس‌ها را یاد بگیرد. یعنی اگر بتوانیم به کامپیوتر عکس‌هایی از قبل و بعد بزرگ‌نمایی نشان دهیم و انتظار داشته باشیم که با دیدن نمونه‌های زیاد از تصویر کوچک و بزرگ این موضوع را یاد بگیرد، ممکن است به راه‌حل بهتری نسبت به راه‌حل‌های عمومی دست پیدا کنیم.

ما در این مسیر از راه‌های مختلف مربوط به یادگیری عمیق (deep learning) و شبکه‌های عصبی پیچشی (convolutional neural networks) استفاده کردیم. از آن‌جا که شبکه‌های عصبی تا حدی فرآیند یادگیری از روی نمونه‌ها را شبیه مغز انسان‌ها انجام می‌دهند، ممکن است منجر به نتایج شگفت‌انگیزی شوند.

پس از تحقیق و بررسی مقالات منتشرشده در این زمینه دریافتیم که این مسئله را هم به وسیله‌ی یادگیری نظارت‌شده (supervised learning) و هم به وسیله‌ی یادگیری نظارت‌نشده (unsupervised learning) می‌توان حل کرد. ما چندین راه مختلف را برای حل این مسئله ارزیابی کردیم. در بخش بعد جزئیات به کارگیری یک روش نظارت‌شده که نتیجه‌ی امیدوارکننده‌ای داشت را بیان می‌کنیم.

روش پیشنهادی

ما از الگوریتم فشرده‌سازی عکس‌های JPEG الهام گرفتیم. در فرمت JPEG برای کاهش حجم تصاویر، پیکسل‌های اولیه‌ی تصویر به خودی خودی ذخیره نمی‌شوند. بلکه دچار تغییراتی می‌شوند که از حجم تصویر اولیه کاسته شود. JPEG تصاویر را به شکل RGB بررسی نمی‌کند، بلکه آن‌ها را وارد فضای رنگی دیگری موسوم به YCbCr می‌کند.

در فضای رنگی YCbCr بر خلاف RGB، رنگ هر پیکسل را با میزان قرمز، سبز و آبی بودن آن نشان نمی‌دهند. بلکه در ابتدا به بخش خاکستری (سیاه و سفید) هر پیکسل توجه می‌کنند و نام آن را Y می‌گذارند. سپس می‌گویند آبی بودن عکس را چه مقدار باید افزایش یا کاهش بدهیم و نام این مقدار را Cb می‌گذارند. در آخر نیز می‌گویند چه مقدار باید قرمزی عکس را تغییر بدهیم و نام این مقدار را Cr می‌گذارند.

تصویر ۸ - اگر قسمت Y و Cb و Cr عکس بالا را از هم تفکیک کنیم به سه عکس پایین می‌رسیم. نکته‌ی حائز اهمیت این فضای رنگی این است که در قسمت Y آن تمام اشیا و مرزهای مهم توسط چشم انسان قابل رؤیت هستند. با خاکستری (grayscale) شدن عکس، آسمان، کوه، کلبه و چمن هنوز واضح باقی مانده‌اند. (منبع: ویکی‌پدیای انگلیسی)
تصویر ۸ - اگر قسمت Y و Cb و Cr عکس بالا را از هم تفکیک کنیم به سه عکس پایین می‌رسیم. نکته‌ی حائز اهمیت این فضای رنگی این است که در قسمت Y آن تمام اشیا و مرزهای مهم توسط چشم انسان قابل رؤیت هستند. با خاکستری (grayscale) شدن عکس، آسمان، کوه، کلبه و چمن هنوز واضح باقی مانده‌اند. (منبع: ویکی‌پدیای انگلیسی)


از آن‌جا که چشم انسان اشیا را از روی میزان درخشندگی (luminance) آن‌ها تشخیص می‌دهد، الگوریتم JPEG نیز به این موضوع توجه خاصی کرده است. در الگوریتم JPEG فقط قسمت Cb و Cr عکس را فشرده‌سازی می‌کنند تا از کیفیت بخش خاکستری عکس کم نشود. در این حالت درخشندگی اشیا و مرزهای مهم دست‌نخورده باقی می‌مانند و انسان هم‌چنان می‌تواند اشیا را به خوبی تشخیص دهد.

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


با الهام‌گیری از JPEG به سراغ یادگیری عمیق رفتیم چون قصد ما هم تولید تصویری بود که در آن اشیا و مرزهای مهم حفظ شده باشند. در ابتدا عکس را به فضای رنگی YCbCr بردیم و فقط قسمت خاکستری آن را از شبکه‌ی عصبی خود عبور دادیم. معماری استفاده‌شده توسط ما یک شبکه‌ی عصبی تماماً پیچشی (fully-convolutional neural network) بود که به عنوان ورودی یک عکس ۱۲۸ در ۱۲۸ خاکستری دریافت می‌کرد و در خروجی یک عکس ۲۵۶ در ۲۵۶ می‌ساخت. هدف ما این بود که شباهت عکس تولیدی با عکس بزرگ واقعی بیشینه شود.

تصویر ۱۰ - شبکه‌ی عصبی تماماً پیچشی شبکه‌ای است که تمام لایه‌های داخلی آن پیچشی هستند. یک عکس را به عنوان ورودی دریافت می‌کند و عکس دیگری را در خروجی تولید می‌کند. (منبع: Towards Data Science)
تصویر ۱۰ - شبکه‌ی عصبی تماماً پیچشی شبکه‌ای است که تمام لایه‌های داخلی آن پیچشی هستند. یک عکس را به عنوان ورودی دریافت می‌کند و عکس دیگری را در خروجی تولید می‌کند. (منبع: Towards Data Science)


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

خروجی‌های نمونه

تصویر ۱۱ - وقتی عکس‌های موجود در تصویر ۴ را بزرگ کردیم به عکس‌های تارشده‌ی تصویر ۵ رسیدیم. همان طور که مشاهده می‌کنید این سه تصویر که خروجی شبکه‌ی عصبی ما هستند، از کیفیت بالاتری برخوردار هستند و کم‌تر تار شده‌اند. رنگ‌ها نیز هم‌چنان طبیعی است.
تصویر ۱۱ - وقتی عکس‌های موجود در تصویر ۴ را بزرگ کردیم به عکس‌های تارشده‌ی تصویر ۵ رسیدیم. همان طور که مشاهده می‌کنید این سه تصویر که خروجی شبکه‌ی عصبی ما هستند، از کیفیت بالاتری برخوردار هستند و کم‌تر تار شده‌اند. رنگ‌ها نیز هم‌چنان طبیعی است.


تصویر ۵ - همان تصویر ۵ پیشین دوباره در این‌جا قرار گرفته است که تفاوت آن با تصویر ۱۱ بیش‌تر مشهود باشد.
تصویر ۵ - همان تصویر ۵ پیشین دوباره در این‌جا قرار گرفته است که تفاوت آن با تصویر ۱۱ بیش‌تر مشهود باشد.


نحوه‌ی ارزیابی روش ارائه‌شده

معمولاً برای سنجش کیفیت عکس نسبت به عکس ایده‌آل، از معیار peak signal-to-noise ratio یا به اختصار PSNR استفاده می‌شود که یکای آن بل (دسی‌بل) است.

تصویر ۱۲ - سه عکس تقریباً مشابه داریم که از راست به چپ دچار کاهش کیفیت شده‌اند. عکس سمت راست عکس اصلی است، عکس وسط مقداری فشرده شده است و عکس سمت چپ خیلی فشرده شده است. از آن‌جا که تغییر کیفیت عکس‌ها را با چشم نمی‌توان تشخیص داد، از معیار PSNR استفاده می‌کنیم. مقدار PSNR عکس وسط برابر ۴۵.۵۳ دسی‌بل و عکس سمت چپ برابر ۳۱.۴۵ دسی‌بل است. (منبع: ویکی‌پدیای انگلیسی)
تصویر ۱۲ - سه عکس تقریباً مشابه داریم که از راست به چپ دچار کاهش کیفیت شده‌اند. عکس سمت راست عکس اصلی است، عکس وسط مقداری فشرده شده است و عکس سمت چپ خیلی فشرده شده است. از آن‌جا که تغییر کیفیت عکس‌ها را با چشم نمی‌توان تشخیص داد، از معیار PSNR استفاده می‌کنیم. مقدار PSNR عکس وسط برابر ۴۵.۵۳ دسی‌بل و عکس سمت چپ برابر ۳۱.۴۵ دسی‌بل است. (منبع: ویکی‌پدیای انگلیسی)


به طور خیلی خلاصه، هر چه میزان اختلاف رنگ پیکسل‌های عکس ثانویه با پیکسل‌های متناظر عکس اولیه کم‌تر باشد، PSNR بیش‌تری خواهیم داشت. این معیار به ما کمک کرد تا بتوانیم روش‌های مختلفی که برای حل مسئله‌مان داشتیم را با هم مقایسه کنیم.

روش ارائه‌شده توانست بیش‌ترین PSNR را نسبت به سایر روش ها به دست آورد. زمانی که از فضای رنگی RGB استفاده کردیم به PSNR پایین‌تری رسیدیم. هم چنین زمانی که هر سه بخش رنگی YCbCr را از شبکه عبور دادیم رنگ‌های تصویر خروجی کمی غیر طبیعی شدند. این اتفاق به دلیل ایجاد تغییر در بخش‌های رنگی تصویر تا حدی قابل توجیه بود. یکی دیگر از مزایای روش ارائه‌شده سریع‌تر شدن زمان یادگیری مدل آن هم بود چون در قسمت ورودی شبکه‌ی عصبی فقط به یک‌سوم اطلاعات احتیاج دارد.

نتیجه‌گیری

با استفاده از یادگیری عمیق روشی ارائه دادیم که می‌تواند کیفیت عکس‌های هوایی را افزایش دهد. توانستیم رضایت بیشتری هنگام کار با نقشه برای کاربران فراهم کنیم، بدون آن که هزینه‌ی زیادی برای تهیه‌ی نقشه‌های هوایی انجام داده باشیم.