学习资源站

RT-DETR模型应用过程中的报错处理及疑问解答,涉及环境搭建、模型训练、模块改进、论文写作-

RT-DETR模型应用过程中的报错处理及疑问解答,涉及环境搭建、模型训练、模块改进、论文写作

前言

本文记录了 RT-DETR 模型的 环境搭建 模型训练 模块改进 论文写作 这一系列过程中可能发生的问题,以及大家非常关心的 论文创新性 问题,这里统一做了一个记录和解答。


一、报错处理

1. RuntimeError: CUDA out of memory.

报错提示:

RuntimeError: CUDA out of memory. Tried to allocate 58.00 MiB (GPU 0; 31.74 GiB total capacity; 30.02 GiB already allocated; 42.88 MiB free; 30.24 GiB reserved in total by PyTorch)

解决方案:

超出内存 。这是由于 batch_size 设置的过大, 超出CUDA处理能力范围 。需调小。
当然,调小后,速度就会变慢,这也就是为什么大家都用性能好的卡了。

2. OSError: [WinError 1455] 页面文件太小,无法完成操作

报错提示:

OSError: [WinError 1455] 页面文件太小,无法完成操作

解决方案:
在参数配置中, workers 指定的是工作线程数,若报以上错误,则说明本地分配的虚拟内存不足。
但不建议去调整虚拟内存,只需要将 workers 指定为 0 即可。当然 workers 越高,训练速度也会越快

3. 通道数不匹配以及完整按照专栏内容修改却还是报错

报错提示:

RuntimeError: Sizes of tensors must match except in dimension 1. Got 32 and 16 in dimension 2 (The offending index is 1)

解决方案:
此类问题多发生在修改模型yaml过程中,PAN+PFN结构中的尺寸拼接不匹配。上面就是说32和16是不匹配的。
这需要对着原本的yanl文件去检查,通道是如何传递的,原本是来自那一层,其通道数是多少,然后进行修改。

完整按照专栏内容修改却还是报错 ,此类报错信息的来自环境内的conv,module模块,而不是tasks,或者未声明类的报错,主要可能是python版本的不同。

4. 无法打印GFLOPs

在训练时,打印的信息中没有打印参数量 GFLOPs

在这里插入图片描述
解决方案:

安装 thop 库: pip install thop

5. 训练过程中,损失均为nan,mAP评价指标均为0

报错提示:

在这里插入图片描述

解决方案:

ultralytics/cfg/default.yaml 中的 amp 设置为 False

在这里插入图片描述

6. RuntimeError: Input type (torch.cuda.HalfTensor) and weight type (torch.cuda.FloatTensor) should be the same

原因及解决方法同上。

7. 安装mmcv报错

报错提示:

ERROR: Could not build wheels for mmcv, which is required to install pyproject.toml-based projects

解决方案:

使用 mim 命令安装。

  1. 首先安装 openmim : pip install -U openmim
  2. 然后安装 mmcv : mim install mmcv

8. RuntimeError: Couldn’t load custom C++ ops.

报错提示:

RuntimeError: Couldn’t load custom C++ ops. This can happen if your PyTorch and torchvision versions are incompatible, or if you had errors while compiling torchvision from source. For further information on the compatible versions, check https://github.com/pytorch/vision#installation for the compatibility matrix. Please check your PyTorch version with torch.version and your torchvision version with torchvision.version and verify if they are compatible, and if not please reinstall torchvision so that it matches your PyTorch install.

解决方案:
这是由于 PyTorch torchvision 版本冲突。
需要查询 PyTorch torchvision 的版本对应关系,然后卸载重新安装。 官方地址: https://github.com/pytorch/vision

在这里插入图片描述

在这里插入图片描述

9. NameError: name ’ XXX ’ is not defined

报错提示:

NameError: name ’ XXX ’ is not defined

解决方案:

可能的情况:

  1. 使用的模块没有正确导入 from...import...
  2. 不使用的模块没有删干净

10. IndexError: index 0 is out of bounds for dimension 0 with size 0

报错提示:

IndexError: index 0 is out of bounds for dimension 0 with size 0

解决方案:

模型文件中使用的模块未在 ultralytics/nn/tasks.py 中注册, YOLOv9 的则需要在 models/common.py 中的 parse_model 函数中注册,在此处添加模块名:

在这里插入图片描述

