ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

YOLOv11细粒度鱼类识别与疾病检测实战:从数据集构建到训练调参全流程

YOLOv11细粒度鱼类识别与疾病检测实战:从数据集构建到训练调参全流程 1. 从一条“鲷鱼识别”需求说起这个项目到底在解决什么问题第一次看到这个标题的时候我脑子里冒出来的第一个念头是又是一个“看起来简单、做起来全是坑”的细粒度分类任务。标题里提到的感星鲷、参鲷、乔皮鲷、石鲷、嫩鲷这几个名字乍一看像是某种地方俗称实际上它们指向的是同一大类鱼种下的不同细分品类。做过鱼类识别的人都知道识别“这是一条鱼”和识别“这是哪一类鲷”完全是两个难度量级的事情——前者是粗粒度目标检测后者是细粒度分类两者对数据标注质量、模型特征提取能力、训练策略的要求天差地别。这个项目的核心目标很明确用 YOLOv11 训练一个能够识别多种鲷鱼品类的检测模型同时兼顾鱼类相关疾病的检测。注意这里有两个任务叠在一起——鱼种识别和疾病检测。很多人拿到这类需求的第一反应是“一个模型全搞定”但实际操作下来你会发现这两个任务的标注逻辑、样本分布、特征关注点都不一样怎么在 YOLOv11 的框架下把它们协调好是这个项目最值得聊的地方。适合谁来参考这篇内容如果你手头正好有一个多类别、细粒度的检测数据集要跑 YOLOv11或者你在做水产养殖相关的视觉检测项目再或者你只是想把 YOLOv11 的训练流程从头到尾走一遍并且不想踩那些“文档里不会写”的坑那这篇内容应该能帮你省下不少时间。我会从数据集构建、环境配置、训练参数、疾病检测的特殊处理、小目标优化、推理部署这几个维度把整个流程拆开讲清楚每个关键决策都会说明为什么这么做。需要提前说明的是标题里提到的具体鱼种名称属于地方性叫法不同地区的命名可能有差异实际做项目时你需要根据自己手头的样本重新确认类别体系。这一点在后面讲数据集构建的时候会详细展开。2. 数据集构建细粒度鱼类标注的难点与应对策略2.1 类别体系设计为什么不能直接把所有鲷鱼当成一类细粒度分类的第一道坎就是类别体系的设计。假设你手头有五个鲷鱼品类——感星鲷、参鲷、乔皮鲷、石鲷、嫩鲷再加上疾病类别比如烂鳍、白点、溃疡等你的类别列表可能会变成十几个甚至更多。这里有个很容易犯的错误把“鱼种”和“疾病”混在同一个层级里做分类。正确的做法是分层设计。YOLOv11 本身是一个检测框架它的输出是边界框加类别标签。你可以把鱼种和疾病都作为独立的类别标签但需要在标注阶段就明确区分鱼种的框标注的是整条鱼疾病的框标注的是病灶区域。这两类框的尺度差异可能非常大——整条鱼可能占据画面的大部分而病灶可能只有几十个像素。如果不做区分模型在训练时会被尺度差异搞得很难收敛。我通常建议的做法是先做鱼种检测再在检测到的鱼体区域内做疾病分类或病灶检测。这样可以把两个任务的难度解耦。如果一定要用一个模型端到端搞定那在标注阶段就要严格控制两类框的比例并且在训练时用不同的 anchor 尺度来适配。另一个关键点是类别的互斥性。感星鲷和参鲷如果在视觉上非常接近那你的标注一致性就会成为大问题。我见过太多项目因为标注员对两个相似品类的判断标准不统一导致模型学出来的决策边界乱七八糟。解决办法是在标注前先做一轮“标定训练”——找几十张典型样本让所有标注员分别标一遍对比结果统一标准后再正式开工。2.2 数据采集水下环境和养殖场景的特殊性鱼类数据集的采集和常规的 COCO、VOC 数据集完全不是一个路数。水下环境的光照条件、水体浑浊度、鱼体的姿态变化、遮挡问题都会直接影响模型的泛化能力。如果你是从养殖池或者水箱里采集数据还要考虑水面反光、玻璃折射这些干扰因素。我的经验是采集阶段就要有意识地覆盖以下几种场景不同光照条件自然光、人工补光、阴天、强光直射每种条件至少采集一定比例的样本不同拍摄角度俯拍、侧拍、斜拍鱼体在画面中的朝向要多样化不同密度场景单条鱼、多条鱼聚集、鱼群密集重叠不同水质条件清澈、微浊、浑浊这一点对疾病检测尤其重要因为水质直接影响病灶的可见度如果条件允许尽量用固定机位加定时抓拍的方式采集这样可以保证数据分布的一致性减少后期清洗的工作量。移动拍摄虽然能增加多样性但也会引入大量运动模糊的废片。关于数据量细粒度分类任务对样本量的要求比粗粒度检测高得多。我的经验值是每个鱼种类别至少需要 300-500 张有效样本疾病类别因为病灶区域更小、特征更微妙建议每个类别不少于 500 张。如果某些类别实在凑不够可以考虑用数据增强来补但增强策略要针对水下场景做定制不能直接套用常规的翻转裁剪。2.3 标注规范边界框的松紧程度直接影响模型性能标注这件事说起来简单做起来全是细节。鱼类检测的边界框标注有一个很容易被忽略的问题框的松紧程度。框得太紧鱼鳍、鱼尾这些判别性特征可能被切掉框得太松背景信息混入太多模型容易学到无关特征。我的建议是对于鱼种识别任务边界框应该包含整条鱼的可见部分包括鱼鳍和鱼尾但不要包含太多背景。对于疾病检测任务边界框应该紧贴病灶区域宁可稍微紧一点也不要松因为病灶周围的正常组织混入会稀释疾病特征。还有一个实操细节当多条鱼重叠时被遮挡的鱼怎么标我的做法是如果遮挡面积超过 50%这条鱼就不标如果遮挡面积在 20%-50% 之间标可见部分并在标注文件中加一个occluded属性如果遮挡小于 20%正常标注。这个规则要在标注规范里写清楚否则不同标注员的理解会不一致。标注工具方面LabelImg、CVAT、Roboflow 都可以用。如果团队协作CVAT 的多人协作和审核流程更完善一些。导出格式统一用 YOLO 格式每张图对应一个 txt 文件每行是class_id x_center y_center width height坐标归一化到 0-1。3. YOLOv11 训练环境搭建从零到跑通第一条命令3.1 硬件选型与显存估算YOLOv11 的训练对显存的要求取决于模型规模、输入分辨率和 batch size。以 YOLOv11m 为例输入分辨率 640x640batch size 设为 16 时显存占用大约在 8-10GB。如果你用的是 YOLOv11l 或 YOLOv11x显存需求会更高建议至少 16GB 显存起步。如果手头只有消费级显卡比如 8GB 显存的型号可以通过以下方式降低显存占用减小 batch size但不要小于 8否则 BN 层的统计量会不稳定使用梯度累积来模拟大 batch降低输入分辨率但要注意小目标检测性能会下降使用混合精度训练AMP这个基本是标配能省 30%-40% 显存CPU 方面数据加载和增强会占用不少计算资源建议至少 8 核。内存 32GB 起步如果数据集很大超过 10 万张64GB 更稳妥。存储方面SSD 是必须的机械硬盘在随机读取大量小文件时会成为瓶颈。3.2 环境配置的完整步骤我习惯用 conda 来管理环境这样不同项目之间不会互相污染。以下是完整的配置流程# 创建虚拟环境 conda create -n yolo11 python3.10 -y conda activate yolo11 # 安装 PyTorch根据你的 CUDA 版本选择对应命令 # CUDA 11.8 的情况 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装 ultralytics pip install ultralytics # 验证安装 yolo checksyolo checks这个命令会输出当前环境的基本信息包括 PyTorch 版本、CUDA 是否可用、GPU 型号等。如果 CUDA 显示不可用大概率是 PyTorch 版本和 CUDA 驱动不匹配需要重新安装对应版本的 PyTorch。有一个坑我踩过好几次conda 环境里同时装了 pip 和 conda 版本的 PyTorch导致版本冲突。解决办法是统一用 pip 安装或者在 conda 安装后不要再动 pip。检查方法是pip list | grep torch和conda list | grep torch看两边版本是否一致。3.3 数据集目录结构与配置文件YOLOv11 要求的数据集目录结构如下dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yamldata.yaml的内容path: /path/to/dataset train: images/train val: images/val test: images/test names: 0: ganxingdiao 1: candiao 2: qiaopidiao 3: shidiao 4: nendiao 5: disease_rot_fin 6: disease_white_spot 7: disease_ulcer这里有个细节类别名称建议用英文或拼音不要用中文。虽然 YOLOv11 理论上支持中文类别名但在实际训练和推理过程中中文编码问题可能会引发一些莫名其妙的错误尤其是在跨平台部署时。训练集、验证集、测试集的比例我的习惯是 7:2:1。如果数据量特别大超过 5 万张可以调整为 8:1:1。验证集的作用是监控训练过程中的过拟合情况测试集只在最后评估时用一次不要拿来调参。4. 训练参数配置每个参数背后的逻辑4.1 模型规模选择n/s/m/l/x 怎么选YOLOv11 提供了 n、s、m、l、x 五个规模。选择哪个取决于你的精度要求和部署环境。模型参数量mAPCOCO推理速度V100适用场景YOLOv11n2.6M39.5最快边缘设备、实时性要求极高YOLOv11s9.4M47.0快移动端、嵌入式YOLOv11m20.1M51.5中等服务器端、精度与速度平衡YOLOv11l25.3M53.4较慢高精度场景YOLOv11x56.9M54.7最慢精度优先、算力充足对于鱼类细粒度识别我的建议是从 YOLOv11m 起步。原因是细粒度分类需要模型有足够的容量来捕捉细微的纹理差异n 和 s 规模的特征提取能力可能不够。如果 m 的精度不达标再往上试 l 或 x。如果部署环境算力有限可以先在 m 上训练好然后用知识蒸馏的方式压缩到 s。4.2 关键训练参数的含义与设置yolo detect train \ modelyolo11m.pt \ datadata.yaml \ epochs200 \ imgsz640 \ batch16 \ lr00.01 \ lrf0.01 \ momentum0.937 \ weight_decay0.0005 \ warmup_epochs3 \ warmup_momentum0.8 \ cos_lrTrue \ patience50 \ save_period10 \ device0逐个解释这些参数epochs200细粒度任务通常需要更多轮次才能收敛200 是一个比较稳妥的起点。如果验证集 loss 在 50 轮内没有下降可以提前停止。imgsz640输入分辨率。如果疾病病灶很小可以考虑提高到 1280但显存占用会翻倍。batch16根据显存调整8-32 之间。lr00.01初始学习率。YOLOv11 的默认值是 0.01如果训练不稳定loss 震荡剧烈可以降到 0.001。lrf0.01最终学习率因子即最终学习率 lr0 * lrf。cos_lrTrue使用余弦退火学习率调度比阶梯式下降更平滑。patience50如果 50 轮内验证指标没有提升自动停止训练。save_period10每 10 轮保存一次权重防止训练中断丢失进度。有一个参数标题里没提但很重要close_mosaic。YOLOv11 默认在最后 10 轮关闭 Mosaic 增强这个设置对细粒度任务很关键因为 Mosaic 会把四张图拼在一起可能破坏鱼体的完整性影响细粒度特征的学
返回列表