在开始之前需要部署Faster-RCNN TensorFlow版本,我本人是参考这篇博客的,在此感谢博主,但是用博主的方式在运行自己的数据集时并未成功,捣鼓几时,用以下步骤完成了tf-faster-rcnn 训练自己的数据集。并修改demo.py文件,具有可视化效果。

tf-faster-rcnn 训练自己的数据集

1.替换数据集:

删除“/VOCdevkit/VOC2007”文件夹下所有文件,新建三个文件夹,名字分别为:JPEGImages,Annotations和ImageSets,其中JPEGImages存放图片数据,如:

Annotations存放标记的ground truth文件,也就是xml文件,如:

ImageSets文件夹下新建三个文件夹,即:Layout,Main,Segmentations,如:

参考Creat_FRCNN_DataSetVOC2007txt.m程序,matlab执行,记得改路径,生成四个文件:trainval.txt,test.txt,train.txt,val.txt,将这四个文件复制到刚刚建立的Layout,Main两个文件夹中。

(第一步需要注意的事:JPEGImages与Annotations下文件的名字要一一对应)

 

2.修改自己的类别

修改 /tf-faster-rcnn/lib/datasets/pascal_voc.py文件,找到这句话:

self._classes = ('__background__',  # always index 0
                     'aeroplane', 'bicycle', 'bird', 'boat',
                     'bottle', 'bus', 'car', 'cat', 'chair',
                     'cow', 'diningtable', 'dog', 'horse',
                     'motorbike', 'person', 'pottedplant',
                     'sheep', 'sofa', 'train', 'tvmonitor')

将其替换成自己的类别,如,我替换成如下:

  self._classes = ('__background__',  # always index 0
                     'My little Huihui goddess')

其中  'My little Huihui goddess'是我自己的类别

(第二步需要注意的事:类别的名字要与标注数据时的类别数量一致,类别名一致,区分大小写,最好都是小写)

 

3.修改迭代次数,

修改/tf-faster-rcnn/experiments/scripts/train_faster_rcnn.sh文件,找到类似这段代码:

  pascal_voc)
    TRAIN_IMDB="voc_2007_trainval"
    TEST_IMDB="voc_2007_test"
    STEPSIZE="[50000]"
    ITERS=20
    ANCHORS="[8,16,32]"
    RATIOS="[0.5,1,2]"

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

 

4.删除以往的训练模型:

删除文件夹/tf-faster-rcnn/output/vgg16/voc_2007_trainval/default下所有文件,

删除文件夹/tf-faster-rcnn/data/cache下所有的文件

 

5.删除标记缓存

删除文件夹/VOCdevkit/annotations_cache下的所有文件

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

 

6.训练及测试:

source activate tf-faster-rcnn

cd 到tf-faster-rcnn的目录下,我的是存放在/Github里面的

cd /Github/tf-faster-rcnn

训练:

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

测试:

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

 

 

修改demo.py

上图是原始tf-faster-rcnn项目中的demo.py演示部分,如果我们已训练好自己的模型,如何演示自己测试图片的可视化?

我们需要修改/tf-faster-rcnn/tools/demo.py文件

1.修改类别

找到这段代码:

CLASSES = ('__background__',
           'aeroplane', 'bicycle', 'bird', 'boat',
           'bottle', 'bus', 'car', 'cat', 'chair',
           'cow', 'diningtable', 'dog', 'horse',
           'motorbike', 'person', 'pottedplant',
           'sheep', 'sofa', 'train', 'tvmonitor')

保留'__background__'这一项,其余改成自己的类,如:

CLASSES = ('__background__',
           'My little Huihui goddess')

2.修改类别数

找到这段代码:

    net.create_architecture("TEST", 21,
                          tag='default', anchor_scales=[8, 16, 32])

将21换成自己的类别数+1,由于我只有一个类“My little Huihui goddess”,因此这里改成2,如:

    net.create_architecture("TEST", 2,
                          tag='default', anchor_scales=[8, 16, 32])

3.修改默认调用的模型

找到这段代码:

NETS = {'vgg16': ('vgg16_faster_rcnn_iter_70000.ckpt',),'res101': ('res101_faster_rcnn_iter_110000.ckpt',)}

修改你的模型的名字,我用的是vgg16来训练我的网络,迭代次数设置为200,所以我修改如下:

NETS = {'vgg16': ('vgg16_faster_rcnn_iter_200.ckpt',),'res101': ('res101_faster_rcnn_iter_110000.ckpt',)}

注:这个模型的名字也可以在你存放模型结果的文件夹下查看的,我存放的位置是:/tf-faster-rcnn/output/vgg16/voc_2007_trainval/default文件夹下的。

因为在这里我演示的是用vgg16来可视化目标检测的结果,而原始demo.py里面默认的是res101,因此我们需要做相应的修改,找到如下代码:

    parser.add_argument('--net', dest='demo_net', help='Network to use [vgg16 res101]',
                        choices=NETS.keys(), default='res101')

修改如下:

    parser.add_argument('--net', dest='demo_net', help='Network to use [vgg16 res101]',
                        choices=NETS.keys(), default='vgg16')

4.修改调用模型的位置

因为我标注的数据集是替换了pascal_voc数据集,因此我的模型是存放在/tf-faster-rcnn/output/vgg16/voc_2007_trainval/default文件夹下的,但是demo.py文件默认的是调用训练pascal_voc_0712数据集的模型(改模型的位置是:/tf-faster-rcnn/output/vgg16/voc_2007_trainval+voc_2012_trainval),因此我们需要修改调用模型的位置,找到这段代码:

    parser.add_argument('--dataset', dest='dataset', help='Trained dataset [pascal_voc pascal_voc_0712]',
                        choices=DATASETS.keys(), default='pascal_voc_0712')

修改为:

    parser.add_argument('--dataset', dest='dataset', help='Trained dataset [pascal_voc pascal_voc_0712]',
                        choices=DATASETS.keys(), default='pascal_voc')

5.修改测试图片索引

找到这段代码:

print('Loaded network {:s}'.format(tfmodel))

    im_names = ['000456.jpg', '000542.jpg', '001150.jpg',
                '001763.jpg', '004545.jpg']
    for im_name in im_names:
        print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
        print('Demo for data/demo/{}'.format(im_name))
        demo(sess, net, im_name)

将im_names=[.....]替换成想要测试的图片名子,如:

print('Loaded network {:s}'.format(tfmodel))

    im_names = ['000001.jpg', '000002.jpg', '000003.jpg',
                '000006.jpg', '000008.jpg']
    for im_name in im_names:
        print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
        print('Demo for data/demo/{}'.format(im_name))
        demo(sess, net, im_name)

 将相应的000001.jpg,000002.jpg,000003.jpg等,移动到/tf-faster-rcnn/data/demo/文件夹下

6.运行

source activate tf-faster-rcnn

cd 到tf-faster-rcnn的目录下,我的是存放在/Github里面的

cd /Github/tf-faster-rcnn
GPU_ID=0
CUDA_VISIBLE_DEVICES=${GPU_ID} ./tools/demo.py

注意GPU_ID=0一定要加上,不然会出现“no CUDA-capable device is detected”日志,运行的结果应该是没有进行优化后的结果。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