
人工智能计算机视觉深度学习模型评测【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址https://gitcode.com/gh_mirrors/mm/mmdetection点击查看免费下载MMDetection 为检测模型训练提供了开箱即用的完整工具链以tools/train.py为统一入口配合分布式脚本与灵活的配置体系即可在 COCO 等标准数据集上训练预定义模型也能通过数据集格式转换与配置文件定制在自定义数据集上完成训练、测试与推理。读完本文你将掌握学习率自动缩放、单卡/多卡/多机/Slurm 各类训练启动方式、resume与load-from的本质区别以及将任意 VIA 格式标注转换为 COCO 格式并训练 Mask R-CNN 的完整实战方案。一、训练工具链总览MMDetection 的训练入口统一为 tools/train.py其核心流程如下源码可见 train.pyparse_args()解析命令行参数包括配置文件路径、--work-dir、--amp、--auto-scale-lr、--resume、--cfg-options、--launcher等Config.fromfile(args.config)加载并解析配置文件若传入--cfg-options通过cfg.merge_from_dict()将键值对合并进配置通过Runner.from_cfg(cfg)构建训练器若配置中指定了runner_type则从注册表RUNNERS.build(cfg)构建自定义 Runner调用runner.train()正式启动训练。因此一切训练行为都由配置文件驱动命令行参数只做增量覆盖。理解这一点是掌握后续所有训练方式的前提。二、在标准数据集上训练预定义的模型2.1 数据集准备训练前需要先准备好数据集具体的数据集下载、目录组织与标注说明请参考 数据集准备。注意目前configs/cityscapes文件夹下的配置文件均使用 COCO 预训练权重进行初始化。如果网络连接不可用或速度很慢应提前下载现成的模型权重否则训练刚开始时可能因为无法加载预训练权重而报错。2.2 学习率自动缩放背景配置文件中的学习率是在 8 块 GPU、每块 GPU 2 张图像的设置下批大小 8 × 2 16确定的。该基准已在 configs/base/schedules/schedule_1x.py 中通过auto_scale_lr.base_batch_size 16声明。学习率会以批大小 16 为基准自动缩放同时为了不影响其他基于 mmdet 的 codebaseauto_scale_lr.enable默认设置为False。启用方式在启动命令中添加--auto-scale-lr参数即可。在启动前请检查即将使用的配置文件名因为配置名称通常指示默认批处理大小默认批大小是 8 × 2 16例如faster_rcnn_r50_caffe_fpn_90k_coco.py、pisa_faster_rcnn_x101_32x4d_fpn_1x_coco.py非默认批次的配置文件名称中带有_NxM_字样例如cornernet_hourglass104_mstest_32x3_210e_coco.py的批大小为 32 × 3 96scnet_x101_64x4d_fpn_8x1_20e_coco.py的批大小为 8 × 1 8。请记住如果使用批大小不为 16 的配置文件请检查配置底部是否有auto_scale_lr.base_batch_size若找不到可以在其继承的_base_ [xxx]基配置文件中查找。想使用自动缩放学习率功能时请不要修改这些值。基本用法如下python tools/train.py \ ${CONFIG_FILE} \ --auto-scale-lr \ [optional arguments]从源码看--auto-scale-lr的底层逻辑位于 train.py当该标志为真时脚本检查配置中是否存在auto_scale_lr、auto_scale_lr.enable与auto_scale_lr.base_batch_size三个键若存在则将cfg.auto_scale_lr.enable置为True否则直接抛出RuntimeError提示配置缺失。执行命令后脚本会根据机器的 GPU 数量和训练批大小按照线性扩展规则Linear Scaling Rule出自论文《Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour》自动缩放学习率。例如4 块 GPU、每块 GPU 2 张图片时lr0.01那么在 16 块 GPU、每块 GPU 4 张图片时学习率会自动缩放至lr0.08批大小翻 8 倍学习率随之放大 8 倍。如果不启用该功能则需要按线性扩展规则手动计算并修改配置文件中optimizer.lr的值。以 configs/base/schedules/schedule_1x.py 为例其默认优化器配置为SGD(lr0.02, momentum0.9, weight_decay0.0001)若你的批大小翻倍则需相应地将lr调为 0.04。2.3 使用单 GPU 训练tools/train.py支持在单张 GPU 上直接启动训练基本用法如下python tools/train.py \ ${CONFIG_FILE} \ [optional arguments]训练期间日志文件和 checkpoint 文件会保存在工作目录下该目录通过配置文件的work_dir字段或 CLI 参数--work-dir指定。从 train.py 源码可以确认工作目录的确定优先级为CLI 参数 配置文件中的字段 配置文件名——若未显式指定默认使用./work_dirs/${配置文件名}。默认情况下模型会在每一轮训练后在验证集上评估一次评估频率通过train_cfg配置# 每 12 轮迭代进行一次测试评估 train_cfg dict(val_interval12)不同调度配置的默认值不同例如 schedule_1x.py 中 1x 调度为max_epochs12, val_interval1即每轮都验证。模型保存频率由default_hooks中的CheckpointHook控制configs/base/default_runtime.py 默认interval1每轮保存一次 checkpoint。该工具接受以下参数--work-dir ${WORK_DIR}覆盖工作目录。--resume自动从work_dir中的最新 checkpoint 恢复训练。--resume ${CHECKPOINT_FILE}从指定 checkpoint 文件继续训练。--cfg-options Keyvalue覆盖配置文件中的其他设置例如--cfg-options dist_params.port29500。值若为列表需写成key[a,b]或keya,b嵌套列表/元组可写成key[(a,b),(c,d)]引号必须、不能有空格。--amp启用自动混合精度训练。从 train.py 源码可见该参数会将optim_wrapper.type改为AmpOptimWrapper并将loss_scale设为dynamic。注意resume与load-from的区别resume既加载模型权重和优化器状态也会继承指定 checkpoint 的迭代次数训练不会重新开始。它作为命令行参数传入--resume源码中当--resume为auto时会设置cfg.resume True且清空cfg.load_from指定路径时则同时设置cfg.resume True与cfg.load_from 路径见 train.py。load-from只加载模型权重训练从头开始常用于微调fine-tune。它需要写入配置文件中而非命令行参数。default_runtime.py 中默认load_from None, resume False。2.4 使用 CPU 训练CPU 训练的流程与单 GPU 完全一致只需在训练前禁用 GPUexport CUDA_VISIBLE_DEVICES-1之后直接运行单 GPU 训练脚本即可。注意官方不推荐使用 CPU 训练因为速度过于缓慢支持 CPU 仅是为了方便在没有 GPU 的机器上调试代码流程。2.5 在多 GPU 上训练tools/dist_train.sh用于启动多 GPU 训练基本用法如下bash ./tools/dist_train.sh \ ${CONFIG_FILE} \ ${GPU_NUM} \ [optional arguments]可选参数与单 GPU 训练一致。从 dist_train.sh 源码可以看出其底层通过python -m torch.distributed.launch拉起分布式训练NNODES默认 1、NODE_RANK默认 0、PORT默认 29500、MASTER_ADDR默认 127.0.0.1均作为环境变量读取--nproc_per_node$GPUS指定每节点进程数--launcher pytorch被传给train.py。同时启动多个任务如果想在一台机器上同时启动多个任务例如在 8 块 GPU 的机器上启动 2 个各需 4 块 GPU 的任务必须为不同任务指定不同的通信端口默认 29500以避免冲突。使用dist_train.sh时可通过环境变量设置端口CUDA_VISIBLE_DEVICES0,1,2,3 PORT29500 ./tools/dist_train.sh ${CONFIG_FILE} 4 CUDA_VISIBLE_DEVICES4,5,6,7 PORT29501 ./tools/dist_train.sh ${CONFIG_FILE} 42.6 使用多台机器训练如果需要使用 ethernet 连接的多台机器协同训练可以按如下方式在两台机器上分别启动在第一台机器上NNODES2 NODE_RANK0 PORT$MASTER_PORT MASTER_ADDR$MASTER_ADDR sh tools/dist_train.sh $CONFIG $GPUS在第二台机器上NNODES2 NODE_RANK1 PORT$MASTER_PORT MASTER_ADDR$MASTER_ADDR sh tools/dist_train.sh $CONFIG $GPUS其中MASTER_ADDR需指向第一台机器的 IP 地址PORT为约定的通信端口。需要提醒的是如果这几台机器之间没有使用高速网络连接训练会非常慢实践中应优先考虑 InfiniBand 等高速互联。2.7 使用 Slurm 管理任务Slurm 是常见的计算集群调度系统。在 Slurm 管理的集群上可以使用 tools/slurm_train.sh 启动训练任务它同时支持单节点与多节点训练。基本用法如下[GPUS${GPUS}] ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} ${WORK_DIR}以下是在名称为dev的 Slurm 分区上使用 16 块 GPU 训练 Mask R-CNN并将work-dir设置在共享文件系统下的示例GPUS16 ./tools/slurm_train.sh dev mask_r50_1x configs/mask_rcnn_r50_fpn_1x_coco.py /nfs/xxxx/mask_rcnn_r50_fpn_1x从 slurm_train.sh 源码可见脚本支持的环境变量还包括GPUS_PER_NODE默认 8、CPUS_PER_TASK默认 5、SRUN_ARGS以及透传给训练脚本的PY_ARGS${:5}即第 5 个参数起的全部参数可通过srun的--gresgpu、--ntasks等参数控制资源分配。使用 Slurm 时端口需通过以下两种方式之一设置方式一通过--cfg-options设置端口推荐。这种方式无需改动原始配置文件CUDA_VISIBLE_DEVICES0,1,2,3 GPUS4 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config1.py ${WORK_DIR} --cfg-options dist_params.port29500 CUDA_VISIBLE_DEVICES4,5,6,7 GPUS4 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config2.py ${WORK_DIR} --cfg-options dist_params.port29501方式二修改配置文件设置不同通信端口。在config1.py中设置dist_params dict(backendnccl, port29500)在config2.py中设置dist_params dict(backendnccl, port29501)然后分别用两个配置启动任务CUDA_VISIBLE_DEVICES0,1,2,3 GPUS4 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config1.py ${WORK_DIR} CUDA_VISIBLE_DEVICES4,5,6,7 GPUS4 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config2.py ${WORK_DIR}三、在自定义数据集上进行训练本节以 balloon datasetVIA 标注格式的气球数据集为例完整演示如何用自定义数据集对预定义模型进行训练、测试与推理。基本步骤如下准备自定义数据集准备配置文件在自定义数据集上进行训练、测试和推理。3.1 支持新数据集的三种方式MMDetection 一共支持三种形式应用新数据集将数据集重新组织为 COCO 格式将数据集重新组织为一个中间格式实现一个新的数据集类。官方通常建议使用前两种方法因为它们比实现新数据集类要简单得多。本文演示第一种将数据转化为 COCO 格式。注意MMDetection 3.0 之后数据集与评价指标已经解耦除 CityScapes 外。因此用户在验证阶段可以用任意评价指标评价模型在任意数据集上的性能例如用 VOC 评价指标评价模型在 COCO 数据集上的表现或同时使用 VOC 与 COCO 两种评价指标评价 OpenImages 数据集上的模型。3.2 COCO 标注格式用于实例分割的 COCO 数据集格式如下其中的键key都是必需的更完整的字段细节可参考 COCO 官方数据格式说明{ images: [image], annotations: [annotation], categories: [category] } image { id: int, width: int, height: int, file_name: str, } annotation { id: int, image_id: int, category_id: int, segmentation: RLE or [polygon], area: float, bbox: [x,y,width,height], # (x, y) 为 bbox 左上角的坐标 iscrowd: 0 or 1, } categories [{ id: int, name: str, supercategory: str, }]假设现在使用 balloon dataset。下载数据集后需要实现一个函数将 VIA 标注格式转化为 COCO 格式之后就能直接使用仓库中已实现的CocoDataset类定义于 mmdet/datasets/coco.py加载数据并训练与评测。浏览 balloon 数据集会发现其原始标注格式如下每张图片的所有标注由 JSON 中所有键组成{base64_img_data: , file_attributes: {}, filename: 34020010494_e5cb88e1c4_k.jpg, fileref: , regions: {0: {region_attributes: {}, shape_attributes: {all_points_x: [1020, 1000, 994, 1003, 1023, 1050, 1089, 1134, 1190, 1265, 1321, 1361, 1403, 1428, 1442, 1445, 1441, 1427, 1400, 1361, 1316, 1269, 1228, 1198, 1207, 1210, 1190, 1177, 1172, 1174, 1170, 1153, 1127, 1104, 1061, 1032, 1020], all_points_y: [963, 899, 841, 787, 738, 700, 663, 638, 621, 619, 643, 672, 720, 765, 800, 860, 896, 942, 990, 1035, 1079, 1112, 1129, 1134, 1144, 1153, 1166, 1166, 1150, 1136, 1129, 1122, 1112, 1084, 1037, 989, 963], name: polygon}}}, size: 1115004}将 balloon dataset 转化为 COCO 格式的代码如下所示。核心思路是逐张图片读取 VIA 标注用mmcv.imread获取图片宽高把all_points_x/all_points_y多边形点序列转换为 COCO 的segmentation与bbox最终通过mmengine.fileio.dump写出 COCO JSON 文件import os.path as osp import mmcv from mmengine.fileio import dump, load from mmengine.utils import track_iter_progress def convert_balloon_to_coco(ann_file, out_file, image_prefix): data_infos load(ann_file) annotations [] images [] obj_count 0 for idx, v in enumerate(track_iter_progress(data_infos.values())): filename v[filename] img_path osp.join(image_prefix, filename) height, width mmcv.imread(img_path).shape[:2] images.append( dict(ididx, file_namefilename, heightheight, widthwidth)) for _, obj in v[regions].items(): assert not obj[region_attributes] obj obj[shape_attributes] px obj[all_points_x] py obj[all_points_y] poly [(x 0.5, y 0.5) for x, y in zip(px, py)] poly [p for x in poly for p in x] x_min, y_min, x_max, y_max (min(px), min(py), max(px), max(py)) data_anno dict( image_ididx, idobj_count, category_id0, bbox[x_min, y_min, x_max - x_min, y_max - y_min], area(x_max - x_min) * (y_max - y_min), segmentation[poly], iscrowd0) annotations.append(data_anno) obj_count 1 coco_format_json dict( imagesimages, annotationsannotations, categories[{ id: 0, name: balloon }]) dump(coco_format_json, out_file) if __name__ __main__: convert_balloon_to_coco(ann_filedata/balloon/train/via_region_data.json, out_filedata/balloon/train/annotation_coco.json, image_prefixdata/balloon/train) convert_balloon_to_coco(ann_filedata/balloon/val/via_region_data.json, out_filedata/balloon/val/annotation_coco.json, image_prefixdata/balloon/val)使用如上函数用户可以成功将 VIA 标注文件转化为 COCO JSON 格式之后即可用CocoDataset加载数据训练模型并用CocoMetric定义于 mmdet/evaluation/metrics/coco_metric.py进行评测。3.3 准备配置文件第二步是准备一个配置文件以成功加载数据集。假设我们要用 balloon dataset 训练一个配备 FPN 的 Mask R-CNN将配置文件命名为mask-rcnn_r50-caffe_fpn_ms-poly-1x_balloon.py保存在configs/balloon/目录下内容如下。详细的配置编写方法可参考 学习配置文件。# 新配置继承了基本配置并做了必要的修改 _base_ ../mask_rcnn/mask-rcnn_r50-caffe_fpn_ms-poly-1x_coco.py # 我们还需要更改 head 中的 num_classes 以匹配数据集中的类别数 model dict( roi_headdict( bbox_headdict(num_classes1), mask_headdict(num_classes1))) # 修改数据集相关配置 data_root data/balloon/ metainfo { classes: (balloon, ), palette: [ (220, 20, 60), ] } train_dataloader dict( batch_size1, datasetdict( data_rootdata_root, metainfometainfo, ann_filetrain/annotation_coco.json, data_prefixdict(imgtrain/))) val_dataloader dict( datasetdict( data_rootdata_root, metainfometainfo, ann_fileval/annotation_coco.json, data_prefixdict(imgval/))) test_dataloader val_dataloader # 修改评价指标相关配置 val_evaluator dict(ann_filedata_root val/annotation_coco.json) test_evaluator val_evaluator # 使用预训练的 Mask R-CNN 模型权重来做初始化可以提高模型性能 load_from https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth对照仓库中的基配置 configs/mask_rcnn/mask-rcnn_r50-caffe_fpn_ms-poly-1x_coco.py 与 configs/base/datasets/coco_detection.py可以逐项理解上述修改的含义_base_指向 COCO 上的 Mask R-CNN 训练配置caffe 风格骨干 FPN 多尺度训练 多边形 mask新配置只需在其上做增量修改roi_head中把bbox_head与mask_head的num_classes从 80 改为 1以匹配 balloon 数据集只有balloon一个类别的实际情况metainfo声明类名classes与可视化调色板palette与CocoDataset的metainfo机制对应train_dataloader/val_dataloader指定data_root、ann_file、data_prefix图片子目录与batch_size此处设为 1test_dataloader直接复用val_dataloaderval_evaluator只需给定ann_file类型沿用基配置中的CocoMetric这正是 3.0 数据集与指标解耦的体现load_from指向 COCO 预训练权重用于初始化模型参数以提升收敛速度与最终精度。3.4 训练一个新的模型使用上述新配置训练模型只需运行python tools/train.py configs/balloon/mask-rcnn_r50-caffe_fpn_ms-poly-1x_balloon.py更多详细用法多卡、自动缩放学习率等可回看本文在标准数据集上训练预定义的模型一节二者完全通用。3.5 测试以及推理为测试训练完毕的模型运行如下命令python tools/test.py configs/balloon/mask-rcnn_r50-caffe_fpn_ms-poly-1x_balloon.py work_dirs/mask-rcnn_r50-caffe_fpn_ms-poly-1x_balloon/epoch_12.pth其中第二个参数为训练产出的 checkpoint 文件路径。测试与推理的更多详细用法结果可视化、结果提交等请参考 测试现有模型。四、实战要点与常见坑位小结先确认批大小再看学习率配置文件命名中的_NxM_直接反映批大小使用--auto-scale-lr前务必确认auto_scale_lr.base_batch_size存在可能在继承的_base_中且不要随意改动基准值否则自动缩放会失去基准。resume与load-from别混淆前者恢复训练含优化器状态与迭代进度命令行传入后者仅加载权重重新开始配置内写入常用于微调。多任务必须错开端口同机多任务或 Slurm 多任务共用默认端口 29500 会冲突优先用--cfg-options dist_params.portxxxx临时指定避免改动配置文件。自定义数据集优先转 COCO 格式这是最省力的接入方式直接复用CocoDatasetCocoMetric转换时务必保证segmentation、bbox、area、iscrowd等必需字段齐全。CPU 训练仅用于调试通过CUDA_VISIBLE_DEVICES-1禁用 GPU 后即可跑通全流程但训练速度极慢不应用于正式实验。五、深入阅读tools/train.py训练入口命令行参数解析与 Runner 构建tools/dist_train.sh多 GPU 分布式训练启动脚本tools/slurm_train.shSlurm 集群训练启动脚本configs/base/schedules/schedule_1x.py1x 调度与auto_scale_lr基准定义configs/base/datasets/coco_detection.pyCOCO 数据集与评估器基配置mmdet/datasets/coco.pyCocoDataset实现mmdet/evaluation/metrics/coco_metric.pyCocoMetric实现数据集准备、学习配置文件、测试现有模型赞分享人工智能计算机视觉深度学习模型评测【免费下载链接】mmdetectionOpenMMLab Detection Toolbox and Benchmark项目地址https://gitcode.com/gh_mirrors/mm/mmdetection点击查看免费下载相关推荐MMDetection 模型训练实战指南从标准数据集到自定义数据集的完整训练流程MMDetection 模型训练实战指南从标准数据集到自定义数据集的完整训练流程 本文是 MMDetection 官方用户指南中 docs/en/user_g人工智能计算机视觉深度学习模型评测XTuner 自定义预训练数据集实战从数据准备到增量预训练全流程指南XTuner 自定义预训练数据集实战从数据准备到增量预训练全流程指南 XTuner 支持使用自定义数据集对基座大语言模型进行增量预训练Incremental大模型模型微调CANN竞赛ClipByValue算子赛题一、赛题背景 ClipByValue 是数值裁剪算子将张量元素限制在 min, max 范围内广泛用于梯度裁剪、数值稳定处理等场景。本题要求基于 torchAscend算子库人工智能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考