精华内容
下载资源
问答
  • 1000张行人检测的负样本,分辨率为320X240,可用于训练行人检测分类器,本人已使用样本训练出.xml分类器,检测效果良好。另外正样本(POS)如需要请见另一个资源(负样本也很多,正负样本上传容量受限)。
  • 人脸识别正负样本集,负样本2500多,且为处理后灰度图;正样本1000多张,且为归一化后图片;同时负样本也是适应于车辆识别,车牌识别,行人检测
  • 人脸识别正负样本集,负样本2500多,且为处理后灰度图;正样本1000多张,且为归一化后图片;同时负样本也是适应于车辆识别,车牌识别,行人检测
  • 进行行人检测的分类器训练时,负样本是从完全不包含人体的图片中随机剪裁出来的,下面程序的目的就是这个

    进行行人检测的分类器训练时,负样本是从完全不包含人体的图片中随机剪裁出来的,下面程序的目的就是这个:


    #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.4

    http://download.csdn.net/detail/masikkk/6547869
    参考

    从完全不包含人体的图片中随机剪裁出用于人体检测的负样本


    展开全文
  • 进行行人检测的分类器训练时,负样本是从完全不包含人体的图片中随机剪裁出来的,下面程序的目的就是这个: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");  
    }  
    展开全文
  • 难例(或叫做难样本,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大小的。
    展开全文
  • Hard 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


    1. #include <iostream>  
    2. #include <fstream>  
    3. #include <string>  
    4. #include <opencv2/core/core.hpp>  
    5. #include <opencv2/highgui/highgui.hpp>  
    6. #include <opencv2/imgproc/imgproc.hpp>  
    7. #include <opencv2/objdetect/objdetect.hpp>  
    8. #include <opencv2/ml/ml.hpp>  
    9.   
    10. using namespace std;  
    11. using namespace cv;  
    12.   
    13. int hardExampleCount = 0; //hard example计数  
    14.   
    15. int main()  
    16. {  
    17.     Mat src;  
    18.     char saveName[256];//剪裁出来的hard example图片的文件名  
    19.     string ImgName;  
    20.     ifstream fin_detector("HOGDetectorForOpenCV_2400PosINRIA_12000Neg.txt");//打开自己训练的SVM检测器文件  
    21.     ifstream fin_imgList("INRIANegativeImageList.txt");//打开原始负样本图片文件列表  
    22.     //ifstream fin_imgList("subset.txt");  
    23.   
    24.     //从文件中读入自己训练的SVM参数  
    25.     float temp;  
    26.     vector<float> myDetector;//3781维的检测器参数  
    27.     while(!fin_detector.eof())  
    28.     {  
    29.         fin_detector >> temp;  
    30.         myDetector.push_back(temp);//放入检测器数组  
    31.     }  
    32.     cout<<"检测子维数:"<<myDetector.size()<<endl;  
    33.   
    34.     //namedWindow("src",0);  
    35.     HOGDescriptor hog;//HOG特征检测器  
    36.     hog.setSVMDetector(myDetector);//设置检测器参数为自己训练的SVM参数  
    37.   
    38.     //一行一行读取文件列表  
    39.     while(getline(fin_imgList,ImgName))  
    40.     {  
    41.         cout<<"处理:"<<ImgName<<endl;  
    42.         string fullName = "D:\\DataSet\\INRIAPerson\\INRIAPerson\\Train\\neg\\" + ImgName;//加上路径名  
    43.         src = imread(fullName);//读取图片  
    44.         Mat img = src.clone();//复制原图  
    45.   
    46.         vector<Rect> found;//矩形框数组  
    47.         //对负样本原图进行多尺度检测,检测出的都是误报  
    48.         hog.detectMultiScale(src, found, 0, Size(8,8), Size(32,32), 1.05, 2);  
    49.   
    50.         //遍历从图像中检测出来的矩形框,得到hard example  
    51.         for(int i=0; i < found.size(); i++)  
    52.         {  
    53.             //检测出来的很多矩形框都超出了图像边界,将这些矩形框都强制规范在图像边界内部  
    54.             Rect r = found[i];  
    55.             if(r.x < 0)  
    56.                 r.x = 0;  
    57.             if(r.y < 0)  
    58.                 r.y = 0;  
    59.             if(r.x + r.width > src.cols)  
    60.                 r.width = src.cols - r.x;  
    61.             if(r.y + r.height > src.rows)  
    62.                 r.height = src.rows - r.y;  
    63.   
    64.             //将矩形框保存为图片,就是Hard Example  
    65.             Mat hardExampleImg = src(r);//从原图上截取矩形框大小的图片  
    66.             resize(hardExampleImg,hardExampleImg,Size(64,128));//将剪裁出来的图片缩放为64*128大小  
    67.             sprintf(saveName,"hardexample%09d.jpg",hardExampleCount++);//生成hard example图片的文件名  
    68.             imwrite(saveName, hardExampleImg);//保存文件  
    69.   
    70.   
    71.             //画矩形框,因为hog检测出的矩形框比实际人体框要稍微大些,所以这里需要做一些调整  
    72.             //r.x += cvRound(r.width*0.1);  
    73.             //r.width = cvRound(r.width*0.8);  
    74.             //r.y += cvRound(r.height*0.07);  
    75.             //r.height = cvRound(r.height*0.8);  
    76.             rectangle(img, r.tl(), r.br(), Scalar(0,255,0), 3);  
    77.   
    78.         }  
    79.         //imwrite(ImgName,img);  
    80.         //imshow("src",src);  
    81.         //waitKey(100);//注意:imshow之后一定要加waitKey,否则无法显示图像  
    82.   
    83.     }  
    84.   
    85.     system("pause");  
    86. }  


    源码下载,环境为VS2010 + OpenCV2.4.4

    http://download.csdn.net/detail/masikkk/6549325
    展开全文
  • 利用该分类器对负样本进行分类判断,将误判样本作为难例样本,重新划分构建新平衡子训练集,训练子分类器,结合EasyEnsemble SVM分类器,得到Ensemble SVM分类器行人检测方法。在INRIA行人数据集上实验表明,该...
  • 为了防止井下机车撞人事故发生,提出了一种基于图像处理井下机车行人检测技术...为了降低错检率,提出了负样本筛选法,最后为了消除轨道外围行人干扰设计黑色带,结果表明可以很好地识别机车正前方行人并作出预警判断。
  • hog+svm负样本处理

    热门讨论 2014-11-24 17:26:38
    hog特征+svm分类器行人检测训练的负样本处理程序,千万注意路径问题
  • HOG+adboost行人检测

    2018-09-13 16:30:12
    基于HOG+adboost的行人检测代码,HOG与adboost都是自己用代码写,训练集用是INRIA数据集,500个正样本与1000个负样本。图片数据剪裁可以看我博客,里面有如何将图片进行剪裁与重命名。训练用图片大小为64*...
  • 转自:...负样本是从不包含人体的图片中随机裁取的,大小同样是64*128(从完全不包含人体的图片中随机剪裁出64*128大小的用于人体检测的负样本)。SVM使用的是Ope...
  • 关于行人检测常用数据集

    千次阅读 2019-08-19 10:22:39
    1.MIT数据库 ... 介绍:该数据库为较早公开的行人数据库,共924张行人图片...该数据库只含正面和背面两个视角,无负样本,未区分训练集和测试集。Dalal等采用“HOG+SVM”,在该数据库上的检测准确率接近100%。 2....
  • 行人检测数据集

    万次阅读 2017-04-21 19:14:55
    MIT数据库 该数据库为较早公开行人数据库,共924张行人图片(ppm格式,宽高为64×128),肩到脚距离约...该数据库是目前使用最多静态行人检测数据库,提供原始图片及相应标注文件。训练集有正样本614张(包
  • 包含三个压缩包分别是: 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描述子,...

空空如也

空空如也

1 2 3 4 5
收藏数 81
精华内容 32
关键字:

行人检测的负样本