1.数据集准备

1.1建立自己的数据集

为了快速验证训练可行,我只选10张图片参与训练过程(5张train,4张value,1张test)URPC标注存储为XML,为了方便操作,我选择PascalVOC数据格式来训练(detectron2能处理COCO、PascalVOC等等格式,具体还支持哪些数据格式可以参考detectron2的源码)

1.1.1接下来建议在本地将数据集准备好

按下图新建几个文件夹

-VOC2007
	-Annotations
		-[放入打好标签的XML文件]
	-ImageSets
		-Main
			-test.txt
			-train.txt
			-val.txt
	-JPEGImages
		-[放入数据集图片]

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1.2将数据集部署到服务器

按照格式建立好打成ZIP格式上传至服务器放在DiffusionDet-main/datasets路径下然后解压
在这里插入图片描述

2.准备预训练模型

https://github.com/ShoufaChen/DiffusionDet
我这里选择的是COCO-Res50
在这里插入图片描述
并把它放到DiffusionDet-Main/model(自己建的)路径下
在这里插入图片描述

3.修改配置文件

打开DiffusionDet-main/configs/下的diffdet.coco.res50.yaml
在这里插入图片描述
修改三处红色框的内容:
WEIGHTS:代表刚才下载模型的路径;
NUM CLASSES:你要检测目标的种类,我是5种;
MAX_ITER:最大迭代次数(我为了快速训练给调小了,原来应该是45000轮)

4.修改PascalVOC.py文件(可选)

因为我的检测环境在水下,VOC数据集里应该是没有水下的类别,所以我要修改一下Class_name

PascalVOC.py路径参考/home/chain/ysy/detectron2/detectron2/data/datasets/
大约在line17左右的位置找到如下内容

# fmt: off
CLASS_NAMES = (
    "scallop", "holothurian", "waterweeds", "starfish", "echinus"
)
# fmt: on

把里面的内容换成你自己需要的

5.尝试运行一次

在DiffusionDet-Main路径下运行nohup python train_net.py --config-file configs/diffdet.coco.res50.yaml &

查看是否有错误
如果没有错误再输入tail -f nohup.out跟踪训练进程

6.我遇到的错误总结

问题1:

AttributeError: module 'numpy' has no attribute 'str'.
`np.str` was a deprecated alias for the builtin `str`. To avoid this error in existing code, use `str` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.str_` here.
The aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at

问题原因:

这是由于当前的numpy版本已经没有str接口了,原因还是因为detectron2好久不更新了,但numpy不断更新,可能把一些接口给删掉了

解决方法:

降低numpy版本
输入pip uninstall numpy卸载高版本numpy
输入pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy--1.20.1安装1.20.1版本numpy

我尝试过1.20.1版本,可行,能解决问题

问题2:

出现out of memory

问题原因 :

爆显存了

解决方法:

修改DiffusionDet-main/configs/Base-DiffusionDet.yaml修改DiffusionDet-main/configs/Base-DiffusionDet.yaml中的
在这里插入图片描述

问题3:

 File "/opt/conda/lib/python3.8/site-packages/detectron2/data/datasets/pascal_voc.py", line 80, in load_voc_instances
    {"category_id": class_names.index(cls), "bbox": bbox, "bbox_mode": BoxMode.XYXY_ABS}
ValueError: tuple.index(x): x not in tuple

问题原因:

数据类型不一致

解决方法:

修改:detectron2/data/datasets/pascal_voc.py
将CLASS_NAMES改为正确的类别即可。

问题4:

在这里插入图片描述

问题原因:

这个问题比较麻烦,我当时处理的时候检查了Cuda的版本和工作状态但都没问题,后来把问题定为在“超出索引范围”上,通俗点说,就是训练时系统从上到下扫你数据集的时候发现class_name超出了PascalVOC数据集中的class_name的范围

解决方法:

根据报错找到loss.py文件第340行
在这里插入图片描述
问题就出现在这里,于是我自己打log检查一下
在这里插入图片描述

重新运行检查一下
在这里插入图片描述
我这里是因为修改好了,所以tensor并没有超出5、但如果报这个错通常都是超出范围了。
于是我们还是需要找到pascal.py文件
在这里插入图片描述
看好你所需要检测的类有没有超出范围,比如假如torch.size为4,我的“echinus”在5,我就需要把它调到前面,或者把torch.size调成5,问题就会解决

开始愉快的训练之旅~

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