caffe学习三:使用FasterRCNN训练自己的数据

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

caffe学习三:使⽤FasterRCNN训练⾃⼰的数据本⽂假设你已经完成了安装,并可以运⾏demo.py
不会安装且⽤PASCAL VOC数据集的请看另来两篇博客。

caffe学习⼀:
caffe学习⼆:py-faster-rcnn配置运⾏faster_rcnn_end2end-VGG_CNN_M_1024 (Ubuntu16.04)
⼀般上⾯两个操作你实现了,使⽤Faster RCNN训练⾃⼰的数据就顺⼿好多。

第⼀步:准备⾃⼰的数据集
(1). ⾸先,⾃⼰的数据集(或⾃⼰拍摄或⽹上下载)分辨率可能太⼤,不利于训练,通过⼀顿操作把他们缩⼩到跟VOC⾥的图⽚差不多⼤⼩。

在/py-faster-rcnn/data/VOCdevkit2007/VOC2007 (找到你⾃⼰⽂件相对应的⽬录),新建⼀个python⽂件(如命名为trans2voc_format.py)把以下内容粘贴复制进去,然后执⾏该python⽂件即可对你的图⽚进⾏裁剪缩放等操作:
#coding=utf-8
import os #打开⽂件时需要
from PIL import Image
import re
Start_path='./JPEGImages/' # 唯⼀⼀处需要修改的地⽅。

把对应的图⽚⽬录换成你的图⽚⽬录。

iphone5_width=333 # 图⽚最⼤宽度
iphone5_depth=500 # 图⽚最⼤⾼度
list=os.listdir(Start_path)
#print list
count=0
for pic in list:
path=Start_path+pic
print path
im=Image.open(path)
w,h=im.size
#print w,h
#iphone 5的分辨率为1136*640,如果图⽚分辨率超过这个值,进⾏图⽚的等⽐例压缩
if w>iphone5_width:
print pic
print "图⽚名称为"+pic+"图⽚被修改"
h_new=iphone5_width*h/w
w_new=iphone5_width
count=count+1
out = im.resize((w_new,h_new),Image.ANTIALIAS)
new_pic=re.sub(pic[:-4],pic[:-4]+'_new',pic)
#print new_pic
new_path=Start_path+new_pic
out.save(new_path)
if h>iphone5_depth:
print pic
print "图⽚名称为"+pic+"图⽚被修改"
w=iphone5_depth*w/h
h=iphone5_depth
count=count+1
out = im.resize((w_new,h_new),Image.ANTIALIAS)
new_pic=re.sub(pic[:-4],pic[:-4]+'_new',pic)
#print new_pic
new_path=Start_path+new_pic
out.save(new_path)
print 'END'
count=str(count)
print "共有"+count+"张图⽚尺⼨被修改"
(2).图⽚有了,然后我们需要对图⽚进⾏重命名(理论上来说你不重命名来说也没影响)。

同样在/py-faster-rcnn/data/VOCdevkit2007/VOC2007 (找到你⾃⼰⽂件相对应的⽬录),新建⼀个python⽂件(如命名为pic_rename.py)
把以下内容粘贴复制进去,然后执⾏该⽂件,就可以把图⽚重命名(如你有⼀百张图⽚,则会重命名为:000001~0001000):
# coding=utf-8
import os # 打开⽂件时需要
from PIL import Image
import re
class BatchRename():
def __init__(self):
self.path = './JPEGImages' # 同样(也是),把图⽚路径换成你的图⽚路径
def rename(self):
filelist = os.listdir(self.path)
total_num = len(filelist)
i = 000001 # 还有这⾥需要注意下,图⽚编号从多少开始,不要跟VOC原本的编号重复了。

n = 6
for item in filelist:
if item.endswith('.jpg'):
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) + '.jpg')
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()
(3). 然后需要对图⽚进⾏⼿动标注,建议使⽤labelImg⼯具,简单⽅便。

下载地址:https:///tzutalin/labelImg
使⽤⽅法特别简单,设定xml⽂件保存的位置,打开你的图⽚⽬录,然后⼀幅⼀幅的标注就可以了
(借⽤参考链接第⼆条的⼀张图)
把所有图⽚⽂件标准完毕,并且⽣成了相对应的.xml⽂件。

接下来,来到voc207这⾥,把原来的图⽚和xml删掉(或备份),位置分别是:
/home/py-faster-rcnn/data/VOCdevkit2007/VOC2007/JPEGImages
/home/py-faster-rcnn/data/VOCdevkit2007/VOC2007/Annotations
删掉是因为我们不需要别的数据集,只想训练⾃⼰的数据集,这样能快⼀点
(4)数据和图⽚就位以后,接下来⽣成训练和测试⽤需要的txt⽂件索引,程序是根据这个索引来获取图像的。

