尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

YOLOv5花卉识别源码包全解析:从配置文件到训练避坑指南

YOLOv5花卉识别源码包全解析:从配置文件到训练避坑指南 简介面向深度学习入门者和目标检测开发者这套基于Python与Shell语言的YOLOv5花卉识别模型设计源码提供了从数据配置、模型训练到结果输出的完整实现。它围绕YOLOv5模型实现花卉的智能识别与分类涵盖数据预处理、模型训练、验证推理等环节不仅适合教学演示也可作为自定义图像识别任务的改造基础。压缩包共102个文件以40个YAML配置、32个Python源文件、11个YAML模板、5个Shell脚本为主体另有TXT文档、JPG示例图片、Dockerfile及Git配置等。YAML文件定义数据集与训练参数Python源码实现核心逻辑Shell脚本用于自动化流程Dockerfile则方便环境部署。资源仅1.19MB轻量紧凑但结构完整。目前已有370人学习适合想通过完整项目快速上手YOLOv5或研究花卉识别场景的读者。打包内容包含教程notebook、示例图片、Docker与Git配置便于直接阅读源码、调整配置并尝试复现训练流程。1. 这不是普通源码包yolov5 花卉识别的文件地图拿到一份 yolov5 花卉识别源码包解压之后第一反应通常是懵的101 个文件堆在一起40 个 YAML 配置、29 个 Python 源码、5 个 Shell 脚本还有 Dockerfile、tutorial.ipynb、bus.jpg、zidane.jpg 这些看起来跟「花」毫无关系的东西。这个包的本质是把 YOLOv5 目标检测框架和花卉识别场景做了一次完整打包数据集配置、模型结构、超参数、训练与推理入口、自动化脚本、容器化部署全都有。它适合两类人一类是刚入门目标检测、想用现成代码跑通花卉识别的新手另一类是想研究 YOLOv5 训练链路、自己改数据集改参数的从业者。这篇文章我按实际落地顺序拆先讲配置文件怎么读再讲训练和推理入口然后说 Shell 脚本和 Docker 化最后把复现过程中最常见的五个坑列清楚。2. 把 40 个 YAML 配置拆开三类文件各管什么很多人拿到源码包先翻 Python 文件这是错的。YOLOv5 里 YAML 才是真正的控制中心40 个 YAML 看着吓人归类之后只有三类数据集配置、模型结构配置、超参数配置。搞懂这三类的职责和联动关系后面所有命令都通了一半。2.1 配置文件的分层数据集、模型结构与超参数YOLOv5 官方源码的配置目录里YAML 从来不是平铺的而是按功能分层的。数据集配置放在data/目录下定义「拿什么数据训练」模型结构配置放在models/目录下定义「网络长什么样」超参数配置放在data/hyps/目录下定义「训练过程怎么调优」。我每次拿到新源码包都会先列表格把这三类分别对应到哪些文件几十个 YAML 瞬间就清晰了。配置类型典型文件位置核心字段回答的问题数据集配置data/*.yamlpath、train、val、nc、names数据在哪、有几类、类名是什么模型结构配置models/*.yamldepth_multiple、width_multiple、anchors、backbone、head网络多深多宽、锚框怎么设超参数配置data/hyps/*.yamllr0、momentum、weight_decay、mosaic、hsv_h学习率多少、数据增强开多强这三个文件在训练时必须同时指向同一套逻辑。数据集配置里写nc: 5模型结构里也要写nc: 5类别数量和类别名不一致训练直接报错。花类识别的项目里nc通常就是你定义的花卉种类数比如玫瑰、菊花、郁金香、向日葵、百合这种五分类。下面是这个源码包里最核心的数据集配置示例我建议你用编辑器打开后逐行对一遍# data/flower.yaml path: ./datasets/flower # 数据集根目录后续 train/val 都是相对这个路径 train: images/train # 训练集图片目录 val: images/val # 验证集图片目录 nc: 5 # 类别数量必须与模型结构配置里的 nc 一致 names: [rose, chrysanthemum, tulip, sunflower, lily]path 定义的是绝对或相对根路径train 和 val 是相对于 path 的路径。YOLOv5 会到path/train下找图片到path/labels/train下找标注目录结构在下一章细说。这里最容易翻车的点是nc和names列表长度不匹配。names里写了 5 个nc却是 80很多人复制 COCO 配置忘了改训练时类别数错乱loss 计算直接出问题。模型结构配置比数据集配置更抽象一些里面最关键的三个参数是depth_multiple、width_multiple和anchors# models/yolov5s.yaml nc: 5 depth_multiple: 0.33 # 网络深度缩放系数0.33 对应 yolov5s width_multiple: 0.50 # 网络宽度缩放系数0.50 对应 yolov5s anchors: - [10, 13, 16, 30, 33, 23] - [30, 61, 62, 45, 59, 119] - [116, 90, 156, 198, 373, 326]depth_multiple和width_multiple决定模型大小YOLOv5 官方给的 n/s/m/l/x 五个版本就是靠这两个系数区分的。anchors是预设锚框训练到中后期 YOLOv5 会根据你的数据集自动重新计算锚框所以新手不建议手动动 anchors这属于典型「看着能优化、实际越改越差」的参数。你要做的就是把nc从 80 改成自己的花卉类别数。这个文件在源代码包里通常有多个副本对应不同模型规格选一个用就行。2.2 从模板生成自己的配置替换占位符而不是从头写源码包里有 11 个 YAML 模板文件这些模板存在的意义就是让你别从零开始写配置。常见做法是模板里用占位符标记需要替换的位置然后通过 Shell 脚本批量生成正式配置。比如把模板中的类别数占位符{{NC}}和类别名占位符{{NAMES}}批量替换成花卉识别需要的值# 从模板生成 flower.yaml替换类别数和类别名 sed s/{{NC}}/5/ templates/data_template.yaml data/flower.yaml sed -i s/{{NAMES}}/[rose, chrysanthemum, tulip, sunflower, lily]/ data/flower.yaml第一条命令把{{NC}}替换成5输出重定向到data/flower.yaml生成新文件。第二条命令用-i原地修改把{{NAMES}}替换成实际的类别名列表。这里有个细节sed替换中括号[和]在正则表达式里有特殊含义所以替换包含列表的内容时建议用单引号把整个表达式包住避免 Shell 先做了路径展开。如果模板里占位符比较多我一般直接写成 Python 脚本因为 Python 处理 YAML 结构更直接不用跟正则转义较劲# replace_template.py import yaml template yaml.safe_load(open(templates/data_template.yaml)) template[nc] 5 template[names] [rose, chrysanthemum, tulip, sunflower, lily] yaml.safe_dump(template, open(data/flower.yaml, w), allow_unicodeTrue)这个脚本的好处是直接把 YAML 当字典操作不存在正则转义问题。注意yaml.safe_dump写文件时用allow_unicodeTrue否则中文花卉名会被转成\u82b1这类 Unicode 转义虽然能运行但可读性很差。模板驱动配置的方式在团队协作里也很实用别人不需要理解 YAML 结构只要改一个模板文件就能生成全套配置。2.3 配置一致性检查批量验证 40 个 YAML 不让训练翻车40 个 YAML 文件分散在多个目录手动逐个检查nc一致性不现实。我的习惯是训练前先跑一个配置扫描脚本把 data 目录下所有数据集配置的nc和names数量对比一遍发现问题直接打印出来。花不了几分钟但能省下训练跑到一半才发现类别数不对的后悔药# check_configs.py import yaml, glob for f in sorted(glob.glob(data/*.yaml)): with open(f, encodingutf-8) as fp: cfg yaml.safe_load(fp) if not cfg or nc not in cfg: continue names cfg.get(names) if names and len(names) ! cfg[nc]: print(f{f}: nc{cfg[nc]} 但 names 有 {len(names)} 项不一致) else: print(f{f}: OK, nc{cfg[nc]})脚本逻辑很简单用glob.glob找到 data 目录下所有 yaml 文件逐个读取nc和names字段比较两者数量是否一致。有些数据配置没有names字段比如纯检测场景只关心类别数所以要加if names的判断不然会把没写 names 的合法配置误报成错误。跑完如果没有任何报错说明数据集层面没问题可以放心进入训练阶段。提示glob匹配到的文件顺序不确定加sorted是为了输出顺序稳定排查问题时更容易定位。3. 训练与推理链路29 个 Python 文件里最关键的三个入口29 个 Python 文件是源码包的编程核心但没必要每个都读。训练链路真正要摸透的是三个入口train.py训练、数据加载模块读图片和标注、detect.py推理。把这三个入口搞明白整个项目就算拿下了。其他文件比如val.py、export.py都是围绕这三个入口的辅助工具。3.1 训练入口 train.py参数传递的完整链路train.py是训练的主入口它做的事情可以概括为读取你指定的数据和模型配置 → 加载预训练权重 → 构建数据加载器 → 进入训练循环 → 输出权重文件和训练曲线。典型的训练命令长这样# 用 yolov5s 训练花卉识别模型300 轮 python train.py \ --data data/flower.yaml \ --cfg models/yolov5s.yaml \ --weights yolov5s.pt \ --epochs 300 \ --batch-size 16 \ --imgsz 640 \ --hyp data/hyps/hyp.scratch-low.yaml \ --name flower_exp--data指向数据集配置--cfg指向模型结构配置这两个文件的nc必须一致。--weights是预训练权重路径第一次运行如果本地没有 yolov5s.pt工具会自动从官方仓库下载这个文件大概 14MB网络不通畅时容易卡住后文避坑章节会讲怎么处理。--epochs决定训练轮数--batch-size受显存限制16G 显存跑 s 版本设置 16 比较稳妥。--hyp指向超参数配置--name是这次实验的名字所有输出会存到runs/train/flower_exp/下面。训练过程中train.py会实时打印每轮的 loss、precision、recall 和 mAP 指标。训练结束后runs/train/flower_exp/目录下会生成weights/best.pt验证集表现最好的权重、weights/last.pt最后一轮的权重、hyp.yaml训练实际使用的超参数和results.png训练曲线图。我每次训练完第一件事就是看results.png它比任何日志都能说明问题具体怎么看放到最后一章。3.2 数据加载与标注格式YOLO 格式的硬规则YOLOv5 的数据加载逻辑在utils/datasets.py里它要求图片和标注文件严格遵守同名同路径的规则。正确的目录结构是这样的datasets/flower/ ├── images/ │ ├── train/ │ ├── val/ ├── labels/ │ ├── train/ │ ├── val/ └── flower.yaml图片放在images/下标注放在labels/下标注文件和图片文件同名、后缀从.jpg/.png换成.txt。比如rose_001.jpg对应的标注文件是rose_001.txt。每个 TXT 文件里每一行代表一个目标格式是五个值类别编号、中心点 x 坐标、中心点 y 坐标、目标宽度、目标高度后四个值全部归一化到 010 0.512 0.441 0.186 0.295 1 0.702 0.388 0.121 0.186 0 0.345 0.672 0.083 0.127第一行的0表示第一个目标属于类别 0rose中心点位于图片相对坐标 (0.512, 0.441)宽高分别占图片的 18.6% 和 29.5%。这个格式是 YOLO 系列的通用标准LabelImg、CVAT 这类标注工具导出 YOLO 格式时都是这个结构。我见过太多新手在标注环节就翻车要么标注文件放错目录要么中心点坐标用了像素值没归一化结果训练时 loss 正常下降但 mAP 永远上不去。数据准备阶段我会先跑一个校验脚本确认图片和标注一一对应、标注内容格式合法再进训练环节# check_labels.py import os img_dir datasets/flower/images/train label_dir datasets/flower/labels/train imgs [f for f in os.listdir(img_dir) if f.endswith((.jpg, .jpeg, .png))] missing [os.path.splitext(f)[0] .txt for f in imgs if not os.path.exists(os.path.join(label_dir, os.path.splitext(f)[0] .txt))] if missing: print(f发现 {len(missing)} 张图片缺少标注前 5 个: {missing[:5]}) else: print(图片与标注一一对应可以开训)脚本先列出图片目录下所有 jpg/png 文件再逐个检查同名 txt 是否存在。os.path.splitext把文件名拆成主名和扩展名比如rose_001.jpg拆成rose_001和.jpg这样替换扩展名不会出错。如果缺标注训练时 YOLOv5 会跳过这些图片并打印警告但有时候图片太多警告被刷掉了导致你根本不知道数据其实不完整。YOLOv5 的数据增强也在这个环节生效包括 Mosaic四张图拼一张、MixUp两张图混合、HSV 色彩抖动等。这些增强的开关和强度都在data/hyps/hyp.scratch-low.yaml里配置花卉识别的场景下HSV 增强对泛化能力提升很明显因为同一种花在不同光照条件下颜色差异很大。3.3 推理入口 detect.py图片变成带框标注的最后一公里训练完拿到best.pt下一步就是推理。detect.py是推理入口它把图片输入模型输出带类别和置信度的标注框。这里涉及 YOLOv5 的后处理流程模型输出的原始预测框要经过置信度过滤和 NMS非极大值抑制才能变成最终结果。这两个环节的参数直接影响识别效果# 用训练好的权重识别一张花卉图片 python detect.py \ --weights runs/train/flower_exp/weights/best.pt \ --source data/images/flower_test.jpg \ --conf-thres 0.25 \ --iou-thres 0.45 \ --save-txt \ --save-conf--conf-thres是置信度阈值模型对每个框会输出一个「这个框里是花的概率」低于 0.25 的框直接丢弃。阈值设低了会出现大量误检框设高了会漏掉真正的小花。--iou-thres是 NMS 的 IoU 阈值两个框重叠面积超过 45% 时置信度低的那个会被抑制掉这是后处理中最容易影响视觉效果的一个参数。--save-txt把推理结果存成 txt 文件--save-conf同时在 txt 里附带置信度值做指标分析时这两个参数建议一直开着。跑完命令结果输出在runs/detect/exp/目录下包含画好框的图片和对应的 txt 标注。如果重复运行目录会自动变成exp2、exp3所以建议用--project指定输出目录、--name指定实验名不然几十次推理下来目录列表根本分不清哪次是哪次。4. Shell 脚本与 Docker 化自动化训练流程里的细节源码包里 5 个 Shell 脚本承担的是「把复杂流程变成一条命令」的职责。深度学习项目的日常操作其实就几件事装环境、下数据、训练、推理、导出模型。Shell 脚本把这五步各自封装起来比每次手动敲一长串 python 命令可靠得多。我见过太多人在这块图省事直接复制命令跑结果环境变量没加载、目录不存在跑一半就挂。4.1 五个 Shell 脚本在流水线里的位置这个源码包里的 Shell 脚本数量不多但分工很清晰。常见的组织方式是一个脚本负责一个环节五脚本覆盖完整链路脚本分工典型职责关键内容环境安装创建虚拟环境、安装依赖pip install -r requirements.txt数据准备下载或整理数据集校验目录结构、划分 train/val训练脚本启动训练并记录日志封装 train.py 全部参数推理脚本批量推理测试图片封装 detect.py 参数模型导出导出 ONNX/TensorRT封装 export.py训练脚本是这组脚本的核心一个合格的train.sh至少要做到「出错立即停」和「日志不留死角」。我写 Shell 脚本有个铁律开头一定加set -e任何一行命令失败就立刻退出绝对不让错误状态下的训练继续往下跑#!/bin/bash # 训练花卉识别模型的主脚本 set -e # 任何一步出错立即退出避免带着错误状态继续跑 DATA${DATA:-data/flower.yaml} CFG${CFG:-models/yolov5s.yaml} EPOCHS${EPOCHS:-300} BATCH${BATCH:-16} echo [INFO] 开始训练: data$DATA epochs$EPOCHS python train.py \ --data $DATA \ --cfg $CFG \ --epochs $EPOCHS \ --batch-size $BATCH \ --name flower_exp 21 | tee train.log echo [INFO] 训练完成权重保存在 runs/train/flower_exp/weights/变量DATA${DATA:-data/flower.yaml}的含义是如果环境变量DATA没设就用默认值data/flower.yaml。这样写的好处是你可以在不改脚本的情况下临时覆盖参数执行DATAdata/other.yaml ./train.sh脚本就会用你指定的数据集配置。21 | tee train.log这行的作用是把标准错误输出重定向到标准输出再同时写到终端和train.log文件训练过程中产生的几千行日志不会因为终端翻页而丢失。用这个脚本时最常见的报错是Permission denied原因是脚本没有可执行权限。解决方式有两种chmod x train.sh之后直接./train.sh或者用bash train.sh强制执行。我建议养成chmod x的习惯因为依赖bash前缀调用时一旦脚本里用了 source 等相对路径逻辑工作目录不同会导致路径解析错乱。4.2 Dockerfile 与 .dockerignore训练环境不再玄学深度学习最烦的问题就是环境不一致这台机器能跑换一台就报 CUDA 错误。Docker 存在的意义就是把 Python 版本、CUDA 版本、PyTorch 版本全部锁进镜像里。源码包里的 Dockerfile 基于 NVIDIA 官方 CUDA 镜像构建核心步骤是装系统依赖、克隆代码、装 Python 依赖FROM nvidia/cuda:11.6.2-cudnn8-devel-ubuntu20.04 RUN apt update apt install -y git WORKDIR /usr/src/app RUN git clone https://github.com/ultralytics/yolov5 . RUN pip install -r requirements.txt构建镜像时.dockerignore文件的作用被很多人忽略但它直接影响镜像体积和构建速度。如果.dockerignore没配好构建上下文会把runs/训练产物、datasets/数据集、__pycache__/缓存全部打进镜像一个几百 MB 的镜像能被撑到几个 GB。正确做法是把这些运行时才需要的文件全部排除runs/ datasets/ __pycache__/ *.pt *.log.dockerignore的语法和.gitignore几乎一样每一行是一个匹配模式。*.pt排除所有 PyTorch 权重文件因为权重应该通过docker run -v挂载进容器而不是塞进镜像层。构建完成后训练和推理都通过挂载方式访问宿主机的数据和权重镜像本身只保留代码和依赖。这一套跑通之后换机器部署只需要docker build一次之前那种「在本机能跑、到服务器就崩」的玄学问题基本绝迹。4.3 环境依赖管理Python 版本与 PyTorch 的匹配装环境是 Shell 脚本里最容易踩坑的环节核心矛盾在于 PyTorch 和 CUDA 的版本匹配。源码包里的 requirements.txt 列出了项目依赖但里面锁定的 torch/torchvision 版本不一定适配你机器上的 CUDA 驱动。我一般在执行 requirements.txt 之前先单独确认环境。# 先确认显卡驱动支持的 CUDA 版本 nvidia-smi # 再确认当前安装的 PyTorch 是否可用 GPU python -c import torch; print(torch.__version__, torch.cuda.is_available())nvidia-smi输出里右上角的 CUDA Version 表示驱动支持的最高 CUDA 版本这个版本必须不低于 PyTorch 编译时的 CUDA 版本。比如驱动支持 CUDA 12.1那安装 PyTorch 的 cu118 或 cu121 版本都能跑。如果 PyTorch 需要 CUDA 11.8但驱动只支持到 11.0就会报CUDA error: no kernel image is available。我一般先装 PyTorch 再装其他依赖避免 requirements.txt 里的 torch 版本覆盖掉你精心选好的版本pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install -r requirements.txt用--index-url指定 PyTorch 官方索引这样 pip 不会去默认源找一个可能不兼容的版本。装完之后立刻跑torch.cuda.is_available()返回 True 再继续这一步能挡掉后续一半以上的报错。5. 五个常见坑下载、CUDA、路径、标注、显存的排查记录复现任何 YOLOv5 项目最浪费时间的一定是环境和数据问题而不是模型本身。这一章我整理了五个高频坑按「现象 → 原因 → 解决」的方式记录碰到类似问题可以直接对照排查。5.1 环境与部署坑权重下载卡死与 CUDA 不匹配坑一训练卡在权重下载进度条半天不动现象执行train.py后终端停在Downloading yolov5s.pt状态等待时间超过十分钟甚至数小时。原因预训练权重托管在海外开源平台网络条件不佳时连接受限。解决手动下载 yolov5s.pt 文件放到当前工作目录的yolov5s.pt路径再次运行训练命令时会直接加载本地权重。判断是否加载本地权重看终端日志里是否出现Loading weights from yolov5s.pt...而不是Downloading。坑二PyTorch 能安装但 GPU 不可用报 CUDA 错误现象torch.cuda.is_available()返回 False或者训练刚开始就抛CUDA error: no kernel image is available for execution on the device。原因PyTorch 的 CUDA 版本和显卡驱动不匹配。no kernel image这个报错的本质是 PyTorch 编译时针对某个 CUDA 版本生成了 GPU 内核代码而你的驱动太老无法加载这些内核。解决先跑nvidia-smi看驱动支持的 CUDA 版本再装对应版本的 PyTorch。驱动支持 CUDA 12.x 就装 cu121 或 cu118 版驱动停留在 CUDA 11.x 就装 cu113 或 cu116 版。装完重跑一次torch.cuda.is_available()确认返回 True 再开训练这个验证动作我现在每次配环境都强制走一遍。坑三Docker 容器里跑推理报错无法连接显示器现象在容器内执行detect.py时如果--source传的是摄像头设备号程序报错找不到设备。原因容器默认不共享宿主机的摄像头设备节点。解决运行容器时加--device /dev/video0:/dev/video0参数把宿主机摄像头映射进容器。如果只是处理图片文件则不受影响。5.2 数据与训练坑路径、标注与显存余量坑四训练开始就报No labels found或一直提示跳过图片现象日志里出现大量WARNING: No labels found in ...训练也能跑但每个 epoch 的样本数明显偏少。原因目录结构不对。YOLOv5 会在images/train对应位置自动找labels/train如果标注放在别的路径或者标注文件扩展名不是.txt它就认为这些图片没有标注并直接跳过。解决严格按前文目录结构整理datasets/flower/images/train配对datasets/flower/labels/train且每个 txt 和图片同名。整理完用 3.2 节的check_labels.py跑一遍确认零缺失再进训练。坑五训练中途爆显存报CUDA out of memory现象训练跑到第几十个 epoch 时进程被杀终端显示显存耗尽。原因--batch-size设置超过显卡实际可用显存或者数据集图片尺寸差异过大导致某个 batch 突然占满显存。解决把batch-size减半重试比如 16 改 8。如果减半后显存依然吃紧把--imgsz从 640 降到 512。还有一个容易忽略的点开启--cache参数把图片预加载到内存后显存和内存的占用会同时上升内存不足同样会拖慢训练甚至报错这个参数要按实际机器内存谨慎开关。# 排查显存使用情况 nvidia-smi # 降低 batch-size 后重新训练 python train.py --data data/flower.yaml --cfg models/yolov5s.yaml \ --batch-size 8 --epochs 300 --name flower_exp_fix遇到显存问题先别急着换显卡优先调 batch-size 和 imgsz。YOLOv5 对 batch-size 比较敏感调低后训练轮数不变、效果略降但至少能跑完。如果是自己的数据集还可以检查图片尺寸是否过大批量缩到 640 或者 512 能省不少显存。注意--imgsz是输入网络的图片尺寸不是原图尺寸。YOLOv5 会自动缩放所以调低它通常不会影响最终的检测精度太多但在显存紧张时是最快的止损手段。6. 进阶验证用 results.png 和三个超参数快速迭代训练跑完先别急着上生产先看runs/train/flower_exp/results.png。这张图包含训练过程中的 box_loss、val/box_loss、precision、recall、mAP 等指标曲线是判断模型是否收敛和是否过拟合最直接的依据。曲线健康表现异常表现train/box_loss持续下降并趋于平缓震荡剧烈说明学习率偏高val/box_loss与训练 loss 同步下降先降后升说明过拟合metrics/precision稳步上升后稳定在 0.9 左右波动大说明数据不干净metrics/mAP0.5趋于稳定不再明显增长涨得慢可以加轮数不涨要查数据如果 val/loss 在某个 epoch 后开始反弹而 train/loss 还在降这就是过拟合的信号。这时不要盲目加训练轮数应该调超参数。花卉识别场景我一般只动三个参数hsv_h、weight_decay、lr0。# 花卉颜色差异大增强色彩抖动帮助泛化 sed -i s/hsv_h: 0.015/hsv_h: 0.02/ data/hyps/hyp.scratch-low.yaml # 过拟合时加大权重衰减 sed -i s/weight_decay: 0.0005/weight_decay: 0.001/ data/hyps/hyp.scratch-low.yaml # 学习率过高导致 loss 震荡时调低 sed -i s/lr0: 0.01/lr0: 0.005/ data/hyps/hyp.scratch-low.yaml改完超参重新训练用val.py在验证集上评估最终权重python val.py \ --data data/flower.yaml \ --weights runs/train/flower_exp/weights/best.ptval.py会输出 mAP0.5、mAP0.5:0.95 和每类的详细指标比训练日志里的数值更全面。我最早训练花卉模型时直接跑 300 epoch第二天起来发现第 180 轮就过拟合了白白浪费一整晚。从那以后我每次拿到新数据集都强制先跑 50 轮看曲线趋势再决定要不要加长训练、要不要动超参数这个流程帮我省下的重训时间远超多花的那几十分钟。希望帮到你。本文还有配套的精品资源点击获取
返回列表