Faster R-CNN整体架构

  1. 首先使用共享卷积层为全图提取特征feature maps
  2. 将得到的feature maps送入RPN,RPN会产生接近两千个候选框proposals
  3. RoI Pooling Layer根据RPN的输出在feature map上面找到proposals对应的对应区域也就是ROI(region of interest),对不同大小ROI输出固定大小的feature map
  4. 使用全连接层(FC Layer)对ROI进行分类,并对proposals进行根据类别做相应的矫正,比如人的话,尽可能矫正成一个竖向的矩形框,对车的话,尽可能矫正成一个横向的矩形框。

根据源码对Faster R-CNN进行详解

数据预处理

  1. 对原有数据集的所有图片进行水平翻转,并计算翻转后的目标框gt(ground truth)新的位置

  2. 读取一张图片

  3. 将图片缩放到最小的边为600像素,计算缩放比例im_scales

  4. 对RGB三个通道减去各自均值,使像素有正有负

  5. 对所有gt的4各坐标信息(x,y,w,h)也按im_scales缩放,并记录box的类别号

提取特征图

图片经过VGG-16直到conv5_3卷积层,提取feature maps,称为bottom

构建RPN网络

计算anchor boxs在原图的位置

  1. 因为原图经过VGG-16的4层2*2的池化层宽高都缩小16倍,将原本图片的面积去除以16得到bottom的宽width和 高height

  2. bottom上的一个坐标点称为anchor(对应到原图16*16的区域),为了尽可能的框住目标,设定了9种anchor boxs形状,如下:

  3. 计算9种anchor boxs在原图的上的相对坐标(x1,y1,y2,y2)(分别对应左上角和右下角),anchor boxs大小只跟bottom的宽高、anchor box预设的面积大小、宽高比有关,(x1,y1,y2,y2)和(x,y,w,h)可以相互转换

  4. 根据anchor的映射到原图的坐标,计算所有anchor boxs在原图的坐标

进行前景、背景分类和anchor boxs偏移量的预测

  1. 对bottom进行3*3的卷积,这样做的目是进一步集中特征信息,将结果走分类、回归两条路线

  2. 预测每个anchor box的分别属于前景、背景的概率

    1. 一条用1*1的卷积核卷积输出(batch_size,hight,wedth,18)接着reshape成(batch_size,9*hight,wedth,2),代替全连接层,并不会减少参数的数量,但是使得输入图像的尺寸可以更加灵活
    2. 用softmax通过每一个anchor来预测对应的9个anchor boxs各自属于前景、背景的概率分别是多少
    3. 改变回(batch_size,hight,wedth,18)的形状,18对应一个anchor对应的9个anchor boxs分别属于前景、背景的概率值
  3. 预测每个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

  1. 通过RPN计算得到anchors boxs的偏移量对anchor boxs进行修正

  2. 切掉anchors boxs超过原图边界的部分

  3. 根据anchors boxs预测属于正例的概率进行倒排取topN(12000)个

  4. 对保留下来的anchors boxs进行非极大值抑制,两个重叠比例(IOU)>0.7只保留属于正例的概率大的

  5. 取保留下来的anchors的topN,如果超过2000个那么只保留2000个

训练RPN

  1. 将所有的anchors boxs中超出边界的anchors boxs过滤掉

  2. 将保留下来的每一个anchors box与原图中的每一个gt计算IOU

  3. 计算保留下来的每一个anchors box与IOU的最大的gt的真实偏移量(tx*,ty*,tw*,th*)

  4. 将与gt的IOU>0.7作为正例

  5. 将得到那些与任意一个gt的IOU最大的anchors boxs,作为正例(以防没有与gt的IOU>0.7,那样就没正例)

  6. 将与gt的IOU<0.3作为负例

  7. 总共取256个正负例样本,如果正例太多,就随机取128,如果不够就用负例来凑。如果负例太多,就随机取128,如果不够就用正例来凑

  8. 计算分类损失:计算256正负例样本的交叉熵除以256

  9. 计算回归损失:计算正例样本的真实偏移量与预测偏移量之差的smooth L1 损失除以256

  10. 按一定权重加和分类损失和回归损失。

Fast R-CNN网络

预测

  1. 将proposals 从原图映射到bottom上面

  2. ROI池化,将所有proposals 变成7*7

  1. 接全链全连接层,将结果走分类、回归两条路线

  2. 一条路线,对每一个proposals 进行类别分类

  3. 另一条路线,对每一个proposal与对应的gt的偏移量进行预测(tx,ty,tw,th)

  4. 对每一个proposals 进行矫正,并输出目标框、所属类别

训练最终分类

  1. 拿到2000个proposals与原图中的每一个gt计算IOU

  2. 得到每一个proposals最有可能的类别号

  3. IOU大于等于0.5,为正例,IOU小于0.5并大于等于0.1,为负例,

  4. 正负例取1:3,共256个, 如果正例超过64个,随机取64个,不够拿负例来凑。

  5. 取得256个样本的类别号,背景的类别号是0,其他有各自对应的类别号

  6. 计算256样本的proposals与gt 真实偏移量(tx*,ty*,tw*,th*)

  7. 将除背景以外的真实偏移量按类别分开,计算损失的时候,按类别去计算真实的和预测的偏离量的损失,模型就会学习到该类别的特有的矫正方式,比如人的话,尽可能矫正成一个竖向的矩形框,对车的话,尽可能矫正成一个横向的矩形框。

  8. 计算分类损失:计算256正负例样本的交叉熵除以256

  9. 计算回归损失:计算非背景样本的真实偏移量与预测偏移量之差的smooth L1 损失除以256

  10. 按一定权重加和分类损失和回归损失。

