训练网络时的报错:(YOLOV5)
**一、
AttributeError: Can‘t get attribute ‘SPPF‘ on <module ‘models.common‘ from ‘H:\yolov5-5.0\models\**
1.问题描述:
丢失SPPF这个类,model/common.py里面去找到这个SPPF的类,把它拷过来到你这个Tags5的model/common.py里面,这样你的代码就也有这个类了,还要引入一个warnings包就行了!
2.解决方法:
将SPPF这个类复制到common.py,记得把import warnings放在上面去:
import warnings
class SPPF(nn.Module):
# Spatial Pyramid Pooling - Fast (SPPF) layer for YOLOv5 by Glenn Jocher
def __init__(self, c1, c2, k=5): # equivalent to SPP(k=(5, 9, 13))
super().__init__()
c_ = c1 // 2 # hidden channels
self.cv1 = Conv(c1, c_, 1, 1)
self.cv2 = Conv(c_ * 4, c2, 1, 1)
self.m = nn.MaxPool2d(kernel_size=k, stride=1, padding=k // 2)
def forward(self, x):
x = self.cv1(x)
with warnings.catch_warnings():
warnings.simplefilter('ignore') # suppress torch 1.9.0 max_pool2d() warning
y1 = self.m(x)
y2 = self.m(y1)
return self.cv2(torch.cat([x, y1, y2, self.m(y2)], 1))
二、
RuntimeError: result type Float can’t be cast to the desired output type long int
1.问题描述:
loss.py出现问题,版本不匹配
2.问题解决
- 打开你的【utils】文件下的【loss.py】
- 按【Ctrl】+【F】打开搜索功能,输入【for i in range(self.nl)】找到下面的一行内容:
- 将红色部分用下列代码代替
anchors, shape = self.anchors[i], p[i].shape
- 更改之后如下
- 按【Ctrl】+【F】打开搜索功能,输入【indices.append】找到下面的一行内容:
- 将下面的代码替换掉上图中的红圈部分:
indices.append((b, a, gj.clamp_(0, shape[2] - 1), gi.clamp_(0, shape[3] - 1))) # image, anchor, grid
- 替换之后的效果是这样的:
- 保存刚才的两个替换操作
三、
No dashboards are active for the current data set. Probable causes
1.问题描述:
复制tensorboard网址,打不开
2.问题解决:
在终端输入时,路径采用绝对路径
tensorboard --logdir "logs所在目录\logs"(绝对路径)
四、
RuntimeError: result type Float can‘t be cast to the desired output type __int64
1.问题描述:在YOLOV5上训练自己的数据集时出现问题。新版本的torch无法自动执行此转换,旧版本torch可以。
2.问题解决:
在utils文件夹下找到loss.py文件,Ctrl + F搜所gain,找到一下代码
gain = torch.ones(7, device=targets.device)
将其修改为:
gain = torch.ones(7, device=targets.device).long()
五、
1.问题描述:UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xb2 in position 6:invalidstartbyte
2.问题解决:
在提示报错的torch_utils.py文件58行,将原来的
return subprocess.check_output(s, shell=True, stderr=subprocess.STDOUT).decode()[:-1]
decode()改成decode(encoding = ‘gbk’)
return subprocess.check_output(s, shell=True, stderr=subprocess.STDOUT).decode(encoding = 'gbk')[:-1]