R-CNN学习笔记

step1:总览



  • 步骤:

    1. 输入图片
    2. 先挑选大约2000个感兴趣区域(ROI)使用select search方法:【在输入的图像中寻找blobby regions(可能相同纹理,颜色等)】{区域选择算法是固定算法,不需要学习}
    3. 将每块区域变形为同一个大小,送入卷积神经网络计算特征
    4. 送入SVM分类器进行分类

step2详细描述

1.select search算法

  • 该算法通过图像中的纹理,颜色等特征进行区域划分,算法如下

2.将图片输入神经网络前处理

  • 由于本文作者是使用alexNet,该网络需要输入固定的大小
  • 所以需要对图片进行
    1. 裁剪
    2. 变形
  • 本文将图片裁剪变形为227*227的大小

3.将图片送入神经网络提取特征

  1. RCNN先再ImageNet上进行预训练(因为作者带标签的数据不多)
  2. 再在自己的网络上进行微调
  • 注意:作者使用和ImageNet上相同的架构,只在左后进全连接层的分成1000类(imagenet上有1000类)改成自己的N+1(N个类别加1个背景)
  • 该神经网络有5个卷积层2个全连接层,具体为
# Building 'AlexNet'
def create_alexnet(num_classes):
network = input_data(shape=[None, config.IMAGE_SIZE, config.IMAGE_SIZE, 3]) # 224*224*3
network = conv_2d(network, 96, 11, strides=4, activation='relu')
network = max_pool_2d(network, 3, strides=2)
network = local_response_normalization(network)
network = conv_2d(network, 256, 5, activation='relu')
network = max_pool_2d(network, 3, strides=2)
network = local_response_normalization(network)
network = conv_2d(network, 384, 3, activation='relu')
network = conv_2d(network, 384, 3, activation='relu')
network = conv_2d(network, 256, 3, activation='relu')
network = max_pool_2d(network, 3, strides=2)
network = local_response_normalization(network)
network = fully_connected(network, 4096, activation='tanh')
network = dropout(network, 0.5)
network = fully_connected(network, 4096, activation='tanh')
network = dropout(network, 0.5)
network = fully_connected(network, num_classes, activation='softmax')
network = regression(network, optimizer='momentum',
loss='categorical_crossentropy',
learning_rate=0.001)
return network
  • 训练阶段详细描述

    1. 有监督预训练 作者使用caffe框架利用ILSVRC 2012的数据集(应该就是imagenet吧)对网络模型进行了训练,使网络模型中的参数都是经过训练过的参数,而不是刚开始那样随机初始化的参数

    2. 特定领域的fine-tuning 为了适应不同场合的识别需要,如VOC,对网络继续使用从VOC图片集上对region proposals归一化后的图片进行训练。网络只需要将最后的1000类的分类层换成21类的分类层(20个VOC中的类别和1个背景类),其他都不需要变。为了保证训练只是对网络的微调而不是大幅度的变化,网络的学习率只设置成了0.001。计算每个region proposal与人工标注的框的IoU,IoU重叠阈值设为0.5,大于这个阈值的作为正样本,其他的作为负样本,然后在训练的每一次迭代中都使用32个正样本(包括所有类别)和96个背景样本组成的128张图片的batch进行训练(这么做的主要原因还是正样本图片太少了)

    3. 特定类别的分类器 对每个类都训练一个线性的SVM分类器,训练SVM需要正负样本文件,可以想象得到,刚好包含某一类物体的region proposal应该是正样本,完全不包含的region proposal应该是负样本,但是对于部分包含某一类物体的region proposal该如何训练呢,作者同样是使用IoU阈值的方法,这次的阈值为0.3,计算每一个region proposal与标准框的IoU,大于这个阈值的作为正样本,小于的作为负样本。

4.最后放进SVM分类器进行分类

5.在分类的时候还会对框进行regression微调

  • 这里微调采用的时非极大值抑制:
  • 详细描述:
    1. 对于每一个类别,使用为这一类训练的SVM分类器对提取的特征向量进行打分,得到测试图片中对于所有region proposals的对于这一类的分数,再使用贪心的非极大值抑制去除相交的多余的框。
    2. 非极大值抑制(NMS)先计算出每一个bounding box的面积,然后根据score进行排序,把score最大的bounding box作为选定的框,计算其余bounding box与当前最大score与box的IoU,去除IoU大于设定的阈值的bounding box。

6.RCNN与它之前方法的比较

7.RCNN训练及测试总览图

step3:在读论文中时的疑问?

  • 问题1:矫正是否在感兴趣区域?

    答:不一定,假设感兴趣区域是围绕人的但是没包括人的头部。网络会推断人应该有头,所以网络应该把边界提高一点
  • 问题2:经过select search后图片进去后,那框应该怎么画?

    答:select search回一同返回图片和labels,该label包含了x,y,w,h(中心点坐标x,y以及图片的宽和高w,h)
  • 问题3:图片变形后会影响网络提取特征吗?

    答:可能回影响?后续在看后面论文观察
  • 问题4:图片在测试阶段速度太慢怎么解决?

    答:后续看论文

step4:引用及参考文献

  1. paper:
  1. 代码参考:
  1. 博客参考:

2021/2/6 20:42更新-->关于Bounding-box regression的理解

