#include#include #include #include using namespace std; int main() { CvSVM SVM; CvMat trainData; CvMat labels; CvTermCriteria criteria = cvTermCriteria(CV_TERMCRIT_EPS,100,0.001); //eğitim için term kriterimiz. int array_labels[5]= {1,1,1,-1,-1}; //5 eğitim verisinin bildiğimiz etiketleri.(labels, responses). //ilk 3 veri 1 sınıfına, diğer iki veri ise -1 sınıfına ait. //eğitim verilerini diziye doldurdum. Gerçek uygulamalarda filedan okuma veya hesaplama şeklinde olur. //kodu basit tutmak için bu şekilde gösterdim. #pragma region data //5 egitim verisi olsun herbiri 40 tane feature içersin. float array_trainData[5][40] = { 1,0.443137,0.333333,0.392157,0.0313725, 0.270588,0.870588,0.964706,1,0.439216, 0.337255,0.380392,0.0235294,0.266667,0.862745, 0.964706,1,0.431373,0.337255,0.368627, 0.0156863, 0.262745, 0.854902, 0.964706, 1, 0.423529, 0.341176, 0.360784, 0.0156863, 0.258824, 0.847059, 0.964706, 1, 0.419608, 0.341176, 0.34902, 0.0117647, 0.254902, 0.839216, 0.968627, 0.572549,0.4,0.113725,0.0784314,0.137255, 0.160784,0.00784314,0.337255,0.580392,0.407843, 0.121569, 0.0745098, 0.133333, 0.156863, 0.00392157, 0.341176, 0.584314, 0.411765, 0.12549, 0.0666667 , 0.129412, 0.152941, 0, 0.34902, 0.592157, 0.419608, 0.129412, 0.0588235, 0.12549, 0.14902, 0.00392157, 0.352941, 0.596078, 0.423529, 0.137255, 0.054902, 0.121569, 0.145098, 0.00784314, 0.356863, 0.882353, 0.741176, 0.305882, 0.305882, 0.278431, 0.141176, 0.156863, 0.509804, 0.882353, 0.741176, 0.305882, 0.305882, 0.27451, 0.141176, 0.14902, 0.501961, 0.886275, 0.741176, 0.305882, 0.305882, 0.270588, 0.141176, 0.141176, 0.498039, 0.886275, 0.741176, 0.305882, 0.305882, 0.266667, 0.141176, 0.137255, 0.490196, 0.886275, 0.737255, 0.305882, 0.305882, 0.266667, 0.137255, 0.129412, 0.486275, 0.929412, 0.917647, 0.717647, 0.356863, 0.133333, 0.156863, 0.231373, 0.709804, 0.929412, 0.913725, 0.721569, 0.356863, 0.137255, 0.164706, 0.219608, 0.694118, 0.92549, 0.905882, 0.729412, 0.356863, 0.141176, 0.168627, 0.207843,0.67451, 0.917647, 0.901961, 0.733333, 0.360784, 0.141176, 0.172549, 0.196078, 0.658824, 0.909804, 0.894118, 0.737255, 0.360784, 0.141176, 0.180392,0.180392, 0.639216, 0.760784, 0.372549, 0.407843, 0.298039, 0.160784, 0.72549, 0.988235, 0.960784, 0.772549, 0.372549, 0.411765, 0.305882, 0.160784, 0.709804, 0.992157, 0.960784, 0.780392, 0.376471, 0.419608, 0.309804, 0.160784, 0.698039, 0.992157, 0.960784, 0.784314, 0.376471, 0.419608, 0.317647, 0.164706, 0.686275, 0.996078, 0.964706, 0.792157, 0.376471, 0.423529, 0.32549, 0.160784, 0.670588, 1, 0.964706 }; #pragma endregion data cvInitMatHeader(&trainData,5,40,CV_32FC1,array_trainData); //eğitim verimizi tutacak matris. cvInitMatHeader(&labels,1,5,CV_32SC1,array_labels); //etiketlerimizi tutacak matris. //classification olduğu için CV_32SC1 kullandık. SVM.train(&trainData,&labels,0,0,CvSVMParams(CvSVM::C_SVC,CvSVM::RBF,3,0.025,0,1,0.5,0.1,NULL, criteria)); //train fonksiyonumuz (libsvm ile kontrol etmek için libsvm ile //gelen svm-train.exe nin default parametreleri kullanıldı.) //Parametrelerin detaylı açıklaması için opencv docs. //SVM.save("test.volkan"); //eğittiğimiz modeli kaydedip daha sonra kullanabiliriz. for(int i = 0; i < 5; i++ ) { double r; CvMat sample; cvGetRow(&trainData, &sample, i ); r = SVM.predict( &sample ); //predict edip sonuçları kontrol edelim. } }
OpenCV altında SVM kullanmak. (OpenCV SVM Sample Code)
Bilindiği gibi OpenCV kütüphanesinin machine learning modülünde libsvm wraplenmiştir. Böylece biz OpenCV kullanıcıları harici bir kütüphane kullanmadan SVM(Support Vector Machines) i uygulamalarımızda kullanabiliriz. Aşağıda bu konuda bir örnek hazırlamaya çalıştım. Yorumlarda açıklamalar mevcuttur.
Kaydol:
Kayıt Yorumları (Atom)
1 yorum - yorum yaz:
merhaba hocam
evet dediğiniz gibi olcak. bu için libsvm kullanarak one_vs_rest C-SVM programı (C++) yazmak istiyorum yada opencv ile..
featureları girince bunu train ve test edecek iki fonksiyon olcak.bu konuda yeni olduğum için yardımlarınızı bekliyorum..
Yorum Gönder