本文用于记录我在第三期百度黄埔学院的学习内容和感触。
课程1:交通枢纽高密人流下的防疫筛查解决方案,主讲人为百度视觉技术部:奉孝老师
课程主要有以下四个方面的内容:
- AI多人体温度快速检测系统
- 口罩检测分类模型Pyramidbox
- 企业AI入场解决方案
- 基于深度学习的嵌入式人脸技术及行业应用
1、AI多人体体温快速检测模型
2020年,新型冠状病毒爆发,为控制病情,重点场所和公共交通的测体温和口罩检测成为了刚需。但在高密度的人流下,基层排查人员面临着几个问题:(1)人手不够,测温效率低;(2)长期暴露在人群中,受感染风险大。
为解决上述问题,百度的视觉技术相关部门在短短的一个月内完成了测温、口罩检测、身份识别等的技术开发和产品落地,相关方案在北京高铁清河站、北京地铁、百度科技园等场所应用,辅助一线人员进行防疫工作。
检测方案需要满足测量连续性、准确性、快速性和异常报警等需求。百度给出的解决方案是在固定点位设置红外摄像机采集人群的面部和温度,然后采取基于深度学习的嵌入式的AI人脸检测技术,并整合了红外热成像技术,形成了完善的人群快速测温方案。
系统由四部分组成:前端采集、边缘计算、深度学习算法和可视化展示。其中比较核心的是边缘计算设备的开发和深度学习算法。深度学习算法里提到了比较重要的指标:召回率>99%,耗时<10ms,模型的体积只有kb级。在有限的算力设备和如此小的模型下,能取得这种效果还是很厉害的。下面介绍一下涉及到的技术。
1.1 从算法训练到应用落地
研究中的算法开发和应用落地的算法开发是不同的,研究型的算法开发在强大算力的支持下追求最佳的检测效果,但在应用落地时要综合考虑算法性能和硬件成本等因素。边缘设备的算力比较差,在有限算力的限制下将模型小型化,同时保证算法的性能十分关键。这就涉及到模型选择、模型压缩和模型推理三个内容。
(1)模型选择
方案使用的框架是百度自己的PaddlePaddle(飞桨),采用PaddleCV用于模型训练,用PaddleCV有一个好处是它里面有比较优质的预训练模型,同时集成了常用的图像分类、目标检测、图像分割等算法,比如目标检测的SSD、Faster-RCNN和YOLOV3等等。口罩检测用的是百度的Pyramidbox。
PaddleCV:https://github.com/PaddlePaddle/models/tree/v1.5.1/PaddleCV
PyramidBox是WIDER FACE人脸检测的三料冠军,先看一下它的效果吧。
图中的1000张人脸被识别出890张,可以看出PyramidBox对比较小的、或者部分遮挡的人脸均有比较好的识别效果。
PyramidBox是基于anchor的目标检测网络,主架构采用了与S3FD相同的extended VGG16。FPN中提出多尺度特征融合的方式强化特征重用,提高特征图的映射,PyramidBox借鉴了这种思想,提出了low-level的FPN(LFPN)。
def _low_level_fpn(self): """ Low-level feature pyramid network. """ def fpn(up_from, up_to): ch = up_to.shape[1] b_attr = ParamAttr(learning_rate=2., regularizer=L2Decay(0.)) conv1 = fluid.layers.conv2d( up_from, ch, 1, act='relu', bias_attr=b_attr) if self.use_transposed_conv2d: w_attr = ParamAttr( learning_rate=0., regularizer=L2Decay(0.), initializer=Bilinear()) upsampling = fluid.layers.conv2d_transpose( conv1, ch, output_size=None, filter_size=4, padding=1, stride=2, groups=ch, param_attr=w_attr, bias_attr=False, use_cudnn=False) else: upsampling = fluid.layers.resize_bilinear( conv1, out_shape=up_to.shape[2:]) conv2 = fluid.layers.conv2d( up_to, ch, 1, act='relu', bias_attr=b_attr) if self.is_infer: upsampling = fluid.layers.crop(upsampling, shape=conv2) # eltwise mul conv_fuse = upsampling * conv2 return conv_fuse self.lfpn2_on_conv5 = fpn(self.conv6, self.conv5) self.lfpn1_on_conv4 = fpn(self.lfpn2_on_conv5, self.conv4) self.lfpn0_on_conv3 = fpn(self.lfpn1_on_conv4, self.conv3)
PyramidBox的一个创新点是将语境信息融入到了人脸识别中。毕竟一般人脸是不会单独出现的,身体和肩部的信息可以在人脸识别中提供语境层面的特征,这一点在面部被遮挡或部分缺失时能起到辅助效果。