本次为在上一次运行实现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个,所以效果很差: