用opencv实现自己训练HOG+SVM[行人检测]总结!

【行人检测】利用HOG+SVM训练模型步骤:

    1.准备样本

    2.提取hog特征

    3. 训练SVM分类器

    4.利用SVM训练的分类器,进行检测

1.原始数据集:  INRIAPerson训练集下载:原始数据集

    因为原始数据集比较乱,所以需要对原始数据集进行裁剪,下面是对原始数据集里面负例数据集裁剪图片的例程:

#include<fstream>//fstream
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/objdetect/objdetect.hpp> //  hog
#include<opencv2/ml/ml.hpp> //SVM
#include<iostream>
#include<time.h>
#include<stdlib.h>

using namespace std;
using namespace cv;
//using namespace ml;

#define PosNum 614
#define NegNum 1218
#define cropNegNum 1218
//#define totalDim 3780

/*********************************    随机剪裁负样本   *******************************************/
void crop_negsample_random()
{
    string imgName;
    char saveName[200];
    char pic_name[200];
    int neg_num;
    //string newNegFile =  "F:\\opencv_project\\data\\INRIAPerson\\Train\\new_neg\\" ;
    ifstream fileNeg("F:\\360MoveData\\Users\\SIACAS\\Desktop\\OPENCVproj\\Train\\neg.lst");
    ofstream file_newneg("F:\\360MoveData\\Users\\SIACAS\\Desktop\\OPENCVproj\\Train\\new_neg.txt");
    if (fileNeg.fail())
    {
        cout << "加载文件失败!" << endl;
    }
    int num = 0;

    //读取负样本
    for (int i = 0; i < cropNegNum && getline(fileNeg, imgName); i++)
    {
        imgName = "F:\\360MoveData\\Users\\SIACAS\\Desktop\\OPENCVproj\\" + imgName;  //加路径
        Mat img = imread(imgName, 1);
        //Mat img;
        if (img.empty())
        {
            cout << "can not load the image:" << imgName << endl;
            continue;
        }
        if (img.cols >= 64 && img.rows >= 128)
        {
            //num = 0;
            //从每张图片中随机剪裁2张64*128的负样本
            
            srand(time(NULL));//设置随机数种子
            int x = rand() % (img.cols - 64); //左上角x
            int y = rand() % (img.rows - 128); //左上角y
            Mat src = img(Rect(x, y, 64, 128));
            neg_num = num++;
            sprintf_s(saveName, "F:\\360MoveData\\Users\\SIACAS\\Desktop\\OPENCVproj\\Train\\new_neg\\negCropped%d.jpg", neg_num);
            sprintf_s(pic_name, "Train\\new_neg\\negCropped%d.jpg", neg_num);
            imwrite(saveName, src);
            file_newneg << pic_name << endl;
        }
    }
    cout << "crop ok!" << endl;
}

    上述为裁剪图像的例程,裁剪完后就可以进行加载图像进行提取HOG特征了,后面的程序可以参考后面我提到的博客,这里我就不重复写了!以上程序特别要注意imgName = "F:\\360MoveData\\Users\\SIACAS\\Desktop\\OPENCVproj\\" + imgName;   这个路径一定要填好 ,要不然会找不到图片!!!

然后晒一下结果,,,,很一般!可能训练的不好,,,后续再更新最好的结果!

 

程序源码这里下载:源代码

参考文献:

1、https://blog.csdn.net/u012679707/article/details/80669745#commentsedit

2、https://blog.csdn.net/xingguoguo/article/details/81221492

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值