SSD验证自己的数据集(Pytorch)问题总结!!

训练好自己的数据集后,在运行eval.py时遇到了一些问题,现已解决。问题及解决方法如下:

1.RuntimeError: Legacy autograd function with non-static forward method is deprecated. Please use new-style autograd function with static forward method.

这个问题在这篇文章【调试】错误 RuntimeError: Legacy autograd function with non-static forward method is deprecated._y = net(xx)-CSDN博客里介绍的比较详细,主要是因为Detect类继承自Function类,在pytorch1.3及以后的版本需要规定forward方法为静态方法,所以在pytorch1.3以上的版本执行出错。为了避免重装新的pytorch版本,对代码进行了相应修改。文章中介绍的比较详细,且改正有效。

但是代码并不像文章中那样能够运行成功,而是遇到了下面这个问题⬇

2.UserWarning: An output with one or more elements was resized since it had shape [125], which does not match the required output shape [120]. 

问题出在box_utils.py中的

torch.index_select(x1, 0, idx, out=xx1)
torch.index_select(y1, 0, idx, out=yy1)
torch.index_select(x2, 0, idx, out=xx2)
torch.index_select(y2, 0, idx, out=yy2)

torch.index_select(input, dim, index, out=None)函数是PyTorch中的一个函数,用于在指定维度上选取指定索引位置的元素。其中,input是输入的Tensor,dim是要选取的维度,index是要选取的索引,out是输出的Tensor,可选参数。如果out没有被指定,那么函数会新建一个Tensor来存储结果。在这个例子中,torch.index_select(x1, 0, idx, out=xx1)的作用是在x1的第0维上选取idx中指定的索引位置的元素,并将结果存储在xx1中。

将其修改为:

# torch.index_select(x1, 0, idx, out=xx1)
# torch.index_select(y1, 0, idx, out=yy1)
# torch.index_select(x2, 0, idx, out=xx2)
# torch.index_select(y2, 0, idx, out=yy2)
xx1 = torch.index_select(x1, 0, idx)
yy1 = torch.index_select(y1, 0, idx)
xx2 = torch.index_select(x2, 0, idx)
yy2 = torch.index_select(y2, 0, idx)

问题解决。我猜测是因为该方法在新版本的pytorch中已经不再能够调整输出的大小,导致形状与所需输出的形状不匹配。如果不指定out,则会新建一个Tensor来存储结果,这样再赋值给xx1、yy1、xx2、yy2就不会再报错了。

3.FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'

调试中发现是文件路径问题,打印以下两个文件路径,神奇的发现一个可以获取到路径一个获取不到

annopath = os.path.join(args.fire_root,  'Annotations', '%s.xml')
imgsetpath = os.path.join(args.fire_root, 'ImageSets', 'Main', '{:s}.txt')
print(imgsetpath.format('test')) #输出test.txt
print(annopath) #输出整个路径

原因可能是{:s}.txt导致路径无法拼接出来,将该行代码改为:

imgsetpath = os.path.join(args.fire_root, 'ImageSets', 'Main') + os.sep + '{:s}.txt'

人为引入一个路径分隔符,此时能够输出完整的路径了

4.AttributeError: module 'numpy' has no attribute 'bool'.

方法一:降低numpy版本

方法二:将np.bool改为np.bool_

difficult = np.array([x['difficult'] for x in R]).astype(np.bool_)

5.RuntimeWarning: invalid value encountered in divide
  rec = tp / float(npos)

这是由于在计算时可能出现了分母为0的情况,使用np.seterr()函数

np.seterr(divide="ignore", invalid="ignore")

6.DeprecationWarning: elementwise comparison failed; this will raise an error in the future.   if dets == []: 

将if dets == []:修改为if len(dets) == 0:

再次感谢评论区友友的热情帮助♥♥♥

7.当只有一个类别(fire)时发现输出文件如下图所示

 在fire.py中修改

#FIRE_CLASSES = ('fire')
FIRE_CLASSES = ('fire',)

在eval.py中修改

# from data import FIRE_CLASSES as labelmap
from data import FIRE_CLASSES
labelmap = list(FIRE_CLASSES)

这样输出的就为一类了

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
您好!对于使用SSD(Single Shot MultiBox Detector)训练自己的数据集,您可以按照以下步骤进行操作: 1. 数据集准备:收集并标注您自己的数据集,确保每个样本都有正确的边界框标注和相应的类别标签。您可以使用标注工具,如LabelImg,进行标注。 2. 数据集格式转换:将数据集转换为SSD所需的格式。SSD使用Pascal VOC或COCO等标准格式。您可以使用数据转换工具,如convert2ssd.py脚本,将数据集转换为SSD可接受的格式。 3. 配置网络模型:根据您的需求和数据集的类别数,选择合适的SSD网络模型。您可以在网络模型配置文件中进行相关设置,如设置输入图像大小、锚框尺寸和比例等。 4. 数据集划分:将数据集划分为训练集和验证集。通常,80%的数据用于训练,20%的数据用于验证。 5. 训练模型:使用标注好的数据集进行模型训练。您可以使用深度学习框架,如TensorFlow或PyTorch,加载SSD网络模型,并结合优化算法(如随机梯度下降)进行模型训练。 6. 模型评估和调优:在训练过程中,您可以定期评估模型在验证集上的性能,并进行相应的调优,如调整学习率、增加训练轮次等。 7. 模型推理:在完成模型训练后,您可以使用该模型进行目标检测任务。通过将输入图像传入SSD模型,您可以获取检测到的目标边界框和对应的类别标签。 请注意,这只是一个基本的概述,具体的实现细节可能因您使用的深度学习框架和数据集格式而有所不同。同时,由于SSD算法较为复杂,可能需要一定的计算资源和时间来完成训练过程。祝您成功训练自己的SSD模型!如果您有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值