训练模型
下载预训练模型和权重:
该程序目前支持VGG16和ResnetV1(包括50\101\152)网络结构,这4种网络结构都经过了ImageNet数据集的预训练,其预训练模型由slim提供,可以在这里下载。
将其下载并放在data/imagenet_weights文件夹下。
下面将以VGG16模型为例,讲解VGG16如何利用VOC数据集进行训练:
- 建立imagenet_weights文件夹(在tf-faster-rcnn根目录下)
/tf-faster-rcnn$ mkdir -p data/imagenet_weights
/tf-faster-rcnn$ cd data/imagenet_weights
- 下载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
- 模型重命名,这是为了给test_faster_rcnn.sh传入参数NET时名字需要对应的上。
tf-faster-rcnn/data/imagenet_weights$ mv vgg_16.ckpt vgg16.ckpt
tf-faster-rcnn/data/imagenet_weights$ cd ../..
- 同理,下载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 ../..
- 训练(测试和评估):
训练的格式如下:
./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,即训练完会自动进行测试。
- 用Tensorboard可视化
训练完成后,可以使用Tensorboard对训练过程的log进行可视化
logdir用来设置想要把Tensorboard的event文件存放在哪里,port用来设置置通过哪个端口显示Tensorboard界面
/tf-faster-rcnn$ tensorboard --logdir=tensorboard/vgg16/voc_2007_trainval/ --port=7001 &
结果如下图所示:
上述命令在Tensorboard文件夹下创建了如下文件:
在浏览器中输入对应网址打开tensorboard界面如下(我只训练了70次所以仅做参考)
- 测试与评估
类似训练的过程,只不过是调用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/
训练自己的数据【重点!!!】
- 下载图片标注工具labelImg
可以在这里下载。
下载好后,到标注工具文件夹下输入如下代码完成配置:
~/labelImg$ pyrcc5 -o resources.py resources.qrc
并输入下面代码调用标注工具:
~/labelImg$ python labelImg.py
界面如图所示:
接下来就可以使用该标注工具对我们数据集中的图片进行标注,使用方法网上有很多教程,这里就不做进一步介绍了。
-
建立数据集
我们在训练自己的数据集时,要仿照经典的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下文件的名字要一一对应。
- 替换数据及删除缓存文件
- 替换数据
把你的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路径下。 - 删除之前的缓存数据
- 删除以往的训练模型:
删除文件夹/tf-faster-rcnn/output/vgg16/voc_2007_trainval/default下所有文件;
删除文件夹/tf-faster-rcnn/data/cache下所有的文件。 - 删除标记缓存:
删除data/VOCdekit2007下的annotations_cache文件夹下的所有文件。
注意:如果不进行这一步很可能会出现Keyerror:一类的错误日志
- 修改代码及训练(最后一步了!!!)
- 修改代码
- 修改自己的类别
首先,在tf-faster-rcnn/lib/datasets目录下的pascal_voc.py里第36行更改自己的类别,'background'切记不可删掉,把后面的原来的20个label换成自己的,不用更改类别数目,也没有地方可以更改。
注意:类别的名字要与标注数据时的类别数量一致,类别名一致,区分大小写,最好都是小写。 - 修改迭代次数
修改/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
附上我的最终测试集的测试结果(一共五种类别):
结束!Thanks,The management~
希望大家都可以训练顺利~
后记:
如果我们已训练好自己的模型,如何演示自己测试图片的可视化?
答:需要修改/tf-faster-rcnn/tools/demo.py文件。(这部分内容我之后有时间的话再进行一下补充)