یادگیری ماشین در OpenCV : جلسه پنجم

در ادامه آموزش های یادگیری ماشین در OpenCV، به بحث ماشین های بردار پشتیبان (Support Vector Machine ) می پردازیم. SVM  یکی از روش ها و الگوریتم های بسیار متداول در حوزه دسته بندی داده است که این دسته بندی معمولا به صورت خطی است.

به طور کلی می توان گفت که الگوریتم ماشین بردار پشتیبان در ابتدا برای ساخت کلاس بندی های باینری ایجاد شد. سپس به عنوان الگوریتمی برای مسائل خوشه بندی و رگراسیون گسترش پیدا کرد. SVM  یک الگوریتم جزئی برای روش های براساس کرنل (هسته) است که ویژگی های برداری را به فضاهای با ابعاد بالاتر نگاشت می کند و این عمل با استفاده از عملکرد کرنل  و ساخت یک تابع بهینه خطی دراین فضا یا فضایی جند بعدی که متناسب با داده های آموزشی است، صورت می گیرد.

لازم به ذکر است که در الگوریتم های ماشین بردار پشتیبان، کرنل به صراحت تعریف نشده است. در عوض فضای مابین دو نقطه در فضاهای جند بعدی نیاز به تعریف کرنل دارد. راه حل های ایجاد شده توسط این الگوریتم بهینه هستند. بردارهای ویژگی که به ابر صفحه نزدیک تر هستند، بردارهای پشتیبان ( Support Vector ) نامیده می شوند به این معنا که موقعیت بردارها بر عملکرد تصمیم گیری تاثیری نخواهد داشت.

پیکربندی الگوریتم ماشین های بردار پشتیبان در OpenCV نیز براساس اصول طبقه بندی داده ها قرار گرفته است. نمودار وراثت برای cv::ml::svm به صورت زیر است:

الگوریتم svm در Opencv

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

enum  	KernelTypes {
  CUSTOM =-1,
  LINEAR =0,
  POLY =1,
  RBF =2,
  SIGMOID =3,
  CHI2 =4,
  INTER =5
}

کرنل های الگوریتم ماشین های بردار پشتیبان :

در شکل دو بعدی زیر کرنل های مختلف برای چهار کلاس باهم مقایسه شده اند. هر چهار کلاس SVM::C_SVC  با استفاده از auto_train آموزش داده شده اند (برای هر کلاس). ارزیابی ها بر روی سه کرنل مختلف ( SVM::CHI2 , SVM::INTER , SVM::RBF ) انجام گرفته است. رنگ ها، کلاس های با امتیاز ماکزیمم را ترسیم می کنند. رنگ های درخشان به معنای امتیاز ماکزیمم بالاتر از صفر و رنگ های تیره به معنای امتیازات ماکزیمم کمتر از صفر هستند.

