news 2026/11/4 17:44:29

DAMO-YOLO实战:从零构建自定义数据集训练流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DAMO-YOLO实战:从零构建自定义数据集训练流程

1. 环境准备与框架安装:打好地基

想玩转DAMO-YOLO,第一步就是把环境搭好。这就像你要组装一台高性能电脑,得先把主板、CPU、内存这些核心部件装对、装稳。我刚开始接触时,也踩过一些坑,比如版本不兼容、依赖包冲突,折腾了半天。所以这里我会把最稳妥、最省事的安装路径分享给你,让你跳过那些不必要的麻烦。

DAMO-YOLO的官方GitHub仓库是起点。我习惯在Linux服务器上操作,因为训练模型对计算资源要求高,Linux环境也更稳定。首先,我们把代码“克隆”到本地。打开你的终端,执行下面这条命令:

git clone https://github.com/tinyvision/DAMO-YOLO.git cd DAMO-YOLO

接下来是创建独立的Python环境。这一步非常重要,它能保证DAMO-YOLO所需的库版本不会和你系统里其他项目的环境打架。我们用Conda来管理,非常方便:

conda create -n DAMO-YOLO python=3.7 -y conda activate DAMO-YOLO

环境激活后,就开始安装核心的PyTorch框架。注意,DAMO-YOLO对PyTorch版本有特定要求,我实测下来torch==1.7.0和torchvision==0.8.0这个组合最兼容。如果你的CUDA版本是10.2(可以用nvcc -V命令查看),就执行:

conda install pytorch==1.7.0 torchvision==0.8.0 torchaudio==0.7.0 cudatoolkit=10.2 -c pytorch

如果你的CUDA版本是11.x,可以去PyTorch官网找对应的安装命令替换。安装完PyTorch,再把项目需要的其他“零件”一次性装上:

pip install -r requirements.txt export PYTHONPATH=$PWD:$PYTHONPATH

最后,还需要安装COCO API,这是用于处理COCO格式数据集标注的工具。对于Linux系统,用这两条命令:

pip install cython pip install git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI

到这里,所有依赖就都齐活了。你可以运行一个简单的Python语句import damo试试,如果不报错,恭喜你,地基已经打得非常牢固了。这个过程看似步骤多,但一步步跟着做,十分钟内肯定能搞定。环境没问题,后续的数据和训练才能顺利进行。

2. 数据准备:把你的数据“翻译”成模型能懂的语言

模型训练,七分靠数据。DAMO-YOLO默认吃的是COCO格式的数据“粮食”。但我们的业务数据,比如工业零件图片、遥感卫星图像,通常是私有格式,可能是VOC的XML,也可能是LabelImg生成的TXT,甚至是公司内部的一套标注系统。这就需要一个“翻译”过程,把我们的数据转换成COCO格式的JSON文件。这是我实战中花时间最多,也最需要细心的一步。

COCO格式的核心是一个结构化的JSON文件。它主要包含几个部分:images(图片信息列表,包含id、文件名、宽高)、annotations(标注信息列表,包含id、对应的图片id、目标框坐标[x, y, width, height]、类别id)、categories(类别信息列表,包含id和类别名)。你需要写一个转换脚本,把你的原始标注一一映射到这个结构里。举个例子,假设你手头有一批用矩形框标注的缺陷检测图片,标注信息存在一个CSV文件里,每行是图片名, x_min, y_min, x_max, y_max, 类别名。

那么你的转换脚本大概思路是这样的:先遍历所有图片,为每张图片生成一个唯一的image_id,并把文件信息存入images列表。然后读取CSV,根据图片名找到对应的image_id,将矩形框坐标从(x_min, y_min, x_max, y_max)转换成COCO要求的[x_min, y_min, width, height]格式,再根据类别名映射到数字category_id,最后构造一条标注记录放入annotations。categories列表则直接把你所有的类别名和ID整理进去就行。

注意:框的坐标是绝对像素坐标,不是归一化后的比例。另外,category_id通常从1开始编号,0预留给背景。

