用Faster RCNN训练自己的数据集

Faster RCNN(py caffe)工程各个目录的作用:

  1. caffe-fast-rcnn:caffe框架目录;
  2. data:用来存放pretrained(预训练)模型以及读取文件的cache缓存,还有一些下载模型的脚本;
  3. experiments:存放配置文件以及运行的log文件,另外这个目录下有scripts,里面存放end2end和alt_opt两种训练方式的脚本;
  4. lib:用来存放一些python接口文件,如其下的datasets主要负责数据库读取,config负责一些训练的配置选项;
  5. models:里面存放了三个模型文件,小型网络ZF,中型网络VGG_CNN_M_1024以及大型网络VGG16,根据你的硬件条件来选择使用哪种网络,ZF和VGG_CNN_M_1024需要至少3G内存,VGG16需要更多的内存,但不会超过11G;
  6. output:这里存放的是训练完成后的输出目录,这是运行了训练后才会出现的目录;
  7. tools:里面存放的是训练和测试的Python文件;

一、简单修改,用Pascal Voc 2007 格式,仅替换其中的XML文件及图片等

用自己数据集图片标签等替换原来的pascal voc

  1. 用自己要训练的图片/数据集替换FRCN_ROOT/data/VOCdevkit2007/VOC2007/JPEGImages/下的图片;
  2. 用自己数据集对应的标签替换FRCN_ROOT/data/VOCdevkit2007/VOC2007/Annotations/目录下的XML文件;
  3. 用自己做的train.txt、val.txt、trainval.txt、待检测目标_train.txt、待检测目标_val.txt、待检测目标_trainval.txt(如:insulator_train.txt)等txt文件替换FRCN_ROOT/data/VOCdevkit2007/VOC2007/ImageSets/Main/目录下的txt文件;

修改prototxt配置文件

这些配置文件都在FRCN_ROOT/models/pascal_voc/下。里面有三种网络结构:VGG16、VGG_CNN_M_1024、ZF,本文选择的是ZF 。每个网络结构中都有三个文件夹,分别是faster_rcnn_alt_opt、faster_rcnn_end2end、faster_rcnn;
(网上说:使用近似联合训练,比交替优化快1.5倍,但是准确率相近,所以推荐使用这种方法)所以,更改faster_rcnn_end2end文件夹下的train.prototxt和test.prototxt:

修改train.prototxt

所在目录:/home/xu/FRCN_ROOT/models/pascal_voc/ZF/faster_rcnn_end2end/test.prototxt)中需要更改的地方有三处(按顺序寻找修改):
  1. 第一处是’input-data’层:
    num_output原来的21(目标20种+背景1种=21)改为:数据集目标类别数+1:

  1. 第四处是roi-data层:
    num_classes的值改为:数据集目标类别数+1:

  2. 第二处是cls_score层:
    num_output修改原理同第一处:


  1. 第三处是bbox_pred层,在这里需将num_output原来的84改为:(目标类别数+1)×4,原来的是(20+1)*4=84:

test.prototxt

  1. 其中没有input-data层,所以只需按照train中的修改cls_score层以及bbox_pred层即可:

修改lib/datasets/pascal_voc.py,将类别改成自己的类别

进入RCN_ROOT/lib/datasets/,找到pascal_voc.py文件,将类别修改为自己数据集的目标类别:


datasets目录下主要有三个文件,分别是
(1) factory.py:这是一个工厂类,用类生成imdb类并且返回数据库供网络训练和测试使用;
(2) imdb.py:是数据库读写类的基类,封装了许多db的操作;
(3) pascl_voc.pyRoss用这个类来操作;

开始训练

cd FRCN_ROOT
./experiments/scripts/faster_rcnn_end2end.sh 0 ZF pascal_voc

由于训练过程太长,可以将训练过程产生的输出定向输入到log文件中,这样可方便查看。只需在上述命令中加入定向输入的命令即可,如下:
./experiments/scripts/faster_rcnn_end2end.sh 0 ZF pascal_voc > /home/xu/log/clothdirector.log 2>&1
!!!训练前需要将cache中的pki文件以及VOCdevkit2007中annotations_cache的缓存删掉。

二、训练好之后,验证demo

1. 修改相应文件内容

1.1 修改/tools/demo.py文件

(1)在/tools/demo.py文件中,修改 “CLASSES = (‘background’, ‘insulator’)”;
(2)在“NETS”中添加: “ NETS = { … ’ vgg_1 ’ : ( ‘ VGG16 ’,vgg16_faster_rcnn_iter_10000.caffemodel) } ”,其中 ‘vgg_1’表示自己生成的caffemodel;
(3)在函数 “def parse_args()”中,修改 “parser.add_argument(’–net’, … … default=‘vgg16’)”中的‘vgg16’为 “parser.add_argument(’–net’, … … default=‘vgg_1’)”;

1.2 修改faster_rcnn_test.pt文件

(1)修改models/pascal_voc/VGG16/faster_rcnn_alt_opt/faster_rcnn_test.pt文件,其中的 ‘cls_score’ 层的 ‘num_output’ 改成2;
(2)其中的 ‘bbox_pred’ 层中的 ‘num_output’ 改成8;

你可能感兴趣的:(Faster,RCNN)