
1. 项目背景与核心需求在安全生产、智慧园区、公共场所管理等场景中实时监测违规行为如抽烟、使用手机是刚需。传统人工巡检存在效率低、覆盖不全的问题而基于YOLOv8的智能检测系统能实现7×24小时自动化监控。这个项目完整覆盖了从数据准备到模型部署的全流程特别适合安防领域开发者、AI工程师以及需要合规管理的企业用户。YOLOv8作为YOLO系列最新版本在保持实时性的同时提升了小目标检测能力。实测在1080P视频流中搭载RTX 3060显卡的服务器可实现200FPS的推理速度满足绝大多数监控场景需求。系统核心功能包括抽烟行为识别手持香烟/烟雾检测手机使用检测手持设备贴近耳部多目标实时跟踪与报警触发2. 数据集构建与标注规范2.1 数据采集策略实际项目中发现单纯使用公开数据集如COCO效果不佳必须构建领域专用数据集。我们采用三种数据源监控视频抽帧从目标场景的监控摄像头采集确保光照、角度等条件一致公开数据集补充筛选VAIS、WiderPerson等数据集中相关图像模拟场景拍摄针对罕见角度进行定向补拍关键经验抽烟场景需包含不同光照下的烟雾形态手机检测需覆盖各种握持姿势。建议至少采集5000原始图像最终扩增到2万训练样本。2.2 标注标准与工具使用LabelImg进行标注时需特别注意以下规范!-- 抽烟标注示例 -- object namesmoking/name bndbox xmin256/xmin ymin189/ymin xmax302/xmax ymax245/ymax /bndbox /object !-- 手机标注示例 -- object namephoning/name bndbox xmin412/xmin ymin223/ymin xmax458/xmax ymax298/ymax /bndbox /object标注要点香烟需包含手持部分和烟雾区域手机标注应包含手部接触区域对遮挡超过50%的对象标记为difficult2.3 数据增强方案通过albumentations库实现针对性增强transform A.Compose([ A.RandomShadow(p0.3), # 模拟光照变化 A.MotionBlur(blur_limit7), # 运动模糊 A.RandomBrightnessContrast(), # 亮度对比度变化 A.HueSaturationValue(), # 色相饱和度调整 A.RandomFog(fog_coef_lower0.1) # 烟雾干扰模拟 ], bbox_paramsA.BboxParams(formatpascal_voc))实测表明加入烟雾模拟增强后模型在真实场景的烟雾识别准确率提升12%。3. 模型训练与优化3.1 YOLOv8模型选型对比不同版本的表现在自建测试集上模型mAP0.5参数量(M)推理速度(ms)YOLOv8n0.683.26.1YOLOv8s0.7511.48.3YOLOv8m0.8126.312.7YOLOv8l0.8343.715.9推荐选择YOLOv8m作为基础模型在精度和速度间取得最佳平衡。若需边缘部署可改用YOLOv8s并配合蒸馏训练。3.2 关键训练参数# yolov8m.yaml 修改建议 head: - [ -1, 1, nn.Conv2d, [ 256, 1, 1, 0 ] ] # 增加输出通道数 - [ -1, 1, nn.Upsample, [ None, 2, nearest ] ] # 训练命令示例 yolo detect train datacustom.yaml modelyolov8m.pt epochs300 imgsz640 batch16 optimizerAdamW lr00.001 warmup_epochs3重点调整输入分辨率设为640×640平衡精度与速度使用AdamW优化器配合cosine退火学习率添加Label Smoothing0.1缓解过拟合3.3 改进策略实测效果在验证集上对比不同改进方法改进方法mAP提升速度影响添加CBAM注意力2.1%-3FPS更换CIoU损失1.7%基本不变引入小目标检测层3.5%-8FPS知识蒸馏1.2%5FPS最终采用CIoU蒸馏方案在保持速度的同时获得2.9%的mAP提升。4. 部署实战方案4.1 服务端部署FlaskTensorRT# 推理服务核心代码 app.route(/detect, methods[POST]) def detect(): img request.files[image].read() img cv2.imdecode(np.frombuffer(img, np.uint8), cv2.IMREAD_COLOR) # TensorRT加速推理 results model(img, imgsz640, halfTrue) # 违规行为判断 alerts [] for box in results[0].boxes: if box.cls 0 and box.conf 0.6: # 抽烟检测 alerts.append({type: smoking, location: box.xyxy.tolist()}) elif box.cls 1 and box.conf 0.7: # 手机检测 alerts.append({type: phoning, location: box.xyxy.tolist()}) return jsonify({alerts: alerts})部署建议使用Docker容器化部署采用NginxGPU实现高并发开启TensorRT FP16加速提升40%推理速度4.2 边缘设备部署RK3588适配在Rockchip平台上的优化要点模型转换yolo export modelyolov8m.pt formatonnx opset12 rknn-toolkit2 convert --onnx yolov8m.onnx --rknn yolov8m.rknn量化配置config { mean_values: [[0, 0, 0]], std_values: [[255, 255, 255]], quantized_dtype: asymmetric_quantized-8, quantized_algorithm: normal }实测在RK3588上INT8量化后模型大小从43.7MB压缩到11.2MB推理速度从58ms提升到22msmAP仅下降1.3%5. 常见问题与调优技巧5.1 典型问题排查表现象可能原因解决方案烟雾检测漏报数据缺乏动态烟雾样本添加视频序列标注手机误检率高类似物体干扰如对讲机增加负样本训练夜间效果差红外图像未参与训练补充红外摄像头数据边缘设备崩溃内存溢出改用YOLOv8n模型5.2 性能优化技巧多线程预处理from concurrent.futures import ThreadPoolExecutor def preprocess(img): # 图像标准化处理 return cv2.dnn.blobFromImage(img, 1/255.0, (640,640)) with ThreadPoolExecutor(max_workers4) as executor: blob executor.submit(preprocess, frame).result()区域检测优化# 只检测ROI区域如禁烟区 mask np.zeros(frame.shape[:2], dtypenp.uint8) cv2.rectangle(mask, (x1,y1), (x2,y2), 255, -1) results model(frame, imgsz640, conf0.5, maskmask)后处理加速// 使用CUDA实现NMS void fastNMS(float* boxes, float* scores, int num_boxes, float iou_thresh, int* keep_indices);在实际项目中我们发现将检测区域限定在关键区域如办公桌、走廊可降低30%计算负载。同时采用异步报警策略——只有当同一目标连续3帧被检测到违规时才触发报警有效减少误报。