در ادامه آموزش های یادگیری ماشین در OpenCV، به بحث ماشین های بردار پشتیبان (Support Vector Machine ) می پردازیم. SVM یکی از روش ها و الگوریتم های بسیار متداول در حوزه دسته بندی داده است که این دسته بندی معمولا به صورت خطی است.
به طور کلی می توان گفت که الگوریتم ماشین بردار پشتیبان در ابتدا برای ساخت کلاس بندی های باینری ایجاد شد. سپس به عنوان الگوریتمی برای مسائل خوشه بندی و رگراسیون گسترش پیدا کرد. SVM یک الگوریتم جزئی برای روش های براساس کرنل (هسته) است که ویژگی های برداری را به فضاهای با ابعاد بالاتر نگاشت می کند و این عمل با استفاده از عملکرد کرنل و ساخت یک تابع بهینه خطی دراین فضا یا فضایی جند بعدی که متناسب با داده های آموزشی است، صورت می گیرد.
لازم به ذکر است که در الگوریتم های ماشین بردار پشتیبان، کرنل به صراحت تعریف نشده است. در عوض فضای مابین دو نقطه در فضاهای جند بعدی نیاز به تعریف کرنل دارد. راه حل های ایجاد شده توسط این الگوریتم بهینه هستند. بردارهای ویژگی که به ابر صفحه نزدیک تر هستند، بردارهای پشتیبان ( Support Vector ) نامیده می شوند به این معنا که موقعیت بردارها بر عملکرد تصمیم گیری تاثیری نخواهد داشت.
پیکربندی الگوریتم ماشین های بردار پشتیبان در OpenCV نیز براساس اصول طبقه بندی داده ها قرار گرفته است. نمودار وراثت برای cv::ml::svm به صورت زیر است:
نوع داده های عمومی برای این الگوریتم به شکل زیر خواهند بود:
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 ) انجام گرفته است. رنگ ها، کلاس های با امتیاز ماکزیمم را ترسیم می کنند. رنگ های درخشان به معنای امتیاز ماکزیمم بالاتر از صفر و رنگ های تیره به معنای امتیازات ماکزیمم کمتر از صفر هستند.
پارامتر ها | |
---|---|
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 به صورت زیر است:
توابع عضوعمومی در الگوریتم ماشین های بردار پشتیبان به صورت زیر تعریف می شوند:
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 استفاده شود.