优势:
- 用户可以用一个config控制整个pipeline, 不用考虑类的具体实现和代码地址。
- 抽象一些Registry, 比如模型可以抽象为: backbone, neck, head, output_module, loss, target, decoder。代码可读性更强。
- 扩展方便, 用户只需通过一个Registry的装饰器即可添加新的类。
劣势:
- config中不能进行代码补全, 不符合python的编程习惯。
- 写Registry的时候, 容易出现重名冲突问题。比如resize这个transform, 检测有, 分割也有, 解决的办法就是添加prefix。
- 对第三方库的依赖较重, 注册构建需要import才能添加, 正常的import时需要安装对应的第三方库, 但用户不一定用到某个Registry。
举例:
try:
import xxx
import yyy
from .data import *
except Exception:
pass
这个时候需要在Registry写一个warning说明, 表明可能是一些依赖包没有安装,比如xxx包没有安装。
config的优势:
- 不用import, 只传type和参数即可。简单易用, 找import就比较难。
- config和代码解耦和, 更新类的实现对config影响很小。
- 可以延迟初始化, 避免初始化等待时间过长。(pipeline执行过程, 只按需进行初始化)