0
点赞
收藏
分享

微信扫一扫

CPU下配置Faster_RCNN以及训练自己的数据集

boom莎卡拉卡 2022-04-04 阅读 56

CPU下Faster-RCNN环境配置以及训练自己的数据集

环境

  • Ubuntu16.04
  • python 2.7
  • tensorflow1.7.0

下载源码

git clone https://github.com/endernewton/tf-faster-rcnn.git

修改配置

  • 1修改lib/setup.py

    • 将__C.USE——GPU——NMSTRUE 修改为 **C.USE——GPU——NMSTRUE**
  • 2修改lib/model/nms_wrapper.py

    • 按照下图注释掉两处
    • 图1
  • 修改lib/setup.py

    • 注释三处,如下图
    • 图2
    • 图3
    • 图4
    • 注释需一行一行注释
  • 编译lib

    • 在lib目录打开终端,输入:

      make clean
      make
      
      

    * 每次修改lib目录下文件后需重新编译 **

  • 安装Python COCO API,使用COCO数据库,在data目录下输入

    git clone https://github.com/pdollar/coco.git
    cd coco/PythonAPI
    make
    
    

运行DEMO

  • 下载与训练模型

    • 下载模型 voc_0712_80k-110k.tgz,下载地址
    • 需要科学上网下载
    • 解压得到voc_2007_trainval+voc_2012_trainval文件夹
  • 建立预训练模型的软连接,主文件目录下进行

    NET=vgg16
    
    TRAIN_IMDB=voc_2007_trainval    +voc_2012_trainval
    
    mkdir -p output/{NET}/{TRAIN_IMDB}
    
    cd output/{NET}/{TRAIN_IMDB}
    
    ln -s ../../../data/voc_2007_trainval+voc_2012_trainval ./default
    
    

  • 由于默认采用res101模型,而我们下载的模型为VGG16,所以需要修改tools/demo.py文件,将默认模型修改为vgg16

    • 打开tools/demo.py

    • 修改方法parse_args()

    • def parse_args():
          """Parse input arguments."""
          parser = argparse.ArgumentParser(description='Tensorflow Faster R-CNN demo')
          parser.add_argument('--net', dest='demo_net', help='Network to use [vgg16 res101]',
                              choices=NETS.keys(), default='vgg16')#修改此处
          parser.add_argument('--dataset', dest='dataset', help='Trained dataset [pascal_voc pascal_voc_0712]',
                              choices=DATASETS.keys(), default='pascal_voc_0712')
          args = parser.parse_args()
      
          return args
      
  • 运行 ./tools/demo.py

    • 如果正确会显示如图:
    • 图5
    • 图6

测试模型

  • 下载与训练模型
    • 在主目录下运行
NET=vgg16
TRAIN_IMDB=voc_2007_trainval+voc_2012_trainval
mkdir -p output/${NET}/${TRAIN_IMDB}
cd output/${NET}/${TRAIN_IMDB}
ln -s ../../../data/voc_2007_trainval+voc_2012_trainval ./default
cd ../../..

在主目录下执行

mkdir -p data/imagenet_weights
cd data/imagenet_weights
wget -v http://download.tensorflow.org/models/vgg_16_2016_08_28.tar.gz
tar -xzvf vgg_16_2016_08_28.tar.gz
mv vgg_16.ckpt vgg16.ckpt
cd ../..
  • 下载voc数据集(密码:j8n5),名称已经修改好了
    下载后放到data目录中解压
  • 修改tf-faster-rcnn/lib/datasets/voc_eval.py文件的121行
with open(cachefile, 'wb') as f:  #此处将文件打开方式从w修改为wb
      pickle.dump(recs, f)
  • 测试模型
./experiments/scripts/test_faster_rcnn.sh 0 pascal_voc vgg16

训练你自己的数据集

  • 制作数据集
    • 数据集文件结构
VOC2007
├── Annotations    #图像标签文件,是.xml格式
├── ImageSets   
│   ├── Layout
│   ├── Main    #训练和测试用到的数据文件
│   └── Segmentation
└── JPEGImages   #图像文件
#Layout和Segmentation文件在这里不需要
  • 采用LabelImg进行图像标记,安装教程
  • 这里贴一个对图片批量进行编号的程序
import os
import random
 
