AI战疫【百度大脑新品体验】口罩检测攻略
才能我浪费99 发布于2020-04 浏览:3990 回复:6
1
收藏
最后编辑于2022-04

1. 简介
口罩已成为必不可少的防疫工具,在人们佩戴口罩通过社区/校园的刷脸门禁闸机时、在企业工作人员复工在岗戴口罩情况检测时、在司机佩戴口罩驾驶时,都可以应用新能力得到很好的防疫支持作用。百度大脑先后开源了口罩检测算法模型、开放了口罩检测与戴口罩人脸识别等多项技术服务,帮助开发者快速落地应用。

飞桨开源业界首个口罩人脸检测及分类模型
通过飞桨预训练模型管理与迁移学习工具PadddleHub提供了预训练模型(pyramidbox_lite_mobile_mask/pyramidbox_lite_server_mask),可以实现一键检测人们是否佩戴口罩的应用。开发者可以免费使用该开源模型,使用几行代码即可快速上手,有效检测在密集人流区域中携带和未携戴口罩的所有人脸,同时判断是否佩戴口罩。

2.PaddleHub 模型介绍
pyramidbox_lite_mobile_mask
类别图像-目标检测网络PyramidBox数据集WIDER FACE数据集 + 百度自采人脸数据集
PyramidBox-Lite是基于2018年百度发表于计算机视觉顶级会议ECCV 2018的论文PyramidBox而研发的轻量级模型,模型基于主干网络FaceBoxes,对于光照、口罩遮挡、表情变化、尺度变化等常见问题具有很强的鲁棒性。该PaddleHub Module是针对于移动端优化过的模型,适合部署于移动端或者边缘检测等算力受限的设备上,并基于WIDER FACE数据集和百度自采人脸数据集进行训练,支持预测,可用于检测人脸是否佩戴口罩。

pyramidbox_lite_server_mask
类别图像-目标检测网络PyramidBox数据集WIDER FACE数据集 + 百度自采人脸数据集
PyramidBox-Lite是基于2018年百度发表于计算机视觉顶级会议ECCV 2018的论文PyramidBox而研发的轻量级模型,模型基于主干网络FaceBoxes,对于光照、口罩遮挡、表情变化、尺度变化等常见问题具有很强的鲁棒性。该PaddleHub Module基于WIDER FACE数据集和百度自采人脸数据集进行训练,支持预测,可用于检测人脸是否佩戴口罩。


3.API说明(以pyramidbox_lite_mobile_mask为例)
选择模型版本进行安装
$ hub install pyramidbox_lite_mobile_mask==1.2.0
命令行预测示例
$ hub run pyramidbox_lite_mobile_mask --input_path "/PATH/TO/IMAGE"
$ hub run pyramidbox_lite_mobile_mask --input_file test.txt
test.txt 存放待检测图片的存放路径

API
def face_detection(
data,
use_gpu=False,
batch_size=1,
shrink=0.5,
use_multi_scale=False
)
用于检测人脸是否佩戴口罩

参数
data:dict类型,支持data和image两种key,其中:
key为data,表示value为待检测的图片数据,numpy.array类型,shape为[H, W, C],BGR格式。
key为image,表示value为待检测的图片路径。
use_gpu:bool类型,表示是否使用GPU进行预测,需要 配合环境变量 CUDA_VISIBLE_DEVICES使用
batch_size:int类型,表示批量预测时的大小,默认为1,设置越大能够同时处理越多图片,但是会带来更高的显存消耗
shrink:float类型 (0, 1],用于设置图片的缩放比例,该值越大,则对于输入图片中的小尺寸人脸有更好的检测效果(模型计算成本越高),反之则对于大尺寸人脸有更好的检测效果。
use_multi_scale:bool类型,用于设置是否开启多尺度的人脸检测,开启多尺度人脸检测能够更好的检测到输入图像中不同尺寸的人脸,但是会增加模型计算量,降低预测速度

返回
result:list类型,每个元素为对应输入图片的预测结果。预测结果为dict类型,有data、id等字段,含义如下:
id 该检测结果属于第几张输入图片
data 检测数据:
left 检测结果左上角x坐标
top 检测结果左上角y坐标
right 检测结果右下角x坐标
bottom 检测结果右下角y坐标
confidence 检测结果的置信度
label 检测结果的标签,MASK表示戴口罩,NO MASK表示未戴口罩。

示例

如果输入一张图片,存在两个人脸检测结果,其中一个戴口罩,一个未戴口罩,则返回数据如下:

[{
"data": {"label": "MASK", "left": ..., "right": ..., "top": ...,"bottom": ...,"confidence": ...},
"id": 1
}, {
"data": {"label": "NO MASK", "left": ..., "right": ..., "top": ...,"bottom": ...,"confidence": ...},
"id": 1
}]

预测代码示例
import paddlehub as hub
import cv2

module = hub.Module(name="pyramidbox_lite_mobile_mask")

test_img_path = "/PATH/TO/IMAGE"

# set input dict
input_dict = {"data": [cv2.imread(test_img_path)]}
results = module.face_detection(data=input_dict)

# or
# input_dict = {"image": [test_img_path]}
# results = module.face_detection(data=input_dict)


4. 实际调用代码:

