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对于这种情况也是无能为力的,可能结果就是只能检测一个目标了,不过这种密集检测的问题本就是这个领域仍未解决的难题