源码文件
tools/infer_simple.py
运行指令
Detectron 是一个非常庞杂的代码项目, 因此, 在对 Detecron 内部的主要模型进行解析之前, 我们首先要知道如何使用已经训练好的模型. 也就是先要知道如何利用完善的 Detectron 目标检测模型框架. 根据官方的使用教程, 要利用 Detectron 检测用户提供的自定义图片, 需要在 shell
中运行下面的指令:
1 | python tools/infer_simple.py \ |
在上面的指令中, Detectron 会自动下载 --wts
参数指定了模型的下载链接, 最终下载的模型会根据 Detectron/detectron/core/config.py
中的 __C.DOWNLOAD_CACHE
参数决定, 该参数的默认值为 /tmp/detectron-download-cache
, 可以根据你自己的需要进行修改, --output-dir
参数指定了返回的结果存放的位置, 推荐你修改成自己期望的路径, 结果在默认情况下会以 PDF 的格式返回. 最后的demo
指示的是待检测图谱存放的路径, 位于Detectron/demo/
文件夹下, 这里可以直接指定的原因是因为在代码中使用了下面的方式定义此参数1
2
3parser.add_argument(
'im_or_folder', help='image or folder of images', default=None
) # 注意第一个参数定义为'im_or_folder', 而不是'--im_or_folder'
tools/infer_simple 文件总览
接下来, 我们根据这个脚本文件, 逐步解析 Detectron 的工作原理. 为了更加有条理的解析, 我们会根据文件中的代码功能, 将文件按照模块进行解析, 主要包含以下几个部分:
- 导入的包及函数: 介绍导入的函数和变量的含义及作用
- 命令行参数: 介绍该文件使用的命令行参数的用途及注意事项
- 主程序: 最重要的一部分, 可能包含大量其他文件中的函数代码, 会重点讲解该文件.
文件代码的概览如下所示:
1 | # ./tools/infer_simple |
导入的包及函数
首先看一下该文件导入了那些包和函数, 以及它们的作用:
1 | # ./tools/infer_simple |
在上面的代码中, 首先导入了 cfg 相关的变量和函数, 它们大致作用已经在代码中的注释中介绍, 如果你还想深入了解这些函数的具体实现, 那么可以看关于全局配置选项及相关函数. 另外还有用于设置输出日志信息的函数 setup_logging
, 详细解析可以看日志输出控制及训练状态跟踪.
命令行参数
下面的代码定义了该文件可能会用到的命令行参数, 其中有些参数你已经在文章开始的运行指令中见到过, 下面我们就来看一下这些参数的定义及功能.
1 | # Detectron/tools/infer_simple.py |
主程序
mian()
函数为该脚本文件的主要函数, 其调用了多个其他文件的函数及参数, 主要有以下几个:
merge_cfg_from_file()
: 将 yaml config 文件中的配置信息融合到detectron/core/config.py
中的全局配置信息中.cache_url()
: 下载url
指定的文件到cache_dir
当中, 同时返回缓存文件的路径, 如果缓存文件直接存在, 则可以直接返回. 如果传入的第一个参数不是url
类型的, 也直接将其返回.assert_and_infer_cfg()
: 当完成所有的 cfg 参数设置以后, 调用此函数, 默认情况下, 该函数会将全局的 cfg 标记为只读类型(immutable), 以此来保护在脚本执行过程中 cfg 选项的值不被修改.(如果允许修改, 则在debug的时候会很难)infer_engine.initialize_model_from_cfg()
: 该函数会根据全局配置信息(global cfg)创建模型并对其进行初始化. 在将 caffe2 的工作空间中创建网络并加载 test-time 权重. 关于此函数的详细说明可以查看模型推演源码解析dummy_datasets.get_coco_dataset()
: 该函数用于加载 coco 数据集, 关于这部分的详细解析可以查看数据载入详细解析vis_utils.vis_one_image()
: 该函数用于将模型输出的数值结果以可视化的方式呈现, 关于这部分的详细解析可以查看Detectron 结果可视化c2_utils.NamedCudaScopr()
: 提供 GPU name scope 和 CUDA device scope 功能, 需要结合with
使用, 位于detectron/utils/c2.py
文件, 详细解析请看工具函数完整解读
代码解析如下:
1 | def main(args): |
小结
上面的代码是 Detectron 的一个非常简单的示例代码, 涵盖了模型创建, 模型初始化, 模型测试, 结果可视化等功能. 由于这里的实例代码仅仅是调用了封装好的接口, 因此我们虽然成功的通过预训练好的模型对自定义的图片进行了检测, 但是我们可能还是不太清楚其内部到底是怎么实现的. 实际上, 这个示例仅仅是一个“热身”, 如果你想要更加深入的了解 Detectron 的内部实现原理, 可以查看我的其他解析.
PS: 查看这篇总览, 可以大致了解 Detectron 的源码结构, 根据你自己的需要来选择相应的解析文章.