1. 项目背景与核心需求
去年指导本科生做毕设时,遇到一个典型案例:学生想用传统图像处理方法检测监控画面中的人体,结果在复杂场景下准确率不足60%。这促使我重新思考——为什么现在主流方案都转向了深度学习?人体目标检测作为计算机视觉的基础任务,在安防监控、人机交互、智慧零售等领域有广泛应用场景。传统方法依赖手工设计特征(如HOG+SVM),而深度学习通过卷积神经网络自动学习特征表达,在PASCAL VOC数据集上能将mAP(平均精度)从30%提升到70%以上。
这个毕设项目的核心在于实现一个实时性(>15FPS)与准确性(mAP>75%)兼顾的解决方案。需要特别考虑学生群体的硬件限制——大多数人的笔记本只有GTX1060级别的显卡。经过对比实验,最终选择YOLOv5s作为基础框架,因其在速度和精度之间取得了较好平衡,且PyTorch生态对新手更友好。
2. 技术选型与模型对比
2.1 主流模型性能实测
在1080Ti显卡上对三种典型架构进行对比测试(输入尺寸统一调整为640x640):
| 模型 | 参数量(M) | FLOPs(G) | COCO mAP(%) | FPS |
|---|---|---|---|---|
| Faster R-CNN | 137 | 370 | 42.7 | 8 |
| SSD300 | 26.3 | 62 | 28.8 | 46 |
| YOLOv5s | 7.2 | 16.5 | 37.4 | 140 |
实测发现两阶段检测器(如Faster R-CNN)虽然精度高,但难以满足实时要求。单阶段检测器中,YOLO系列在保持较好精度的同时,速度优势明显。特别是YOLOv5的s(small)版本,参数量仅为7.2M,适合在消费级GPU上部署。
2.2 数据增强策略优化
针对人体检测的特殊性,我们改进了默认的数据增强pipeline:
python复制# 在data/hyps/hyp.scratch-low.yaml中调整
hsv_h: 0.015 # 色相抖动幅度减小(避免肤色异常)
hsv_s: 0.7 # 增加饱和度扰动(适应不同光照条件)
hsv_v: 0.4 # 明度扰动适中
flipud: 0.3 # 垂直翻转概率降低(人体通常直立)
mosaic: 1.0 # 保持mosaic增强
mixup: 0.1 # 适当降低mixup比例
这种调整使模型在校园监控场景的测试集上,误检率降低了12%。关键点在于:人体具有明确的空间朝向特征,过度随机翻转反而会引入噪声。
3. 数据集构建与标注规范
3.1 数据采集方案
建议采用"公开数据集+自采数据"的混合模式:
- 公开数据集:COCO(含11.5万人体实例)、CrowdHuman(拥挤场景专用)
- 自采数据:用手机拍摄校园不同场景(教室/走廊/操场),注意涵盖:
- 多视角(正面/侧面/背面)
- 多光照(顺光/逆光/阴影)
- 多姿态(站立/坐姿/奔跑)
重要提示:拍摄时需获得被摄者书面授权,隐私保护是毕设伦理审查的重点
3.2 标注技巧与工具
使用LabelImg标注时,建议采用以下规范:
- 框体应紧密贴合人体轮廓
- 对于遮挡情况,按可见部分标注
- 群体照片中,每个人体单独标注
- 类别统一为"person"(避免多类混淆)
标注完成后,通过以下命令检查数据质量:
bash复制python utils/annotations.py --check-labels --dir dataset/images
这个脚本会检测:标注框越界、图像损坏、标签缺失等问题。曾有个案例因为漏标了15%的图像,导致模型recall直接下降20个百分点。
4. 模型训练与调参实战
4.1 基础训练配置
在RTX3060显卡上的典型训练命令:
bash复制python train.py --img 640 --batch 16 --epochs 100 --data coco_person.yaml
--cfg models/yolov5s.yaml --weights '' --name exp1
关键参数说明:
--img 640:输入分辨率(降低可提升速度但影响小目标检测)--batch 16:根据GPU显存调整(11GB显存可用16-24)--epochs 100:实际可通过早停法(early stopping)动态调整
4.2 学习率调优策略
采用余弦退火+热启动的复合调度:
yaml复制# data/hyps/hyp.finetune.yaml
lr0: 0.01 # 初始学习率
lrf: 0.2 # 最终学习率=lr0*lrf
warmup_epochs: 3 # 渐进式热身
warmup_momentum: 0.8
对比实验表明,这种设置比固定学习率训练的mAP高出3-5%。特别是在训练中期(epoch30-50),模型会经历多次学习率震荡,有助于跳出局部最优。
5. 模型压缩与部署优化
5.1 量化部署方案
针对没有GPU的演示环境,可采用TensorRT量化:
python复制from torch2trt import torch2trt
model = torch.load('weights/best.pt').model
model.eval()
data = torch.randn(1,3,640,640).cuda()
model_trt = torch2trt(model, [data], fp16_mode=True)
torch.save(model_trt.state_dict(), 'weights/best_trt.pth')
实测在Jetson Nano上:
- 原始模型:18FPS
- FP16量化后:29FPS
- INT8量化后:43FPS(精度损失约2%)
5.2 剪枝实战记录
尝试通道剪枝(channel pruning)后遇到典型问题:
text复制[Warning] layer conv.15 has zero weights in output channels [32,64]
解决方法是在prune.py中增加通道重要性校验:
python复制def prune_conv(conv1, conv2, percent):
# 增加通道权重L1范数阈值检查
importance = conv1.weight.abs().sum([0,2,3])
thre = torch.quantile(importance, percent)
mask = importance.gt(thre)
if mask.sum() == 0: # 防止全剪枝
mask[importance.argmax()] = True
return mask
经过3轮迭代剪枝(每次剪枝30%),模型从7.2M压缩到4.1M,速度提升40%而mAP仅下降1.8%。
6. 效果评估与可视化分析
6.1 定量评估指标
在自建测试集(含2000张图像)上的表现:
| 场景类型 | Precision | Recall | mAP@0.5 |
|---|---|---|---|
| 教室(稀疏) | 0.92 | 0.89 | 0.91 |
| 走廊(中等) | 0.85 | 0.81 | 0.83 |
| 操场(密集) | 0.76 | 0.68 | 0.72 |
典型失败案例分析:
- 极端背光条件下(逆光强于10000lux),漏检率上升至35%
- 人群密集重叠(IoU>0.7)时,误检率增加20%
6.2 可视化诊断工具
使用Grad-CAM分析特征关注点:
python复制from gradcam import GradCAM
target_layers = ["model.17.conv"] # 最后一个卷积层
cam = GradCAM(model, target_layers)
outputs = cam(input_tensor)
可视化发现一个有趣现象:在远距离小目标检测时,模型更多依赖头部和肩部特征而非整体轮廓。这提示我们可以针对性增强这些部位的训练样本。
7. 常见问题排坑指南
7.1 训练震荡问题
症状:loss曲线剧烈波动
可能原因及解决方案:
- 学习率过高 → 尝试减小lr0至0.001
- 批次太小(batch<8)→ 增加batch或使用梯度累积
- 数据标注不一致 → 用label-check工具复查
7.2 显存不足处理
当出现CUDA out of memory时:
- 减小
--img-size(如从640降至512) - 使用
--batch-size 8 --accumulate 2替代原batch16 - 启用AMP混合精度训练:
bash复制
python train.py --amp
7.3 部署时性能骤降
典型表现:训练时30FPS,部署后不足10FPS
检查清单:
- 确认推理环境是否启用CUDA:
python复制print(torch.cuda.is_available()) - 检查预处理/后处理耗时(常见瓶颈在图像resize)
- 对于OpenCV+DNN部署,需手动设置:
python复制
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA) net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)
8. 扩展方向与进阶建议
对于想深入研究的同学,推荐以下几个方向:
- 行为识别扩展:在检测框基础上增加ST-GCN时空图卷积
- 轻量化改进:尝试MobileNetV3+YOLO的混合架构
- 领域自适应:用GAN生成不同光照条件下的数据
- 3D检测:结合单目深度估计(如MiDaS)预测人体距离
在模型优化过程中有个重要心得:不要盲目追求SOTA指标。曾有个学生强行改用Swin Transformer,结果在消费级GPU上推理速度只有3FPS。毕设项目的核心价值在于完整实现闭环,而非技术堆砌。
