基于 YOLOv8/YOLOv10 的实时安防报警系统实战目标检测 邮件告警完整实现【免费下载链接】yolov10YOLOv10: Real-Time End-to-End Object Detection [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/yo/yolov10本文以当前仓库 docs/en/guides/security-alarm-system.md 为骨架系统讲解如何用 Ultralytics YOLOv8/YOLOv10 构建一套摄像头实时检测 → 检测到目标立即触发邮件告警的安防报警系统。你将掌握目标检测模型在 Python 中的调用方式、检测结果边界框与类别的解析与可视化、基于 SMTP 的邮件告警链路以及去重告警、FPS 显示等工程细节可直接用于家庭安防、机房巡检、仓库监控等实时告警场景。一、项目概览与核心思路安防报警系统的本质是一条「感知 → 判断 → 通知」的实时链路感知从摄像头或视频文件、图片流逐帧读取画面判断用 Ultralytics YOLO 模型对每帧做目标检测判断画面中是否存在目标默认是 COCO 80 类目标通知一旦检测到目标立即通过 SMTP 发送邮件告警并保证同一时间段内只发送一次避免告警风暴可视化在画面中绘制边界框、类别标签与 FPS供现场监控观察。该方案的优势在于实时性YOLO 系列模型如yolov8n.pt经过 TensorRT/ONNX 等加速后帧率可观能够对安全事件快速响应准确性YOLO 在目标检测领域以较低的误报率著称可提升安防告警的可靠性可集成性整个链路只依赖摄像头 普通 Python 环境 一个 Gmail 邮箱可无缝嵌入现有安防基础设施作为智能监控升级层。说明当前仓库已同步支持 YOLOv10模型入口导出类YOLOv10下文代码中的from ultralytics import YOLO同样适用于本仓库的yolov10n.pt等权重。二、运行环境与依赖在运行示例代码前需要确保环境满足以下依赖本仓库的 requirements.txt 已涵盖pip install ultralytics opencv-python numpy torchtorch深度学习推理后端numpy数组与数值运算opencv-pythoncv2摄像头采集、图像处理与画面显示ultralytics提供YOLO模型类与Annotator、colors等可视化工具smtplib/emailPython 标准库用于发送邮件告警无需额外安装。提示如果你只需要做 CPU 推理安装 CPU 版 PyTorch 即可若使用 GPU请按官方指引安装对应 CUDA 版本的 PyTorch。三、完整代码实现3.1 导入依赖库import torch import numpy as np import cv2 from time import time from ultralytics import YOLO from ultralytics.utils.plotting import Annotator, colors import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText要点说明Annotator与colors来自ultralytics.utils.plotting前者封装了在图像上绘制边界框、标签、关键点、掩码等能力后者是 Ultralytics 默认调色板Colors类实例实现见 ultralytics/utils/plotting.pysmtplib与email.mime是 Python 标准库负责构建并发送邮件。3.2 配置邮件发送参数password # Gmail 应用专用密码16 位 from_email # 发件邮箱必须与生成密码的邮箱一致 to_email # 收件邮箱App Password 生成提示关键前置步骤Gmail 出于安全考虑不允许第三方程序直接使用登录密码需要先生成应用专用密码App Password。打开 Google 账户的 App Password 生成页面需要已开启两步验证指定一个应用名称例如security project生成后你会得到一个 16 位密码将其复制填入上方password字段。注意from_email必须与生成 App Password 的 Gmail 邮箱一致否则 SMTP 登录会失败。若你的邮件服务商不是 Gmail请将下文的 SMTP 服务器地址替换为对应服务商的地址与端口。3.3 创建 SMTP 服务器并认证server smtplib.SMTP(smtp.gmail.com: 587) server.starttls() server.login(from_email, password)smtp.gmail.com: 587是 Gmail 的 SMTP 提交端口配合starttls()对通信进行 TLS 加密login()使用前面配置的邮箱与 App Password 完成认证。3.4 定义邮件发送函数def send_email(to_email, from_email, object_detected1): message MIMEMultipart() message[From] from_email message[To] to_email message[Subject] Security Alert # Add in the message body message_body fALERT - {object_detected} objects has been detected!! message.attach(MIMEText(message_body, plain)) server.sendmail(from_email, to_email, message.as_string())该函数将检测到的目标数量写入邮件正文ALERT - N objects has been detected!!并通过全局server对象发送。你可以根据业务需要扩展邮件内容例如附带告警时刻的画面截图用cv2.imencode编码为 base64 后通过MIMEImage附加或检测出的目标类别列表。3.5 核心检测类 ObjectDetectionclass ObjectDetection: def __init__(self, capture_index): # default parameters self.capture_index capture_index self.email_sent False # model information self.model YOLO(yolov8n.pt) # visual information self.annotator None self.start_time 0 self.end_time 0 # device information self.device cuda if torch.cuda.is_available() else cpu def predict(self, im0): results self.model(im0) return results def display_fps(self, im0): self.end_time time() fps 1 / np.round(self.end_time - self.start_time, 2) text fFPS: {int(fps)} text_size cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, 1.0, 2)[0] gap 10 cv2.rectangle(im0, (20 - gap, 70 - text_size[1] - gap), (20 text_size[0] gap, 70 gap), (255, 255, 255), -1) cv2.putText(im0, text, (20, 70), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), 2) def plot_bboxes(self, results, im0): class_ids [] self.annotator Annotator(im0, 3, results[0].names) boxes results[0].boxes.xyxy.cpu() clss results[0].boxes.cls.cpu().tolist() names results[0].names for box, cls in zip(boxes, clss): class_ids.append(cls) self.annotator.box_label(box, labelnames[int(cls)], colorcolors(int(cls), True)) return im0, class_ids def __call__(self): cap cv2.VideoCapture(self.capture_index) assert cap.isOpened() cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) frame_count 0 while True: self.start_time time() ret, im0 cap.read() assert ret results self.predict(im0) im0, class_ids self.plot_bboxes(results, im0) if len(class_ids) 0: # Only send email If not sent before if not self.email_sent: send_email(to_email, from_email, len(class_ids)) self.email_sent True else: self.email_sent False self.display_fps(im0) cv2.imshow(YOLOv8 Detection, im0) frame_count 1 if cv2.waitKey(5) 0xFF 27: break cap.release() cv2.destroyAllWindows() server.quit()3.5.1 关键设计逐段拆解构造器__init__capture_index摄像头索引0表示默认摄像头也可传入视频文件路径或图片email_sent告警去重开关保证同一持续告警期间只发一封邮件model YOLO(yolov8n.pt)首次运行会自动下载 YOLOv8n 预训练权重也可替换为yolov8s.pt、yolov8m.pt等或当前仓库的yolov10n.pt配置文件见 ultralytics/cfg/models/v10/yolov10n.yaml默认nc: 80即 COCO 80 类device cuda if torch.cuda.is_available() else cpu自动选择 GPU/CPU 推理设备。predict直接调用self.model(im0)返回一个Results列表。底层经过 DetectionPredictor.postprocess 中的 NMS非极大值抑制后处理得到最终检测框。display_fps用当前帧与上一帧的时间差计算 FPS并在画面左上角绘制半透明的 FPS 文本块便于评估检测实时性。plot_bboxes检测结果可视化核心results[0].boxes.xyxy检测框坐标格式为[x1, y1, x2, y2]见 Boxes 类定义 ultralytics/engine/results.pyresults[0].boxes.cls每个框对应的类别索引0~79对应 COCO 类别results[0].names类别索引到名称的映射字典如{0: person, ...}Annotator(im0, 3, results[0].names)以线宽 3 在图像上绘制标注Annotator 实现见 ultralytics/utils/plotting.pyself.annotator.box_label(...)为每个检测框绘制矩形与类别标签box_label 实现见 ultralytics/utils/plotting.py函数返回(im0, class_ids)其中class_ids供告警逻辑判断当前帧是否有目标。主循环__call__打开摄像头并固定采集分辨率640×480每帧依次执行读取画面 → 推理 → 绘制标注 → 告警判定 → 绘制 FPS → 显示窗口告警去重逻辑当len(class_ids) 0且email_sent为False时发送一封包含目标数量的邮件并将email_sent置True当画面中没有目标时重置为False。这样同一批持续出现的目标只通知一次避免每帧刷屏按ESC键值 27退出循环释放摄像头并关闭窗口最后调用server.quit()结束 SMTP 会话。3.6 启动检测detector ObjectDetection(capture_index0) detector()运行后即可看到YOLOv8 Detection窗口实时显示检测结果一旦检测到任意目标收件邮箱会收到一封标题为Security Alert的告警邮件。四、运行结果与告警邮件效果当摄像头画面中出现目标时画面中每个检测目标会被绘制边界框与类别名称颜色取自 Ultralytics 调色板邮箱收到Security Alert邮件正文形如ALERT - 2 objects has been detected!!目标消失后系统自动解除已发送状态下次目标重新出现时可再次触发告警。即系统保证每次目标出现 → 目标消失的周期只发送一封告警邮件而不是每帧一封。如需自定义触发策略例如只对person类别告警、只在目标停留超过 N 秒后告警可在此基础上扩展。五、进阶定制方向按类别过滤告警利用class_ids与results[0].names的映射只对指定类别如person、car发送告警减少误报模型选择yolov8n.pt是最轻量的模型追求精度可换yolov8l.pt、yolov8x.pt追求更快的端到端推理可换本仓库的yolov10n.pt告警附截图在发送邮件前用cv2.imencode(.jpg, im0)编码当前帧以MIMEImage附件形式随邮件发出多路摄像头 / 视频流将capture_index改为 RTSP 流地址即可接入网络摄像头邮件频率控制引入冷却时间如两次告警间隔至少 60 秒或将email_sent改为时间戳实现更精细的告警节流。六、总结本文以当前仓库的 security-alarm-system 指南 为主线完整实现了实时目标检测 邮件告警的安防系统通过ultralytics的YOLO模型完成逐帧检测借助Annotator实现可视化并利用 Python 标准库smtplib打通告警邮件链路同时通过email_sent标志位实现了单次告警去重。整套代码结构清晰、依赖简单读者可在此基础上按自身业务场景区域入侵检测、越界告警、异常停留检测等继续扩展。【免费下载链接】yolov10YOLOv10: Real-Time End-to-End Object Detection [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/yo/yolov10创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考