首先你已经编译好了先决条件,参考https://blog.csdn.net/weixin_43317842/article/details/88553731
接下来,进行faster对自己数据集的训练:
第一:制作自己的数据集,最难受的往往就是数据集的制作
首先,进入你的faster-rcnn根目录下:cd data
1,创建VOCdevkit2007文件夹(若你已经跑过voc数据集了则忽略):mkdir VOCdevkit2007
2,进入该文件夹创建VOC2007文件夹:cd VOCdevkit2007
mkdir VOC2007
3,再进入该文件夹按照如下创建:
Annotations存放由labelImg工具制作的xml文件(labelImg:https://blog.csdn.net/xunan003/article/details/78720189)
JPEGImages存放你的原图,即你要进行训练的所有图片
ImageSets下创建一个Main文件夹:然后再创建如下文本
这些txt文件对应你的图片,按如下脚本生成,你也可以改动:
import os
import random
trainval_percent = 0.66
train_percent = 0.5
xmlfilepath = "/home/ff/py-faster-rcnn/data/VOCdevkit/VOC2007/Annotations"
txtsavepath = "/home/ff/py-faster-rcnn/data/VOCdevkit/VOC2007/ImageSets/Main"
total_xml = os.listdir(xmlfilepath)
num=len(total_xml)
list=range(num)
tv=int(num*trainval_percent)
tr=int(tv*train_percent)
trainval= random.sample(list,tv)
train=random.sample(trainval,tr)
ftrainval = open('/home/ff/py-faster-rcnn/data/VOCdevkit/VOC2007/ImageSets/Main/trainval.txt', 'w')
ftest=open('/home/ff/py-faster-rcnn/data/VOCdevkit/VOC2007/ImageSets/Main/test.txt', 'w')
ftrain = open('/home/ff/py-faster-rcnn/data/VOCdevkit/VOC2007/ImageSets/Main/train.txt', 'w')
fval = open('/home/ff/py-faster-rcnn/data/VOCdevkit/VOC2007/ImageSets/Main/val.txt', 'w')
for i in list:
name=total_xml[i][:-4]+'\n'
if i in trainval:
ftrainval.write(name)
if i in train:
ftrain.write(name)
else:
fval.write(name)
else:
ftest.write(name)
print "Everything done!"
ftrainval.close()
ftrain.close()
fval.close()
ftest .close()
至此,voc格式文件制作完成。
二,修改训练脚本(本次用vgg16来训练)
打开/py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_end2end/train.prototxt:
修改‘input-data’层的’num_class‘为你的(类别数+1)
'roi-data’层的’num_class’为你的(类别数+1)
"cls_score"的’num_out’为你的(类别数+1)
修改"bbox_pred"层的’num_output’为(数据集类别数+1)*4
三,修改测试脚本
打开/py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_end2end/test.prototxt:
修改"cls_score"的’num_out’为你的(类别数+1)
修改"bbox_pred"层的’num_output’为(数据集类别数+1)*4
—solver.prototxt根据自己情况修改,如我迭代次数为10000,所以只修改了stepsize为6000
四,修改/py-faster-rcnn/lib/datasets/pascal_voc.py中的约33行处的:
self.class=里面的不要类别删去,留下你自己的类别,背景类别不要删除
五,在/py-faster-rcnn/tools/train_net.py中,可以为其中的命令行参数设置默认值,这样就不用每次训练时都在命令行设置多个参数了,下面是我设置的默认值:
def parse_args():
"""
Parse input arguments
"""
parser = argparse.ArgumentParser(description='Train a Fast R-CNN network')
parser.add_argument('--gpu', dest='gpu_id',
help='GPU device id to use [0]',
default=0, type=int)
parser.add_argument('--solver', dest='solver',
help='solver prototxt',
default='models/pascal_voc/VGG16/faster_rcnn_end2end/solver.prototxt', type=str)
parser.add_argument('--iters', dest='max_iters',
help='number of iterations to train',
default=10000, type=int)
parser.add_argument('--weights', dest='pretrained_model',
help='initialize with pretrained model weights',
default='data/imagenet_models/VGG16.v2.caffemodel', type=str)
parser.add_argument('--cfg', dest='cfg_file',
help='optional config file',
default='experiments/cfgs/faster_rcnn_end2end.yml', type=str)
parser.add_argument('--imdb', dest='imdb_name',
help='dataset to train on',
default='voc_2007_trainval', type=str)
parser.add_argument('--rand', dest='randomize',
help='randomize (do not use a fixed seed)',
action='store_true')
parser.add_argument('--set', dest='set_cfgs',
help='set config keys', default=None,
nargs=argparse.REMAINDER)
if len(sys.argv) == 1:
parser.print_help()
sys.exit(1)
args = parser.parse_args()
return args
另外可能需要修改的是/py-faster-rcnn/lib/fast_rcnn/config.py中的__C.TRAIN.SNAPSHOT_ITERS参数,它确定了你的模型每训练多少次保存一次快照,源码设置的是10000,根据自己设置的最大迭代次数来合理修改(它的值当然不能大于最大迭代次数,不然训练了半天一个模型都没保存)。
六,修改demo.py(tools目录下)
将训练得到的模型复制到/py-faster-rcnn/data/faster_rcnn_models/目录下。
然后打开demo.py,将:
class修改为自己的类别
NETS改为自己的模型
prototxt改为
prototxt = os.path.join(cfg.MODELS_DIR, NETS[args.demo_net][0],
'faster_rcnn_end2end', 'test.prototxt')
im_names里改为自己要测试的图片。
以上工作都完成之后,进行训练:
python ./tools/train_net.py --gpu 0
训练完成后,进行测试:
python ./tools/demo.py