detectron2是怎么建立模型的?以SparseInst代码为例【思路版第一部分】

看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的定义如下

——————————————分界线——————————————————————

注:

这里的

model=META_ARCH_REGISTRY.get(meta_arch)(cfg)
model.to(torch.device(cfg.MODEL.DEVICE))

用Registry类的get函数,传入参数meta_arch的值为字字符串'SparseInst',也就是说'SparseInst'是在Registry类中提前注册好了的。查阅得知以下代码完成了注册过程

所以META_ARCH_REGISTRY.get(meta_arch)得到了SparseInst类名,META_ARCH_REGISTRY.get(meta_arch)(cfg)会将cfg传入SparseInst得到一个SparseInst对象 

—————————————————分界线—————————————————————

可知是用了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类

图一

图二

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值