如何将YOLO输出作为其他程序的输入 实现未戴口罩语音提醒功能
口罩检测语音提示功能实现指南
1 提取YOLOv5检测结果
你已经完成自定义模型训练,只需修改官方detect.py的后处理逻辑即可拿到目标类别结果:
在遍历检测结果的代码段中,匹配without_mask对应的类别ID(假设你标注时with_mask为0、without_mask为1,可根据自己的数据集配置调整),代码示例:
# 位于detect.py的推理结果遍历逻辑中 CONF_THRESHOLD = 0.7 # 自行调整置信度阈值,避免误检 for *xyxy, conf, cls in reversed(det): class_id = int(cls) if class_id == 1 and conf > CONF_THRESHOLD: # 当前帧检测到未佩戴口罩目标 current_frame_has_no_mask = True
2 添加防抖防重复触发逻辑
为了避免单帧误检导致的误播报,建议添加连续帧检测校验和播报冷却机制:
import time # 全局变量维护状态 no_mask_frame_count = 0 FRAME_TRIGGER_THRESHOLD = 3 # 连续3帧检测到才触发 ALERT_COOLDOWN = 15 # 两次播报最小间隔15秒 last_alert_timestamp = 0 if current_frame_has_no_mask: no_mask_frame_count += 1 else: no_mask_frame_count = 0 # 判定是否需要触发播报 current_time = time.time() if no_mask_frame_count >= FRAME_TRIGGER_THRESHOLD and (current_time - last_alert_timestamp) > ALERT_COOLDOWN: need_alert = True last_alert_timestamp = current_time no_mask_frame_count = 0 # 触发后重置计数
3 集成语音播报模块
根据运行环境选择对应方案即可:
- Windows本地运行:直接调用系统SAPI接口,无需额外下载语音资源
import win32com.client speaker = win32com.client.Dispatch("SAPI.SpVoice") if need_alert: speaker.Speak("请佩戴口罩")
- 跨平台运行(Windows/Linux/macOS):使用
pyttsx3本地语音库,执行pip install pyttsx3安装后调用即可
import pyttsx3 engine = pyttsx3.init() if need_alert: engine.say("请佩戴口罩") engine.runAndWait()
- 需要自定义提示音:提前录制好mp3格式的提示音频,用
playsound库播放,执行pip install playsound安装后调用
from playsound import playsound if need_alert: playsound("your_custom_alert.mp3")
4 联调优化注意事项
- 实时推理场景建议将语音播报逻辑放在子线程执行,避免阻塞YOLOv5的帧处理导致画面卡顿
- 可根据实际使用场景调整置信度阈值、连续帧触发数量、播报冷却时间三个核心参数,平衡召回率和误触发率
- 如果需要同时记录未佩戴口罩的抓拍图片,可在触发播报的同时调用
cv2.imwrite保存当前帧即可
内容的提问来源于stack exchange,提问作者Sharma IP
相关产品推荐
相关产品推荐

