树莓派OpenCV+YOLO检测person时如何返回布尔值而非绘制检测框
树莓派YOLO智能监控人员检测改造方案
核心需求:检测画面中是否存在person类别,不绘制检测框,直接返回True/False布尔值,适配树莓派低算力场景。
前置确认
你当前使用的COCO数据集类别清单coco.names中,person类别的固定索引为0(即文件第一行内容),如果你的文件有自定义调整,可打开文件数到person所在行,从0开始计数得到对应ID即可。
另外注意你原有导入代码存在语法错误,正确的依赖导入写法为:
import cv2 import numpy as np import time
修改思路
- 完全移除/跳过原有绘制检测框的
YYY()函数调用,省去绘图带来的不必要算力开销,适配树莓派性能 - 在拿到YOLO模型返回的检测结果后,直接遍历检测到的类别ID,判断是否存在符合置信度要求的person类别,直接返回布尔结果即可
核心实现代码
新增人员存在判断函数:
def has_person(classes, confs, min_conf=0.6): # 替换为你自己coco.names里person对应的ID,默认COCO为0 PERSON_CLS_ID = 0 for cls_id, conf in zip(classes, confs): if int(cls_id) == PERSON_CLS_ID and float(conf) >= min_conf: return True return False
主逻辑调用示例(替换原有画框部分的逻辑即可):
# 摄像头、模型加载、帧预处理缩放逻辑保持你原有代码不变 cap = cv2.VideoCapture(0) # 这里保留你原有加载yolo模型的代码 # model = 你的模型加载逻辑 while True: ret, frame = cap.read() if not ret: break # 保留你原有帧缩放、输入模型的预处理逻辑 # 调用原有检测函数获取结果 classes, confs, boxes = XXX(frame, model) # 直接获取人员检测布尔值,无需画框 person_exist = has_person(classes, confs) # 后续自定义逻辑,比如检测到人触发告警、录制等 if person_exist: print("检测到人员") else: print("无人员") # 如需显示原始无标注画面保留以下代码,不需要可直接删除 cv2.imshow("monitor", frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
优化提示
- 置信度阈值
min_conf可以根据实际场景调整:误报多就适当调高(比如0.7),漏报多就适当调低(比如0.5) - 删掉不用的
YYY()绘图函数后,树莓派上的推理帧率会有明显提升 - 如果需要过滤画面边缘、特定区域的误检,可以在判断逻辑里加上对应box坐标的过滤规则即可
内容的提问来源于stack exchange,提问作者SCs Raspberry Pi
相关产品推荐
相关产品推荐

