看SparseInst论文发现论文里有些地方没讲清楚;遂找SparseInst源码来看模型结构
我选择从推理代码来找模型结构:
经探索,在SparseInst代码里,推理需要执行代码
python demo.py --config-file configs/sparse_inst_r50_base.yaml --input datasets/coco/val2017/* --output image_results --opt MODEL.WEIGHTS sparse_inst_r50_base_ff9809.pth INPUT.MIN_SIZE_TEST 512
查阅得知建立模型很可能在
找到VisualizationDemo的实现:
发现关键代码在
self.predictor = DefaultPredictor(cfg)
如此得到的self.predictor(image)可以直接接受图片,所以self.predictor就是模型网络部分。
搜索文本DefaultPredictor得知DefaultPredictor在detectron2.engine.defaults包下
查询DefaultPredictor定义得知build_model(self.cfg)是实际用来创建模型的部分
而build_model的定义在detectron2.modeling包下
查找到build_model的定义如下
可知是用了detectron2.utils.registry的 Registry来建立网络结构的。查找得知detectron2.utils.registry的 Registry是直接import的别的包
from fvcore.common.registry import Registry # for backward compatibility.
查找fvcore.common.registry得知Registry定义在这篇文章中有详解
Detectron2和fvcore中的Registry机制详解_fvcore registry-CSDN博客
官方详解fvcore.common.registry — detectron2 0.6 documentation
发现官方源码里用了typing里的Dict包
查阅Python 中 typing 模块和类型注解的使用 | 静觅得知typing里的Dict是用来让python能像C++一样强申明变量类型的。
names: list = ['Germey', 'Guido']
version: tuple = (3, 7, 4)
operations: dict = {'show': False, 'sort': True}
以上代码:只知道 names 是一个列表 list 类型,但是不知道 names 里面的元素是str类型还是int类型;也不知道 operations这个字典的key和value是什么类型的。只能知道operations是一个字典。
但如果用typing 模块,它提供了非常 “强 “的明确类型申明,比如 List[str]
表示由 str 类型的元素组成的列表,Tuple[int, int, int]
是由 int 类型的元素组成的长度为 3 的元组。所以用typing申明以上字典的代码如下:
from typing import List, Tuple, Dict
names: List[str] = ['Germey', 'Guido']
version: Tuple[int, int, int] = (3, 7, 4)
operations: Dict[str, bool] = {'show': False, 'sort': True}
好家伙,貌似误入歧途了,debug模式下,先在下图一,
点下一步就进入下图二这个分支。
而不是之前分析的进入detectron2.engine.defaults包下的DefaultPredictor类
仔细想了想不是误入歧途,我安装了detectron2包,所以猜想这些安装的包应该在debug模式下不能看到源码。
验证猜想:
我试着把项目里的detectron2整个文件夹删去,也不影响demo.py正常执行,所以实际上执行以下代码时候用到的是我安装好的 detectron2包,所以debug看不到源码
python demo.py --config-file configs/sparse_inst_r50_base.yaml --input datasets/coco/val2017/* --output image_results --opt MODEL.WEIGHTS sparse_inst_r50_base_ff9809.pth INPUT.MIN_SIZE_TEST 512
所以实际上在下图一的下一步就是会进入detectron2.engine.defaults包下的DefaultPredictor类
图一
图二