在Tensorflow下Faster RCNN训练自己的数据集(一)

本次为在上一次运行实现Faster RCNN的基础上训练自己的数据集,得到训练模型。

本次所使用的源码为:https://github.com/endernewton/tf-faster-rcnn

一、下载Github代码

本人本次使用的为https://github.com/endernewton/tf-faster-rcnn,可通过以下代码直接下载:

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

二、更改配置

cd ~/tf-faster-rcnn/lib
 
vim setup.py
 

因为本人使用的服务器为GTX 1080,因此改为sm_61,大家可以通过nvidia-smi查看自己电脑的GPU配置。

三、编译

在上一步那个lib 文件夹中进行:

​
make clean
 
make
 
cd ..

​

四、安装COCO API

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

五、下载数据

1、Download the training, validation, test data and VOCdevkit

wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar

2、Extract all of these tars into one directory named VOCdevkit

tar xvf VOCtrainval_06-Nov-2007.tar
tar xvf VOCtest_06-Nov-2007.tar
tar xvf VOCdevkit_08-Jun-2007.tar

3、It should have this basic structure

$VOCdevkit/                           # development kit
$VOCdevkit/VOCcode/                   # VOC utility code
$VOCdevkit/VOC2007                    # image sets, annotations, etc.
# ... and several other directories ...

4、Create symlinks for the PASCAL VOC dataset

cd $FRCN_ROOT/data
ln -s $VOCdevkit VOCdevkit2007

注意,第四步本人并没有采用github上提供的这种方法而是直接把建立好的文件夹复制过来。

六、下载预训练模型

这一步下载需要翻墙往往下载不成功,因此可以在此网盘中下载https://pan.baidu.com/s/1kWkF3fT

下载后放在data目录下进行解压

tar xvf voc_0712_80k-110k.tgz

七、建立预训练模型的软连接

这一步的目的是在tf-faster-rcnn目录下建立output文件夹,并使用软连接来使用预训练模型,使用以下代码这里按照步骤走就行:

NET=res101
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 ../../..

八、demo测试

GPU_ID=01
CUDA_VISIBLE_DEVICES=${GPU_ID} ./tools/demo.py

九、使用训练好的faster模型对数据进行测试。

这里有点地方需要改:首先把 tf-faster-rcnn/lib/datasets/voc_eval.py的第121行的

with open(cachefile,'w') as f

改成:

with open(cachefile,'wb') as f

同时还要把第105行的

  cachefile = os.path.join(cachedir, '%s_annots.pkl' % imagesetfile)

改成:

cachefile = os.path.join(cachedir, '%s_annots.pkl' % imagesetfile.split("/")[-1].split(".")[0])

然后再进行测试:

GPU_ID=01
./experiments/scripts/test_faster_rcnn.sh $GPU_ID pascal_voc_0712 res101

测试结果:

到这里,前面的这些步骤都是在运行源码,以及利用训练好的模型进行测试,其中具体的步骤更细节的描述可以参看本人之前的博客https://blog.csdn.net/hitzijiyingcai/article/details/81347402

接下来为训练自己的数据集。

十、训练模型

首先下载VGG模型,网盘下载地址https://pan.baidu.com/s/1aD0jlYGHhZQeeTvNJy0GGQ,密码:45ef。

在data目录下创建一个imagenet_weights文件夹,解压权重数据并把解压后的vgg_16.ckpt重命名为vgg16.ckpt,因为后面在调用权重数据的时候名字需要对应的上。

可以说到这里就可以进行训练了,但是为了节省时间并排除错误,我把迭代次数只设置了200次,具体操作为:

./experiments/scripts/train_faster_rcnn.sh里的第22行把ITERS=70000改成ITERS=200,

同时把./experiments/scripts/test_faster_rcnn.sh的ITERS也改成200。

注意:因为我使用的是pascal_voc数据集,所以只需要更改对应数据集的ITERS的就行了,训练和测试的都要改,因为在train_faster_rcnn.sh的末尾会执行test_faster_rcnn.sh。

开始训练(这里最后的vgg16就是对应的权重数据,名字要对的上,01是GPU的ID,pascal_voc是训练使用的数据集):

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

训练过程的loss:

训练结果:

可以看到,结果都很差,因为就迭代了200轮。

十一、替换自己的数据

此部分为替换自己的voc格式的数据集,对于此部分的制作大家可以参考本人之前的博客:

https://blog.csdn.net/hitzijiyingcai/article/details/81636455

数据集制作好了之后,就开始替换自己的数据了:

首先,在tf-faster-rcnn/lib/datasets目录下的pascal_voc.py里第36行更改自己的类别,'__background__'切记不可删掉,把后面的原来的20个label换成自己的,不用更改类别数目,也没有地方可以更改。

在这里,由于本人使用的图片格式是png,因此把jpg改成了png。

然后把你的xml文件放置在tf-faster-rcnn/data/VOCdevkit2007/VOC2007/Annotations路径下,记得把原来的删掉;同时把你的png文件放在tf-faster-rcnn/data/VOCdevkit2007/VOC2007/JPEGImages路径下,xml和png替换完了,现在该txt了,把之前matlab生成是四个txt文档放在tf-faster-rcnn/data/VOCdevkit2007/VOC2007/ImageSets/Layout 和 tf-faster-rcnn/data/VOCdevkit2007/VOC2007/ImageSets/Main。

在开始训练之前,还需要把之前训练产生的模型以及cache删除掉,分别在tf-faster-rcnn/output/vgg16/voc_2007_trainval/default路径下和tf-faster-rcnn/data/cache路径下,然后就可以开始训练了:

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

因为我只训练了200轮,而且因为写博客需要,数据总共就18个,所以效果很差:

参考:https://blog.csdn.net/char_QwQ/article/details/80980505

猜你喜欢

转载自blog.csdn.net/hitzijiyingcai/article/details/81808091