行人检测参考
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
行人检测参考
1.制作样本
2.对每一张图片调用
pute(img, descriptors,Size(8,8), Size(0,0));
可以生成hog descriptors,把它保存到文件中
for(int j=0;j<3780;j++)
fprintf(f,"%f,",descriptors[j]);
3.利用SVM进行训练和分类,可得到权重系数,即getDefaultPeopleDetector()函数中调用的
检测算子detector[]
OpenCV2.0提供了行人检测的例子,用的是法国人Navneet Dalal最早在CVPR2005会议上提出的方法。
最近正在学习它,下面是自己的学习体会,希望共同探讨提高。
1、VC 2008 Express下安装OpenCV2.0--可以直接使用2.1,不用使用CMake进行编译了,避免编译出错
这是一切工作的基础,感谢版主提供的参考:/index.php /VC_2008_Express下安装OpenCV2.0
2、体会该程序
在DOS界面,进入如下路径:C:/OpenCV2.0/samples/c peopledetect.exe file name.jpg
其中filename.jpg为待检测的文件名
3、编译程序
创建一个控制台程序,从C:/OpenCV2.0/samples/c下将peopledetect.cpp加入到工程中;按步骤1的方法进行设置。编译成功,但是在DEBUG模式下生成的EXE文件运行出错,很奇怪
。
改成RELEASE模式后再次编译,生成的EXE文件可以运行。
4程序代码简要说明
1) getDefaultPeopleDetector() 获得3780维检测算子(105 blocks with 4 histograms each and 9 bins per histogram there are 3,780 values)--(为什么是105blocks?)2).cv::HOGDescriptor hog; 创建类的对象一系列变量初始化
winSize(64,128), blockSize(16,16), blockStride(8,8),
cellSize(8,8), nbins(9), derivAperture(1), winSigma(-1),
histogramNormType(L2Hys), L2HysThreshold(0.2), gammaCorrection(true)
3). 调用函数:detectMultiScale(img, found, 0, cv::Size(8,8), cv::Size(24,16), 1.05, 2);
参数分别为待检图像、返回结果列表、门槛值hitThreshold、窗口步长winStride、图像padding margin、比例系数、门槛值groupThreshold;通过修改参数发现,就所用的某图片,参数0改为0.01就检测不到,改为0.001可以;1.05改为1.1就不行,1.06可以;2改为1可以,0.8以下不行,(24,16)改成(0,0)也可以,(32,32)也行
该函数内容如下
(1) 得到层数levels
某图片(530,402)为例,lg(402/128)/lg1.05=23.4 则得到层数为24
(2) 循环levels次,每次执行内容如下
HOGThreadData&tdata = threadData[getThreadNum()];
Mat smallerImg(sz, img.type(), tdata.smallerImgBuf.data);
调用以下核心函数
detect(smallerImg, tdata.locations, hitThreshold, winStride, padding);
其参数分别为,该比例下图像、返回结果列表、门槛值、步长、margin
该函数内容如下:
(a)得到补齐图像尺寸paddedImgSize
(b)创建类的对象HOGCache cache(this, img, padding, padding, nwindows == 0, cacheStride); 在创建过程中,首先初始化HOGCache::init,包括:计算梯度descriptor->computeGradient、得到块的个数105、每块参数个数36
(c)获得窗口个数nwindows,以第一层为例,其窗口数为(530+32*2-64)/8+1、(402+32*2-128)/8+1 =67*43=2881,其中(32,32)为winStride参数,也可用(24,16)
(d)在每个窗口执行循环,内容如下
在105个块中执行循环,每个块内容为:通过getblock函数计算HOG特征并归一化,36个数分别与算子中对应数进行相应运算;判断105个块的总和s >= hitThreshold 则认为检测到目标
4)主体部分感觉就是以上这些,但很多细节还需要进一步弄清。
5、原文献写的算法流程
文献NavneetDalalThesis.pdf 78页图5.5描述了The complete object detection algorithm.
前2步为初始化,上面基本提到了。后面2步如下
For each scale Si = [Ss, SsSr, . . . , Sn]
(a) Rescale the input image using bilinear interpolation
(b) Extract features (Fig. 4.12) and densely scan the scaled image with stride Ns for object/non-object detections
(c) Push all detections with t(wi) > c to a list
Non-maximum suppression
(a) Represent each detection in 3-D position and scale space yi
(b) Using (5.9), compute the uncertainty matrices Hi for each point
(c) Compute the mean shift vector (5.7) iteratively for each point in the list until it converges to a mode
(d) The list of all of the modes gives the final fused detections
(e) For each mode compute the bounding box from the final centre point and scale
以下内容节选自文献NavneetDalalThesis.pdf,把重要的部分挑出来了。其中保留了原文章节号,便于查找。
4. Histogram of Oriented Gradients Based Encoding of Images
Default Detector.
As a yardstick for the purpose of comparison, throughout this section we co mpare results to our
default detector which has the following properties: input image in RGB colou