با یادگیری عمیق پول کمتر خرج کن!
من عرفان علیمحمدی، دانشمند داده (data scientist) در شرکت بلد هستم و قصد دارم در این مطلب درمورد یکی از مسائل مربوط به تصاویر ماهوارهای بلد توضیح بدهم.
مسئلهی ما چه بود؟
همان طور که در اپلیکیشن بلد مشخص است، به جز نقشهی عادی راهها میتوان از نقشهی ماهوارهای هم استفاده کرد.
دادههای نقشهی پیشفرض و نقشهی ماهوارهای ما در قالب کاشیهایی ذخیره شدهاند که این موضوع در یکی از مطالب پیشین بلاگ بلد توضیح داده شده بود:
وقتی در زوم کمتر به ایران نگاه میکنید، کافی است اطلاعات کلی ایران دانلود شوند و لازم نیست اطلاعات جزئیتر مانند پلاک خانهها دانلود شوند. هم چنین هنگامی که نقشه در سطح تهران را مشاهده میکنید لازم نیست اطلاعات شهر دیگری مثل یزد دانلود شود. به همین دلیل است که دادهها تقسیم شدهاند. اولاً برای هر مقیاس (زوم) از نقشه دادههایی برای آن دقت ساخته شدهاند. ثانیاً دادههای هر مقیاس خاص بین ناحیههای مختلف تقسیم شدهاند تا وقتی شما بخشی از تهران را میبینید فقط دادههای آن بخش از تهران دانلود شوند.
نقشهی ما اصطلاحاً tiled web map است. یعنی تصاویر ماهوارهای ما در قالب کاشیهایی ذخیره شدهاند که ابعاد هر یک از آنها ۲۵۶ پیکسل در ۲۵۶ پیکسل است. وقتی در نقشهی ماهوارهای روی قسمتی از نقشه زوم کنید عکس ۲۵۶ در ۲۵۶ مربوط به آن بارگیری میشود. بلد تصاویر ماهوارهای را از شرکتهای دیگر (مانند شرکتهای داخلی و خارجیای که کارشان تصویربرداری و نقشهبرداری است) خریداری میکند. به دلایل مختلف، ما به بعضی از تصاویر با جزئیات بالا دسترسی نداریم. یعنی برخی عکسهای ماهوارهای مربوط به بزرگنماییهای زیاد در بلد موجود نیست. یکی از مهمترین علتها برای این موضوع، هزینهی بالای تهیه و خریداری این تصاویر است. این مسئله باعث میشود که اگر کاربر زوم خیلی زیادی انجام دهد، عکس باکیفیتتری لود نشود و تصویر را به صورت تار مشاهده کند که موجب نارضایتی کاربر خواهد شد. برای مثال، اگر کاربر بخواهد سه تصویر زیر را دقیقتر ببیند با عکسهای تارشده مواجه میشود:
برای جلوگیری از این تار شدن دو راه داریم. انتخاب اول این است که پول بیشتری خرج کنیم و عکسهای ماهوارهای بیشتری بخریم. انتخاب دوم هم این است که نهایت سعیمان را بکنیم تا با استفاده از عکسهای کنونی عکسهای باکیفیتتری تولید کنیم. به دلیل هزینهی بسیار زیاد روش نخست، ما به سراغ راه دوم میرویم تا امکانپذیر بودن یا نبودن آن را بسنجیم.
چه روشهایی برای بزرگنمایی تصویر وجود دارد؟
موقع بزرگنمایی تصاویر ماهوارهای در حالت عادی از روشهایی برای پر کردن اطلاعاتی که از قبل نداریم استفاده میشود. مثلاً اگر بخواهیم یک عکس ۲ در ۲ را به یک عکس ۴ در ۴ تبدیل کنیم، باید از روی ۴ عدد قبلی ۱۶ عدد جدید بسازیم و راه یکتایی هم برای این کار وجود ندارد.
راههای کلاسیکی برای این کار وجود دارد که در تمام نرمافزارهای دنیا به صورت پیشفرض مورد استفاده واقع میشود.
همان طور که در تصویر ۷ میبینید، یک راه پیشنهادی این است که فقط ۱۲ خانهی خالی جدول جدید را پر کنیم. این نوع مسائل به مسائل درونیابی (interpolation) معروف هستند زیرا میخواهیم چیزی که درون خانههای میانی میافتد را پیشبینی کنیم. یکی از راههای پیشنهادی این است که با شیب ثابتی از سمت ۱۰ به سمت ۲۰ و ۳۰ و ۴۰ برویم تا در تصویر نهایی شیب رنگی ایجاد شود. روش دیگر این است که خانههای نزدیک ۱۰ را با ۱۰، خانههای نزدیک ۲۰ را با ۲۰، خانههای نزدیک ۳۰ را با ۳۰ و خانههای نزدیک ۴۰ را با ۴۰ پر کنیم. این دو روش به ترتیب به نامهای درونیابی خطی و درونیابی نزدیکترین همسایه شناخته میشوند. درونیابیهای معروف دیگری نیز برای این کار وجود دارند، مثل درونیابی دومکعبی (bicubic interpolation).
این راهها راههای خوبی هستند اما راهحلهایی خیلی عمومی برای این موضوع محسوب میشوند. یعنی ممکن است بعضی عکسهای دنیا را خیلی خوب بزرگنمایی کنند اما لزوماً بهترین روش بزرگنمایی تصاویر ماهوارهای نباشند. یعنی شاید بهتر باشد که وقتی دامنهی مسئلهی ما مشخص و محدود است، دنبال راهحلی برویم که روی همان ورودی خاص ما خوب جواب میدهد.
ما تصمیم گرفتیم که از یادگیری ماشین (machine learning) برای حل مسئلهی خود استفاده کنیم چون یادگیری ماشین ممکن است بتواند یک نوع ورودی خاص از عکسها را یاد بگیرد. یعنی اگر بتوانیم به کامپیوتر عکسهایی از قبل و بعد بزرگنمایی نشان دهیم و انتظار داشته باشیم که با دیدن نمونههای زیاد از تصویر کوچک و بزرگ این موضوع را یاد بگیرد، ممکن است به راهحل بهتری نسبت به راهحلهای عمومی دست پیدا کنیم.
ما در این مسیر از راههای مختلف مربوط به یادگیری عمیق (deep learning) و شبکههای عصبی پیچشی (convolutional neural networks) استفاده کردیم. از آنجا که شبکههای عصبی تا حدی فرآیند یادگیری از روی نمونهها را شبیه مغز انسانها انجام میدهند، ممکن است منجر به نتایج شگفتانگیزی شوند.
پس از تحقیق و بررسی مقالات منتشرشده در این زمینه دریافتیم که این مسئله را هم به وسیلهی یادگیری نظارتشده (supervised learning) و هم به وسیلهی یادگیری نظارتنشده (unsupervised learning) میتوان حل کرد. ما چندین راه مختلف را برای حل این مسئله ارزیابی کردیم. در بخش بعد جزئیات به کارگیری یک روش نظارتشده که نتیجهی امیدوارکنندهای داشت را بیان میکنیم.
روش پیشنهادی
ما از الگوریتم فشردهسازی عکسهای JPEG الهام گرفتیم. در فرمت JPEG برای کاهش حجم تصاویر، پیکسلهای اولیهی تصویر به خودی خودی ذخیره نمیشوند. بلکه دچار تغییراتی میشوند که از حجم تصویر اولیه کاسته شود. JPEG تصاویر را به شکل RGB بررسی نمیکند، بلکه آنها را وارد فضای رنگی دیگری موسوم به YCbCr میکند.
در فضای رنگی YCbCr بر خلاف RGB، رنگ هر پیکسل را با میزان قرمز، سبز و آبی بودن آن نشان نمیدهند. بلکه در ابتدا به بخش خاکستری (سیاه و سفید) هر پیکسل توجه میکنند و نام آن را Y میگذارند. سپس میگویند آبی بودن عکس را چه مقدار باید افزایش یا کاهش بدهیم و نام این مقدار را Cb میگذارند. در آخر نیز میگویند چه مقدار باید قرمزی عکس را تغییر بدهیم و نام این مقدار را Cr میگذارند.
از آنجا که چشم انسان اشیا را از روی میزان درخشندگی (luminance) آنها تشخیص میدهد، الگوریتم JPEG نیز به این موضوع توجه خاصی کرده است. در الگوریتم JPEG فقط قسمت Cb و Cr عکس را فشردهسازی میکنند تا از کیفیت بخش خاکستری عکس کم نشود. در این حالت درخشندگی اشیا و مرزهای مهم دستنخورده باقی میمانند و انسان همچنان میتواند اشیا را به خوبی تشخیص دهد.
با الهامگیری از JPEG به سراغ یادگیری عمیق رفتیم چون قصد ما هم تولید تصویری بود که در آن اشیا و مرزهای مهم حفظ شده باشند. در ابتدا عکس را به فضای رنگی YCbCr بردیم و فقط قسمت خاکستری آن را از شبکهی عصبی خود عبور دادیم. معماری استفادهشده توسط ما یک شبکهی عصبی تماماً پیچشی (fully-convolutional neural network) بود که به عنوان ورودی یک عکس ۱۲۸ در ۱۲۸ خاکستری دریافت میکرد و در خروجی یک عکس ۲۵۶ در ۲۵۶ میساخت. هدف ما این بود که شباهت عکس تولیدی با عکس بزرگ واقعی بیشینه شود.
این مدل فقط درمورد بخش خاکستری تصویر بود. برای بزرگنمایی بخش Cb و بخش Cr از همان روشهای کلاسیک بزرگنمایی استفاده کردیم. در واقع با استفاده از درونیابی دومکعبی بخش Cb و بخش Cr را بزرگ کردیم تا با ادغام این سه بخش به عکس نهایی دست پیدا کنیم.
خروجیهای نمونه
نحوهی ارزیابی روش ارائهشده
معمولاً برای سنجش کیفیت عکس نسبت به عکس ایدهآل، از معیار peak signal-to-noise ratio یا به اختصار PSNR استفاده میشود که یکای آن بل (دسیبل) است.
به طور خیلی خلاصه، هر چه میزان اختلاف رنگ پیکسلهای عکس ثانویه با پیکسلهای متناظر عکس اولیه کمتر باشد، PSNR بیشتری خواهیم داشت. این معیار به ما کمک کرد تا بتوانیم روشهای مختلفی که برای حل مسئلهمان داشتیم را با هم مقایسه کنیم.
روش ارائهشده توانست بیشترین PSNR را نسبت به سایر روش ها به دست آورد. زمانی که از فضای رنگی RGB استفاده کردیم به PSNR پایینتری رسیدیم. هم چنین زمانی که هر سه بخش رنگی YCbCr را از شبکه عبور دادیم رنگهای تصویر خروجی کمی غیر طبیعی شدند. این اتفاق به دلیل ایجاد تغییر در بخشهای رنگی تصویر تا حدی قابل توجیه بود. یکی دیگر از مزایای روش ارائهشده سریعتر شدن زمان یادگیری مدل آن هم بود چون در قسمت ورودی شبکهی عصبی فقط به یکسوم اطلاعات احتیاج دارد.
نتیجهگیری
با استفاده از یادگیری عمیق روشی ارائه دادیم که میتواند کیفیت عکسهای هوایی را افزایش دهد. توانستیم رضایت بیشتری هنگام کار با نقشه برای کاربران فراهم کنیم، بدون آن که هزینهی زیادی برای تهیهی نقشههای هوایی انجام داده باشیم.
مطلبی دیگر از این انتشارات
استفاده از دادهها برای مانیتور کردن وضعیت محصول یا چگونه بفهمیم حال محصول ما خوب است؟
مطلبی دیگر از این انتشارات
ماجرای ترافیک لحظهای در نقشه بلد به زبان ساده
مطلبی دیگر از این انتشارات
برای خرید هر چیزی کجای تهران بریم؟