使用URPC少量数据集在DiffusionDet上训练
目录
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,问题就会解决
开始愉快的训练之旅~
更多推荐
所有评论(0)