کشف اشیاء در تصویر R-CNN و Fast R-CNN و Faster R-CNN و YOLO

یکی از مسائل بینایی ماشین(computer vision) مساله کشف اشیاء(object detection) است. حل این مساله به معنی پیدا کردن اشیاء مختلف در یک تصویر و تعیین یک مرز برای آن شکل است. تصویر زیر نمونه ای از خروجی این مساله است.

نمونه ای از خروجی مساله کشف اشیاء
نمونه ای از خروجی مساله کشف اشیاء

ایده اولیه برای حل این مساله اینست که فرض کنیم یک شبکه عصبی کانولوشنی(CNN) داشته باشیم که برای دسته بندی تصاویر آموزش دیده است. حالا می توانیم یک پنجره کوچک را روی تصویر بلغزانیم هر بخش از تصویر را به شبکه مفروض بدهیم و ببینیم آیا یک شی در آن پنجره قرار دارد یا خیر؟ و اگر پاسخ مثبت است آن شی چیست؟ و از آنجا که اشیاء ممکنست به دلیل جلو و عقب بودن اندازه های مختلفی داشته باشند می توانیم با پنجره های با اندازه های مختلف همین کار را تکرار کنیم.

ایراد اصلی که بر ایده خام بالا وارد است هزینه بسیار بالای محاسباتی است.


روش R-CNN

ایده اصلی این روش که در سال ۲۰۱۴ توسط Ross Girshick و همکارانش در (اینجا) مطرح شد اینست که به جای اینکه تمام قسمت های تصویر را برای پیدا کردن اشیاء بگردیم ابتدا نواحی از تصویر که احتمال وجود یک شی در آن ها وجود دارد را پیدا کنیم و سپس همان ایده ساده بالا رو فقط روی آن نواحی پیاده کنیم.

فرآیند کلی روش R-CNN
فرآیند کلی روش R-CNN

این روش از سه ماژول تشکیل شده:

  • ماژول تولید نواحی پیشنهادی مستقل از اشیاء
  • یک شبکه عصبی بزرگ کانولوشنی که از هر ناحیه بردار ویژگیهایی با طول ثابت استخراج می کند
  • تعدادی دسته بند ماشین بردار پشتیبان خطی(SVM) برای هر کلاس از اشیاء

برای تعیین نواحی پیشنهادی روش‌های مختلفی ارائه شده است که در این مقاله از روش جستجوی انتخاب کننده(selective search) استفاده شده است که در (اینجا) مطرح شده است. طراحی این الگوریتم به نحویست که شامل این ملاحظات می شود: ۱) اشیاء ممکنست در هر مقیاسی وجود داشته باشند، بنابراین باید الگوریتم طوری طراحی شود که ناحیه مربوط به هر شی با هر مقیاسی را تشخیص بدهد. ۲) تمایز نواحی میتواند به دلایل مختلفی مثل تفاوت رنگ یا زمینه یا فاصله مکانی یا موارد دیگر باشد. بنابراین به جای اینکه فقط یکی از اینها در نظر گرفته شود، به نحوی از تمام این ها استفاده می شود. ۳) با توجه به کاربردهای این روش در کشف و تشخیص اشیاء نباید هزینه محاسباتی زیادی داشته باشد و نسبتا باید سریع باشد.

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

شبه کد الگوریتم حریصانه جستجوی انتخاب کننده
شبه کد الگوریتم حریصانه جستجوی انتخاب کننده

برای اندازه گیری میزان شباهت بین نواحی ۴ نوع شباهت اندازه گیری شده و از ترکیب خطی این ۴ نوع شباهت یک معیار شباهت کلی بین نواحی بدست آمده است. این معیارها مربوط به ترکیب رنگ و زمینه و اندازه و میزان فیت شدن دو ناحیه به همدیگر است.

