Faster_R_CNN源码详细解析
Faster R-CNN整体架构
- 首先使用共享卷积层为全图提取特征feature maps
- 将得到的feature maps送入RPN,RPN会产生接近两千个候选框proposals
- RoI Pooling Layer根据RPN的输出在feature map上面找到proposals对应的对应区域也就是ROI(region of interest),对不同大小ROI输出固定大小的feature map
- 使用全连接层(FC Layer)对ROI进行分类,并对proposals进行根据类别做相应的矫正,比如人的话,尽可能矫正成一个竖向的矩形框,对车的话,尽可能矫正成一个横向的矩形框。
根据源码对Faster R-CNN进行详解
数据预处理
对原有数据集的所有图片进行水平翻转,并计算翻转后的目标框gt(ground truth)新的位置
读取一张图片
将图片缩放到最小的边为600像素,计算缩放比例im_scales
对RGB三个通道减去各自均值,使像素有正有负
对所有gt的4各坐标信息(x,y,w,h)也按im_scales缩放,并记录box的类别号
提取特征图
图片经过VGG-16直到conv5_3卷积层,提取feature maps,称为bottom
构建RPN网络
计算anchor boxs在原图的位置
因为原图经过VGG-16的4层2*2的池化层宽高都缩小16倍,将原本图片的面积去除以16得到bottom的宽width和 高height
bottom上的一个坐标点称为anchor(对应到原图16*16的区域),为了尽可能的框住目标,设定了9种anchor boxs形状,如下:
计算9种anchor boxs在原图的上的相对坐标(x1,y1,y2,y2)(分别对应左上角和右下角),anchor boxs大小只跟bottom的宽高、anchor box预设的面积大小、宽高比有关,(x1,y1,y2,y2)和(x,y,w,h)可以相互转换
根据anchor的映射到原图的坐标,计算所有anchor boxs在原图的坐标
进行前景、背景分类和anchor boxs偏移量的预测
对bottom进行3*3的卷积,这样做的目是进一步集中特征信息,将结果走分类、回归两条路线
预测每个anchor box的分别属于前景、背景的概率
- 一条用1*1的卷积核卷积输出(batch_size,hight,wedth,18)接着reshape成(batch_size,9*hight,wedth,2),代替全连接层,并不会减少参数的数量,但是使得输入图像的尺寸可以更加灵活
- 用softmax通过每一个anchor来预测对应的9个anchor boxs各自属于前景、背景的概率分别是多少
- 改变回(batch_size,hight,wedth,18)的形状,18对应一个anchor对应的9个anchor boxs分别属于前景、背景的概率值
预测每个anchor box与它对应的gt的偏移量(tx,ty,tw,th),用1*1的卷积核卷积计算anchor boxs与它对应的gt box的偏移量(tx,ty,tw,th),输出(batch_size,hight,wedth,36),36对应一个anchor对应的9个anchor boxs的4个偏移量(tx,ty,tw,th)
提候选框proposals
通过RPN计算得到anchors boxs的偏移量对anchor boxs进行修正
切掉anchors boxs超过原图边界的部分
根据anchors boxs预测属于正例的概率进行倒排取topN(12000)个
对保留下来的anchors boxs进行非极大值抑制,两个重叠比例(IOU)>0.7只保留属于正例的概率大的
取保留下来的anchors的topN,如果超过2000个那么只保留2000个
训练RPN
将所有的anchors boxs中超出边界的anchors boxs过滤掉
将保留下来的每一个anchors box与原图中的每一个gt计算IOU
计算保留下来的每一个anchors box与IOU的最大的gt的真实偏移量(tx*,ty*,tw*,th*)
将与gt的IOU>0.7作为正例
将得到那些与任意一个gt的IOU最大的anchors boxs,作为正例(以防没有与gt的IOU>0.7,那样就没正例)
将与gt的IOU<0.3作为负例
总共取256个正负例样本,如果正例太多,就随机取128,如果不够就用负例来凑。如果负例太多,就随机取128,如果不够就用正例来凑
计算分类损失:计算256正负例样本的交叉熵除以256
计算回归损失:计算正例样本的真实偏移量与预测偏移量之差的smooth L1 损失除以256
按一定权重加和分类损失和回归损失。
Fast R-CNN网络
预测
将proposals 从原图映射到bottom上面
ROI池化,将所有proposals 变成7*7
接全链全连接层,将结果走分类、回归两条路线
一条路线,对每一个proposals 进行类别分类
另一条路线,对每一个proposal与对应的gt的偏移量进行预测(tx,ty,tw,th)
对每一个proposals 进行矫正,并输出目标框、所属类别
训练最终分类
拿到2000个proposals与原图中的每一个gt计算IOU
得到每一个proposals最有可能的类别号
IOU大于等于0.5,为正例,IOU小于0.5并大于等于0.1,为负例,
正负例取1:3,共256个, 如果正例超过64个,随机取64个,不够拿负例来凑。
取得256个样本的类别号,背景的类别号是0,其他有各自对应的类别号
计算256样本的proposals与gt 真实偏移量(tx*,ty*,tw*,th*)
将除背景以外的真实偏移量按类别分开,计算损失的时候,按类别去计算真实的和预测的偏离量的损失,模型就会学习到该类别的特有的矫正方式,比如人的话,尽可能矫正成一个竖向的矩形框,对车的话,尽可能矫正成一个横向的矩形框。
计算分类损失:计算256正负例样本的交叉熵除以256
计算回归损失:计算非背景样本的真实偏移量与预测偏移量之差的smooth L1 损失除以256
按一定权重加和分类损失和回归损失。
补充
用卷积代替全连接
可行性:卷积获取的是局部特征,全连接获取所有的局部特征,如果卷积核大小跟feature map一样大小就可以获取所有的局部特征。
实现过程如下:
全连接层转变成卷积层的操作很简单,只需要使用与上层尺寸一致的卷积核进行卷积运算即可。最终得到的输出层维度是1 x 1 x 4,代表4类输出值,激活函数也是softmax。
卷积替代全连接的优点
对输入分辨率的限制
如果网络后面有全连接层,而全连接层的输入神经元个数就是固定的,那么反推上层卷积层的输出是固定的,继续反推可知输入网络的图片的分辨率是固定的。例如,LetNet由于由全连接层,输入就只能是28 x 28的。那么图片就需要进行resize,这个会改变物体的真实比例,影响模型检测效果。
如果网络中的全连接层都用卷积层替代,网络中只有卷积层,那么网络的输出分辨率是随着输入图片的分辨率而来的,输出图中每一个像素点都对应着输入图片的一个区域(可以用stride,pooling来反算)。解决了v1只支持一种分辨率图片的问题
计算效率比较
假设为了识别图片中所有的数字(为了简单,假设每个数字都是在这个大图划分为14 x 14的网格中),16 x 16 x 3的图片需进行4次,28 x 28 x3的图片需进行64次。而利用卷积操作全链接,则不管原始图片有多大,只需要进行一次CNN正向计算,因为其中共享了很多重复计算部分,这大大节约了运算成本。
保留更多空间信息
全卷积网络的特点就在于输入和输出都是二维的图像,并且输入和输出具有相对应的空间结构,我们可以将网络的输出看作是一张heat-map,用热度来代表待检测的原图位置出现目标的概率,只做一次前向就可以得到所有位置的分类概率。如下图所示:
Faster_R_CNN源码详细解析相关推荐
- spark word2vec 源码详细解析
spark word2vec 源码详细解析 简单介绍spark word2vec skip-gram 层次softmax版本的源码解析 word2vec 的原理 只需要看层次哈弗曼树skip-gram ...
- 20行Python代码爬取2W多条音频文件素材【内附源码+详细解析】新媒体创作必备
大家好,我是辣条. 今天的内容稍显简单,不过对于新媒体创作的朋友们还是很有帮助的,你能用上的话记得给辣条三连! 爬取目标 网站:站长素材 工具使用 开发工具:pycharm 开发环境:python3. ...
- JAVA8 LinkedList 链表源码详细解析
今天突发奇想看了一下LinkedList的源码,还挺有趣的,话不多说,show me the code. 我使用的是IDEA,快捷键仅供参考. 按住Ctrl再点击类名可以进入类的源码,随便写一个含有L ...
- ArrayList源码详细解析(一)
Java ArrayList源码解析(基于JDK 12,对比JDK 8) 自从接触到ArrayList以来,一直觉得很方便,但是从来没有系统.全面的学习了解过ArraryList的实现原理.最近学习了 ...
- Hadoop HDFS创建文件/写数据流程、源码详细解析
HDFS创建文件/写数据源码解析 HDFS HDFS写流程 创建文件源码 客户端 DistributedFileSystem DFSClient DFSOutputStream 客户端/Namenod ...
- golang mutex源码详细解析
目前golang的版本是1.12,其中的mutex是增加了普通模式和饥饿模式切换的优化版本,为了便于理解,这里先从上一个版本1.7版本的mutex开始分析,以后再对优化版本进行说明. Mutex结构说 ...
- 火车轨道铁路轨道检测识别(附带Python源码+详细解析)
现在的网络上,铁轨检测的源码几乎没有,所以自己参照着一篇汽车车道线检测的方法,然后调节参数,实现了铁轨的轨道检测,但现在只能检测直线,弯曲的铁轨检测下一步会实现,实现之后会更新的,敬请期待. 弯轨检测 ...
- HandlerThread原理、使用实例、源码详细解析
0.目录 一.HandlerThread简介 二.HandlerThread原理 三.HandlerThread使用实例 四.HandlerThread源码分析 五.总结 一.HandlerThrea ...
- MJRefresh 源码详细解析
MJRefresh是李明杰老师的作品,到现在已经有9800多颗star了,是一个简单实用,功能强大的iOS下拉刷新(也支持上拉加载更多)控件.它的可定制性很高,几乎可以满足大部分下拉刷新的设计需求,值 ...
最新文章
- 批量 材质 调整_SMT打样小批量加工中的助焊剂是什么
- Java字符串用“。”(点)分隔。
- java打印变量类型,冲刺7天拿下Offer!
- Exynos 4412启动过程(群聊笔记记录)
- 一个简单的pygame接金币游戏
- Qt 多重继承时 moc 编译出错
- TinyXML学习记录及整理
- 设置servlet或action作为欢迎页面
- android 热门开源库,GitHub安卓热门开源资源在项目中的使用及项目总结
- activiti表单设计器_基于Vue,ElementUI开发的一款表单设计器
- 【李宏毅2020 ML/DL】P99-105 Life Long Learning
- Java基本数据类型有哪些
- 刘晓震:新浪博客应用架构分享
- C++--数字转大写金额
- 洛谷P4572 [JSOI2013] 哈利波特与死亡圣器
- 4.python-opencv图像马赛克
- 使用tcgames电脑玩手机游戏助手时卡顿延迟问题解决方案
- ipa包的简单校验方法
- Hypervisor操作系统间的通信技术
- 【最新】CentOS7.8 部署redis6.0.1集群