news 2026/9/13 13:21:04

YOLOv5改造细粒度猫种识别:从检测到高精度分类的完整实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
YOLOv5改造细粒度猫种识别:从检测到高精度分类的完整实践

简介:本资源是一份基于YOLOv5实现的猫种类识别项目源码,专为计算机视觉初学者与高校学生设计,适用于课程设计、期末大作业及深度学习实践入门。项目已通过严格调试,评审得分95分以上,具备完整训练、验证与推理流程,可直接运行并快速复现高精度分类效果。压缩包共144个文件,涵盖65个Python脚本(含模型训练、数据预处理、推理部署等核心逻辑)、53个YAML配置文件(定义网络结构、数据路径与超参)、6个Shell脚本(支持一键环境配置与训练启动),以及Jupyter Notebook教程、Dockerfile多平台部署文件和Markdown说明文档,整体体积仅1023KB,轻量易部署。目前已有243人学习下载,内容组织清晰,包含CITATION规范引用、Git版本管理配置及跨架构(x86/CPU/ARM64)适配方案,便于理解工业级目标检测项目的工程化落地思路。

1. 这不是“调个YOLOv5跑张猫图”——它是一套可交付、可复现、能写进简历的端到端猫种识别系统

期末大作业交一个“能识别猫”的模型?远远不够。老师要看的是:数据怎么来的、标签怎么对的、训练为什么收敛、推理怎么部署、结果怎么验证。这个基于YOLOv5的猫种类识别项目,核心价值不在“识别猫”,而在于用工业级流程处理细粒度视觉分类(Fine-Grained Visual Classification, FGVC)任务——猫科动物外形高度相似,布偶 vs 英短 vs 暹罗,差异常在耳距、瞳色、毛尖色等毫米级区域。YOLOv5本为通用目标检测设计,直接用于种类识别会因定位粗放、特征判别力弱而准确率卡在72%以下。本项目源码真正解决的是:如何把YOLOv5的检测能力,转化为高精度(>91.3% Top-1)、低误判(暹罗不被标成缅因)、可解释(热力图定位关键判别区域)的细粒度识别流水线。适合计算机视觉初学者夯实数据-训练-部署闭环,也适合课程设计需体现工程规范性的同学——所有脚本带参数校验、日志分级、配置分离,train.py里连--device cuda:0都做了设备可用性探测,不是“复制粘贴就崩”。

2. 为什么选YOLOv5而非ResNet或ViT?细粒度识别中的检测框架再定位

2.1 细粒度识别的三大陷阱与YOLOv5的破局点

传统分类模型(如ResNet50)在猫种识别上常陷入三重困境:

  • 背景干扰:训练图含大量沙发、地毯、窗台,模型学到“猫+背景”联合特征,换环境即失效;
  • 局部判别弱:全图平均池化抹平耳尖、鼻梁等关键判别区域,导致布偶(蓝眼+长毛)与伯曼(蓝眼+短毛)混淆;
  • 标注成本高:人工框出猫体需20秒/图,5000张图耗时超27小时。

YOLOv5的检测先验恰好对症:
自动裁剪主体:通过detect.py生成高置信度边界框,用crop_by_bbox.py批量裁切猫体区域,消除92%背景噪声;
定位引导特征学习:在models/yolov5s.yaml中将最后三层卷积替换为Focus模块(输入通道×4,保留高频纹理),强化毛发边缘响应;
半自动标注:用预训练权重(yolov5s.pt)对原始数据集做首轮推理,人工仅需修正框位置(非从零标注),效率提升5倍。

提示:不要直接用YOLOv5输出的类别概率!其head层为通用检测头,未适配细粒度区分。必须替换分类头——这是本项目源码与网上90%“YOLOv5猫识别”教程的本质区别。

2.2 分类头改造:从检测输出到细粒度判别

YOLOv5默认输出80类COCO目标,需将其检测头(Detect模块)剥离,接入专用分类分支。源码中models/common.py新增CatClassifier类:

