数据集处理
在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数据集没有标注,无法直接测试。
构建数据集目录
使用DiffusionDet中指导,使用下列命令构建软链接:
ln -s /path_to_mot_dataset/Annotations datasets/VOC2007/Annotations #注意使用pasacal voc格式,VOC2007可以为VOC2012不可以是其他的,且前面是datasets,这些都可以在detectron2源码中查到
最后,在DiffusionDet中的建立的软链接为:
数据存放的文件结构为:
代码处理
一定要修改的:
和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数据集的标注格式,如下图所示。
问题
感谢(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源码则可以直接在源码修改,不需要使用第一个类别)