为了方便大家使用及测试,将相关的算法调用及展示整合成函数,具体代码如下:

import paddlehub as hub
import matplotlib.pyplot as plt 
import matplotlib.image as mpimg 

def deteck_mask(modelname,origindir,resultdir,filename):
    module = hub.Module(name=modelname)
    test_img_path = origindir+filename
    # 预测结果展示
    img = mpimg.imread(test_img_path)
    plt.imshow(img) 
    plt.axis('off') 
    plt.show()
    # set input dict
    input_dict = {"image": [test_img_path]}

    # execute predict and print the result
    results = module.face_detection(data=input_dict)
    for result in results:
        print("检测结果:")
        print(result)
    test_img_path = resultdir+filename
    img = mpimg.imread(test_img_path)
    plt.imshow(img) 
    plt.axis('off') 
    plt.show()
    

此代码也在aistudio上进行了共享,地址如下:

https://aistudio.baidu.com/aistudio/projectdetail/405260

欢迎大家fork。

5. 评测结果及结论

使用以下几张图片进行测试


以下为评测结果,

首先是pyramidbox_lite_server_mask 模型
deteck_mask("pyramidbox_lite_server_mask",'/home/aistudio/work/','/home/aistudio/detection_result/','mask1.jpg')image with bbox drawed saved as /home/aistudio/detection_result/mask1.jpg
检测结果:
{'data': {'label': 'MASK', 'left': 63.71871554851532, 'right': 189.93925189971924, 'top': 38.037339091300964, 'bottom': 202.45700633525848, 'confidence': 0.9878467}, 'id': 1, 'path': '/home/aistudio/work/mask1.jpg'}


deteck_mask("pyramidbox_lite_server_mask",'/home/aistudio/work/','/home/aistudio/detection_result/','mask2.jpg')
image with bbox drawed saved as /home/aistudio/detection_result/mask2.jpg
检测结果:
{'data': {'label': 'MASK', 'left': 703.3690795898438, 'right': 824.5521850585938, 'top': 118.49208211898804, 'bottom': 275.73615980148315, 'confidence': 0.9978162}, 'id': 1, 'path': '/home/aistudio/work/mask2.jpg'}
检测结果:
{'data': {'label': 'MASK', 'left': 410.9294738769531, 'right': 579.1947021484375, 'top': 67.17283228039742, 'bottom': 283.769607424736, 'confidence': 0.99185}, 'id': 1, 'path': '/home/aistudio/work/mask2.jpg'}
检测结果:
{'data': {'label': 'MASK', 'left': 114.37701416015625, 'right': 251.18099975585938, 'top': 140.00432786345482, 'bottom': 309.1672661304474, 'confidence': 0.99765813}, 'id': 1, 'path': '/home/aistudio/work/mask2.jpg'}

 

pyramidbox_lite_mobile_mask 模型
deteck_mask("pyramidbox_lite_mobile_mask",'/home/aistudio/work/','/home/aistudio/detection_result/','mask1.jpg')
image with bbox drawed saved as /home/aistudio/detection_result/mask1.jpg
检测结果:
{'data': {'label': 'MASK', 'left': 64.14840936660767, 'right': 192.6991994380951, 'top': 46.56964033842087, 'bottom': 203.36831045150757, 'confidence': 0.9892651}, 'id': 1, 'path': '/home/aistudio/work/mask1.jpg'}


deteck_mask("pyramidbox_lite_mobile_mask",'/home/aistudio/work/','/home/aistudio/detection_result/','mask2.jpg')
image with bbox drawed saved as /home/aistudio/detection_result/mask2.jpg
检测结果:
{'data': {'label': 'MASK', 'left': 704.7530517578125, 'right': 823.42822265625, 'top': 126.2006316781044, 'bottom': 278.8401202559471, 'confidence': 0.9955396}, 'id': 1, 'path': '/home/aistudio/work/mask2.jpg'}
检测结果:
{'data': {'label': 'MASK', 'left': 115.59180450439453, 'right': 249.70147705078125, 'top': 154.1226578950882, 'bottom': 309.7803956270218, 'confidence': 0.997866}, 'id': 1, 'path': '/home/aistudio/work/mask2.jpg'}
检测结果:
{'data': {'label': 'MASK', 'left': 406.01708984375, 'right': 573.5751342773438, 'top': 69.45692563056946, 'bottom': 285.37151646614075, 'confidence': 0.99088556}, 'id': 1, 'path': '/home/aistudio/work/mask2.jpg'}

整体测试下来发现,PaddleHub对于口罩的检测效果非常的好,识别速度很快,准确率也很高,尤其是pyramidbox_lite_mobile_mask模型,对于部分遮挡的情况都能很好的识别。

收藏
点赞
1
个赞
共6条回复 最后由用户已被禁言回复于2022-04
#7才能我浪费99回复于2020-04

相信未来会有更多的应用落地

0
#6才能我浪费99回复于2020-04

CV的应用越来越多

0
#5自尊心3回复于2020-04

确实,百度能ai实现的任务都有去涉及

0
#4才能我浪费99回复于2020-04

识别率也很优秀

0
#3才能我浪费99回复于2020-04

速度很快

0
#2才能我浪费99回复于2020-04

用起来效果很不错

0
TOP
切换版块