مقایسه انواع SVM در Opencv
پارامتر ها
CUSTOM در صورتی که کرنل سفارشی تنظیم شده باشد، توسط SVM::getKernelType برگشت داده می شود
LINEARکرنل خطی. نگاشتی انجام نمی شود، جداسازی یا رگرسیون در فضای ویژگی های اصلی انجام می شود. سریع ترین حالت است. K(xi,xj)=xTixj
POLY کرنل چند جمله ای : K(xi,xj)=(γxTixj+coef0)degree,γ>0
RBF تابع پایه شعاعی ، در بیشتر موارد گزینه خوبی است. K(xi,xj)=e−γ||xi−xj||2,γ>0
SIGMOIDکرنل سیگموئید : (K(xi,xj)=tanh(γxTixj+coef0
CHI2 کرنل Chi2 نمایی ، مشابه کرنل RBF است : K(xi,xj)=e−γχ۲(xi,xj)۲(xi,xj)=(xi−xj)2/(xi+xj),γ>0
INTER کرنل تقاطع هیستوگرام. یک کرنل سریع است. K(xi,xj)=min(xi,xj)

نمودار وراثت برای cv::ml::statmodel  به صورت زیر است:

نمودار وراثت Statmodel

توابع عضوعمومی در الگوریتم ماشین های بردار پشتیبان به صورت زیر تعریف می شوند:

virtual double 	getC () const =0
 
virtual cv::Mat 	getClassWeights () const =0
 
virtual double 	getCoef0 () const =0
 
virtual double 	getDecisionFunction (int i, OutputArray alpha, OutputArray svidx) const =0
 	نتیجه تابع تصمیم را برمی گرداند
 
virtual double 	getDegree () const =0
 
virtual double 	getGamma () const =0
 
virtual int 	getKernelType () const =0
 
virtual double 	getNu () const =0
 
virtual double 	getP () const =0
 
virtual Mat 	getSupportVectors () const =0
 	تمام بردار های پشتیبان را برمی گرداند
 
virtual cv::TermCriteria 	getTermCriteria () const =0
 
virtual int 	getType () const =0
 
Mat 	getUncompressedSupportVectors () const
 	تمام بردار های پشتیبان فشرده نشده در svm خطی را برمی گرداند
 
virtual void 	setC (double val)=0
 
virtual void 	setClassWeights (const cv::Mat &val)=0
 
virtual void 	setCoef0 (double val)=0
 
virtual void 	setCustomKernel (const Ptr< Kernel > &_kernel)=0
 
virtual void 	setDegree (double val)=0
 
virtual void 	setGamma (double val)=0
 
virtual void 	setKernel (int kernelType)=0
 
virtual void 	setNu (double val)=0
 
virtual void 	setP (double val)=0
 
virtual void 	setTermCriteria (const cv::TermCriteria &val)=0
 
virtual void 	setType (int val)=0
 
virtual bool 	trainAuto (const Ptr< TrainData > &data, int kFold=10, ParamGrid Cgrid=getDefaultGrid(C), ParamGrid gammaGrid=getDefaultGrid(GAMMA), ParamGrid pGrid=getDefaultGrid(P), ParamGrid nuGrid=getDefaultGrid(NU), ParamGrid coeffGrid=getDefaultGrid(COEF), ParamGrid degreeGrid=getDefaultGrid(DEGREE), bool balanced=false)=0
 	با پارمترهای بهینه شده، یک الگوریتم ماشین های بردار پشتیبان را مورد آموزش قرار می دهد.
 
bool 	trainAuto (InputArray samples, int layout, InputArray responses, int kFold=10, Ptr< ParamGrid > Cgrid=SVM::getDefaultGridPtr(SVM::C), Ptr< ParamGrid > gammaGrid=SVM::getDefaultGridPtr(SVM::GAMMA), Ptr< ParamGrid > pGrid=SVM::getDefaultGridPtr(SVM::P), Ptr< ParamGrid > nuGrid=SVM::getDefaultGridPtr(SVM::NU), Ptr< ParamGrid > coeffGrid=SVM::getDefaultGridPtr(SVM::COEF), Ptr< ParamGrid > degreeGrid=SVM::getDefaultGridPtr(SVM::DEGREE), bool balanced=false)
 	با پارمترهای بهینه شده، یک الگوریتم ماشین های بردار پشتیبان را مورد آموزش قرار می دهد

در این الگوریتم، توابع عضو عمومی استاتیک به این صورت تعریف می شوند:

static Ptr< SVM > 	create ()
 
static ParamGrid 	getDefaultGrid (int param_id)
 	یک گرید برای پارامترهای الگوریتم تعیین می کند
 
static Ptr< ParamGrid > 	getDefaultGridPtr (int param_id)
 	یک گرید برای پارامترهای الگوریتم تعیین می کند
 
static Ptr< SVM > 	load (const String &filepath)
 	یک سری از الگوریتم های ماشین های بردار پشتیبان را از فایل استخراج و ایجاد می کند 

کد نمایش دهنده پیشبینی برای الگوریتم ماشین های بردار پشتیبان:

برای این حالت باید از کد StatModel::predict(samples, results, flags) استفاده کنیم. در مسائل رگراسیون نیز برای به دست آوردن پاسخ های اولیه از الگوریتم ماشین های بردار پشتیبان باید از flags=StatModel::RAW_OUTPUT استفاده شود.

بیشتر بخوانید : 

0/5 (0 نظر)

درباره‌ی احمدرضا جعفری

همچنین ببینید

20 کاربرد یادگیری عمیق

۲۰ کاربرد برتر یادگیری عمیق ۲۰۲۰ در صنایع مختلف

چند سال پیش هرگز تصور نمی کردیم که برنامه های یادگیری عمیق برای ما خودرو …

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *