Faster RCNN训练自己的数据集

代码地址:faster-rcnn-py27-tf

1、制作数据集

给文件重命名,需要从000001开始对jpg和xml文件进行命名和排序,批量重命名代码如下:
转载自:voc2007数据集制作之批量修改文件夹JPEGImages中图片的名字

import os

class BatchRename():
    '''
    批量重命名文件夹中的图片文件
    '''
    def __init__(self):
        # 我的图片文件夹路径horse
        self.path = r'G:\DeepL\dataset\build\building\xml'

    def rename(self):
        filelist = os.listdir(self.path)
        total_num = len(filelist)
        i = 1
        n = 6
        for item in filelist:
            if item.endswith('.xml'):
                n = 6 - len(str(i))
                src = os.path.join(os.path.abspath(self.path), item)
                dst = os.path.join(os.path.abspath(self.path), str(0) * n + str(i) + '.xml')
                try:
                    os.rename(src, dst)
                    print('converting %s to %s ...' % (src, dst))
                    i = i + 1

                except:
                    continue
        print('total %d to rename & converted %d jpgs' % (total_num, i))

if __name__ == '__main__':
    demo = BatchRename()
    demo.rename()

数据集划分

将数据划分后编号存在test.txt、train.txt、trainval.txt、val.txt中。
代码转载自:python3+Tensorflow+Faster R-CNN训练自己的数

%%
%该代码根据已生成的xml,制作VOC2007数据集中的trainval.txt;train.txt;test.txt和val.txt
%trainval占总数据集的50%,test占总数据集的50%;train占trainval的50%,val占trainval的50%;
%上面所占百分比可根据自己的数据集修改,如果数据集比较少,test和val可少一些
%%
%注意修改下面两个路径
xmlfilepath='E:\DL-CODE\Creat_FRCNN_DataSet-master\Creat_FRCNN_DataSet-master\Annotations';
txtsavepath='E:\DL-CODE\Creat_FRCNN_DataSet-master\Creat_FRCNN_DataSet-master\ImageSets\Main\';

xmlfile=dir(xmlfilepath);
numOfxml=length(xmlfile)-2;%减去.和..  总的数据集大小

trainval=sort(randperm(numOfxml,floor(numOfxml/2)));%trainval为数据集的50%
test=sort(setdiff(1:numOfxml,trainval));%test为剩余50%

trainvalsize=length(trainval);%trainval的大小
train=sort(trainval(randperm(trainvalsize,floor(trainvalsize/2))));
val=sort(setdiff(trainval,train));

ftrainval=fopen([txtsavepath 'trainval.txt'],'w');
ftest=fopen([txtsavepath 'test.txt'],'w');
ftrain=fopen([txtsavepath 'train.txt'],'w');
fval=fopen([txtsavepath 'val.txt'],'w');

for i=1:numOfxml
    if ismember(i,trainval)
        fprintf(ftrainval,'%s\n',xmlfile(i+2).name(1:end-4));
        if ismember(i,train)
            fprintf(ftrain,'%s\n',xmlfile(i+2).name(1:end-4));
        else
            fprintf(fval,'%s\n',xmlfile(i+2).name(1:end-4));
        end
    else
        fprintf(ftest,'%s\n',xmlfile(i+2).name(1:end-4));
    end
end
fclose(ftrainval);
fclose(ftrain);
fclose(fval);
fclose(ftest);

3、替换成自己的数据集

(1)把xml文件放置在tf-faster-rcnn/data/VOCdevkit2007/VOC2007/Annotations路径下
(2)把jpg文件放在tf-faster-rcnn/data/VOCdevkit2007/VOC2007/JPEGImages路径下
(3)把之前matlab生成是四个txt文档放在tf-faster-rcnn/data/VOCdevkit2007/VOC2007/ImageSets/Layout 和 tf-faster-rcnn/data/VOCdevkit2007/VOC2007/ImageSets/Main下。
(4)在开始训练之前,还需要把之前训练产生的模型以及cache删除掉,分别在tf-faster-rcnn/output/vgg16/voc_2007_trainval/default路径下和tf-faster-rcnn/data/cache路径下,然后就可以开始训练了。
(5)tf-faster-rcnn/lib/datasets目录下的pascal_voc.py里第36行更改自己的类别,'background'切记不可删掉,把后面的原来的20个label换成自己的,不用更改类别数目

4、开始训练

./experiments/scripts/train_faster_rcnn.sh [GPU_ID] [DATASET] [NET]
# GPU_ID is the GPU you want to test on
# NET in {vgg16, res50, res101, res152} is the network arch to use
# DATASET {pascal_voc, pascal_voc_0712, coco} is defined in train_faster_rcnn.sh
# Examples:
./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc vgg16
./experiments/scripts/train_faster_rcnn.sh 1 coco res101

这里使用pascal_voc格式的数据集,预训练模型采用vgg16.

5、测试网络

./experiments/scripts/test_faster_rcnn.sh 0 pascal_voc vgg16
./experiments/scripts/test_faster_rcnn.sh 1 coco res101

6、Tensorboard查看收敛情况

tensorboard --logdir=tensorboard/vgg16/voc_2007_trainval/ --port=7001

7、检测自己训练的模型

tools目录下的demo.py

#修改自己的类
CLASSES = ('__background__', 'man', 'woman',  '#自己的类')
# 修改模型
NETS = {'vgg16': ('vgg16_faster_rcnn_iter_70000.ckpt',),'res101':('res101_faster_rcnn_iter_10000.ckpt',)}
# 修改类别et.create_architecture("TEST",3,        # 自己的类别数+1
                          tag='default',anchor_scales=[8, 16, 32])
# 将图片换成自己要测试的图片
im_names = ['000033.jpg', '000062.jpg', '000279.jpg',
                '000603.jpg', '000798.jpg', '001080.jpg', 
                '001084.jpg', '001210.jpg', '001587.jpg',
                '001851.jpg', '001852.jpg', '000000.jpg']

这里默认为res101模型做demo测试,如果想换做vgg16模型测试demo,则要进行如下操作:
在tf-faster-rcnn下建立路径:

output/vgg16/voc_2007_trainval+voc_2012_trainval/default

将训练保存在output/vgg16/voc_2007_trainval/default路径中的vgg16模型中的同一迭代次数下的4个文件复制到上面建立的路径下,然后将其中的.pkl文件重命名为.ckpt文件,即可。
然后运行代码,指定网络为vgg16:

python ./tools/demo.py --net vgg16

让一幅图像中检测到的所有类别物体都在一个窗口下标注

就是把vis_detections函数中for循环前后三行代码移动到demo函数的for循环前后。
参考博客:faster rcnn demo.py:在一个窗口显示所有类别标注

批量测试test.txt中的图片并将结果保存在文件夹中

参考博客:Faster R-CNN 运行、训练及测试自己的数据集

你可能感兴趣的:(Faster RCNN训练自己的数据集)