بلاگ

مقدمه قدم به قدم بر الگوریتم های پایه تشخیص اشیا - بخش اول

مقدمه قدم به قدم بر الگوریتم های پایه تشخیص اشیا - بخش اول

A Step-by-Step Introduction to the Basic Object Detection Algorithms (Part 1)

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

 

همچنین ببینید: نحوه کارکرد Object Detection (‌تشخیص اشیا)‌ از پایه در پایتون

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

 

این قدرت الگوریتم های تشخیص اشیا است و آن هم یک مثل ساده از شناسایی اشیا بود, تشخیص اشیا کاربرد های گوناگونی در صنایع مختلف دارد از نظارت شبانه روزی تا پیدا وسایل  به صورت لحظه ای در شهر های هوشمند. به صورت خلاصه اینها قدرت الگوریتم های یادگیری عمیق است!

 

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

ما با الگوریتم های خانواده RCNN به عنوان مثال خود RCNN,  Fast RCNN و  Faster RCNN شروع میکنم. در سری بعدی این مقاله درباره الگوریتم های پیشرفته YOLO , SSD صحبت خواهیم کرد.

 

جدول محتوایی

  1. یک راه ساده برای حل مسائل زمینه تشخیص اشیا با کمک یادگیری عمیق
  2.  فهمیدن شبکه های Region-Based Convolutional Neural Network 
    1. درک RCNN
    2. مشکلات RCNN
  3. فهمیدن Fast RCNN
    1. درک RCNN
    2. مشکلات Fast RCNN
  4. فهمیدن Faster RCNN
    1. درک Faster RCNN
    2. مشکلات Faster RCNN
  5. خلاصه ای از الگوریتم هایی که پوشش دادیم

 

۱. یک راه ساده برای حل مسائل زمینه تشخیص اشیا با کمک یادگیری عمیق

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

یک راه ساده برای حل مسائل زمینه تشخیص اشیا با کمک یادگیری عمیق

بیایید با ساده ترین رویکرد یادگیری عمیق شروع کنیم و از پرکاربرد ترینش برای تشخیص اشیا در تصویر که Convolutional Neural Networks or CNN است.

 به طور خلاصه وار داخل یک شبکه CNN بدین شکل است. نگاهی به تصویر زیر بیندازید:

نحوه کارکرد شبکه CNN

تصویر رو به شبکه میدیم و از لایه های مختلف convolution و pooling رد می شود در نهایت یک خروجی به شکل کلاس شی رو می گیریم. نسبتا سر راست اینطور نیست؟

 

برای هر تصویر ورودی ما احتمال اینکه مربوط به کدام کلاس است را دریافت میکنیم. آیا میتونیم از تکنیک هایی که در بخش تشخیص اشیا صحبت کردیم استفاده کنیم و  اشیای مختلف درون تصویر را تشخیص دهیم؟ بله بیایید نگاهی به اینکه چطوری میتوان یک مسئله تشخیص اشیا را با کمک یک CNN  حل کرد بیندازیم.

 

۱. ما یک تصویر را به عنوان ورودی میگیرم:

ما یک تصویر را به عنوان ورودی میگیرم

۲. سپس تصویر را به بخش های مختلف تقسیم میکنیم:

ما یک تصویر را به عنوان ورودی میگیرم

۳. سپس هر بخش تصویر را به عنوان یک تصویر جداگانه در نظر میگیرم

۴. هر کدام از این بخش ها (‌تصاویر)‌را به شبکه CNN میدیم تا معلوم شود عضو کدام دسته هستند.

۵. پس از تقسیم هر منطقه به کلاس مربوط می توانیم تمام این مناطق را برای گرفتن تصویر اصلی با اشیا ترکیب کنیم. ( مشخص کنیم هر بخش دارای چه اشیایی است)

ما یک تصویر را به عنوان ورودی میگیرم

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

 

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

 

فهمیدن شبکه های Region-Based Convolutional Neural Network

 

۱. درکی از RCNN 