转换完成后,你应该得到三个JSON文件:yourdata_train.json,yourdata_val.json,yourdata_test.json,分别对应训练集、验证集和测试集的标注。图片文件我建议统一放在一个清晰的目录下,比如/path/to/your_dataset/images/,里面可以再按train/,val/,test/分子文件夹,或者所有图片混放但用JSON文件来区分也行。我的习惯是后者,管理起来更简单。假设我的数据最终是这样存放的:

  • 图片目录:/home/user/datasets/my_project/images/(里面是所有图片,如img_001.jpg,img_002.jpg...)
  • 标注目录:/home/user/datasets/my_project/annotations/(里面是my_project_train.json,my_project_val.json)

数据质量决定了模型的天花板。转换后务必做检查:随机挑几张图片,用Python脚本读取对应的JSON标注,把框画回图片上看看,确保类别、位置都对得上,没有漏标或错标。这个小动作能避免后续训练出现各种诡异问题。

3. 路径配置:让框架找到你的数据

数据准备好了,就像把食材洗切完毕放在了厨房。接下来得告诉DAMO-YOLO这个“厨师”,食材具体放在哪个柜子、哪个抽屉里。这一步是通过修改配置文件来实现的,很多新手在这里容易迷糊,我们详细拆解。

首先,我们需要在DAMO-YOLO的项目目录里,创建一个指向我们数据集的“软链接”。这相当于在项目内部建立一个快捷方式,指向你实际的数据存放位置。这样做的好处是,配置文件里可以用相对路径来引用,更加灵活。命令很简单:

ln -s /home/user/datasets/my_project ./datasets/my_project

执行后,你在DAMO-YOLO项目根目录下的datasets文件夹里,就能看到一个my_project的快捷方式,点进去就是你的真实数据了。

接下来是关键的一步:修改路径注册文件。打开damo/config/paths_catalog.py这个文件。你会看到里面已经定义了很多标准数据集(如COCO、VOC)的路径。我们需要在最后面,模仿它的格式,添加我们自己数据集的路径信息。找到文件末尾的DATASETS字典,在里面新增一项:

