R-FCN+ResNet-50训练自己的数据(python版本)

一、准备工作

1.下载py-R-FCN

git clone https://github.com/Orpine/py-R-FCN.git
下面把py-R-FCN路径设置为$RFCN_ROOT
export RFCN_ROOT=/home/liufeng/py-R-FCN
想取消该环境变量则
reset RFCN_ROOT



2.配置caffe环境

(1)下载微软版本caffe

cd $RFCN_ROOT  
git clone https://github.com/Microsoft/caffe.git 

(2)Build Cython

cd $RFCN_ROOT/lib  
make -j8  
(3)Build caffe 和 pycaffe

cd $RFCN_ROOT/caffe  
cp Makefile.config.example Makefile.config 


修改Makefile.config:

将下面代码前面的#去掉

# USE_CUDNN:=1

# USE_OPENCV:=1

# WITH_PYTHON_LAYER:=1


把下面的代码

INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include

LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib

改成

INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial

LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial


编译之前最好检查一下python依赖包是否齐全: 

cd caffe/python
for req in $(cat requirements.txt); do sudo pip install $req;done


然后make一下

cd $RFCN_ROOT/caffe  
make -j8 && make pycaffe  

如果一切正常的话,python代码会自动添加环境变量 $RFCN_ROOT/caffe/python,否则,你需要自己添加环境变量:

sudo gedit ~/.bashrc

将export PYTHONPATH=~/py-R-FCN/caffe/python:$PYTHONPATH添加到文件的最后

source ~/.bashrc 使更改生效

进入python编程环境,用import caffe 测试。

二、训练自己的数据集

1.下载VOC数据集

在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
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
解压
tar xvf VOCtrainval_06-Nov-2007.tar
tar xvf VOCtest_06-Nov-2007.tar
tar xvf VOCdevkit_08-Jun-2007.tar
tar xvf VOCtrainval_11-May-2012.tar

把VOCdevkit文件夹重命名为VOCdevkit0712,然后在该文件夹下创建VOC0712文件夹,然后在该文件夹下放你的VOC格式的数据集。

在data/VOCdevkit0712/results文件夹下创建VOC0712文件夹,然后不用管它。


修改$RFCN\experiments\scripts\rfcn_end2end_ohem.sh成如下模式:

case $DATASET in  
  pascal_voc)  
    TRAIN_IMDB="voc_0712_trainval"  
    TEST_IMDB="voc_0712_test"  
    PT_DIR="pascal_voc"  
    ITERS=110000  

迭代次数也是在这里修改。


2.下载预训练模型


选用ResNet-50-model.caffemodel。下载地址:链接: https://pan.baidu.com/s/1nvSi4uH 密码: w2tv

在data文件夹下创建imagenet_models文件夹,将下载好的模型放到该文件夹下。


3.修改网络参数


打开$RFCN_ROOT/models/pascal_voc/ResNet-50/rfcn_end2end

修改的参数cls_num指的是你数据集的类别数+1(背景)。比如我有3类,+1类背景,cls_num=4.