به جای کار کردن روی تعداد زیادی از این بخش ها الگوریتم  RCNN یک دسته از بخش ( جعبه - box)  توی تصویر را پیشنهاد میدهد که این بخش ها حاوی اشیا هستند. RCNN از روش جستجوی انتخابی استفاده برای استخراج  این جعبه ها استفاده میکند ( به این جعبه ها بخش هم گفته میشود).

 

بیایید ابتدا بفهمیم جستجوی انتخابی چیست و چطوری بخش های مختلف را شناسایی میکند. در اصل چهار بخش برای یک شی وجود دارند. مقیاس ها و اندازه های مختلف, رنگ ,  بافت و محفظه (enclosure). جستجوی انتخابی این الگوها را در تصویر مشخص میکند و بر اساس ان مناطقی را پیشنهاد میدهد در اینجا به صورت مختصر از نحوه کار کرد جستجوی انتخابی آورده شده است:

 

1. ابتدا یک تصویر را به عنوان ورودی میگیرد (‌RCNN)

ما یک تصویر را به عنوان ورودی میگیرم

2. سپس زیر بخش های اولیه را ایجاد میکند به طوری که از این تصویر چند بخش داریم:

3.سپس از این تکنیک برای  ساخت بخش های بزرگتر با ترکیب تشابه رنگ و شباهت بافت و اندازه استفاده میکند.

 

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

در زیر به صورت خلاصه وار از مرحله انجام شده با RCNN برای تشخیص اشیاست:

 

۱. ابتدا یک شبکه از قبل آموزش داده شده CNN رو میگیرم

۲. سپس مدل رو مجدد آموزش میدیم و لایه آخر شبکه را بر اساس تعداد کلاس های جدید تغییر میدهیم

۳.  قدم سوم بدست اوردن بخش های هر تصویر است و بعد از آن تغییر سایز و متناسب سازی سایز با اندازه ورودی های CNN است.

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

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

 

مراحل بالا را برای فهمیدن بیشتر با کمک نمونه ای مصور میکنیم. (‌تصاویر برگرفته از این مقاله می باشد)

 

ابتدا یک تصویر را به عنوان ورودی میگیرم:

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

همه این بخش ها رو تغییر اندازه میدهیم تا متناسب با ورودی CNN باشند و هر بخش را به ConvNet میدهیم.

شبکه CNN ویژگی ها را از هر بخش تصویر در می آورد و  SVM ها برای تقسیم بندی این بخش ها به دسته های مختلف استفاده میشود.

در نهایت یک رگرسیون باکس محدود کننده برای پیش بینی محدوده هر شی استفاده میشود

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

 

۲. مشکلات RCNN

 

تا الان دیدم که چطوری میتوان با کمک RCNN برای تشخیص اشیا استفاده کرد اما این روش محدودیت های خاص خود را نیز دارد. این روش با توجه موارد زیر از نظر  محاسباتی پر هزینه و آهسته است:

 

  • استخراج ۲۰۰ بخش از هر تصویر با توجه به جستجوی انتخابی
  • استخراج ویژگی با CNN برای هر بخش تصویر که میشود تعداد تصاویر ضرب در ناحیه ها که اینجا میشود N * 2000 
  • کل فرایند توسط سه مدل انجام میشود
    • شبکه CNN  برای استخراج ویژگی
    • کلاسیفایر خطی SVM برای شناسایی اشیا
    • مدل رگرسیون برای مشخص سازی محدوده باکس ها

تمام این فرایند ها باعث میشود که RCNN خیلی کند شود. برای هر تصویر جدید این فرایند ۴۰-۵۰ ثانیه طول میکشد که برای مجموعه داده های بزرگ (‌دیتاست) این امر فرایند رو دشوار و عملا غیر ممکن میکند (‌ممکن است سالها طول بکشد).

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

 

فهمیدن Fast RCNN

۱. درک Faster RCNN

چه چیز کار میتوان انجام داد تا سرعت الگوریتم RCNN را افزایش بدیم؟ به جای ۲۰۰ بار اجرای شبکه  CNN به ازای هر عکس میتونیم فقط یک بار اجراش کنیم و همه بخش های دارای اشیا رو بگیریم. ( تا همین الان در بخش مهم الگوریتم کلی سریع تر میشم)

