一、简介
PaddleHub是飞桨生态的预训练模型应用工具,开发者可以便捷地使用高质量的预训练模型结合Fine-tune API快速完成模型迁移到部署的全流程工作。PaddleHub提供的预训练模型涵盖了图像分类、目标检测、词法分析、语义模型、情感分析、视频分类、图像生成、图像分割、文本审核、关键点检测等主流模型。更多详情可查看:https://github.com/PaddlePaddle/PaddleHub,或官网:https://www.paddlepaddle.org.cn/hub
以paddlhub人脸检测模块 pyramidbox_lite_server_mask 进行简单尝试,实现人脸检测、有无口罩识别,可应用于超市、医院、学校、公交车等公共场所进出门口,作为未佩戴口罩提醒。最初尝试讯飞语音合成API,玩现了!于是转战百度语音合成API,终于生成了“语音提醒”,emmmm也是百度的。好吧!最后发现paddlehub也有语音合成,不过不想改了!@_@
二、环境配置
A. paddlepaddle 安装
pip3 install paddlepaddle-gpu --ignored-installed scipy -i https://mirrors.aliyun.com/pypi/simple/
B. paddlehub 安装
pip3 install paddlehub
查看安装结果:
pip3 list
C. 人脸检测模块 pyramidbox_lite_server_mask 安装
pc:~$ hub install pyramidbox_lite_server_mask==1.3.0
Downloading pyramidbox_lite_server_mask
[==================================================] 100.00%
Uncompress /home/lynxi/.paddlehub/tmp/tmp2hxc_ag8/pyramidbox_lite_server_mask
[==================================================] 100.00%
Successfully installed pyramidbox_lite_server_mask-1.3.0
D. 百度大脑AI 开放平台 语音合成 应用申请
pip3 install baidu-aip
然后在开放平台 https://console.bce.baidu.com/ai/?_=1598505791309&fromai=1#/ai/speech/overview/index
创建应用 — 产品服务 / 语音技术 - 概览 — 可用服务列表 — 语音合成 — 立即领取(开通试用权限)
管理应用 — 产品服务 / 语音技术 - 应用列表(AppID/ API Key/ Secret Key 都要用) — 点击语音合成提醒(自己的应用名) — 应用详情点查看文档 — 在线语音合成 — PythonSDK
三、应用实现
A. 代码
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import os
import cv2
import paddlehub as hub
from aip import AipSpeech
from playsound import playsound
mask_detector = hub.Module(name="pyramidbox_lite_server_mask")
#### 使用百度语音合成 API 合成语音 "语音提醒"
""" 你的 APPID AK SK """
APP_ID = 'yours'
API_KEY = 'yours'
SECRET_KEY = 'yours'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
result = client.synthesis('公共场所,请您带好口罩!', 'zh', 1, options={'vol': 5, })
# 识别正确返回语音二进制 错误则返回dict 打印错误码
if not isinstance(result, dict):
with open('warn.mp3', 'wb') as f:
f.write(result)
playsound('warn.mp3') # 播放语音提醒
else:
print("Error !", result)
####
#### 使用paddlehub 人脸检测 进行口罩识别
cap = cv2.VideoCapture("./20-05.mp4")
Open = cap.isOpened()
if not Open:
print("Maybe have no video or camera ")
while Open:
ret, frame = cap.read()
if not ret:
print("Video is Over")
break
# mask_detector 会返回检测的人脸坐标 和 有无MASK
result = mask_detector.face_detection(images=[frame])
if result:
obj_dict = result[0]
data_list = obj_dict["data"]
for obj in data_list:
label = obj["label"]
conf = obj["confidence"]
if conf < 0.95 or label == "MASK":
continue
xmin, ymin, xmax, ymax = obj["left"], obj["top"], obj["right"], obj["bottom"]
cv2.rectangle(frame, (xmin, ymin), (xmax, ymax), (0, 0, 255), 1, 1)
cv2.putText(frame, label + str(conf), (xmin, ymin), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 1)
# text_to_voice("公共场所,请您带好口罩!") # 语音合成接口
if os.path.exists('warn.mp3'):
playsound('warn.mp3') # 用百度语音合成 API合成的语音,没带口罩就会播放"语音提醒"
else:
print(label, "公共场所,请您带好口罩!")
cv2.namedWindow("frame", 0)
cv2.imshow("frame", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
cap.release()
B. 结果
网上找的视频,做了演示,感谢网友的分享!paddlehub mask_detector 进行人脸检测和有无口罩识别,没戴口罩就会播放语音提醒(语音提醒是用百度语音合成API提前生成的,也支持实时生成,试用版限制次数,生成一次后续播放就行)
四、总结
检测速度挺快,但是好像也存在误检,带白色口罩的小伙也有几帧被误检为NO MASK。总体来说,从环境配置到具体示例实验,简单便捷很是方便!
aistudio notebook 上也有展示,但notebook "语音提醒"有点小问题,不能实时播放。好吧!是我不会@...@
https://aistudio.baidu.com/aistudio/projectdetail/774353?shared=1