使用DiffusionDet在mot数据集上训练

  1. 数据集处理

https://github.com/facebookresearch/detectron2/detectron2/data/datasets/builtin.py中,可以看到,detectron2中可以使用哪些数据集格式,比如coco,pascal voc等。

本着方便处理的原则,使用pascal voc的数据格式。(mot17Det数据转换代码见:将MOT17-Det数据集转成VOC格式 - 知乎 (zhihu.com),十分感谢!有一点问题,就是标注转换为voc格式部分中,内部循环处即处理每个部分数据下的标注结果时,for i in range(1, max_index)应当改为for i in range(1, max_index + 1),否则最后一个标注文件不会转换)——需要注意,类别使用aeroplane,后文会说。

在转换代码的基础上,原来的train数据集划分为train和val两部分,test数据集没有标注,无法直接测试。

  1. 构建数据集目录

使用DiffusionDet中指导,使用下列命令构建软链接:

ln -s /path_to_mot_dataset/Annotations datasets/VOC2007/Annotations #注意使用pasacal voc格式,VOC2007可以为VOC2012不可以是其他的,且前面是datasets,这些都可以在detectron2源码中查到

最后,在DiffusionDet中的建立的软链接为:

数据存放的文件结构为:

  1. 代码处理

  • config:直接copy diffdet.coco.res50.yaml为diffdet.mot17det.res50.yaml,修改里面内容。

一定要修改的:

和1.中提到psacal voc格式有关,选择其中的name

不一定修改的:

减少训练时间,450000修改为45000

cuda显存不够的时候修改每个batch的图片数(本人服务器只有一张显卡,显存也不够呜呜):

  • 可能要改的(不确定,感觉可以不用改了):

train_net.py中的 build_evaluator函数应该修改:

框中部分改成PascalVOCDetectionEvaluator,使用见detectron2/detectron2/evaluation/pascal_voc_evaluation.py。

不改的话,使用COCOEvaluator评估,在训练的时候,结果格式如下:

经过个人查看,在/detectron2/data/datasets/coco.py和/detectron2/data/datasets/pascal_voc.py中,对coco数据集和pascal_voc数据集处理后的数据格式是一样的(貌似没啥用)哈哈哈哈

Important!在detectron2/evaluation/coco_evaluation.py中,有下面一段注释:

也就是说,不是COCO数据集没有关系,只有是detectron2的标注数据集就可以转换为coco数据集的标注格式,如下图所示。

  1. 问题

  • cuda error: device-side assert triggered

感谢(5条消息) Assertion `index >= -sizes[i] && index < sizes[i] && “index out of bounds“` failed_亦轻尘的博客-CSDN博客

在train_net.py中使用:

import os
os.environ['CUDA_LAUNCH_BLOCKING'] = '1'

再次运行,就可以找到报错的位置了

在报错的位置,使用print,显示相关信息

print结果如下,明显越界:

联系这个变量名的意义,估计是class类别的index越界,mot只有person类别,而pascal voc有多个class,并且person不是第一个。查看detectron2/detectron2/data/datasets/pascal_voc.py

查看,刚好person的index为14。为了让训练继续,将数据集中xml的class从person改为aeroplane。

  • 训练时间长达数十天——吓!

隐约记得detectron2框架下,没有明确指定epoch。epoch = MAX_ITER * BATCH_SIZE / TOTAL_NUM_IMAGES,简单计算了一下,我的训练epoch应该是900多。。。。所以,才有了3中修改config文件中的MAX_ITER。

MAX_ITER为原来的10分之一后,训练一天不到了。

PS:我使用的训练命令python train_net.py --num-gpus 1 --config-file configs/diffdet.mot17det.res50.yaml

(有什么意见,欢迎提出哈~本文纯本人训练时经历所得,其中关于类别什么的修改,如果自己下载detectron2源码则可以直接在源码修改,不需要使用第一个类别)

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值