Ross Girshick نویسنده الگوریتم RCNN  متوجه این ایده شد که می توان به جای شبکه عصبی روی ۲۰۰۰ بخش تصویر روی یک بار اجرا کرد و کل تصویر به صورت یکجا بدیم به شبکه عصبیمون (این کاری هست  که توی Faster RCNN   انجام می دهیم). با این کار شبکه CNN برای ما convolutional feature maps را تولید میکند با استفاده از این maps میتونیم بخش هایی پیشنهادی رو استخراج کنیم و وقتی با کمک یک  لایه  Rol pooling تمام بخش های پیشنهادی رو به سایز مشخصی تبدیل کنیم که با این کار میتونیم در نهایت بدیم به یک شبکه عصبی fully connected.

 

بیایید برای ساده تر شدن موضوع به بخش های کوچکتری تقسیم کنیم:

۱. مثل دو روش قبل ( روش پایه و RCNN) ما از یک تصویر به عنوان ورودی استفاده می کنیم

۲. این تصویر رو به یک شبکه CNN  میدهیم تا بخش های دارای اشیا را مشخص کند.

۳. یک لایه  Rol pooling روی این بخش ها اعمال می کنیم  تا به سایز مشخصی در بیاید و آماده ارسال به یک شبکه fully connected  ( تمام متصل) شوند.

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

 

تا الان به جای استفاده ۲۰۰۰ بخش از یک تصویر استفاده کردیم و به جای SVM مستقیما از خود شبکه CNN و خروجی اون رو مستقیما دسته بندی کردیم و در نهایت با کمک یک مدل رگرسیون محدوده اونها رو مشخص میکنم.

 

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

 

 

ابتدا یک تصویرمون رو به عنوان قدم اول میدیم به عنوان ورودی در نظرش میگیرم:

این تصویر به شبکه CNN ارسال میشود  که بخش های جذاب ( که احتمالا در آن اشیا وجود دارد) مشخص میکند:

حالا لایه Rol pooling اعمال میکنیم روی خروجی بخش های ی که از مرحله قبل داریم تا مطمئن شیم که همه بخش ها یک سایز رو دارند.

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

این نحوه حل مشکلات اصلی RCNN است که به عنوان مثال به جا ارسال ۲۰۰۰ بخش از تصویر به شبکه CNN و به جای استفاده استفاده از سه مدل متفاوت برای استخراج ویژگی و دسته بندی و ساخت باکس محدود کننده از یک مدل استفاده میکنیم.

 

۲. مشکلات Fast RCNN

 

حتی Faster RCNN دارای مشکلات خاص خود است. هنوز هم از جستجوی انتخابی به عنوان یک روش پیشنهادی برای یافتن مناطق مورد علاقه استفاده میکند که هنوز کند و وقت گیر است. به نسبت RCNN پیشرفت قابل توجه ای کرده به طوری که تشخیص اشیا حدود ۲ ثانیه طول میکشد. اما هنوز برای یک دیتاست خیلی بزرگ سرعت کافی رو ندارد با اینکه سریع تر از RCNN است.

 

یک الگوریتم بهتر از Fast‌ RCNN  وجود دارد که حتی بهتر از اینهاست.

 

فهمیدن Faster RCNN

۱.درک Faster RCNN

روش Faster RCNN نسخه بهبود یافته Fast RCNN است و تفاوت اصلی اون با نسخه اصلی این است که Fast RCNN از روش جستجوی انتخابی برای ایجاد بخش های مورد علاقه استفاده می کند در حالی که Faster RCNN از Region Proposal Network یا به صورت مختصر RPN استفاده میکند که image feature maps یا ویژگی هایی که در مرحله پیدا کردن ویژگی ما فهمیدم را به عنوان ورودی میگیرد و از مجموعه از پیشنهادات که شامل اشیای پیشنهادی همراه با امتیاز - نمره را  تولید میکند.

مراحل زیر فرایند معمول در رویکرد Faster RCNN هست:

