Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
s920243400
PaddleDetection
提交
19ed75b0
P
PaddleDetection
项目概览
s920243400
/
PaddleDetection
与 Fork 源项目一致
Fork自
PaddlePaddle / PaddleDetection
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleDetection
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
19ed75b0
编写于
7月 01, 2019
作者:
Y
Yang Zhang
提交者:
GitHub
7月 01, 2019
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add Chinese translation of `CONFIG.md` (#2632)
上级
e70839a0
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
182 addition
and
0 deletion
+182
-0
docs/CONFIG_cn.md
docs/CONFIG_cn.md
+182
-0
未找到文件。
docs/CONFIG_cn.md
0 → 100644
浏览文件 @
19ed75b0
# 简介
为了使配置过程更加自动化并减少配置错误,PaddleDetection的配置管理采取了较为严谨的设计。
# 设计思想
目前主流框架全局配置基本是一个Python dict,这种设计对配置的检查并不严格,拼写错误或者遗漏的配置项往往会造成训练过程中的严重错误,进而造成时间及资源的浪费。为了避免这些陷阱,从自动化和静态分析的原则出发,PaddleDetection采用了一种用户友好、 易于维护和扩展的配置设计。
# 基本设计
利用Python的反射机制,PaddleDection的配置系统从Python类的构造函数抽取多种信息 - 如参数名、初始值、参数注释、数据类型(如果给出type hint)- 来作为配置规则。 这种设计便于设计的模块化,提升可测试性及扩展性。
## API
配置系统的大多数功能由
`ppdet.core.workspace`
模块提供
-
`register`
: 装饰器,将类注册为可配置模块;能够识别类定义中的一些特殊标注。
-
`__category__`
: 为便于组织,模块可以分为不同类别。
-
`__inject__`
: 如果模块由多个子模块组成,可以这些子模块实例作为构造函数的参数注入。对应的默认值及配置项可以是类名字符串,yaml序列化的对象,指向序列化对象的配置键值或者Python dict(构造函数需要对其作出处理,参见下面的例子)。
-
`__op__`
: 配合
`__append_doc__`
(抽取目标OP的 注释)使用,可以方便快速的封装PaddlePaddle底层OP。
-
`serializable`
: 装饰器,利用
[
pyyaml
](
https://pyyaml.org/wiki/PyYAMLDocumentation
)
的序列化机制,可以直接将一个类实例序列化及反序列化。
-
`create`
: 根据全局配置构造一个模块实例。
-
`load_config`
and
`merge_config`
: 加载yaml文件,合并命令行提供的配置项。
## 示例
以
`RPNHead`
模块为例,该模块包含多个PaddlePaddle OP,先将这些OP封装成类,并将其实例在构造
`RPNHead`
时注入。
```
python
# excerpt from `ppdet/modeling/ops.py`
from
ppdet.core.workspace
import
register
,
serializable
# ... more operators
@
register
@
serializable
class
GenerateProposals
(
object
):
# NOTE this class simply wraps a PaddlePaddle operator
__op__
=
fluid
.
layers
.
generate_proposals
# NOTE docstring for args are extracted from PaddlePaddle OP
__append_doc__
=
True
def
__init__
(
self
,
pre_nms_top_n
=
6000
,
post_nms_top_n
=
1000
,
nms_thresh
=
.
5
,
min_size
=
.
1
,
eta
=
1.
):
super
(
GenerateProposals
,
self
).
__init__
()
self
.
pre_nms_top_n
=
pre_nms_top_n
self
.
post_nms_top_n
=
post_nms_top_n
self
.
nms_thresh
=
nms_thresh
self
.
min_size
=
min_size
self
.
eta
=
eta
# ... more operators
# excerpt from `ppdet/modeling/anchor_heads/rpn_head.py`
from
ppdet.core.workspace
import
register
from
ppdet.modeling.ops
import
AnchorGenerator
,
RPNTargetAssign
,
GenerateProposals
@
register
class
RPNHead
(
object
):
"""
RPN Head
Args:
anchor_generator (object): `AnchorGenerator` instance
rpn_target_assign (object): `RPNTargetAssign` instance
train_proposal (object): `GenerateProposals` instance for training
test_proposal (object): `GenerateProposals` instance for testing
"""
__inject__
=
[
'anchor_generator'
,
'rpn_target_assign'
,
'train_proposal'
,
'test_proposal'
]
def
__init__
(
self
,
anchor_generator
=
AnchorGenerator
().
__dict__
,
rpn_target_assign
=
RPNTargetAssign
().
__dict__
,
train_proposal
=
GenerateProposals
(
12000
,
2000
).
__dict__
,
test_proposal
=
GenerateProposals
().
__dict__
):
super
(
RPNHead
,
self
).
__init__
()
self
.
anchor_generator
=
anchor_generator
self
.
rpn_target_assign
=
rpn_target_assign
self
.
train_proposal
=
train_proposal
self
.
test_proposal
=
test_proposal
if
isinstance
(
anchor_generator
,
dict
):
self
.
anchor_generator
=
AnchorGenerator
(
**
anchor_generator
)
if
isinstance
(
rpn_target_assign
,
dict
):
self
.
rpn_target_assign
=
RPNTargetAssign
(
**
rpn_target_assign
)
if
isinstance
(
train_proposal
,
dict
):
self
.
train_proposal
=
GenerateProposals
(
**
train_proposal
)
if
isinstance
(
test_proposal
,
dict
):
self
.
test_proposal
=
GenerateProposals
(
**
test_proposal
)
```
对应的yaml配置如下,请注意这里给出的是
**完整**
配置,其中所有默认值配置项都可以省略。上面的例子中的模块所有的构造函数参数都提供了默认值,因此配置文件中可以完全略过其配置。
```
yaml
RPNHead
:
test_prop
:
eta
:
1.0
min_size
:
0.1
nms_thresh
:
0.5
post_nms_top_n
:
1000
pre_nms_top_n
:
6000
train_prop
:
eta
:
1.0
min_size
:
0.1
nms_thresh
:
0.5
post_nms_top_n
:
2000
pre_nms_top_n
:
12000
anchor_generator
:
# ...
rpn_target_assign
:
# ...
```
`RPNHead`
模块实际使用代码示例。
```
python
from
ppdet.core.worskspace
import
load_config
,
merge_config
,
create
load_config
(
'some_config_file.yml'
)
merge_config
(
more_config_options_from_command_line
)
rpn_head
=
create
(
'RPNHead'
)
# ... code that use the created module!
```
配置文件用可以直接序列化模块实例,用
`!`
标示,如
```
yaml
LearningRate
:
base_lr
:
0.01
schedulers
:
-
!PiecewiseDecay
gamma
:
0.1
milestones
:
[
60000
,
80000
]
-
!LinearWarmup
start_factor
:
0.3333333333333333
steps
:
500
```
# 安装依赖
配置系统用到两个Python包,均为可选安装。
-
[
typeguard
](
https://github.com/agronholm/typeguard
)
在Python 3中用来进行数据类型验证。
-
[
docstring\_parser
](
https://github.com/rr-/docstring_parser
)
用来解析注释。
如需安装,运行下面命令即可。
```
shell
pip
install
typeguard http://github.com/willthefrog/docstring_parser/tarball/master
```
# 相关工具
为了方便用户配置,PaddleDection提供了一个工具 (
`tools/configure.py`
), 共支持四个子命令:
1.
`list`
: 列出当前已注册的模块,如需列出具体类别的模块,可以使用
`--category`
指定。
2.
`help`
: 显示指定模块的帮助信息,如描述,配置项,配置文件模板及命令行示例。
3.
`analyze`
: 检查配置文件中的缺少或者多余的配置项以及依赖缺失,如果给出type hint, 还可以检查配置项中错误的数据类型。非默认配置也会高亮显示。
4.
`generate`
: 根据给出的模块列表生成配置文件,默认生成完整配置,如果指定
`--minimal`
,生成最小配置,即省略所有默认配置项。例如,执行下列命令可以生成Faster R-CNN (
`ResNet`
backbone +
`FPN`
) 架构的配置文件:
```shell
python tools/configure.py generate FasterRCNN ResNet RPNHead RoIAlign BBoxAssigner BBoxHead FasterRCNNTrainFeed FasterRCNNTestFeed LearningRate OptimizerBuilder
```
如需最小配置,运行:
```shell
python tools/configure.py --minimal generate FasterRCNN BBoxHead
```
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录