mmdetection 经验汇总

修改源码

方法1:

从福哥编译镜像处学到的方法是,首先将mmdet正常编译,然后将编译后的mmdet移到主要工程目录下。运行程序时,为了调用工程目录下的mmdet,sh中需要加入下述命令:

1
export PYTHONPATH=.

由于python就近调用机制,所以可以直接调用工程目录下的mmdet

方法2:

根据王老板的方法,在mmdet外部构建一个修改包,将所有注册器都加载进去,

3FtfaT.png

加载所有注册器为:

1
2
3
4
5
6
7
8
9
from mmdet.models.registry import BACKBONES,NECKS,ROI_EXTRACTORS,SHARED_HEADS,HEADS,LOSSES,DETECTORS
from mmdet.datasets.registry import DATASETS, PIPELINES

from mmdet.datasets.custom import CustomDataset
from mmdet.models.builder import build_loss
__all__ = ['BACKBONES','NECKS','ROI_EXTRACTORS',
'SHARED_HEADS','HEADS','LOSSES','DETECTORS',
'DATASETS', 'PIPELINES',
'CustomDataset', 'build_loss']

当我向对PIPELINES的loading增加函数方法时,可以:

1
2
3
4
5
6
7
8
9
10
11
12
import os.path as osp
import warnings

import mmcv
import numpy as np
import pycocotools.mask as maskUtils
from bottle_module.init_registry import PIPELINES

@PIPELINES.register_module
class LoadTmpRawImageFromFile(object):
...
...

加载修改包:

1
2
3
4
import sys
sys.path.insert(0, '../')
sys.path.insert(0, '../bottle_module')
import bottle_module

加载的都是当前工作目录下的mmdet和修改包

总体而言,感觉方法二更人性化,若要修改源码直接继承在修改包就行,不像方法一每次必须到源码处对应修改

参数

降低显存

1
2
fp16 = dict(loss_scale=512.) #混合精度训练
with_cp = True, #插入到backbone中, 速度降低

跨卡BN

1
norm_cfg = dict(type='SyncBN', requires_grad=True) #backbone+FPN+head中插入

增点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#代替smoothL1Loss
loss_bbox=dict(type='BalancedL1Loss', alpha=0.5, gamma=1.5, beta=1.0, loss_weight=1.0)

#rcnn head采用4conv+1fc
dict(
type='ConvFCBBoxHead',
num_shared_convs=4,
num_shared_fcs=1,
in_channels=256,
conv_out_channels=256,
fc_out_channels=1024,
roi_feat_size=7,
num_classes=11,
target_means=[0., 0., 0., 0.],
target_stds=[0.05, 0.05, 0.1, 0.1],
reg_class_agnostic=True,
loss_cls=dict(
type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0),
loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))

#设置正负样本比例上限,原始设置为-1,不做约束
neg_pos_ub=3/5,