引言:
开始看faster r-cnn的过程是这样的,想看自然场景文本检测,然后查到了CTPN,CTPN是基于Fast R-CNN的RPN进行的改进,然后就开始看Faster r-cnn,大牛写的论文根本看不懂,看了一遍论文只能朦朦胧胧有点印象这东西大概是搞什么的,遇到没见过的名词就查,刚开始有以下几个,
Q1:Regin proposal中的proposal:即比较可能是物体的一个区域
Q2:R-CNN:Region based CNN Regions with CNN features
Q3:Faster R-CNN:CNN with RPN(Reigon Proposal Networks)使用CNN计算Proposal用于提取特征的卷积网络同样能用于查找proposal
Q4:感受野:特征能代表的原图的像素区域大小,例如说感受野是228,即映射之后的一个特征,代表原图的228*288像素大小的区域。
看了第二遍论文,比第一遍好一些,但仍然有大量疑惑,特别是具体是如何做的。怎么办?查。先后看了以下几个链接:
https://zhuanlan.zhihu.com/p/31426458一文读懂Faster RCNN
我自己的实践表明,如果一点都不懂,仅凭这一文根本读不懂。如果源代码读完了,确实读这一文就能读懂了。但不是因为读这一文读懂了。
http://www.telesens.co/2018/03/11/object-detection-and-classification-using-r-cnns/Object Detection and Classification using R-CNNs,外国人写的,应该是最详细的一篇,比上面那个一文读懂还要详细,但问题主要有以下几点:英文的,名词用的不太一样,代码是pytorch的,
https://www.jianshu.com/p/71fbb3251cbfFaster R-CNN原理详解(基于keras代码)
这个涉及到代码的讲解了,但是没有写完,而且代码和原理一起讲,有点乱
http://geyao1995.com/archives/page/3/
这个博客里有对keras版本的详细讲解,相对来说比较详细了,但缺点是老子自己吭哧吭哧看了3天刚把代码看完了才发现这个博客,早发现的话估计1天就看完了。
代码看完了再回过头来看上面那些原理讲解就很清晰了,看原论文也知道作者在讲什么了,因此如果有质量比较好的源代码应该先源代码,然后再结合着看详解。
解析代码:https://github.com/yiqisetian/Keras-FasterRCNN,这个代码来源于https://github.com/you359/Keras-FasterRCNN
里面有一些韩语注释,难道说是棒子写的?
完整的能运行的代码目录如下:

其中config.pickle是运行脚本之后保存的配置文件,vgg16的权重文件需要自己下载,VOC2012也需要自己下载,test.py没有用,其他都是原始的代码。
train_frcnn.py是用于训练的,keras_frcnn文件夹里面存放的是实现faster r-cnn所用到的各种类和方法。
一、引入模块
from __future__ import division
import random
import pprint
import sys
import time
import numpy as np
from optparse import OptionParser#python命令解析模块,注意:从2.7版本后不再使用:optparse模块不推荐使用,python不再更新该模块,后续的发展将推荐使用argparse模块。
import pickle
import os
import tensorflow as tf
from keras import backend as K
from keras.optimizers import Adam, SGD, RMSprop
from keras.layers import Input
from keras.models import Model
from keras_frcnn import config, data_generators
from keras_frcnn import losses as losses
import keras_frcnn.roi_helpers as roi_helpers
from keras.utils import generic_utils
from keras.callbacks import TensorBoard
二、解析命令参数
# tensorboard
def write_log(callback, names, logs, batch_no):
for name, value in zip(names, logs):
summary = tf.Summary()
summary_value = summary.value.add()
summary_value.simple_value = value
summary_value.tag = name
callback.writer.add_summary(summary, batch_no)
callback.writer.flush()
sys.setrecursionlimit(40000)#设置python最大递归深度
parser = OptionParser()#声明一个OptionParser对象
parser.add_option("-p", "--path", dest="train_path", help="Path to training data.")#训练集路径
parser.add_option("-o", "--parser", dest="parser", help="Parser to use. One of simple or pascal_voc",
default="pascal_voc")#指定数据集,pascal_voc或者simple
parser.add_option("-n", "--num_rois", dest="num_rois", help="Number of RoIs to process at once.", default=300)
parser.add_option("--network", dest="network", help="Base network to use. Supports vgg or resnet50.", default='vgg')
parser.add_option("--hf", dest="horizontal_flips", help="Augment with horizontal flips in training. (Default=false).", action="store_true", default=False)
parser.add_option("--vf", dest="vertical_flips", help="Augment with vertical flips in training. (Default=false).", action="store_true", default=False)
parser.add_option("--rot", "--rot_90", dest="rot_90", help="Augment with 90 degree rotations in training. (Default=f
最低0.47元/天 解锁文章
4127

被折叠的 条评论
为什么被折叠?



