赞
踩
config是MMXXXX系列中的重点,可以用一个config文件跑所有的程序。这样处理的原因是参数过多。不只是因为模型参数多,选取的优化器,lr的各种变化,数据如何处理…等一堆参数。每次修改的时候,都不可能跑到源码中修改,那么一个config文件把这些所有的参数都写到一个文件中,然后程序一键构建。
config中的aaa.py文件常常索引了其他xxx1.py文件为base,并对其中部分参数进行修改。当我们查看文件xxx1.py时候,可发现xxx1.py又索引了xxx2.py文件。这样的索引可能会嵌套好多次。
举例说明:
faster_rcnn_r50_fpn_ciou_1x_coco.py 的 "_base_ = './faster_rcnn_r50_fpn_1x_coco.py'"
faster_rcnn_r50_fpn_1x_coco.py中的"
_base_ = [
'../_base_/models/faster_rcnn_r50_fpn.py',
'../_base_/datasets/coco_detection.py',
'../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py'
]"
|
|
|
config由三部分组成:
./tools/misc/print_config.py 可以查看config目录下某个配置文件的所有索引内容。
# 通过下面的命令可以查看./configs/fast_rcnn/fast_rcnn_r101_fpn_1x_coco.py 所有的配置信息 (mmdetection) lenovo@lenovo:/media/lenovo/document/Code/mmdetection$ python tools/misc/print_config.py ./configs/fast_rcnn/fast_rcnn_r101_fpn_1x_coco.py # #下面显示的内容是查看的结果 #初学者不知道原始嵌套的文件的信息,需要使用这个命令来看完整信息,然后再研究。 #**model是最重要,也是最难的**。config一定是字典,类似于下面的实例。 #模型的实际创建是非常复杂的,但为了便于理解,可以这样考虑: "" backbone=dict( type='ResNet', 中的type可以索引到/mmdetection/mmdet/models/backbones/__init__.py中声明的ResNet 我们可以根据实际需要修改其中一些参数。 "" #使用Python生成的文本是没有注释的。为了便于理解,增加注释部分 Config: model = dict( type='FastRCNN', backbone=dict(#不同config文件的内容也不相同,要根据具体的模型来定。这里以backbone为例,进行讲解。 type='ResNet',#在./mmdet/models/__init__.py文件中有声明。可以自定义一个,但如果使用自定义,就必须重新编译一遍。 #下面这些参数是传递到./mmdet/models/backbones/resnet.py 的def __init__(......)函数中进行类初始化的。 depth=101,#可以按照需要改成50,60,3000...... num_stages=4, out_indices=(0, 1, 2, 3), frozen_stages=1, norm_cfg=dict(type='BN', requires_grad=True), norm_eval=True, style='pytorch', init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet101')), neck=dict( type='FPN', in_channels=[256, 512, 1024, 2048], out_channels=256, num_outs=5), roi_head=dict( type='StandardRoIHead', bbox_roi_extractor=dict( type='SingleRoIExtractor', roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), out_channels=256, featmap_strides=[4, 8, 16, 32]), bbox_head=dict( type='Shared2FCBBoxHead', in_channels=256, fc_out_channels=1024, roi_feat_size=7, num_classes=80,#这里是80个分类。如果我们的监测目标是100,可以改成101 bbox_coder=dict( type='DeltaXYWHBBoxCoder', target_means=[0.0, 0.0, 0.0, 0.0], target_stds=[0.1, 0.1, 0.2, 0.2]), reg_class_agnostic=False, loss_cls=dict( type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), loss_bbox=dict(type='L1Loss', loss_weight=1.0))), train_cfg=dict( rcnn=dict( assigner=dict( type='MaxIoUAssigner', pos_iou_thr=0.5, neg_iou_thr=0.5, min_pos_iou=0.5, match_low_quality=False, ignore_iof_thr=-1), sampler=dict( type='RandomSampler', num=512, pos_fraction=0.25, neg_pos_ub=-1, add_gt_as_proposals=True), pos_weight=-1, debug=False)), test_cfg=dict( rcnn=dict( score_thr=0.05, nms=dict(type='nms', iou_threshold=0.5), max_per_img=100))) ###################################### #下面内容是值,要用于传递给data = dict(......) dataset_type = 'CocoDataset' data_root = 'data/coco/' img_norm_cfg = dict( mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) train_pipeline = [ dict(type='LoadImageFromFile'), dict(type='LoadProposals', num_max_proposals=2000), dict(type='LoadAnnotations', with_bbox=True), dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), dict(type='RandomFlip', flip_ratio=0.5), dict( type='Normalize', mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True), dict(type='Pad', size_divisor=32), dict(type='DefaultFormatBundle'), dict(type='Collect', keys=['img', 'proposals', 'gt_bboxes', 'gt_labels']) ] test_pipeline = [ dict(type='LoadImageFromFile'), dict(type='LoadProposals', num_max_proposals=None), dict( type='MultiScaleFlipAug', img_scale=(1333, 800), flip=False, transforms=[ dict(type='Resize', keep_ratio=True), dict(type='RandomFlip'), dict( type='Normalize', mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True), dict(type='Pad', size_divisor=32), dict(type='ImageToTensor', keys=['img']), dict(type='ToTensor', keys=['proposals']), dict( type='ToDataContainer', fields=[dict(key='proposals', stack=False)]), dict(type='Collect', keys=['img', 'proposals']) ]) ] ###################################### # 数据类型与数据路径 data = dict( samples_per_gpu=2, #batch size of each GPU. 本质就是dataload的batchsize workers_per_gpu=2, #How many subprocess to use for data loading for each GPU #上面两个参数正常是不需要更改的 train=dict( type='CocoDataset',#数据类型,同dataset_type。 在./mmdet/datasets/__init__.py文件中有登记。可以在./mmdet/datasets/class CocoDataset(CustomDataset)中查看具体的参数 ann_file='data/coco/annotations/instances_train2017.json',#标注文件的路径。可以在这个json文件中写出绝对路径,也可以用下面的那个img_prefix写出来 img_prefix='data/coco/train2017/',#标注文件的前缀 pipeline=[ dict(type='LoadImageFromFile'), dict(type='LoadProposals', num_max_proposals=2000), dict(type='LoadAnnotations', with_bbox=True), dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), dict(type='RandomFlip', flip_ratio=0.5), dict( type='Normalize', mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True), dict(type='Pad', size_divisor=32), dict(type='DefaultFormatBundle'), dict( type='Collect', keys=['img', 'proposals', 'gt_bboxes', 'gt_labels']) ], proposal_file='data/coco/proposals/rpn_r50_fpn_1x_train2017.pkl'), val=dict( type='CocoDataset', ann_file='data/coco/annotations/instances_val2017.json', img_prefix='data/coco/val2017/', pipeline=[ dict(type='LoadImageFromFile'), dict(type='LoadProposals', num_max_proposals=None), dict( type='MultiScaleFlipAug', img_scale=(1333, 800), flip=False, transforms=[ dict(type='Resize', keep_ratio=True), dict(type='RandomFlip'), dict( type='Normalize', mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True), dict(type='Pad', size_divisor=32), dict(type='ImageToTensor', keys=['img']), dict(type='ToTensor', keys=['proposals']), dict( type='ToDataContainer', fields=[dict(key='proposals', stack=False)]), dict(type='Collect', keys=['img', 'proposals']) ]) ], proposal_file='data/coco/proposals/rpn_r50_fpn_1x_val2017.pkl'), test=dict( type='CocoDataset', ann_file='data/coco/annotations/instances_val2017.json', img_prefix='data/coco/val2017/', pipeline=[ dict(type='LoadImageFromFile'), dict(type='LoadProposals', num_max_proposals=None), dict( type='MultiScaleFlipAug', img_scale=(1333, 800), flip=False, transforms=[ dict(type='Resize', keep_ratio=True), dict(type='RandomFlip'), dict( type='Normalize', mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True), dict(type='Pad', size_divisor=32), dict(type='ImageToTensor', keys=['img']), dict(type='ToTensor', keys=['proposals']), dict( type='ToDataContainer', fields=[dict(key='proposals', stack=False)]), dict(type='Collect', keys=['img', 'proposals']) ]) ], proposal_file='data/coco/proposals/rpn_r50_fpn_1x_val2017.pkl')) evaluation = dict(interval=1, metric='bbox') ##################################### #下面是schedule的内容 ##规定了优化器,学习率......等一堆参数。 optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) optimizer_config = dict(grad_clip=None) lr_config = dict( policy='step', warmup='linear', warmup_iters=500, warmup_ratio=0.001, step=[8, 11]) runner = dict(type='EpochBasedRunner', max_epochs=12) #训练总周期 checkpoint_config = dict(interval=1) #保存checkpoints的间隔。checkpoints保存了训练中的数据 log_config = dict(interval=50, hooks=[dict(type='TextLoggerHook')]) #打印log文件的间隔 custom_hooks = [dict(type='NumClassCheckHook')] dist_params = dict(backend='nccl') log_level = 'INFO' load_from = None #加载参数 resume_from = None #重新加载(包含epoch等信息,会覆盖load_from) workflow = [('train', 1)] #工作流train,val,test。
init.py文件中声明了这些模型。如果自己添加自定义模型的话,那么需要重新编译一遍。
文档内容是无论如何都没法把所有内容写全的,所以需要自己经常查看源码。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。