赞
踩
我公司的科室开始在公众号上规划一些对外的技术文章了,包括实战项目、模型优化、端侧部署和一些深度学习任务基础知识,而我负责人体图象相关技术这一系列文章。
文章在同步发布至公众号和博客,顺带做一波宣传。有兴趣的还可以扫码加入我们的群。
(文章有写的不好的地方请见谅,另外有啥错误的地方也请大家帮忙指出。)微信公众号:AI炼丹术
背景差分法的基本原理就是先对视频做背景建模,利用获取到的背景参考与当前图像序列的当前帧做差分。计算出背景图像像素差异,设定阈值将运动目标和背景进行分割。
而利用这种方法做目标检测的主要流程:通过背景建模在视频中提取运动目标,再通过分类器判断目标是否为人。
背景建模经典方法有:单高斯、帧间差、混合高斯、VIBE、CodeBook……由于是传统方法,因此各种方法都有各自的特点,即有各自的优势。
背景建模的主要优势:
主要问题:
常用方法源码合集 Bgslibrary:https://github.com/andrewssobral/bgslibrary
下图为背景差分法的效果,图源参考:https://zhuanlan.zhihu.com/p/42944850
引用自:https://zhuanlan.zhihu.com/p/30483076
单高斯模型
当样本数据 X 是一维数据(Univariate)时,高斯分布遵从下方概率密度函数(Probability Density Function):
P ( x ∣ θ ) = 1 2 π σ 2 exp ( − ( x − μ ) 2 2 σ 2 ) P(x|\theta) = \frac{1}{\sqrt{2\pi\sigma^{2}}}\exp(-\frac{(x-\mu)^{2}}{2\sigma^{2}}) P(x∣θ)=2πσ2 1exp(−2σ2(x−μ)2)
其中 为数据均值 μ(期望),σ 为数据标准差(Standard deviation)。当样本数据 X 是多维数据(Multivariate)时,高斯分布遵从下方概率密度函数:
P ( x ∣ θ ) = 1 ( 2 π ) D 2 ∣ Σ ∣ 1 2 exp ( − ( x − μ ) T Σ − 1 ( x − μ ) 2 ) P(x|\theta) = \frac{1}{(2\pi)^{\frac{D}{2}}|\Sigma|^{\frac{1}{2}}}\exp(-\frac{(x-\mu)^{T}\Sigma^{-1}(x-\mu)}{2}) P(x∣θ)=(2π)2D∣Σ∣211exp(−2(x−μ)TΣ−1(x−μ))
其中,μ 为数据均值(期望), Σ 为协方差(Covariance),D 为数据维度。
引用自:https://zhuanlan.zhihu.com/p/30483076
高斯混合模型
高斯混合模型可以看作是由 K 个单高斯模型组合而成的模型,这 K 个子模型是混合模型的隐变量(Hidden variable)。一般来说,一个混合模型可以使用任何概率分布,这里使用高斯混合模型是因为高斯分布具备很好的数学性质以及良好的计算性能。
举个不是特别稳妥的例子,比如我们现在有一组狗的样本数据,不同种类的狗,体型、颜色、长相各不相同,但都属于狗这个种类,此时单高斯模型可能不能很好的来描述这个分布,因为样本数据分布并不是一个单一的椭圆,所以用混合高斯分布可以更好的描述这个问题,如下图所示:
图中每个点都由 K 个子模型中的某一个生成首先定义如下信息:
- x 1 x_1 x1 表示第 j j j个观测数据, j = 1 , 2 , … , N j=1,2,…,N j=1,2,…,N
- K K K是混合模型中子高斯模型的数量, k = 1 , 2 , … , K k=1,2,…,K k=1,2,…,K
- α k α_k αk是观测数据属于第 个 k k k子模型的概率, α k ≤ 0 α_k\le 0 αk≤0
- ϕ ( x ∣ θ k ) \phi(x|\theta_k) ϕ(x∣θk)是第 k k k 个子模型的高斯分布密度函数, θ k = ( μ k , σ k 2 ) \theta_k = (\mu_k,\sigma^2_k) θk=(μk,σk2) 。其展开形式与上面介绍的单高斯模型相同
- γ j k \gamma_{jk} γjk表示第 j j j个观测数据属于第 k k k个子模型的概率
高斯混合模型的概率分布为:
P ( x ∣ θ ) = ∑ k = 1 K α k ϕ ( x ∣ θ k ) P(x|\theta) = \sum^{K}_{k=1}{\alpha_k\phi(x|\theta_k)} P(x∣θ)=k=1∑Kαkϕ(x∣θk)
对于这个模型而言,参数 θ = ( μ k , σ k , σ k ) \theta = (\mu^{~}_k,\sigma^{~}_k,\sigma^{~}_k) θ=(μk ,σk ,σk ) ,也就是每个子模型的期望、方差(或协方差)、在混合模型中发生的概率。
HOG(Histogram of Oriented Gradient)特征是基于本地像素块进行特征直方图提取的一种算法,全称为方向梯度直方图。在2005年CVPR会议上发表,并在当时行人检测领域上取得了极大的成功。
SVM(支持向量机)的原理是找到一个超平面使得超平面离最近的样本点距离最大化。以此将所有样本点划分为不同类别。也就是起到一个分类作用。
(下图引用自由python实现的HOG+SVM行人检测源码仓库:https://github.com/vinay0410/Pedestrian_Detection)
引用原文链接:https://blog.csdn.net/carson2005/article/details/7782726
Dalal提出的Hog特征提取的过程:把样本图像分割为若干个像素的单元(cell),把梯度方向平均划分为9个区间(bin),在每个单元里面对所有像素的梯度方向在各个方向区间进行直方图统计,得到一个9维的特征向量,每相邻的4个单元构成一个块(block),把一个块内的特征向量联起来得到36维的特征向量,用块对样本图像进行扫描,扫描步长为一个单元。最后将所有块的特征串联起来,就得到了人体的特征。例如,对于64128的图像而言,每22的单元(1616的像素)构成一个块,每个块内有49=36个特征,以8个像素为步长,那么,水平方向将有7个扫描窗口,垂直方向将有15个扫描窗口。也就是说,64128的图片,总共有367*15=3780个特征。
在行人检测过程中,除了上面提到的HOG特征提取过程,还包括彩图转灰度,亮度校正等步骤。总结一下,在行人检测中,HOG特征计算的步骤:
(1)将输入的彩图转换为灰度图;
(2)采用Gamma校正法对输入图像进行颜色空间的标准化(归一化); 目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰;
(3)计算梯度;主要是为了捕获轮廓信息,同时进一步弱化光照的干扰。
(4)将梯度投影到单元的梯度方向;目的是为局部图像区域提供一个编码,
(5)将所有单元格在块上进行归一化;归一化能够更进一步对光照、阴影和边缘进行压缩,通常,每个单元格由多个不同的块共享,但它的归一化是基于不同块的,所以计算结果也不一样。因此,一个单元格的特征会以不同的结果多次出现在最后的向量中。我们将归一化之后的块描述符就称之为HOG描述符。
(6)收集得到检测空间所有块的HOG特征;该步骤就是将检测窗口中所有重叠的块进行HOG特征的收集,并将它们结合成最终的特征向量供分类使用。
由上述两个小节介绍,我们了解到了传统方案主要由基于运动检测的算法和基于机器学习的方法,通过学习了解,我们可以看出这两个方法有它们的弊端。
上述讲述到的背景差分法,是通过背景建模的方法提取视频中的运动目标,所以我们不难看出,这里需要固定住视频视角,才能得到一个较好的背景;同时,要保证视频质量完好、视频环境&质量变化小(光线、颜色变化)。所以这就对我们的环境和设备有很大的要求和不确定因素。
计算量大/速度慢;通过hog+svm的实现流程,我们可以看出需要对整张图像进行图像金字塔和滑动窗口,这里会因为滑动的步伐小和图像的太大,使得整体算法计算量很大;
手工特征的不足;手工特征会有自己提取特征的特点,如边缘检测提取的就是边缘信息;端点检测提取的就是图像中端点信息;如果我们要判断一个人的特征,可能会根据这个人的肤色、身体轮廓、姿态等等多种特征进行结合。这是手工特征做不到的。
行人数据的多样性;和第二点一样,机器学习的方法可能可以提取到大部分人的相同特征,但是无法覆盖所有人的特征。例如每个人的穿着、外观、视角、姿态在图像上的呈现是可能不一样的,手工设计的特征可能需要根据不同人的特点设计特征,会更大程度增加计算量,而且很难全面覆盖。
上面列举的是行人检测的传统方案,基于运动检测和基于机器学习两种方案中一些具有代表性的算法。当然还有很多其他的传统算法,例如基于运动检测的方案中,还有一些比较经典的算法,如光流法、帧间差分法;基于机器学习的方案中,也有通过其他手工特征和分类器进行的行人检测,如sifi特征或者haar特征&adaboost分类器。这些都是许许多多研究者不断钻研积累的知识。由于相关内容还有很多,这里就不一一列举了,有兴趣的读者可以自行查阅相关知识。
下一篇文章,小编也会介绍目前比较流行且成熟的基于深度学习的行人检测方案,也会解决传统方案所带来的那些问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。