Faster-RCNN+ZF用自己的数据集训练模型(Python版本)
Faster-RCNN+ZF用自己的数据集训练模型(Python版本)
1 环境准备
安装 Caffe 和 pycaffe,出门左转可看博主的安装记录,主要是针对 Makefile.config 的修改
在本博主安装时并未开启 USE_CUDNN
2 py-faster-rcnn下载与安装
下载
git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git
编译 Cython 模块
cd py-faster-rcnn/lib
make
编译 Caffe-fast-rcnn and pycaffe
cd $FRCN_ROOT/caffe-fast-rcnn
make -j8 && make pycaffe
下载模型运行 demo.py
./data/scripts/fetch_faster_rcnn_models.sh # Ubuntu下载很慢
./tools/demo.py
下载 VOC 数据集并运行默认训练程序
# 切换路径
cd data/
# 下载数据集
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar
# 解压数据集
tar xvf VOCtrainval_06-Nov-2007.tar
tar xvf VOCtest_06-Nov-2007.tar
tar xvf VOCdevkit_08-Jun-2007.tar
# 将 VOCdevkit 文件夹名称 修改为 VOCdevkit2007
# 下载预训练模型并解压到 data 文件夹下
./data/scripts/fetch_imagenet_models.sh
# 运行训练脚本
cd $FRCN_ROOT
./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZF pascal_voc
# 若能完美运行,说明安装成功,即可进行下一步了
3 训练自己的数据集
数据集替换
将自己制作的VOC数据集替换掉 VOCdevkit2007 文件夹内的 Annotations、ImageSets、JPEGImages
网络配置文件修改
# 切换到该路径下
cd py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt/
(1)修改 stage1_fast_rcnn_train.pt(共3处)
layer {
name: 'data'
type: 'Python'
top: 'data'
top: 'rois'
top: 'labels'
top: 'bbox_targets'
top: 'bbox_inside_weights'
top: 'bbox_outside_weights'
python_param {
module: 'roi_data_layer.layer'
layer: 'RoIDataLayer'
param_str: "'num_classes': 2" #按训练集类别改,该值为类别数+1
}
}
layer {
name: "cls_score"
type: "InnerProduct"
bottom: "fc7"
top: "cls_score"
param { lr_mult: 1.0 }
param { lr_mult: 2.0 }
inner_product_param {
num_output: 2 #按训练集类别改,该值为类别数+1
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "bbox_pred"
type: "InnerProduct"
bottom: "fc7"
top: "bbox_pred"
param { lr_mult: 1.0 }
param { lr_mult: 2.0 }
inner_product_param {
num_output: 8 #按训练集类别改,该值为(类别数+1)*4
weight_filler {
type: "gaussian"
std: 0.001
}
bias_filler {
type: "constant"
value: 0
}
}
}
(2)修改 stage1_rpn_train.pt(共1处)
layer {
name: 'input-data'
type: 'Python'
top: 'data'
top: 'im_info'
top: 'gt_boxes'
python_param {
module: 'roi_data_layer.layer'
layer: 'RoIDataLayer'
param_str: "'num_classes': 2" #按训练集类别改,该值为类别数+1
}
}
(3)修改 stage2_fast_rcnn_train.pt(共3处),与(1)相同
(4)修改 stage2_rpn_train.pt(共1处),与(2)相同
(5)修改 faster_rcnn_test.pt(共2处),无“data”层
layer {
name: "cls_score"
type: "InnerProduct"
bottom: "fc7"
top: "cls_score"
inner_product_param {
num_output: 2 #按训练集类别改,该值为类别数+1
}
}
layer {
name: "bbox_pred"
type: "InnerProduct"
bottom: "fc7"
top: "bbox_pred"
inner_product_param {
num_output: 8 #按训练集类别改,该值为(类别数+1)*4
}
}
标签文件修改
# 切换到以下路径
cd py-faster-rcnn/lib/datasets/
(6)修改 pascal_voc.py 文件
class pascal_voc(imdb):
def __init__(self, image_set, year, devkit_path=None):
imdb.__init__(self, 'voc_' + year + '_' + image_set)
self._year = year
self._image_set = image_set
self._devkit_path = self._get_default_path() if devkit_path is None \
else devkit_path
self._data_path = os.path.join(self._devkit_path, 'VOC' + self._year)
self._classes = ('__background__', # always index 0
'你的标签1','你的标签2',你的标签3','你的标签4'
)
(7)修改py-faster-rcnn/lib/datasets/imdb.py(可选)
本博主并未修改,并未报错
训练前的准备
- 防止与之前的模型搞混,训练前把output文件夹删除(或改个其他名),还要把py-faster-rcnn/data/cache中的文件和py-faster-rcnn/data/VOCdevkit2007/annotations_cache中的文件删除(如果有的话)。
- 至于学习率等之类的设置,可在py-faster-rcnn/models/pascal_voc/ZF/faster_rcnn_alt_opt中的solve文件设置,迭代次数可在py-faster-rcnn\tools的train_faster_rcnn_alt_opt.py中修改:
max_iters = [80000, 40000, 80000, 40000]
训练模型
cd $FRCN_ROOT
./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZF pascal_voc
4 模型评估与检测
4.1 视频流检测
在 data/ 目录下新建 faster_rcnn_models 文件夹,将训练好的 ZF 模型 ZF_faster_rcnn_final.caffemodel 放在文件夹内;
下载 demo_video.py 文件,放在 tools 目录下,直接运行即可。
# 可根据自己情况修改以下两处
def parse_args():
"""Parse input arguments."""
parser = argparse.ArgumentParser(description='Faster R-CNN demo')
parser.add_argument('--gpu', dest='gpu_id', help='GPU device id to use [0]',
default=0, type=int)
parser.add_argument('--cpu', dest='cpu_mode',
help='Use CPU mode (overrides --gpu)',
action='store_true')
parser.add_argument('--net', dest='demo_net', help='Network to use [zf]',
choices=NETS.keys(), default='zf') # vgg16 或 zf
videoCapture = cv2.VideoCapture('/home/hitwh/workspace/py-faster-rcnn/data/test.mp4') # 视频路径
4.2 绘制P-R曲线
方法1:
Faster R-CNN 训练网络在输出网络模型的同级文件夹里有每一类检测目标每类图片的准确率和召回率, 可以绘制准确率召回率 (Precision-recall, PR) 曲线, PR 曲线的面积即准确率的值. 该文件存储在output/faster_rcnn_alt_opt/voc_2007_test/ZF_faster_rcnn_final/.pkl**下
运行 pr-curve.py 即可输出
方法二:修改pascal_voc.py
参考Faster R-CNN 绘制 precision-recall曲线
下载 pascal_voc.py 文件,运行命令
./tools/test_net.py --gpu 0 --def models/pascal_voc/ZF/faster_rcnn_alt_opt/faster_rcnn_test.pt --net output/faster_rcnn_alt_opt/voc_2007_trainval/zf_faster_rcnn_stage2_iter_40000.caffemodel --cfg experiments/cfgs/faster_rcnn_alt_opt.yml```