自己训练SVM分类器进行HOG行人检测


自己训练SVM分类器进行HOG行人检测. 环境为VS2010 + OpenCV2.4.4. 使用时请自行修改工程的include目录和lib目录配置。 正样本来源是INRIA数据集中的96*160大小的人体图片,使用时上下左右都去掉16个像素,截取中间的64*128大小的人体。 负样本是从不包含人体的图片中随机裁取的,大小同样是64*128。 SVM使用的是OpenCV自带的CvSVM类。
资源截图
代码片段和文件信息
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;
using namespace cv;

#define PosSamNO 2400    //正样本个数
#define NegSamNO 12000    //负样本个数

#define TRAIN false    //是否进行训练true表示重新训练,false表示读取xml文件中的SVM模型
#define CENTRAL_CROP true   //true:训练时,对96*160的INRIA正样本图片剪裁出中间的64*128大小人体

//HardExample:负样本个数。如果HardExampleNO大于0,表示处理完初始负样本集后,继续处理HardExample负样本集。
//不使用HardExample时必须设置为0,因为特征向量矩阵和特征类别矩阵的维数初始化时用到这个值
#define HardExampleNO 4435  


//继承自CvSVM的类,因为生成setSVMDetector()中用到的检测子参数时,需要用到训练好的SVM的decision_func参数,
//但通过查看CvSVM源码可知decision_func参数是protected类型变量,无法直接访问到,只能继承之后通过函数访问
class MySVM : public CvSVM
{
public:
//获得SVM的决策函数中的alpha数组
double * get_alpha_vector()
{
return this->decision_func->alpha;
}

//获得SVM的决策函数中的rho参数即偏移量
float get_rho()
{
return this->decision_func->rho;
}
};



