用初次训练的SVM+HOG分类器在负样本原图上检测HardExample
难例(或叫做难样本,Hard Example,Hard Negative,Hard Instance)是指利用第一次训练的分类器在负样本原图(肯定没有人体)上进行行人检测时所有检测到的矩形框,这些矩形框区域很明显都是误报,把这些误报的矩形框保存为图片,加入到初始的负样本集合中,重新进行SVM的训练,可显著减少误报。这种方法叫做自举法(Bootstrap),自举法首先使用初始负样本集来训练一个模型,然后收集被这个初始模型错误分类的负样本来形成一个负样本难例集。用此负样本难例集训练新的模型,此过程可以重复多次。
比如典型的误报如下:
上图中将树干误认为是人体,这些就是Hard Example,将这些矩形框保存为64*128的图片文件,加入到负样本集合中。
也就是说,难例就是分错类的负样本,将难例加入负样本集合进行二次训练就是告诉分类器:“这些是你上次分错类的,要吸取教训,改正错误”
初次训练SVM+HOG分类器见:自己训练SVM分类器进行HOG行人检测
Navneet Dalal在CVPR2005上的HOG原论文翻译见:http://blog.csdn.net/masibuaa/article/details/14056807
#include <iostream>
#include <fstream>
#include <string>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/ml/ml.hpp>using namespace std;
using namespace cv;int hardExampleCount = 0; //hard example计数int main()
{Mat src;char saveName[256];//剪裁出来的hard example图片的文件名string ImgName;ifstream fin_detector("HOGDetectorForOpenCV_2400PosINRIA_12000Neg.txt");//打开自己训练的SVM检测器文件ifstream fin_imgList("INRIANegativeImageList.txt");//打开原始负样本图片文件列表//ifstream fin_imgList("subset.txt");//从文件中读入自己训练的SVM参数float temp;vector<float> myDetector;//3781维的检测器参数while(!fin_detector.eof()){fin_detector >> temp;myDetector.push_back(temp);//放入检测器数组}cout<<"检测子维数:"<<myDetector.size()<<endl;//namedWindow("src",0);HOGDescriptor hog;//HOG特征检测器hog.setSVMDetector(myDetector);//设置检测器参数为自己训练的SVM参数//一行一行读取文件列表while(getline(fin_imgList,ImgName)){cout<<"处理:"<<ImgName<<endl;string fullName = "D:\\DataSet\\INRIAPerson\\INRIAPerson\\Train\\neg\\" + ImgName;//加上路径名src = imread(fullName);//读取图片Mat img = src.clone();//复制原图vector<Rect> found;//矩形框数组//对负样本原图进行多尺度检测,检测出的都是误报hog.detectMultiScale(src, found, 0, Size(8,8), Size(32,32), 1.05, 2);//遍历从图像中检测出来的矩形框,得到hard examplefor(int i=0; i < found.size(); i++){//检测出来的很多矩形框都超出了图像边界,将这些矩形框都强制规范在图像边界内部Rect r = found[i];if(r.x < 0)r.x = 0;if(r.y < 0)r.y = 0;if(r.x + r.width > src.cols)r.width = src.cols - r.x;if(r.y + r.height > src.rows)r.height = src.rows - r.y;//将矩形框保存为图片,就是Hard ExampleMat hardExampleImg = src(r);//从原图上截取矩形框大小的图片resize(hardExampleImg,hardExampleImg,Size(64,128));//将剪裁出来的图片缩放为64*128大小sprintf(saveName,"hardexample%09d.jpg",hardExampleCount++);//生成hard example图片的文件名imwrite(saveName, hardExampleImg);//保存文件//画矩形框,因为hog检测出的矩形框比实际人体框要稍微大些,所以这里需要做一些调整//r.x += cvRound(r.width*0.1);//r.width = cvRound(r.width*0.8);//r.y += cvRound(r.height*0.07);//r.height = cvRound(r.height*0.8);rectangle(img, r.tl(), r.br(), Scalar(0,255,0), 3);}//imwrite(ImgName,img);//imshow("src",src);//waitKey(100);//注意:imshow之后一定要加waitKey,否则无法显示图像}system("pause");
}
源码下载,环境为VS2010 + OpenCV2.4.4
http://download.csdn.net/detail/masikkk/6549325
from: http://blog.csdn.net/masibuaa/article/details/16113373
用初次训练的SVM+HOG分类器在负样本原图上检测HardExample相关推荐
- SVM+HOG:用初次训练的.xml分类器在负样本原图上检测生成HardExample样本
难例(或叫做难样本,Hard Example,Hard Negative,Hard Instance)是指利用第一次训练的 分类器在负样本原图(肯定没有人体)上进行行人检测时所有检测到的矩形框,这些矩 ...
- opencv 使用SVM+HOG训练行人检测分类器(INRIA Person Dataset训练集)
目录 1.训练过程(即代码流程) 2.模型及结果优缺点分析 3.模型建立中发现的问题及改进方法 4.行人检测OpenCv 代码(C++) 1.训练过程(即代码流程) 1. 准备训练样本集合: 包括正样 ...
- python支持向量机分类器怎么用_用Python实现SVM多分类器
支持向量机(SVM)--分类预测,包括多分类问题,核函数调参,不平衡数据问题,特征降维,网格搜索,管道机制,学习曲线,混淆矩阵,AUC曲线等 项目1 说明svm.py 该文件中实现了一个简单的SVM, ...
- matlab中使用libsvm工具箱训练的svm分类器model保存
参考自:https://blog.csdn.net/icestone007/article/details/6804150 最近自己做的项目因为用到SVM分类,使用的是matlab中使用libsvm工 ...
- 使用opencv_traincascade训练Haar、HOG、LBP Adaboost分类器
opencv_traincascade.exe默认表格 训练正样本2400,负样本3300 1.opencv_traincascade.exe -data traincascade -vec pos ...
- 详细的基于opencv svm hog的描述讲解
(转自http://blog.csdn.net/zhazhiqiang/ 未经允许请勿用于商业用途) 一.理论 1.HOG特征描述子的定义: locally normalised histogram ...
- 车辆追踪算法大PK:SVM+HOG vs. YOLO
作者:Kaspar Sakmann Twitter Facebook 介绍 对于Udacity(优达学城)自动驾驶汽车纳米学位的汽车检测和跟踪项目,如果使用传统的计算机可视化技术将是一个挑战,就像方向 ...
- 基于 MATLAB fitcsvm 的 OVR SVM 多分类器实现
本代码参考 MATLAB 官方例程,实现 SVM 多分类器(one-versus-rest).对于未知标签的测试集,初始化中测试样本的标签,以及结果分析中的验证部分可忽略. OVR SVM 一对多(o ...
- SVM+HOG识别Matlab代码,序列前向搜索Malab代码,抗遮挡的STC跟踪C++代码
1.毕业论文的代码.一个能识别能跟踪的程序.识别部分为SVM+HOG还有序列前向搜索,为Matlab写的. 2.跟踪部分为提升的STC跟踪算法,原版STC代码见http://blog.csdn.net ...
最新文章
- VS2010重构学习总结
- vue-router路由示例
- 初识Mysql(part11)--我需要知道的4条Mysql语句之分组
- 输出等边三角形php,php打印三角星星方法实列
- SignalR Self Host+MVC等多端消息推送服务(4)
- 计算机中丢失setupxml.dll,Win7电脑安装VideoStudio Pro X6显示丢失SetupXML.dll文件怎么解决...
- Web框架——Flask系列之自定义过滤器详解(五)
- mysql 撤销删除_线上磁盘告警,mysql无法释放空间,踩了个大坑,大家记得别踩坑...
- VS中生成、清理项目、调试、開始运行(不调试)、Debug 和 Release等之间的差别...
- vim的一些基本应用
- 【图说】Eclipse与Unity 3D协同工作
- VC++ 6.0的一些使用技巧---IDE的使用
- VDI中创建集合时使用Sysprep应答文件碰到的问题
- [WPF] 嵌入资源到DLL,并解决PNG图片问题
- 4*4矩阵式键盘识别技术c语言程序,4×4矩阵式键盘识别技术
- mysql中时间不早于今天_MySQL不正确日期时间值早于1980年的日期
- DQN-[Playing Atari with Deep Reinforcement Learning]
- 360无线网卡linux驱动下载,如何在Linux下写无线网卡的驱动
- 4.MyBatis源码解析-MyBatis扩展点--阿呆中二
- 第一次出国旅行的启示录 —— 关于旅行与人生的思考
热门文章
- 调用预训练好的XLnet词向量
- IMF 报告:比特币等加密货币有朝一日可能取代传统支付手段
- 从变量到封装:一文带你为机器学习打下坚实的Python基础 By 机器之心2017年10月13日 10:43 本文整体梳理了 Python 的基本语法与使用方法,并重点介绍了对机器学习十分重要的且常
- 云白条,做有温度的金融,帮助有困难的人
- 从0到1走进 Kaggle
- 中国移动互联网趋势报告:教育、金融类App留存率更高
- 盘点过去一年,MIT人工智能实验室的那些创新
- FaceNet--Google的人脸识别
- 白话Elasticsearch16-深度探秘搜索技术之使用原生cross-fiedls技术解决搜索弊端
- python学习笔记(七)——类基础