2021SC@SDUSC
CenterNet训练自己的数据集(接上文)
注意这里json文件的命名要通过datasets/pascal.py中第44到48行的内容确定的。
self.data_dir = os.path.join(data_dir, 'voc') self.img_dir = os.path.join(self.data_dir, 'images') _ann_name = {'train': 'trainval0712', 'val': 'test2007'} self.annot_path = os.path.join(self.data_dir, 'annotations', 'pascal_%s.json' % _ann_name[split])
为了方便命名对这些字段进行了修改:
self.data_dir = os.path.join(data_dir, 'voc') # ./data/voc self.img_dir = os.path.join(self.data_dir, 'images') # ./data/voc/images _ann_name = {'train': 'train2020', 'val': 'test2020'} # 意思是需要json格式数据集 self.annot_path = os.path.join( self.data_dir, 'annotations', 'pascal_%s.json' % _ann_name[split])
所以要求json的命名可以按照以下格式准备:
# ./data/voc/annotations # - pascal_train2020 # - pascal_test2020
数据集总体格式为:
- data - voc - annotations - pascal_train2020.json - pascal_test2020.json - images - *.jpg - VOCdevkit(这个文件夹主要是用于测评) - VOC2007 - Annotations - *.xml - JPEGImages - *.jpg - ImageSets - Main - train.txt - val.txt - trainval.txt - test.txt
2.3 其他
在datasets/pascal.py中21-22行,标准差和方差最好替换为自己的数据集的标准差和方差。
VOC_MEAN = [0.485, 0.456, 0.406] VOC_STD = [0.229, 0.224, 0.225]
训练和测试
训练命令
训练命令比较多,可以写一个shell脚本来完成。
python train.py --log_name pascal_resdcn18_384_dp \ --dataset pascal \ --arch resdcn_18 \ --img_size 384 \ --lr 1.25e-4 \ --lr_step 45,60 \ --batch_size 32 \ --num_epochs 70 \ --num_workers 10
log name代表记录的日志的名称。
dataset设置pascal代表使用的是pascal voc格式。
arch代表选择的backbone的类型,有以下几种:
large_hourglass small_hourglass resdcn_18 resdcn_34 resdcn_50 resdcn_101 resdcn_152
img size控制图片长和宽。
lr和lr_step控制学习率大小及变化。
batch size是一个批次处理的图片个数。
num epochs代表学习数据集的总次数。
num workers代表开启多少个线程加载数据集。
3.2 测试命令
测试命令很简单,需要注意的是img size要和训练的时候设置的一致。
python test.py --log_name pascal_resdcn18_384_dp \ --dataset pascal \ --arch resdcn_18 \ --img_size 384 flip test属于TTA(Test Time Augmentation),可以一定程度上提高mAP。 # flip test python test.py --log_name pascal_resdcn18_384_dp \ --dataset pascal \ --arch resdcn_18 \ --img_size 384 \ --test_flip
这种方法将检测,姿态估计,甚至分割都可以统一起来,做法十分优雅。不过CenterNet仍有缺点,例如在图像中,同一个类别中的某些物体的GT中心点,在下采样时会挤到一块,也就是两个物体在GT中的中心点重叠了,CenterNet对于这种情况也是无能为力的,可能结果就是只能检测一个目标了,不过这种密集检测的问题本就是这个领域仍未解决的难题