۱. مثل دفعات قبلی ابتدا ابتدا تصویر رو به  ConvNet میفرستیم تا feature map را برای ما برگرداند.

۲. خروجی شبکه قبلی رو میدیم به Region proposal network  که اشیایی پیشنهادی را همراه با امتیازشان بر میگرداند.

۳. یک لایه  RoI pooling روی خروجی مرحله قبل اجرا میشود تا همه به سایز یکسان در بیایند.

۴. در نهایت که عکس های هم سایز را  به یک شبکه عصبی تمام متصل که در نهایت با کمک یک لایه softmax  تصاویر را دسته بندی میکنیم.

اجازه بدید به صورت کوتاه نحوه کارکرد Region Proposal Network  یا به صورت خلاصه  RPN را توضیح دهم.

برای شروع feature maps را در مرحله قبل با کمک CNN  تونستیم پیدا کنیم حالا به یک شبکه  Region Proposal Network میدهیم. RPN از یک  sliding window روی همه ویژگی ها  اعمال می کند که هر پنجره باکس هایی با تعداد k Anchor در سایز و شکل های مختلفی ایجاد می کند.

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

برای هر RPN دو چیز را پیش بینی میکند:

  • اولی اینجا احتمال اینکه یک لنگر یک شی باشد یا نه
  • دوم اینکه جعبه محدود کننده برای بهبود اینکه لنگر ها بتونند بهتر اشیا را پیدا کنند

حالا ما جعبه های محدود کننده با سایز ها و اشکال مختلفی داریم که به لایه RoI pooling ارسال میشوند.

 

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

حالا میتونیم هر پیشنهاد را بگیریم و آن را کراپ کنیم تا پیشنهاد های ما حاوی یک شی باشند این کاری که در واقع لایه Rol Polling  انجام میده. در واقع ازهر لنگر فیچر مپ با سایز ثابت استخراج میکند:

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

 

مشکل Faster RCNN

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

 

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

۲. با توجه به توالی سیستم ها عملکرد هر مرحله وابستگی زیادی به مرحله قبلی دارد

 

خلاصه ای از الگوریتم هایی که پوشش دادیم

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

الگوریتمویژگی هاسرعت اجرا به ازای هر عکسمحدودیت ها
CNNتقسیم تصویر به چند بخش و دسته بندی هر بخش به صورت جداگانهنیاز به بخش های زیادی برای ارائه دقت بهتر و کندی بیش از حد
RCNNاستفاده از جستجوی انتخابی برای ساخت بخش ها, استخراج ۲۰۰۰ بخش از هر عکس۴۰-۵۰ ثانیهنیازمند پردازش زیاد وقتی که هر بخش به صورت جداگانه به CNN داده میشود واز مدل های مختلف برای پیش بینی استفاده میکند.
Fast RCNNهر تصویر فقط یک بار به شبکه CNN. همه اون سه مدل مورد استفاده در RCNN را با هم ترکیب میکند ارسال میشود و فیچر مپ استخراج میشود. جستجوی انتخابی برای برای این مپ ها استفاده میشود تا پیش بینی را انجام دهد۲ ثانیهجستجوی انتخابی هنوز هم کند و از لحاظ سخت افزاری هزینه تر است.
Faster RCNNبا جایگزینی شبکه پیشنهاد دهنده بخش با جستجوی انتخابی میتوان الگوریتم را سریع تر کرد.۰٫۲ ثایهپیشنهاد شی زمان بر هست و سیستم های مختلف یکی پس از دیگری کار میکنند ( به صورت توالی) که این باعث میشود کارایی کلی سیستم وابسته به توالی بین لایه ها داشته باشد.

دیدن نسخه فارسی و انگلیسی به صورت markdown در gits

سخن پایان:

Object detection یک بخش جذاب برای کار کردن است که در زمینه تجاری و تحقیقاتی کاربرد دارد.

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

این مقاله آغازگر تجربه از کوتاه از کار با تشخیص اشیاست. اگر دوست دارید در این زمینه بیشتر بدانید نگاهی به جدول زیر بیندازید.

منبع اصلی