دانشجوی مقطع دکتری هوش مصنوعی در دانشگاه تهران
کشف اشیاء در تصویر R-CNN و Fast R-CNN و Faster R-CNN و YOLO
یکی از مسائل بینایی ماشین(computer vision) مساله کشف اشیاء(object detection) است. حل این مساله به معنی پیدا کردن اشیاء مختلف در یک تصویر و تعیین یک مرز برای آن شکل است. تصویر زیر نمونه ای از خروجی این مساله است.
ایده اولیه برای حل این مساله اینست که فرض کنیم یک شبکه عصبی کانولوشنی(CNN) داشته باشیم که برای دسته بندی تصاویر آموزش دیده است. حالا می توانیم یک پنجره کوچک را روی تصویر بلغزانیم هر بخش از تصویر را به شبکه مفروض بدهیم و ببینیم آیا یک شی در آن پنجره قرار دارد یا خیر؟ و اگر پاسخ مثبت است آن شی چیست؟ و از آنجا که اشیاء ممکنست به دلیل جلو و عقب بودن اندازه های مختلفی داشته باشند می توانیم با پنجره های با اندازه های مختلف همین کار را تکرار کنیم.
ایراد اصلی که بر ایده خام بالا وارد است هزینه بسیار بالای محاسباتی است.
روش R-CNN
ایده اصلی این روش که در سال ۲۰۱۴ توسط Ross Girshick و همکارانش در (اینجا) مطرح شد اینست که به جای اینکه تمام قسمت های تصویر را برای پیدا کردن اشیاء بگردیم ابتدا نواحی از تصویر که احتمال وجود یک شی در آن ها وجود دارد را پیدا کنیم و سپس همان ایده ساده بالا رو فقط روی آن نواحی پیاده کنیم.
این روش از سه ماژول تشکیل شده:
- ماژول تولید نواحی پیشنهادی مستقل از اشیاء
- یک شبکه عصبی بزرگ کانولوشنی که از هر ناحیه بردار ویژگیهایی با طول ثابت استخراج می کند
- تعدادی دسته بند ماشین بردار پشتیبان خطی(SVM) برای هر کلاس از اشیاء
برای تعیین نواحی پیشنهادی روشهای مختلفی ارائه شده است که در این مقاله از روش جستجوی انتخاب کننده(selective search) استفاده شده است که در (اینجا) مطرح شده است. طراحی این الگوریتم به نحویست که شامل این ملاحظات می شود: ۱) اشیاء ممکنست در هر مقیاسی وجود داشته باشند، بنابراین باید الگوریتم طوری طراحی شود که ناحیه مربوط به هر شی با هر مقیاسی را تشخیص بدهد. ۲) تمایز نواحی میتواند به دلایل مختلفی مثل تفاوت رنگ یا زمینه یا فاصله مکانی یا موارد دیگر باشد. بنابراین به جای اینکه فقط یکی از اینها در نظر گرفته شود، به نحوی از تمام این ها استفاده می شود. ۳) با توجه به کاربردهای این روش در کشف و تشخیص اشیاء نباید هزینه محاسباتی زیادی داشته باشد و نسبتا باید سریع باشد.
جستجوی انتخاب کننده یک روش حریصانه است و به این صورت عمل می کند که ابتدا به روشی که در (اینجا) آمده است یک تعدادی ناحیه اولیه را مشخص می کند و سپس بر اساس میزان شباهتی که هر ناحیه با نواحی مجاورش دارد، هر ناحیه را با شبیه ترین ناحیه مجاور آن ادغام می کندو این کار را تا آنجا که کل تصویر در یک ناحیه ادغام شود ادامه می دهد.
برای اندازه گیری میزان شباهت بین نواحی ۴ نوع شباهت اندازه گیری شده و از ترکیب خطی این ۴ نوع شباهت یک معیار شباهت کلی بین نواحی بدست آمده است. این معیارها مربوط به ترکیب رنگ و زمینه و اندازه و میزان فیت شدن دو ناحیه به همدیگر است.
بعد از تعیین نواحی پیشنهادی که حدود ۲۰۰۰ ناحیه است، هر ناحیه برای استخراج ویژگیها به شبکه ImageNet که توسط Alex Krizhevsky و همکارانش در (اینجا) مطرح شده بود، داده میشود. ساختار این شبکه به شکل زیر است که البته لایه آخر شبکه کار کلاس بندی را انجام میدهد در اینجا حذف می شود و بردار ۴۰۹۶تایی از ویژگیها بدست می آید.
با توجه به اینکه ابعاد تصویر ورودی به این شبکه باید مقدار ثابتی داشته باشد، در این مقاله از کشیدن تصویر و تغییر ابعاد برای اندازه کردن آن استفاده شده است که نمونه هایی از آن در شکل زیر قابل مشاهده است. ضمن اینکه می شود از اضافه کردن حاشیه نیز به جای کشیدن تصویر استفاده کرد.
نهایتا نیز از این بردار ویژگیهای با طول ثابت به عنوان ورودی به تعدادی ماشین بردار پشتیبان که برای دسته بندی هر نوع از اشیاء بهینه شده اند داده می شوند. البته به جای این کار می شود از یک لایه softmax استفاده کرد که در مقاله نشان داده شده است که روش بردار پشتیبان عملکرد مناسب تری دارد.
ایراداتی که برای این روش توسط نویسنده مقاله در مقاله بعد مطرح شده است عبارتند از: ۱) چند مرحله ای بودن فرآیند آموزش مدل. ۲) هزینه بالای آموزش مدل. ۳) کند بودن عملکرد مدل.
روش Fast R-CNN
این روش نیز توسط Ross Girshick یک سال بعد از روش بالا در (اینجا) مطرح شد. ایده کلی این روش در شکل زیر آمده است:
ورودی این معماری تصویر کامل و مجموعه ای از نواحی پیشنهادی(RoI: Region of Interest) است. ابتدا کل تصویر توسط یک شبکه عصبی کانولوشنی از پیش آموزش دیده مثل همان ImageNet که در مدل قبلی استفاده شده داده می شود تا یک conv feature map از کل تصویر بدست بیاید. در واقع مدل ImagNet تا قبل از لایه های fully connected آن مورد استفاده قرار می گیرد و آخرین لایه max pooling با لایه RoI pooling به ازاء هر ناحیه پیشنهادی جایگزین می شود تا یک بردار ویژگیهای با طول ثابت بدست آید.
لایه ROI Pooling
لایه RoI pooling از max pooling برای تبدیل ویژگی های داخل هر ناحیه به یک شکل دو بعدی با ابعاد ثابت استفاده می کند. این لایه هر ناحیه پیشنهادی را به تعدادی پنجره با ابعاد ثابت تقسیم می کند و در هر پنجره ماکسیمم مقدار ویژگیها را انتخاب می کند. نمونه ای از این عملیات برای تبدیل به پنجره ۲در۲ به صورت شکل زیر است:
اگر ابعاد ناحیه پیشنهادی h*w باشد و ابعاد نهایی مورد نیاز H*W باشد ابعاد تقریبی پنجره ها h/H*w/W خواهد بود.
بعد از این لایه هم دو لایه fully connected در کنار هم یکی برای دسته بندی اشیاء به همراه softmax و دیگری برای محل قرار گیری شیء به عنوان boundary box regressor استفاده می شود.
روش Faster R-CNN
این روش توسط Shaoqing Ren در سال ۲۰۱۶ در (اینجا) مطرح شد. معماری کلی این مدل به صورت شکل زیر است.
این مدل از دو ماژول تشکیل شده است. ماژول اول یک شبکه عصبی عمیق کانولوشنی که نواحی پیشنهادی را مشخص(RPN: Region Proposal Network) می کند و ماژول دوم همان Fast R-CNN است که از نواحی پیشنهادی بدست آمده استفاده می کند.
در اینجا دو ایده مورد استفاده قرار گرفته است. ایده اول برای حرکت دادن پنجره روی کل تصویر برای پیدا کردن نواحی پیشنهادی و ایده دوم برای پیدا کردن چند شی که دارای مرکز یکسانی در یک خانه هستند.
ایده اول برگرفته از مقاله OverFeat است. برای توضیح این ایده ابتدا به نحوه پیاده سازی لایه fully connected با استفاده از لایه کانولوشن میپردازیم.
پیاده سازی لایه fully connected با استفاده از کانولوشن و ایده اعمال این شبکه روی تصاویر بزرگتر
در صورتی که بخواهیم یک تنسور n*n*c را که از کانولوشن لایه های قبلی بدست آمده به یک لایه fully connected بدهیم که دارای k پرسپترون است می توانیم از k فیلتر n*n استفاده کنیم. که در نتیجه به همان ابعاد میرسیم. در شکل زیر نمونه این کار قابل مشاهده است. البته در شکل اول آخرین لایه باید یک soft max با ۴ خروجی باشد.
بنابراین به این طریق می توانیم کل شبکه را به صورت کانولوشنی پیاده سازی کنیم و در نتیجه بسیاری از محاسبات را به اشتراک گذاشته و عملکرد شبکه را برای اجرا رو GPU بهینه کنیم.
اما ایده مقاله OverFeat به این صورت است که اگر ما یک شبکه کانولوشنی داشته باشیم که بطور مثال روی ابعاد ۱۴*۱۴ آموزش دیده است و خروجی ۱*۱ به ما میدهد را روی یک تصویر ۱۶*۱۶ اعمال کنیم خروجی آن به صورت ۲*۲ خواهد بود و این مثل اینست که ما یک پنجره ۱۴*۱۴ را روی تصویر ۱۶*۱۶ لغزانده باشیم و به ازاء هر پنجره خروجی را بدست آورده باشیم. بنابراین با این شیوه به جای لغزاندن پنجره روی تصویر با یکبار گذراندن تصویر از شبکه می توانیم خروجی را به ازاء پنجره های مختلف تصویر بدست بیاوریم.
ایده استفاده از Anchor box
برای توضیح ایده دوم ابتدا در مورد برچسب داده های آموزش یک مقدار توضیح میدهیم. فرض کنید ما یک تصویر داریم که آن را به تعداد خانه کوچکتر مثلا ۱۹*۱۹ خانه تقسیم کرده ایم. در خروجی مدل به ازاء هر خانه کوچک یک بردار شامل احتمال وجود شی در آن خانه و مختصات نقطه گوشه سمت چپ بالای تصویر و طول و عرض آن که مجموعا ۵ عدد می شود و به اندازه k+1 درایه دیگر برای k کلاس از شیاء و یکی هم برای زمینه که به صورت یک داغ نشان می دهد شی مورد نظر مربوط به کدام دسته است. پس در مجموع برای هر کدام از ۱۹*۱۹ خانه یک بردار ۵+(k+1) بعدی خواهیم داشت.اگر یک شی در چند خانه قرار بگیرد فقط درایه اول در خانه ای ۱ خواهد بود که مرکز تصویر در آن قرار دارد.
مشکلی می تواند پیش بیاید اینست که مرکز دو شی در یکی از این خانه ها واقع شود مانند شکل زیر.
برای حل این مشکل ایده ارائه شده به این صورت است که می توانیم از تعدادی anchor box استفاده کنیم که هر کدام از آنها مرکزشان در مرکز خانه قرار می گیرد و یک مقیاس و نسبت ابعاد متفاوتی دارند و به ازاء هرکدام از این anchor box ها در بردار بالا شبیه آن را به ادامه بردار اضافه کنیم. در مقاله Faster R-CNN از ۹ Anchor box متفاوت استفاده شده است.
بنابراین اگر بطور مثال دو anchor box داشته باشیم به ازاء هر خانه از تصویر برداری شبیه شکل زیر خواهیم داشت.
برای آموزش شبکه RPN به ازاء هر Anchor box در هر خانه از تصاویر آموزشی عدد صفر یا یک اختصاص می دهیم. عدد ۱ را در حالت به یک anchor box اختصاص می دهیم:۱) در صورتی که anchor box مورد نظر بیشترین IoU را با محدوده واقعی آن شی داشته باشد. ۲) درصورتی که anchor box مورد نظر دارای IoU بالاتر از ۰.۷ با محدوده واقعی شی داشته باشد.
برای محاسبه IoU نیز از رابطه زیر استفاده می شود:
تابع خطا(loss) مورد استفاده نیز به صورت زیر است:
بخش اول این تابع مربوط به خطای کلاس بندی و بخش دوم مربوط به خطای ناحیه تشخیص داده شده است.
چون از این شبکه برای بخش fast R-CNN هم می خواهیم استفاده کنیم دو روش برای اشتراک گذاری وجود دارد. روش اول اینست که اول برای RPN آموزش داده شود و سپس برای fast R-CNN و این کار تکرار شود که در مقاله مذکرو همین روش مورد استفاده قرار گرفته است. روش دیگر هم اینست که همزمان با هم با خطای هر دو ماژول این ضرایب اصلاح شوند.
مقایسه عملکرد این سه روش در (اینجا) به صورت زیر است:
روش YOLO
این مقاله که در سال ۲۰۱۶ توسط Joseph Redmon ارائه شده است تحت عنوان you only look once تلاش دارد که مدلی یکپارچه و در لحظه(real time) برای مساله کشف اشیاء ارائه کند. مدل هایی که تا به حال مطرح شده بودند یک دسته بند را روی بخش های مختلف تصویر که در واقع همان نواحی پیشنهادی هستند اعمال می کنند و در مورد وجود شی در آن ناحیه تصمیم می گیرند. اما هدف در این مقاله اینست که شما فقط یکبار به تصویر نگاه کنید و اشیاء را تشخیص دهید.
در این سیستم یک شبکه کانولوشنی همزمان جایگاه و نوع اشیاء را همانطور که در شکل زیر قابل مشاهده است تشخیص می دهد.
اولین امتیاز این مدل سرعت بالای آن است که بدلیل وجود مسیر یکپارچه تشخیص در ان است به نحوی که مدل پایه آن ۴۵ فریم در ثانیه را می تواند پردازش کند و مدلسریع آن تا ۱۵۰ فریم در ثانیه را می تواند تشخیص دهد. از سوی دیگر میانگین دقت این مدل نسبت به مدل های در لحظه دیگر تقریبا دو برابر است.
اتفاقی که در این مدل می افتد اینست که تصویر به تعداد پنجره تقسیم می شود و برای هر پنجره همزمان احتمال وجود شی در anchor box های آن پنجره و احتمال مربوط به نوع شی محاسبه می شود و از ترکیب این دو نتیجه کلی حاصل می شود.
بنابراین اگر تصویر به S*S پنجره تقسیم شود به ازاء هر پنجره مطابق برداری که برای نمونه Anchor box در مدل قبل ارائه شد یک بردار B*5+C خواهیم داشت که B تعداد anchor box ها یا bounding box ها و C تعداد کلاس ها است. عدد ۵ هم شامل احتمال حضور شی و مختصات مرکز و طول و عرض محدوده شی است.
در این مقاله برای ۲ نوع انکرباکس و ۲۰ کلاس آزمایش انجام شده و تعداد پنجره ها هم ۷ در ۷ است بنابراین خروجی مدل به صورت ۷در۷در۳۰ خواهد بود.
ساختار شبکه کانولوشنی مورد استفاده از شبکه GoogLeNet الهام گرفته شده است که ساختار آن در شکل زیر آمده است.
از آنجا که برای یک شی ممکنست حاشیه های متفاوتی تشخیص داده شود برای انتخاب یکی از آنها به عنوان نتیجه نهایی از روش Non-max suppression استفاده می شود که در ادامه به توضیح آن می پردازیم.
روش NMS: Non-max suppression
ورودی این روش تعدادی مرز بسته و احتمال وجود اشیاء متناظ با آنها و یک حد آستانه برای میزان همپوشانی و خروجی لیستی از نواحی فیلتر شده است.
الگوریتم به این صورت است:
ابتدا ناحیه ای که بیشترین احتمال حضور اشیاء را دارد انتخاب و به لیست فیلتر شده ها اضافه می کنیم.
در مرحله بعد هر ناحیه ای که IoU بیشتر از حد آستانه با این ناحیه منتخب را داشته باشد را حذف می کنیم.
دوباره این دو مرحله را تکرار می کنیم تا ناحیه دیگری باقی نماند.
نمونه ای از کد مربوط به پیاده سازی این روش را می توانید(اینجا) ببینید.
نمونه عملکرد این روش به صورت زیر خواهد بود:
البته این روش می تواند یک اشکالی داشته باشد زمانی که چند شی در موقعیت های مشابهی قرار داشته باشند. مثلا در شکل زیر دو موقعیت با احتمال اطمینان حضور ۰.۸ ممکنست کاملا حذف شوند.
که یک ایده برای رفع این مشکل اینست که به جای حذف کامل این نواحی میزان اطمینان حضور شی در آنها را به IoU تقلیل دهیم که به این روش soft Non-max suppression گفته می شود. که در این صورت شکل بالا به صورت زیر در می آید.
مقایسه این دو الگوریتم به صورت زیر خواهد بود:
یک مقایسه عملکردی بین روش 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
مطلبی دیگر از این انتشارات
توضیح LDA و پیاده سازی آن با استفاده از Scikit learn
مطلبی دیگر از این انتشارات
Unsupervised learning vs Self-supervised learning
مطلبی دیگر از این انتشارات
دستهبندی(classification) و خوشهبندی(clustering)؛ مفاهیم و تفاوتها