下面是利用pytorch版本的faster-rcnn训练自己的datasets的步骤和相关的修改
代码链接:https://github.com/jwyang/faster-rcnn.pytorch
训练命令示例:
CUDA_VISIBLE_DEVICES=$GPU_ID python trainval_net.py \
--dataset pascal_voc --net res101 \
--bs $BATCH_SIZE --nw $WORKER_NUMBER \
--lr $LEARNING_RATE --lr_decay_step $DECAY_STEP \
--cuda
1、预训练模型存放位置:data/pretrained_model/
代码faster-rcnn.pytorch\lib\model\faster_rcnn\resnet.py中
self.model_path = 'data/pretrained_model/resnet101_caffe.pth'
是预训练模型存放地址;
fasterRCNN = resnet(imdb.classes, 101, pretrained=True, class_agnostic=args.class_agnostic)
pretrained=True表示训练时使用预训练模型
2、Training阶段修改:(cfg中默认roi crop)
在trainval.net种设置args.imdb_name等参数;
3、在factory.py种添加下列own-datasets的相关code,用于读取相关数据集的类文件;
4、注意在自己的数据类py脚本中修改相应的路径和类别class,注意类别一定是小写,因为在类别xml读取时都是按照小写比较的,如pascal_voc.py中:
一般voc的话路径self._devkit_path设置成了项目主目录的/data/vocdevkit+year/下,self._data_path就是/data/vocdevkit+year/voc+year/下;
5、通过将所有训练图片的format转成jpg,就不用改self._image_ext
6、pascal_voc.py中self._image_index = self._load_image_set_index()函数是读取voc相应的txt种的训练或指定测试的图片的名称,不带后缀;因此这里自己的数据集得得到这样得txt文件;
7、pascal_voc.py中self._roidb_handler = self.gt_roidb的修改,读取xml,跳过不需要的类别,可以借鉴DA_detection(strong-weak)的代码(https://github.com/VisionLearningGroup/DA_Detection)修改def _load_pascal_annotation(self, index)函数:
8、模型最终保存在output_dir = args.save_dir + "/" + args.net + "/" + args.dataset下面;默认存在model(args.save_dir)下面
9、将misc读取改成cv读取,注意rgb和bgr转换;训练时用的bgr顺序;misc读取是4通道,cv读取是3通道;misc读取时在通道减去均值出现维度不匹配问题,4通道减去3通道均值出错;
10、注意检查自己的数据集标注是否存在越界的问题,如读取时候的坐标是负数,flip时横坐标越界的问题;不然在flip时assert x2>=x1时会出错;添加get_heights()函数,得到数据的heights,用于辅助判断坐标越界问题;
11、注意sh mask.sh时sm_arch要和gpu匹配,不然cudastackerror,P100的GPU用的是sm60;
12、程序会在filter roidb时去除没有gt的图片,即训练时不需要纯负样本;