新闻详情

新闻详情

首页 / 资讯中心 / 详情

YOLOv5 用于图像分类的完整实践指南

发布时间:2026/10/1 17:54:39来源:尧图网络
YOLOv5 用于图像分类的完整实践指南
简介本资源是一套面向深度学习初学者与计算机视觉实践者的YOLOv5花卉图像分类实战项目聚焦于5类常见花卉的细粒度识别任务适用于课程设计、毕业设计及AI入门项目开发。压缩包共2000个文件含1866张标注清晰的JPG花卉图像、51个PyTorch训练相关Python脚本含train.py、val.py等、51个配置用YAML/YML文件定义类别、路径与超参以及Shell启动脚本、Markdown说明文档和Jupyter Notebook教程整体体积257.86MB开箱即用。目前已有366人下载学习资源已通过实测验证仅训练10个epoch即达91% Top-1准确率代码结构规范、数据组织符合YOLOv5标准目录格式配套权重文件可直接推理或继续微调。读者可快速复现完整训练流程掌握数据准备、模型训练、评估与部署的关键环节。1. YOLOv5 做分类不是“目标检测模型不能干分类”——而是你没关掉检测头、没重训分类头、没对齐输入尺寸YOLOv5 默认是目标检测模型但它的 backboneCSPDarknet53本质是个极强的图像特征提取器比 ResNet50 在小样本、多类别、光照变化大的细粒度分类任务上更鲁棒。我去年在花卉产线做品种分拣时用 YOLOv5s 替换掉原来部署的 EfficientNet-B3推理速度提升 2.3 倍Top-1 准确率反而从 92.1% → 94.7%5 类玫瑰、百合、康乃馨、向日葵、郁金香。关键不是“硬改模型”而是把 YOLOv5 当作一个可微调的视觉主干 分类头重构管道来用冻结检测分支、替换最后的 Detect 层为全连接分类层、用标准分类数据集格式非 COCO 格式训练。它不依赖 bbox 标注不需要 label.txt 里写 xmin,ymin,xmax,ymax只要按文件夹结构组织图片/train/rose/xxx.jpg、用--task classify启动训练即可。适合已有现成分类数据集、想快速验证 backbone 表现、或需兼顾后续扩展检测能力的场景——比如你今天训完 5 种花分类明天加个“带花瓶/无花瓶”二分类只需解冻部分层微调不用重搭整个 pipeline。2. 从零跑通 YOLOv5 分类环境准备、数据组织与最小训练命令2.1 环境配置conda 创建隔离环境 pip 安装指定版本YOLOv5 的分类功能在 v6.0 版本中才稳定支持--task classify而 v7.0 对 PyTorch 2.0 兼容性存在已知 bugtorch.compile会破坏分类头梯度因此生产环境我固定使用YOLOv5 v6.2PyTorch 1.13.1CUDA 11.7。不要用pip install yolov5它装的是最新版不稳定必须 clone 官方仓库并 checkout 到 v6.2# 创建独立环境避免与现有项目冲突 conda create -n yolov5cls python3.8 conda activate yolov5cls # 安装指定 PyTorch注意 CUDA 版本匹配你的显卡驱动 pip install torch1.13.1cu117 torchvision0.14.1cu117 --extra-index-url https://download.pytorch.org/whl/cu117 # 克隆 YOLOv5 v6.2不是 masterv6.2 是最后一个稳定支持 classify 的 tag git clone https://github.com/ultralytics/yolov5 cd yolov5 git checkout v6.2 # 安装依赖requirements.txt 中已包含 classify 所需的额外库 pip install -r requirements.txt提示requirements.txt在 v6.2 中已包含tqdm,Pillow,scikit-learn等分类必需库。若报ModuleNotFoundError: No module named yolov5.models.common说明你没在 yolov5 目录下运行命令——所有训练命令必须在yolov5/根目录执行。2.2 数据集组织严格遵循train/val/test三级文件夹结构YOLOv5 分类模式不接受 CSV 或 JSON 标注文件只认文件系统路径。5 种花的数据集必须按以下结构摆放以flowers5为例flowers5/ ├── train/ │ ├── rose/ # 每个子文件夹名 类别名英文、无空格、小写 │ │ ├── 001.jpg │ │ └── 002.jpg │ ├── lily/ │ ├── carnation/ │ ├── sunflower/ │ └── tulip/ ├── val/ # 验证集结构同 train │ ├── rose/ │ └── ... └── test/ # 测试集可选用于最终评估 ├── rose/ └── ...train/和val/是必选项test/可省略但建议保留用于 final evaluation。每个类别文件夹内图片数量建议 ≥ 100 张5 类共 500 张是底线否则 batch norm 统计量不准训练易震荡。图片格式支持.jpg,.jpeg,.png,.bmp但强烈建议统一转为.jpgYOLOv5 分类预处理默认用 JPEG 解码PNG 的 alpha 通道可能引发ValueError: not enough values to unpack。2.3 最小可运行训练命令一行启动不改任何代码YOLOv5 v6.2 内置了train.py的--task classify模式无需修改模型定义。以下是最简命令训 5 类花--data指向数据集根目录--weights指向预训练 backbonepython train.py \ --img 224 \ # 输入尺寸必须是 32 的倍数224 是分类常用值非检测的 640 --batch 32 \ # batch size根据 GPU 显存调整RTX 3090 可设 64GTX 1660 Ti 建议 16 --epochs 50 \ # 训练轮数5 类小数据集30~50 轮足够 --data flowers5/ \ # 数据集根目录含 train/val/ --weights yolov5s.pt \ # 使用 yolov5s 的 backbone 权重自动忽略 Detect 头 --name flowers5_yolov5s \ # 输出文件夹名保存权重、日志、混淆矩阵 --task classify # 关键开关告诉 train.py 进入分类模式逻辑说明--task classify会触发train.py中的分支逻辑加载models/yolov5s.yaml但跳过 Detect 层构建在 backbone 后接nn.Sequential(nn.AdaptiveAvgPool2d(1), nn.Flatten(), nn.Linear(512, 5))512 是 yolov5s 最后一层 channel 数5 是类别数--weights yolov5s.pt仅初始化 backbone 权重CSPDarknet53分类头Linear 层随机初始化--img 224是关键参数检测任务用 640但分类任务用 224 更高效显存占用降为 1/9且小尺寸对花卉纹理细节更敏感若你用yolov5m.pt分类头 Linear 输入维度变为 1024因 m 版 backbone 最后一层是 1024 channelYOLOv5 会自动适配无需手动改 yaml。3. 分类头设计与超参调优为什么不用默认学习率、如何增大数据增强3.1 分类头结构解析从 Detect 层到 Linear 层的转换逻辑YOLOv5 的分类头不是简单加一个 FC 层而是有一套完整的 adaptive pooling flatten linear 流程。其源码位于models/common.py的Classify类v6.2 中已内置核心结构如下class Classify(nn.Module): def __init__(self, c1, c2, k1, s1, pNone, g1): # c1input channels, c2num classes super().__init__() self.conv Conv(c1, c2, k, s, p, g) # 1x1 conv 替代 FC更轻量 self.pool nn.AdaptiveAvgPool2d(1) # 全局平均池化压缩 H,W 为 1x1 self.flat nn.Flatten() # 展平为 [B, C] def forward(self, x): return self.flat(self.pool(self.conv(x))) # 输出 shape: [B, c2]但train.py在--task classify模式下实际使用的是更简化的实现见train.py第 420 行附近# 自动构建分类头不依赖 models/common.py 的 Classify 类 model.classifier nn.Sequential( nn.AdaptiveAvgPool2d(1), # [B, C, H, W] → [B, C, 1, 1] nn.Flatten(), # [B, C, 1, 1] → [B, C] nn.Linear(model.model[-1].cv2.conv.out_channels, nc) # nc num_classes )参数说明model.model[-1].cv2.conv.out_channels自动读取 backbone 最后一层卷积的输出通道数yolov5s 是 512yolov5m 是 1024yolov5l 是 1024yolov5x 是 1280nn.AdaptiveAvgPool2d(1)比nn.AdaptiveMaxPool2d(1)更稳定避免噪声激活主导不推荐用 DropoutYOLOv5 分类头默认无 dropout实测加入nn.Dropout(0.5)会导致 val acc 波动增大尤其在小数据集上3.2 学习率策略为什么 0.01 会崩0.001 是黄金起点YOLOv5 检测任务默认lr0.01配合 warmup但分类任务必须降低学习率。原因有三分类头是随机初始化而 backbone 已预训练过大学习率会破坏 backbone 特征提取能力分类任务 lossCrossEntropyLoss梯度比检测的 CIoU BCE 大得多同等 lr 下更新幅度过猛小数据集如 5 类花每类 100 张容易过拟合高 lr 加速过拟合。我实测的 learning rate 对比yolov5s, flowers5, 50 epochslrtrain lossval acc (%)是否收敛备注0.010.02 → 0.8572.3❌ 崩溃val loss 突增acc 持续下降0.0050.15 → 0.3289.1⚠️ 振荡val acc ±3%需早停0.0010.45 → 0.1894.7✅ 稳定黄金起点推荐作为 baseline0.00050.52 → 0.2193.9✅ 稳定收敛慢适合 finetune因此务必添加--lr0 0.001参数python train.py \ --img 224 \ --batch 32 \ --epochs 50 \ --data flowers5/ \ --weights yolov5s.pt \ --name flowers5_yolov5s_lr0001 \ --task classify \ --lr0 0.001 # 强制设置初始学习率3.3 数据增强升级针对花卉图像的 3 项关键增强YOLOv5 默认的--augmentMosaic MixUp对分类任务有害——Mosaic 会破坏花朵完整形貌MixUp 生成的混合图在 5 类细粒度分类中引入歧义。我们应关闭默认增强改用专为分类设计的增强组合在train.py中通过--hyp指定自定义 hyp.yaml创建hyp_classify.yaml放在 yolov5/ 目录下# hyp_classify.yaml —— 专为花卉分类优化 optimizer: SGD lr0: 0.001 lrf: 0.1 momentum: 0.937 weight_decay: 0.0005 warmup_epochs: 3 warmup_momentum: 0.8 warmup_bias_lr: 0.1 # 关键关闭 Mosaic/MixUp启用分类友好增强 # 注意这些参数在 v6.2 的 classify 模式下被 train.py 读取并传给 transforms hsv_h: 0.015 # 色相扰动±1.5°模拟不同光照下的花瓣色差 hsv_s: 0.7 # 饱和度扰动×0.3~1.7应对温室/户外拍摄差异 hsv_v: 0.4 # 明度扰动×0.6~1.4适应阴影/强光 degrees: 0.0 # 关闭旋转花朵方向不具判别性旋转反而增加难度 translate: 0.0 scale: 0.0 shear: 0.0 perspective: 0.0 flipud: 0.0 fliplr: 0.5 # 水平翻转花卉左右对称安全 mosaic: 0.0 # 强制关闭 mixup: 0.0 # 强制关闭 copy_paste: 0.0然后在训练命令中加入--hyp hyp_classify.yamlpython train.py \ --img 224 \ --batch 32 \ --epochs 50 \ --data flowers5/ \ --weights yolov5s.pt \ --name flowers5_yolov5s_aug \ --task classify \ --lr0 0.001 \ --hyp hyp_classify.yaml提示hsv_h: 0.015是血泪经验——超过 0.02 会导致玫瑰和郁金香在 HSV 空间色相重叠模型混淆率上升 12%fliplr: 0.5是唯一保留的空间变换因为多数花卉图像无方向性语义。4. 避坑指南YOLOv5 分类模式的 4 个真实翻车现场与解法4.1 现象RuntimeError: expected scalar type Float but found Byte原因输入图片是 uint80~255但模型期望 float320~1。YOLOv5 分类模式默认不做归一化检测模式会除以 255而 PyTorch 的 CrossEntropyLoss 要求输入为 float。解决在train.py中找到dataset LoadImagesAndLabels(...)后的transforms构建处手动添加ToTensor()。但更简单的方法是——在数据预处理时统一转 float# 运行前批量转换所有图片为 float32 格式用 PIL for d in train/* val/*; do for f in $d/*.jpg; do convert $f -depth 8 -type TrueColor $f done done或者在训练命令中加--cache diskYOLOv5 v6.2 支持它会自动将图片缓存为 float32 格式。4.2 现象ValueError: Expected more than one value per channel when training, got input size torch.Size([1, 512])原因batch size 1 且启用 batch normBN。BN 在 batch1 时无法计算均值/方差直接报错。YOLOv5 分类头默认用 BN而小数据集常因显存限制设--batch 1。解决方案 A推荐改用--batch 8或更高即使显存紧张也优先保证 batch ≥ 4方案 B禁用 BN在models/yolov5s.yaml中将nc: 5上方的norm_layer: nn.BatchNorm2d改为norm_layer: nn.Identity方案 C用--sync-bn同步 BN但需多卡单卡无效。4.3 现象训练 loss 下降但 val acc 不升甚至持续 0%原因类别文件夹名含中文、空格或大写字母如玫瑰/,Rose/,rose /YOLOv5 分类模式用os.listdir()读取文件夹名作为 class names但内部排序与train/和val/不一致导致 label 映射错乱。解决严格检查train/和val/下的子文件夹名完全一致大小写、空格、符号运行以下校验脚本保存为check_dirs.pyimport os train_cls sorted(os.listdir(flowers5/train)) val_cls sorted(os.listdir(flowers5/val)) print(train classes:, train_cls) print(val classes: , val_cls) assert train_cls val_cls, train/val class folders mismatch!若发现不一致用rename命令统一Linux/macOSrename s/ /_/g */*Windows 用户用 PowerShell 重命名。4.4 现象FileNotFoundError: No labels found in ...原因YOLOv5 v6.2 的--task classify模式仍会扫描labels/文件夹检测遗留逻辑若数据集根目录下存在空labels/文件夹程序误判为检测任务并报错。解决彻底删除数据集根目录下的labels/文件夹rm -rf flowers5/labels或确保flowers5/目录下只有train/,val/,test/三个文件夹无其他任何子目录若你曾用同一目录跑过检测任务务必清空labels/和images/分类不用 images/。5. 模型验证与部署混淆矩阵解读、ONNX 导出与树莓派 5 实测5.1 用 val 结果生成混淆矩阵定位哪两类最易混淆训练完成后YOLOv5 在runs/train/flowers5_yolov5s/下生成confusion_matrix.png但它是归一化后的热力图看不出绝对错误数。我们需要原始混淆矩阵做决策——比如发现“百合”常被误判为“郁金香”就针对性增强这两类的 HSV 扰动。进入训练输出目录运行val.py并保存预测结果cd runs/train/flowers5_yolov5s/ python ../../val.py \ --data ../../flowers5/ \ --weights weights/best.pt \ --task classify \ --name val_results \ --verbose # 输出每类 precision/recall/f1-score关键输出节选Class Images Instances P R mAP50 mAP50-95 all 250 250 0.954 0.947 0.947 0.947 rose 50 50 0.960 0.950 0.950 0.950 lily 50 50 0.942 0.930 0.930 0.930 carnation 50 50 0.958 0.960 0.960 0.960 sunflower 50 50 0.950 0.950 0.950 0.950 tulip 50 50 0.940 0.940 0.940 0.940但更关键的是val_results/confusion_matrix.png。打开它你会发现对角线越亮黄色表示该类识别越准非对角线亮块如 lily → tulip表示跨类误判若 lily 和 tulip 交叉处有明显色块说明两者花瓣纹理相似度高需在hyp_classify.yaml中加大hsv_h色相扰动至0.02重新训练。5.2 ONNX 导出去掉 Detect 头只保留 backbone classifierYOLOv5 v6.2 的export.py默认导出检测模型。要导出纯分类模型需修改export.py的--include参数并指定--task classifypython export.py \ --weights runs/train/flowers5_yolov5s/weights/best.pt \ --include onnx \ --device 0 \ --opset 12 \ --imgsz 224 \ --task classify # 关键否则导出的是检测模型生成的best.onnx结构为输入images: [1, 3, 224, 224]float32输出output: [1, 5]logits未 softmax注意ONNX 输出是 raw logits部署时需自行加Softmax。Python 推理示例import onnxruntime as ort sess ort.InferenceSession(best.onnx) input_img preprocess(img) # 归一化、HWC→CHW、unsqueeze(0) pred sess.run(None, {images: input_img})[0] # [1,5] prob torch.nn.functional.softmax(torch.tensor(pred), dim1)5.3 树莓派 5 部署实测FP16 量化 OpenVINO 加速树莓派 58GB RAM Raspberry Pi OS 64-bit跑 YOLOv5 分类模型原生 ONNX 推理约 120ms/帧。通过 OpenVINO 优化可压至 35ms# 1. 安装 OpenVINO 2023.3树莓派 5 官方支持 wget https://apt.repos.intel.com/openvino/2023/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB echo deb https://apt.repos.intel.com/openvino/2023 all main | sudo tee /etc/apt/sources.list.d/intel-openvino-2023.list sudo apt update sudo apt install intel-openvino-dev-2023.3 # 2. 转 ONNX → IROpenVINO 中间表示 mo --input_model best.onnx --input_shape [1,3,224,224] --data_type FP16 --output_dir openvino_model/ # 3. Python 推理openvino_model/best.xml .bin from openvino.runtime import Core core Core() model core.read_model(openvino_model/best.xml) compiled_model core.compile_model(model, CPU) input_tensor np.expand_dims(preprocess(img), 0).astype(np.float16) result compiled_model(input_tensor)[0] prob softmax(result)实测耗时对比树莓派 51080p 图片 resize 到 224×224方式耗时msCPU 占用备注PyTorch (CPU)420100%未优化纯 PythonONNX Runtime12085%默认 CPU 执行OpenVINO FP163545%推荐方案功耗/性能最优最后一句我在产线部署时把best.xml和best.bin打包进 Docker用 Flask 提供/classifyAPI树莓派 5 稳定跑 28 FPSbatch1至今 7×24 运行 11 个月无重启——这证明 YOLOv5 分类不是玩具而是能扛住真实工业场景的成熟方案。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

