我正在使用OpenCV 3及其SVM实现。我想将它用于汽车分类。
我读取每个图像,将其标签添加到矢量,将图像添加到另一个图像,并将其传递给我的函数。
image =imread("/home/mehrzad/workspace/dataSets/OwnCollection/vehicles/MiddleClose/image0066.png",1);
cv::cvtColor(image, src, CV_BGR2GRAY);
src.convertTo(src_f, CV_32F, 1.0/255, 0);
image_classes.push_back("van");
images.push_back(src_f);
image =imread
("/home/mehrzad/workspace/dataSets/OwnCollection/vehicles/MiddleClose/image0085.png",1);
cv::cvtColor(image, src, CV_BGR2GRAY);
src.convertTo(src_f, CV_32F, 1.0/255, 0);
image_classes.push_back("car");
images.push_back(src_f);
我添加了“汽车”和“面包车”图像。
void trainSVM2(vector<string> &image_classes , vector<Mat> &images)
{
vector<string> classes_names;
// finding classes
{
set<string> classes_names2;
for (vector<string>::iterator it = image_classes.begin(); it != image_classes.end(); ++it)
classes_names2.insert((*it));
for (set<string>::iterator it = classes_names2.begin(); it != classes_names2.end(); ++it)
classes_names.push_back((*it));
classes_names2.clear();
// for(int i=0;i<classes_names.size() ; i++)
// cout << classes_names[i]<< endl;
}
////////////////////////////////////
for (int i=0;i<classes_names.size();i++)
{
string class_ =classes_names[i] ;
cout <<"--------------" << class_<<"-------------" << endl;
Mat& one_class = (*(images.begin()));
Mat labels(0,1,CV_32SC1);
Mat training_mat(0,one_class.rows*one_class.cols,CV_32FC1);
vector<Mat>::iterator it2 = images.begin();
for (vector<string>::iterator it1 = image_classes.begin();
it1 != image_classes.end(); ++it1,++it2)
{
string not_class_ = (*it1);
training_mat.push_back((*it2).reshape(1,1));
if(not_class_.compare(class_)==0)
labels.push_back(1);
else
labels.push_back(2);
}
Ptr<cv::ml::SVM> classifier = cv::ml::SVM::create();
Ptr<cv::ml::TrainData> train_Data = cv::ml::TrainData::create
(training_mat,cv::ml::ROW_SAMPLE,labels);
classifier->train(train_Data);
string toSave=class_+"_toSave.yml";
classifier->save(toSave);
}
在训练汽车时,我将汽车的标签1添加到标签矢量,将2添加为非汽车图像......在此功能终止后,我将有一个名为class_cars.yml的文件,并且在预测中我加载了SVM它
void predict()
{
Ptr<cv::ml::SVM> classifier = cv::ml::SVM::create();
classifier=StatModel::load<cv::ml::SVM>("car_toSave.yml");
Mat forPredict =imread
// ("/home/mehrzad/workspace/dataSets/OwnCollection/vehicles/MiddleClose/image0066.png",1);
("/home/mehrzad/samples/car.png",1);
cv::cvtColor(forPredict, forPredict, CV_BGR2GRAY);
forPredict.convertTo(forPredict, CV_32F, 1.0/255, 0);
Mat result;
classifier->predict(forPredict.reshape(1,1),result);
waitKey(0);
cout << "---------------------------\nresult is :" <<result;
}
通过向训练数据添加新图像,预测变化的结果以及每个图像在1和2之间的变化,会发生什么。为什么? 训练或预测中哪些不正确?