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

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

کلاس های مرجع در الگوریتم K نزدیک ترین همسایه :

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

#include <opencv2/ml.hpp>

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

دیاگرام knn یادگیری ماشین در Opencv

نوع داده های عمومی :

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

enum  	Types {
  BRUTE_FORCE =1,
  KDTREE =2
}

در این کد که نوع داده را تعریف کرده است، BRUTE_FORCE یا همان حرکت فراگیر با عدد یک مقدار دهی شده است. البته به این معنا نیز می توان معنی کرد که همه احتمالات جایز نیست.

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

توابع عضو عمومی :

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

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

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

virtual float cv::ml::KNearest::findNearest	(	InputArray 	samples,
int 	k,
OutputArray 	results,
OutputArray 	neighborResponses = noArray(),
OutputArray 	dist = noArray() 
)		const

همانطور که در کد بالا مشاهده می کنید، این تابع همسایه های نزدیک را پیدا کرده و پاسخی برای ورودی پیش بینی می کند. پارامترهای ارائه شده در این تابع به صورت زیر هستند:

Samples : همان نمونه های ورودی هستند که به صورت ردیفی مرتب شده اند. این پارامتر یک ماتریس شناور به سایز <number_of_samples> * k  است.

k : تعداد همسایه های نزدیک مورد استفاده را مشخص می کند. دقت داشته باشید که مقدار این پارامتر باید عدد یک باشد.

Results : برداری است که نمایش دهنده پیشبینی های خروجی است. این بردار می تواند از نوع رگراسیون یا کلاس بندی شده باشد. برداری با <number_of_samples>   که عناصر شناور با دقت واحد را مشخص می کند.

neighborResponses : این پارامتر مقادیر خروجی انتخاببی را برای همسایه های مرتبط نشان می دهد. ماتریسی شناور با دقت واحد که اندازه آن   number_of_samples> * k است.

dist : فاصله های خروجی انتخابی است که از بردارهای ورودی همسایه های مرتبط به دست آمده است. ماتریسی شناور با دقت واحد که اندازه آن   number_of_samples> * k است.

دقت داشته باشید که برای هر بردار ورودی (ردیفی از ماتریس های نمونه)، این کد می تواند نزدیکترین همسایه های عنصر K را پیدا کند. در مورد رگراسیون نیز می توان گفت که نتیجه پیشبینی مقداری میانگین از پاسخ های بردار همسایگی ایجاد شده است.

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

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

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

همانطور که مشاهده می کنید متغیرهای توابع عمومی می توانند از نوع virtual int ، virtual bool ، virtual void  فراخوانی شوند. توضیحات این کدها در ادامه هر کدام آورده شده است. کد دستوری این توابع عمومی به صورت زیر تعریف می شوند:

virtual int cv::ml::KNearest::getAlgorithmType ( ) const

 نوع الگوریتم را مشخص می کند.

virtual int cv::ml::KNearest::getDefaultK ( ) const

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

virtual int cv::ml::KNearest::getEmax ( ) const

پارامترهای درخت تصمیم گیری را فراخوانی می کند.

virtual bool cv::ml::KNearest::getIsClassifier ( ) const

اگر مدل مورد نظر ما کلاس بندی یا رگرسیون باشد، این کد روی داده های آموزشی عمل می کند.

static Ptr<KNearest> cv::ml::KNearest::load ( const String & filepath )

یک فایل را بارگیری می کند و یک k نزدیک ترین همسایه مرتب شده را ایجاد می کند.

از KNearest::save برای مرتب کردن k نزدیک ترین همسایه و ذخیره کردن آن استفاده کنید. برای بارگیری مجدد آن، آدرس فایل ذخیره شده را در تابع load قرار دهید.

virtual void cv::ml::KNearest::setAlgorithmType	( int  val )
virtual void cv::ml::KNearest::setDefaultK ( int val )
virtual void cv::ml::KNearest::setEmax ( int val )
virtual void cv::ml::KNearest::setIsClassifier ( bool val )

توابع عضو عمومی ایستا در الگوریتم k نزدیک ترین همسایه :

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

static Ptr< KNearest > 	create ()

این دستور یک مدل خالی را ایجاد می کند.

static Ptr< KNearest > 	load (const String &filepath)

این دستور نزدیکترین عناصر K موجود در یک فایل را ایجاد و به صورت متوالی دسته بندی می کند.

لازم است بدانید که توابع عضو ایستا در این الگوریتم از cv::ml::StatModel و cv::Algorithm ارث می برند.

کد زیر در cv::ml::StatModel مدل ها را ایجاد کرده و با پارمترهای پیش فرض مقداردهی می کند:

template<typename _Tp >
static Ptr< _Tp > 	train (const Ptr< TrainData > &data, int flags=0)

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

نمودار ارث بری knn در opencv

هم چنین در کد های زیر می توانید وضعیت cv::Algorithm را بررسی کنید:

template<typename _Tp >
static Ptr< _Tp > load (const String &filename, const String &objname=String())

کد بالا الگوریتم را از فایل فراخوانی می کند

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

template<typename _Tp >
static Ptr< _Tp > loadFromString (const String &strModel, const String &objname=String())

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

template<typename _Tp >
static Ptr< _Tp > read (const FileNode &fn)

سایر عناصری که از cv::Algorithm ارث می برند:

void writeFormat (FileStorage &fs) const

توابع عضو حفاظت شده با کد دستوری بالا از cv::Algorithm ارث می برند.

همانطور که در این جلسه مشاهده کردید، کدهای  OpenCV در  C++ نوشته شده است. به طور کلی می توان گفت بنیاد اصلی این کتابخانه به زبان سی پلاس پلاس است. البته رابط های برنامه نویسی جامعی هم در جاوا، متلب، پایتون، اوکتاو دارد.

آAPI های این زبان ها را هم می توان در اسناد آنلاین این کتابخانه پیدا کرد. از طرفی OpenCV روی سیستم عامل های متنوعی از جمله ویندوز، آی او اس، اندروید، فری پی اس دی، ماامو، لینوکس، بلک بری، او اس ده، اوپن سی وی دی اجرا می شود که می توانید نسخه رسمی آن را از GitHub یا سورج فورج دریافت کنید.

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

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

درباره‌ی سارا شعبانی

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

آیا می خواهید در زمینه یادگیری ماشین استخدام شوید؟

آیا می خواهید در زمینه یادگیری ماشین استخدام شوید؟

مسیر های شغلی زیادی در حوزه یادگیری ماشین وجود دارد، اما از کجا بفهمیم که …

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

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