بعد از تعیین نواحی پیشنهادی که حدود ۲۰۰۰ ناحیه است، هر ناحیه برای استخراج ویژگیها به شبکه ImageNet که توسط Alex Krizhevsky و همکارانش در (اینجا) مطرح شده بود، داده می‌شود. ساختار این شبکه به شکل زیر است که البته لایه آخر شبکه کار کلاس بندی را انجام میدهد در اینجا حذف می شود و بردار ۴۰۹۶تایی از ویژگیها بدست می آید.

شبکه ImageNet برای استخراج ویژگی های نواحی پیشنهادی
شبکه ImageNet برای استخراج ویژگی های نواحی پیشنهادی

با توجه به اینکه ابعاد تصویر ورودی به این شبکه باید مقدار ثابتی داشته باشد، در این مقاله از کشیدن تصویر و تغییر ابعاد برای اندازه کردن آن استفاده شده است که نمونه هایی از آن در شکل زیر قابل مشاهده است. ضمن اینکه می شود از اضافه کردن حاشیه نیز به جای کشیدن تصویر استفاده کرد.

نمونه هایی از تصاویر کشیده شده برای تطبیق به ورودی شبکه ImageNet
نمونه هایی از تصاویر کشیده شده برای تطبیق به ورودی شبکه ImageNet

نهایتا نیز از این بردار ویژگیهای با طول ثابت به عنوان ورودی به تعدادی ماشین بردار پشتیبان که برای دسته بندی هر نوع از اشیاء بهینه شده اند داده می شوند. البته به جای این کار می شود از یک لایه softmax استفاده کرد که در مقاله نشان داده شده است که روش بردار پشتیبان عملکرد مناسب تری دارد.

ایراداتی که برای این روش توسط نویسنده مقاله در مقاله بعد مطرح شده است عبارتند از: ۱) چند مرحله ای بودن فرآیند آموزش مدل. ۲) هزینه بالای آموزش مدل. ۳) کند بودن عملکرد مدل.


روش Fast R-CNN

این روش نیز توسط Ross Girshick یک سال بعد از روش بالا در (اینجا) مطرح شد. ایده کلی این روش در شکل زیر آمده است:

فرآیند کلی روش Fast R-CNN
فرآیند کلی روش Fast R-CNN

ورودی این معماری تصویر کامل و مجموعه ای از نواحی پیشنهادی(RoI: Region of Interest) است. ابتدا کل تصویر توسط یک شبکه عصبی کانولوشنی از پیش آموزش دیده مثل همان ImageNet که در مدل قبلی استفاده شده داده می شود تا یک conv feature map از کل تصویر بدست بیاید. در واقع مدل ImagNet تا قبل از لایه های fully connected آن مورد استفاده قرار می گیرد و آخرین لایه max pooling با لایه RoI pooling به ازاء هر ناحیه پیشنهادی جایگزین می شود تا یک بردار ویژگیهای با طول ثابت بدست آید.

لایه ROI Pooling

لایه RoI pooling از max pooling برای تبدیل ویژگی های داخل هر ناحیه به یک شکل دو بعدی با ابعاد ثابت استفاده می کند. این لایه هر ناحیه پیشنهادی را به تعدادی پنجره با ابعاد ثابت تقسیم می کند و در هر پنجره ماکسیمم مقدار ویژگیها را انتخاب می کند. نمونه ای از این عملیات برای تبدیل به پنجره ۲در۲ به صورت شکل زیر است:

لایه RoI pooling - مرجع
لایه RoI pooling - مرجع

اگر ابعاد ناحیه پیشنهادی h*w باشد و ابعاد نهایی مورد نیاز H*W باشد ابعاد تقریبی پنجره ها h/H*w/W خواهد بود.

بعد از این لایه هم دو لایه fully connected در کنار هم یکی برای دسته بندی اشیاء به همراه softmax و دیگری برای محل قرار گیری شیء به عنوان boundary box regressor استفاده می شود.


روش Faster R-CNN

این روش توسط Shaoqing Ren در سال ۲۰۱۶ در (اینجا) مطرح شد. معماری کلی این مدل به صورت شکل زیر است.

مدل Faster R-CNN
مدل Faster R-CNN

