1. 现象

yolov8 训练自己的数据集后,检测不到目标,现象有三个:一是在 训练后得到的 train 文件夹 中,“results.png” 中的前面几张曲线图上没有曲线;二是,验证集中的图片,没有识别结果,即 名字为 “val_batch*_pred.jpg” (* 是数字序号,根据实际情况,会有所不同) 的图片中,本来应该是显示验证集的识别结果,但是却没有识别出来,所以该有的识别框没有画出来,显示的还是验证集的原图片,同样的,此时,如果去识别测试图片,一样识别不了,结果会显示 “no detections”。

在这里插入图片描述

在这里插入图片描述

第三个现象是,训练的过程中,每个 Epoch 后,会打印结果,然后我发现,所有的结果中, box_loss、cls_loss、dfl_loss 下面的值都是 nan 。同时,报出一个警告:
lib\site-packages\torch\optim\lr_scheduler.py:139: UserWarning: Detected call of lr_scheduler.step() before optimizer.step(). In PyTorch 1.1.0 and later, you should call them in the opposite order: optimizer.step() before lr_scheduler.step(). Failure to do this will result in PyTorch skipping the first value of the learning rate schedule. See more details at https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate
warnings.warn("Detected call of lr_scheduler.step() before optimizer.step(). "
该警告的意思是:
测检到 lr_scheduler.step() 在 optimizer.step() 之前被调用了。

在这里插入图片描述

2. 解决办法

查了一些资料,找到了这个网址:
https://github.com/ultralytics/ultralytics/issues/283
里面说上面的警告可以忽略,如果要消除它,可以修改 default.yaml 中的 amp 为 False。
我在 yolov8 的源码 ultralytics\ultralytics\cfg 目录下找到了 default.yaml ,并将 amp 改为 False,重新训练,一切正常了。

在这里插入图片描述

3. 用 CPU 训练

我后面又做了这样一个测试:把 yolov8 的源码 ultralytics\ultralytics\cfg 目录下的 default.yaml 恢复默认值,然后,用 CPU 进行训练,同样的 数据集,整个过程没有任何问题(无错误 无警告),而且对测试数据测试发现,训练结果比 GPU 的训练结果要好(训练参数完全相同)。目前没弄懂为什么 CPU 和 GPU 训练时,会出现如此大的差异。之前在用 yolov5 时,也用 GPU 训练,也出现了相似的问题,最后是通过降低 torch GPU 相对应的版本,得到一个可用的训练结果,但是在训练中,仍报出了 NAN 计算结果异常。

4.说明一下我的环境

windows 10
conda: 23.1.0
python: 3.10
torch: 2.0.1+cu117 (GPU 版本)
torchvision: 0.15.2+cu117 (GPU 版本)
yolov8 是下载 源码后,在源码目录下用:" pip install -e . " 进行安装的,官网文档有说明。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