11. TypeError: init () missing 1 required positional argument: ‘ch’

报错提示:

TypeError: init () missing 1 required positional argument: ‘ch’

解决方案:

这个也是使用的模块未在 ultralytics/nn/tasks.py 中注册,每个模块不同,具体看我对应的模块文章。

12. 与torch相关的报错

报错提示:

此类报错没有统一的报错信息,五花八门的都有,其他模块训练没有问题,模块导入没有问题,但是有的人可以运行,有的人无法运行。且报错信息都能追溯到 torch 相关的函数调用上。例如: TypeError: meshgrid() got an unexpected keyword argument 'indexing' AttributeError: module 'torch' has no attribute 'get_autocast_gpu_dtype'

解决方案:

这是 torch 版本不同导致的,此版本内没有相关的参数,方法等。建议更新 torch 版本,注意与 torchvision 的版本对应,可参考 8

13. ModuleNotFoundError: No module named ‘pywt’

报错提示:

ModuleNotFoundError: No module named ‘pytorch_wavelets ’

在安装 pytorch_wavelets 后,运行再次报错:

ModuleNotFoundError: No module named ‘pywt’

解决方案:

pytorch_wavelets 内部函数的运行还需要其他库的支持,还需安装 pywavelets 库, pip install pywavelets

14. _pickle.UnpicklingError: STACK_GLOBAL requires str

报错提示:

_pickle.UnpicklingError: STACK_GLOBAL requires str

解决方案:

这是因为在同一个项目路径下运行了不同的数据集,将数据集文件夹下所有的 .cache 文件删除。

在这里插入图片描述

15. 新建虚拟环境报错:CondaHTTPError

问题描述

在利用conda或pip进行模块包的安装的时候,经常遇到url连接超时等错误,导致无法正常安装。此时在我利用conda创建虚拟环境 conda create -n test python=3.8 发生报错。

报错类型1

CondaHTTPError: HTTP 429 TOO MANY REQUESTS for url <https://mirrors.ustc.edu.cn/ anaconda/pkgs/free/noarch/repodata.json> Elapsed: 00:10.160513 An HTTP error occurred when trying to retrieve this URL. HTTP errors are often intermittent, and a simple retry will get you on your way. HTTPError(‘429 Client Error: Too Many Requests for url: https://mirrors.ustc.edu.cn/ anaconda/pkgs/free/noarch/repodata.json’)

报错类型2

CondaHTTPError: HTTP 000 CONNECTION FAILED for url

报错类型3

CondaValueError: Malformed version string ‘~‘: invalid character(s)


原因分析:

以上报错均可看成是由于网络连接超时导致的中断,默认的Conda源无法访问境外的官网镜像,因此访问太慢或者不能访问。


解决方案:

解决方案一:使用其他镜像源下载包

  1. 进入Anaconda Prompt终端;
  2. 输入以下命令添加通道,创建清华镜像源;
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/free/
conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes

conda config --set show_channel_urls yes 会在用户主目录下生成一个 .condarc 文件

  1. 更新conda
conda update --all

解决方案二:修改本地配置文件

若进行了以上配置后仍无法安装可尝试此方案。
找到 .condarc 文件(在C:\User\用户名文件夹\)之后,文本打开并删除原来的内容,复制粘贴如下命令:

channels:
  - defaults
show_channel_urls: true
default_channels:
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
  - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
  conda-forge: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  msys2: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  menpo: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch-lts: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  simpleitk: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

如果.condarc文件找不到,是因为没有在cmd命令中输入 conda config 命令,按照解决方案一的步骤进行,会正常生成此文件,只有第一次输入该命令之后,系统才会自动创建.condarc文件。

至此应该就可以顺利创建虚拟环境。

16. 多卡训练报错

在修改模型后,不支持多卡训练,可使用 命令行 进行训练,这里提供两种方法:

python -m torch.distributed.run --nproc_per_node 2 train.py
python -m torch.distributed.launch --nproc_per_node 2 train.py

17. 训练过程中报尺寸不匹配的错误

报错提示:

RuntimeError: Given input size: (32x128x128). Calculated output size: (32x0x1). Output size is too small.

解决方案:

ultralytics/models/yolo/detect/train.py DetectionTrainer 类中的 build_dataset 函数中的 rect=mode == 'val' 改为 rect=False

18. 推理过程中报尺寸不匹配的错误

