LZ使用mmdetection2.0.0,奈何cascade rcnn的rcnn阶段的OHME并没有完善,一跑报错
TypeError: __init__() missing 1 required positional argument: 'context'
根据mmdetection的github上的这个issue和这个issue,发现没有是context参数缺失,根据这个页面的显示,定位到mmdet/models/detectors/two_stage.py,发现目标行if语句块在2.0.0版本上没有出现,于是根据报错信息
File "mmdetection/mmdet/models/roi_heads/cascade_roi_head.py", line 89, in init_assigner_sampler
self.bbox_sampler.append(build_sampler(rcnn_train_cfg.sampler))
找到了目前版本的build_sampler()的地方,位于mmdet/models/roi_heads/cascade_roi_head.py的88行,于是,将
self.bbox_sampler.append(build_sampler(rcnn_train_cfg.sampler))
改为
self.bbox_sampler.append(build_sampler(rcnn_train_cfg.sampler, context=self))
运行训练程序,发现报错:
AttributeError: 'CascadeRoIHead' object has no attribute 'current_stage'
回到mmdet/models/roi_heads/cascade_roi_head.py的88行,设置断点查看self属性,确实没有'current_stage'。在本py文件搜索'current_stage',发现其在215行的forward_train方法内,考虑self.current_stage在执行init_assigner_sampler方法的时候没有初始化。
通过调试信息发现self.current_stage的意义为指示目前是rcnn的第几个阶段。于是,问题迎刃而解,在遍历self.train_cfg训练配置的时候,要指出其是rcnn的第几阶段,所以在遍历的时候使用enumerate()获得目前遍历的索引,赋予self.current_stage即可,代码如下:
def init_assigner_sampler(self):
# build assigner and smapler for each stage
self.bbox_assigner = []
self.bbox_sampler = []
if self.train_cfg is not None:
for i, rcnn_train_cfg in enumerate(self.train_cfg): # changed
self.current_stage = i # add
self.bbox_assigner.append(
build_assigner(rcnn_train_cfg.assigner))
self.bbox_sampler.append(build_sampler(rcnn_train_cfg.sampler, context=self)) # add 'context=self'
添加一行代码以及更改两行代码,就能够愉快的使用cascade-rcnn的OHME啦。