1. 项目背景与核心需求
在计算机视觉领域,人体目标检测一直是个经典而实用的研究方向。我选择这个作为毕业设计课题,主要基于三方面考虑:首先是技术成熟度,YOLO、Faster R-CNN等算法已经相对成熟;其次是应用广泛性,从安防监控到智能家居都有实际需求;最后是硬件友好性,相比其他深度学习任务,目标检测对算力的要求相对可控。
这个项目的核心目标是实现一个能够实时检测视频流中人体目标的系统,重点解决两个问题:一是如何在有限算力下保持较高检测精度,二是如何优化模型以适应不同光照和遮挡场景。经过对比测试,最终选择YOLOv5作为基础框架,主要考虑到它在精度和速度上的平衡,以及活跃的社区支持。
提示:选择YOLOv5而非更新的YOLOv8,是因为毕业设计更看重技术原理的透彻理解而非盲目追新,且v5的文档和案例更丰富适合学习。
2. 环境搭建与工具选型
2.1 硬件配置方案
我的实验环境是NVIDIA GTX 1660 Ti显卡(6GB显存)+16GB内存的组合,这对学生党来说是个性价比不错的选择。显存大小直接影响batch size的设置,经过测试,在这个配置下batch size设为8时训练最稳定。如果使用Colab的免费GPU(T4或K80),建议batch size降到4-6。
2.2 软件环境搭建
创建conda环境是第一步,这里有个小技巧:先安装PyTorch再装其他依赖,能避免版本冲突。我的完整安装命令如下:
bash复制conda create -n yolo python=3.8
conda activate yolo
pip install torch==1.10.0+cu113 torchvision==0.11.1+cu113 -f https://download.pytorch.org/whl/torch_stable.html
git clone https://github.com/ultralytics/yolov5
cd yolov5
pip install -r requirements.txt
特别注意:OpenCV的版本建议锁定在4.5.4,新版本有时会出现奇怪的兼容性问题。我在这个坑里浪费了两天时间调试。
3. 数据集准备与增强策略
3.1 数据源选择与标注
使用COCO和CrowdHuman两个数据集的混合数据,共约15万张标注图像。标注工具推荐使用LabelImg,虽然界面老旧但稳定可靠。有个细节要注意:标注时建议统一使用"person"作为类别名,避免后续处理时的麻烦。
3.2 数据增强技巧
除了YOLOv5自带的增强方法,我增加了几个特别有效的策略:
- 雨天模拟:用Albumentations库添加雨线效果
- 阴影增强:随机生成模拟遮挡阴影
- 色彩抖动:特别是降低饱和度模拟监控摄像头效果
python复制# 自定义增强示例
import albumentations as A
transform = A.Compose([
A.RandomRain(drop_length=10, blur_value=3, p=0.5),
A.RandomShadow(num_shadows_lower=1, num_shadows_upper=2, p=0.3),
A.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1, p=0.5)
])
4. 模型训练与调优实战
4.1 基线模型训练
从YOLOv5s(小模型)开始训练是个明智的选择。初始参数设置:
- 输入尺寸:640x640
- batch size:8
- epochs:100
- 优化器:SGD(momentum=0.937)
- 学习率:0.01(配合余弦退火)
训练过程中要特别注意验证集mAP的变化曲线。我遇到的一个典型问题是前期mAP上升很快,但到中期就停滞不前。通过分析发现是学习率设置过高导致震荡,调整到0.005后明显改善。
4.2 关键调优技巧
- 自适应锚框计算:使用--autoanchor参数让模型自动计算最适合当前数据的锚框尺寸
- 分类头改进:在原有检测头基础上增加一个小的注意力模块(SEBlock)
- 损失函数调整:将CIoU改为EIoU,对遮挡情况更鲁棒
python复制# 在models/yolo.py中修改检测头
class SEBlock(nn.Module):
def __init__(self, c):
super().__init__()
self.avgpool = nn.AdaptiveAvgPool2d(1)
self.fc = nn.Sequential(
nn.Linear(c, c//16, bias=False),
nn.ReLU(inplace=True),
nn.Linear(c//16, c, bias=False),
nn.Sigmoid()
)
def forward(self, x):
b, c, _, _ = x.size()
y = self.avgpool(x).view(b, c)
y = self.fc(y).view(b, c, 1, 1)
return x * y.expand_as(x)
5. 部署与性能优化
5.1 模型轻量化处理
使用TensorRT加速是提升推理速度的关键。先将PyTorch模型转为ONNX格式:
bash复制python export.py --weights best.pt --include onnx --img 640 --device 0
然后用TensorRT转换:
bash复制trtexec --onnx=best.onnx --saveEngine=best.engine --fp16
这个过程有个大坑:OpenCV的dnn模块对某些TensorRT操作支持不好,建议直接用TensorRT的Python API进行推理。
5.2 实际测试结果
在测试集上达到:
- mAP@0.5:0.872
- 推理速度:GTX 1660 Ti上达到45FPS(640x640输入)
- 内存占用:约1.2GB
对于遮挡场景的检测效果提升明显,相比原生YOLOv5s,遮挡情况下的漏检率降低了约30%。
6. 项目扩展与实用建议
- 多尺度训练:尝试在训练时随机切换输入尺寸(320-960之间),显著提升小目标检测能力
- 知识蒸馏:用大模型(如YOLOv5x)指导小模型训练,不增加推理耗时但能提升精度
- 边缘部署:尝试将模型部署到树莓派+Intel神经计算棒的组合上,实现端侧推理
这个项目最深刻的体会是:目标检测不是简单调参就能做好的,需要深入理解数据特性。比如发现夜间场景效果差时,不是盲目增加数据量,而是专门收集低光照数据并设计相应的增强策略才解决问题。建议学弟学妹们在做类似项目时,一定要先花足够时间分析数据分布。
