1. 项目概述
这个毕业设计项目基于YOLOv5深度学习框架实现了一个高精度的动物识别系统。作为一名计算机视觉方向的毕业生,我在项目中完整实现了从数据采集、模型训练到应用部署的全流程开发。系统能够实时检测图片、视频和摄像头画面中的多种动物,识别准确率达到了92.3%,推理速度在NVIDIA GTX 1660Ti显卡上达到45FPS,完全满足实时性要求。
项目最大的技术亮点是采用了最新的YOLOv5s模型,相比传统目标检测算法,在保持高精度的同时大幅提升了检测速度。同时我开发了基于PyQt5的图形界面,使得非技术人员也能方便地使用这个系统。整个项目代码已开源,包含完整的训练数据集和预训练模型,可以直接用于二次开发。
2. 技术选型与原理分析
2.1 为什么选择YOLOv5?
在项目初期,我对比了Faster R-CNN、SSD和YOLO系列等主流目标检测算法:
- Faster R-CNN:两阶段检测器,准确率高但速度慢(~5FPS)
- SSD:单阶段检测器,速度较快但小目标检测效果差
- YOLOv4:速度与精度平衡,但模型体积较大
- YOLOv5:最新版本,PyTorch实现,模型更小速度更快
最终选择YOLOv5s(small版本)的原因:
- 模型仅27MB,是YOLOv4的1/9大小
- 每帧处理时间仅7ms(140FPS)
- 支持TensorRT加速,适合边缘设备部署
- 活跃的开源社区,问题容易解决
2.2 卷积神经网络基础
YOLOv5的核心是深度卷积神经网络,理解CNN的工作原理对模型调优至关重要:
2.2.1 卷积层原理
卷积操作通过滑动窗口(卷积核)提取局部特征。以一个3×3卷积核为例:
code复制输入矩阵: 卷积核: 输出计算:
[1,2,3,4] [0,1,0] (1×0 + 2×1 + 3×0)
[5,6,7,8] [1,0,1] + (5×1 + 6×0 + 7×1) = 2 + 12 = 14
[9,10,11,12] [0,1,0] (9×0 + 10×1 + 11×0)
关键参数:
- padding:'same'保持尺寸,'valid'缩小尺寸
- stride:滑动步长,影响输出尺寸
- dilation:空洞卷积,扩大感受野
2.2.2 激活函数选择
YOLOv5使用LeakyReLU激活函数:
python复制def leaky_relu(x, alpha=0.1):
return torch.max(x, alpha*x)
相比ReLU,LeakyReLU在负区间有微小梯度,能缓解神经元"死亡"问题。
3. 数据集构建与标注
3.1 数据采集方案
由于公开的动物数据集较少,我采用多源数据融合策略:
- 网络爬虫:使用Scrapy框架爬取Flickr、Google Images的动物图片
- 公开数据集:合并COCO和Open Images中的动物类别
- 自行拍摄:在动物园实地采集不同角度的动物照片
最终构建包含3000张图片的数据集,涵盖6类动物:
- 猫、狗、牛、马、鸟、羊
3.2 数据标注实践
使用LabelImg工具进行标注,关键步骤:
- 安装:
pip install labelimg - 启动:终端输入
labelimg - 标注流程:
- 打开图片目录
- 设置输出格式为YOLO
- 用矩形框选动物并输入类别
- 保存生成.txt标注文件
标注文件示例(归一化坐标):
code复制0 0.45 0.32 0.12 0.23 # 类别x中心y中心宽度高度
3.3 数据增强策略
在data/hyps/hyp.scratch-low.yaml中配置增强参数:
yaml复制hsv_h: 0.015 # 色调增强幅度
hsv_s: 0.7 # 饱和度增强
hsv_v: 0.4 # 明度增强
degrees: 10 # 旋转角度
translate: 0.1 # 平移比例
scale: 0.5 # 缩放比例
shear: 0.0 # 剪切变换
特别增加了马赛克增强(Mosaic),将4张图片拼接训练,显著提升小目标检测能力。
4. 模型训练与调优
4.1 环境配置
硬件配置:
- GPU: NVIDIA GTX 1660Ti (6GB显存)
- CPU: Intel i7-9750H
- 内存: 16GB DDR4
软件环境:
bash复制conda create -n yolov5 python=3.8
conda activate yolov5
pip install torch==1.8.1+cu111 torchvision==0.9.1+cu111 -f https://download.pytorch.org/whl/torch_stable.html
pip install -r requirements.txt
4.2 关键训练参数
修改train.py中的核心参数:
python复制parser.add_argument('--weights', type=str, default='yolov5s.pt')
parser.add_argument('--cfg', type=str, default='models/yolov5s.yaml')
parser.add_argument('--data', type=str, default='data/animal_data.yaml')
parser.add_argument('--epochs', type=int, default=300)
parser.add_argument('--batch-size', type=int, default=16)
parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640])
启动训练:
bash复制python train.py --img 640 --batch 16 --epochs 300 --data animal_data.yaml --cfg yolov5s.yaml --weights yolov5s.pt
4.3 训练过程监控
使用TensorBoard监控训练指标:
bash复制tensorboard --logdir runs/train
关键指标解读:
- mAP@0.5:IoU阈值为0.5时的平均精度
- mAP@0.5:0.95:IoU阈值从0.5到0.95的平均精度
- precision:预测为正样本中真实正样本比例
- recall:真实正样本中被正确预测的比例
4.4 模型优化技巧
-
学习率调整:
- 初始lr0=0.01
- 使用余弦退火调度器
- 最终lrf=0.2
-
早停机制:
python复制patience = 100 # 连续100轮mAP无提升则停止 -
模型EMA:
python复制ema = ModelEMA(model) # 指数移动平均,稳定训练
5. 系统实现与部署
5.1 PyQt5界面开发
主要功能模块:
python复制class MainWindow(QMainWindow):
def __init__(self):
# 初始化UI
self.btn_image = QPushButton("图片检测")
self.btn_video = QPushButton("视频检测")
self.btn_camera = QPushButton("摄像头检测")
# 信号槽连接
self.btn_image.clicked.connect(self.detect_image)
def detect_image(self):
# 调用YOLOv5推理
model = torch.hub.load('ultralytics/yolov5', 'custom', path='best.pt')
results = model(img_path)
results.show()
5.2 性能优化技巧
-
TensorRT加速:
bash复制
python export.py --weights best.pt --include engine --device 0 -
多线程处理:
python复制from threading import Thread class DetectionThread(Thread): def run(self): while True: ret, frame = cap.read() results = model(frame) emit_signal(results) -
图像预处理优化:
python复制def preprocess(img): img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = letterbox(img, new_shape=640)[0] # 保持长宽比resize img = img.transpose(2, 0, 1) # HWC to CHW img = np.ascontiguousarray(img) return torch.from_numpy(img).float().div(255.0)
6. 常见问题与解决方案
6.1 训练问题排查
问题1:Loss不下降
- 检查学习率是否合适
- 验证数据标注是否正确
- 尝试减小batch size
问题2:过拟合
- 增加数据增强强度
- 添加Dropout层
- 使用早停机制
6.2 部署问题
问题:模型推理速度慢
- 解决方案:
python复制model = torch.jit.trace(model, example_input) # 模型编译 torch.backends.cudnn.benchmark = True # 启用cuDNN自动调优
6.3 精度提升技巧
-
模型集成:
python复制from ensemble_boxes import weighted_boxes_fusion results1 = model1(img) results2 = model2(img) boxes, scores, labels = weighted_boxes_fusion([results1, results2]) -
测试时增强(TTA):
python复制model = torch.hub.load('ultralytics/yolov5', 'custom', 'best.pt') model.conf = 0.25 # 置信度阈值 model.iou = 0.45 # NMS IoU阈值 model.agnostic = True # 类别无关NMS model.multi_label = True model.amp = True # 自动混合精度
7. 项目扩展方向
-
多模态融合:
- 结合声音识别提升准确率
- 添加红外图像处理实现夜间检测
-
移动端部署:
bash复制
pip install onnxruntime python export.py --weights best.pt --include onnx -
动物行为分析:
- 基于跟踪算法统计动物数量
- 分析动物运动轨迹
这个项目让我深刻体会到,在实际工程中,理论知识的扎实程度决定了模型效果的上限,而工程实现能力则决定了能否达到这个上限。建议学弟学妹们在做类似项目时,一定要重视数据质量,合理设置评估指标,并且尽早开始模型部署的验证工作。