训练yolov7时遇到的几个问题及解决办法记录在此,再遇到问题随时补充
yolov7的github地址:
GitHub - WongKinYiu/yolov7 at v0.1
1.运行train.py后,显示读取到train和val图片后,一直卡住,既不报错也没任何反应
我是在自己的笔记本上训练,没有用服务器,GPU是RTX3060,win系统。解决办法是把--works参数默认值改成0(原本是8)。据说win系统不改这个参数会出现错误,至少我没有报错,但可能是电脑本身算力不够导致的。
2.from utils.google_utils import XX显示找不到google_utils
还有几个同类问题,都是from utils.XX 标红。错误原因在于项目打开不对。我之前用过yolov5,yolov5是在“yolov5-7.0”这个文件夹外单独建一个datasets文件夹,因此打开项目时会习惯于打开yolov5-7.0的上一级目录。但yolov7不是这样,直接将数据放在yolov7-1.0文件夹内就可以,打开项目时也直接打开yolov7-1.0文件夹
3.RuntimeError:result type Float can't be cast to the desired output type __int64
RuntimeError: result type Float can't be cast to the desired output type long int
这个问题据说是在因为torch的版本问题,github上yolov7#35号问题有解答。我目前是python3.9+CUDA11.8+torch1.13,好像torch1.12就没有这个问题了,可以选择重装换版本。或者进入loss.py文件,CTRL+F,搜索gain,找到
gain = torch.ones(7, device=targets.device)
在后面添加.long,改成
gain = torch.ones(7, device=targets.device).long()
注意loss.py里有不止一句这个代码,都要改掉
4.RuntimeError:indices should be either on cpu or on the same device as the indexed tensor (cpu)
原因应该是torch调用gpu的问题,从解决办法上看,loss.py好像并没有做torch调用gpu的工作,解决办法就是把这个工作补上
打开loss.py文件,在638行build_targets函数内的第一行添加
device = targets.device
将685行的代码
from_which_layer.append((torch.ones(size=(len(b),)) * i)
添加gpu的用法
from_which_layer.append((torch.ones(size=(len(b),)) * i).to(torch.device(device)))
再在757行添加gpu的用法
fg_mask_inboxes = fg_mask_inboxes.to(torch.device(device))