این مدل از دو ماژول تشکیل شده است. ماژول اول یک شبکه عصبی عمیق کانولوشنی که نواحی پیشنهادی را مشخص(RPN: Region Proposal Network) می کند و ماژول دوم همان Fast R-CNN است که از نواحی پیشنهادی بدست آمده استفاده می کند.

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

ایده اول برگرفته از مقاله OverFeat است. برای توضیح این ایده ابتدا به نحوه پیاده سازی لایه fully connected با استفاده از لایه کانولوشن میپردازیم.

پیاده سازی لایه fully connected با استفاده از کانولوشن و ایده اعمال این شبکه روی تصاویر بزرگتر

در صورتی که بخواهیم یک تنسور n*n*c را که از کانولوشن لایه های قبلی بدست آمده به یک لایه fully connected بدهیم که دارای k پرسپترون است می توانیم از k فیلتر n*n استفاده کنیم. که در نتیجه به همان ابعاد میرسیم. در شکل زیر نمونه این کار قابل مشاهده است. البته در شکل اول آخرین لایه باید یک soft max با ۴ خروجی باشد.

شبکه پیاده سازی شده با fully connected
شبکه پیاده سازی شده با fully connected
شبکه پیاده سازی شده با لایه کانولوشن
شبکه پیاده سازی شده با لایه کانولوشن

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

اما ایده مقاله OverFeat به این صورت است که اگر ما یک شبکه کانولوشنی داشته باشیم که بطور مثال روی ابعاد ۱۴*۱۴ آموزش دیده است و خروجی ۱*۱ به ما میدهد را روی یک تصویر ۱۶*۱۶ اعمال کنیم خروجی آن به صورت ۲*۲ خواهد بود و این مثل اینست که ما یک پنجره ۱۴*۱۴ را روی تصویر ۱۶*۱۶ لغزانده باشیم و به ازاء هر پنجره خروجی را بدست آورده باشیم. بنابراین با این شیوه به جای لغزاندن پنجره روی تصویر با یکبار گذراندن تصویر از شبکه می توانیم خروجی را به ازاء پنجره های مختلف تصویر بدست بیاوریم.

ایده اعمال شبکه کانولوشنی آموزش دیده روی تصاویر کوچکتر روی تصاویر بزرگتر
ایده اعمال شبکه کانولوشنی آموزش دیده روی تصاویر کوچکتر روی تصاویر بزرگتر

ایده استفاده از Anchor box

برای توضیح ایده دوم ابتدا در مورد برچسب داده های آموزش یک مقدار توضیح میدهیم. فرض کنید ما یک تصویر داریم که آن را به تعداد خانه کوچکتر مثلا ۱۹*۱۹ خانه تقسیم کرده ایم. در خروجی مدل به ازاء هر خانه کوچک یک بردار شامل احتمال وجود شی در آن خانه و مختصات نقطه گوشه سمت چپ بالای تصویر و طول و عرض آن که مجموعا ۵ عدد می شود و به اندازه k+1 درایه دیگر برای k کلاس از شیاء و یکی هم برای زمینه که به صورت یک داغ نشان می دهد شی مورد نظر مربوط به کدام دسته است. پس در مجموع برای هر کدام از ۱۹*۱۹ خانه یک بردار ۵+(k+1) بعدی خواهیم داشت.اگر یک شی در چند خانه قرار بگیرد فقط درایه اول در خانه ای ۱ خواهد بود که مرکز تصویر در آن قرار دارد.

نمونه بردار خروجی به ازاء هر کدام از خانه های یک تصویر برای سه کلاس از اشیاء
نمونه بردار خروجی به ازاء هر کدام از خانه های یک تصویر برای سه کلاس از اشیاء

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

نمونه ای قرار گرفتن مرکز دو شی متفاوت در یک خانه از تصویر
نمونه ای قرار گرفتن مرکز دو شی متفاوت در یک خانه از تصویر