补充

用卷积代替全连接

可行性:卷积获取的是局部特征,全连接获取所有的局部特征,如果卷积核大小跟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源码详细解析相关推荐

  1. spark word2vec 源码详细解析

    spark word2vec 源码详细解析 简单介绍spark word2vec skip-gram 层次softmax版本的源码解析 word2vec 的原理 只需要看层次哈弗曼树skip-gram ...

  2. 20行Python代码爬取2W多条音频文件素材【内附源码+详细解析】新媒体创作必备

    大家好,我是辣条. 今天的内容稍显简单,不过对于新媒体创作的朋友们还是很有帮助的,你能用上的话记得给辣条三连! 爬取目标 网站:站长素材 工具使用 开发工具:pycharm 开发环境:python3. ...

  3. JAVA8 LinkedList 链表源码详细解析

    今天突发奇想看了一下LinkedList的源码,还挺有趣的,话不多说,show me the code. 我使用的是IDEA,快捷键仅供参考. 按住Ctrl再点击类名可以进入类的源码,随便写一个含有L ...

  4. ArrayList源码详细解析(一)

    Java ArrayList源码解析(基于JDK 12,对比JDK 8) 自从接触到ArrayList以来,一直觉得很方便,但是从来没有系统.全面的学习了解过ArraryList的实现原理.最近学习了 ...

  5. Hadoop HDFS创建文件/写数据流程、源码详细解析

    HDFS创建文件/写数据源码解析 HDFS HDFS写流程 创建文件源码 客户端 DistributedFileSystem DFSClient DFSOutputStream 客户端/Namenod ...

  6. golang mutex源码详细解析

    目前golang的版本是1.12,其中的mutex是增加了普通模式和饥饿模式切换的优化版本,为了便于理解,这里先从上一个版本1.7版本的mutex开始分析,以后再对优化版本进行说明. Mutex结构说 ...

  7. 火车轨道铁路轨道检测识别(附带Python源码+详细解析)

    现在的网络上,铁轨检测的源码几乎没有,所以自己参照着一篇汽车车道线检测的方法,然后调节参数,实现了铁轨的轨道检测,但现在只能检测直线,弯曲的铁轨检测下一步会实现,实现之后会更新的,敬请期待. 弯轨检测 ...

  8. HandlerThread原理、使用实例、源码详细解析

    0.目录 一.HandlerThread简介 二.HandlerThread原理 三.HandlerThread使用实例 四.HandlerThread源码分析 五.总结 一.HandlerThrea ...

  9. MJRefresh 源码详细解析

    MJRefresh是李明杰老师的作品,到现在已经有9800多颗star了,是一个简单实用,功能强大的iOS下拉刷新(也支持上拉加载更多)控件.它的可定制性很高,几乎可以满足大部分下拉刷新的设计需求,值 ...

最新文章

  1. 批量 材质 调整_SMT打样小批量加工中的助焊剂是什么
  2. Java字符串用“。”(点)分隔。
  3. java打印变量类型,冲刺7天拿下Offer!
  4. Exynos 4412启动过程(群聊笔记记录)
  5. 一个简单的pygame接金币游戏
  6. Qt 多重继承时 moc 编译出错
  7. TinyXML学习记录及整理
  8. 设置servlet或action作为欢迎页面
  9. android 热门开源库,GitHub安卓热门开源资源在项目中的使用及项目总结
  10. activiti表单设计器_基于Vue,ElementUI开发的一款表单设计器
  11. 【李宏毅2020 ML/DL】P99-105 Life Long Learning
  12. Java基本数据类型有哪些
  13. 刘晓震:新浪博客应用架构分享
  14. C++--数字转大写金额
  15. 洛谷P4572 [JSOI2013] 哈利波特与死亡圣器
  16. 4.python-opencv图像马赛克
  17. 使用tcgames电脑玩手机游戏助手时卡顿延迟问题解决方案
  18. ipa包的简单校验方法
  19. Hypervisor操作系统间的通信技术
  20. 【最新】CentOS7.8 部署redis6.0.1集群

热门文章

  1. Drupal菜鸟笔记之使用Paragraphs建站
  2. winds Server2016安装mysql8.0版教程
  3. 测试人明年跳槽,我劝你千万别忽略这些“细节”不然……
  4. halcon 手眼标定原理推导
  5. 董事会审计委员会职能是什么?
  6. 深度学习炼丹-超参数设定和模型训练
  7. 解决mathtype微分点不显示
  8. mysql租房house查询_多条件查询(php+mysql) 租房子例子
  9. 批量修改图片名称(去掉原名字中的中文字符和空格)
  10. c语言中的关键词有哪些及其作用意思,C语言中各个关键字的意思和作用