ultralytics/engine/predictor.py 找到 pre_transform(self, im) 函数,在 LetterBox 中,将 auto 改为 False

19. RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED

AMP 设置为 True

20. …

二、疑问解答

1. pip 安装模块时下载很慢,怎么办?

使用镜像 ,例如:

pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple

将此处的 numpy 模块换成想要安装的模块就可以了,后面的 https://pypi.tuna.tsinghua.edu.cn/simple 清华镜像 ,也可以换成其他的。

https://pypi.tuna.tsinghua.edu.cn/simple 清华
https://mirrors.aliyun.com/pypi/simple 阿里云
https://pypi.mirrors.ustc.edu.cn/simple 中科大 
https://pypi.douban.com/simple 豆瓣

2. 初始训练精度较低,一直上不去怎么办?

这主要还是 数据集 的问题,要么数据集数量太少,要么质量太低无法学习到有用的信息,建议先 扩充一下数据集 然后再训练看看。

3. 模型训练配置的参数和default.yaml文件中的参数有什么关系?

ultralytics 的项目文件中均没有 train.py 文件,我们需要自己新建这个文件然后进行训练,验证,检测等(当然也可以使用命令行)。

train.py 中配置的参数会覆盖 default.yaml 中的参数,未配置的参数便会使用 default.yaml 中默认的。

4. 运行出现WARNING ⚠️ no model scale passed. Assuming scale=‘l’?

这个不用管,警告信息是没有检测到指定的模型(l) 系统设定用l开始检测,如果你就是用的L可以不用管 如果是其他的就先指定一下再跑

5. 一切都运行正常,但在测试时,测试的图片中无法检测到目标,为什么?

这也就是第二点说的,精度太低了,在加上 default.yaml 中设置的 conf 参数在目标精度低于0.25时的不显示,所以会检测不到图片。
主要还是训练精度太低了。

6. RT-DETR能直接用coco数据集吗?是否必须得转换成yolo?

不可以直接使用,需要转成 YOLO txt 格式

7.如何查看训练完模型的参数量、计算量、精度、速度等指标?

模型验证,导入模型权重,运行就会有了,具体的验证方法看对应的专栏。

例如:
在这里插入图片描述

8.文章中所改进的模块我可不可以加到其他位置?

将我改进后的模块整体替换其它模块是可以的,但也需要多测试,多实验。才能找到最佳搭配。若是只使用文章中提到的基础模块去替换自己模块中的某一层,也许会报错。

9. 每一个模块有没有推荐添加的位置?

首先,每一个模块都有其解决的问题,最佳的添加位置就是按照原论文中的方式添加。例如,原论文中提出的模块,在论文的模型中,浅层和深层使用的参数是不一致的,此时我们就也可以按照原论文中的方法,去配置我们的模型,模块,这样也许会更有效。

当然,像注意力这类若是单独加一个注意力模块,也推荐添加在骨干网络的后几层,这样能在在提取到一些语义信息后再做一些引导。

最后,还是多实验吧,也许某一个特殊的位置才是属于你的位置。

10. 模型训练的数据集大小有没有要求?

数据集当然是越多越好。
使用公开的数据集,其中的数据量都是成千上万,甚至更多的,这就不用说了。
使用自建数据集的,至少要保证数据量在1000张左右,才能保证基本的精度,少的可以做一下数据增强。

11. 发表论文需要多大的创新?

若是可以提出一个完整,全新的模块。或许一个点就可以,当然模型结构这方面也需要重新设计,提出一个新的自己的模型。
一般情况下,也需要两三个创新点再进行写、投…

12. 是否要使用预训练的权重进行训练?

首先要明白预训练权重的作用,像我们做改进的,目标一般是官方数据集中不包含的,但无论是什么目标都是由基础的纹理组成的,所以在加入预训练权重后,能够收敛的更快,精度也也许会更高。若不使用预训练权重,则需要从头训练,收敛的慢一些。是否使用还需要根据自己的需求即可。

13. 使用U版的RT-DETR和官方原版的有什么区别?

U版的RT-DETR和官方原版在模型结构上是一致的,只是U版原始的RT-DETR在训练参数设置上与一些区别,这在专栏中有一篇专门说明并修改。在U版上进行改进更加方便,做对比试验也更容易一些。在调完参数配置后,和原版是一致的。

14. …