zoukankan      html  css  js  c++  java
  • (转)基于深度学习的物体检测

    本文转自:http://www.cosmosshadow.com/ml/%E5%BA%94%E7%94%A8/2015/12/07/%E7%89%A9%E4%BD%93%E6%A3%80%E6%B5%8B.html

    物体检测

    RCNN

    Rich feature hierarchies for accurate object detection and semantic segmentation 
    早期,使用窗口扫描进行物体识别,计算量大。 
    RCNN去掉窗口扫描,用聚类方式,对图像进行分割分组,得到多个侯选框的层次组。

    • 原始图片通过Selective Search提取候选框,约有2k个
    • 侯选框缩放成固定大小
    • 经过CNN
    • 经两个全连接后,分类

    Fast RCNN

    Fast R-CNN 
    RCNN中有CNN重复计算,Fast RCNN则去掉重复计算,并微调选框位置。

    • 整图经过CNN,得到特征图
    • 提取域候选框
    • 把候选框投影到特征图上,Pooling采样成固定大小
    • 经两个全连接后,分类与微调选框位置

    Faster RCNN

    Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 
    提取候选框运行在CPU上,耗时2s,效率低下。 
    Faster RCNN使用CNN来预测候选框。

    • 整图经过CNN,得到特征图
    • 经过核为 3×3×2563×3×256 的卷积,每个点上预测k个anchor box是否是物体,并微调anchor box的位置
    • 提取出物体框后,采用Fast RCNN同样的方式,进行分类
    • 选框与分类共用一个CNN网络

    anchor box的设置应比较好的覆盖到不同大小区域,如下图:

    一张1000×6001000×600的图片,大概可以得到20k个anchor box(60×40×960×40×9)。

    R-FCN

    R-FCN: Object Detection via Region-based Fully Convolutional Networks 
    RCNN系列(RCNN、Fast RCNN、Faster RCNN)中,网络由两个子CNN构成。在图片分类中,只需一个CNN,效率非常高。所以物体检测是不是也可以只用一个CNN? 
    图片分类需要兼容形变,而物体检测需要利用形变,如何平衡? 
    R-FCN利用在CNN的最后进行位置相关的特征pooling来解决以上两个问题。

    经普通CNN后,做有 k2(C+1)k2(C+1) 个 channel 的卷积,生成位置相关的特征(position-sensitive score maps)。 
    CC 表示分类数,加 11 表示背景,kk 表示后续要pooling 的大小,所以生成 k2k2 倍的channel,以应对后面的空间pooling。

    普通CNN后,还有一个RPN(Region Proposal Network),生成候选框。 
    假设一个候选框大小为 w×hw×h,将它投影在位置相关的特征上,并采用average-pooling的方式生成一个 k×k×k2(C+1)k×k×k2(C+1) 的块(与Fast RCNN一样),再采用空间相关的pooling(k×kk×k平面上每一个点取channel上对应的部分数据),生成 k×k×(C+1)k×k×(C+1)的块,最后再做average-pooling生成 C+1C+1 的块,最后做softmax生成分类概率。 
    类似的,RPN也可以采用空间pooling的结构,生成一个channel为 4k24k2的特征层。 
    空间pooling的具体操作可以参考下面。

    训练与SSD相似,正负点取一个常数,如128。除去正点,剩下的所有使用概率最高的负点。

    YOLO

    You Only Look Once: Unified, Real-Time Object Detection 
    Faster RCNN需要对20k个anchor box进行判断是否是物体,然后再进行物体识别,分成了两步。 
    YOLO则把物体框的选择与识别进行了结合,一步输出,即变成”You Only Look Once”。

    • 把原始图片缩放成448×448448×448大小
    • 运行单个CNN
    • 计算物体中心是否落入单元格、物体的位置、物体的类别

    模型如下:

    • 把缩放成统一大小的图片分割成S×SS×S的单元格
    • 每个单元格输出B个矩形框(冗余设计),包含框的位置信息(x, y, w, h)与物体概率P(Object)P(Object)
    • 每个单元格再输出C个类别的条件概率P(ClassObject)P(Class∣Object)
    • 最终输出层应有S×S×(B5+C)S×S×(B∗5+C)个单元
    • x, y 是每个单元格的相对位置
    • w, h 是整图的相对大小

    分类的概率

    P(Class)=P(ClassObject)P(Object)P(Class)=P(Class∣Object)⋅P(Object)

    在原论文中,S = 7,B = 2,C = 20,所以输出的单元数为7×7×307×7×30。

    代价函数:

    J=λcoordi=0S2j=0B1objij(xix^i)2+(yiy^i)2+λcoordi=0S2j=0B1objij(wi−−√w^i−−√)2+(hi−−√h^i−−√)2+i=0S2j=0B1objij(CiC^i)2+λnoobji=0S2j=0B1noobjij(CiC^i)2+i=0S21objijcclasses(pi(c)p^i(c))2J=λcoord∑i=0S2∑j=0B1ijobj(xi−x^i)2+(yi−y^i)2+λcoord∑i=0S2∑j=0B1ijobj(wi−w^i)2+(hi−h^i)2+∑i=0S2∑j=0B1ijobj(Ci−C^i)2+λnoobj∑i=0S2∑j=0B1ijnoobj(Ci−C^i)2+∑i=0S21ijobj∑c∈classes(pi(c)−p^i(c))2

    其中 λcoord=5λcoord=5,λnoobj=0.5λnoobj=0.5。 
    一般,ww 与 hh 不是在 [0,1][0,1] 上的均匀分布,偏小,所以开方。

    SSD

    SSD: Single Shot MultiBox Detector 
    YOLO在 7×77×7 的框架下识别物体,遇到大量小物体时,难以处理。 
    SSD则在不同层级的feature map下进行识别,能够覆盖更多范围。

    假设在 mm 层 feature map 上进行识别,则第 kk 层的基本比例为

    sk=smin+smaxsminm1(k1)k[1,m]sk=smin+smax−sminm−1(k−1)k∈[1,m]

    比如 smin=0.2smin=0.2,smax=0.95smax=0.95,表示整张图片识别物体所占比最小 0.2,最大 0.95。 
    在基本比例上,再取多个长宽比,令 a={1,2,3,1/2,1/3}a={1,2,3,1/2,1/3},长宽分别为

    wik=skai−−√hik=sk/ai−−√i[1,5]wki=skaihki=sk/aii∈[1,5]
    w6k=sksk+1−−−−−√h6k=sksk+1−−−−−√wk6=sksk+1hk6=sksk+1

    Match策略上,取ground truth与以上生成的格子重叠率大于0.5的。

    SSD vs YOLO

    位置采用Smooth L1 Regression,分类采用Softmax。 
    代价函数为

    L=Lconf(x,c)+αLloc(x,l,g))L=Lconf(x,c)+α⋅Lloc(x,l,g))

    xx 表示类别输出,cc 表示目标分类,ll 表示位置输出,gg 表示目标位置, αα是比例常数,可取1。 
    训练过程中负点远多于正点,所以只取负点中,概率最大的几个,数量与正点成 3:13:1 。

    NMS

    以上方法,同一物体可能有多个预测值。 
    可用NMS(Non-maximum suppression,非极大值抑制)来去重。

    如上图所示,一共有6个识别为人的框,每一个框有一个置信率。 
    现在需要消除多余的:

    • 按置信率排序: 0.95, 0.9, 0.9, 0.8, 0.7, 0.7
    • 取最大0.95的框为一个物体框
    • 剩余5个框中,去掉与0.95框重叠率大于0.6(可以另行设置),则保留0.9, 0.8, 0.7三个框
    • 重复上面的步骤,直到没有框了,0.9为一个框
    • 选出来的为: 0.95, 0.9

    两个矩形的重叠率计算方式如下:

    如图,两个矩形的面积分别为A, B

    • 取两个矩形左上角坐标的最大值x1_max, y1_max
    • 取两个矩形右下角坐标的最小值x2_min, y2_min
    • 重叠区域的宽w为max(0, x2_min - x1_max),高h为max(0, y2_min - y1_max)
    • 重叠率为 w×hA+Bw×hw×hA+B−w×h

    xywh VS xyxy

    系列论文中,位置都用 (x,y,w,h)(x,y,w,h) 来表示,没有用左上角、右下角 (x,y,x,y)(x,y,x,y) 来表示。 
    初衷是当 (w,h)(w,h) 正确时,(x,y)(x,y) 一点错,会导致整个框就不准了。 
    在初步的实际实验中,(x,y,x,y)(x,y,x,y) 效果要差一些。

    背后的逻辑,物体位置用 (x,y,w,h)(x,y,w,h) 来学习比较容易。 
    (x,y)(x,y) 只需要位置相关的加权就能计算出来; 
    (w,h)(w,h) 就更简单了,直接特征值相加即可。























  • 相关阅读:
    2015年11月27日 野外生存(一)刀
    2015年11月26日 Java基础系列(五)异常Exception
    高斯混合模型(理论+opencv实现)
    K-means算法(理论+opencv实现)
    支持向量机(理论+opencv实现)
    《图像处理实例》 之 答题卡检测
    关于VS+ImageWatch在线调试问题
    关于W8.1不能安装VS2015(包括2017等)
    《图像处理实例》 之 车牌定位
    《opencv学习》 之 OTSU算法实现二值化
  • 原文地址:https://www.cnblogs.com/wangxiaocvpr/p/5828016.html
Copyright © 2011-2022 走看看