近日,百度宣布免费开源业内首个口罩人脸检测及分类模型。该模型可以有效检测在密集人流区域中携带和未携戴口罩的所有人脸,同时判断该者是否佩戴口罩。目前已通过飞桨PaddleHub开源,广大开发者用几行代码即可快速上手,免费调用。

 

用AI抗疫!百度免费开源口罩人脸检测及分类模型_经验分享

 

此次宣布免费开源的自研口罩人脸检测及分类模型,是基于2018年百度收录于国际顶级计算机视觉会议ECCV的论文PyramidBox研发,人脸口罩判断模型可实现对人脸是否佩戴口罩的判定,口罩判别准确率达到96.5%,满足常规口罩检测需求。在线演示

 

用AI抗疫!百度免费开源口罩人脸检测及分类模型_经验分享_02

 

百度还提供在线演示网址站,上图为演示效果,绿色边界框为戴口罩人脸、红色边界框为不戴口罩人脸。感兴趣的开发者可自己上传图片测试模型的效果。飞桨预训练模型管理与迁移学习工具PadddleHub已提供PyramidBox预训练模型(pyramidbox_lite_mobile_mask/pyramidbox_lite_server_mask)用于一键检测人们是否佩戴口罩。同时PaddleHub还提供了飞桨生态下的高质量预训练模型,涵盖了图像分类、目标检测、词法分析、语义模型、情感分析、视频分类、图像生成、图像分割、文本审核、关键点检测等主流模型。如果你在本地运行该项目示例,需要首先安装PaddleHub。如果你在线运行,需要首先fork该项目示例。之后按照该示例操作即可:

 

!pip install --upgrade paddlehub -i https://pypi.tuna.tsinghua.edu.cn/simple

 

 

一、定义待预测数据以本示例中文件夹下test_mask_detection.png为待预测图片

 

# 待预测图片
test_img_path = ["./test_mask_detection.jpg"]


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

img = mpimg.imread(test_img_path[0]) 

# 展示待预测图片
plt.figure(figsize=(10,10))
plt.imshow(img) 
plt.axis('off') 
plt.show()

 

用AI抗疫!百度免费开源口罩人脸检测及分类模型_经验分享_03

 

是待预测图片存放在一个文件中,如左侧文件夹所示的test.txt。每一行是待预测图片的存放路径。

 

!cat test.txt
./test_mask_detection.jpg

 

用户想要利用完成对该文件的口罩检测,只需读入该文件,将文件内容存成list,list中每个元素是待预测图片的存放路径。

 

with open('test.txt', 'r') as f:
    test_img_path=[]
    for line in f:
        test_img_path.append(line.strip())
print(test_img_path)
['./test_mask_detection.jpg']

 

二、加载预训练模型PaddleHub口罩检测提供了两种预训练模型,pyramidbox_lite_mobile_mask和pyramidbox_lite_server_mask。二者均是基于2018年百度发表于计算机视觉顶级会议ECCV 2018的论文PyramidBox而研发的轻量级模型,模型基于主干网络FaceBoxes,对于光照、口罩遮挡、表情变化、尺度变化等常见问题具有很强的鲁棒性。不同点在于,pyramidbox_lite_mobile_mask是针对于移动端优化过的模型,适合部署于移动端或者边缘检测等算力受限的设备上。

 

import paddlehub as hub

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

 

三、预测PaddleHub对于支持一键预测的module,可以调用module的相应预测API,完成预测功能。

 

input_dict = {"image": test_img_path}

# execute predict and print the result
results = module.face_detection(data=input_dict)
for result in results:
    print(result)

# 预测结果展示
img = mpimg.imread("detection_result/test_mask_detection.jpg")
plt.figure(figsize=(10,10))
plt.imshow(img) 
plt.axis('off') 
plt.show()

 

四、部署服务器借助 PaddleHub,服务器端的部署也非常简单,直接用一条命令行在服务器启动口罩人脸检测与分类模型就行了:

 

$ hub serving start -m pyramidbox_lite_server_mask -p 8866

 

只要在服务器端完成部署,剩下在客户端调用就不会有多大问题了。如下百度展示了调用服务器做推断的示例:制定要预测的图像列表、发出推断请求、返回并保存推断结果:

 

# coding: utf8
import requests
import json
import base64
import os

# 指定要检测的图片并生成列表[("image", img_1), ("image", img_2), ... ]
file_list = ["test.jpg"]
files = [("image", (open(item, "rb"))) for item in file_list]

# 指定检测方法为pyramidbox_lite_server_mask并发送post请求
url = "http://127.0.0.1:8866/predict/image/pyramidbox_lite_server_mask"
r = requests.post(url=url, files=files)

results = eval(r.json()["results"])

# 保存检测生成的图片到output文件夹,打印模型输出结果
if not os.path.exists("output"):
    os.mkdir("output")
for item in results:
    with open(os.path.join("output", item["path"]), "wb") as fp:
        fp.write(base64.b64decode(item["base64"].split(',')[-1]))
        item.pop("base64")
print(json.dumps(results, indent=4, ensure_ascii=False))

 

相信只要有一些 Python 基础,在本地预测、以及部署到服务器端都是没问题的,飞桨的 PaddleHub 已经帮我们做好了各种处理过程。

 

 

五、移动端部署

 

Paddle Lite 是飞桨的端侧推理引擎,专门面向移动端的模型推理部署。如果我们需要把口罩人脸检测及分类模型嵌入到手机等移动设备,那么 Paddle Lite 这样的端侧推理引擎能帮我们节省很多工作。在移动端部署口罩人脸检测及分类模型,也只需要三步:

①下载预测库,Paddle Lite 会提供编译好的预测库;②优化模型,使用 model_optimize_tool 工具实现模型优化;③通过预测 API 实现调用。