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