برای حل این مشکل ایده ارائه شده به این صورت است که می توانیم از تعدادی anchor box استفاده کنیم که هر کدام از آنها مرکزشان در مرکز خانه قرار می گیرد و یک مقیاس و نسبت ابعاد متفاوتی دارند و به ازاء هرکدام از این anchor box ها در بردار بالا شبیه آن را به ادامه بردار اضافه کنیم. در مقاله Faster R-CNN از ۹ Anchor box متفاوت استفاده شده است.

نمونه ای از anchor box ها
نمونه ای از anchor box ها

بنابراین اگر بطور مثال دو anchor box داشته باشیم به ازاء هر خانه از تصویر برداری شبیه شکل زیر خواهیم داشت.

نمونه ای از بردار خروجی برای دو anchor box
نمونه ای از بردار خروجی برای دو anchor box

برای آموزش شبکه RPN به ازاء هر Anchor box در هر خانه از تصاویر آموزشی عدد صفر یا یک اختصاص می دهیم. عدد ۱ را در حالت به یک anchor box اختصاص می دهیم:‌۱) در صورتی که anchor box مورد نظر بیشترین IoU را با محدوده واقعی آن شی داشته باشد. ۲) درصورتی که anchor box مورد نظر دارای IoU بالاتر از ۰.۷ با محدوده واقعی شی داشته باشد.

برای محاسبه IoU نیز از رابطه زیر استفاده می شود:


تابع خطا(loss) مورد استفاده نیز به صورت زیر است:

تابع خطا (loss) برای آموزش شبکه RPN
تابع خطا (loss) برای آموزش شبکه RPN

بخش اول این تابع مربوط به خطای کلاس بندی و بخش دوم مربوط به خطای ناحیه تشخیص داده شده است.

چون از این شبکه برای بخش fast R-CNN هم می خواهیم استفاده کنیم دو روش برای اشتراک گذاری وجود دارد. روش اول اینست که اول برای RPN آموزش داده شود و سپس برای fast R-CNN و این کار تکرار شود که در مقاله مذکرو همین روش مورد استفاده قرار گرفته است. روش دیگر هم اینست که همزمان با هم با خطای هر دو ماژول این ضرایب اصلاح شوند.

مقایسه عملکرد این سه روش در (اینجا) به صورت زیر است:

مقایسه روشهای R-CNN و Fast R-CNN و Faster R-CNN
مقایسه روشهای R-CNN و Fast R-CNN و Faster R-CNN

روش YOLO

این مقاله که در سال ۲۰۱۶ توسط Joseph Redmon ارائه شده است تحت عنوان you only look once تلاش دارد که مدلی یکپارچه و در لحظه(real time) برای مساله کشف اشیاء ارائه کند. مدل هایی که تا به حال مطرح شده بودند یک دسته بند را روی بخش های مختلف تصویر که در واقع همان نواحی پیشنهادی هستند اعمال می کنند و در مورد وجود شی در آن ناحیه تصمیم می گیرند. اما هدف در این مقاله اینست که شما فقط یکبار به تصویر نگاه کنید و اشیاء را تشخیص دهید.
در این سیستم یک شبکه کانولوشنی همزمان جایگاه و نوع اشیاء را همانطور که در شکل زیر قابل مشاهده است تشخیص می دهد.

مدل تشخیص اشیاء YOLO
مدل تشخیص اشیاء YOLO

اولین امتیاز این مدل سرعت بالای آن است که بدلیل وجود مسیر یکپارچه تشخیص در ان است به نحوی که مدل پایه آن ۴۵ فریم در ثانیه را می تواند پردازش کند و مدلسریع آن تا ۱۵۰ فریم در ثانیه را می تواند تشخیص دهد. از سوی دیگر میانگین دقت این مدل نسبت به مدل های در لحظه دیگر تقریبا دو برابر است.
اتفاقی که در این مدل می افتد اینست که تصویر به تعداد پنجره تقسیم می شود و برای هر پنجره همزمان احتمال وجود شی در anchor box های آن پنجره و احتمال مربوط به نوع شی محاسبه می شود و از ترکیب این دو نتیجه کلی حاصل می شود.

