代码地址: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 运行、训练及测试自己的数据集