zoukankan      html  css  js  c++  java
  • R-CNN学习笔记

    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的理解

  • 相关阅读:
    软件设计中的立足点
    Clojure基础
    团队凝聚力
    执行力与领导力
    工作与生活
    分离焦虑OR责任焦虑
    保持激情
    立足点
    论研发管理--开篇
    初级码农常犯错误
  • 原文地址:https://www.cnblogs.com/zranguai/p/14288471.html
Copyright © 2011-2022 走看看