简介:本资源是面向农业AI、水产养殖智能化与计算机视觉初学者的YOLO目标检测专用数据集,聚焦金鱼健康状态识别这一细分渔业场景,解决传统人工巡检效率低、疾病早期发现难的问题。数据集共1657个文件,含828张JPG金鱼图像(覆盖健康、腹水病、白点病、败血症四类)、对应828个YOLO格式TXT标注文件(每图单框或多框标注),以及1个结构清晰的data.yaml配置文件,便于直接接入YOLOv8等主流框架训练。压缩包仅33.74MB,轻量易下载,适配边缘部署与教学实验。已有812人学习下载,资源经专家筛选验证,图像涵盖多角度、多光照及复杂背景,具备良好泛化性;用户可直接用于模型训练、疾病识别Demo开发、水产养殖课程案例实践或竞赛基线构建,无需额外清洗与格式转换。
1. 项目概述:从“看鱼”到“诊鱼”的智能跨越
养过金鱼的朋友都知道,观察鱼的状态是日常管理中最重要也最头疼的一环。鱼不会说话,一旦生病,初期症状往往很隐蔽,等发现时可能已经晚了。传统的观察依赖养殖者的经验,费时费力,还容易误判。这个名为“YOLO金鱼与金鱼疾病检测数据集”的项目,正是为了解决这个痛点而生。它本质上是一个为计算机视觉模型,特别是YOLO系列目标检测算法,量身定制的训练“教材”。这个数据集里包含了大量标注好的金鱼图片,不仅告诉模型“这是一条金鱼”,更进一步告诉它“这条金鱼的哪个部位出现了什么病症”,比如烂尾、白点、水霉等。通过训练,模型就能学会像一位经验丰富的鱼医一样,自动、快速、准确地识别出视频或图片中的病鱼及其病症类型。
这个项目的价值远不止于服务家庭宠物鱼爱好者。在规模化水产养殖场,动辄数万尾鱼的养殖密度下,人工巡检的效率极低,且夜间、恶劣天气下难以进行。一套基于此数据集训练出的自动化监测系统,可以7x24小时不间断工作,实时预警鱼群健康状况,指导精准用药,减少经济损失,并降低因滥用药物带来的环境和食品安全风险。对于渔业科研人员来说,一个高质量、标注精细的数据集更是无价之宝,可以用于疾病流行规律研究、新药疗效评估等。因此,这个项目看似小众,实则切入了智慧渔业、宠物健康管理乃至生物研究等多个领域的实际需求,是将前沿的AI目标检测技术落地到传统产业的一次非常有意义的尝试。
2. 数据集构建的核心思路与挑战
构建一个能用的数据集和构建一个“好用”的数据集,中间隔着巨大的工作量和技术考量。这个金鱼疾病检测数据集,其核心思路可以概括为“双重标注”和“场景还原”。
2.1 “双重标注”策略:目标与病症的绑定
普通的目标检测数据集,标注框(Bounding Box)只包含类别信息,例如“金鱼”。但对于疾病检测,这是远远不够的。本项目需要实现的是细粒度的视觉识别,因此采用了“实例级”的标注策略。具体来说,每一条金鱼都是一个独立的实例。对于健康的金鱼,标注其整体轮廓框,并赋予“健康金鱼”的类别标签。对于生病的金鱼,则需要进行更精细的标注:
- 整体框:首先框出整条鱼,类别为“病鱼”或具体疾病名(如“白点病鱼”)。
- 病灶区域框(可选但推荐):在整条鱼的框内,再对可见的典型病灶进行二次标注。例如,尾部腐烂的区域标一个框,类别为“烂尾”;体表白点密集的区域标一个框,类别为“白点病”。
这种“整体+局部”的双重标注,为模型提供了更丰富的学习信号。模型不仅能学会识别病鱼,还能初步定位病灶,这对于后续的病情严重程度评估至关重要。在数据集的标注格式上,通常采用YOLO格式的.txt文件,每一行代表一个标注对象,包含:<class_id> <x_center> <y_center> <width> <height>。对于一条同时有整体框和病灶框的病鱼,其对应的标注文件里就会有多个这样的行。
2.2 “场景还原”的数据采集
数据的质量决定了模型的天花板。金鱼疾病检测面临几个独特的挑战:
- 环境复杂:鱼缸背景多样(水草、砂石、造景)、光线多变(反光、折射)、水体可能浑浊。
- 目标多变:金鱼品种繁多(龙睛、狮头、琉金等),形态、颜色、大小差异巨大。
- 病症相似性:有些疾病初期症状相似(如轻微充血与细菌感染),需要极高分辨率的图像才能区分。
- 姿态多样:鱼是游动的,图像可能存在各种角度、遮挡(被水草或其它鱼遮挡)。
因此,在数据采集阶段就必须考虑这些因素,尽可能覆盖真实场景。一个鲁棒的数据集应该包含:
- 多环境样本:透明缸、生态缸、裸缸、室外池塘等不同背景。
- 多光照条件:自然光、室内灯光、夜间补光、避免强光直射导致过曝。
- 多疾病阶段:同一种疾病(如烂尾)的初期、中期、末期样本,这对于构建疾病预警系统尤为重要。
- 多角度与姿态:正面、侧面、俯视、倾斜角度,以及部分遮挡的样本。
注意:数据平衡是关键。切忌“健康金鱼”的图片数量远远多于“病鱼”图片,这会导致模型严重偏向于将任何鱼都预测为健康。对于每种疾病,都应保证有最低限度的样本数量(通常建议每种疾病不少于200-300个有效实例),并可以通过图像增强技术(如旋转、裁剪、调整亮度对比度、添加模拟水波纹噪声等)来适度扩充少数类别。
3. 数据标注的实操要点与工具选择
有了原始图片,下一步就是繁重但至关重要的标注工作。标注的准确性直接关系到模型性能。
3.1 标注工具选型
对于目标检测任务,有几款成熟的开源工具可供选择:
- LabelImg:老牌经典,界面简单,直接支持输出YOLO格式。适合初学者和小规模项目。
- CVAT (Computer Vision Annotation Tool):功能强大的在线标注系统,由Intel开源。支持视频标注、自动插值、团队协作、多种导出格式。对于金鱼这种动态目标,用CVAT标注视频再抽取关键帧,效率远高于逐张图片标注。
- Roboflow:不仅是一个标注工具,更是一个完整的数据集管理平台。它提供在线标注、版本控制、一键增强、自动预处理和格式转换功能,能极大提升数据准备流程的效率。对于个人或小团队项目,其免费版通常足够使用。
在本项目中,考虑到金鱼疾病的细粒度标注需求,我推荐使用CVAT或Roboflow。CVAT的视频标注功能对于捕捉游动中金鱼的不同姿态非常有用;而Roboflow的自动化工作流可以轻松实现数据增强和格式统一。
3.2 标注规范与一致性
制定并严格遵守标注规范是保证数据集质量的生命线。在开始标注前,团队必须明确以下细节:
- 类别定义:精确定义每一种疾病。例如,“白点病”是指鱼体表覆盖的明显白色颗粒状囊肿;“水霉病”是指棉絮状的菌丝附着。最好能提供标准示例图片。
- 框体范围:
- 整体框:应紧贴鱼的身体最外侧轮廓,包括所有鱼鳍。对于严重变形的鱼(如蛋种金鱼),需根据其品种特点调整。
- 病灶框:仅框出肉眼清晰可见的异常区域。对于弥散性症状(如全身充血),如果无法界定清晰边界,则只标注整体框,类别定义为该疾病。
- 遮挡与模糊处理:对于被水草严重遮挡超过50%的鱼,或画面极度模糊无法辨认的鱼,应舍弃,不予标注。部分遮挡的,按可见部分标注。
- 多病症处理:一条鱼可能同时患多种病。应分别标注各个病灶区域,并赋予相应类别。其整体框的类别可以选择最主要的一种疾病,或统一设为“复合病症”。
实操心得:标注过程最好由至少两人完成,一人标注,另一人进行交叉审核。定期召开校准会议,讨论疑难样本,统一标注尺度。可以使用标注工具中的“审阅”功能。这个过程很枯燥,但前期多花一小时统一标准,后期训练就能省下几十小时调参的功夫。
4. 数据集的组织与预处理
标注完成后,得到的是图片文件和对应的标注文件。接下来需要将其组织成模型训练所需的格式。
4.1 标准目录结构
一个清晰的目录结构有利于管理和后续的脚本处理。推荐如下结构:
Goldfish_Disease_Detection_Dataset/ ├── images/ │ ├── train/ # 训练集图片 │ ├── val/ # 验证集图片 │ └── test/ # 测试集图片(可选,也可从val划分) └── labels/ ├── train/ # 训练集标注文件(与images/train一一对应) ├── val/ # 验证集标注文件 └── test/ # 测试集标注文件数据集划分的比例通常为:训练集:验证集:测试集 = 70%:15%:15% 或 80%:10%:10%。必须确保划分是随机的,且保持类别分布大致一致,即每个集合中各类疾病的比例与整体数据集相似。
4.2 数据增强策略
针对水下检测的难点,有针对性的数据增强能显著提升模型鲁棒性。除了通用的旋转、平移、缩放、裁剪外,应重点考虑:
- 色彩抖动与模糊:模拟水体浑浊、光线变化。可以随机调整图像的亮度、对比度、饱和度和色调。
- 模拟光学效应:添加轻微的高斯模糊或运动模糊,模拟鱼快速游动或相机对焦不准的情况。
- 添加噪声:模拟水中的悬浮颗粒或传感器噪声。
- 混合与镶嵌(MixUp/Mosaic):这是YOLO系列训练中常用的强力增强技术。Mosaic将四张图片拼成一张,让模型学习在不同尺度、不同上下文中识别目标,对于小目标(如鱼身上的白点)检测特别有效。
注意事项:数据增强应在训练时**在线(on-the-fly)**进行,而不是预先处理好存下来。这样每个epoch模型看到的都是略有不同的增强图像,能更好地学习泛化特征。大多数现代深度学习框架(如PyTorch的Torchvision, Ultralytics YOLO的dataset.yaml配置)都支持方便地配置在线增强。
4.3 创建数据集配置文件
对于YOLOv5/v8等项目,需要一个描述数据集的.yaml文件。这个文件是连接数据和训练代码的桥梁。
# goldfish.yaml path: /path/to/Goldfish_Disease_Detection_Dataset # 数据集根目录 train: images/train # 训练集图片路径(相对path) val: images/val # 验证集图片路径 # 类别列表 names: 0: healthy_goldfish 1: sick_goldfish_ich # 白点病 2: sick_goldfish_fin_rot # 烂尾病 3: sick_goldfish_fungus # 水霉病 # ... 其他疾病类别这个文件会告诉训练脚本去哪里找数据,以及每个数字类别ID对应的具体名称。
5. 基于YOLO模型的训练与调优实战
数据集准备就绪后,就可以开始训练模型了。这里以目前生态最完善、应用最广泛的Ultralytics YOLOv8为例,展示核心步骤。
5.1 环境搭建与模型选择
首先安装Ultralytics库,它封装了训练、验证、预测的全流程。
pip install ultralyticsYOLOv8提供了不同尺寸的预训练模型,从轻量化的YOLOv8n(nano)到高精度的YOLOv8x。对于金鱼疾病检测,需要在速度和精度间权衡:
- 如果部署在算力有限的边缘设备(如养殖场巡检机器人、嵌入式相机),优先考虑
YOLOv8s或YOLOv8m。 - 如果用于后端服务器分析高清视频流,可以使用
YOLOv8l或YOLOv8x以获得更高精度。
对于初始尝试,建议从YOLOv8m开始,它是一个不错的平衡点。
5.2 关键训练参数解析
启动训练的核心命令很简单,但背后的参数配置大有学问。
yolo task=detect mode=train model=yolov8m.pt data=goldfish.yaml epochs=100 imgsz=640 batch=16epochs=100: 迭代轮数。对于中等规模数据集(数千张图片),100-150个epoch通常足够。可以通过观察验证集损失曲线来判断是否早停。imgsz=640: 输入图像尺寸。YOLO会将所有图片统一缩放到此尺寸。更大的尺寸(如1280)能保留更多细节,可能提升小病灶(如白点)的检测能力,但会显著增加显存消耗和训练时间。640是一个通用且高效的起点。batch=16: 批大小。取决于你的GPU显存。在显存允许的情况下,使用更大的batch size可以使训练更稳定。如果出现CUDA out of memory错误,就减小batch或imgsz。
更重要的配置在于args或配置文件中的高级参数:
optimizer: 优化器。默认是SGD,对于小数据集,AdamW有时收敛更快。lr0(初始学习率): 这是最重要的超参数之一。对于使用预训练权重的情况,学习率不宜太大,通常设置在1e-3到1e-4之间。可以从1e-3开始,如果训练不稳定(损失NaN),就降低到5e-4或1e-4。cos_lr: 启用余弦退火学习率调度。这非常有用,它让学习率随着训练过程平滑下降,有助于模型在后期收敛到更好的局部最优点。强烈建议开启。label_smoothing: 标签平滑。一种正则化技术,可以防止模型对训练数据过度自信,提升泛化能力。通常设置为0.1。mixup: 混合增强。对于防止过拟合、提升鲁棒性效果显著,建议设置为0.2左右。
5.3 训练过程监控与评估
训练开始后,Ultralytics会启动一个本地Web服务器(默认http://localhost:3000),提供实时可视化仪表板。你需要重点关注以下几个指标:
- 损失曲线(loss curves):
train/box_loss,train/cls_loss: 训练集边界框和分类损失。它们应该稳步下降。val/box_loss,val/cls_loss: 验证集损失。这是关键!理想情况下,它应随训练集损失同步下降。如果验证集损失在多个epoch后不再下降甚至上升,说明模型开始过拟合了。
- 性能指标:
mAP50(Mean Average Precision at IoU=0.5): 最常用的目标检测评估指标。它衡量模型在不同置信度阈值下的平均精度。这个值越高越好,达到0.8以上通常说明模型性能优秀。mAP50-95: 在IoU阈值从0.5到0.95(步长0.05)区间内的平均mAP,是更严格的指标,尤其考验边界框的定位精度。precision(精确率) 和recall(召回率): 需要平衡。高精确率意味着模型预测为病鱼的框里,真的病鱼比例高(误报少)。高召回率意味着实际所有的病鱼,被模型找出来的比例高(漏报少)。在实际养殖场景中,高召回率可能比高精确率更重要,因为漏检一条病鱼(假阴性)的代价,可能比误报一条健康鱼(假阳性)的代价大得多。
调优策略:如果验证集mAP在后期停滞不前,可以尝试:
- 增加数据增强的强度(如提高mosaic概率)。
- 轻微降低学习率(
lr0)并增加训练轮数(epochs)。 - 检查数据集中是否存在标注错误或模糊样本,进行清洗。
- 对于小目标(病灶)检测不佳,可以尝试将
imgsz提高到800或960(需相应调整batch)。
6. 模型部署与应用场景构建
训练出一个满意的模型(.pt文件)只是第一步,让模型在真实场景中跑起来并产生价值,才是最终目的。
6.1 模型导出与优化
YOLOv8训练出的PyTorch模型(.pt)需要根据部署环境进行转换。
- TensorRT部署(NVIDIA GPU服务器/边缘设备):这是追求极致性能的选择。使用
export.py将模型导出为TensorRT的.engine格式。
这个过程会进行图优化、层融合、精度校准(FP16/INT8),能获得数倍于原生PyTorch的推理速度。对于需要实时处理多路视频流的养殖场监控中心,TensorRT几乎是必选项。yolo export model=best.pt format=engine device=0 - ONNX Runtime部署(跨平台):如果需要部署在Intel CPU、ARM设备(如树莓派)或其它AI加速卡上,可以导出为ONNX格式。
ONNX模型可以被多种推理引擎支持,灵活性最高。yolo export model=best.pt format=onnx - OpenVINO部署(Intel CPU/集成显卡):针对Intel硬件进一步优化,能获得很好的CPU推理性能。
- CoreML或TFLite部署(移动端/嵌入式):用于iOS或Android手机APP,或TensorFlow Lite支持的边缘设备。
6.2 构建端到端应用流水线
一个完整的金鱼疾病检测系统,不仅仅是运行模型。它通常包含以下模块:
- 图像/视频采集模块:连接网络摄像头、RTSP视频流或处理上传的图片。
- 预处理模块:对输入帧进行缩放、归一化、颜色空间转换(BGR2RGB),使其符合模型输入要求。
- 推理模块:加载优化后的模型,执行前向传播,得到预测框、类别和置信度。
- 后处理模块:
- 非极大值抑制(NMS):过滤掉重叠的、低置信度的冗余预测框。YOLO输出通常已包含此步骤,但可能需要根据场景调整
conf(置信度阈值)和iou(NMS的IoU阈值)。对于疾病检测,为了高召回率,可以适当降低conf(如从0.25降到0.15)。 - 结果解析:将预测框坐标映射回原始图像尺寸,并关联类别名称。
- 非极大值抑制(NMS):过滤掉重叠的、低置信度的冗余预测框。YOLO输出通常已包含此步骤,但可能需要根据场景调整
- 业务逻辑与告警模块:
- 计数与统计:统计当前画面中健康鱼和各类病鱼的数量。
- 持续跟踪:对同一尾鱼进行跨帧跟踪(可以使用简单的IOU跟踪或DeepSORT等算法),避免重复报警。只有当某条鱼被持续多帧判定为患病,才触发告警。
- 告警触发:通过声音、灯光、手机推送、管理后台弹窗等方式,通知养殖人员。告警信息应包含时间、位置(摄像头编号)、鱼ID(可选)、疾病类型、置信度。
- 可视化与存储模块:将检测结果(带框和标签的图像)实时显示在监控大屏上,同时将告警记录、统计报表存入数据库(如MySQL、PostgreSQL)或时序数据库(如InfluxDB),用于历史查询和数据分析。
6.3 应用场景示例
- 家庭智能鱼缸监控:在鱼缸上方安装一个树莓派+摄像头模组,运行轻量化模型(如YOLOv8n-int8)。当检测到病鱼时,通过家庭Wi-Fi向主人的手机APP发送推送通知,并可能联动自动喂食器暂停喂食。
- 规模化养殖场中央监控系统:在每个鱼池安装防水摄像头,视频流通过有线网络汇聚到场部的边缘服务器或云端服务器。服务器运行高性能模型,进行7x24小时分析。系统大屏展示全场鱼池的健康热力图,并自动生成每日健康报告,指导巡检和用药。
- 渔业科研与检疫站辅助工具:科研人员或检疫员拍摄样本照片或短视频,上传至电脑端软件,软件快速给出初步诊断建议和病灶定位,辅助人工判断,提高工作效率和一致性。
7. 常见问题与排查技巧实录
在实际开发和部署过程中,你会遇到各种各样的问题。下面是我踩过的一些坑和总结的排查思路。
7.1 训练阶段问题
问题1:训练损失(loss)居高不下,或者剧烈震荡。
- 可能原因与排查:
- 学习率过高:这是最常见的原因。立即检查
lr0参数。尝试将其降低一个数量级(例如从1e-3降到1e-4)。 - 数据标注错误:检查数据集中是否存在大量错误的标注,例如框错目标、类别标错。可以可视化一部分训练数据看看。
- 数据预处理问题:检查图像和标注文件是否一一对应,路径是否正确。确认
dataset.yaml文件中的路径是绝对路径还是相对路径,确保训练脚本能正确读取。 - 模型与任务不匹配:确认你使用的是目标检测模型(
yolov8n.pt),而不是分割或分类模型。
- 学习率过高:这是最常见的原因。立即检查
问题2:验证集mAP很低,但训练集损失正常下降(过拟合)。
- 可能原因与排查:
- 数据量太少:这是根本原因。金鱼疾病数据本身难以获取,如果每类疾病只有几十张图片,模型很容易记住训练集而无法泛化。解决方案:尽可能收集更多数据;充分利用数据增强(Mosaic, MixUp, 随机裁剪等);尝试使用迁移学习,在更大的通用数据集(如COCO)上预训练的模型上微调。
- 模型复杂度太高:对于小数据集,使用了过大的模型(如
YOLOv8x)。尝试换用更小的模型(YOLOv8n/s)。 - 正则化不足:增加
label_smoothing参数(如设为0.1),启用更多的数据增强,或在优化器中加入权重衰减(weight_decay)。
问题3:某一类疾病(如“烂尾”)的AP值特别低。
- 可能原因与排查:
- 类别不平衡:该类疾病的样本数量远少于其他类别。检查数据分布。解决方案:对该类图片进行过采样(重复使用);在数据增强时,对该类图片应用更强的增强;在损失函数中使用类别权重(Focal Loss或修改
class_weights参数)。 - 特征难以学习:该疾病症状可能不明显,或与背景/其他疾病相似。尝试增加该类样本的采集,确保标注更精确(病灶框更准)。可以考虑将该类与症状相似的类合并,先做粗粒度检测。
- 类别不平衡:该类疾病的样本数量远少于其他类别。检查数据分布。解决方案:对该类图片进行过采样(重复使用);在数据增强时,对该类图片应用更强的增强;在损失函数中使用类别权重(Focal Loss或修改
7.2 推理部署阶段问题
问题4:模型在训练集上表现很好,但部署到真实鱼缸画面中,检测效果很差。
- 可能原因与排查:
- 领域差异(Domain Gap):训练数据的环境(光照、背景、水质、相机型号)与真实部署环境差异太大。解决方案:进行“领域适应”。在真实环境中采集少量未标注或简单标注的数据,加入到训练集中进行微调(fine-tuning)。这是提升模型在实际场景中表现的最有效方法之一。
- 推理时预处理不一致:确保部署代码中的图像预处理(缩放、归一化均值标准差)与训练时完全一致。YOLOv8通常使用
imgsz=640和固定的归一化参数。 - 后处理参数不当:调整
conf置信度阈值和iouNMS阈值。真实场景中背景更复杂,可以适当降低conf以提高召回率,但可能会增加误报。
问题5:部署在边缘设备(如Jetson Nano)上推理速度太慢。
- 可能原因与排查:
- 模型未优化:确保使用了针对该硬件优化的格式(如Jetson上用TensorRT,树莓派上用TFLite)。FP16或INT8量化能大幅提升速度且精度损失可控。
- 模型过大:换用更小的模型变体(如
YOLOv8n)。 - 输入尺寸过大:降低
imgsz(如从640降到320),速度会成平方倍提升,但精度会下降,需要权衡。 - 代码效率低:检查推理循环中是否有不必要的内存拷贝、重复初始化。使用异步处理和多线程,让数据加载、推理、后处理流水线化。
问题6:出现大量重复检测框(同一尾鱼被检出多次)。
- 可能原因与排查:
- NMS的IoU阈值过低:NMS用于合并重叠框。如果
iou阈值设得太高(如0.7),可能无法合并相近的框。尝试降低iou阈值(如0.45)。但注意,降得太低可能会误删并排的两条鱼。 - 模型本身的问题:如果训练数据中同一目标的标注框就不一致(有的框得大,有的框得小),模型可能学出多个检测模式。这需要从数据标注源头解决。
- NMS的IoU阈值过低:NMS用于合并重叠框。如果
构建和运用“YOLO金鱼与金鱼疾病检测数据集”的过程,是一个典型的AI落地闭环:从定义问题、收集数据、标注、训练、调优到最终部署应用。每一个环节都充满了细节和挑战,但也正是这些细节决定了项目的成败。这个数据集的价值,不仅在于其本身,更在于它提供了一套方法论,可以复用到其他水产养殖物种(如对虾、石斑鱼)的疾病监测上,为智慧渔业的发展铺就了一块坚实的技术基石。在实际操作中,保持耐心,严谨对待数据,持续迭代模型,并根据真实反馈不断优化,才能让这项技术真正为产业创造价值。
本文还有配套的精品资源,点击获取