R-CNN学习笔记的更多相关文章

  1. 卷积神经网络(CNN)学习笔记1:基础入门

    卷积神经网络(CNN)学习笔记1:基础入门 Posted on 2016-03-01   |   In Machine Learning  |   9 Comments  |   14935  Vie ...

  2. CNN学习笔记:批标准化

    CNN学习笔记:批标准化 Batch Normalization Batch Normalization, 批标准化, 是将分散的数据统一的一种做法, 也是优化神经网络的一种方法. 在神经网络的训练过 ...

  3. CNN学习笔记:目标函数

    CNN学习笔记:目标函数 分类任务中的目标函数 目标函数,亦称损失函数或代价函数,是整个网络模型的指挥棒,通过样本的预测结果与真实标记产生的误差来反向传播指导网络参数学习和表示学习. 假设某分类任务共 ...

  4. CNN学习笔记:卷积神经网络

    CNN学习笔记:卷积神经网络 卷积神经网络 基本结构 卷积神经网络是一种层次模型,其输入是原始数据,如RGB图像.音频等.卷积神经网络通过卷积(convolution)操作.汇合(pooling)操作 ...

  5. CNN学习笔记:全连接层

    CNN学习笔记:全连接层 全连接层 全连接层在整个网络卷积神经网络中起到“分类器”的作用.如果说卷积层.池化层和激活函数等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的特征表示映射到样 ...

  6. CNN学习笔记:池化层

    CNN学习笔记:池化层 池化 池化(Pooling)是卷积神经网络中另一个重要的概念,它实际上是一种形式的降采样.有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见 ...

  7. CNN学习笔记:卷积运算

    CNN学习笔记:卷积运算 边缘检测 卷积 卷积是一种有效提取图片特征的方法.一般用一个正方形卷积核,遍历图片上的每一个像素点.图片与卷积核重合区域内相对应的每一个像素值乘卷积核 .内相对应点的权重,然 ...

  8. CNN学习笔记:激活函数

    CNN学习笔记:激活函数 激活函数 激活函数又称非线性映射,顾名思义,激活函数的引入是为了增加整个网络的表达能力(即非线性).若干线性操作层的堆叠仍然只能起到线性映射的作用,无法形成复杂的函数.常用的 ...

  9. CNN学习笔记:梯度下降法

    CNN学习笔记:梯度下降法 梯度下降法 梯度下降法用于找到使损失函数尽可能小的w和b,如下图所示,J(w,b)损失函数是一个在水平轴w和b上面的曲面,曲面的高度表示了损失函数在某一个点的值

  10. CNN学习笔记:线性回归

    CNN学习笔记:Logistic回归 线性回归 二分类问题 Logistic回归是一个用于二分分类的算法,比如我们有一张图片,判断其是否为一张猫图,为猫输出1,否则输出0. 基本术语 进行机器学习,首 ...

随机推荐

  1. the compatibility problem of ie

    ie8hack ie8下的兼容问题处理:背景透明,css3圆角,css3和jquery支持部分css3选择器(例如:nth-child),支持html5的语义化标签,媒体查询@media等. 在htm ...

  2. Kurento安装与入门08——Group Call

    Group Call 本示例展示了一个视频聊天室的功能,不同的聊天室之间互相隔离. 官网文档 Group Call 首先从github上获取代码(如果已经获取可以跳过,获取的代码已经包括后面的示例代码 ...

  3. leetcode-剑指 Offer II 012. 左右两边子数组的和相等

    题目描述: 给你一个整数数组 nums ,请计算数组的 中心下标 . 数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和. 如果中心下标位于数组最左端,那么左侧数之和视为 ...

  4. IDEA中 Debug 调试工具(图文详解)

    DEBUG调试工具 一. Debug 调试工具 1. Debug的作用 2. Debug的使用步骤 3. IDEA中Debug按钮详解 总结 参考博文:https://blog.csdn.net/qq ...

  5. Docker操作容器2

    Docker操作容器1:https://blog.csdn.net/Kevinnsm/article/details/ 1.如何更改docker容器中的配置文件(如nginx容器中的nginx.con ...

  6. c语言实现循环单链表

    //初始化 Node*InitList() { Node*head=(Node*)malloc(sizeof(Node)); head->next=NULL; head->data=-1; ...

  7. Spring-Bean依赖注入(引用数据类型和集合数据类型)

    为什么使用spring依赖注入详见–>依赖注入分析 1.创建实体类User类 package com.hao.domain; public class User { private String ...

  8. Oracle集群 & Grid(rac)配置,反推创建过程(重要)。

    目前机器上,oracle都是安装好的,那么我们怎么知道,之前的安装过程大概是什么样子呢? 大致安装oracle集群的内容: 一.准备和配置: 1.网卡 2.ip资源 3.scanip 4.hosts ...

  9. 四、初识Java

    一.Java三大版本 JavaSE:标准版(桌面程序,控制台开发......) JavaME:嵌入式开发(手机,小家电......)[了解就行] JavaEE:E企业级开发(Web端,服务器开发... ...

  10. 计算机编码规则之:Base64编码

    目录 简介 Base64和它的编码原理 Base64的变体 Base64的编码细节 总结 简介 我们知道计算机中的文件可以分为两种,一种是人肉眼可读的文本类文件,一种是肉眼不可读的二进制文件.一般来说 ...