class CatClassifier(nn.Module): def __init__(self, nc=12, ch=1280): # nc=猫品种数,ch=Backbone输出通道 super().__init__() self.conv = nn.Sequential( nn.Conv2d(ch, 512, 1), # 降维保特征 nn.BatchNorm2d(512), nn.ReLU(), nn.AdaptiveAvgPool2d(1) # 全局平均池化 ) self.classifier = nn.Sequential( nn.Linear(512, 256), nn.Dropout(0.3), # 防过拟合关键 nn.ReLU(), nn.Linear(256, nc) ) def forward(self, x): x = self.conv(x) # [B,512,1,1] x = torch.flatten(x, 1) # [B,512] return self.classifier(x)

该结构在train.py中通过--cls-head cat参数触发加载。对比实验显示:

方案Top-1 Acc布偶/英短混淆率训练时间(100epoch)
直接用YOLOv5检测头73.2%38.7%4h12m
ResNet50微调86.5%12.4%6h05m
本项目YOLOv5+CatClassifier91.3%4.1%4h48m

注意:ch=1280需与所选YOLOv5版本对齐——yolov5s为1280,yolov5m为1600,yolov5l为2560。源码中utils/autoanchor.py已内置校验,运行python train.py --data data/cat.yaml --weights yolov5s.pt时自动报错提示通道不匹配。

2.3 数据增强策略:针对猫科纹理的定制化扰动

细粒度识别对增强敏感:过度旋转会扭曲耳廓形状,强色彩抖动使蓝眼变灰。本项目采用分层增强策略,在datasets/augmentations.py中实现:

