=++++++++++++++++++++++提取 HOG 特征+++++++++++++++++++++++++=

//样本矩阵,nImgNum:横坐标是样本数量。 列数是该 样本对应的 特征维数。ex: 样本是学生,其样本特征可以由 身高,体重,年龄 组成,那么  第二个参数就是 3 啦。

CvMat *data_mat = cvCreateMat( nImgNum, 1764, CV_32FC1 );

1764 是如何计算出来的。

1. 先确定 你 要训练 以及 检测 的图片 的 大小  IplImage* trainImg=cvCreateImage(cvSize(64,64),8,3);

ok  这里是  64 x 64

2.  确定 HOGDescriptor *hog=new HOGDescriptor(cvSize(64,64),cvSize(16,16),cvSize(8,8),cvSize(8,8),9);

第一个 窗口 大小 设置 为 上面的图片大小 64 x 64 。

第二个 块大小 是 16 x 16 的话 [ 额  这个肿么确定?与前面的 窗口大小有关系 么? 这是opencv中默认的大小]

第三个 块block的步进 stride 8 x 8

第四个是 胞元cell大小 8 x 8

第五个是 cell的直方图的 bin = 9

梯度方向数 nbins

nBins表示在一个胞元(cell)中统计梯度的方向数目,例如nBins=9时,在一个胞元内统计9个方向的梯度直方图,每个方向为180/9=20度。

每个 cell 有 9 个向量

每个block 有 (16 / 8 ) * (16 / 8) = 2 * 2 = 4 个 cell, 那么现在就有 4 * 9 = 36 个向量啦

每个 窗口 有多少个 block 呢?

利用公式   (window_size - block_size)/block_stride + 1  对两个方向进行计算:

( 64 - 16) / 8 + 1 = 7

两个方向  7 * 7 = 49

so  共有  49* 36 = 1764

//类型矩阵,存储每个样本的类型标志 , 一维,只需要存储该样本属于哪一类即可(只有两类)
 CvMat *   res_mat = cvCreateMat( nImgNum, 1, CV_32FC1 );

HOGDescriptor *hog=new HOGDescriptor(cvSize(64,64),cvSize(16,16),cvSize(8,8),cvSize(8,8),9);

// 计算hog特征

// trainImg是读入的需要计算特征的图像,IplImage* trainImg=cvCreateImage(cvSize(64,64),8,3);

//descriptors 是结果数组   vector<float>  descriptors;   HOG特征的维数就是 =  descriptors.size 啦,上例中,就是 那个3 啦。

hog->compute(trainImg, descriptors,Size(1,1), Size(0,0));

//计算完成后,把hog特征存储到 上面声明的那个 样本 矩阵中

//   i   是当前处理的第  i  张 图片, n 从 0 开始 ++ ,从第 0 列 开始存储。 *iter  是 (vector<float>::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)

cvmSet(data_mat, i, n,*iter);

//  训练读入的图片是有  标签 的( 知道已知属于哪一类),  将标签存入  标签 矩阵 。i 是当前处理的 图片 的 编号。 img_catg[i] 是  读入 的已知的 数据。

cvmSet( res_mat, i, 0, img_catg[i] );

++++++++++++++++++++++++++++++++++开始训练+++++++++++++++++++++++++++

首先要/新建一个SVM

CvSVM svm = CvSVM();

// 开始训练~

svm.train( data_mat, res_mat, NULL, NULL, param );   //data_mat 是 上面提取 到的 HOG特征,存储 m 个样本的 n 个特征, res_mat 是标签矩阵,m个样本属于哪一类,已//  知的。   param 的定义如下:

CvSVMParams param  = CvSVMParams( CvSVM::C_SVC, CvSVM::RBF, 10.0, 0.09, 1.0, 10.0, 0.5, 1.0, NULL, criteria );

CvTermCriteria   criteria = cvTermCriteria( CV_TERMCRIT_EPS, 1000, FLT_EPSILON );

// 将训练结果保存在 xml文件中

svm.save( "SVM_DATA.xml" );

此阶段生成文件:

