四篇人脸检测论文速读与实践
1.《FaceBoxes: A CPU Real-time Face Detector with High Accuracy》
code:https://github.com/sfzhang15/FaceBoxes
这篇论文主要就是将不用层次的特征图用于检测不同尺度大小的人脸(自SSD 等开始,全都是这种套路),先上整体结构图:
上图清晰地可以看到网络结构分为两大部分,分别是:
- the Rapidly Digested Convolutional Layers (RDCL) :用于提取主干特征,这里主要是考虑如何加速,包括使用合适地卷积核大小,通道数等,还有激活函数采用CReLU可以减半通道数等,CReLU结构如下:
- Multiple Scale Convolutional Layers :这个模块是提供多尺度人脸检测特征图,采用 Inception:
作者在anchor这一步考虑 人脸大小地不一致,anchor采样的密度也不一样,导致对于小脸来说anchor的密度太低了,这样不好,所以作者采用下图:
看不太清楚没有关系,可以看一下相关代码:
class PriorBox(object):
def __init__(self, cfg, image_size=None, phase='train'):
super(PriorBox, self).__init__()
#self.aspect_ratios = cfg['aspect_ratios']
self.min_sizes = cfg['min_sizes']
self.steps = cfg['steps']
self.clip = cfg['clip']
self.image_size = image_size
self.feature_maps = [[ceil(self.image_size[0]/step), ceil(self.image_size[1]/step)] for step in self.steps]
def forward(self):
anchors = []
for k, f in enumerate(self.feature_maps):
min_sizes = self.min_sizes[k]
for i, j in product(range(f[0]), range(f[1])):
for min_size in min_sizes:
s_kx = min_size / self.image_size[1]
s_ky = min_size / self.image_size[0]
if min_size == 32: # 就在这里
dense_cx = [x*self.steps[k]/self.image_size[1] for x in [j+0, j+0.25, j+0.5, j+0.75]]
dense_cy = [y*self.steps[k]/self.image_size[0] for y in [i+0, i+0.25, i+0.5, i+0.75]]
for cy, cx in product(dense_cy, dense_cx):
anchors += [cx, cy, s_kx, s_ky]
elif min_size == 64:
dense_cx = [x*self.steps[k]/self.image_size[1] for x in [j+0, j+0.5]]
dense_cy = [y*self.steps[k]/self.image_size[0] for y in [i+0, i+0.5]]
for cy, cx in product(dense_cy, dense_cx):
anchors += [cx, cy, s_kx, s_ky]