(1)修改class-aware/train_ohem.prototxt
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': 4" #cls_num  
  }  
}  
layer {  
  name: 'roi-data'  
  type: 'Python'  
  bottom: 'rpn_rois'  
  bottom: 'gt_boxes'  
  top: 'rois'  
  top: 'labels'  
  top: 'bbox_targets'  
  top: 'bbox_inside_weights'  
  top: 'bbox_outside_weights'  
  python_param {  
    module: 'rpn.proposal_target_layer'  
    layer: 'ProposalTargetLayer'  
    param_str: "'num_classes': 4" #cls_num  
  }  
}  
layer {  
    bottom: "conv_new_1"  
    top: "rfcn_cls"  
    name: "rfcn_cls"  
    type: "Convolution"  
    convolution_param {  
        num_output: 196 #cls_num*(score_maps_size^2)  4*(7^2)
        kernel_size: 1  
        pad: 0  
        weight_filler {  
            type: "gaussian"  
            std: 0.01  
        }  
        bias_filler {  
            type: "constant"  
            value: 0  
        }  
    }  
    param {  
        lr_mult: 1.0  
    }  
    param {  
        lr_mult: 2.0  
    }  
}  
layer {  
    bottom: "conv_new_1"  
    top: "rfcn_bbox"  
    name: "rfcn_bbox"  
    type: "Convolution"  
    convolution_param {  
        num_output: 786 #4*cls_num*(score_maps_size^2)  4*196
        kernel_size: 1  
        pad: 0  
        weight_filler {  
            type: "gaussian"  
            std: 0.01  
        }  
        bias_filler {  
            type: "constant"  
            value: 0  
        }  
    }  
    param {  
        lr_mult: 1.0  
    }  
    param {  
        lr_mult: 2.0  
    }  
}  
layer {  
    bottom: "rfcn_cls"  
    bottom: "rois"  
    top: "psroipooled_cls_rois"  
    name: "psroipooled_cls_rois"  
    type: "PSROIPooling"  
    psroi_pooling_param {  
        spatial_scale: 0.0625  
        output_dim: 4  #cls_num  
        group_size: 7  
    }  
}  
layer {  
    bottom: "rfcn_bbox"  
    bottom: "rois"  
    top: "psroipooled_loc_rois"  
    name: "psroipooled_loc_rois"  
    type: "PSROIPooling"  
    psroi_pooling_param {  
        spatial_scale: 0.0625  
        output_dim: 16 #4*cls_num  
        group_size: 7  
    }  
}  

(2)修改class-aware/test.prototxt

layer {  
    bottom: "conv_new_1"  
    top: "rfcn_cls"  
    name: "rfcn_cls"  
    type: "Convolution"  
    convolution_param {  
        num_output: 196 #cls_num*(score_maps_size^2)  
        kernel_size: 1  
        pad: 0  
        weight_filler {  
            type: "gaussian"  
            std: 0.01  
        }  
        bias_filler {  
            type: "constant"  
            value: 0  
        }  
    }  
    param {  
        lr_mult: 1.0  
    }  
    param {  
        lr_mult: 2.0  
    }  
}  
layer {  
    bottom: "conv_new_1"  
    top: "rfcn_bbox"  
    name: "rfcn_bbox"  
    type: "Convolution"  
    convolution_param {  
        num_output: 786 #4*cls_num*(score_maps_size^2)  
        kernel_size: 1  
        pad: 0  
        weight_filler {  
            type: "gaussian"  
            std: 0.01  
        }  
        bias_filler {  
            type: "constant"  
            value: 0  
        }  
    }  
    param {  
        lr_mult: 1.0  
    }  
    param {  
        lr_mult: 2.0  
    }  
}  
layer {  
    bottom: "rfcn_cls"  
    bottom: "rois"  
    top: "psroipooled_cls_rois"  
    name: "psroipooled_cls_rois"  
    type: "PSROIPooling"  
    psroi_pooling_param {  
        spatial_scale: 0.0625  
        output_dim: 4  #cls_num  
        group_size: 7  
    }  
}  
layer {  
    bottom: "rfcn_bbox"  
    bottom: "rois"  
    top: "psroipooled_loc_rois"  
    name: "psroipooled_loc_rois"  
    type: "PSROIPooling"  
    psroi_pooling_param {  
        spatial_scale: 0.0625  
        output_dim: 16  #4*cls_num  
        group_size: 7  
    }  
}  
layer {  
    name: "cls_prob_reshape"  
    type: "Reshape"  
    bottom: "cls_prob_pre"  
    top: "cls_prob"  
    reshape_param {  
        shape {  
            dim: -1  
            dim: 4  #cls_num  
        }  
    }  
}  
layer {  
    name: "bbox_pred_reshape"  
    type: "Reshape"  
    bottom: "bbox_pred_pre"  
    top: "bbox_pred"  
    reshape_param {  
        shape {  
            dim: -1  
            dim: 16  #4*cls_num  
        }  
    }  
}

