背景:faster-rcnn的使用是由于项目上使用,由外协(sjtu)提供的代码包开始。作为一个目标检测领域的baseline算法,值得深入学习。
简介:
Faster RCNN是在SPPnet和Fast RCNN的基础上,为了提升目标区域检测的速度,提出了RPN网络,这是一个全卷积网络,并且与检测网络共享全图卷积网络特征层。Faster RCNN可以简单地看做区域生成网络(RPN)+fast RCNN的系统,用区域生成网络代替fast RCNN中的Selective Search方法。
在GPU上能够打打约5帧每秒的速度,对于PASCAL VOC 2007, 2012, 与 MS COCO 数据集,只需约300个候选区域即可达到很好的识别效果。
论文:
Shaoqing Ren, Kaiming He, Ross Girshick, Jian Sun ,2017《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks》:https://arxiv.org/abs/1506.01497
Xinlei Chen,Abhinav Gupta,《An Implementation of Faster RCNN with Study for Region Sampling》:https://arxiv.org/pdf/1702.02138.pdf
代码
官方matlab版本:https://github.com/shaoqingren/faster_rcnn ,依赖于caffe
matlab版本翻译的python版本:https://github.com/rbgirshick/py-faster-rcnn ,依赖于Caffe 与 pycaffe。
python版本翻译的tensorflow版本:https://github.com/endernewton/tf-faster-rcnn
参考博客:
https://blog.csdn.net/qq_36269513/article/details/80422276 等。
tf版代码使用记录:
(以下内容为外协提供的使用说明,在其基础上做了一些改动,网上应该也都能查到)
一、数据准备
1.将数据集所有标签复制到
‘/tf-faster-rcnn-master/data/VOCdevkit2007/VOC2007/
Annotations’目录下。
2.将数据集所有图片复制到
‘/tf-faster-rcnn-master/data/VOCdevkit2007/VOC2007/JPEGImages’
目录下。
3.将’/tf-faster-rcnn-master/data/VOCdevkit2007/VOC2007/ImageSets/
Main’目录下的test.txt文件、train.txt文件、trainval.txt文件、val.txt文件内容清空。
4.然后,在该目录[’/root/tf-faster-rcnn-master/data’]下执行如下命令:
python generate_sets.py
即生成了随机的训练集train.txt,验证集val.txt,测试集test.txt,以及合并了train.txt和val.txt的trainval.txt文件。
5.打开’/tf-faster-rcnn/lib/datasets/’下的pascal_voc.py(修改类别self.classes[line36]为自己数据集的类别)
6.训练前:
将’/tf-faster-rcnn-master/data/cache中的文件 、
‘/tf-faster-rcnn-master/output/res101/voc_2007_trainval/default’中的上次训练的模型文件删除(非常重要!!!!!)
7.学习率等参数可在/tf-faster-rcnn/lib/model下的config.py文件中进行修改。
8.迭代次数【ITERS 】可在/tf-faster-rcnn/experiments/scripts中的train_faster_rcnn.sh文件中进行修改。
9.检查一下显卡情况:执行命令:
nvidia-smi
查看GPU使用情况,使用内存剩余较多的显卡。
二、开始训练:
10.进入tf-faster-rcnn-master目录,执行:
./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc res101
注----格式为:
#./experiments/scripts/faster_rcnn.sh GPU DATASET NET
另外,
DATASET的选项见experiments/scripts/train_faster_rcnn.sh文件[pascal_voc或pascal_voc_0712或coco],
NET的选项见tf-faster-rcnn-master/tools/train_val.py
[train_net.py, Vgg16,res50,res101,res152,mobile]文件最后。
**注:**生成的模型保存在output目录下,生成的log保存在experiments/logs目录下面。
三、测试过程:
11.进入tf-faster-rcnn-master目录,执行:
./experiments/scripts/test_faster_rcnn.sh 0 pascal_voc res101
注意: 跑测试利用的是训练生成的模型,所以一定要打开上述文档看一下调用的模型是不是想用的那个模型!
四、跑DEMO测试其他图片:
12.进入tf-faster-rcnn目录,执行:
python tools/demo.py
注意:第148行的类别数要与pascal_voc.py统一,
即[ net.create_architecture(“TEST”,]后面的数字
改一下文档中的测试图片及其路径!注意一下调用的模型是哪个!
在用不同迭代参数训练后,demo测试时除了更改类别参数,还要更改模型名称,
tfmodel=’/。。。/tf-faster-rcnn-master/output/res101/voc_2007_trainval/default/res101_faster_rcnn_iter_70000.ckpt’ #model path
测试图片的名字(.txt)以及路径(IMAGEJPEG)
generates_set.py
#generates_set.py
import os
import random
import math
filepath='/media/linux_data/tf-faster-rcnn-master/data/VOCdevkit2007/VOC2007/Annotations'
savepath='/media/linux_data/tf-faster-rcnn-master/data/VOCdevkit2007/VOC2007/ImageSets/Main/'
train_percent=0.7 #percentage of train
val_percent=0.1 #percentage of val
dirs = os.listdir(filepath)
for i in range(len(dirs)):
dirs[i]=dirs[i].split('.')[0]
random.shuffle(dirs)
numOftrain = int(math.floor(len(dirs)*train_percent))
numOfval = int(math.floor(len(dirs)*val_percent))
f = open(savepath+'train.txt','w')
for i in range(numOftrain):
f.write(dirs[i]+'\n')
f.close()
f = open(savepath+'val.txt','w')
for i in range(numOftrain, numOftrain+numOfval):
f.write(dirs[i]+'\n')
f.close()
f = open(savepath+'test.txt','w')
for i in range(numOftrain+numOfval,len(dirs)):
f.write(dirs[i]+'\n')
f.close()
#newly added
f = open(savepath+'trainval.txt','w')
for i in range(numOftrain+numOfval):
f.write(dirs[i]+'\n')
f.close()
暂时记录到这里,后面有空再补充。