int main()
{
//检测窗口(64128)块尺寸(1616)块步长(88)cell尺寸(88)直方图bin个数9
HOGDescriptor hog(Size(64128)Size(1616)Size(88)Size(88)9);//HOG检测器,用来计算HOG描述子的
int DescriptorDim;//HOG描述子的维数,由图片大小、检测窗口大小、块大小、细胞单元中直方图bin个数决定
MySVM svm;//SVM分类器

//若TRAIN为true,重新训练分类器
if(TRAIN)
{
string ImgName;//图片名(绝对路径)
ifstream finPos(“INRIAPerson96X160PosList.txt“);//正样本图片的文件名列表
//ifstream finPos(“PersonFromVOC2012List.txt“);//正样本图片的文件名列表
ifstream finNeg(“NoPersonFromINRIAList.txt“);//负样本图片的文件名列表

Mat sampleFeatureMat;//所有训练样本的特征向量组成的矩阵,行数等于所有样本的个数,列数等于HOG描述子维数
Mat sampleLabelMat;//训练样本的类别向量,行数等于所有样本的个数,列数等于1;1表示有人,-1表示无人


//依次读取正样本图片,生成HOG描述子
for(int num=0; num {
cout<<“处理:“< //ImgName = “D:\DataSet\PersonFromVOC2012\“ + ImgName;//加上正样本的路径名
ImgName = “D:\DataSet\INRIAPerson\INRIAPerson\96X160H96\Train\pos\“ + ImgName;//加上正样本的路径名
Mat src = imread(ImgName);//读取图片
if(CENTRAL_CROP)
src = src(Rect(161664128));//将96*160的INRIA正样本图片剪裁为64*128,即剪去上下左右各16个像素
//resize(srcsrcSize(64128));

vector descriptors;//HOG描述子向量
hog.compute(srcdescriptorsSize(88));//计算HOG描述子,检测窗口移动步长(88)
//cout<<“描述子维数:“<riptors.size()<
//处理第一个样本时初始化特征向量矩阵和类别矩阵,因为只有知道了特征向量的维数才能初始化特征向量矩阵
if( 0 == num )
{
DescriptorDim = descriptors.size();//HOG描述子的维数
//初始化所有训练样本的特征向量组成的矩阵,行数等于所有样本的个数,列数等于HOG描述子维数sampleFeatureMat
sampleFeatureMat = Mat::zeros(PosSamNO+NegSamNO+HardExampleNO DescriptorDim CV_32FC1);
//初始化训练样本的类别向量,行数等于所有样本的个数,列数等于1;1表示有人,0表示无人
sampleLabelMat = Mat::zeros(PosSamNO+NegSamNO+HardExampleNO 1 CV_32FC1);
}

//将计算好的HOG描述子复制到样本特征矩阵sampleFeatureMat
for(int i=0; iriptorDim; i++)
sampleFeatureMat.at(numi) = descriptors[i];//第num个样本的特征向量中的第i个元素
sampleLabelMat.at(num0) = 1;//正样本类别为1,有人
}

//依次读取负样本图片,生成HOG描述子
f

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     144896  2013-11-13 17:14  SVM_Train_Predict_HOGDebugSVM_Train_Predict_HOG.exe

     文件     910680  2013-11-13 17:14  SVM_Train_Predict_HOGDebugSVM_Train_Predict_HOG.ilk

     文件    1747968  2013-11-13 17:14  SVM_Train_Predict_HOGDebugSVM_Train_Predict_HOG.pdb

     文件     174277  2013-10-22 16:53  SVM_Train_Predict_HOGSVM_Train_Predict_HOG0000.jpg

     文件     788547  2013-10-21 21:44  SVM_Train_Predict_HOGSVM_Train_Predict_HOG1.png

     文件     813015  2013-10-21 21:47  SVM_Train_Predict_HOGSVM_Train_Predict_HOG2.png

     文件      90689  2007-01-10 01:37  SVM_Train_Predict_HOGSVM_Train_Predict_HOG2007_000423.jpg

     文件     818604  2013-10-21 21:48  SVM_Train_Predict_HOGSVM_Train_Predict_HOG3.png

     文件    1610478  2013-10-21 21:48  SVM_Train_Predict_HOGSVM_Train_Predict_HOG4.png

     文件     911894  2013-10-21 21:49  SVM_Train_Predict_HOGSVM_Train_Predict_HOG5.png

     文件        762  2013-11-13 17:14  SVM_Train_Predict_HOGSVM_Train_Predict_HOGDebugcl.command.1.tlog

     文件      14186  2013-11-13 17:14  SVM_Train_Predict_HOGSVM_Train_Predict_HOGDebugCL.read.1.tlog

     文件        470  2013-11-13 17:14  SVM_Train_Predict_HOGSVM_Train_Predict_HOGDebugCL.write.1.tlog

     文件          2  2013-11-13 17:14  SVM_Train_Predict_HOGSVM_Train_Predict_HOGDebuglink-cvtres.read.1.tlog

     文件          2  2013-11-13 17:14  SVM_Train_Predict_HOGSVM_Train_Predict_HOGDebuglink-cvtres.write.1.tlog

     文件          2  2013-11-13 17:14  SVM_Train_Predict_HOGSVM_Train_Predict_HOGDebuglink.10128-cvtres.read.1.tlog

     文件          2  2013-11-13 17:14  SVM_Train_Predict_HOGSVM_Train_Predict_HOGDebuglink.10128-cvtres.write.1.tlog

     文件          2  2013-11-13 17:14  SVM_Train_Predict_HOGSVM_Train_Predict_HOGDebuglink.10128.read.1.tlog

     文件          2  2013-11-13 17:14  SVM_Train_Predict_HOGSVM_Train_Predict_HOGDebuglink.10128.write.1.tlog

     文件          2  2013-11-13 17:14  SVM_Train_Predict_HOGSVM_Train_Predict_HOGDebuglink.10220-cvtres.read.1.tlog

     文件          2  2013-11-13 17:14  SVM_Train_Predict_HOGSVM_Train_Predict_HOGDebuglink.10220-cvtres.write.1.tlog

     文件          2  2013-11-13 17:14  SVM_Train_Predict_HOGSVM_Train_Predict_HOGDebuglink.10220.read.1.tlog

     文件          2  2013-11-13 17:14  SVM_Train_Predict_HOGSVM_Train_Predict_HOGDebuglink.10220.write.1.tlog

     文件          2  2013-11-13 17:14  SVM_Train_Predict_HOGSVM_Train_Predict_HOGDebuglink.10948-cvtres.read.1.tlog

     文件          2  2013-11-13 17:14  SVM_Train_Predict_HOGSVM_Train_Predict_HOGDebuglink.10948-cvtres.write.1.tlog

     文件          2  2013-11-13 17:14  SVM_Train_Predict_HOGSVM_Train_Predict_HOGDebuglink.10948.read.1.tlog

     文件          2  2013-11-13 17:14  SVM_Train_Predict_HOGSVM_Train_Predict_HOGDebuglink.10948.write.1.tlog

     文件          2  2013-11-13 17:14  SVM_Train_Predict_HOGSVM_Train_Predict_HOGDebuglink.11976-cvtres.read.1.tlog

     文件          2  2013-11-13 17:14  SVM_Train_Predict_HOGSVM_Train_Predict_HOGDebuglink.11976-cvtres.write.1.tlog

     文件          2  2013-11-13 17:14  SVM_Train_Predict_HOGSVM_Train_Predict_HOGDebuglink.11976.read.1.tlog

............此处省略96个文件信息

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)