def cat_augment(): return Compose([ # 第一层:几何不变性保持 RandomAffine(degrees=5, translate=(0.05, 0.05), scale=(0.95, 1.05)), # 小角度仿射 # 第二层:纹理强化(关键!) RandomApply([ColorJitter(brightness=0.1, contrast=0.1, saturation=0.1)], p=0.5), GaussianBlur(kernel_size=(3, 3), sigma=(0.1, 2.0)), # 模糊毛发边缘模拟真实拍摄 # 第三层:对抗过拟合 RandomHorizontalFlip(p=0.5), ToTensor(), Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ])

其中GaussianBlursigma=(0.1, 2.0)是核心——低sigma(0.1)保留瞳孔锐度,高sigma(2.0)模糊长毛区域,迫使模型关注不可模糊的骨骼结构(如耳基宽度)。消融实验表明,移除该层后暹罗猫识别率下降6.2%。

3. 从源码到可运行:四步完成本地训练与推理验证

3.1 环境配置:避开CUDA/cuDNN版本地狱的最小依赖集

本项目严格限定依赖,避免常见坑:

  • ❌ 不支持CUDA 11.0以下(YOLOv5v6.0+需TensorRT加速)
  • ❌ 不支持PyTorch 1.12以上(与torchvision==0.13.1存在API冲突)
  • ✅ 推荐组合:CUDA 11.3 + PyTorch 1.12.1 + torchvision 0.13.1 + Pillow 9.2.0

执行以下命令一键安装(Linux/macOS):

# 创建隔离环境 conda create -n cat-yolo python=3.8 conda activate cat-yolo # 安装指定版本PyTorch(官方源慢时用清华镜像) pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 -f https://download.pytorch.org/whl/torch_stable.html # 安装其他依赖(requirements.txt已剔除冗余包) pip install numpy==1.21.6 opencv-python==4.6.0.66 tqdm==4.64.1 pyyaml==6.0 scikit-learn==1.1.2 # 验证CUDA可用性 python -c "import torch; print(torch.cuda.is_available(), torch.version.cuda)" # 输出:True 11.3

提示:若torch.cuda.is_available()返回False,请检查NVIDIA驱动版本——CUDA 11.3要求驱动≥465.19.01。执行nvidia-smi查看,低于此版本需升级驱动。

3.2 数据准备:按YOLOv5规范组织的猫种数据集结构

源码中data/cat.yaml定义了标准路径,必须严格遵循:

train: ../datasets/cat/images/train # 图片路径 val: ../datasets/cat/images/val nc: 12 # 品种数 names: ['Abyssinian', 'Bengal', 'Birman', 'Bombay', 'British_Shorthair', 'Egyptian_Mau', 'Maine_Coon', 'Persian', 'Ragdoll', 'Russian_Blue', 'Siamese', 'Sphynx']

对应目录结构:

datasets/ └── cat/ ├── images/ │ ├── train/ # 所有.jpg文件 │ └── val/ └── labels/ # YOLO格式txt,每行:cls_id center_x center_y width height (归一化) ├── train/ └── val/

关键操作:使用tools/generate_labels.py自动生成标签。该脚本读取datasets/cat/annotations.csv(含图片名、品种、bbox坐标),执行:

python tools/generate_labels.py \ --csv datasets/cat/annotations.csv \ --img-dir datasets/cat/images/train \ --label-dir datasets/cat/labels/train \ --classes "Abyssinian,Bengal,Birman" # 指定子集,避免全量生成

注意:annotations.csv必须包含filename, breed, x_min, y_min, x_max, y_max六列。源码包中提供样例文件及清洗脚本tools/clean_annotations.py,可自动过滤坐标越界(x_min<0)和尺寸异常(width<5px)样本。

3.3 训练命令:参数含义与必调项详解

进入项目根目录,执行标准训练:

python train.py \ --img 640 \ # 输入尺寸:640平衡精度与显存,>640对猫种识别收益<0.3% --batch 32 \ # 每卡batch,RTX3090可跑32,GTX1660建议16 --epochs 150 \ # 细粒度需更长训练,前50轮用warmup,后100轮lr衰减 --data data/cat.yaml \ --weights yolov5s.pt \ # 预训练权重,必须用COCO权重启动迁移学习 --cfg models/yolov5s.yaml \ # 模型结构定义 --name cat_yolov5s_v1 \ # 输出目录名,自动创建runs/train/cat_yolov5s_v1 --cache ram \ # 内存缓存图片,提速35%,但需≥32GB RAM --cls-head cat \ # 关键!启用自定义分类头 --hyp data/hyp.cat.yaml # 超参数文件,含细粒度专用学习率策略

data/hyp.cat.yaml中关键参数:

lr0: 0.01 # 初始学习率,比通用检测高10倍(细粒度需更强梯度) lrf: 0.01 # 最终学习率 = lr0 * lrf = 0.0001,防止过拟合 momentum: 0.937 # 动量略低于默认0.937,提升细粒度收敛稳定性 weight_decay: 0.0005 # L2正则,抑制对背景纹理的过拟合

训练过程实时监控:

  • runs/train/cat_yolov5s_v1/results.csv:每epoch的metrics/precision,metrics/recall,metrics/mAP_0.5,train/cls_loss
  • runs/train/cat_yolov5s_v1/weights/best.pt:最高mAP模型
  • runs/train/cat_yolov5s_v1/weights/last.pt:最终轮次模型

3.4 推理与可视化:不只是输出标签,更要理解模型在看什么

使用训练好的模型进行推理,并生成可解释性热力图:

python detect.py \ --source datasets/cat/images/val/ \ --weights runs/train/cat_yolov5s_v1/weights/best.pt \ --conf 0.25 \ # 置信度阈值,细粒度需降低(避免漏检) --save-txt \ # 保存YOLO格式预测结果 --save-conf \ # 保存置信度,用于后续分析 --line-thickness 2 \ # 边框粗细 --project runs/detect/cat_val_v1 \ --name yolov5s_cat_best \ --visualize \ # 关键!生成Grad-CAM热力图 --cls-head cat # 启用分类头可视化

生成的热力图位于runs/detect/cat_val_v1/yolov5s_cat_best/gradcam/,示例效果:

  • 布偶猫:热力集中于眼睛(蓝)和耳尖(白毛)
  • 暹罗猫:热力聚焦于深色面部(重点色)和蓝色虹膜
  • 英国短毛:热力覆盖整个头部(圆脸+厚毛)

提示:--visualize会显著增加推理时间(+300%),生产环境请关闭。热力图验证了模型确实在学习生物判别特征,而非背景纹理——这是答辩时最有力的证据。

4. 模型优化与部署:让识别结果真正可用的三个硬核技巧

4.1 混淆矩阵深度分析:定位具体品种的误判根源

仅看Top-1 Acc会掩盖问题。运行tools/analyze_confusion.py生成混淆矩阵:

python tools/analyze_confusion.py \ --pred-dir runs/detect/cat_val_v1/yolov5s_cat_best/labels/ \ --true-dir datasets/cat/labels/val/ \ --names data/cat.yaml \ --output runs/analyze/confusion_cat_v1.png

输出的混淆矩阵图(PNG)中,重点关注对角线外的亮块:

  • Siamese行中Bengal列亮度高 → 模型将暹罗的深色面部误认为孟加拉豹纹
  • Ragdoll列在多行均亮 → 布偶猫的白色毛发导致定位框偏移,裁切区域含过多背景

此时需针对性增强:

  1. 对暹罗/孟加拉混淆,增加RandomGrayscale(p=0.3)强制灰度训练,削弱颜色依赖;
  2. 对布偶猫定位不准,在tools/crop_by_bbox.py中将裁切比例从1.2x提升至1.5x,确保完整捕获白色毛发区域。

4.2 ONNX导出与推理加速:脱离PyTorch环境的轻量部署

为嵌入式或Web部署,需导出ONNX模型并验证精度损失:

# 导出(注意:必须用--cls-head cat参数) python export.py \ --weights runs/train/cat_yolov5s_v1/weights/best.pt \ --include onnx \ --imgsz 640 \ --cls-head cat \ --dynamic # 启用动态轴,适配任意尺寸输入 # 验证ONNX精度(与PyTorch输出对比) python tools/verify_onnx.py \ --onnx runs/train/cat_yolov5s_v1/weights/best.onnx \ --img-dir datasets/cat/images/val/ \ --label-dir datasets/cat/labels/val/ \ --data data/cat.yaml \ --tolerance 0.001 # 允许1e-3数值误差

verify_onnx.py输出:

ONNX inference matches PyTorch (max diff: 0.0008 < tolerance 0.001) mAP@0.5: PyTorch=0.913, ONNX=0.911 → 精度损失0.22%,可接受

导出的best.onnx可直接用于:

  • OpenCV DNN模块(C++/Python)
  • TensorRT加速(需trtexec --onnx=best.onnx --fp16
  • Web端ONNX Runtime(通过onnxruntime-web

4.3 实时摄像头推理:用OpenCV构建低延迟识别流水线

demo/webcam_demo.py提供开箱即用的摄像头识别:

import cv2 import numpy as np import onnxruntime as ort # 加载ONNX模型(CPU模式) session = ort.InferenceSession("runs/train/cat_yolov5s_v1/weights/best.onnx", providers=['CPUExecutionProvider']) cap = cv2.VideoCapture(0) while cap.isOpened(): ret, frame = cap.read() if not ret: break # 预处理:BGR→RGB→归一化→NHWC→NCHW img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) img = cv2.resize(img, (640, 640)) img = img.astype(np.float32) / 255.0 img = np.transpose(img, (2, 0, 1)) # HWC→CHW img = np.expand_dims(img, 0) # CHW→NCHW # ONNX推理 outputs = session.run(None, {"images": img}) pred_cls = np.argmax(outputs[0]) # outputs[0]为分类logits conf = float(np.max(softmax(outputs[0]))) # softmax后取最大置信度 # 叠加结果 name = ["Abyssinian","Bengal",...][pred_cls] cv2.putText(frame, f"{name} {conf:.2f}", (10,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2) cv2.imshow("Cat Recognition", frame) if cv2.waitKey(1) == ord('q'): break cap.release() cv2.destroyAllWindows()

实测性能(Intel i7-11800H + RTX3060):

  • PyTorch CPU:2.1 FPS
  • ONNX CPU:8.7 FPS(提升314%)
  • ONNX GPU(CUDA EP):42.3 FPS

注意:webcam_demo.py中已内置帧率统计(cv2.getTickCount())和自动尺寸适配(根据摄像头实际分辨率缩放),无需修改即可在不同设备运行。

5. 期末答辩加分项:用Grad-CAM热力图讲清“模型为什么这么判”

5.1 生成高分辨率热力图的三步法

答辩时展示热力图,比单纯说“准确率91%”更有说服力。tools/gradcam_demo.py提供专业级可视化:

python tools/gradcam_demo.py \ --model runs/train/cat_yolov5s_v1/weights/best.pt \ --img datasets/cat/images/val/0001.jpg \ --output runs/gradcam/0001_ragdoll.png \ --cls-head cat \ --target-layer model.model[10] # 指定backbone最后一层,聚焦高级语义

生成的0001_ragdoll.png包含:

  • 左:原图 + 预测框 + 品种标签
  • 中:Grad-CAM热力图(Jet色谱,红色=高响应)
  • 右:热力图叠加原图(Alpha混合)

关键技巧--target-layer参数决定解释粒度:

  • model.model[10](默认):backbone输出,显示整体判别区域(如整张猫脸)
  • model.model[8]:neck层,显示多尺度特征融合响应(如耳朵+眼睛协同)
  • model.model[2]:stem层,显示底层纹理响应(如毛发方向)

5.2 热力图解读话术:把技术细节转化为答辩语言

面对评委提问“模型依据什么判断是布偶猫?”,不要只说“看热力图”。用三句话结构化回答:

  1. 定位事实:“您看这张热力图叠加图(指向右侧),红色高亮区域集中在猫的蓝色虹膜和耳尖白色绒毛——这正是布偶猫的两个核心形态学特征。”
  2. 对比佐证:“对比这张暹罗猫的热力图(切换PPT),高亮区在深色面部和蓝色虹膜,但耳尖无响应——说明模型成功区分了‘耳尖白毛’这一布偶特有性状。”
  3. 方法论升华:“我们通过Grad-CAM将黑盒模型转化为可验证的生物学判据,这不仅是技术实现,更是细粒度识别任务可信赖性的基础。”

提示:答辩PPT中务必放对比图(布偶vs暹罗热力图),并用箭头标注关键响应区。源码包中docs/gradcam_examples/已预生成12个品种的典型热力图,可直接使用。

5.3 模型鲁棒性验证:用对抗样本测试泛化边界

为证明模型非“死记硬背”,用tools/test_robustness.py生成对抗样本:

python tools/test_robustness.py \ --model runs/train/cat_yolov5s_v1/weights/best.pt \ --img datasets/cat/images/val/0001.jpg \ --epsilon 0.01 \ # 扰动强度,0.01为肉眼不可见 --iterations 20 \ # FGSM迭代次数 --target-class Ragdoll \ # 指定目标类别,测试是否被误导 --output runs/robust/0001_adv.png

结果分析表(runs/robust/summary.csv):

图片原预测对抗后预测置信度变化是否被误导
0001.jpgRagdoll (0.98)Ragdoll (0.92)-0.06
0002.jpgSiamese (0.95)Bengal (0.87)-0.08

若被误导率<5%,可结论:“模型对微小扰动鲁棒,判别依据稳定,非过拟合训练集噪声”。此数据是答辩中体现工程严谨性的黄金指标。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 13:21:02

SpringBoot酒店系统毕设工程包:可运行+可答辩+可拓展

简介&#xff1a;本资源是一套完整的本科毕业设计项目——基于SpringBoot开发的酒店管理系统&#xff0c;面向计算机相关专业学生及Java初学者&#xff0c;解决课程设计、毕设选题与企业级Web应用开发入门实践需求。压缩包共83个文件&#xff0c;含62个Java核心业务类&#xff…

作者头像 李华
网站建设 2026/9/13 13:19:34

Argo CD RBAC 权限配置完全指南:从内置角色到细粒度资源授权

Argo CD RBAC 权限配置完全指南&#xff1a;从内置角色到细粒度资源授权 【免费下载链接】argo-cd Declarative Continuous Deployment for Kubernetes 项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd Argo CD 作为 Kubernetes 的声明式持续交付工具&#x…

作者头像 李华
网站建设 2026/9/13 13:15:30

ML-KWS-for-MCU源码静态评测:嵌入式边缘AI部署的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 13:12:05

多传感器融合方案对比:从架构选型到算法落地全梳理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 13:12:04

YOLO疲劳驾驶检测:三种标签格式对齐与训练全流程

简介&#xff1a;YOLO疲劳驾驶目标检测数据集面向计算机视觉目标检测方向的开发者与学生&#xff0c;提供真实驾驶场景下高质量图片共1000张&#xff0c;场景覆盖日间、夜间、不同光照及视角&#xff0c;可用于疲劳驾驶行为识别模型的训练与验证。压缩包内共2000个文件&#xf…

作者头像 李华