کشف پنجره ها و احتمال وجود اشیاء در هر پنجره در مدل YOLO
کشف پنجره ها و احتمال وجود اشیاء در هر پنجره در مدل YOLO

بنابراین اگر تصویر به S*S پنجره تقسیم شود به ازاء هر پنجره مطابق برداری که برای نمونه Anchor box در مدل قبل ارائه شد یک بردار B*5+C خواهیم داشت که B تعداد anchor box ها یا bounding box ها و C تعداد کلاس ها است. عدد ۵ هم شامل احتمال حضور شی و مختصات مرکز و طول و عرض محدوده شی است.

در این مقاله برای ۲ نوع انکرباکس و ۲۰ کلاس آزمایش انجام شده و تعداد پنجره ها هم ۷ در ۷ است بنابراین خروجی مدل به صورت ۷در۷در۳۰ خواهد بود.

ساختار شبکه کانولوشنی مورد استفاده از شبکه GoogLeNet الهام گرفته شده است که ساختار آن در شکل زیر آمده است.

ساختار شبکه کانولوشنی مورد استفاده در مدل YOLO
ساختار شبکه کانولوشنی مورد استفاده در مدل YOLO

از آنجا که برای یک شی ممکنست حاشیه های متفاوتی تشخیص داده شود برای انتخاب یکی از آنها به عنوان نتیجه نهایی از روش Non-max suppression استفاده می شود که در ادامه به توضیح آن می پردازیم.

روش NMS: Non-max suppression

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

الگوریتم به این صورت است:

ابتدا ناحیه ای که بیشترین احتمال حضور اشیاء را دارد انتخاب و به لیست فیلتر شده ها اضافه می کنیم.

در مرحله بعد هر ناحیه ای که IoU بیشتر از حد آستانه با این ناحیه منتخب را داشته باشد را حذف می کنیم.

دوباره این دو مرحله را تکرار می کنیم تا ناحیه دیگری باقی نماند.

نمونه ای از کد مربوط به پیاده سازی این روش را می توانید(اینجا) ببینید.

الگوریتم روش Non-max suppression
الگوریتم روش Non-max suppression

نمونه عملکرد این روش به صورت زیر خواهد بود:

نتیجه عملکرد روش Non-max suppression
نتیجه عملکرد روش Non-max suppression

البته این روش می تواند یک اشکالی داشته باشد زمانی که چند شی در موقعیت های مشابهی قرار داشته باشند. مثلا در شکل زیر دو موقعیت با احتمال اطمینان حضور ۰.۸ ممکنست کاملا حذف شوند.

که یک ایده برای رفع این مشکل اینست که به جای حذف کامل این نواحی میزان اطمینان حضور شی در آنها را به IoU تقلیل دهیم که به این روش soft Non-max suppression گفته می شود. که در این صورت شکل بالا به صورت زیر در می آید.

مقایسه این دو الگوریتم به صورت زیر خواهد بود:

الگوریتم NMS و soft-NMS
الگوریتم NMS و soft-NMS

یک مقایسه عملکردی بین روش YOLO و Fast R-CNN در خود مقاله انجام شده که به صورت زیر است:

لیست مقاله های مورد استفاده در این نوشتار به شرح ذیل است:

  • R. Girshick, J. Donahue, T. Darrell, and J. Malik. Rich feature hierarchies for accurate object detection and semantic segmentation. In CVPR, 2014.
  • R. Girshick, “Fast R-CNN,” in IEEE International Conference on Computer Vision (ICCV), 2015.
  • S. Ren, K. He, R. Girshick, and J. Sun. Faster r-cnn: Towards real-time object detection with region proposal networks.
  • P. Sermanet, D. Eigen, X. Zhang, M. Mathieu, R. Fergus, and Y. LeCun. Overfeat: Integrated recognition, localization and detection using convolutional networks.
  • Redmon, J., Divvala, S., Girshick, R., & Farhadi, A. (2016). You only look once: Unified, real-time object detection. In Proceedings of the IEEE conference on computer vision and pattern recognition