如何在Colab笔记本中配置Detectron2训练时使用验证数据集
Detectron2训练阶段添加验证集评估的配置方法
直接按下面步骤改就行,默认示例没加验证就是因为漏了这几处配置:
- 第一步先完成验证集注册
和你注册自定义训练集的逻辑完全一致,给验证集单独命个名,比如训练集叫custom_train,验证集就叫custom_val,保证验证集的类别映射、元数据配置和训练集完全一致,别出现类别数不匹配、类别id错位的问题。 - 第二步修改核心配置参数
这两个参数是控制验证逻辑的关键,默认配置里都是空值/0,所以不会触发验证:- 给
cfg.DATASETS.TEST传入你注册好的验证集名称,注意这个参数是元组格式,哪怕只有一个验证集也要在末尾加逗号,正确写法是cfg.DATASETS.TEST = ("custom_val",),直接写字符串会被拆成单字符识别,直接报数据集未注册的错误。 - 设置
cfg.TEST.EVAL_PERIOD参数,这个值代表每迭代多少步触发一次验证评估,比如设成500就是每500个训练步跑一次全量验证,设成0的话哪怕配了TEST数据集也不会在训练过程中跑评估。
- 给
注意:这个值别设太小,验证评估的速度比训练慢很多,设太密会拖慢整体训练节奏,一般按总迭代步数的1/10~1/20设置就够用。
- 第三步匹配对应评估器
如果你直接用官方自带的DefaultTrainer启动训练,框架会自动根据你注册数据集的元数据匹配对应评估器,比如COCO格式数据集会自动调用COCO评估器计算AP等指标。
如果你是自己继承写了自定义训练器,必须重写build_evaluator方法,返回和你数据集格式匹配的评估器实例,不然跑到评估步会直接报错。
给个最小可运行的配置参考:
from detectron2.engine import DefaultTrainer from detectron2.evaluation import COCOEvaluator # 用VOC数据集就替换为PascalVOCDetectionEvaluator from detectron2.config import get_cfg import os cfg = get_cfg() # 这里替换成你加载基础模型配置的逻辑 cfg.DATASETS.TRAIN = ("custom_train",) # 验证集核心配置 cfg.DATASETS.TEST = ("custom_val",) cfg.DATALOADER.NUM_WORKERS = 2 # 权重加载、训练超参按你自己的需求设置 cfg.SOLVER.IMS_PER_BATCH = 2 cfg.SOLVER.BASE_LR = 0.00025 cfg.SOLVER.MAX_ITER = 6000 cfg.MODEL.ROI_HEADS.NUM_CLASSES = 你的自定义类别数 # 配置每1000步跑一次验证 cfg.TEST.EVAL_PERIOD = 1000 os.makedirs(cfg.OUTPUT_DIR, exist_ok=True) trainer = DefaultTrainer(cfg) trainer.resume_or_load(resume=False) trainer.train() # 如果想训练结束后立刻跑一次全量验证出最终结果,可以加下面这行 # trainer.test(cfg, trainer.model, evaluators=COCOEvaluator("custom_val", output_dir="./output/val_result/"))
几个容易踩的坑:
- 验证集的标注格式必须和训练集保持一致,别训练集用COCO格式验证集用VOC格式,评估器读不到标注会直接报错。
- 评估结果会默认存在输出目录的
inference文件夹下,包含各分类AP、AR等指标的json文件,要是需要可视化评估结果,可以在初始化评估器的时候开启可视化参数,会自动把检测框画在验证集图片上存下来。 - 如果你的数据集是完全自定义格式,官方内置评估器不支持,需要自己实现继承
DatasetEvaluator的自定义评估类,在build_evaluator里返回你自己写的评估器实例就行。
内容的提问来源于stack exchange,提问作者YadneshD
相关产品推荐
相关产品推荐

