使用tf-faster-rcnn训练自己的数据集【光纤分类项目】

训练模型

下载预训练模型和权重:

该程序目前支持VGG16和ResnetV1(包括50\101\152)网络结构,这4种网络结构都经过了ImageNet数据集的预训练,其预训练模型由slim提供,可以在这里下载。
将其下载并放在data/imagenet_weights文件夹下。
下面将以VGG16模型为例,讲解VGG16如何利用VOC数据集进行训练:

  1. 建立imagenet_weights文件夹(在tf-faster-rcnn根目录下)
/tf-faster-rcnn$ mkdir -p data/imagenet_weights
/tf-faster-rcnn$ cd data/imagenet_weights
  1. 下载vgg16模型到imagenet_weights文件夹下并解压缩,你也可以到上面的网址里下载
tf-faster-rcnn/data/imagenet_weights$ wget -v http://download.tensorflow.org/models/vgg_16_2016_08_28.tar.gz
tar -xzvf vgg_16_2016_08_28.tar.gz
  1. 模型重命名,这是为了给test_faster_rcnn.sh传入参数NET时名字需要对应的上。
tf-faster-rcnn/data/imagenet_weights$ mv vgg_16.ckpt vgg16.ckpt
tf-faster-rcnn/data/imagenet_weights$ cd ../..
  1. 同理,下载ResNet101的方式如下:
# 建立imagenet_weights文件夹
/tf-faster-rcnn$  mkdir -p data/imagenet_weights
/tf-faster-rcnn$  cd data/imagenet_weights
# 下载ResNet101模型到imagenet_weights文件夹下并解压缩,你也可以到上面的网址里下载
/tf-faster-rcnn/data/imagenet_weights$  wget -v http://download.tensorflow.org/models/resnet_v1_101_2016_08_28.tar.gz
tar -xzvf resnet_v1_101_2016_08_28.tar.gz
# 模型重命名
tf-faster-rcnn/data/imagenet_weights$ resnet_v1_101.ckpt res101.ckpt
tf-faster-rcnn/data/imagenet_weights$ cd ../..
  1. 训练(测试和评估):
    训练的格式如下:
./experiments/scripts/train_faster_rcnn.sh [GPU_ID] [DATASET] [NET]
# GPU_ID 是你要使用的GPU编号
# NET  是你采用的网络类型, 可选范围为{vgg16, res50, res101, res152}
# DATASET 是数据集,在train_faster_rcnn.sh中预先定义过{pascal_voc, pascal_voc_0712, coco} ,还可以根据自己需要进行添加
# Examples:
./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc vgg16
./experiments/scripts/train_faster_rcnn.sh 1 coco res101
  • 上面在演示demo时,在output中建立了一个经过VOC0712数据集训练好的Res101模型的软链接,如果有再次使用VOC0712数据集对Res101进行训练的需要,记得删除掉该软链接。
  • 为了节省时间并排除错误,我把迭代次数只设置了70次,把./experiments/scripts/train_faster_rcnn.sh里的第22行把ITERS=70000改成ITERS=70,同时记得把./experiments/scripts/test_faster_rcnn.sh的ITERS也改成70。(这里注意使用vim编辑器打开sh文件进行修改)
  • 注意:因为我使用的是pascal_voc数据集,所以只需要更改对应数据集的ITERS的就行了,训练和测试的都要改,因为在train_faster_rcnn.sh的末尾会执行test_faster_rcnn.sh。

下面举例使用VOC07数据集训练VGG16(并测试):

/tf-faster-rcnn$ ./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc vgg16

这里最后的vgg16就是对应的权重数据,名字要对的上,0是GPU的ID,pascal_voc是训练使用的数据集。

训练结果
训练结果

因为只训练了70次,准确度是比较差的。

注:运行train_faster_rcnn.sh后会自动运行test_faster_rcnn.sh,即训练完会自动进行测试。

  1. 用Tensorboard可视化
    训练完成后,可以使用Tensorboard对训练过程的log进行可视化
    logdir用来设置想要把Tensorboardevent文件存放在哪里,port用来设置置通过哪个端口显示Tensorboard界面
/tf-faster-rcnn$ tensorboard --logdir=tensorboard/vgg16/voc_2007_trainval/ --port=7001 &

结果如下图所示:


上述命令在Tensorboard文件夹下创建了如下文件:


在浏览器中输入对应网址打开tensorboard界面如下(我只训练了70次所以仅做参考)

tensorboard界面
  1. 测试与评估
    类似训练的过程,只不过是调用test_faster_rcnn.sh而不是train_faster_rcnn.sh,即只用测试集进行测试,并不进行训练:
./experiments/scripts/test_faster_rcnn.sh [GPU_ID] [DATASET] [NET]
# GPU_ID 是你要使用的GPU编号
# NET是你采用的网络类型,可选范围为{vgg16, res50, res101, res152}
# DATASET是数据集,在train_faster_rcnn.sh中预先定义过{pascal_voc, pascal_voc_0712, coco} ,还可以根据自己需要进行添加
# Examples:
./experiments/scripts/test_faster_rcnn.sh 0 pascal_voc vgg16
./experiments/scripts/test_faster_rcnn.sh 1 coco res101