(3)修改train_agnostic.prototxt

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': 4"  #cls_num  
  }  
}  
layer {  
    bottom: "conv_new_1"  
    top: "rfcn_cls"  
    name: "rfcn_cls"  
    type: "Convolution"  
    convolution_param {  
        num_output: 196 #cls_num*(score_maps_size^2)   ###  
        kernel_size: 1  
        pad: 0  
        weight_filler {  
            type: "gaussian"  
            std: 0.01  
        }  
        bias_filler {  
            type: "constant"  
            value: 0  
        }  
    }  
    param {  
        lr_mult: 1.0  
    }  
    param {  
        lr_mult: 2.0  
    }  
}  
layer {  
    bottom: "rfcn_cls"  
    bottom: "rois"  
    top: "psroipooled_cls_rois"  
    name: "psroipooled_cls_rois"  
    type: "PSROIPooling"  
    psroi_pooling_param {  
        spatial_scale: 0.0625  
        output_dim: 4 #cls_num   ###  
        group_size: 7  
    }  
} 

(4)修改train_agnostic_ohem.prototxt

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': 4" #cls_num ###  
  }  
}  
layer {  
    bottom: "conv_new_1"  
    top: "rfcn_cls"  
    name: "rfcn_cls"  
    type: "Convolution"  
    convolution_param {  
        num_output: 196 #cls_num*(score_maps_size^2)   ###  
        kernel_size: 1  
        pad: 0  
        weight_filler {  
            type: "gaussian"  
            std: 0.01  
        }  
        bias_filler {  
            type: "constant"  
            value: 0  
        }  
    }  
    param {  
        lr_mult: 1.0  
    }  
    param {  
        lr_mult: 2.0  
    }  
} 
layer {  
    bottom: "rfcn_cls"  
    bottom: "rois"  
    top: "psroipooled_cls_rois"  
    name: "psroipooled_cls_rois"  
    type: "PSROIPooling"  
    psroi_pooling_param {  
        spatial_scale: 0.0625  
        output_dim: 4 #cls_num   ###  
        group_size: 7  
    }  
}  

(5)修改test_agnostic.prototxt

layer {  
    bottom: "conv_new_1"  
    top: "rfcn_cls"  
    name: "rfcn_cls"  
    type: "Convolution"  
    convolution_param {  
        num_output: 196 #cls_num*(score_maps_size^2) ###  
        kernel_size: 1  
        pad: 0  
        weight_filler {  
            type: "gaussian"  
            std: 0.01  
        }  
        bias_filler {  
            type: "constant"  
            value: 0  
        }  
    }  
    param {  
        lr_mult: 1.0  
    }  
    param {  
        lr_mult: 2.0  
    }  
}  
layer {  
    bottom: "rfcn_cls"  
    bottom: "rois"  
    top: "psroipooled_cls_rois"  
    name: "psroipooled_cls_rois"  
    type: "PSROIPooling"  
    psroi_pooling_param {  
        spatial_scale: 0.0625  
        output_dim: 4 #cls_num   ###  
        group_size: 7  
    }  
}  
layer {  
    name: "cls_prob_reshape"  
    type: "Reshape"  
    bottom: "cls_prob_pre"  
    top: "cls_prob"  
    reshape_param {  
        shape {  
            dim: -1  
            dim: 4 #cls_num   ###  
        }  
    }  
}  


4.修改代码


(1) $RFCN/lib/datasets/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'  
                      )  

(2) $RFCN_ROOT/lib/datasets/imdb.py

在一行代码为 boxes[:, 2] = widths[i] - oldx1 - 1下加入代码:
for b in range(len(boxes)):
    if boxes[b][2]< boxes[b][0]:
        boxes[b][0] = 0


5.开始训练


cd $RFCN_ROOT  
./experiments/scripts/rfcn_end2end_ohem.sh 0 ResNet-50 pascal_voc

6.demo


将训练得到的模型($ RFCN_ROOT/output/rfcn_end2end_ohem/voc_0712_trainval里最后的caffemodel)拷贝到$ RFCN_ROOT/data/rfcn_models下,然后打开$ RFCN_ROOT/tools/demo_rfcn.py,将CLASSES修改成你的标签,NETS修改成你的model,im_names修改成你的测试图片(放在data/demo下),最后:
cd $RFCN_ROOT  
./tools/demo_rfcn.py --net ResNet-50  












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值