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

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

作者: 冬天都会过去 | 来源:发表于2021-04-23 18:37 被阅读0次

    训练模型

    下载预训练模型和权重:

    该程序目前支持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训练自己的数据集【光纤分类项目】

          本文链接:https://www.haomeiwen.com/subject/qvqosktx.html