
在实际公共安全监控和智能安防项目中危险武器的自动识别检测是一个重要但技术挑战较大的任务。传统人工监控效率低、易疲劳而基于深度学习的目标检测技术能够实现7×24小时不间断监测快速识别刀具、枪支等危险物品。本文将基于YOLOv8算法从零构建一个完整的危险武器识别检测系统涵盖环境配置、模型训练、界面开发和实际部署的全流程。这个系统适合有一定Python和深度学习基础的开发者特别是从事安防监控、智能安检、边缘计算部署的技术人员。通过本文你将掌握如何将YOLOv8应用于特定领域的检测任务并学会处理从数据准备到界面集成的完整工程链路。1. 理解YOLOv8在危险武器检测中的优势YOLOv8是Ultralytics公司在2023年发布的单阶段目标检测算法的最新版本相比前代YOLOv5在精度和速度平衡上有了显著提升。对于危险武器检测这类需要实时响应且对误报敏感的应用场景YOLOv8的几个关键改进特别有价值。1.1 YOLOv8的核心架构改进YOLOv8采用Anchor-Free设计不再依赖预定义的锚点框简化了训练流程并减少超参数调优的复杂度。其Backbone网络使用C2f模块替代原来的C3模块增强了梯度流和特征表达能力。Decoupled Head将分类和回归任务分离让模型能够更专注地学习不同任务的特征表示。在危险武器检测中武器目标往往尺度变化大从近距离的大刀具到远距离的小枪支且可能存在部分遮挡。YOLOv8的Task-Aligned Assigner能够更智能地进行正负样本分配提升小目标和遮挡目标的检测效果。1.2 危险武器检测的技术挑战危险武器检测面临几个特有挑战首先公开的危险武器数据集相对稀缺需要自行收集和标注其次武器在监控画面中通常占比小属于小目标检测问题第三不同光照条件、拍摄角度下的武器外观差异大最后实际部署时需要平衡检测精度和推理速度。YOLOv8通过多尺度特征融合和高效的特征金字塔网络FPNPAN结构能够较好地处理尺度变化问题。其支持的各种数据增强策略也有助于模型适应不同的环境条件。2. 环境配置与依赖安装构建YOLOv8危险武器检测系统前需要准备合适的开发环境。以下是推荐的环境配置方案支持从学习测试到生产部署的不同需求。2.1 硬件和基础软件要求最低配置学习测试CPUIntel i5或同等性能处理器内存8GB RAM存储50GB可用空间GPU集成显卡仅CPU推理推荐配置开发训练CPUIntel i7或AMD Ryzen 7内存16GB RAM存储100GB SSDGPUNVIDIA GTX 1660 6GB或更高生产环境配置GPUNVIDIA RTX 3060 12GB或专业级显卡内存32GB RAM存储500GB NVMe SSD操作系统建议使用Ubuntu 20.04/22.04 LTS或Windows 10/11Python版本推荐3.8-3.10。2.2 Python环境搭建使用Conda创建独立的Python环境避免包冲突# 创建并激活环境 conda create -n yolov8-weapon python3.9 conda activate yolov8-weapon # 安装PyTorch根据CUDA版本选择 # CUDA 11.8版本 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 或CPU版本 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu # 安装YOLOv8和相关依赖 pip install ultralytics pip install opencv-python pip install pillow pip install matplotlib pip install seaborn pip install pandas2.3 界面开发依赖系统使用PyQt5构建图形界面提供更好的用户体验# 安装界面相关依赖 pip install PyQt5 pip install pyqt5-tools pip install qdarkstyle # 可选深色主题 # 安装日志和工具库 pip install tqdm pip install scikit-learn2.4 环境验证创建验证脚本检查环境是否正确安装# check_environment.py import torch import cv2 import ultralytics from PyQt5 import QtWidgets import sys print(fPyTorch版本: {torch.__version__}) print(fCUDA可用: {torch.cuda.is_available()}) if torch.cuda.is_available(): print(fGPU设备: {torch.cuda.get_device_name(0)}) print(fOpenCV版本: {cv2.__version__}) print(fUltralytics版本: {ultralytics.__version__}) # 测试PyQt5 app QtWidgets.QApplication(sys.argv) print(PyQt5环境正常)运行验证脚本应输出各组件版本信息无错误提示。3. 危险武器数据集准备与处理高质量的数据集是模型性能的基础。由于危险武器检测的敏感性公开数据集较少需要掌握数据收集、标注和增强的全流程。3.1 数据收集策略危险武器数据收集需要考虑多样性和代表性来源多样性从公开数据集、网络图片、模拟场景拍摄等多渠道收集场景覆盖包含室内外、不同光照、不同角度、不同背景武器类型涵盖手枪、步枪、刀具、爆炸物等常见危险物品尺度变化包含远近不同距离的拍摄效果建议初始数据集规模在3000-5000张图像按7:2:1划分训练集、验证集和测试集。3.2 数据标注规范使用YOLO格式进行标注每个图像对应一个.txt标注文件# 标注格式class_id x_center y_center width height # 坐标值归一化到[0,1] 0 0.455 0.323 0.121 0.234 # 手枪 1 0.678 0.512 0.089 0.167 # 刀具标注工具推荐使用LabelImg或LabelStudio# 安装LabelImg pip install labelImg labelImg # 启动标注工具标注时注意边界框要紧贴目标边缘避免过大或过小。对于遮挡目标标注可见部分即可。3.3 数据增强策略针对危险武器检测的特点设计针对性的数据增强# data_augmentation.py import albumentations as A # 定义增强管道 transform A.Compose([ A.HorizontalFlip(p0.5), A.RandomBrightnessContrast(p0.2), A.RandomGamma(p0.2), A.Blur(blur_limit3, p0.1), A.MotionBlur(blur_limit3, p0.1), A.RandomSizedBBoxSafeCrop(height640, width640, p0.5), A.HueSaturationValue(hue_shift_limit20, sat_shift_limit30, val_shift_limit20, p0.3), ], bbox_paramsA.BboxParams(formatyolo, label_fields[class_labels]))增强策略要平衡多样性和真实性避免过度增强导致模型学习到不真实的特征。3.4 数据集目录结构规范的数据集结构便于管理和训练weapon_dataset/ ├── images/ │ ├── train/ # 训练图像 │ ├── val/ # 验证图像 │ └── test/ # 测试图像 ├── labels/ │ ├── train/ # 训练标注 │ ├── val/ # 验证标注 │ └── test/ # 测试标注 ├── dataset.yaml # 数据集配置文件 └── README.md # 数据集说明dataset.yaml配置文件内容# dataset.yaml path: /path/to/weapon_dataset # 数据集根路径 train: images/train # 训练集路径 val: images/val # 验证集路径 test: images/test # 测试集路径 nc: 3 # 类别数量 names: [pistol, knife, rifle] # 类别名称4. YOLOv8模型训练与优化有了高质量数据集后下一步是模型训练和调优。YOLOv8提供了简洁的API但正确的超参数设置对性能至关重要。4.1 模型选择与初始化YOLOv8提供多种规模的预训练模型根据部署需求选择# model_selection.py from ultralytics import YOLO # 根据需求选择模型规模 model_sizes { nano: yolov8n.pt, # 最快精度较低 small: yolov8s.pt, # 平衡型 medium: yolov8m.pt, # 推荐用于武器检测 large: yolov8l.pt, # 高精度速度较慢 xlarge: yolov8x.pt # 最高精度 } # 加载预训练模型 model YOLO(model_sizes[medium])对于危险武器检测推荐使用yolov8m模型在精度和速度间取得较好平衡。4.2 训练参数配置YOLOv8训练支持丰富的参数配置关键参数需要针对武器检测任务调整# training_config.py training_config { data: weapon_dataset/dataset.yaml, epochs: 100, imgsz: 640, batch: 16, device: 0, # GPU设备IDNone为CPU workers: 4, optimizer: auto, lr0: 0.01, # 初始学习率 lrf: 0.01, # 最终学习率 momentum: 0.937, weight_decay: 0.0005, warmup_epochs: 3.0, warmup_momentum: 0.8, box: 7.5, # 框损失权重 cls: 0.5, # 分类损失权重 dfl: 1.5, # DFL损失权重 fl_gamma: 0.0, # Focal损失gamma label_smoothing: 0.0, save_period: -1, seed: 42, deterministic: True }4.3 开始训练使用配置好的参数启动训练过程# start_training.py from ultralytics import YOLO # 加载模型 model YOLO(yolov8m.pt) # 开始训练 results model.train( dataweapon_dataset/dataset.yaml, epochs100, imgsz640, batch16, device0, workers4, saveTrue, exist_okTrue, pretrainedTrue, verboseTrue )训练过程中会输出损失曲线和评估指标便于监控训练状态。4.4 训练监控与评估YOLOv8自动生成训练日志和可视化结果# monitor_training.py from ultralytics.utils import plots # 查看训练结果 results model.val() # 在验证集上评估 # 关键指标解读 print(fmAP50: {results.box.map50:.4f}) # IoU0.5时的mAP print(fmAP50-95: {results.box.map:.4f}) # IoU0.5:0.95的平均mAP print(fPrecision: {results.box.precision:.4f}) # 精确率 print(fRecall: {results.box.recall:.4f}) # 召回率 # 绘制损失曲线 plots.plot_training_losses(runs/detect/train/results.csv)理想的训练结果应该是损失平稳下降验证指标持续提升过拟合迹象不明显。4.5 模型导出与优化训练完成后根据部署需求导出合适格式的模型# export_model.py from ultralytics import YOLO # 加载训练好的模型 model YOLO(runs/detect/train/weights/best.pt) # 导出为不同格式 model.export(formatonnx) # ONNX格式通用部署 model.export(formatengine) # TensorRT引擎NVIDIA GPU加速 model.export(formatopenvino) # OpenVINO格式Intel硬件加速 model.export(formattflite) # TFLite格式移动端部署5. 检测系统界面开发基于PyQt5开发用户友好的图形界面集成YOLOv8检测功能提供完整的系统操作体验。5.1 界面架构设计采用MVC模式设计界面架构ui_architecture/ ├── models/ # 数据模型 │ ├── detection_model.py # 检测模型封装 │ └── user_manager.py # 用户管理 ├── views/ # 界面视图 │ ├── main_window.py # 主窗口 │ ├── login_dialog.py # 登录对话框 │ └── settings_panel.py # 设置面板 ├── controllers/ # 控制器 │ ├── detection_controller.py # 检测控制 │ └── file_controller.py # 文件操作控制 └── utils/ # 工具类 ├── config_loader.py # 配置加载 └── logger.py # 日志管理5.2 主界面实现主界面采用三栏布局左侧控制区、中央显示区、右侧信息区# main_window.py from PyQt5.QtWidgets import (QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QSlider, QCheckBox, QGroupBox, QListWidget, QTabWidget, QStatusBar) from PyQt5.QtCore import Qt, QThread, pyqtSignal from PyQt5.QtGui import QPixmap, QImage import cv2 class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle(危险武器检测系统) self.setGeometry(100, 100, 1400, 800) # 中央部件 central_widget QWidget() self.setCentralWidget(central_widget) # 主布局 main_layout QHBoxLayout(central_widget) # 左侧控制面板 self.setup_left_panel(main_layout) # 中央显示区域 self.setup_center_panel(main_layout) # 右侧信息面板 self.setup_right_panel(main_layout) # 状态栏 self.setup_status_bar() def setup_left_panel(self, main_layout): left_panel QWidget() left_layout QVBoxLayout(left_panel) # 检测源选择 source_group QGroupBox(检测源) source_layout QVBoxLayout(source_group) self.btn_image QPushButton(图片检测) self.btn_video QPushButton(视频检测) self.btn_camera QPushButton(摄像头检测) source_layout.addWidget(self.btn_image) source_layout.addWidget(self.btn_video) source_layout.addWidget(self.btn_camera) # 参数设置 param_group QGroupBox(检测参数) param_layout QVBoxLayout(param_group) # 置信度阈值 self.confidence_label QLabel(置信度阈值: 0.25) self.confidence_slider QSlider(Qt.Horizontal) self.confidence_slider.setRange(0, 100) self.confidence_slider.setValue(25) # IoU阈值 self.iou_label QLabel(IoU阈值: 0.45) self.iou_slider QSlider(Qt.Horizontal) self.iou_slider.setRange(0, 100) self.iou_slider.setValue(45) param_layout.addWidget(self.confidence_label) param_layout.addWidget(self.confidence_slider) param_layout.addWidget(self.iou_label) param_layout.addWidget(self.iou_slider) left_layout.addWidget(source_group) left_layout.addWidget(param_group) left_layout.addStretch() main_layout.addWidget(left_panel, 1) def setup_center_panel(self, main_layout): center_panel QWidget() center_layout QVBoxLayout(center_panel) # 显示标签 self.display_label QLabel() self.display_label.setAlignment(Qt.AlignCenter) self.display_label.setMinimumSize(640, 480) self.display_label.setText(请选择检测源) self.display_label.setStyleSheet(border: 1px solid gray;) center_layout.addWidget(self.display_label) # 控制按钮 control_layout QHBoxLayout() self.btn_start QPushButton(开始检测) self.btn_stop QPushButton(停止检测) self.btn_save QPushButton(保存结果) control_layout.addWidget(self.btn_start) control_layout.addWidget(self.btn_stop) control_layout.addWidget(self.btn_save) center_layout.addLayout(control_layout) main_layout.addWidget(center_panel, 2) def setup_right_panel(self, main_layout): right_panel QWidget() right_layout QVBoxLayout(right_panel) # 标签页 self.tab_widget QTabWidget() # 检测结果页 result_tab QWidget() result_layout QVBoxLayout(result_tab) self.result_list QListWidget() result_layout.addWidget(QLabel(检测结果:)) result_layout.addWidget(self.result_list) # 统计信息页 stats_tab QWidget() stats_layout QVBoxLayout(stats_tab) self.stats_label QLabel(统计信息将显示在这里) stats_layout.addWidget(self.stats_label) self.tab_widget.addTab(result_tab, 检测结果) self.tab_widget.addTab(stats_tab, 统计信息) right_layout.addWidget(self.tab_widget) main_layout.addWidget(right_panel, 1) def setup_status_bar(self): self.status_bar QStatusBar() self.setStatusBar(self.status_bar) self.status_bar.showMessage(系统就绪) def update_display(self, image): 更新显示图像 if image is not None: # 转换OpenCV图像为Qt图像 rgb_image cv2.cvtColor(image, cv2.COLOR_BGR2RGB) h, w, ch rgb_image.shape bytes_per_line ch * w qt_image QImage(rgb_image.data, w, h, bytes_per_line, QImage.Format_RGB888) pixmap QPixmap.fromImage(qt_image) self.display_label.setPixmap(pixmap.scaled( self.display_label.width(), self.display_label.height(), Qt.KeepAspectRatio ))5.3 检测线程实现使用QThread实现异步检测避免界面卡顿# detection_thread.py from PyQt5.QtCore import QThread, pyqtSignal from ultralytics import YOLO import cv2 class DetectionThread(QThread): # 信号定义 frame_processed pyqtSignal(object, list) # 图像帧和检测结果 fps_updated pyqtSignal(float) # FPS更新 finished_signal pyqtSignal() # 完成信号 def __init__(self, model_path, source0, conf0.25, iou0.45): super().__init__() self.model_path model_path self.source source self.conf conf self.iou iou self.is_running False self.model None def run(self): 线程主循环 self.is_running True # 加载模型 try: self.model YOLO(self.model_path) except Exception as e: print(f模型加载失败: {e}) return # 打开视频源 if isinstance(self.source, str): cap cv2.VideoCapture(self.source) # 视频文件 else: cap cv2.VideoCapture(self.source) # 摄像头 if not cap.isOpened(): print(无法打开视频源) return # 检测循环 while self.is_running: ret, frame cap.read() if not ret: break # 执行检测 results self.model.predict( frame, confself.conf, iouself.iou, verboseFalse ) # 处理结果 if results and len(results) 0: result results[0] annotated_frame result.plot() # 绘制检测结果 detections [] for box in result.boxes: cls_id int(box.cls[0]) conf float(box.conf[0]) xyxy box.xyxy[0].tolist() detections.append({ class: self.model.names[cls_id], confidence: conf, bbox: xyxy }) # 发送信号 self.frame_processed.emit(annotated_frame, detections) # 清理资源 cap.release() self.finished_signal.emit() def stop(self): 停止检测 self.is_running False5.4 用户管理模块实现基本的用户登录和权限管理# user_manager.py import json import hashlib import os from datetime import datetime class UserManager: def __init__(self, user_fileusers.json): self.user_file user_file self.current_user None self.load_users() def load_users(self): 加载用户数据 if os.path.exists(self.user_file): with open(self.user_file, r, encodingutf-8) as f: self.users json.load(f) else: self.users {} def save_users(self): 保存用户数据 with open(self.user_file, w, encodingutf-8) as f: json.dump(self.users, f, ensure_asciiFalse, indent2) def hash_password(self, password): 密码哈希 return hashlib.sha256(password.encode()).hexdigest() def register(self, username, password, emailNone): 用户注册 if username in self.users: return False, 用户名已存在 if len(username) 3: return False, 用户名至少3个字符 if len(password) 6: return False, 密码至少6个字符 self.users[username] { password: self.hash_password(password), email: email, register_time: datetime.now().isoformat(), last_login: None } self.save_users() return True, 注册成功 def login(self, username, password): 用户登录 if username not in self.users: return False, 用户不存在 hashed_password self.hash_password(password) if self.users[username][password] ! hashed_password: return False, 密码错误 # 更新登录时间 self.users[username][last_login] datetime.now().isoformat() self.current_user username self.save_users() return True, 登录成功 def logout(self): 用户登出 self.current_user None6. 系统集成与功能测试将各个模块集成到完整系统中并进行全面的功能测试。6.1 主程序入口集成所有模块的主程序# main.py import sys import os from PyQt5.QtWidgets import QApplication from main_window import MainWindow from detection_thread import DetectionThread from user_manager import UserManager class WeaponDetectionSystem: def __init__(self): self.app QApplication(sys.argv) self.user_manager UserManager() self.main_window MainWindow() self.detection_thread None # 连接信号槽 self.connect_signals() def connect_signals(self): 连接界面信号和槽函数 # 检测控制 self.main_window.btn_start.clicked.connect(self.start_detection) self.main_window.btn_stop.clicked.connect(self.stop_detection) self.main_window.btn_save.clicked.connect(self.save_result) # 参数调整 self.main_window.confidence_slider.valueChanged.connect( self.update_confidence) self.main_window.iou_slider.valueChanged.connect(self.update_iou) def start_detection(self): 开始检测 if self.detection_thread and self.detection_thread.isRunning(): return # 根据选择的检测源创建检测线程 source 0 # 默认摄像头 model_path runs/detect/train/weights/best.pt self.detection_thread DetectionThread( model_pathmodel_path, sourcesource, confself.main_window.confidence_slider.value() / 100.0, iouself.main_window.iou_slider.value() / 100.0 ) # 连接线程信号 self.detection_thread.frame_processed.connect( self.main_window.update_display) self.detection_thread.finished_signal.connect( self.detection_finished) self.detection_thread.start() self.main_window.status_bar.showMessage(检测进行中...) def stop_detection(self): 停止检测 if self.detection_thread: self.detection_thread.stop() self.detection_thread.wait() def detection_finished(self): 检测完成处理 self.main_window.status_bar.showMessage(检测已停止) def update_confidence(self, value): 更新置信度阈值 confidence value / 100.0 self.main_window.confidence_label.setText(f置信度阈值: {confidence:.2f}) if self.detection_thread: self.detection_thread.conf confidence def update_iou(self, value): 更新IoU阈值 iou value / 100.0 self.main_window.iou_label.setText(fIoU阈值: {iou:.2f}) if self.detection_thread: self.detection_thread.iou iou def save_result(self): 保存检测结果 # 实现结果保存逻辑 pass def run(self): 运行应用 self.main_window.show() return self.app.exec_() if __name__ __main__: system WeaponDetectionSystem() sys.exit(system.run())6.2 功能测试流程系统开发完成后需要进行全面测试单元测试# test_detection.py import unittest from detection_thread import DetectionThread import cv2 class TestDetection(unittest.TestCase): def setUp(self): self.model_path runs/detect/train/weights/best.pt self.test_image test_images/knife.jpg def test_model_loading(self): 测试模型加载 thread DetectionThread(self.model_path) thread.run() # 会加载模型 self.assertIsNotNone(thread.model) def test_image_detection(self): 测试图像检测 image cv2.imread(self.test_image) thread DetectionThread(self.model_path) thread.model thread.model # 模拟已加载模型 # 模拟检测过程 results thread.model.predict(image, conf0.25) self.assertTrue(len(results) 0) if __name__ __main__: unittest.main()集成测试清单用户登录注册功能正常模型加载和初始化成功图片检测返回正确结果视频检测流畅无卡顿摄像头实时检测响应及时参数调整立即生效检测结果正确保存界面操作响应正常6.3 性能优化建议针对实际部署的性能优化模型优化# model_optimization.py from ultralytics import YOLO # 加载训练好的模型 model YOLO(runs/detect/train/weights/best.pt) # 模型剪枝和量化 model.export(formatonnx, simplifyTrue, dynamicTrue) # 动态轴优化推理优化# inference_optimization.py # 使用更快的推理后端 model.predict(source, halfTrue) # 半精度推理 model.predict(source, imgsz320) # 更小的输入尺寸 # 批量推理优化 model.predict(source, batch4) # 批量处理7. 常见问题排查与解决方案在实际部署和使用过程中可能会遇到各种问题。以下是典型问题的排查路径。7.1 模型加载失败问题现象程序启动时报模型文件不存在或格式错误模型加载时内存溢出排查步骤检查模型文件路径是否正确验证模型文件完整性文件大小、MD5校验检查PyTorch和CUDA版本兼容性确认GPU内存是否充足解决方案# 检查模型文件 ls -lh runs/detect/train/weights/best.pt # 验证文件完整性 import hashlib with open(model.pt, rb) as f: md5 hashlib.md5(f.read()).hexdigest() print(fModel MD5: {md5}) # 检查GPU内存 nvidia-smi # 查看GPU状态7.2 检测性能不佳问题现象检测速度慢FPS低检测精度差漏检误检多排查步骤检查输入图像尺寸是否合适验证置信度和IoU阈值设置分析训练数据质量和分布检查模型是否过拟合或欠拟合优化方案# 性能调优 # 调整输入尺寸 model.predict(source, imgsz320) # 更小尺寸更快 # 调整置信度阈值 model.predict(source, conf0.5) # 提高阈值减少误检 # 使用GPU加速 model.predict(source, device0) # 指定GPU7.3 界面卡顿或无响应问题现象界面在检测时卡顿视频显示延迟严重排查步骤检查是否在主线程执行检测验证QThread是否正确使用分析内存和CPU使用情况检查图像显示优化解决方案# 界面优化 # 使用QThread避免阻塞主线程 class DetectionThread(QThread): # 确保检测在独立线程中运行 # 图像显示优化 def update_display(self, image): # 使用QPixmap缓存和缩放优化 pixmap QPixmap.fromImage(qt_image) scaled_pixmap pixmap.scaled( self.label.width(), self.label.height(), Qt.KeepAspectRatio, Qt.SmoothTransformation # 平滑缩放 )7.4 部署环境问题问题现象在不同机器上运行失败依赖库版本冲突排查步骤检查Python版本兼容性验证所有依赖库版本确认系统库依赖如OpenCV的ffmpeg检查路径和权限问题解决方案# 创建requirements.txt pip freeze requirements.txt # 使用Docker容器化部署 # Dockerfile示例 FROM python:3.9-slim RUN apt-get update apt-get install -y libgl1-mesa-glx COPY requirements.txt . RUN pip install -r requirements.txt COPY . /app WORKDIR /app CMD [python, main.py]8. 生产环境部署建议将学习原型转化为生产系统需要考虑更多工程因素。8.1 安全考虑数据安全检测结果加密存储用户密码SHA256加盐哈希传输数据使用HTTPS加密访问控制# access_control.py import jwt from datetime import datetime, timedelta class TokenManager: def __init__(self, secret_key): self.secret_key secret_key def generate_token(self, username, expires_hours24): 生成JWT令牌 payload { username: username, exp: datetime.utcnow() timedelta(hoursexpires_hours) } return jwt.encode(payload, self.secret_key, algorithmHS256) def verify_token(self, token): 验证JWT令牌 try: payload jwt.decode(token, self.secret_key, algorithms[HS256]) return payload[username] except jwt.ExpiredSignatureError: return None except jwt.InvalidTokenError: return None8.2 监控和日志系统监控# monitoring.py import psutil import logging from datetime import datetime class SystemMonitor: def __init__(self): self.logger logging.getLogger(monitor) def get_system_status(self): 获取系统状态 status { timestamp: datetime.now().isoformat(), cpu_percent: psutil.cpu_percent(), memory_percent: psutil.virtual_memory().percent, gpu_memory: self.get_gpu_memory(), detection_fps: self.get_detection_fps() } return status def log_system_status(self): 记录系统状态 status self.get_system_status() self.logger.info(fSystem Status: {status})日志配置# logging_config.py import logging import os from logging.handlers import RotatingFileHandler def setup_logging(): 配置日志系统 log_dir logs