☰
YOLOv11细粒度鱼类识别与疾病检测实战:从数据集构建到训练调参全流程
2026/10/1 7:31:41 网站建设 项目流程

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 为例,输入分辨率 640x640,batch 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 python=3.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 checks

yolo 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.yaml

data.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 五个规模。选择哪个,取决于你的精度要求和部署环境。

模型参数量mAP(COCO)推理速度(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 \ model=yolo11m.pt \ data=data.yaml \ epochs=200 \ imgsz=640 \ batch=16 \ lr0=0.01 \ lrf=0.01 \ momentum=0.937 \ weight_decay=0.0005 \ warmup_epochs=3 \ warmup_momentum=0.8 \ cos_lr=True \ patience=50 \ save_period=10 \ device=0

逐个解释这些参数:

  • epochs=200:细粒度任务通常需要更多轮次才能收敛,200 是一个比较稳妥的起点。如果验证集 loss 在 50 轮内没有下降,可以提前停止。
  • imgsz=640:输入分辨率。如果疾病病灶很小,可以考虑提高到 1280,但显存占用会翻倍。
  • batch=16:根据显存调整,8-32 之间。
  • lr0=0.01:初始学习率。YOLOv11 的默认值是 0.01,如果训练不稳定(loss 震荡剧烈),可以降到 0.001。
  • lrf=0.01:最终学习率因子,即最终学习率 = lr0 * lrf。
  • cos_lr=True:使用余弦退火学习率调度,比阶梯式下降更平滑。
  • patience=50:如果 50 轮内验证指标没有提升,自动停止训练。
  • save_period=10:每 10 轮保存一次权重,防止训练中断丢失进度。

有一个参数标题里没提但很重要:close_mosaic。YOLOv11 默认在最后 10 轮关闭 Mosaic 增强,这个设置对细粒度任务很关键,因为 Mosaic 会把四张图拼在一起,可能破坏鱼体的完整性,影响细粒度特征的学

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询