object detection API构建自己的网络模型
首先定位到 object_detection\builders\model_builder.py 该文件是构建各种组件的地方。实现 SSD , Faster R-CNN , R-FCN 三个系列的基本功能,基于不同的分类模型,构建不同的feature_extractor。
有博客中说该模块中的 build 是供外部调用的唯一方法,其他模块都会调用该方法。
我想基于resnet构建新的模型,需要引入新的模块
from object_detection.models import faster_rcnn_resnet_gqm_feature_extractor as frcnn_resnet_gqm
然后在FASTER_RCNN_FEATURE_EXTRACTOR_CLASS_MAP加入自己的特征提取器
# A map of names to Faster R-CNN feature extractors.
FASTER_RCNN_FEATURE_EXTRACTOR_CLASS_MAP = {
'faster_rcnn_nas':
frcnn_nas.FasterRCNNNASFeatureExtractor,
'faster_rcnn_pnas':
frcnn_pnas.FasterRCNNPNASFeatureExtractor,
'faster_rcnn_inception_resnet_v2':
frcnn_inc_res.FasterRCNNInceptionResnetV2FeatureExtractor,
'faster_rcnn_inception_v2':
frcnn_inc_v2.FasterRCNNInceptionV2FeatureExtractor,
'faster_rcnn_resnet50':
frcnn_resnet_v1.FasterRCNNResnet50FeatureExtractor,
'faster_rcnn_resnet101':
frcnn_resnet_v1.FasterRCNNResnet101FeatureExtractor,
'faster_rcnn_resnet152':
frcnn_resnet_v1.FasterRCNNResnet152FeatureExtractor,
'faster_rcnn_resnet_gqm':
frcnn_resnet_gqm.FasterRCNNResnet101FeatureExtractor,
}
然后根据配置文件的内容会转到两个相关faster rcnn的内容:
_build_faster_rcnn_feature_extractor
_build_faster_rcnn_model
这两个函数应该是导入配置文件中的各种参数,并生成相应的组件,按照函数名来看应该是不需要更改的。
复制faster_rcnn_resnet_v1_feature_extractor.py,重命名为faster_rcnn_resnet_gqm_feature_extractor.py.
然后将config文件中的特征提取器进行设置
feature_extractor {
type: 'faster_rcnn_resnet_gqm'
first_stage_features_stride: 16
}
发现是可以跑起来进行训练的。说明初始的框架已经搭好了。之后在这几个文件中进行改动,不会对原有的模型产生影响。
然后定位到faster_rcnn_resnet_gqm_feature_extractor.py. 发现这里都是功能提取器的定义,然后引用了faster_rcnn_meta_arch,这里两个大部分是父类和子类的关系。
可以找到FasterRCNNResnet101FeatureExtractor这样的类,用来做提取器。应该改动这里就可以构建新的提取器了。
剩下的还在继续摸索,前期工作记录在这里。