AI战「疫」:百度开源口罩人脸检测及分类模型
开工上班,各地应该如何做好疫情防护?人工智能技术正在为抗击新冠肺炎疫情的工作提供必要的帮助。
2019 新冠肺炎疫情爆发,让人们的出行发生了很大的变化——自 1 月 24 日武汉宣布封城之后,各省市陆续启动重大突发公共卫生事件一级响应以控制人口流动。很多城市都已规定必须佩戴口罩、测量体温才能搭乘公共交通。2 月 10 号返工日之前,上海、北京等重点城市也陆续放出新规:出入机场、轨道交通、长途汽车站、医疗卫生机构、商场超市等公共场所,未佩戴口罩者将被劝阻。
正确佩戴口罩出门是为了防止疫情扩散,此举得到了人们的广泛支持。但也带来了很多挑战——高密度的人流让基层排查人员面临着人手不足,以及接触疑似患者的风险,只有适应新情况的人工智能技术才能减轻他们的工作压力。
2 月 13 日,百度飞桨宣布开源业界首个口罩人脸检测及分类模型。基于此模型,可以在公共场景检测大量的人脸同时,把佩戴口罩和未佩戴口罩的人脸标注出来,快速识别各类场景中不重视、不注意防护病毒,甚至存在侥幸心理的人,减少公众场合下的安全隐患。同时构建更多的防疫公益应用。
大灾面前,这家科技公司可谓用行动回应了民政部司长陈越良的呼吁:「一个有益的公益软件比捐 10 个亿还管用!」
业内首度开源口罩人脸检测及分类模型
口罩人脸检测及分类模型,由两个功能单元组成,可以分别完成口罩人脸的检测和口罩人脸的分类。经过测试,口罩人脸检测部分在准确度上达到了 98%,且口罩人脸分类部分准确率同样达到了 96.5%,性能上也是属于业界领先水平。
同时,它做到了模型的极致轻量化,可在大部分端边云设备上实现实时处理(海思 3559 芯片耗时仅需 17ms)。百度也将持续更新这一模型,不断提升效果。
百度表示,如此高的准确率是大量数据训练的结果,新模型采用了超过十万张图片的训练数据,确保样本量足够且有效。另一方面,人脸检测模型基于百度自研的冠军算法,整个研发过程都是基于百度开源的飞桨深度学习平台,能够进行高效、便捷的模型开发、训练、部署。
我们可以先看看口罩人脸检测及分类模型的效果,其中绿色边界框为戴口罩人脸、红色边界框为不戴口罩人脸。百度团队还提供了在线演示页面,我们可以自己上传图片,并测试模型的效果:
在线演示地址:https://www.paddlepaddle.org.cn/hub/scene/maskdetect
预训练模型,立即部署
如果我们自己有需求且有数据,那么使用深度学习框架从头开始训练也是非常不错的选择。但是毫无疑问成本较高,而与此同时,百度将自己训练出来的口罩人脸检测及分类模型,通过预训练模型的方式开放,可以极大的帮忙开发者节省资源,提升效率。
百度飞桨通过预训练模型管理工具 PaddleHub,将口罩人脸检测及分类预训练模型开源出来。只要开发者有基本的 Python 编程能力,即可快速搭建本地或者 serving 服务调用模型。如果具有一定的移动端 APP 开发能力,也可以快速将模型部署到移动端上。
预训练模型介绍:https://www.paddlepaddle.org.cn/hubdetail?name=pyramidbox_lite_server_mask&en_category=ObjectDetection
预训练模型示例代码:https://aistudio.baidu.com/aistudio/projectDetail/267322
顶尖算法与数据
这一方案中,用于识别人脸的模型基于 2018 年百度在国际顶级计算机视觉会议 ECCV 2018 的论文 PyramidBox 而研发,基于自研的飞桨开源深度学习平台进行训练,并通过 paddle-slim 等模型小型化技术使得算法能够高效运行在一些算力有限的设备上。
算法代码地址:https://github.com/PaddlePaddle/models/tree/develop/PaddleCV/face_detection
口罩人脸检测及分类模型,可在公共场所高密度人流的环境中,对佩戴口罩和未佩戴口罩的人脸进行快速识别标注。基于此预训练模型,开发者仅需使用少量代码,便可快速完成自有场景模型开发。
该模型可广泛适用于海关、火车站、园区小区入口等不同类型的区域,同时提供服务器和移动端版本,便于开发商集成到不同类型硬件平台上满足不同场景要求。非常适合于重点区域的布控,以及未佩戴口罩人员的及时预警。
如果口罩人脸检测及分类模型获得广泛应用,对于检测结果的统计数据还可以为更加深入的研究提供基础。百度表示,检测结果可以可以在疫情分析、智慧城市、智慧社区等场景发挥较大作用。
在这段时间里,很多科技公司陆续推出了有关体温检测、人脸识别等工作的 AI 算法。而百度提出的方法,是首个开源的口罩人脸检测及分类模型。从飞桨深度学习技术平台,到高效精确的人脸检测及识别算法,再到硬件部署方案等,百度提出的方法可以与和其他工具实现完整、高效的整体协同。
实践怎么用
整个预训练模型只要求安装 PaddlePaddle 与 PaddleHub,只需要了解基础 Python 就能跑得动。如下短视频展示了我们测试戴口罩人脸检测模型:
如上展示了最简单的本地推断,只要五行代码,我们就可以在自己的计算机处理口罩人脸检测。为了展示效果,我们设置了每张图像停留 2 秒。实际在我们采用 CPU 的情况下,检测基本是实时的,推断速度非常快。以下为调用预训练模型的核心代码,其中我们在当前文件夹下放了一张测试图像:
import paddlehub as hub # 加载模型,本例为服务器端模型pyramidbox_lite_server_mask # 移动端模型参数可以换成pyramidbox_lite_mobile_mask module = hub.Module(name="pyramidbox_lite_server_mask") # 设置输入数据 input_dict = {"image": ["test.jpg"]} for data in module.face_detection(data=input_dict): print(data)
百度提供了口罩人脸检测及分类的示例代码,通过 Notebook 文件,我们能更形象地了解模型使用的完整过程:
地址:https://aistudio.baidu.com/aistudio/projectDetail/267322
更重要的是,作为一项完善的开源工作,除了本地推断以外,其还需要考虑如何将模型部署到服务器或移动设备中。若能快速部署到各平台,那么才真正意味着它可以作为「战疫」的基础工具。
目前,百度提供了两个预训练模型,即服务器端口罩人脸检测及分类模型「pyramidbox_lite_server_mask」、以及移动端口罩人脸检测及分类模型「pyramidbox_lite_mobile_mask」,这两者能满足各种下游任务。
1. 一步部署服务器
借助 PaddleHub,服务器端的部署也非常简单,直接用一条命令行在服务器启动口罩人脸检测与分类模型就行了:
hub serving start -m pyramidbox_lite_server_mask -p 8866
是的,在服务器端这就完全没问题了。相比手动配置各种参数或者调用各种框架,PaddleHub 部署服务器实在是太好用了。
只要在服务器端完成部署,剩下在客户端调用就不会有多大问题了。如下百度展示了调用服务器做推断的示例:制定要预测的图像列表、发出推断请求、返回并保存推断结果。
# 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 已经帮我们做好了各种处理过程。
2. 部署到移动端
Paddle Lite 是飞桨的端侧推理引擎,专门面向移动端的模型推理部署。如果我们需要把口罩人脸检测及分类模型嵌入到手机等移动设备,那么 Paddle Lite 这样的端侧推理引擎能帮我们节省很多工作。
在移动端部署口罩人脸检测及分类模型,也只需要三步:①下载预测库,Paddle Lite 会提供编译好的预测库;②优化模型,使用 model_optimize_tool 工具实现模型优化;③通过预测 API 实现调用。
Paddle Lite 介绍:https://github.com/PaddlePaddle/Paddle-Lite/
其中比较重要的是移动端 API 调用方法,具体实现请参考下文给出的 Paddle Lite 的示例地址。
// 读取图片 cv::Mat img = imread(img_path, cv::IMREAD_COLOR); // 加载人脸检测或者口罩佩戴判别模型 MobileConfig config; config.set_model_dir(model_dir); PaddlePredictor* predictor = CreatePaddlePredictor<MobileConfig>(config); // 设置输入 Tensor* input_tensor = predictor->GetInput(0); input_tensor->Resize({1, 3, img.rows,img.cols}); set_input(img, input_tensor); //调用自定义函数 // 执行 predictor->Run(); // 输出结果 Tensor* output_tensor = predictor->GetOutput(0); show_output(img, output_tensor); //调用自定义函数
人脸识别和佩戴口罩判断在移动端部署的示例地址为:https://github.com/PaddlePaddle/Paddle-Lite/tree/develop/lite/demo/cxx
助力开发者,共同抗击疫情
口罩人脸检测及分类模型项目的研发人员向机器之心介绍道,百度在春节期间就已频繁接触到来自社区和合作伙伴反馈的技术需求,并快速启动了对接和应用开发的行动。对此,百度专门成立了针对新冠疫情的技术研发团队,经过论证,开发者们一致认为最终完成的产品应通过开源的方式来赋能更多开发者。
百度很快组织了多部门组成的产研团队,在多个部门的配合下,工程师们快速进入了方案实施落地的阶段。
由于很多城市对于交通进行了管制,在项目的开发过程中,大多数人都是以远程开发的形式参与的。百度研发人员表示,得益于百度内部高效的协同办公、开发系统,整体研发进度可以保持快速迭代。
此前,仅有少数厂商能够提供口罩人脸检测模型的可落地方案,这些技术在密集人流下的识别效果不尽相同。而由于缺乏数据集和模型开发经验,很多解决方案在面临园区、关口等细分场景时显得无从下手。
口罩人脸检测及分类模型可以成为很多应用的基础,除了筛查公共场所佩戴情况之外,检测口罩佩戴是否正确、监测体温的应用都可以通过借助这项能力更快实现落地。此次百度除了开源模型以外,还提供了二次开发工具组件,我们可以开发更适合自己的模型。
在支持的硬件方面,该模型可以高效运行在百度官方和经过第三方认证的硬件平台上。此外,这一模型也支持目前市面上多类主流硬件平台。