文章目录
任务:利用INRIA Person数据集,提取HOG特征并采用SVM方法实现图像中的行人检测。
本文将给出详细的操作步骤,以及可能会出现的坑点。
一、准备工作
1. 下载数据集
INRIA数据集含有直立或行走的人的图像,被Navneet Dalal用于训练发表在CVPR 2005的人类检测器。
坑点1:官网http://pascal.inrialpes.fr/data/human/打开后显示403 Forbidden。
解决方法:使用Motrix/IDM/迅雷(或其他支持FTP的下载工具)打开ftp://ftp.inrialpes.fr/pub/lear/douze/data/INRIAPerson.tar进行下载(压缩后大小1GB左右)。
2. 解压数据集
坑点2:使用WinRAR/7Zip解压时出现文件覆盖、要求管理员权限等问题。
解决方法:文件中含有软连接,不能使用WinRAR/7Zip解压,而应使用来自Linux的命令tar解压。如果你安装了WSL(Windows Subsystem for Linux)/MinGW等类Linux环境,可以调用如下命令:
tar xvf INRIAPerson.tar
其中x代表Extract(解压),v代表Verbose(显示正在解压的文件),f代表File Name(后面跟文件名)。这个命令将会在当前目录下生成INRIAPerson文件夹,里面是解压的文件。
二、HOG特征简介
HOG的全称是方向梯度直方图(Histogram of Oriented Gradient),它是计算机视觉中用于物体检测的一种特征描述子(Feature Descriptor)。特征描述子的作用是提取有用的信息,抛弃冗余的信息。对于一个物体而言,能够区分它的特征的往往是它的形状——也就是它的边界。而在边界处灰度一般有突变,所以我们考察图像的梯度就可以知道边界在什么地方。
1. 梯度(Gradient)
首先,我们假设输入图片是一张灰度图(其实我们一般处理的是图像的一部分,即window,而不是整个图像)。它可以看作是行( r r r)和列( c c c)的二元函数: I ( r , c ) I(r,c) I(r,c),其中 I I I代表第 r r r行、 c c c列的像素点的灰度(取值范围为 0 0 0~ 255 255 255)。在研究二元函数时,我们常常会考虑它的梯度。在这里,我们需要知道 I I I在 x x x、 y y y方向的梯度。我们采取的办法是:使用相邻格子的灰度之差做近似。 I I I在 x x x、 y y y方向的梯度公式如下: I x ( r , c ) = I ( r , c + 1 ) − I ( r , c − 1 ) I y ( r , c ) = I ( r + 1 , c ) − I ( r − 1 , c ) \begin{aligned} I_x(r,c)&=I(r,c+1)-I(r,c-1)\\ I_y(r,c)&=I(r+1,c)-I(r-1,c) \end{aligned} Ix(r,c)Iy(r,c)=I(r,c+1)−I(r,c−1)=I(r+1,c)−I(r−1,c)按理来说,上面的式子应该都除以 2 2 2,但因为后面要做归一化处理,所以这些常数就无关紧要了。它也可以理解为用向量 [ − 1 0 1 ] \begin{bmatrix}-1&0&1\end{bmatrix} [−101]和 [ − 1 0 1 ] {\begin{bmatrix}-1\\0\\1\end{bmatrix}} −101 对原图做卷积运算。接下来我们把梯度转换为极坐标,其中角度被限制在 0 ° 0\degree 0°~ 180 ° 180\degree 180°: μ = I x 2 + I y 2 θ = 180 π ( arctan I y I x ) \begin{aligned} \mu&=\sqrt{I_x^2+I_y^2}\\ \theta&=\frac{180}{\pi}\left(\arctan\frac{I_y}{I_x}\right) \end{aligned} μθ=Ix2+Iy2=π180(arctanIxIy)这里我们把 arctan \arctan arctan定义为 arctan x = { tan − 1 x , x ≥ 0 tan − 1 x + π , x < 0 \arctan x=\begin{cases} \tan^{-1}x,&x\ge 0\\ \tan^{-1}x+\pi,&x<0 \end{cases} arctanx={ tan−1x,tan−1x+π,x≥0x<0并且 θ \theta θ用角度制表示。
2. 格子(Cell)
我们继续将图像分割为 C × C C\times C C×C大小的格子(一般 C = 8 C=8 C=8)。下图演示了这样的一个分割,每个绿框是 8 × 8 8\times 8 8×8大小的格子:

每个格子有 C 2 C^2 C2(一般为 64 64 64)个像素点。每个像素点有一个梯度,我们要统计这些像素点梯度方向(即角度 θ \theta θ)的分布规律。上图中某个格子的梯度模长、方向如下:

想要统计角度的分布规律,就要用到直方图(Histogram)的概念了。在直方图中, x x x轴的每个区间称为一个bin,你可以把bin理解为桶,输入数据根据它在哪个范围里面被放进对应的桶里。那么对于 θ \theta θ,它的范围是 0 ° 0\degree 0°~ 180 ° 180\degree 180°,我们这个范围分成 B B B个bin。一般取 B = 9 B=9 B=9,也就是说每个区间的宽度是 w = 180 B = 20 ° w=\frac{180}{B}=20\degree w=B180=20°。我们把每个bin从 0 0 0到 B − 1 B-1 B−1进行编号。第 i i i个bin的范围是 [ w i , w ( i + 1 ) ) [wi,w(i+1)) [wi,w(i+1)),中心是 w ( i + 1 2 ) w\!\left(i+\frac{1}{2}\right) w(i+21)。例如,当 B = 9 B=9 B=9时,第3个bin( i = 3 i=3 i=3)的范围是 [ 60 ° , 80 ° ) [60\degree,80\degree) [60°,80°),中心是 70 ° 70\degree 70°。但是呢,我们不会简单的把每个像素点根据 θ \theta θ所在的范围放进桶里,而是需要考虑 μ \mu μ的大小,把它按一定比例放进相邻的两个桶里。最后,每个桶的值其实不是个数,而是一种“贡献”(contribution)的度量。一个像素点对一个bin的贡献不仅取决于梯度的模长 μ \mu μ,还取决于它的角度 θ \theta θ与该bin的中心的距离。模长越长,贡献越大;距离越远,贡献越小。具体地说,对于一个梯度模长为 μ \mu μ、方向角为 θ \theta θ的像素点,设 j = ⌊ θ w − 1 2 ⌋ j=\left\lfloor\cfrac{\theta}{w}-\cfrac{1}{2}\right\rfloor j=⌊wθ−21⌋,则它
- 对编号为 j m o d b j\bmod b j

本文详细介绍了如何利用INRIAPerson数据集提取HOG特征,并结合支持向量机(SVM)模型进行行人检测。首先,通过下载和解压数据集,然后解释HOG特征的计算过程,包括梯度、格子、块归一化和HOG特征向量的构建。接着,文章讨论了SVM模型的训练和测试,以及在测试数据上评估模型性能的方法。最后,展示了如何在图像上画出行人检测的边界框。整个过程涵盖了数据预处理、特征提取、模型训练和应用等多个步骤。
最低0.47元/天 解锁文章
1080





