open-mmlab:一行代码比较两个Config文件异同
1 背景
在使用open-mmlab框架做实验时,往往需要对两个相似的配置文件作比较,肉眼比较难免会遗漏,因此需要一个趁手的小工具提升实验效率。
2 效果
一行代码实现两个Config文件比较。
Diff(cfg_path, cfg2_path)
输出:
其中,
- error:键相同,值不同
- cfg_miss: cfg相对于cfg2丢失的键
- cfg2_miss: cfg2相对于cfg丢失的键
3 实现
from mmcv import Config
from mmcv import ConfigDict
import copy
class CoreDiff:
def __init__(self):
self.res = ConfigDict(
error=list(),
miss=list())
def get_diff(self, cfg, cfg2, last_k=''):
self.res.error.clear()
self.res.miss.clear()
self._core_diff(cfg, cfg2, last_k)
return self.res
def _core_diff(self, cfg, cfg2, last_k=''):
assert isinstance(cfg, ConfigDict) and isinstance(cfg2, ConfigDict)
if cfg != cfg2:
for k, v in cfg.items():
if k not in cfg2.keys():
if last_k + k not in self.res.miss:
self.res.miss.append(last_k + k)
else:
if v != cfg2.get(k):
if isinstance(cfg.get(k), ConfigDict) and isinstance(cfg2.get(k), ConfigDict):
self._core_diff(cfg.get(k), cfg2.get(k), last_k=last_k+k+'.')
else:
if last_k+k not in self.res.error:
self.res.error.append(last_k+k)
class Diff:
'''
try: Diff(cfg_path, cfg2_path)
'''
def __init__(self, cfg_path, cfg2_path):
self.cfg_path = cfg_path
self.cfg2_path = cfg2_path
self.res = self.pipeline()
print(self.res.pretty_text)
def init(self):
cfg = Config.fromfile(self.cfg_path)
cfg2 = Config.fromfile(self.cfg2_path)
if isinstance(cfg, Config):
cfg = cfg._cfg_dict
if isinstance(cfg2, Config):
cfg2 = cfg2._cfg_dict
return cfg, cfg2
def pipeline(self):
cfg, cfg2 = self.init()
core_diff = CoreDiff()
diff_base_cfg = copy.deepcopy(core_diff.get_diff(cfg, cfg2))
diff_base_cfg2 = copy.deepcopy(core_diff.get_diff(cfg2, cfg))
assert diff_base_cfg.error == diff_base_cfg2.error
res = ConfigDict(
error = diff_base_cfg.error,
cfg_miss = diff_base_cfg2.miss,
cfg2_miss = diff_base_cfg.miss)
res = Config(res)
return res