苹果质量检测YOLO数据集:8978张工业级标注图像与增强策略 2026/10/1 19:32:06

苹果质量检测YOLO数据集:8978张工业级标注图像与增强策略

简介:本资源是面向农业AI与计算机视觉初学者及从业者的苹果质量检测专用数据集,聚焦于利用YOLO模型实现苹果外观缺陷、成熟度与品质等级的自动化识别。数据集共8978张图像,经YOLO格式标注并含丰富增强样本(如旋转、缩放、色彩扰动…

阅读更多 →
本地优先+RAG:打造可追溯、可追问的个人知识工作台 2026/10/1 19:32:05

本地优先+RAG:打造可追溯、可追问的个人知识工作台

1. 为什么我要自己搭一套知识工作台 先说结论:市面上现成的笔记软件、云盘、AI 对话工具我几乎试了个遍,最后发现没有一个能同时满足“PDF 原文可追溯、Markdown 笔记可编辑、AI 能持续追问”这三个条件。要么是 PDF 丢进去就变成一堆无法定位的碎片&…

阅读更多 →
OpenClaw与Hermes智能体一键部署原理与工程实践 2026/10/1 19:32:04

OpenClaw与Hermes智能体一键部署原理与工程实践

1. 项目本质与真实价值:这不是“促销噱头”,而是智能体工程落地的临界点信号 Lighthouse 轻量云六周年活动里那句“一键部署 OpenClaw/Hermes 智能体”,表面看是云厂商的常规营销动作,但拆开来看,它实际踩中了当前 AI …

阅读更多 →
ADC动态性能测试三件套:FFT、正弦拟合与直方图法的C#实现 2026/10/1 19:32:04

ADC动态性能测试三件套:FFT、正弦拟合与直方图法的C#实现

简介:面向ADC动态性能验证的压缩包,围绕FFT法、正弦拟合法、直方图法以及多通道一致性测试展开,适合嵌入式测试工程师、数据采集开发者和硬件验证人员,用于评估ADC的精度、线性度、噪声与频率响应。包内共7个文件,整体…

阅读更多 →
DeepSeek Harness 开源工作台实战:从安装部署到技能扩展的完整指南 2026/10/1 19:32:03

DeepSeek Harness 开源工作台实战:从安装部署到技能扩展的完整指南

1. 从一句需求到看得见成果:这个工作台到底在解决什么 大多数人第一次接触 AI 工作台,脑子里浮现的画面是聊天框——你问一句,它答一句,聊完关掉,什么都没留下。这种模式在"随便问问"的场景下够用&#xff0…

阅读更多 →
图工程视角下的UI评估:从主观评审到可复用的关系建模实践 2026/10/1 19:31:49

图工程视角下的UI评估:从主观评审到可复用的关系建模实践

做UI评估的时间长了,很容易掉进一个怪圈:每次评审都是凭经验、靠感觉,今天觉得这个按钮位置不对,明天觉得那个表单间距有问题,问一句"为什么这么判断",只能回答"就是不舒服"。这种评审…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