SVM_DATA.xml

训练完成之后,就开始 对 你所需要 的 数据 进行 预测。 这里预测  当前 图片 属于 那一类别。

++++++++++++++++++++++++++++++++++检测样本+++++++++++++++++++++++++++

读入当前要预测的图片 testImg

将testImg 缩放 至 与 训练图片 一样大小 ,直接存放到 trainImg中

计算读入的图片的Hog特征,

hog->compute(trainImg, descriptors,Size(1,1), Size(0,0)); //调用计算函数开始计算

仍用 vector<float> descriptors;  存放结果

创建一个  一行  n 列 的向量。  n 是 特征的个数 。 就是上面的 3 啊, descriptors.size() 啊。   用来存放  当前要预测的图片的 特征

CvMat* SVMtrainMat=cvCreateMat(1,descriptors.size(),CV_32FC1);

// 开始预测

int ret = svm.predict(SVMtrainMat);

ret 返回的是 当前 预测 的 图片 的  类别。 就是   一开始 读到  标签 矩阵 中的 数据。 一般 用 0 or 1  来标示 两大类别。

可将结果文件保存在:

SVM_PREDICT.txt

************************************************Hog详解********************************************************************

HOG基本概念

在构造函数中,有几个参数非常重要,分别为winSize(64,128),  blockSize(16,16),  blockStride(8,8), cellSize(8,8),  nbins(9)。在此,用几个示意图来表示。

a)       窗口大小winSize

b)      块大小blockSize

c)       胞元大小cellSize

d)       梯度方向数

nbins代表在一个胞元中统计梯度的方向数目。如:nbins=9表示一个胞元内统计9个方向的梯度直方图。


Hog特征维数的计算

首先给出一个hog

HOGDescriptor* hog = newHOGDescriptor(cvSize(64, 48), cvSize(8, 6), cvSize(8, 6), cvSize(4, 3), 9);

根据上面的概念可知,cvSize(64,48)表示窗口的大小,cvSize(8, 6)表示块(block)大小,cvSize(8,6)表示块滑动增量(blockStride)大小,cvSize(4, 3)表示胞元(cell)大小,9表示每个胞单元中梯度直方图的数量。

注:输入的图片尺寸为640×480。

据此,可知:

一个块(block)包含A=(blockSize.width/cellSize.width)*(blockSize.height / cellSize.height)个胞元(cell),所以一个块(block)含有9A个梯度直方图。按照所给出的数据,可得结果为36。

一个窗口包含B=((windowSize.width-blockSize.width)/(blockStrideSize.width)+1)* ((windowSize.height-blockSize.height)/(blockStrideSize.height)+1)个块(block),所以一个窗口包含9AB个梯度直方图。

按照所给出的数据,可得结果为2304。

其次,计算特征向量hog->compute(trainImg,descriptors, Size(64, 48), Size(0, 0))

此处,trainImg代表输入的图片(此处尺寸为640×480),descriptors表示保存特征结果的Vector,Size(64,48)表示windows的步进,第四个为padding,用于填充图片以适应大小。

当padding以默认状态Size(0,0)出现,滑动窗口window来计算图片时,

结果不一定为整数。

此时,查看compute()函数发现,其中有一段代码如下:

padding.width = (int)alignSize(std::max(padding.width,0), cacheStride.width);

padding.height = (int)alignSize(std::max(padding.height,0), cacheStride.height);

这段代码就是用来将padding的大小来适应stride的大小。

在我的实例中,由于取得数都事先设计好,都是整数。而当若结果不为整数时,则将其取值为比其大的最小整数。如若padding.width计算为7.8时,就取8.

所以一幅640×480的图片,按照前面的参数,则可以取的特征数为230400维。