再评估:
可以使用tools/reval.sh进行再评估
补充说明:
默认情况下,训练好的网络存放在:

output/[NET]/[DATASET]/default/

测试的输出结果存放在:

output/[NET]/[DATASET]/default/[SNAPSHOT]/

训练和验证的Tensorboard信息存放在:

tensorboard/[NET]/[DATASET]/default/
tensorboard/[NET]/[DATASET]/default_val/

训练自己的数据【重点!!!】

  1. 下载图片标注工具labelImg
    可以在这里下载。
    下载好后,到标注工具文件夹下输入如下代码完成配置:
~/labelImg$ pyrcc5 -o resources.py resources.qrc

并输入下面代码调用标注工具:

~/labelImg$ python labelImg.py

界面如图所示:

标注工具labelImg界面

接下来就可以使用该标注工具对我们数据集中的图片进行标注,使用方法网上有很多教程,这里就不做进一步介绍了。

  1. 建立数据集
    我们在训练自己的数据集时,要仿照经典的VOC2007数据集去做,如下图所示是voc2007数据集文件夹格式,我们要仿照这个文件夹的格式做一个自己数据集的文件夹:


    VOC2007数据集文件夹格式

JPEGImages——用来保存你的数据图片,对于faster-rcnn来讲,所有的图片必须是jpg/jpeg格式,其他格式的话要转换一下。另外,一定要对图片进行编号,一般按照voc数据集格式,采用六位数字编码,如000001.jpg、000002.jpg等。
Annotations——这里是存放你对所有数据图片做的标注文件,每张照片的标注信息必须是xml格式,如000001.xml.
ImageSets——在该文件夹下创建三个子文件夹:Layout、Main、Segmentations。
xml数据准备完毕后,需要划分训练验证以及测试集,这里我使用的别人写好的划分代码Creat_FRCNN_DataSet,是matlab的,下载后更改VOC2007txt.m中d 路径就可以用了。执行结果会按比例对你的数据划分为训练集验证集以及测试集,同时会生成四个txt文档,分别是test.txt,train.txt,trainval.txt,val.txt。

注意:JPEGImages与Annotations下文件的名字要一一对应。

  1. 替换数据及删除缓存文件
  • 替换数据
    把你的xml文件放置在tf-faster-rcnn/data/VOCdevkit2007/VOC2007/Annotations路径下,记得把原来的删掉;同时把你的jpg文件放在tf-faster-rcnn/data/VOCdevkit2007/VOC2007/JPEGImages路径下;把之前matlab生成是四个txt文档放在tf-faster-rcnn/data/VOCdevkit2007/VOC2007/ImageSets/Layout 和 tf-faster-rcnn/data/VOCdevkit2007/VOC2007/ImageSets/Main路径下。
  • 删除之前的缓存数据
  1. 删除以往的训练模型:
    删除文件夹/tf-faster-rcnn/output/vgg16/voc_2007_trainval/default下所有文件;
    删除文件夹/tf-faster-rcnn/data/cache下所有的文件。
  2. 删除标记缓存:
    删除data/VOCdekit2007下的annotations_cache文件夹下的所有文件。

注意:如果不进行这一步很可能会出现Keyerror:一类的错误日志

  1. 修改代码及训练(最后一步了!!!)
  • 修改代码
  1. 修改自己的类别
    首先,在tf-faster-rcnn/lib/datasets目录下的pascal_voc.py里第36行更改自己的类别,'background'切记不可删掉,把后面的原来的20个label换成自己的,不用更改类别数目,也没有地方可以更改。
    注意:类别的名字要与标注数据时的类别数量一致,类别名一致,区分大小写,最好都是小写。
  2. 修改迭代次数
    修改/tf-faster-rcnn/experiments/scripts/train_faster_rcnn.sh文件,找到类似这段代码:
  pascal_voc)
    TRAIN_IMDB="voc_2007_trainval"
    TEST_IMDB="voc_2007_test"
    STEPSIZE="[50000]"
    ITERS=10000
    ANCHORS="[8,16,32]"
    RATIOS="[0.5,1,2]"

ITERS后面的数值代表是迭代次数,这里已经将其改成10000,由于train_faster_rcnn.sh此文件最后一句话调用了test_faster_rcnn.sh,因此需要将test_faster_rcnn.sh中的代码做相同处理,即改变迭代次数(要与train_faster_rcnn.sh文件中的迭代次数一致)

  • 训练及测试
source activate tf-faster-rcnn

cd 到tf-faster-rcnn的目录下:

cd tf-faster-rcnn-master

进行训练:

GPU_ID=0
./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc vgg16

测试:

./experiments/scripts/test_faster_rcnn.sh 0 pascal_voc vgg16

附上我的最终测试集的测试结果(一共五种类别):

TestResult.png

结束!Thanks,The management~
希望大家都可以训练顺利~

后记:
如果我们已训练好自己的模型,如何演示自己测试图片的可视化?
答:需要修改/tf-faster-rcnn/tools/demo.py文件。(这部分内容我之后有时间的话再进行一下补充)

你可能感兴趣的:(使用tf-faster-rcnn训练自己的数据集【光纤分类项目】)