trainval_percent = 0.5
train_percent = 0.5
xmlfilepath = '/home/yun/fast/tf-faster-rcnn/data/VOCdevkit2007/VOC2007/Annotations'
txtsavepath = '/home/yun/fast/tf-faster-rcnn/data/VOCdevkit2007/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(txtsavepath + '/trainval.txt', 'w')
ftest = open(txtsavepath + '/test.txt', 'w')
ftrain = open(txtsavepath + '/train.txt', 'w')
fval = open(txtsavepath + '/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()
  • 将图片放在JPEGImages文件夹下,制作出来的xml文件放在Annotations文件夹下,运行上面程序自动生成Main文件夹下txt文件

  • 执行完之后,应该是这样的结构

  • 注意,每次修改Main文件夹下内容需将AnnotationsCache文件夹删除,第一次除外

/ImageSets/Main$ tree
.
├── test.txt
├── train.txt
├── trainval.txt
└── val.txt
  • 替换数据集
    • 提前下好voc数据集,并保存在data/VOCdevkit2007下,那么替换数据就是将自己训练集的Annotations、lmageSets和JPEGlmages文件和原文件替换即可。大家替换数据后,一定要将data/cache中的pkl文件删除,不然不会获得修改后的数据。
  • 在lib/dataset/pascal_voc.py文件中,修改类别参数
self._classes = ('__background__',  # always index 0
                 '#自己的类名'
  • ib 下面的文件修改了之后要重新 make clean 然后在make
  • 修改tf-faster-rcnn/experiments/scripts/train_faster_rcnn.sh中迭代次数,默认为70000,可修改少点
 case ${DATASET} in
 pascal_voc)
   TRAIN_IMDB="voc_2007_trainval"
   TEST_IMDB="voc_2007_test"
   STEPSIZE="[50000]"
   ITERS=70000   #迭代次数
   ANCHORS="[8,16,32]"
   RATIOS="[0.5,1,2]"
   ;;
  • 修改模型参数
    * 进入lib/model/config.py,对config.py进行修改:
    图7
    其中,第一项,就是学习率,STEPSIZE就是你对训练步长的修改,这里一定要小于等于前面训练文件的ITERS参数。其他大家可以选择保持一致,对于动量和伽马参数不用修改,当然,对于训练每隔多少次显示,大家根据自己情况修改,这里是10次一显示。

  • 修改图片尺寸

    • 修改图片尺寸,在lib/model/config.py下修改训练以及测试的图片尺寸
__C.TRAIN.SCALES = (364,)#训练图片短边尺寸
__C.TRAIN.MAX_SIZE = 547#训练图片长边尺寸
__C.TEST.SCALES = (364,)#测试图片短边尺寸
__C.TEST.MAX_SIZE = 547#测试图片长边尺寸
  • 每次修改lib目录下文件后需重新编译
  • 执行训练代码 每次每次训练需将主目录下output文件夹以及data/cache文件夹删除
./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc  vgg16
  • 如果没有报错,即成功训练模型,模型默认位置在output文件夹下

** 使用自己训练的模型进行测试

  • 修改demo.py
    • 修改类名
CLASSES = ('__background__',
           '#自己的类')
* 修改类别数量
 net.create_architecture("TEST", 7,#此处为你的数据集类别数量+1
                          tag='default', anchor_scales=[8, 16, 32])
  • 修改使用模型(将vgg16_faster_rcnn_iter_70000.ckp修改为你刚训练生成的模型,在output文件夹下一般只需修改最后迭代次数即可)
NETS = {'vgg16': ('vgg16_faster_rcnn_iter_70000.ckpt',),'res101': ('res101_faster_rcnn_iter_100.ckpt',)}#其中的100,是我自己的训练设置,个人要根据自己的设置修改,一定要和初始设置的参数一致
  • 修改测试图片
 im_names = ['00197.jpg','00132.jpg']#次数为你想要测试的图片。
  • 如果执行后不显示测试图片,可能原因为你的测试图片中准确率太低,无法达到显示精度要求,可
    • 1.修改显示精度要求
    • 2.换测试图片或加大训练论此,提高模型精度
  • 修改显示最低精度要求
    • tools/demo.py文件里修改
CONF_THRESH = 0.5 #分数达到0.5才会被框选

可能遇到的问题

  • pip 安装失败
    • 可能原因为未指定版本,如tensorflow==1.7.0
    • 提取密码rekz
    • protobuf问题,卸载掉3.18的版本,制定版本安装pip install protobuf==3.17.3
  • Command exited with non-zero status 11
    • 可能原因未修改输入图片的尺寸,导致越界
  • targets_dh = np.log(gt_heights / ex_heights)
    • 检查xml文件下的值,使得xmin>1,ymin>1(大于1不包括等于1),xmax>xmin,ymax>ymin
  • 忘记修改类名
  • 遇到问题多看看Issues

参考文献

  • 1.https://blog.csdn.net/m0_38024766/article/details/90712715
  • 2.https://github.com/endernewton/tf-faster-rcnn
  • 3.https://www.cnblogs.com/zhengmeisong/p/9102059.html
举报

相关推荐

0 条评论