mmdetection 报错 AttributeError: 'NoneType' object has no attribute 'get'

使用mmdetection训练模型时,报错误:

Traceback (most recent call last):
  File "/home/omnisky/disk14/team/linzixuan/Project/aipilot/tools/train.py", line 136, in <module>
    main()
  File "/home/omnisky/disk14/team/linzixuan/Project/aipilot/tools/train.py", line 125, in main
    runner = Runner.from_cfg(cfg)
  File "/home/omnisky/anaconda3/envs/openmmlab/lib/python3.8/site-packages/mmengine/runner/runner.py", line 443, in from_cfg
    runner = cls(
  File "/home/omnisky/anaconda3/envs/openmmlab/lib/python3.8/site-packages/mmengine/runner/runner.py", line 353, in __init__
    self.setup_env(env_cfg)
  File "/home/omnisky/anaconda3/envs/openmmlab/lib/python3.8/site-packages/mmengine/runner/runner.py", line 647, in setup_env
    if env_cfg.get('cudnn_benchmark'):
AttributeError: 'NoneType' object has no attribute 'get'

如何解决

加个判断,如果env_cfg不是空,再执行这个get语句应该就好了

这个错误是尝试访问一个 NoneType 对象的属性 get() 引起的。NoneType 是 Python 中表示 None 的类型,通常表示一个未知或空值。get() 方法是用来获取对象的默认值,如果对象没有默认值,则返回 None。
可能有一个变量被设为 None,并且正在尝试访问它的属性。可以使用条件语句来检查变量是否为 None,并在需要时处理它。

obj = None
print(obj.get())

改为


if obj is not None:
    print(obj.get())

这将确保在尝试访问 obj 的属性之前对其进行检查,并避免出现 AttributeError。

img


参考
https://wenku.csdn.net/answer/02431696b8f44688b1f8a64ec86a46f6

env_cfg值为None,就会出现这种情况,需要看下env_cfg为什么为None,如果为None为正常现象,那么就要加上判断的逻辑,如果env_cfg不为None,再调用get方法

if env_cfg is not None:
    env_cfg.get('cudnn_benchmark')


```

这种错误通常是由于配置文件中某些字段没有正确设置导致的。在你的训练脚本/home/omnisky/disk14/team/linzixuan/Project/aipilot/tools/train.py中,第136行是调用main()函数,该函数在第125行调用Runner.from_cfg(cfg)创建一个Runner实例。

出现错误的原因很可能是你的配置文件cfg中的env_cfg字段是None,没有被正确设置。在配置文件中,env_cfg通常用于配置环境相关的选项,如CUDA和cuDNN的设置。

建议你检查配置文件中的env_cfg部分是否正确设置了,并确保其包含了cudnn_benchmark字段。你可以检查并确保该字段是一个字典类型,并且有正确的键值对。例如:

env_cfg = {
    'type': '...your_environment_type...',
    'cudnn_benchmark': True,  # 或者 False,取决于你的需求
    ...
    # 其他环境配置字段
    ...
}

如果配置文件中确实包含了env_cfg字段,并且出现了以上错误,那可能是由于在加载配置文件时出现了问题。你可以尝试检查配置文件路径是否正确,确保能够正确加载配置文件。

runner = Runner.from_cfg(cfg)

这句代码报错的空指针,要么cfg是空的,要么Runnser里面是空的,所以在这里debug一下打印一下这个地方

问题点: env_cfg为None,导致cudnn_benchmark获取配置信息失败.
分析思路:大概率是版本差异导致的遗留问题.
到官方网站看了版本变化的内容,验证了这个想法:mmdetection算法库的执行入口从 MMCV 迁移到 MMEngine.
这个改动不可谓不大.

基于 MMEngine 执行器的启动脚本不仅简化了 tools/train.py 的代码,甚至可以直接删除 apis/train.py,极大程度的简化了训练启动脚本。
MMEngine 重构前后,配置文件和训练启动脚本的区别,详情请点开链接查看.

https://mmengine.readthedocs.io/zh_CN/latest/migration/runner.html#

MMEngine 配置

        env_cfg = dict(dist_cfg=dict(backend='nccl'))

报错 AttributeError: 'NoneType' object has no attribute 'get'原因以及解决方法
意思是这个对象是空对象None,因此也就没有get属性。
https://wenku.csdn.net/answer/02431696b8f44688b1f8a64ec86a46f6

'NoneType' object has no attribute 'get这种是常见的空值错误,发生的原因是使用到的变量或者对象的值为空,即None,此时使用一个空的变量或者对象去调用方法是会报错这个错误的。一般是由于你没有初始化这个相应的变量或者对象导致为空了,检查下代码或者调试下代码,找到这个变量或对象初始化的地方,看下是否有问题。

检查一下,大概率是出现空值导致的