DATASETS = { # ... 其他已有数据集配置 ... “my_project_train”: { “img_dir”: “datasets/my_project/images”, “ann_file”: “datasets/my_project/annotations/my_project_train.json” }, “my_project_val”: { “img_dir”: “datasets/my_project/images”, “ann_file”: “datasets/my_project/annotations/my_project_val.json” }, # 如果有测试集也可以加上 “my_project_test”: { “img_dir”: “datasets/my_project/images”, “ann_file”: “datasets/my_project/annotations/my_project_test.json” }, }

这里“my_project_train”就是你给训练集起的名字,后面在训练配置里会用到。img_dir就是图片所在的根目录,ann_file是对应标注JSON文件的完整路径。请注意,这里的路径是基于项目根目录的相对路径,因为我们之前创建了软链接。如果你不想用软链接,也可以直接填写绝对路径,比如“/home/user/datasets/my_project/images”,但相对路径的移植性更好。

修改完保存文件。为了验证配置是否正确,你可以写个几行代码的小脚本测试一下:

from damo.config import cfg from damo.data import build_dataset # 临时修改配置,指向你的数据集 cfg.merge_from_file(‘configs/base.yaml’) # 先载入一个基础配置 cfg.DATASETS.TRAIN = (“my_project_train”,) # 设置训练集为你刚注册的名字 cfg.DATASETS.TEST = (“my_project_val”,) # 设置测试集为验证集名字 # 尝试构建数据集 dataset = build_dataset(cfg, is_train=True) print(f”数据集加载成功,共有 {len(dataset)} 张训练图片。”)

如果这段代码能成功运行并打印出图片数量,说明路径配置完全正确,框架已经能顺利找到并读取你的数据了。

4. 模型选择与配置修改:定制你的检测器

DAMO-YOLO提供了多个预训练模型,比如DAMO-YOLO-S、DAMO-YOLO-M、DAMO-YOLO-L,分别对应小、中、大模型。对于自定义数据集训练,尤其是数据量不是特别巨大的情况,我强烈建议从**微调(Finetune)**开始,而不是从头训练。这就像学画画,直接临摹大师的作品比从素描几何体开始要快得多,效果也更好。微调能利用模型在COCO等大型数据集上学到的通用特征(如边缘、纹理、形状),快速适应你的特定任务。

首先,去DAMO-YOLO的官方GitHub仓库的Release页面,下载与你选择的模型对应的预训练权重文件(.pth文件)。比如你决定用DAMO-YOLO-S,就下载damoyolo_tinynasL25_S.pth。把这个文件放在项目根目录下,或者专门建一个weights/文件夹放进去,记住路径。

接下来,我们需要修改训练配置文件。配置文件是模型训练的“剧本”,决定了模型结构、训练参数、数据源等一切。以DAMO-YOLO-S为例,它的配置文件是configs/damoyolo_tinynasL25_S.py。用文本编辑器打开它,重点关注几个地方:

第一,指定预训练权重路径。找到model配置部分,通常里面有一个pretrained参数。将它修改为你下载的权重文件路径:

model = dict( type=‘DAMOYOLO’, backbone=…, neck=…, head=…, pretrained=‘./damoyolo_tinynasL25_S.pth’, # 修改为你的权重路径 )

第二,修改类别数量。这是最容易出错的地方。找到模型头(head)的配置部分,里面有一个num_classes参数。COCO数据集有80类,所以默认是80。你的数据有几类,就改成几。比如我的工业缺陷检测只有“划痕”这一种缺陷,那就改成1。

bbox_head=dict( type=‘YOLOXHead’, num_classes=1, # 关键修改!改成你的实际类别数 … )

第三,更改数据源。找到data配置部分,将训练和验证的数据集名称,换成我们在paths_catalog.py里注册的名字:

data = dict( samples_per_gpu=8, # 根据你的GPU显存调整,8G显存建议设为4或8 train=dict( dataset=dict( name=‘my_project_train’, # 改为你的训练集名字 … ) ), val=dict( name=‘my_project_val’, # 改为你的验证集名字 … ), )

第四,调整训练轮次和学习率。对于微调,通常不需要像从头训练那样跑很多轮。你可以适当减少总训练轮数(max_epochs),比如从300轮减少到50或100轮。同时,因为是在预训练模型基础上微调,学习率(lr)也应该设置得比从头训练小,通常可以设为初始学习率的十分之一,避免“冲毁”已经学好的特征。在配置文件的optimizer和lr_config部分可以调整。

# 示例:调整优化器和学习率策略 optimizer = dict(type=‘SGD’, lr=0.001, momentum=0.9, weight_decay=0.0005) # lr从0.01调小为0.001 lr_config = dict( policy=‘CosineAnnealing’, warmup=‘linear’, warmup_iters=500, warmup_ratio=0.001, min_lr=0.00001, # 最小学习率也可以调小 ) total_epochs = 50 # 总训练轮次

配置文件就像乐高说明书,按步骤调整好,就能拼出适合你任务的专属模型。改完后务必仔细检查一遍,特别是类别数和路径名,一个字符错了都会导致训练失败。

5. 启动训练与监控:见证模型成长

一切就绪,终于到了最激动人心的环节:启动训练。看着损失曲线下降,验证集精度提升,就像看着自己种下的种子发芽生长。DAMO-YOLO使用分布式数据并行(DDP)进行训练,即使你只有一张GPU,也建议用这个启动方式,代码已经做了兼容。

在项目根目录下,打开终端,并确保你的DAMO-YOLOConda环境是激活状态。执行训练命令:

python -m torch.distributed.launch --nproc_per_node=1 tools/train.py -f configs/damoyolo_tinynasL25_S.py

解释一下这个命令:

  • --nproc_per_node=1:表示使用1个GPU进程。如果你有4张GPU,想全部用上,就改成4。
  • -f configs/damoyolo_tinynasL25_S.py:指定我们修改好的配置文件路径。

回车之后,你会看到终端开始刷屏输出。初始阶段,程序会加载配置、构建模型、加载数据。如果一切正常,很快你就会看到类似这样的日志,开始迭代训练:

[2023-xx-xx 14:30:15] INFO: Epoch [1][50/100] lr: 0.00100, eta: 1:30:00, time: 0.200s, data_time: 0.050s, memory: 3210MB, loss_cls: 1.2345, loss_box: 0.8765, loss_obj: 0.5432, loss: 2.6543

这里loss是总损失,loss_cls、loss_box、loss_obj分别是分类损失、边界框回归损失和物体性损失。训练过程中,最需要关注的是这个总损失loss,它会随着训练轮次逐渐下降并趋于平稳。

训练过程中,模型权重和日志会自动保存。默认情况下,它们会保存在work_dirs/damoyolo_tinynasL25_S/目录下(目录名基于你的配置文件)。里面最重要的文件是:

  • latest.pth:最新一代的模型权重。
  • best_bbox_mAP_epoch_xx.pth:在验证集上表现最好(平均精度mAP最高)的那一代模型权重,这才是我们最终要用的模型。
  • 日志文件:记录了所有训练过程的文本,方便回溯。

如何监控训练状态?除了看终端日志,更直观的方法是使用TensorBoard。DAMO-YOLO在训练时默认会生成TensorBoard日志。在另一个终端窗口,切换到项目根目录,运行:

tensorboard --logdir ./work_dirs

然后在浏览器中打开它提供的地址(通常是http://localhost:6006),你就能看到实时的损失曲线、学习率曲线、验证集精度(mAP)曲线等图表。通过观察这些曲线,你可以判断模型是否在正常学习(损失应稳步下降),是否过拟合(训练损失持续下降但验证集精度停滞或下降),从而决定是否需要早停或调整超参数。

训练完成后,模型权重就保存在work_dirs里了。你可以用这个权重去做推理,检测你业务场景中的新图片。整个流程从数据准备到训练完成,虽然步骤不少,但每一步都是明确的、可操作的。我自己的经验是,第一次跑通可能会遇到各种小问题,比如路径错误、版本冲突,但每解决一个,你对整个框架的理解就深一层。当你用自己的数据成功训练出第一个模型,并看到它能准确识别出你关心的目标时,那种成就感是非常棒的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/4 23:59:43

5分钟搞定!Qwen3-Embedding-0.6B文本嵌入快速上手指南

5分钟搞定!Qwen3-Embedding-0.6B文本嵌入快速上手指南 你是不是经常遇到这样的问题:想在自己的应用里加一个智能搜索功能,但不知道如何把文字变成计算机能理解的“向量”?或者想搭建一个问答机器人,却卡在了如何从海量…

作者头像 李华
网站建设 2026/11/4 17:43:44

WINS服务在现代局域网中的核心价值与优化实践

1. WINS服务:不只是“老古董”,更是局域网里的“活地图” 如果你在公司里用过共享文件夹,或者连接过隔壁同事的打印机,那你大概率已经和WINS服务打过交道了,只是你可能不知道它的名字。简单来说,WINS就是一…

作者头像 李华
网站建设 2026/9/21 15:20:56

EhViewer:开源Android平台的E-Hentai浏览解决方案

EhViewer:开源Android平台的E-Hentai浏览解决方案 【免费下载链接】EhViewer 项目地址: https://gitcode.com/GitHub_Trending/ehvi/EhViewer EhViewer是一款采用Material Design 2风格的开源Android应用,专为E-Hentai网站设计,提供流…

作者头像 李华
网站建设 2026/10/5 0:00:09

M2LOrder 与微信小程序开发结合:打造个人情绪日记本应用

M2LOrder 与微信小程序开发结合:打造个人情绪日记本应用 最近几年,越来越多人开始关注自己的情绪健康,写日记成了一个简单有效的自我关怀方式。但光写下来还不够,如果能自动分析每天的心情变化,看到自己情绪波动的趋势…

作者头像 李华