ssd+pytorch1.2+visdrone

用的https://github.com/amdegroot/ssd.pytorch这一版本。

复现过程遇到的问题:

1、遇到CUDA error: out of memory

     gpu内存不够,用 watch -n 2 nvidia-smi 监控一下gpu使用情况,2表示的是2秒刷新一下,然后指定一下空着的卡,

用这个以下命令,在train.py中指定一下空着的文件。

import os

os.environ["CUDA_VISIBLE_DEVICES"] = "1,2,5"

2、遇到 IndexError: The shape of the mask [32, 8732] at index 0does not match the shape of the indexed tensor [279424, 1] at index 0

这是因为新版pytorch,不能用data[0]这么取数值了。按照下图说的操作过程进行修改。

此外,下面的item也要进行更改。

3、遇到StopIteration就退出循环,这个问题出现的原因是dataloader导入数据之后经过了一轮的迭代,再次导入的时候发现没有数据了,也就是iterable完成之后,触发了StopIteration,然后跳出了循环。既然再次导入的时候没有数据了,那我们就再用一个dataloader就行了。

将train.py(165行)的images, targets = next(batch_iterator)更改成:

try:

images, targets = next(batch_iterator)

except StopIteration:

batch_iterator = iter(data_loader)

images, targets = next(batch_iterator)

参考https://blog.csdn.net/dingkm666/article/details/88775428

然后,下一步换成另外的数据进行重新训练。

首先将visdrone数据集对应的txt改成voc里的xml,

文件夹存放的形式也改成对应voc07的子文件样式,所以标注文件都在一个文件夹里。另外ssd原始训练是将voc07和voc12一起加起来训练的,所以另外数据文件夹里有个空的voc12子文件夹,修改config.py和voc0712文件。

4、后来遇到索引出错,IndexError: too many indices for array

参考:https://github.com/amdegroot/ssd.pytorch/issues/224

查出对应错的文件并删除。都是标注了difficult,如果difficult标为1,说明overlap小于50%便不参加训练,也就是没有正样本目标,所以报错。最后将四个文件删除。解决了问题。

5、出现loss为nan的情况,并且降低学习率不能解决问题,还会导致服务器卡死,不能接着运行程序。

经过了一星期的查找原因,发现是原本数据有脏数据造成的,所以要检查一下数据。参考

https://blog.csdn.net/CZW199418/article/details/104611230

这里面对原始代码做了更改,原始代码并没有检查数据中是否存在xmin >= xmax or ymin >= ymax.的问题。

更改如下:

最后找出了以下几个脏数据,主要原因是用官方数据的txt文件,发现数据中有高是1的情况,在转换为VOC的Ymin和Ymax的时候,因为坐标是在0开始标的,会对Ymin,Ymax进行减1操作,最后会导致voc里的Ymin=Ymax。,

这也会引起下面的问题出现:

RuntimeError: cannot perform reduction function max on tensor with no elements because the operation

然后删除对应xml文件,和jpg图片,以及txt里的文件名。

对TXT上面的文件名删除,可以用vim命令。

1、vim 那个txt

2、输入/ 可以查找

3、回车就到了那一行

4、dd 可以删除光标所在那一行

5、:wq可以保存退出文件、:w可以保存

最后终于正常运行!

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,下面我为您介绍一下如何使用 Python、SSDPyTorch 实现目标检测。 1. 准备数据集和模型 首先,您需要准备好数据集,并使用 PyTorch 实现的 SSD 进行训练。可以使用一些开源数据集,如 COCO 数据集,或自己收集数据集。 2. 加载模型和图像 使用 PyTorch 加载训练好的模型,并将待检测的图像输入到模型中。可以使用 OpenCV 加载图像。这里需要注意,输入图像需要经过预处理,如缩放、归一化等操作。 ```python import torch import cv2 # 加载模型 model = torch.load('path/to/model.pth') model.eval() # 加载图像 image = cv2.imread('path/to/image.jpg') # 图像预处理 image = cv2.resize(image, (300, 300)) image = image.astype('float32') image = image / 255.0 image = (image - [0.485, 0.456, 0.406]) / [0.229, 0.224, 0.225] image = image.transpose((2, 0, 1)) image = torch.from_numpy(image).unsqueeze(0) ``` 3. 进行目标检测 将预处理后的图像输入到模型中,模型将会输出目标在图像中的位置和分类信息。 ```python # 目标检测 with torch.no_grad(): outputs = model(image) detections = outputs.data # 解析检测结果 for i in range(detections.size(1)): j = 0 while detections[0, i, j, 0] >= 0.6: score = detections[0, i, j, 0] label_name = 'class_name' pt = (detections[0, i, j, 1:]*300).cpu().numpy() j += 1 # 在图像上绘制检测结果 cv2.rectangle(image, (int(pt[0]), int(pt[1])), (int(pt[2]), int(pt[3])), (0, 255, 0), 2) cv2.putText(image, label_name, (int(pt[0]), int(pt[1]-10)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) ``` 4. 展示检测结果 可以使用 OpenCV 在图像上绘制检测结果,并展示出来。 ```python # 展示检测结果 cv2.imshow('image', image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 需要注意的是,这里只是一个简单的示例,实际应用中还需要针对具体情况进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值