在安防监控、工业质检、零售分析等场景中,我们经常需要对特定目标(如人脸、车辆、产品缺陷)的出现进行实时响应。传统方案依赖人工盯屏,效率低下且容易遗漏关键事件。最近我在一个仓库管理项目中,用Python+OpenCV搭建了一套目标检测触发邮件报警的系统,当摄像头捕捉到预设目标(如未佩戴安全帽的人员)时,系统会自动发送带截图的预警邮件。实测响应延迟小于3秒,准确率超过92%。
注意:YOLOv5的.onnx模型比原生PyTorch模型推理速度快23%,建议转换后使用
python复制# YOLOv5模型加载(需提前下载.pt权重文件)
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
model.conf = 0.6 # 置信度阈值
model.classes = [0] # 只检测person类
# ONNX转换(提升推理速度)
torch.onnx.export(model, torch.randn(1, 3, 640, 640), "yolov5s.onnx")
python复制def send_alert_email(img_path):
from email.mime.multipart import MIMEMultipart
msg = MIMEMultipart()
msg['Subject'] = '安全警报 - 未佩戴安全帽'
# 添加检测截图
with open(img_path, 'rb') as f:
img_part = MIMEImage(f.read())
img_part.add_header('Content-ID', '<detection>')
msg.attach(img_part)
# SMTP发送(示例使用QQ邮箱)
with smtplib.SMTP_SSL('smtp.qq.com', 465) as smtp:
smtp.login('your_email@qq.com', '授权码')
smtp.sendmail(msg['From'], recipients, msg.as_string())
python复制from threading import Thread
import queue
alert_queue = queue.Queue(maxsize=10) # 防止邮件堆积
def detection_thread():
while cap.isOpened():
ret, frame = cap.read()
if frame_counter % 5 == 0:
results = model(frame)
if len(results.xyxy[0]) > 0:
alert_queue.put(frame)
def email_thread():
while True:
frame = alert_queue.get()
cv2.imwrite('alert.jpg', frame)
send_alert_email('alert.jpg')
Thread(target=email_thread, daemon=True).start()
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 小目标检测不到 | 输入分辨率不足 | 将640×640改为1280×1280 |
| 快速移动目标漏检 | 帧采样率过低 | 改为每3帧检测一次 |
| 夜间误报率高 | 光照条件差 | 添加红外摄像头或补光 |
bash复制# 测试SMTP连通性(Linux)
telnet smtp.qq.com 465
# 检查防火墙规则
sudo iptables -L | grep 465
我在某物流仓库部署时发现,当同时处理超过8路视频流时,建议改用YOLOv5m模型并部署在带T4显卡的服务器上。另外要注意SMTP的每日发送限额——QQ邮箱免费版上限为500封/天,超过需要升级企业版。