利用Hog特征和SVM分类器进行行人检测

之前介绍过);而本文的目的在于介绍利用Hog特征和SVM分类器来进行行人检测。

重新训练行人检测的流程:

(1)准备训练样本集合;包括正样本集和负样本集;根据机器学习的基础知识我们知道,要利用机器学习算法进行样本训练,从而得到一个性能优良的分类器,训练样本应该是无限多的,而且训练样本应该覆盖实际应用过程中可能发生的各种情况。(很多朋友,用

(2)收集到足够的训练样本之后,你需要手动裁剪样本。例如,你想用Hog+SVM来对商业步行街的监控画面中进行行人检测,那么,你就应该用收集到的训练样本集合,手动裁剪画面中的行人(可以写个简单程序,只需要鼠标框选一下,就将框选区域保存下来)。

(3)裁剪得到训练样本之后,将所有正样本放在一个文件夹中;将所有负样本放在另一个文件夹中;并将所有训练样本缩放到同样的尺寸大小。

(4)提取所有正样本的Hog特征;

(5)提取所有负样本的Hog特征;

(6)对所有正负样本赋予样本标签;例如,所有正样本标记为

(7)将正负样本的

(8)SVM训练之后,将结果保存为文本文件。

(9)线性

下面给出样本训练的参考代码:

class Mysvm: public CvSVM{public:int get_alpha_count(){return this->sv_total;}

int get_sv_dim(){return this->var_all;}

int get_sv_count(){return this->decision_func->sv_count;}

double* get_alpha(){return this->decision_func->alpha;}

float** get_sv(){return this->sv;}

float get_rho(){return this->decision_func->rho;}};

void Train(){char classifierSavePath[256] = "c:/pedestrianDetect-peopleFlow.txt";

string positivePath = "E:\\pictures\\train1\\pos\\";string negativePath = "E:\\pictures\\train1\\neg\\";

int positiveSampleCount = 4900;int negativeSampleCount = 6192;int totalSampleCount = positiveSampleCount + negativeSampleCount;

cout<<"//////////////////////////////////////////////////////////////////"<<endl;cout<<"totalSampleCount: "<<totalSampleCount<<endl;cout<<"positiveSampleCount: "<<positiveSampleCount<<endl;cout<<"negativeSampleCount: "<<negativeSampleCount<<endl;

CvMat *sampleFeaturesMat = cvCreateMat(totalSampleCount , 1764, CV_32FC1);//64*128的训练样本,该矩阵将是totalSample*3780,64*64的训练样本,该矩阵将是totalSample*1764cvSetZero(sampleFeaturesMat); CvMat *sampleLabelMat = cvCreateMat(totalSampleCount, 1, CV_32FC1);//样本标识 cvSetZero(sampleLabelMat);

cout<<"************************************************************"<<endl;cout<<"start to training positive samples…"<<endl;

char positiveImgName[256];string path;for(int i=0; i<positiveSampleCount; i++) { memset(positiveImgName, ‘\0’, 256*sizeof(char));sprintf(positiveImgName, "%d.jpg", i);int len = strlen(positiveImgName);string tempStr = positiveImgName;path = positivePath + tempStr;

cv::Mat img = cv::imread(path);if( img.data == NULL ){cout<<"positive image sample load error: "<<i<<" "<<path<<endl;system("pause");continue;}

cv::HOGDescriptor hog(cv::Size(64,64), cv::Size(16,16), cv::Size(8,8), cv::Size(8,8), 9);vector<float> featureVec;

hog.compute(img, featureVec, cv::Size(8,8)); int featureVecSize = featureVec.size();

for (int j=0; j<featureVecSize; j++) { CV_MAT_ELEM( *sampleFeaturesMat, float, i, j ) = featureVec[j]; } sampleLabelMat->data.fl[i] = 1;}cout<<"end of training for positive samples…"<<endl;

cout<<"*********************************************************"<<endl;cout<<"start to train negative samples…"<<endl;

char negativeImgName[256];for (int i=0; i<negativeSampleCount; i++){ memset(negativeImgName, ‘\0’, 256*sizeof(char));sprintf(negativeImgName, "%d.jpg", i);path = negativePath + negativeImgName;cv::Mat img = cv::imread(path);if(img.data == NULL){cout<<"negative image sample load error: "<<path<<endl;continue;}

cv::HOGDescriptor hog(cv::Size(64,64), cv::Size(16,16), cv::Size(8,8), cv::Size(8,8), 9);vector<float> featureVec;

hog.compute(img,featureVec,cv::Size(8,8));//计算HOG特征int featureVecSize = featureVec.size();

鱼儿爱美,不仅需要鳞甲之美。还需要浮沉活泼之美。

利用Hog特征和SVM分类器进行行人检测

相关文章:

你感兴趣的文章:

标签云: