DAMO-YOLO TinyNAS模型微调教程:自定义数据集训练
你是不是也遇到过这样的问题?网上找到的通用目标检测模型,用在你的业务数据上效果总是不尽如人意。比如,你想检测生产线上的特定零件瑕疵,或者识别自家果园里不同品种的水果,通用模型要么认不出来,要么把A类错认成B类。
这时候,模型微调就成了你的救命稻草。而DAMO-YOLO TinyNAS,凭借其出色的速度与精度平衡,以及灵活的TinyNAS技术,是进行自定义任务微调的一个绝佳选择。今天,我就手把手带你走一遍完整的流程,从准备你自己的图片数据,到最终训练出一个能精准识别你目标物体的模型。
整个过程就像教一个聪明的孩子认识新事物:先准备好清晰的照片(数据),告诉他照片里哪里有什么(标注),然后反复练习(训练),最后检验他学得怎么样(评估)。不用担心,即便你之前没怎么接触过深度学习框架,跟着步骤一步步来,也能搞定。
1. 开工前的准备:环境与数据
在开始“教学”之前,我们得先把“教室”和“教材”准备好。这里主要是两件事:搭建好能运行DAMO-YOLO的环境,以及整理好你的自定义数据集。
1.1 搭建DAMO-YOLO运行环境
首先,我们需要一个干净的Python环境来安装所有依赖。我强烈建议使用Conda来管理,这样可以避免和你系统里已有的其他Python包产生冲突。
打开你的终端(Linux/Mac)或命令提示符/Anaconda Prompt(Windows),依次执行下面的命令:
# 1. 克隆DAMO-YOLO的官方代码仓库 git clone https://github.com/tinyvision/damo-yolo.git cd damo-yolo # 2. 创建一个新的Conda环境,命名为`damo_yolo`,指定Python版本为3.7或3.8(兼容性较好) conda create -n damo_yolo python=3.8 -y conda activate damo_yolo # 激活这个环境 # 3. 安装PyTorch。请根据你的CUDA版本选择合适的命令。 # 如果你有NVIDIA显卡并安装了CUDA 11.3,可以这样安装: pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113 # 如果你没有GPU,或者想先用CPU测试,可以安装CPU版本: # pip install torch==1.12.1+cpu torchvision==0.13.1+cpu torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cpu # 4. 安装项目所需的其他依赖包 pip install -r requirements.txt # 5. 安装评估所需的pycocotools pip install cython pip install pycocotools # 或者使用 `pip install git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI` # 6. 将当前目录添加到Python路径,方便导入模块 export PYTHONPATH=`pwd`:$PYTHONPATH # Linux/Mac # 在Windows上,命令是:set PYTHONPATH=%cd%;%PYTHONPATH%执行完这些命令后,你的基础环境就准备好了。你可以通过运行python -c "import torch; print(torch.__version__)"来验证PyTorch是否安装成功。
1.2 准备你的自定义数据集
这是最关键的一步。你的数据质量直接决定了模型最终学得好不好。你需要准备两部分内容:
- 图片:所有用于训练和测试的图片文件(如.jpg, .png格式)。
- 标注:每张图片对应的标签文件,告诉模型图片里每个目标的位置和类别。
数据组织建议:我建议你按如下结构来组织你的数据文件夹,这样清晰明了,后续脚本处理也方便。
your_custom_dataset/ ├── images/ │ ├── train/ # 存放所有训练图片 │ │ ├── 001.jpg │ │ ├── 002.jpg │ │ └── ... │ └── val/ # 存放所有验证图片 │ ├── 101.jpg │ ├── 102.jpg │ └── ... └── labels/ ├── train/ # 存放训练图片对应的标签文件 │ ├── 001.txt │ ├── 002.txt │ └── ... └── val/ # 存放验证图片对应的标签文件 ├── 101.txt ├── 102.txt └── ...关于标注格式:DAMO-YOLO默认使用YOLO格式的标注。每个标签文件(.txt)与图片同名,内容格式如下:
<class_id> <x_center> <y_center> <width> <height>class_id:目标的类别索引,从0开始(0, 1, 2...)。x_center,y_center:目标边界框中心的x和y坐标,需要除以图片宽度和高度进行归一化,取值范围在0到1之间。width,height:目标边界框的宽度和高度,同样需要归一化。
例如,一张400x300的图片中,有一个属于类别0(比如“苹果”)的目标,其边界框左上角在(100, 80),右下角在(220, 200),那么计算如下:
- 中心点 x = (100 + 220) / 2 / 400 = 0.4
- 中心点 y = (80 + 200) / 2 / 300 = 0.4667
- 宽度 w = (220 - 100) / 400 = 0.3
- 高度 h = (200 - 80) / 300 = 0.4 对应的标签行就是:
0 0.4 0.4667 0.3 0.4
你可以使用标注工具如LabelImg、CVAT、Roboflow等来生成这种格式的标注文件。
2. 让DAMO-YOLO认识你的数据
环境有了,数据也整理好了,接下来就要让DAMO-YOLO框架知道怎么读取和理解你的数据。我们需要创建一个数据集配置文件。
2.1 创建数据集配置文件
在DAMO-YOLO项目的datasets目录下,新建一个Python文件,例如my_custom_dataset.py。这个文件的作用是告诉程序你的数据在哪、有哪些类别。
# datasets/my_custom_dataset.py from damo.datasets import COCODataset from .coco import coco_class_index, coco_class_labels # 1. 定义你的数据集名称和路径 DATASET_PATH = '/path/to/your/your_custom_dataset' # 请替换为你的数据集绝对路径 # 2. 定义你的类别 # 这是一个字典,键是类别索引(从0开始),值是类别名称(字符串) MY_CUSTOM_CLASSES = { 0: "apple", 1: "banana", 2: "orange", # ... 添加你所有的类别 } # 3. 获取类别数量和名称列表 num_classes = len(MY_CUSTOM_CLASSES) class_names = list(MY_CUSTOM_CLASSES.values()) # 4. 创建训练集和验证集的配置字典 # 这里继承了COCODataset的配置方式,因为格式相似 dataset = { 'train': { 'name': '训练集', 'ann_file': f'{DATASET_PATH}/labels/train/', # 指向标签文件夹 'img_prefix': f'{DATASET_PATH}/images/train/', # 指向图片文件夹 'pipeline': [ ... ], # 数据增强流程,通常可以直接复用coco的 'type': COCODataset, # 指定数据集类型 }, 'val': { 'name': '验证集', 'ann_file': f'{DATASET_PATH}/labels/val/', 'img_prefix': f'{DATASET_PATH}/images/val/', 'pipeline': [ ... ], # 验证集通常不需要复杂增强 'type': COCODataset, }, 'class_names': class_names, # 传入类别名称列表 } # 注意:上面的 `pipeline` 部分比较复杂,建议初学者先复制现有配置(如coco.py里的)并修改路径。 # 更简单的方法是:我们直接修改模型配置文件里的数据路径,见下一节。对于新手来说,直接编写这个文件可能有点复杂。一个更简单直接的方法是:我们复制一份现有的配置文件(比如针对TinyNAS-L25 S模型的),然后只修改里面关于数据路径和类别数的关键参数。
2.2 修改模型配置文件
我们以configs/damoyolo_tinynasL25_S.py这个配置文件为例。这个文件定义了模型结构、训练参数和数据源。
备份并复制配置文件:
cp configs/damoyolo_tinynasL25_S.py configs/damoyolo_tinynasL25_S_custom.py编辑这个新文件
damoyolo_tinynasL25_S_custom.py,找到并修改以下几个关键部分:# ... 文件开头部分 ... # 找到 `dataset` 变量定义的地方(通常在文件中部) # 将其替换为指向你的自定义数据集路径和类别 dataset = dict( type='YOLOv5Dataset', data_root='/path/to/your/your_custom_dataset', # 修改为你的数据集根目录 ann_file='labels/train/', # 训练标签相对路径 data_dir='images/train/', # 训练图片相对路径 img_size=640, # 输入图片尺寸,根据你的需求调整 pipeline=train_pipeline, # 训练数据增强流程 class_names=['apple', 'banana', 'orange'], # 修改为你的类别名称列表 ) val_dataset = dict( type='YOLOv5Dataset', data_root='/path/to/your/your_custom_dataset', # 同上 ann_file='labels/val/', # 验证标签相对路径 data_dir='images/val/', # 验证图片相对路径 img_size=640, pipeline=test_pipeline, # 测试/验证流程 class_names=['apple', 'banana', 'orange'], # 同上 ) # 非常重要:找到 `model` 字典中的 `num_classes` 参数,将其改为你的类别数量 model = dict( type='DAMOYOLO', backbone=..., neck=..., head=dict( type='ZeroHead', in_channels=[...], num_classes=3, # 修改这里!例如你有3个类别,就改成3 ..., ), ..., ) # 还可以根据你的数据集大小调整训练轮数(epochs) # 找到 `runner` 或 `train_cfg` 部分,修改 `max_epochs` train_cfg = dict( max_epochs=300, # COCO数据集通常训练300轮,对于小数据集可以适当减少,如100-150轮 ..., )通过这种方式,我们避免了从头创建复杂的数据集配置,只需在熟悉的模型配置文件中修改几个关键值即可。
3. 启动模型训练
配置都搞定后,最激动人心的训练环节就要开始了。DAMO-YOLO支持分布式训练(多张GPU)和单卡训练。
3.1 单GPU训练
如果你只有一张GPU,命令非常简单:
python tools/train.py -f configs/damoyolo_tinynasL25_S_custom.py这个命令会使用配置文件里所有的默认设置开始训练。训练日志和模型权重会默认保存在work_dirs/damoyolo_tinynasL25_S_custom/目录下。
3.2 多GPU分布式训练(更快)
如果你有多张GPU,比如4张,可以使用分布式训练来大幅缩短训练时间:
python -m torch.distributed.launch --nproc_per_node=4 --master_port=29500 tools/train.py -f configs/damoyolo_tinynasL25_S_custom.py--nproc_per_node=4:指定使用4个GPU进程。--master_port=29500:指定一个通信端口,通常选一个不冲突的端口号即可。
3.3 训练过程观察
训练开始后,你会在终端看到不断刷新的日志信息,包括当前训练轮次、损失值、学习率等。更直观的方法是,DAMO-YOLO通常会使用TensorBoard来记录训练过程。
你可以在训练开始后,另开一个终端,运行:
tensorboard --logdir ./work_dirs然后在浏览器中打开http://localhost:6006,就能看到损失曲线、学习率曲线、验证集精度(mAP)等可视化图表,方便你监控模型的学习状态。
4. 模型评估与测试
训练完成后,我们需要看看这个“学生”到底学得怎么样。
4.1 在验证集上评估精度
使用以下命令,用你训练好的最佳模型(通常保存在work_dirs/.../best_ckpt.pth)在验证集上跑一遍,计算mAP等指标:
python tools/eval.py -f configs/damoyolo_tinynasL25_S_custom.py --ckpt ./work_dirs/damoyolo_tinynasL25_S_custom/best_ckpt.pth命令执行完毕后,会输出详细的评估结果,包括各个类别的AP(平均精度)和整体的mAP。这是衡量模型性能的核心指标。
4.2 用新图片测试模型效果
评估指标是数字,最直观的还是看模型在实际图片上的检测效果。我们可以用Demo工具进行可视化推理:
python tools/demo.py image \ -f configs/damoyolo_tinynasL25_S_custom.py \ --engine ./work_dirs/damoyolo_tinynasL25_S_custom/best_ckpt.pth \ --conf 0.25 \ # 置信度阈值,低于此值的检测框会被过滤 --infer_size 640 640 \ # 推理时输入的图片尺寸 --device cuda \ # 使用GPU --path ./your_test_image.jpg # 替换为你想测试的图片路径运行后,程序会生成一张新的图片(通常在原文件名后加_pred),上面画出了模型检测到的所有边界框和类别标签。看看它是不是能准确地找出你的目标物体。
5. 训练中的常见问题与小技巧
第一次微调难免会遇到一些坑,这里分享几个常见的注意事项:
- 数据集太小怎么办?如果只有几百张图片,很容易过拟合(模型只记住了训练集,不会泛化)。除了尽可能收集更多数据外,可以启用更强大的数据增强(在配置文件的
train_pipeline里调整),或者考虑使用预训练权重。DAMO-YOLO提供的在COCO等大数据集上预训练好的权重包含了丰富的通用特征,能帮你的小数据集更好地收敛。 - 训练损失不下降?检查学习率是否合适。对于微调任务,通常需要使用比从头训练更小的学习率。你可以在配置文件中找到优化器(
optimizer)设置,将lr(学习率)调小,例如从0.01调到0.001或0.0001。 - 类别不平衡?如果你的数据中“苹果”的图片有1000张,“香蕉”只有100张,模型可能会偏向于多预测“苹果”。可以尝试在损失函数中为少数类别设置更高的权重,或者使用过采样/欠采样的方法。
- 想用更大的模型?如果你对精度要求更高,并且有足够的算力,可以尝试用
damoyolo_tinynasL35_M.py或damoyolo_tinynasL45_L.py作为基础配置文件进行微调,它们模型容量更大,通常能取得更好的效果,但训练和推理速度会慢一些。
整个流程走下来,你可能需要根据自己数据的特点和训练过程中的反馈,回头去调整数据质量、增强参数、模型配置等。模型微调本身就是一个迭代和优化的过程。
6. 总结
好了,以上就是使用DAMO-YOLO TinyNAS对你的自定义数据集进行完整微调的详细步骤。我们从零开始,搭建环境、整理数据、修改配置、启动训练、最后评估测试。虽然看起来步骤不少,但每一步都有其明确的目的,就像完成一个拼图。
最关键的是动手尝试。不要怕出错,训练过程中终端输出的错误信息就是你最好的调试指南。用你自己的数据跑通第一个循环,看到模型能正确识别出你标注的物体时,那种成就感是非常棒的。
微调成功后,你就可以把这个模型集成到你的应用里,无论是开发一个自动检测的软件,还是部署到边缘设备上,它都能为你提供实时的、定制化的目标检测能力。DAMO-YOLO高效的架构也保证了它在资源受限的场景下依然能有出色的表现。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。