open-mmlab:一行代码比较两个Config文件异同

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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值