SVM人脸样本训练检测流程相关推荐

  1. 人脸检测流程及正负样本下载

    源地址:http://www.thinkface.cn/thread-146-1-4.html 人脸检测做训练当然可以用OpenCV训练好的xml,但是岂止于此.我们也要动手做!~ 首先是样本的选取. ...

  2. python检测吸烟的算法_yolov3+tensorflow+keras实现吸烟的训练全流程及识别检测

    yolov3+tensorflow+keras实现吸烟的训练全流程及识别检测 弈休丶 2019-12-30 23:29:54 1591 收藏 19 分类专栏: 基于yolov3+tensorflow+ ...

  3. 腾讯提超强少样本目标检测算法,公开1000类检测训练集FSOD | CVPR 2020

    作者 | VincentLee 来源 | 晓飞的算法工程笔记 不同于正常的目标检测任务,few-show目标检测任务需要通过几张新目标类别的图片在测试集中找出所有对应的前景.为了处理好这个任务,论文主 ...

  4. 开篇-HOG提取训练检测+样本制作

    [原文:http://www.cnblogs.com/miracled/archive/2012/05/12/2497271.html] 整体框架: 样本制作+训练+检测 - (vs2008 + op ...

  5. HOG提取训练检测+样本制作

    转自 http://www.cnblogs.com/miracled/archive/2012/05/12/2497271.html 利用HOG特征训练分类器说明文档-By miracled 整体框架 ...

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

    1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和统计图像局部区域的 ...

  7. 06-机器学习(Haar+Adaboost实现人脸、人眼检测)

    机器学习是什么? 机器学习=训练样本+特征+分类器,通过让机器学习的方式,来达到某种功能的过程 深度学习是什么? 深度学习=海量的学习样本+人工神经网络 机器学习需要:样本.特征.分类器.对训练后的数 ...

  8. 增量学习不只有finetune,三星AI提增量式少样本目标检测算法 | CVPR 2020

    作者 | VincentLee 来源 | 晓飞的算法工程笔记 该论文研究了非常有意义的增量式少样本目标检测场景iFSD(Incremental Few-Shot Detection),场景设置如下: ...

  9. 基于Co-Attention和Co-Excitation的少样本目标检测 | NeurIPS 2019

    「免费学习 60+ 节公开课:投票页面,点击讲师头像」 作者 | VincentLee 来源 | 晓飞的算法工程笔记(ID: gh_084c810bc839) 导读:论文提出CoAE少样本目标检测算法 ...

最新文章

  1. chrome动态ip python_简单python代码实现模拟浏览器操作
  2. workflow GetListIdByName 获取表名
  3. dataframe进行groupby后画图坐标轴刻度问题
  4. linux adduser mysql_linux_adduser
  5. container view_高级UI晋升之常用View(三)中篇
  6. 好记性不如烂笔头——.NET运行原理
  7. 转:linux下挂载移动硬盘
  8. php小偷cookie,php小偷程序新概念之实时更新(二) | 学步园
  9. inav是什么意思?
  10. 关于window10系统找不到Realtek高清晰音频管理器解决方法
  11. web.xml不同版本的头
  12. apk 进行系统签名
  13. 如何查询计算机已连接wife的密码错误,电脑已经连上无线如何查看WIFI密码
  14. PAT:银行排队问题:队列
  15. 人工智能十月怀胎记:1955-1956,从孕育到诞生
  16. 中国纸制品包装行业投资发展与营销战略分析报告2022-2028年版
  17. [USACO09OCT]The Robot Plow G
  18. account表里有什么 银行_银行螺丝钉:科创板50指数基金来了,该如何投资?
  19. 首旅如家升级会员卡,推出喜茶、奈雪、麦当劳等品牌优惠权益
  20. redis实现分布式锁的原理

热门文章

  1. 比特率VS波特率,以太网波特率
  2. 软考程序员考试总结,零经验一次过
  3. FastDFS文件存储(文件存储,图片存储,视频存储)
  4. android+集成北斗定位,基于Android系统的北斗定位通信手持设备研究
  5. 存储过程-触发器-事务
  6. jQuery等待video视频元素加载完成
  7. 交错CRM BOOST PFC仿真(一)
  8. java文档检测重复_使用Simian进行重复代码检测
  9. webapp日历考勤打卡(Vue)
  10. 河北最新建筑八大员(材料员)机考真题题库及答案解析