win7 +cpu faster_rcnn 训练自己的数据

1.数据准备

1.1 删除“/VOCdevkit/VOC2007”文件夹下所有文件,新建三个文件夹,名字分别为:JPEGImages,Annotations和ImageSets

其中JPEGImages存放图片数据,Annotations存放标记xml文件,ImageSets文件夹下新建三个文件夹,Layout,Main,Segmentations。

1.2JPEGImages文件夹下图片需按顺序排列,批量修改文件名代码如下

import os
path = "E:\\image"
filelist = os.listdir(path) #该文件夹下所有的文件(包括文件夹)
count=0
for file in filelist:
    print(file)
for file in filelist:   #遍历所有文件
    Olddir=os.path.join(path,file)   #原来的文件路径
    if os.path.isdir(Olddir):   #如果是文件夹则跳过
        continue
    filename=os.path.splitext(file)[0]   #文件名
    filetype=os.path.splitext(file)[1]   #文件扩展名
    Newdir=os.path.join(path,str(count).zfill(6)+filetype)  #用字符串函数zfill 以0补全所需位数
    os.rename(Olddir,Newdir)#重命名
    count+=1

 注意:当最后一行count+=1 没有在代码中的位置时,会出现上述错误

1.3.生成四个文件:trainval.txt,test.txt,train.txt,val.txt,将这四个文件复制到刚刚建立的Layout,Main两个文件夹中。

生成txt文件

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修改类别

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

self._classes = ('__background__',  # always index 0
                     '自己的类名称')

      修改成自己的类别

  2.2 .lib/datasets/imdb.py  (第22行0改为2(有几类改成几类))

class imdb(object):
  """Image database."""

  def __init__(self, name, classes=None):
    self._name = name
    #self._num_classes = 0
    self._num_classes = 2
    if not classes:
      self._classes = []
    else:
      self._classes = classes

   2.3.为了大家测试demo.py的方便,所以大家也把tools/demo.py中的类别改成自己的类别

self._classes = ('__background__',  # always index 0
                     '自己的类名称')
    net.create_architecture("TEST", 2,
                          tag='default', anchor_scales=[8, 16, 32])
    saver = tf.train.Saver()
    saver.restore(sess, tfmodel)

    类别数量也要改

  2.4.修改参数

   这里大家根据自己的计算,选择合适的迭代次数以及学习率等, 个人认为,初试学习率0.001,如果不收敛再减小一个量

   2. 4.1首先在experiments/scripts/faster_rcnn_end2end.sh文件中修改迭代次数:

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

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

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

2.4.2

进入lib/fast_rcnn/config.py,对config.py进行修改:

# 学习率
__C.TRAIN.LEARNING_RATE = 0.001

# Momentum 动量
__C.TRAIN.MOMENTUM = 0.9

# Weight decay, for regularization
__C.TRAIN.WEIGHT_DECAY = 0.0001

# Factor for reducing the learning rate  伽马
__C.TRAIN.GAMMA = 0.1

# Step size for reducing the learning rate, currently only support one step
#__C.TRAIN.STEPSIZE = [30000]
__C.TRAIN.STEPSIZE = [5]  #训练步长

# Iteration intervals for showing the loss during training, on command line interface
__C.TRAIN.DISPLAY = 10   #显示的次数




# The number of snapshots kept, older ones are deleted to save space
__C.TRAIN.SNAPSHOT_KEPT = 3  #保存模型的数量



# Minibatch size (number of regions of interest [ROIs])
__C.TRAIN.BATCH_SIZE = 64 #batch大小
#__C.TRAIN.BATCH_SIZE = 128


# Iterations between snapshots 每迭代多少次保存一次模型
__C.TRAIN.SNAPSHOT_ITERS = 5

 

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

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

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

 
2.4.删除标记缓存

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

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

2.5将生成的loss保存起来

   train_val.py中增加

 with open('..//loss.txt','a',encoding='utf-8') as f:  
   f.write(total_loss.astype(str)+'\n')

 

3.错误总结

训练自己的模型,报错ZeroDivisionError。

assert(cfg.TRAIN.BATCH_SIZE % num_images == 0), \ ZeroDivisionError: integer

解决方式
首先检查./data/VOCdevkit2007/VOC2007/ImageSets/Main路径下的train.txt和test.txt文件不为空。
删除缓存文件,data/VOCdevkit/cache和data/cache/文件。
get zero division errors #160

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值