使用fasterRCNN-tf 在GPU上训练自己的数据

使用fasterRCNN-tf在GPU上训练自己的数据

经过之前环境的配置和demo的运行,现在尝试在实验室服务器环境中运行项目数据。使用的之前配置和各种软件在 https://blog.csdn.net/zzyincsdn/article/details/84780511 中已经说明清楚。此处根据具体的数据和代码进行修改工作

预训练模型

进入项目根目录 tf-faster-rcnn,在data文件夹下新建文件夹imagenet_weights用以存储预训练模型。我们使用的预训练模型为VGG16模型。在下载之前先将我们之前使用的output文件夹和包含在其中的软连接删除。

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 ../..

数据格式

此处训练我们需要将数据整理成VOC2007的格式以作为基本的数据集来使用。该数据集由主要三个文件夹以及其中的内容组成:
1、Annotations文件夹
该文件下存放的是xml格式的标签文件,一张图片对应于一个xml文件,xml文件记录了目标区域的坐标和大小,目标类别等相关信息。
2、JPEGImages文件夹
该文件夹下存放的是数据集图片,包括训练集和测试集的图片。
3、ImageSets文件夹
该文件夹下存放了三个文件夹,分别是Layout、Main、Segmentation。目标检测只要使用其中的存放图像数据的Main文件夹。在Main中存储着test.txt, train.txt, trainval.txt, val.txt四个txt文件,文件中记载着训练集测试集等等数据。
需要注意的是,在我们的数据集中图像打好的label标签的格式是这样的:

<?xml version="1.0"?>
-<annotation>
	<folder>JPEGImages</folder>
	<filename>000003.jpg</filename>
	-<size>
		<img_width>1021</img_width>
		<img_height>533</img_height>
		<img_depth>3</img_depth>
	</size>
	-<object>
		<name>100</name>
		<difficult>0</difficult>
	-<bounding_box>
		<x_left_top>16</x_left_top>
		<y_left_top>227</y_left_top>
		<width>992</width>
		<height>292</height>
	</bounding_box>
	</object>
</annotation>

在修改代码的过程中我们需要根据xml文件中的具体内容对代码进行修改,这在修改代码部分的内容中会涉及到。
完成VOC2007的数据集制作后,将其整个文件夹的命名修改为VOC2007,并放在data/VOCdevkit2007/目录下,即在最后的项目数据的路径为tf-faster-rcnn/data/VOCdevkit2007/VOC2007/, 在此目录下,为三个文件夹,即Annotations,JPEGImages,ImageSets。

代码修改

  1. 首先是lib/datasets/pascal_voc.py文件,在代码中把类修改为自己训练的所有分类的类名。
    在这里插入图片描述
    在这里我的数据集中总共是三十类数据,它们在xml中-name这一项的名称都是数字命名,从1到30. 如果你的数据总共有’dog’, ‘cat’, 'people’三类,那么就将这三项填入这一部分代码中。

  2. 之后是lib/datasets/imdb.py文件,在该文件中修改类的数量。
    在这里插入图片描述
    我总共有1~30总共30类图片,所以此处填写数字为30+1=31

  3. 修改tools/demo.py文件,修改类的数量和类的内容
    在这里插入图片描述
    在这里插入图片描述
    第一部分填入所有的类,第二部分是修改类的数量,这里依然是30+1=31

  4. 针对自己数据集的xml的修改lib/dataset/pascal_voc.py
    在该行代码中,对于xml中的bounding-box内容进行了一个读取和转化,但是针对于不同数据集其xml中存储bounding-box信息的方式可能不一致。在源代码中是对bounding-box左上角和右下角两个点的坐标进行读取,而我们实验数据中并不是以该方式存储,而是存储了左上角点的坐标和bounding-box的宽度高度,所以需要进行修改,否则会发生读取数据错误的问题。实际操作中对于不同方式存储的bounding-box,需要进行不同的修改。
    在这里插入图片描述
    在上图修改完成的代码中,我们修改了bounding-box以查找到xml中bounding-box这一部分的数据,接下来读取左上角点的xy坐标,之后将x和y左边分别加上width和height来求得右下角点的坐标(像素中x轴向右为正方向,y轴向下为正方向),同时由于源代码中的boundingbox都是从1开始计数的,所以此处读取进行了减一操作,如果你的数据中有一些图像的bounding-box是从0开始的,即紧贴着图像边缘,那么就不可以减一,会造成训练回归错误。

  5. 还是lib/datasets/imdb.py文件
    在这里插入图片描述
    此处取消减一,理由和上面修改一样。

  6. lib/datasets/voc_eval.py修改对xml的复制函数
    在这里插入图片描述
    在代码中同样是对xml的实际操作进行读取,需要结合自己本身实际的xml标签名称进行修改,同时没有的项目我们需要将它注释掉。在lib/datasets/voc_eval.py中不知上图中出现了,在其他函数中多次出现了bdbox,需要全部修改。

参数调整

  1. 修改experiments/scripts/train_faster_rcnn.sh以及experiments/scripts/test_faster_rcnn.sh文件
    在这里插入图片描述
    此处修改了stepsize和训练步数
  2. 修改lib/model/config.py文件
    此处是修改训练的各项超参数,如学习率,动量等等,此处不进行详解

运行训练

在tf-faster-rcnn根目录下,运行指令

 ./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc vgg16

这里的0是指定在GPU:0上运行,pascal_voc是数据集,vgg16是指定预训练模型
最终的结果出来了,由于数据集过小和迭代步数过少的原因,所以识别率还是很低
在这里插入图片描述

代码调试和实际运行中出现的一些问题

  1. RuntimeWarning: invalid value encountered in log targets_dw = np.log(gt_widths / ex_widths)
    这个问题出现在我将tools/pascal_val.py中的读取xy点坐标中没有取消-1导致的。应该是在训练过程中出现了错误。如果出现了该类问题,每次训练停止,修改完代码之后要将data/cache文件夹删除,否则会重复出现该问题。
  2. KeyError:“xxx” 这种问题出现是你的数据类别没有xxx, 而Annotations中的xml中的name有xxx这一类。所以需要修改代码中包含的类名,覆盖数据集中的全部类名
  3. 训练过程未在GPU上运行
    这个问题是由于笔者在使用conda配置环境时,安装的不是tensorflow-gpu而是普通的tensorflow,导致代码一直在CPU上运行,效率很低而且速度极慢。conda卸载tensorflow再安装gpu版本的之后该问题得到了解决

下一步计划

本实验中只将全部数据集的约1/6拿出来进行了训练,下一步预计将全部数据拿出来训练,同时尝试通过调整训练次数和超参数来提升准确率。

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值