简介:本资源是一套面向计算机视觉初学者与目标检测实践者的斗鱼观赏鱼品种识别数据集,专为YOLO系列及Pascal VOC格式模型训练定制,解决细粒度水生宠物图像分类与定位难题,适用于AI课程设计、毕业设计及轻量级工业质检场景。压缩包共2000个文件,含1045张高质量JPG图像、1045份VOC标准XML标注及955个YOLO格式TXT标签(含classes.txt定义10类斗鱼类别顺序),整体体积45.6MB,结构清晰,开箱即用。已有93人学习下载,体现其在小众生物图像识别领域的实用价值。用户可直接加载训练,无需额外转换;配套data_set_info.txt详述每类样本分布(如Crowntail-betta达158框、Dumbo-betta虽少但含典型大耳特征),并提供多组xyxr_images_*.txt样本路径索引,便于划分训练/验证集与复现实验。
1. 项目背景与数据集价值
最近在整理手头的项目资料,翻出来一个压箱底的宝贝——一个包含了10种常见斗鱼观赏鱼品种、总计1045张图片的目标检测数据集。这个数据集是我几年前为了一个水族电商的智能识别项目准备的,当时花了不少功夫去采集和标注。现在回头看,虽然斗鱼的热度可能不如一些新兴的宠物,但这个数据集对于想入门计算机视觉,特别是想用YOLO这类算法练手的朋友来说,依然是一个相当不错的“敲门砖”。
为什么这么说呢?首先,目标检测是计算机视觉里最基础也最实用的任务之一,从安防监控到自动驾驶,从工业质检到现在的直播电商,应用场景无处不在。而YOLO(You Only Look Once)系列算法,以其速度和精度的良好平衡,成为了工业界和学术界的热门选择。其次,数据集是算法的“粮食”,没有高质量的数据,再先进的模型也是巧妇难为无米之炊。这个斗鱼数据集麻雀虽小,五脏俱全:它涵盖了10个不同的品种,图片数量过千,足以支撑一个像样的模型训练和验证过程。更重要的是,它提供了YOLO和PASCAL VOC两种主流格式,这意味着你可以无缝对接几乎任何流行的目标检测框架,无论是Darknet版的YOLOv3/v4,还是PyTorch版的YOLOv5/v7/v8,亦或是使用MMDetection、Detectron2等框架,都能轻松上手。
对于初学者,这个数据集能帮你完整走通“数据准备 -> 模型训练 -> 评估验证”的全流程,理解标注格式、数据增强、训练调参等核心环节。对于有一定经验的开发者,你可以用它来快速验证新的网络结构、损失函数或者训练技巧在细分场景下的效果。毕竟,斗鱼品种间的差异(如颜色、鳍的形状、斑纹)对于模型来说,是一个很好的细粒度分类和定位的练习场。
2. 数据集深度解析:从图片到标注
拿到一个数据集,第一步绝不是急着跑代码,而是静下心来好好“盘一盘”它。了解数据的构成和质量,往往能避免后续训练中一大半的坑。
2.1 数据构成与品种分析
这个数据集包含了1045张图片,对应10种斗鱼品种。斗鱼,学名暹罗斗鱼,以其绚丽的色彩和舒展的鳍而闻名。数据集涵盖的10个品种,很可能包括了最常见的几种类型,例如:
- 半月斗鱼:尾鳍展开接近180度,像半个月亮。
- 狮王斗鱼:鳍条硬挺,末端分叉,形如狮鬃。
- 将军斗鱼:体型较短,鳍相对较小,显得精悍。
- 马尾斗鱼:尾鳍飘逸,像马尾一样自然下垂。
- 双尾斗鱼:尾鳍分成两叶。
- 巨斗斗鱼:体型显著大于普通斗鱼。
- 糖果斗鱼:拥有大理石般混杂的色块。
- 蝶翼斗鱼:身体颜色与鳍的颜色有鲜明对比。
- 龙鳞斗鱼:鳞片厚重有金属光泽,像龙鳞。
- 原生斗鱼:颜色相对朴素,接近野生状态。
注意:由于原始项目信息未提供具体的品种列表,以上是根据常见斗鱼品种的推测。在实际使用数据集时,第一件事就是查看
classes.txt或标签文件,确认具体的类别名称和数量。类别的定义直接影响模型的学习目标。
图片内容通常以单条斗鱼特写为主,背景可能是纯色(如蓝色、黑色背景布)或简单的鱼缸环境。这种相对干净、主体突出的背景,有利于模型在初期快速学习到目标的本质特征,而不是去拟合复杂的背景噪声。图片格式大概率是.jpg或.png,分辨率可能参差不齐,这在预处理阶段需要统一。
2.2 标注格式详解:YOLO vs. VOC
数据集提供了两种格式,这是它的一大亮点。我们来拆解一下这两种格式的本质区别和转换逻辑。
YOLO格式是目前最流行的格式之一,尤其随着Ultralytics的YOLOv5/v8系列而风靡。它的核心思想是“归一化”。
- 标签文件:每个图片对应一个同名的
.txt文件。 - 内容格式:每一行代表一个标注框,格式为:
<class_id> <x_center> <y_center> <width> <height>class_id:类别的整数索引,从0开始。x_center, y_center:边界框中心点的x和y坐标,除以图片宽度和高度后的归一化值(范围0-1)。width, height:边界框的宽度和高度,同样是归一化后的值(范围0-1)。
- 示例:
0 0.5 0.5 0.2 0.3表示类别0的目标,位于图片正中心,宽度占图宽的20%,高度占图高的30%。 - 优点:格式简洁,存储空间小,直接适用于YOLO系列算法的训练,无需在训练时进行额外的坐标转换,效率高。
- 缺点:坐标是相对的,脱离原始图片尺寸无法直观理解。需要额外的
classes.txt文件来映射class_id和类别名。
PASCAL VOC格式是一个历史更悠久、更“重”的XML格式标准。
- 标签文件:每个图片对应一个同名的
.xml文件。 - 内容格式:XML结构,包含了图片的元信息(路径、尺寸)和每个目标的详细信息。
filename: 图片文件名。size: 包含图片的width,height,depth(通道数)。object: 每个目标是一个object节点,里面包含:name: 类别名(字符串,如halfmoon)。bndbox: 边界框,包含xmin,ymin,xmax,ymax四个绝对坐标值(像素值)。
- 示例:
<bndbox><xmin>100</xmin><ymin>150</ymin><xmax>300</xmax><ymax>400</ymax></bndbox> - 优点:信息自包含,人类可读性好,包含了图片尺寸,坐标是绝对像素值,直观。被许多早期框架和工具链支持。
- 缺点:文件体积大,解析速度相对慢,训练前通常需要转换为算法特定的格式。
为什么需要两种格式?VOC格式更像是一种“中间交换格式”或“归档格式”,因为它信息完整。而YOLO格式是“训练就绪格式”。在实际工作流中,我们通常用专业的标注工具(如LabelImg)标注出VOC格式,然后编写一个转换脚本,根据需求批量转换成YOLO格式或COCO格式用于训练。这个数据集直接提供了两种,为你省去了转换步骤,你可以根据自己选择的框架决定使用哪一种。例如,如果你用原版Darknet训练YOLOv3,就用YOLO格式;如果你用MMDetection框架,它通常有加载VOC格式数据集的接口,你也可以直接使用。
2.3 数据质量检查实战
在投入训练之前,必须对数据集进行质量检查。我习惯用Python写几个简单的脚本来完成这个工作。
检查1:标签与图片匹配确保每个.jpg文件都有对应的.txt(YOLO)或.xml(VOC)文件,反之亦然。缺失或多余的文件都会导致训练时出错。
import os from pathlib import Path image_dir = Path("path/to/images") label_dir = Path("path/to/labels") # YOLO格式的标签目录 # 或者 label_dir = Path("path/to/annotations") # VOC格式的标签目录 image_files = set([f.stem for f in image_dir.glob("*.jpg")]) # 根据格式选择后缀 label_files = set([f.stem for f in label_dir.glob("*.txt")]) # YOLO # label_files = set([f.stem for f in label_dir.glob("*.xml")]) # VOC missing_labels = image_files - label_files missing_images = label_files - image_files if missing_labels: print(f"警告:以下图片缺少标签文件: {missing_labels}") if missing_images: print(f"警告:以下标签文件缺少对应图片: {missing_images}")检查2:标注框有效性(以YOLO格式为例)检查归一化坐标是否在 [0, 1] 区间内,以及是否有无效的标注(如宽度或高度为0)。
def validate_yolo_label(label_path): with open(label_path, 'r') as f: lines = f.readlines() for line in lines: parts = line.strip().split() if len(parts) != 5: return False, f"格式错误: {line}" cls_id, x_c, y_c, w, h = map(float, parts) if not (0 <= x_c <= 1 and 0 <= y_c <= 1 and 0 <= w <= 1 and 0 <= h <= 1): return False, f"坐标越界: {cls_id}, {x_c}, {y_c}, {w}, {h}" if w == 0 or h == 0: return False, f"无效框尺寸: {cls_id}, w={w}, h={h}" return True, "OK" # 遍历所有标签文件进行检查检查3:类别分布均衡性统计每个类别出现的次数,可视化出来。如果某个类别的样本数远少于其他类别(例如,少于平均样本数的1/5),模型可能会难以学习这个类别的特征,导致识别率低下。这就是典型的类别不均衡问题。
import matplotlib.pyplot as plt from collections import Counter class_counter = Counter() for label_file in label_dir.glob("*.txt"): with open(label_file, 'r') as f: for line in f: cls_id = int(line.split()[0]) class_counter[cls_id] += 1 # 假设你有 classes.txt with open("classes.txt", 'r') as f: class_names = [line.strip() for line in f.readlines()] # 将类别ID映射到名称 counts = [class_counter[i] for i in range(len(class_names))] plt.bar(class_names, counts) plt.xticks(rotation=45) plt.ylabel('样本数量') plt.title('斗鱼数据集类别分布') plt.tight_layout() plt.show()通过这三项检查,你就能对数据集的“健康”状况有一个基本了解,并提前发现潜在问题。
3. 基于YOLOv8的完整训练流程
这里我以目前生态最完善、对新手最友好的Ultralytics YOLOv8为例,展示如何使用这个斗鱼数据集完成一次标准的模型训练。选择YOLOv8是因为它集训练、验证、预测、导出于一身的简洁API,以及活跃的社区。
3.1 环境搭建与数据准备
首先,创建一个干净的Python虚拟环境是个好习惯。
# 创建并激活虚拟环境 (可选,但推荐) conda create -n betta_yolo python=3.8 conda activate betta_yolo # 安装Ultralytics包 pip install ultralytics接下来,按照YOLOv8要求的数据集结构组织你的文件。YOLOv8期望的是一种类似COCO的目录结构,但更简单。
betta_fish_dataset/ ├── images/ │ ├── train/ # 存放训练图片,例如 800 张 │ └── val/ # 存放验证图片,例如 245 张 └── labels/ ├── train/ # 存放训练图片对应的YOLO格式标签文件 └── val/ # 存放验证图片对应的YOLO格式标签文件你需要将原始的1045张图片和标签文件,按照一定比例(通常是8:2或7:3)分割到train和val两个文件夹中。切记,分割必须是随机的,并且要保证图片和标签文件同步移动。你可以写脚本,或者用sklearn.model_selection中的train_test_split函数。
然后,在数据集根目录(betta_fish_dataset)下创建一个data.yaml配置文件,这是YOLOv8读取数据的关键。
# data.yaml path: /absolute/path/to/betta_fish_dataset # 数据集的根目录 train: images/train # 训练集图片的相对路径(相对于path) val: images/val # 验证集图片的相对路径(相对于path) # 类别数量和名称 nc: 10 # number of classes names: ['halfmoon', 'crowntail', 'plakat', 'veiltail', 'doubletail', 'giant', 'candy', 'butterfly', 'dragon', 'wild'] # 请替换为你的实际类别名 # 可选:测试集路径 # test: images/test3.2 模型训练与关键参数解析
准备好数据后,训练模型只需要几行代码。但理解关键参数,才能更好地控制训练过程。
from ultralytics import YOLO # 加载一个预训练模型,这里以中等尺寸的YOLOv8n为例 model = YOLO('yolov8n.pt') # 也可以选择 'yolov8s.pt', 'yolov8m.pt' 等 # 开始训练 results = model.train( data='path/to/your/data.yaml', # 配置文件路径 epochs=100, # 训练轮数,对于小数据集可以适当增加 imgsz=640, # 输入图片尺寸,YOLOv8默认640 batch=16, # 批次大小,根据你的GPU内存调整 device='0', # 使用GPU 0,如果是CPU则设为 'cpu' workers=4, # 数据加载的线程数 project='betta_detection', # 项目名称,所有输出会保存在 runs/detect/betta_detection 下 name='exp1', # 实验名称 pretrained=True, # 使用预训练权重(强烈推荐) optimizer='auto', # 优化器,auto通常是SGD lr0=0.01, # 初始学习率 lrf=0.01, # 最终学习率因子 (lr0 * lrf) weight_decay=0.0005, # 权重衰减,防止过拟合 save_period=10, # 每10个epoch保存一次检查点 seed=42 # 随机种子,确保实验可复现 )关键参数深度解读:
epochs: 训练轮数。对于1045张图的小数据集,100-150轮通常是个合理的起点。可以通过观察验证集损失曲线来判断是否过拟合或欠拟合。imgsz: 模型输入的固定尺寸。YOLO会将所有图片缩放至此尺寸。更大的尺寸(如1280)可能提升小目标检测精度,但会显著增加显存消耗和训练时间。对于斗鱼这种占画面比例较大的目标,640通常足够。batch: 批次大小。这是影响训练稳定性和速度最重要的参数之一。越大,梯度估计越准,训练越快,但需要更多显存。如果遇到CUDA out of memory错误,首先降低batch,其次降低imgsz。pretrained=True:这是小数据集训练成功的关键。它加载了在COCO等大型通用数据集上预训练的权重。这些权重包含了丰富的通用特征(边缘、纹理、形状),能让你的模型在少量数据上快速收敛,效果远好于从零开始训练。lr0(初始学习率): 学习率是训练中最敏感的“旋钮”。0.01是SGD优化器的常用初始值。如果训练初期损失剧烈震荡或变成NaN,可以尝试降低到0.001。weight_decay: L2正则化系数,给模型权重增加一个惩罚项,防止其值过大,是控制过拟合的有效手段。
训练开始后,YOLOv8会在终端打印进度条,并在runs/detect/betta_detection/exp1目录下生成大量有用的文件,包括:
weights/best.pt: 在验证集上表现最好的模型权重。weights/last.pt: 最后一个epoch的模型权重。- 训练过程的损失曲线、精度指标(mAP)曲线等可视化图表。
3.3 模型评估与性能分析
训练结束后,我们需要客观地评估模型的好坏。YOLOv8内置了强大的评估工具。
# 加载训练得到的最佳模型 best_model = YOLO('runs/detect/betta_detection/exp1/weights/best.pt') # 在验证集上进行评估 metrics = best_model.val() # 默认会使用训练时 data.yaml 中定义的 val 集model.val()方法会计算一系列核心指标,并生成详细的报告:
- mAP50 (Mean Average Precision, IoU=0.5): 这是最常用的目标检测指标。它计算在不同类别上,当预测框与真实框的交并比(IoU)阈值设为0.5时的平均精度(AP)的平均值。值越接近1越好。对于斗鱼检测,如果数据干净,mAP50达到0.85以上是比较理想的结果。
- mAP50-95: 在IoU阈值从0.5到0.95(步长0.05)上计算的平均mAP。这是一个更严格的指标,要求预测框定位非常精准。这个值通常会比mAP50低不少。
- Precision (精确率)和Recall (召回率): Precision衡量“找出来的鱼里有多少是真鱼”,Recall衡量“所有真鱼里你找出了多少”。两者通常相互制约。在训练过程中,你可以观察
results.png中的P-R曲线来了解模型的整体表现。 - 混淆矩阵: 保存在
confusion_matrix.png中。它能直观地显示模型最容易混淆哪些品种。比如,你可能发现“半月”和“蝶翼”容易互相认错,这可能是因为它们在某个角度下颜色分布相似。这为你后续的数据增强或模型调整提供了直接依据。
性能分析实战:如果评估结果不理想,比如mAP50只有0.6,不要慌,按以下思路排查:
- 看损失曲线:打开
results.png,看训练损失和验证损失是否都平稳下降并在后期趋于平缓。如果验证损失在某个点后开始上升,而训练损失继续下降,这是典型的过拟合。解决办法:增加数据增强强度、使用更小的模型(如yolov8n)、增大weight_decay、或者采用早停策略。 - 看混淆矩阵:如果某个类别的识别率特别低(对角线上的值小),或者大量被误判为另一个类别,说明这两个类别在特征上过于相似,或者该类别的训练样本太少。解决办法:针对性补充该类别数据,或使用Focal Loss等应对类别不均衡的损失函数(YOLOv8中可通过
loss=‘fl’参数尝试)。 - 可视化预测结果:用模型在验证集上跑一些预测,直观地看它错在哪里。
# 对单张图片或整个验证集进行预测并可视化 prediction_results = best_model.predict(source='path/to/validation/image.jpg', save=True, conf=0.25) # 或者对整个验证集文件夹 prediction_results = best_model.predict(source='path/to/images/val/', save=True, conf=0.25)看看是定位不准(框歪了)、误检(把水草气泡当鱼)、还是漏检(没框出鱼)。漏检可能是因为置信度阈值conf设得太高,可以调低试试(如0.1)。
4. 从训练到部署:避坑指南与进阶技巧
走通训练流程只是第一步。要让模型真正可用、好用,还有很多细节需要注意。
4.1 数据增强:低成本提升模型鲁棒性
对于只有一千多张图片的数据集,数据增强是防止过拟合、提升模型泛化能力的“神器”。YOLOv8在训练时默认已经启用了一系列增强,如随机翻转、缩放、色彩抖动等。但你可以在train参数中自定义更激进的策略。
results = model.train( data='...', epochs=100, ... # 数据增强相关参数 hsv_h=0.015, # 色调增强幅度 hsv_s=0.7, # 饱和度增强幅度 hsv_v=0.4, # 明度增强幅度 degrees=10.0, # 随机旋转角度范围 translate=0.1, # 随机平移比例 scale=0.5, # 随机缩放比例 shear=0.0, # 随机剪切幅度 perspective=0.0, # 透视变换幅度 flipud=0.0, # 上下翻转概率 fliplr=0.5, # 左右翻转概率 (0.5表示50%概率) mosaic=1.0, # Mosaic增强的概率 (1.0表示100%使用) mixup=0.0, # MixUp增强的概率 copy_paste=0.0 # 复制粘贴增强的概率 )- Mosaic增强:这是YOLOv4/v5/v8系列的一大杀器。它将四张训练图片随机拼接成一张,让模型在单个批次内就能看到不同尺度、不同上下文的物体,极大地丰富了数据多样性,对小数据集尤其有效。建议保持默认开启(mosaic=1.0)。
- MixUp/Copy-Paste:更高级的增强,但有时在非常小的数据集上可能导致训练不稳定,可以谨慎尝试或先设为0。
- HSV增强:调整色调(H)、饱和度(S)、明度(V),可以模拟不同光照、水质下的鱼只颜色变化,对斗鱼这种色彩丰富的目标非常有用。
- 重要提醒:增强不是越强越好。过于激进的增强(如大角度的旋转)可能会让模型学习到不真实的特征。对于鱼类检测,上下翻转(
flipud)通常是不合理的(鱼不会倒着游),所以设为0。左右翻转(fliplr)是合理的。
4.2 模型选择与剪枝:平衡速度与精度
YOLOv8提供了从Nano到X不同尺寸的模型:
- YOLOv8n (Nano): 参数量最小,速度最快,精度最低。适合移动端或边缘设备部署。
- YOLOv8s/m/l (Small/Medium/Large): 参数量和精度递增。对于斗鱼检测,YOLOv8s或YOLOv8m通常是性价比最高的选择,能在保持较高精度的同时拥有较快的推理速度。
- YOLOv8x (XLarge): 精度最高,但模型最大,速度最慢。除非你对精度有极致要求,且不计较推理成本,否则不推荐用于这类相对简单的任务。
你可以轻松地训练不同尺寸的模型进行对比:
for model_name in ['yolov8n', 'yolov8s', 'yolov8m']: model = YOLO(f'{model_name}.pt') model.train(data='...', epochs=50, imgsz=640, batch=16, name=f'exp_{model_name}')然后比较它们在验证集上的mAP50和mAP50-95,以及用model.predict(...)测试单张图片的推理时间。
模型剪枝:如果部署环境资源极其有限(如树莓派),在训练后可以对模型进行剪枝,移除网络中不重要的神经元或通道,从而压缩模型大小、提升速度,但可能会轻微损失精度。这属于进阶优化,可以使用一些专门的剪枝库(如Torch-Pruning)在PyTorch模型上操作。
4.3 部署与集成:让模型“跑起来”
训练出一个好模型,最终目的是要用起来。YOLOv8提供了极其便捷的导出功能,可以将PyTorch模型转换成各种运行时格式。
# 导出模型为ONNX格式(推荐,通用性强) best_model.export(format='onnx', imgsz=640, simplify=True) # 导出为TensorRT格式(用于NVIDIA GPU加速,性能最优) best_model.export(format='engine', imgsz=640) # 需要提前安装TensorRT # 导出为OpenVINO格式(用于Intel CPU/GPU) best_model.export(format='openvino', imgsz=640) # 导出为CoreML格式(用于iOS/macOS) best_model.export(format='coreml', imgsz=640)部署示例(使用ONNX Runtime进行Python推理):
import cv2 import numpy as np import onnxruntime as ort # 1. 加载ONNX模型和类别名 session = ort.InferenceSession('best.onnx') class_names = ['halfmoon', 'crowntail', ...] # 你的类别列表 # 2. 预处理图片 img = cv2.imread('test_fish.jpg') img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) input_img = cv2.resize(img_rgb, (640, 640)) # 缩放到模型输入尺寸 input_img = input_img.transpose(2, 0, 1) # HWC to CHW input_img = np.ascontiguousarray(input_img, dtype=np.float32) / 255.0 # 归一化 input_img = np.expand_dims(input_img, axis=0) # 增加batch维度 -> (1,3,640,640) # 3. 推理 inputs = {session.get_inputs()[0].name: input_img} outputs = session.run(None, inputs) # outputs 是一个列表,通常包含 [boxes, scores, classes] # 4. 后处理(简化版,实际需处理多个输出头) # 这里假设输出是 [1, 84, 8400] 格式 (YOLOv8无锚框输出) predictions = np.squeeze(outputs[0]).T # 转置为 [8400, 84] # 前4列是cx,cy,w,h (归一化),第5列是置信度,后80列是类别概率(COCO是80类,你需要调整) # 需要根据你的类别数 nc=10 进行解析,并应用置信度阈值和NMS conf_threshold = 0.25 scores = predictions[:, 4:5] * predictions[:, 5:] # 对象置信度 * 类别置信度 keep = scores.max(axis=1) > conf_threshold filtered_preds = predictions[keep] # ... 应用非极大值抑制(NMS) ... # ... 将归一化坐标转换回原图坐标 ... # 5. 画框和标签 for pred in final_detections: x1, y1, x2, y2 = pred[:4].astype(int) cls_id = np.argmax(pred[5:]) conf = pred[4] label = f'{class_names[cls_id]} {conf:.2f}' cv2.rectangle(img, (x1, y1), (x2, y2), (0,255,0), 2) cv2.putText(img, label, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 2) cv2.imshow('Result', img) cv2.waitKey(0)避坑点:不同框架导出的模型,其输出节点的顺序和形状可能不同。务必在导出后,用几幅测试图片验证一下导出模型的推理结果是否与原始PyTorch模型一致。可以使用Netron工具可视化ONNX模型结构,看清输入输出节点的名字和维度。
4.4 持续迭代与模型维护
模型上线不是终点。在实际应用中,你可能会遇到新的问题:
- 新场景:图片背景变成了复杂的水草造景缸。
- 新姿态:鱼只处于激烈的打斗状态,鳍部收缩,形态与平静时差异大。
- 新品类:出现了数据集中没有的斗鱼品种。
这就需要建立模型迭代的闭环:
- 收集新数据:将模型在真实场景中识别错误或置信度低的图片收集起来。
- 重新标注:对这些困难样本进行标注。
- 增量训练/微调:将新数据与旧数据混合,在之前训练好的最佳模型 (
best.pt) 基础上,用较小的学习率进行微调训练。
这种方式比从头训练快得多,且能有效让模型适应新数据,同时不遗忘旧知识(灾难性遗忘问题在这里相对不严重,因为新旧数据分布相似)。model = YOLO('runs/detect/betta_detection/exp1/weights/best.pt') model.train(data='new_data.yaml', epochs=50, lr0=0.001, resume=False) # 使用更小的学习率
这个包含了10种斗鱼、1045张图片的YOLO/VOC格式数据集,是一个绝佳的起点。它足够小,让你能在一张消费级显卡上快速完成实验循环;它也足够典型,让你能接触到目标检测从数据准备到模型部署的全链路核心技术点。希望这份详细的拆解,能帮你不仅“跑通”代码,更能“吃透”每一个环节背后的原理和考量,在后续更复杂的项目中游刃有余。
本文还有配套的精品资源,点击获取