-
机器学习--行人检测图片负样本(NEG)
2017-12-28 19:22:101000张行人检测的负样本,分辨率为320X240,可用于训练行人检测分类器,本人已使用样本训练出.xml分类器,检测效果良好。另外正样本(POS)如需要请见另一个资源(负样本也很多,正负样本上传容量受限)。 -
人脸识别正负样本集,负样本2500多,且为处理后灰度图...同时负样本也是适应于车辆识别,车牌识别,行人检测等
2018-10-25 18:19:29人脸识别正负样本集,负样本2500多,且为处理后灰度图;正样本1000多张,且为归一化后的图片;同时负样本也是适应于车辆识别,车牌识别,行人检测等 -
人脸识别正负样本集,负样本2500多,且为处理后灰度图;正样本1000多张,且为归一化后的图片;车牌识别行人...
2020-07-16 19:46:03人脸识别正负样本集,负样本2500多,且为处理后灰度图;正样本1000多张,且为归一化后的图片;同时负样本也是适应于车辆识别,车牌识别,行人检测等 -
从完全不包含人体的图片中随机剪裁出64*128大小的用于人体检测的负样本
2013-11-13 22:13:59进行行人检测的分类器训练时,负样本是从完全不包含人体的图片中随机剪裁出来的,下面程序的目的就是这个进行行人检测的分类器训练时,负样本是从完全不包含人体的图片中随机剪裁出来的,下面程序的目的就是这个:
#include <iostream> #include <fstream> #include <stdlib.h> //srand()和rand()函数 #include <time.h> //time()函数 #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 CropImageCount = 0; //裁剪出来的负样本图片个数 int main() { Mat src; string ImgName; char saveName[256];//裁剪出来的负样本图片文件名 ifstream fin("INRIANegativeImageList.txt");//打开原始负样本图片文件列表 //ifstream fin("subset.txt"); //一行一行读取文件列表 while(getline(fin,ImgName)) { cout<<"处理:"<<ImgName<<endl; ImgName = "D:\\DataSet\\INRIAPerson\\INRIAPerson\\Train\\neg\\" + ImgName; src = imread(ImgName);//读取图片 //cout<<"宽:"<<src.cols<<",高:"<<src.rows<<endl; //图片大小应该能能至少包含一个64*128的窗口 if(src.cols >= 64 && src.rows >= 128) { srand(time(NULL));//设置随机数种子 //从每张图片中随机裁剪10个64*128大小的不包含人的负样本 for(int i=0; i<10; i++) { int x = ( rand() % (src.cols-64) ); //左上角x坐标 int y = ( rand() % (src.rows-128) ); //左上角y坐标 //cout<<x<<","<<y<<endl; Mat imgROI = src(Rect(x,y,64,128)); sprintf(saveName,"noperson%06d.jpg",++CropImageCount);//生成裁剪出的负样本图片的文件名 imwrite(saveName, imgROI);//保存文件 } } } system("pause"); }
源码下载,环境为VS2010 + OpenCV2.4.4http://download.csdn.net/detail/masikkk/6547869
参考 -
SVM+HOG:从完全不包含人体的图片中随机剪裁出64*128大小的用于人体检测的负样本
2017-06-01 09:45:34进行行人检测的分类器训练时,负样本是从完全不包含人体的图片中随机剪裁出来的,下面程序的目的就是这个:1张负样本图片生成10张#include <iostream> #include <fstream> #include <stdlib.h> //srand()和rand()...进行行人检测的分类器训练时,负样本是从完全不包含人体的图片中随机剪裁出来的,下面程序的目的就是这个:1张负样本图片生成10张
准备工作: 创建负样本描述文件(全路径) ifstream fin("F:\\INRIAPerson\\INRIAPerson\\train_64x128_H96\\neg\\negatives.txt");//打开原始负样本图片文件的路径 sprintf(saveName,"F:\\dataset\\neg\\neg%06d.jpg",++CropImageCount);//生成裁剪出的负样本图片的文件名
#include <iostream> #include <fstream> #include <stdlib.h> //srand()和rand()函数 #include <time.h> //time()函数 #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 CropImageCount = 0; int main() { Mat src; string ImgName; char saveName[256];//裁剪出来的负样本图片文件名 ifstream fin("F:\\INRIAPerson\\INRIAPerson\\train_64x128_H96\\neg\\negatives.txt");//打开原始负样本图片文件的路径 //注:negatives.txt是负样本描述文件,dir /b/s>negatives.txt,用全路径 //一行一行读取负样本描述文件存到ImgName中 while(getline(fin,ImgName)) { cout<<"处理:"<<ImgName<<endl; src = imread(ImgName);//读取图片 //图片大小应该能能至少包含一个64*128的窗口 if(src.cols >= 64 && src.rows >= 128) { srand(time(NULL));//设置随机数种子 //从每张图片中随机裁剪10个64*128大小的不包含人的负样本 for(int i=0; i<10; i++) { int x = ( rand() % (src.cols-64) ); //左上角x坐标 int y = ( rand() % (src.rows-128) ); //左上角y坐标 //cout<<x<<","<<y<<endl; Mat imgROI = src(Rect(x,y,64,128)); sprintf(saveName,"F:\\dataset\\neg\\neg%06d.jpg",++CropImageCount);//生成裁剪出的负样本图片的文件名 imwrite(saveName, imgROI);//保存文件 } } } system("pause"); }
-
SVM+HOG:用初次训练的.xml分类器在负样本原图上检测生成HardExample样本
2017-06-02 16:23:32难例(或叫做难样本,Hard Example,Hard Negative,Hard Instance)是指利用第一次训练的 分类器在负样本原图(肯定没有人体)上进行行人... 把HardExample图片加入到初始的负样本集合中,重新进行SVM的训练,可显著减少难例(或叫做难样本,Hard Example,Hard Negative,Hard Instance)是指利用第一次训练的 分类器在负样本原图(肯定没有人体)上进行行人检测时所有检测到的矩形框,这些矩形框区域很明显都是误报 ,“把这些误报的矩形框保存为图片”,这些误检的图片就是HardExample图片。 把HardExample图片加入到初始的负样本集合中,重新进行SVM的训练,可显著减少误报。
上图中将树干误认为是人体,这些就是Hard Example,将这些矩形框保存为64*128的图片文件,加入到负样本集合中。 也就是说,难例就是分错类的负样本,将难例加入负样本集合进行二次训练就是告诉分类器:“这些是你上次分错类的,要吸取教训,改正错误”
创建负样本描述文件negatives.txt,注意删除.txt行
准备工作: ifstream fin("F:\\INRIAPerson\\INRIAPerson\\train_64x128_H96\\neg\\negatives.txt");//打开原始负样本图片文件的路径 svm.load("SVM_HOG_1500PosINRIA_2000Neg.xml");//从XML文件读取训练好的SVM模型 sprintf(saveName,"F:\\dataset\\HardExample\\%06d.jpg",++CropImageCount);//生成裁剪出的负样本图片的文件名
#include <iostream> #include <fstream> #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; 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; } }; char saveName[256];//裁剪出来的负样本图片文件名 int CropImageCount; string ImgName; ifstream fin("F:\\INRIAPerson\\INRIAPerson\\train_64x128_H96\\neg\\negatives.txt");//打开原始负样本图片文件的路径 int pic_Num = 0; // 处理了多少张图像 int main() { //检测窗口(64,128),块尺寸(16,16),块步长(8,8),cell尺寸(8,8),直方图bin个数9 HOGDescriptor hog(Size(64,128),Size(16,16),Size(8,8),Size(8,8),9);//HOG检测器,用来计算HOG描述子的 int DescriptorDim;//HOG描述子的维数,由图片大小、检测窗口大小、块大小、细胞单元中直方图bin个数决定 MySVM svm;//SVM分类器 svm.load("SVM_HOG_1500PosINRIA_2000Neg.xml");//从XML文件读取训练好的SVM模型 /************************************************************************************************* 线性SVM训练完成后得到的XML文件里面,有一个数组,叫做support vector,还有一个数组,叫做alpha,有一个浮点数,叫做rho; 将alpha矩阵同support vector相乘,注意,alpha*supportVector,将得到一个列向量。之后,再该列向量的最后添加一个元素rho。 如此,变得到了一个分类器,利用该分类器,直接替换opencv中行人检测默认的那个分类器(cv::HOGDescriptor::setSVMDetector()), 就可以利用你的训练样本训练出来的分类器进行行人检测了。 ***************************************************************************************************/ DescriptorDim = svm.get_var_count();//特征向量的维数,即HOG描述子的维数 int supportVectorNum = svm.get_support_vector_count();//支持向量的个数 cout<<"支持向量个数:"<<supportVectorNum<<endl; Mat alphaMat = Mat::zeros(1, supportVectorNum, CV_32FC1);//alpha向量,长度等于支持向量个数 Mat supportVectorMat = Mat::zeros(supportVectorNum, DescriptorDim, CV_32FC1);//支持向量矩阵 Mat resultMat = Mat::zeros(1, DescriptorDim, CV_32FC1);//alpha向量乘以支持向量矩阵的结果 //将支持向量的数据复制到supportVectorMat矩阵中 for(int i=0; i<supportVectorNum; i++) { const float * pSVData = svm.get_support_vector(i);//返回第i个支持向量的数据指针 for(int j=0; j<DescriptorDim; j++) { supportVectorMat.at<float>(i,j) = pSVData[j]; } } //将alpha向量的数据复制到alphaMat中 double * pAlphaData = svm.get_alpha_vector();//返回SVM的决策函数中的alpha向量 for(int i=0; i<supportVectorNum; i++) { alphaMat.at<float>(0,i) = pAlphaData[i]; } //计算-(alphaMat * supportVectorMat),结果放到resultMat中 //gemm(alphaMat, supportVectorMat, -1, 0, 1, resultMat);//不知道为什么加负号? resultMat = -1 * alphaMat * supportVectorMat; //得到最终的setSVMDetector(const vector<float>& detector)参数中可用的检测子 vector<float> myDetector; //将resultMat中的数据复制到数组myDetector中 for(int i=0; i<DescriptorDim; i++) { myDetector.push_back(resultMat.at<float>(0,i)); } //最后添加偏移量rho,得到检测子 myDetector.push_back(svm.get_rho()); cout<<"检测子维数:"<<myDetector.size()<<endl; //设置HOGDescriptor的检测子 HOGDescriptor myHOG; myHOG.setSVMDetector(myDetector); //myHOG.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); //保存检测子参数到文件 ofstream fout("HOGDetectorForOpenCV.txt"); for(int i=0; i<myDetector.size(); i++) { fout<<myDetector[i]<<endl; } while(getline(fin,ImgName)) { cout<<"处理:"<<ImgName<<" "<<pic_Num++<<endl; /**************读入图片进行HOG行人检测******************/ Mat src = imread(ImgName); if(src.empty()) { continue; } Mat T; src.copyTo(T); vector<Rect> found, found_filtered;//矩形框数组 //cout<<"进行多尺度HOG人体检测"<<endl; myHOG.detectMultiScale(src, found, 0, Size(8,8), Size(32,32), 1.05, 2);//对图片进行多尺度行人检测 //cout<<"找到的矩形框个数:"<<found.size()<<endl; //找出所有没有嵌套的矩形框r,并放入found_filtered中,如果有嵌套的话,则取外面最大的那个矩形框放入found_filtered中 for(int i=0; i < found.size(); i++) { Rect r = found[i]; int j=0; for(; j < found.size(); j++) if(j != i && (r & found[j]) == r) break; if( j == found.size()) found_filtered.push_back(r); } //画矩形框,因为hog检测出的矩形框比实际人体框要稍微大些,所以这里需要做一些调整 for(int i=0; i<found_filtered.size(); i++) { Rect r = found_filtered[i]; //begin:自己添加的代码 if(r.x>src.cols || r.x<0) continue; if(r.y>src.rows || r.y<0) continue; if(r.x+r.width>src.cols || r.x+r.width<0) continue; if(r.y+r.height>src.rows || r.y+r.height<0) continue; //end r.x = r.x+cvRound(r.width*0.1); r.width = cvRound(r.width*0.8); r.y = r.y+cvRound(r.height*0.07); r.height = cvRound(r.height*0.8); //rectangle(src, r.tl(), r.br(), Scalar(0,255,0), 3); //画出矩阵 if(r.x>src.cols||r.x<0||r.y>src.rows || r.y<0||r.x+r.width>src.cols || r.x+r.width<0||r.y+r.height>src.rows || r.y+r.height<0) continue; //截图 Rect tmp(r); Mat dst = src(tmp); resize(dst,dst,Size(64,128)); sprintf(saveName,"F:\\dataset\\HardExample\\%06d.jpg",++CropImageCount);//生成裁剪出的负样本图片的文件名 imwrite(saveName, dst);//保存文件 } } system("pause"); }
注意:采取HardExample图片之后,保存的图片都调整成64X128大小的。
-
用初次训练的SVM+HOG分类器在负样本原图上检测HardExample
2016-11-09 15:07:51Hard Negative,Hard Instance)是指利用第一次训练的分类器在负样本原图(肯定没有人体)上进行行人检测时所有检测到的矩形框,这些矩形框区域很明显都是误报,把这些误报的矩形框保存为图片,加入到初始的负样本集合...难例(或叫做难样本,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 example
- for(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 Example
- Mat 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 -
论文研究-聚合支持向量机分类器的行人检测方法.pdf
2019-09-11 02:53:00利用该分类器对负样本进行分类判断,将误判样本作为难例样本,重新划分构建新的平衡子训练集,训练子分类器,结合EasyEnsemble SVM分类器,得到Ensemble SVM分类器行人检测方法。在INRIA行人数据集上的实验表明,该... -
基于图像处理的井下机车行人检测技术
2020-07-04 04:06:55为了防止井下机车撞人事故发生,提出了一种基于图像处理的井下机车行人检测技术...为了降低错检率,提出了负样本筛选法,最后为了消除轨道外围行人的干扰设计黑色带,结果表明可以很好地识别机车正前方行人并作出预警判断。 -
hog+svm负样本处理
2014-11-24 17:26:38hog特征+svm分类器行人检测训练的负样本处理程序,千万注意路径问题 -
HOG+adboost行人检测
2018-09-13 16:30:12基于HOG+adboost的行人检测代码,HOG与adboost都是自己用代码写的,训练集用的是INRIA数据集,500个正样本与1000个负样本。图片数据的剪裁可以看我的博客,里面有如何将图片进行剪裁与重命名。训练用的图片大小为64*... -
SVM分类器训练的HOG行人检测
2018-04-19 11:49:24转自:...负样本是从不包含人体的图片中随机裁取的,大小同样是64*128(从完全不包含人体的图片中随机剪裁出64*128大小的用于人体检测的负样本)。SVM使用的是Ope... -
关于行人检测中的常用数据集
2019-08-19 10:22:391.MIT数据库 ... 介绍:该数据库为较早公开的行人数据库,共924张行人图片...该数据库只含正面和背面两个视角,无负样本,未区分训练集和测试集。Dalal等采用“HOG+SVM”,在该数据库上的检测准确率接近100%。 2.... -
行人检测数据集
2017-04-21 19:14:55MIT数据库 该数据库为较早公开的行人数据库,共924张行人图片(ppm格式,宽高为64×128),肩到脚的距离约...该数据库是目前使用最多的静态行人检测数据库,提供原始图片及相应的标注文件。训练集有正样本614张(包 -
Pets2009行人检测数据集
2018-11-06 12:27:29包含三个压缩包分别是: Pets2009行人检测数据集view1包含 pos-norm64x128:2514个正样本(64x128) neg:5000负样本 view_1(png):视频转换后的png格式源图片,由于上传大小限制,只上传100张。 -
自己训练SVM分类器进行HOG行人检测
2013-11-13 22:25:40自己训练SVM分类器进行HOG行人检测. 环境为VS2010 + OpenCV2.4.4. 使用时请自行修改工程的include目录和lib目录配置...负样本是从不包含人体的图片中随机裁取的,大小同样是64*128。 SVM使用的是OpenCV自带的CvSVM类。 -
HOG+SVM行人检测
2016-10-11 19:25:25负样本是从不包含人体的图片中随机裁取的,大小同样是64*128(从完全不包含人体的图片中随机剪裁出64*128大小的用于人体检测的负样本)。 SVM使用的是OpenCV自带的CvSVM类。 首先计算正负样本图像的HOG描述子,组成一... -
行人检测HOG+SVM比较通俗的介绍
2017-08-31 09:39:17最近在研究HOG+SVM检测的方法,看了很多资料,感觉这位作者的介绍比较容易看懂,存起来备忘。 ... 总体思路: ...1、提取正负样本hog特征 ...2、投入svm分类器训练,...4、利用检测子检测负样本,得到hardexample 5、提 -
训练SVM进行行人检测
2014-11-12 18:05:01负样本是从不包含人体的图片中随机裁取的,大小同样是64*128(从完全不包含人体的图片中随机剪裁出64*128大小的用于人体检测的负样本)。 SVM使用的是OpenCV自带的CvSVM类。 首先计算正负样本图像的HOG描述子,...
收藏数
81
精华内容
32
-
ISSCC2021_Session_02V_Highlighted Chip Releases 5G and Radar Systems.pdf
-
华为公有云交付项目整体介绍.pptx
-
PPT大神之路高清教程
-
gitbbook.zip
-
RestfulApi服务端.zip
-
8080端口爆破神器
-
自动化测试Python3+Selenium3+Unittest
-
基于python的dango框架购物商城毕业设计毕设源代码使用教程
-
文件恢复.zip (U盘数据恢复)
-
python输入年月日,得出已经过了多少天?
-
Amoeba 实现 MySQL 高可用、负载均衡和读写分离
-
朱老师c++课程第3部分-3.5STL的其他容器讲解
-
2021 年该学的 CSS 框架 Tailwind CSS 实战视频
-
【硬核】一线Python程序员实战经验分享(1)
-
使用 Linux 平台充当 Router 路由器
-
5.按键输入.rar
-
用微服务spring cloud架构打造物联网云平台
-
Go 函数选项模式
-
hikaripool连接保持_springboot2的hikari数据库连接池默认配置
-
sql的fuzz.txt