【行人检测】之Joint Deep Learning联合深度学习(附源码)

时间:2022-04-05 15:15:45

新近研究ICCV2013的一篇文章,《Joint Deep Learning for Pedestrian Detection》,Wanli Ouyang and Xiaogang Wang

主旨是利用CNN+Part Detection+Deformation Model+Visibility reasoning构建一个神经网络,以Caltech行人数据库的29x84的行人样本训练,从而得到一个神经网络的行人检测器。它的作用是在行人检测的后端,即最终的输出之前做最后一关的筛选,因为这个过程的效率不足以支撑sliding这样的大量检测。文中作者是以HOG+CSS+SVM为前端检测,获取的结果再以这里的方法来做检测。

模型结构

【行人检测】之Joint Deep Learning联合深度学习(附源码)

图1. 网络结构图

Neural Network的方法最核心的就是网络结构。这一点确定以后,其余的就是大部分的trick了。

输入层的预处理

输入层虽然是3channel,但却不是直接的RGB或者YUV等等三通道图,而是经过预处理阶段之后的。第一个map是原图的Y通道,第二个map被均分为四个block,行优先时分别是U通道,V通道,Y通道和全0,见下图2a;第三个map是sobel算子计算的第二个map的边缘,不同的是第四个block是前面三个block的边缘的最大值,见图2b。(注意,最终每个map都要归一到零均值-单位方差的分布)。

【行人检测】之Joint Deep Learning联合深度学习(附源码)       【行人检测】之Joint Deep Learning联合深度学习(附源码)

a            b

图2. 输入层2nd/3rd map示意图

中间层

之后的两层是典型的卷积层和mean-pooling层,不多讲。

Part Detection与Deformation Model

再之后的一层是part detection,每一个map对应人体的一个部分,由于各个部分的大小不同,所以这一层的20个map并不是像图中那样统一大小,而是使用不同大小的卷积核,得到不同size的map。而之后的Deformation Model(这没有在图中体现出来,可以认为是在图中从Part Detection Map到Part score的那个过程)是要考虑每一个部分的形变。训练获得每个part detection map的四个Deformation maps的权重,然后取这五个的加权和为summed map,该map中的最大值即为该part的score。如下图所示:

【行人检测】之Joint Deep Learning联合深度学习(附源码)

图3. Deformation Model

Visibility Reasoning

这里是针对已经获得的20个part score进行逐层推理计算。依据就是20个part之间的关系,为了解释这个逻辑先要看一下这20个part分别对应的是人体的那些部位,见下图。

【行人检测】之Joint Deep Learning联合深度学习(附源码)

图4. Part Map对应人体部分说明

把20个part分为3个level,从1到3,part描述的区域越来越大,可以想到,level高的part是和level低的part有关系的,而level低的part不依赖level高的part,这就是visibility reasoning的出发点。这里的具体过程不详细展开,感兴趣的朋友可以从文章最后的链接查看原文,或者代码(其实这个过程在代码上的体现更为简洁,并不复杂)。

经过该部分之后最终得到的就是样本的置信度,或者理解为当前sample与该网络学习到的“行人”的相似度。

实验

作者的文中提到这个检测过程的时间少于前面HOG+CSS+SVM检测过程的10%,从提供的源码来看,单个sample的检测时间大概150ms(Intel i5-3230M @ 2.60GHz,Laptop),我将源码改写成C++之后,同样的计算环境下时间降低到大概90ms。两种情况下都已使用OpenMP。

我没有使用caltech的行人数据库,使用的是NICTA数据库,正样本12521个,负样本22000个,针对在预处理阶段的几个尚未确定的细节做了实验,得到下面的图5(截至2014/04/30,仍在对部分细节进行实验),可以看到最高就是图中的绿色曲线(具体的设置就不详细展开了)了,其中纵轴是hit rate(pos判定为pos),横轴是false rate(neg判定为pos)。

【行人检测】之Joint Deep Learning联合深度学习(附源码)

图5. 不同预处理下的检测性能

总结:该方法时间上并不是很如意,不过我的代码上还留有部分可提升的空间,比如其中有不少连续内存计算的环节可以使用SSE加速,但这个环节所占比重不是很高,估计会下降10%左右,也就是10ms。检测性能上看,或许还是有些细节实现不够完善,尤其是前面的预处理阶段,还要细细斟酌,比如归一化的时候,这个步骤很关键,我仅仅按照自己的理解来做的,应当与训练数据的准备阶段保持一致,能够和作者沟通这个问题最佳。检测的性能可以参考图5.

另外这个网络结构只针对行人检测,不具有很强的普适性。


附: 

Paper:http://www.ee.cuhk.edu.hk/~xgwang/papers/ouyangWiccv13.pdf

Project Page:http://www.ee.cuhk.edu.hk/~wlouyang/projects/ouyangWiccv13Joint/index.html