用的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可以保存
最后终于正常运行!