# 一、本文介绍

本文为专栏内读者和我个人在训练 YOLOv8 时遇到的各种错误解决方案,你遇到的问题本文基本上都能够解决。

# 二、 报错问题

# 以下为两个重要库的版本,大家可以对应下载,使用教程我会更新,时间还没来得及大家可以先看视频使用。

项目环境:

python == 3.9.7

pytorch == 1.12.1

timm == 0.9.12

mmcv-full == 1.6.2


# (1) 训练过程中 loss 出现 Nan 值.

可以尝试关闭 AMP 混合精度训练,如何关闭 amp 呢找到如下文件’ultralytics/cfg/default.yaml’,其中有一个参数是

amp: False # (bool) Automatic Mixed Precision (AMP) training, choices=[True, False], True runs AMP check

我们将其设置为 False 即可,默认时为 True。

.

# (2) 多卡训练问题,修改模型以后不能支持多卡训练可以尝试下面的两行命令行操作,两个是不同的操作,是代表不同的版本现尝试第一个不行用第二个

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

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


# (3) 针对运行过程中的一些报错解决

1. 如果训练的过程中验证报错了 (主要是一些形状不匹配的错误这是因为验证集的一些特殊图片导致)

就是有这种训练第一个 epochs 完成后开始验证的时候报错,下面的方法基本百分之九十都能够解决。

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

2. 推理的时候运行 detect.py 文件报了形状不匹配的错误

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

3. 训练的过程中报错类型不匹配的问题

找到’ultralytics/engine/validator.py’文件找到 ‘class BaseValidator:’ 然后在其’__call__' 中

self.args.half = self.device.type != ‘cpu’  # force FP16 val during training 的一行代码下面加上 self.args.half = False


# (4) 针对 yaml 文件中的 nc 修改

不用修改,模型会自动根据你数据集的配置文件获取。

这也是模型打印两次的区别,第一次打印出来的就是你选择模型的 yaml 文件结构,第二次打印的就是替换了你数据集的 yaml 文件,模型使用的是第二种。


# (5) 针对环境的问题

环境的问题我实在解决不过来,所以大家可以自行在网上搜索解决方案。


# (6) 训练过程中不打印 GFLOpS

计算的 GFLOPs 计算异常不打印,所以需要额外修改一处, 我们找到如下文件’ultralytics/utils/torch_utils.py’文件内有如下的代码按照如下的图片进行修改,大家看好函数就行,其中红框的 640 可能和你的不一样, 然后用我给的代码替换掉整个代码即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
def get_flops(model, imgsz=640):
"""Return a YOLO model's FLOPs."""
try:
model = de_parallel(model)
p = next(model.parameters())
# stride = max(int(model.stride.max()), 32) if hasattr(model, 'stride') else 32 # max stride
stride = 640
im = torch.empty((1, 3, stride, stride), device=p.device) # input image in BCHW format
flops = thop.profile(deepcopy(model), inputs=[im], verbose=False)[0] / 1E9 * 2 if thop else 0 # stride GFLOPs
imgsz = imgsz if isinstance(imgsz, list) else [imgsz, imgsz] # expand if int/float
return flops * imgsz[0] / stride * imgsz[1] / stride # 640x640 GFLOPs
except Exception:
return 0

# (7) mmcv 安装的解决方法

有的读者 mmcv-full 会安装失败是因为自身系统的编译工具有问题,也有可能是环境之间安装的有冲突 推荐大家离线安装的形式,下面的地址中大家可以找找自己的版本,下载到本地进行安装。 https://download.openmmlab.com/mmcv/dist/cu111/torch1.8.0/index.html https://download.openmmlab.com/mmcv/dist/index.html

更新于 阅读次数