在/py-faster-rcnn/data/VOCdevkit2007/VOC2007 (找到你⾃⼰⽂件相对应的⽬录),新建⼀个python⽂件(如命名为xml2txt.py)把以下内容粘贴复制进去,然后执⾏该python⽂件即可⽣成索引⽂件:
# !/usr/bin/python
# -*- coding: utf-8 -*-
import os
import random
trainval_percent = 0.8 #trainval占⽐例多少
train_percent = 0.7 #test数据集占⽐例多少
xmlfilepath = 'Annotations'
txtsavepath = '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('ImageSets/Main/trainval.txt', 'w')
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')
fval = open('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)
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
⽣成的索引⽂件在这
以上,数据准备完毕。

第⼆步,修改源代码:
(1). 修改prototxt配置⽂件
这些配置⽂件都在models下的pascal_voc下。

⾥⾯有三种⽹络结构:ZF、VGG16、VGG_CNN_M_1024,本⽂选择的是VGG_CNN_M_1024。

每个⽹络结构中都有三个⽂件夹,分别是faster_rcnn_end2end、faster_rcnn_alt_opt、faster_rcnn。

使⽤近似联合训练,⽐交替优化快1.5倍,并且准确率相近,所以推荐使⽤这种⽅法。

更改faster_rcnn_end2end⽂件夹下的
的train.protxt和test.prototxt。

其中train.prototxt⽂件共有四处需要修改(有些⽂章写的是只有三处需要修改,但是通过我的试验
和百度,最终发现有四处需要修改)
第⼀处是input-data层,将原先的21改成:你的实际类别+1(背景),我的⽬标检测⼀共有1类(为了试验⽅便,我只选了⼀类),所以加上背景这⼀类,⼀共2类。

(num_classes: 21, 被我修改为2。

如上图所⽰ )
第⼆处是cls_score层:
(num_output: 21 被我改成了2。

切记,你要根据你的实际类别修改)
第三处是bbox_pred,这⾥需将原来的84改成(你的类别数+1)*4,即(1+1)×4 = 8
还有第四处,roi-data 层(我发现有些博客是没有写这⼀点的,但是如果我没修改这⾥则会报错)
(原先的21被我改成了2)
test.prototxt只需要按照train.prototxt中修改cls_score层以及bbox_pred层即可
(2). 修改lib/datasets/pascal_voc.py,将类别改成⾃⼰的类别
如上图所⽰,我将原本的类别注释掉,换成了⾃⼰的类别,以⽅便⽇后还原。

这⾥有⼀点需要注意的是,这⾥的类别以及你之前的类别名称最好全部是⼩写,假如是⼤写的话,则会报Keyerror的错误。

这时只需要在pascal_voc.py 中的214⾏的.lower()去掉即可(我没试验,因为我的类名⽤的⼩写,所以没有遇到这个问题;
看到别的博客给了这么⼀个答案)
datasets⽬录主要有三个⽂件,分别是
1) factory.py: 这是⼀个⼯⼚类,⽤类⽣成imdb类并且返回数据库供⽹络训练和测试使⽤;
2) imdb.py: 是数据库读写类的基类,封装了许多db的操作;
3) pascal_voc.py Ross⽤这个类操作。

第三步,开始训练
注意:训练前需要将cache中的pkl⽂件以及VOCdevkti2007中的annotations_cache的缓存删掉
1. cd py-faster-rcnn
2. ./experiments/scripts/faster_rcnn_end2end.sh 0 VGG_CNN_M_1024 pascal_voc
第四步,测试结果
训练完成之后,将output中的最终模型拷贝到data/faster_rcnn_models, 修改tools下的demo.py,
我是使⽤VGG_CNN_M_1024这个中型⽹络,不是默认的ZF,所以要修改以下⼏个地⽅:
(1) 修改class
同样的⼿法,将原本的CLASSES注释掉(不建议删除,留在⽅便⽇后还原),新增⾃⼰的CLASSES
(2). 增加你⾃⼰训练的模型
myvgg1024为新增的部分
(3) 修改prototxt(demo.py⽂件的内容), 如果你⽤的是ZF,就不⽤修改了
被注释掉的内容是修改前的,后⾯是我新增的。

(4) 开始检测
1) 把你需要检测的图⽚放在data/demo⽂件夹下
2)demo.py 修改你要检测的图⽚名称
3)执⾏命令
1. cd py-fast-rcnn/tools
2. ./demo.py --net myvgg1024
参考博客
https:///zhaoluruoyan89/article/details/79088621https:///zcy0xy/article/details/79614862
tf-faster rcnn 训练⾃⼰的数据参考博客:https:///qq_34108714/article/details/89335642。

相关文档
最新文档