精华内容
参与话题
问答
  • 物体检测

    千次阅读 2018-06-11 21:18:32
    同时基本上所有的检测任务都需要在给出物体的bounding box之后,给出物体的类别(也就是给识别物体),所以文章中不区分检测和识别任务。笔者从事计算机视觉中目标检测相关的工作还比较多,将自己看到的,学到的,...
    计算机视觉中目标检测、跟踪、识别是最基本的几个task,尤其又以检测最为重要和基础。同时基本上所有的检测任务都需要在给出物体的bounding box之后,给出物体的类别(也就是给识别物体),所以文章中不区分检测和识别任务。笔者从事计算机视觉中目标检测相关的工作还比较多,将自己看到的,学到的,以及相关的一些理解总结如下。帮助自己进行梳理,也希望对后来者有帮助。大致将目前学术及和工业界出现的目标检测算法分成3类:

    1. 传统的目标检测算法:Cascade + Harr / SVM + HOG / DPM 以及上述的诸多改进、优化;

    2. 候选窗+深度学习分类:通过提取候选区域,并对相应区域进行以深度学习方法为主的分类的方案,如:RCNN / Fast-RCNN / Faster-RCNN / SPP-net / R-FCN 等系列方法;

    3. 基于深度学习的回归方法:YOLO / SSD / DenseBox 等方法;以及最近出现的结合RNN算法的RRC detection;结合DPM的Deformable CNN等

    对于检测的目标,早期工业界关注的主要是人脸,人,车这些对监控、交通等领域非常重要的目标,到现在为止,计算机需要更全面的理解场景,检测的类别扩展到了生活的方方面面。

    文章会针对上述的方法进行简单的介绍,以及表达一些笔者认为这种演进趋势背后的原因。总结起来,实际上所有的方法都可以概括成:候选窗口 + 分类or回归;逻辑上滑窗也是提取候选窗口的一种方式。

    基于深度学习的方案的计算效率和进度大致对比如下:

    注:以上数据摘自论文

    下面对上面的3类目标检测的算法进行说明:

    传统的目标检测算法:

    传统的做目标检测的算法基本流程如下:

    1. 使用不同尺度的滑动窗口选定图像的某一区域为候选区域;

    2. 从对应的候选区域提取如Harr HOG LBP LTP等一类或者多类特征;

    3. 使用Adaboost SVM 等分类算法对对应的候选区域进行分类,判断是否属于待检测的目标。

    2001年viola的cascade+harr进行人脸检测的方案取得了很好的正面人脸的检测效果;其实这之前通过普通的颜色特征,形状特征也可以处理一些基本的目标检测问题,并且这类方法至今在工业检测的场景仍然在使用;下面我们对viola的cascade+harr人脸检测的方案进行详细的介绍,并为后续的方法埋下伏笔。

    假设我们现在已经获取了一个图像区域,我们要判断这个区域是不是人脸,应该怎么做呢?那我们首先从这个区域提取特征,然后将特征送给分类器进行分类。特征呢?在viola的方案中主要使用的是harr特征,描述两个图像block之间的明暗对比;而分类器呢,最好是又快又好,viola提出的方法是Adaboost,通过弱分类器的组合和级联完成分类任务;假如一个640*480大小的图片,滑窗时每次移动3个像素的话,总体上也有10w量级的滑窗,再加上由于目标尺寸的变化,需要对图片进行缩放或者扩大,总体滑窗的数量又会上升,因此对分类器的效率要求非常高。所以级联的cascade方法很好的解决了这个问题,在初期使用很少的计算量过滤掉大部分的候选窗口,对于越难进行分类的样本就计算更多的特征来进行判断,直到所有的候选窗口的分类完毕。后续会针对检测的结果进行重叠窗口以及不同尺度图像上窗口的融合。

    viola最早提出来的harr特征主要是水平方向和竖直方向,后续又出现了非常多的变化;adaboost方法在后续也出现了非常多的变种,这里将harr特征的变化以及adaboost的变种进行一个罗列:

    基本上可以看到,以上harr的变种都是改变明暗对比的计算方法。还有一些改进:如将harr特征进行组合的joint harr feature,如利用pixel明暗对比进行组合的joint pixel harr feature;基本逻辑就是获得更为全面的特征描述能力,以及提高计算速度。

    这对adaboost也有非常多的改进,以及training方法的改进也很多,这里对adaboost的改进进行罗列,感兴趣的朋友可以查看:

    vector boosting

    output code to boost multiclass learning

    multiple instance boosting(MIL等)

    multi-class boosting

    floatboost learning

    multi-class adaboost

    textonboost

    等等

    改进非常多,不过基本逻辑依旧是提升模型的表达能力;traning的改进在此不做罗列,总结起来基本上是:难分负样本的处理,trainning效率等。

    使用SVM+HOG的方法进行行人检测方法和上述方案基本一致,不过针对行人检测的场景,harr通过区域的明暗对比计算的特征显然不能够太好的描述;而HOG特征本身含有一定的位置特性,正好可以描述人体如头部,四肢等不同的部位。方法的流程如下:

    HOG特征能够很好的描述人体的轮廓特性,大致可以有个直观的感受参考这个图:

    但上面的方案有个问题,实际上人的正面和侧面从视觉轮廓上来看,差异非常大;比如车辆也一样,从正面看,主要是挡风玻璃和前脸部分,从侧面看则是车门和轮廓部分;所以出现了后来非常出名的dpm算法。dpm算法的思想如下:

    1. 物体都是由不同的part组成的,由于各种variations导致物体整体的视觉效果不一样,但是有些part的变化实际上不大,因此可以训练针对不同part的检测模块;

    2. 一个物体,不同的part之间实际上是存在天然的拓扑结构的关系,比如人体头大部分情况都位于躯干的上面,车大部分情况轮子的部分都在地面上等等。也就是说这些不同的part之间的距离和位置关系符合一个标准的分布,某种位置关系非常多,而有些位置关系存在但很少,有些则根本不存在;

    3. 有了各个部件,有了位置关系,就可以将不同的位置关系对目标物体的贡献看待成一个权重,最后由权重求和得到是否是需要检测的目标。

    整体流程参考:

    root filter 和 n个part filter进行最终的加权,得到检测目标。

    dpm算法本身的进步roadmap可以参考这个:

    传统的目标检测方法介绍到这里,而实际上后续的基于深度学习的目标检测方案多多少少参考了前面的工作,以及在深度学习目标检测的框架中也在结合以上方法中的思想,后面一一介绍。


    候选窗+深度学习分类的目标检测方案:

    滑窗有一个问题,就是产生的候选窗口数量巨大,所以有各种region proposal的方案出来,最根本的需求就是在减少可能窗口的miss的情况下找到更少的候选窗口;从这个角度讲,金字塔+滑动窗口的方案实际上是一个100%召回的方案。

    使用深度学习方法进行分类能够更好的提取特征,以及模型能够具备更强大的描述能力;所以基本上对深度学习的使用也慢慢的从当成特征提取进步到特征提取与分类、回归等问题结合起来的end-to-end的方式。

    先介绍rgbd大神的系列工作rcnn -> fast rcnn -> faster rcnn;以上工作非常有连续性,建议读者读原论文研读。这个链接有一些说明:

    RCNN, Fast-RCNN, Faster-RCNN的一些事

    rcnn目标检测的基本流程如下:

    通过selective search的方式从图片中提取可能的目标的候选窗口,将窗口warp到同一个尺寸,通过卷积网络从warp之后的候选窗口提取特征,将特征送给分类器进行分类,最后在加上bounding box regression等操作得到更准确的目标位置。

    以上方案有几个问题:1. selective search方式提取候选窗口非常耗时,同时会miss掉一些窗口;2. 从warp之后的候选窗口提取dnn特征的时候,重叠部分的卷积操作重复计算了;3. 提取特征之后再丢给SVM进行分类,逻辑上每一步都是分开训练,不利于全局最优。

    rgbd大神在fast rcnn中提出了ROI pooling层来解决重复的卷积计算的问题,框架如下:

    ROI pooling层逻辑上可以理解成,对于一个任意尺寸的box,都可以通过将这个box分成4*4,8*8等同样数量的网格,然后每个网格通过max, mean等操作计算相应的特征,就可以将不同尺寸的box转化成相同维度的特征。

    还不够,是否可以简化掉最费时的selective search 提取候选窗口呢?显然可以。rgbd大神在faster rcnn中引入region proposal network替代selective search,同时引入anchor box应对目标形状的变化问题。


    在结合end-to-end的training,faster rcnn基本做到的实时。

    SPP-net的主要思想是去掉原始图像上的crop/warp操作,通过在卷积特征层上的空间金字塔池化来达成;二者的差异可以参考这个图:


    Spatial pyramid pooling的示意图如下,是一个非常重要的将尺寸不一致的图像pooling到相同的特征纬度的方法:


    R-FCN方案也使用region proposal network提取候选窗口,同时使用和RPN同享的特征进行分类和回归,流程如下,请读者参考论文详情:


    以上方案可以看到明显的进步,并且每一个进步都有重要的背后的逻辑。几个值得关注的点重申如下:

    ROI pooling 操作

    Anchor box机制

    RPN特征共享

    卷积层的空间金字塔

    等等


    基于深度学习end-to-end的回归方法用于目标检测:

    YOLO可以认为是这类方法的开篇之作,速度很快,详细介绍如下。有人说yolo的方案去除了候选窗口或者滑窗的思想,但实际上并没有,只是yolo使用对输出的图像进行网格划分来提取候选窗口而已。


    YOLO方案的输入是比如448*448的图片,输入是一个7*7的网格,每个网格的信息包含:1. 存在某个类别的物体的概率,比如有20类目标需要检测,那就是20类+1类(backgroud);2. 对应物体的bounding box参数,使用4个数字描述;3. 对应目标的概率。

    这个问题就被format成一个回归问题,448*448*3作为输入;7*7*(b*5+c)作为回归的参数,然后进行end-to-end的学习。

    显然,YOLO的方案有几个问题:1. 针对小目标的检测效果会不太好,因为7*7的网格的划分可能太粗糙了;2. 经过多层卷积和pooling的操作,图像的边缘特征可能丢失较多了,而回归bounding box参数的只使用了高层的卷积层特征,会导致bounding box不准确;3. 当两个目标同时落入7*7的某一个网格中的时候,对应位置只能检测到一个物体。

    SSD方案则是faster rcnn和yolo的结合,使用了yolo end-to-end训练的思想,同时有结合了anchor box,不同层的卷积特征的组合等方案。SSD的整体流程如下:


    SSD网络和YOLO网络的差异如下:


    anchor机制的引入,以及多个卷积层特征的组合能够帮助SSD获得更为准确的对目标bounding box的估计。

    KITTI上top 20的目标检测方案及精度大致如下:


    对排名第7的RRC 方案做一个描述,之所以介绍这个方法,是因为他在hard上的得分超过了其他方案非常多,并且在moderate easy上的结果也和最好的结果差异不大,而笔者也认为这个方案背后的思想值得学习。

    RRC实际上是把RNN的一些思想融入到了目标检测当中:


    网络结构比较复杂,做如下几个说明:

    1. 我们在做bounding box回归的时候,一定是需要一些有用的底层的边缘信息的,但并不是所有的底层信息都有用,那这些信息可以通过一定的方式传递的后面的决策层;

    2. 利用当前层进行预测的时候,实际上和他的上一层和下一层的信息是有关的。

    详细请参考RRC detection论文。

    Deformable CNN方法:是一种把DPM和CNN结合起来的思想。我们一起思考一下,卷积核一般情况下都是一个固定的尺寸或者是性状,比如3*3,5*5;但实际上在我们进行目标检测的时候,我们的目标的性状是千差万别的。比如人的手掌,实际上就是一个长方形或者有一定弧形的区域。那么如果我们可以通过某种方式将卷积核变成或者说是训练成可能的目标的部件的性状,那么他计算出来的特征就越合理。

    所以我们是否可以在学习卷积核的时候,也引入一些可学习的卷积核的形状参数呢?答案是肯定的,这个就是deformable cnn卷积:


    通过对卷积核引入offsets来实现。

    通过一个直观的感受来看看学习到的deformable cnn核是什么样子?


    可以看到,学习到的deformable cnn核会遵循目标的轮廓进行分布;我们可以想见,或许学习到的对人脸特别敏感的核应该是一个椭圆形的等等。

    感受一些deformable cnn的效果:


    逻辑上:deformable cnn的效果可以通过多个标准的卷积核组合得到,就相当于椭圆可以通过很多个矩形来近似一样;这种组合似乎有一些inception v3 v4里面的组合的味道;不过我个人认为这种人造的组合可能上限会比通过参数学习的组合低,笔者认为deformable cnn的方案还是非常值得期待的。


    总结、可能:

    基本上对于过去和现在的方法总结得差不多了,似乎该展望未来。不过笔者对于未来的判断一般都没有准确过,所以不敢使用未来这个字眼。但是对于目标检测的一些思考和可能也有一些自己的判断。

    基于深度学习方法的几个可能的方向:

    1. 想办法从原始图像、低层的feature map层,以及高层的语义层获取更多的信息,从而得到对目标bounding box的更准确的估计;

    2. 对bounding box的估计可以结合图片的一些coarse-to-fine的分割信息;

    3. bounding box的估计可能需要更多的局部的content的信息,需要想办法引入;

    4. 目标检测数据集的标注难度非常大,如何把其他如classfication领域学习到的知识用于检测当中,甚至是将classification的数据和检测数据集做co-training(如YOLO9000)的方式,至少可以从数据层面获得更多的信息;

    5. 更好的启发式的学习方式,人在识别物体的时候,第一次可能只是知道这是一个单独的物体,也知道bounding box,但是不知道类别;当人类通过其他渠道学习到类别的时候,下一次就能够识别了;目标检测也是如此,我们不可能标注所有的物体的类别,但是如何将这种快速学习的机制引入,也是一个问题;

    6. RRC,deformable cnn中卷积和其他的很好的图片的操作、机器学习的思想的结合未来也有很大的空间;

    7. 语意信息和分割的结合,可能能够为目标检测提供更多的有用的信息;

    8. 场景信息也会为目标检测提供更多信息;比如天空不会出现汽车等等。

    笔者自己一直喜欢非常简单的框架,比如cascade+harr,比如yolo;这种简单的框架对工程上的实现以及后续的优化提供了最多的可能性;也信奉一个道理,在工业界应该是simple is beautiful

    到这里基本上已经写完了,检测和识别这些基本的task的进步才能够让计算机更好的理解世界,共勉!


    原文地址

    https://zhuanlan.zhihu.com/p/27546796

    展开全文
  • YOLOV3模型的测试: ./darknet detector test cfg/coco.data cfg/yolov3.cfg backup/yolov3_20000.weights data/giraffe.jpg -thresh 0.4

    YOLOV3模型的测试:

    ./darknet detector test cfg/coco.data cfg/yolov3.cfg backup/yolov3_20000.weights data/giraffe.jpg -thresh 0.4
    

    darknet中有python接口用于测试,在python/darknet.py中
    只需要修改相应的路径:
    在这里插入图片描述
    输出:类别、置信度、bbox位置信息(中心点坐标、宽高)
    修改时需要注意:为当前实际的路径(编译时生成的.so文件)
    在这里插入图片描述
    同样在example也提供了一个检测用到的脚本文件:
    在这里插入图片描述
    调用方式与上边一致的,是import了darknet
    可以可视化:
    在这里插入图片描述

    展开全文
  • Tensorflow物体检测Faster-Rcnn技术教程

    千人学习 2018-01-28 20:37:01
    Tensorflow物体检测FasterRcnn视频培训教程内容概况:课程首先讲解物体检测的初期算法,对比不同效果与设计思想从而引入fasterrcnn三代算法。在学习阶段我们选择了深度学习框架tensorflow版本进行解读,在代码层面...
  • Python-深度学习-物体检测实战

    千人学习 2019-11-04 16:36:42
    计算机视觉-物体检测-通用解决框架Mask-Rcnn实战课程旨在帮助同学们快速掌握物体检测领域当下主流解决方案与网络框架构建原理,基于开源项目解读其应用领域与使用方法。通过debug方式,详细解读项目中每一模块核心...
  • 运动物体检测

    2012-11-11 19:35:25
    基于opencv的运动物体检测,可以检测到一段视频中的运动物体
  • tensorflow移植到Android端,可以对照片中的物体进行分类检测,相比opencv而言,在很大程度上提高了识别率以及正确率,用了就知道
  • 在做运动物体检测inputvideo 和outputvideo均正常 主程序如下 clear data disp('input video'); avi= VideoReader('samplevideo.avi'); numFrames = avi.NumberOfFrames;% 读取视频的帧数 vidHeight = avi...
  • 物体检测YOLO系列课程主要包括两大核心模块:(1),YOLO系列算法精讲,详细解读3篇论文核心知识点与整体网络架构并对其效果展开深入分析,通俗讲解YOLO架构实现原理与效果提升细节;(1),YOLO-V3项目实战,详细解读V3...
  • opencv运动物体检测

    2012-03-28 13:32:58
    opencv运动物体检测,检测视频中的运动物体,并分离出前景背景
  • 深度学习(十八)基于R-CNN的物体检测

    万次阅读 多人点赞 2015-12-05 16:58:12
    本篇博文主要讲解2014年CVPR上的经典paper:《Region-based Convolutional Networks for Accurate Object Detection and Segmentation》,这篇文章的算法又被称之为:R-CNN,是物体检测领域曾经获得state-of-art的...

    基于R-CNN的物体检测

    原文地址:http://blog.csdn.net/hjimce/article/details/50187029

    作者:hjimce

    一、相关理论

       本篇博文主要讲解2014年CVPR上的经典paper:《Rich feature hierarchies for Accurate Object Detection and Segmentation》,这篇文章的算法思想又被称之为:R-CNN(Regions with Convolutional Neural Network Features),是物体检测领域曾经获得state-of-art精度的经典文献。

       这篇paper的思想,改变了物体检测的总思路,现在好多文献关于深度学习的物体检测的算法,基本上都是继承了这个思想,比如:《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》,所以学习经典算法,有助于我们以后搞物体检测的其它paper。

        之前刚开始接触物体检测算法的时候,老是分不清deep learning中,物体检测和图片分类算法上的区别,弄得我头好晕,终于在这篇paper上,看到了解释。物体检测和图片分类的区别:图片分类不需要定位,而物体检测需要定位出物体的位置,也就是相当于把物体的bbox检测出来,还有一点物体检测是要把所有图片中的物体都识别定位出来。

    二、基础知识

    1、有监督预训练与无监督预训练

    (1)无监督预训练(Unsupervised pre-training)

    无监督预训练这个名词我们比较熟悉,栈式自编码、DBM采用的都是采用无监督预训练。因为预训练阶段的样本不需要人工标注数据,所以就叫做无监督预训练。

    (2)有监督预训练(Supervised pre-training)

    所谓的有监督预训练,我们也可以把它称之为迁移学习。比如你已经有一大堆标注好的人脸年龄分类的图片数据,训练了一个CNN,用于人脸的年龄识别。然后当你遇到新的项目任务是:人脸性别识别,那么这个时候你可以利用已经训练好的年龄识别CNN模型,去掉最后一层,然后其它的网络层参数就直接复制过来,继续进行训练。这就是所谓的迁移学习,说的简单一点就是把一个任务训练好的参数,拿到另外一个任务,作为神经网络的初始参数值,这样相比于你直接采用随机初始化的方法,精度可以有很大的提高。

    图片分类标注好的训练数据非常多,但是物体检测的标注数据却很少,如何用少量的标注数据,训练高质量的模型,这就是文献最大的特点,这篇paper采用了迁移学习的思想。文献就先用了ILSVRC2012这个训练数据库(这是一个图片分类训练数据库),先进行网络的图片分类训练。这个数据库有大量的标注数据,共包含了1000种类别物体,因此预训练阶段cnn模型的输出是1000个神经元,或者我们也直接可以采用Alexnet训练好的模型参数。

    2、IOU的定义

    因为没有搞过物体检测不懂IOU这个概念,所以就简单介绍一下。物体检测需要定位出物体的bounding box,就像下面的图片一样,我们不仅要定位出车辆的bounding box 我们还要识别出bounding box 里面的物体就是车辆。对于bounding box的定位精度,有一个很重要的概念,因为我们算法不可能百分百跟人工标注的数据完全匹配,因此就存在一个定位精度评价公式:IOU。


    IOU定义了两个bounding box的重叠度,如下图所示:


    矩形框A、B的一个重合度IOU计算公式为:

    IOU=(A∩B)/(A∪B)

    就是矩形框A、B的重叠面积占A、B并集的面积比例:

    IOU=SI/(SA+SB-SI)

    3、非极大值抑制

    因为一会儿讲RCNN算法,会从一张图片中找出n多个可能是物体的矩形框,然后为每个矩形框为做类别分类概率:


    就像上面的图片一样,定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制:先假设有6个矩形框,根据分类器类别分类概率做排序,从小到大分别属于车辆的概率分别为A、B、C、D、E、F。

    (1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;

    (2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。

    (3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。

    就这样一直重复,找到所有被保留下来的矩形框。

    4、VOC物体检测任务

    这个就相当于一个竞赛,里面包含了20个物体类别:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/examples/index.html  还有一个背景,总共就相当于21个类别,因此一会设计fine-tuning CNN的时候,我们softmax分类输出层为21个神经元。

    三、算法总体思路 

        开始讲解paper前,我们需要先把握总体思路,才容易理解paper的算法。

        图片分类与物体检测不同,物体检测需要定位出物体的位置,这种就相当于回归问题,求解一个包含物体的方框。而图片分类其实是逻辑回归。这种方法对于单物体检测还不错,但是对于多物体检测就……

        因此paper采用的方法是:首先输入一张图片,我们先定位出2000个物体候选框,然后采用CNN提取每个候选框中图片的特征向量,特征向量的维度为4096维,接着采用svm算法对各个候选框中的物体进行分类识别。也就是总个过程分为三个程序:a、找出候选框;b、利用CNN提取特征向量;c、利用SVM进行特征向量分类。具体的流程如下图片所示:


    后面我们将根据这三个过程,进行每个步骤的详细讲解。

    四、候选框搜索阶段

    1、实现方式

    当我们输入一张图片时,我们要搜索出所有可能是物体的区域,这个采用的方法是传统文献的算法:《search for object recognition》,通过这个算法我们搜索出2000个候选框。然后从上面的总流程图中可以看到,搜出的候选框是矩形的,而且是大小各不相同。然而CNN对输入图片的大小是有固定的,如果把搜索到的矩形选框不做处理,就扔进CNN中,肯定不行。因此对于每个输入的候选框都需要缩放到固定的大小。下面我们讲解要怎么进行缩放处理,为了简单起见我们假设下一阶段CNN所需要的输入图片大小是个正方形图片227*227。因为我们经过selective search 得到的是矩形框,paper试验了两种不同的处理方法:

    (1)各向异性缩放

    这种方法很简单,就是不管图片的长宽比例,管它是否扭曲,进行缩放就是了,全部缩放到CNN输入的大小227*227,如下图(D)所示;

    (2)各向同性缩放

    因为图片扭曲后,估计会对后续CNN的训练精度有影响,于是作者也测试了“各向同性缩放”方案。这个有两种办法

    A、直接在原始图片中,把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪;如果已经延伸到了原始图片的外边界,那么就用bounding box中的颜色均值填充;如下图(B)所示;

    B、先把bounding box图片裁剪出来,然后用固定的背景颜色填充成正方形图片(背景颜色也是采用bounding box的像素颜色均值),如下图(C)所示;


    对于上面的异性、同性缩放,文献还有个padding处理,上面的示意图中第1、3行就是结合了padding=0,第2、4行结果图采用padding=16的结果。经过最后的试验,作者发现采用各向异性缩放、padding=16的精度最高,具体不再啰嗦。

    OK,上面处理完后,可以得到指定大小的图片,因为我们后面还要继续用这2000个候选框图片,继续训练CNN、SVM。然而人工标注的数据一张图片中就只标注了正确的bounding box,我们搜索出来的2000个矩形框也不可能会出现一个与人工标注完全匹配的候选框。因此我们需要用IOU为2000个bounding box打标签,以便下一步CNN训练使用。在CNN阶段,如果用selective search挑选出来的候选框与物体的人工标注矩形框的重叠区域IoU大于0.5,那么我们就把这个候选框标注成物体类别,否则我们就把它当做背景类别。SVM阶段的正负样本标签问题,等到了svm讲解阶段我再具体讲解。

    五、CNN特征提取阶段

    1、算法实现

    a、网络结构设计阶段

    网络架构我们有两个可选方案:第一选择经典的Alexnet;第二选择VGG16。经过测试Alexnet精度为58.5%,VGG16精度为66%。VGG这个模型的特点是选择比较小的卷积核、选择较小的跨步,这个网络的精度高,不过计算量是Alexnet的7倍。后面为了简单起见,我们就直接选用Alexnet,并进行讲解;Alexnet特征提取部分包含了5个卷积层、2个全连接层,在Alexnet中p5层神经元个数为9216、 f6、f7的神经元个数都是4096,通过这个网络训练完毕后,最后提取特征每个输入候选框图片都能得到一个4096维的特征向量。

    b、网络有监督预训练阶段

    参数初始化部分:物体检测的一个难点在于,物体标签训练数据少,如果要直接采用随机初始化CNN参数的方法,那么目前的训练数据量是远远不够的。这种情况下,最好的是采用某些方法,把参数初始化了,然后在进行有监督的参数微调,这边文献采用的是有监督的预训练。所以paper在设计网络结构的时候,是直接用Alexnet的网络,然后连参数也是直接采用它的参数,作为初始的参数值,然后再fine-tuning训练。

    网络优化求解:采用随机梯度下降法,学习速率大小为0.001;

    C、fine-tuning阶段

    我们接着采用selective search 搜索出来的候选框,然后处理到指定大小图片,继续对上面预训练的cnn模型进行fine-tuning训练。假设要检测的物体类别有N类,那么我们就需要把上面预训练阶段的CNN模型的最后一层给替换掉,替换成N+1个输出的神经元(加1,表示还有一个背景),然后这一层直接采用参数随机初始化的方法,其它网络层的参数不变;接着就可以开始继续SGD训练了。开始的时候,SGD学习率选择0.001,在每次训练的时候,我们batch size大小选择128,其中32个事正样本、96个事负样本(正负样本的定义前面已经提过,不再解释)。

    2、问题解答

    OK,看完上面的CNN过程后,我们会有一些细节方面的疑问。首先,反正CNN都是用于提取特征,那么我直接用Alexnet做特征提取,省去fine-tuning阶段可以吗?这个是可以的,你可以不需重新训练CNN,直接采用Alexnet模型,提取出p5、或者f6、f7的特征,作为特征向量,然后进行训练svm,只不过这样精度会比较低。那么问题又来了,没有fine-tuning的时候,要选择哪一层的特征作为cnn提取到的特征呢?我们有可以选择p5、f6、f7,这三层的神经元个数分别是9216、4096、4096。从p5到p6这层的参数个数是:4096*9216 ,从f6到f7的参数是4096*4096。那么具体是选择p5、还是f6,又或者是f7呢?

    文献paper给我们证明了一个理论,如果你不进行fine-tuning,也就是你直接把Alexnet模型当做万金油使用,类似于HOG、SIFT一样做特征提取,不针对特定的任务。然后把提取的特征用于分类,结果发现p5的精度竟然跟f6、f7差不多,而且f6提取到的特征还比f7的精度略高;如果你进行fine-tuning了,那么f7、f6的提取到的特征最会训练的svm分类器的精度就会飙涨。

    据此我们明白了一个道理,如果不针对特定任务进行fine-tuning,而是把CNN当做特征提取器,卷积层所学到的特征其实就是基础的共享特征提取层,就类似于SIFT算法一样,可以用于提取各种图片的特征,而f6、f7所学习到的特征是用于针对特定任务的特征。打个比方:对于人脸性别识别来说,一个CNN模型前面的卷积层所学习到的特征就类似于学习人脸共性特征,然后全连接层所学习的特征就是针对性别分类的特征了。

    还有另外一个疑问:CNN训练的时候,本来就是对bounding box的物体进行识别分类训练,是一个端到端的任务,在训练的时候最后一层softmax就是分类层,那么为什么作者闲着没事干要先用CNN做特征提取(提取fc7层数据),然后再把提取的特征用于训练svm分类器?这个是因为svm训练和cnn训练过程的正负样本定义方式各有不同,导致最后采用CNN softmax输出比采用svm精度还低。

    事情是这样的,cnn在训练的时候,对训练数据做了比较宽松的标注,比如一个bounding box可能只包含物体的一部分,那么我也把它标注为正样本,用于训练cnn;采用这个方法的主要原因在于因为CNN容易过拟合,所以需要大量的训练数据,所以在CNN训练阶段我们是对Bounding box的位置限制条件限制的比较松(IOU只要大于0.5都被标注为正样本了)

    然而svm训练的时候,因为svm适用于少样本训练,所以对于训练样本数据的IOU要求比较严格,我们只有当bounding box把整个物体都包含进去了,我们才把它标注为物体类别,然后训练svm,具体请看下文。

    六、SVM训练、测试阶段

    这是一个二分类问题,我么假设我们要检测车辆。我们知道只有当bounding box把整量车都包含在内,那才叫正样本;如果bounding box 没有包含到车辆,那么我们就可以把它当做负样本。但问题是当我们的检测窗口只有部分包好物体,那该怎么定义正负样本呢?作者测试了IOU阈值各种方案数值0,0.1,0.2,0.3,0.4,0.5。最后我们通过训练发现,如果选择IOU阈值为0.3效果最好(选择为0精度下降了4个百分点,选择0.5精度下降了5个百分点),即当重叠度小于0.3的时候,我们就把它标注为负样本。一旦CNN f7层特征被提取出来,那么我们将为每个物体累训练一个svm分类器。当我们用CNN提取2000个候选框,可以得到2000*4096这样的特征向量矩阵,然后我们只需要把这样的一个矩阵与svm权值矩阵4096*N点乘(N为分类类别数目,因为我们训练的N个svm,每个svm包好了4096个W),就可以得到结果了。

    OK,就讲到这边吧,懒得打字了,打到手酸。

    个人总结:学习这篇文献最大的意义在于作者把自己的试验过程都讲的很清楚,可以让我们学到不少的调参经验,真的是很佩服作者背后的思考。因为文献很长、细节非常之多,本人也对物体检测不感兴趣,只是随便看看文献、学学算法罢了,所以很多细节没有细看,比如7.3 bounding box的回归过程;最后看这篇文献好累、十几页,细节一大堆,包含作者各种实验、思考……

    参考文献:

    1、《Rich feature hierarchies for Accurate Object Detection and Segmentation》

    2、《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》

    **********************作者:hjimce   时间:2015.12.3  联系QQ:1393852684  原创文章,转载请保留原文地址、作者等信息***************


    展开全文
  • Android移动物体检测

    2018-04-09 11:33:45
    基于Android for OpenCV 移动物体检测代码; 基于Android for OpenCV 移动物体检测代码
  • 基于openCV+python 的一系列检测操作,较为基础
  • 现在开始讨论物体检测。还是从博客及论文开始大量学习。1.https://www.cnblogs.com/love6tao/p/7351952.html《一篇文章看懂物体检测的发展脉络》计算机视觉:第一个层次是图像分类、物体检测、语义分割第二个层次是...

    现在开始讨论物体检测。

    还是从博客及论文开始大量学习。

    1.https://www.cnblogs.com/love6tao/p/7351952.html《一篇文章看懂物体检测的发展脉络》

    计算机视觉:

    第一个层次是图像分类、物体检测、语义分割

    第二个层次是3D重建

    第三个层次是视觉问答

    物体检测典型思路:确定目标位置+置信度分类

    确定目标位置方法:

    滑动窗口穷举遍历;启发式方法,region proposal method,如Selective Search

    置信度分类:

    图像模板匹配,计算相关性;

    事先知道三维形状,进行匹配;

    图像特征表达,欧氏距离匹配;

    SIFT\HOG\LBP特征+SVM等分类器;

    DPM:Pictorial Structure(弹簧模型,允许部件位置上的一定程度的不同)+HOG dectector

    深度学习CNN提取特征然后分类{

    R-CNN 系列:先产生region proposal,然后再去分类和回归。

    SSD YOLO:一步到位

    }

    用CNN去解决检测问题的思路,基本就是这几个套路。其实还有一个方向我们并没有讨论,就是用神经网络去学习怎么做检测的后处理,例如非极大抑制(Non-Maximum Suppression)等。这类工作关注的人相对比较少,所以相关的工作也不多。不过在上面介绍的几个基本框架下,可以研究的细节还有很多,例如怎样去处理好物体的尺度问题,物体的形变问题,怎样用多任务学习来提高物体检测的性能,怎样去最好context和detail之前的平衡等等,我们就不在此做详细讨论了。

    在物体检测领域,对细节的处理直接影响到模型最终的结果

    2. https://www.cnblogs.com/sddai/p/5696870.html 《准确率(Accuracy), 精确率(Precision), 召回率(Recall)和F1-Measure》

    精确率就是有没有误检的,如果有,正确的占比多大

    召回率就是有没有漏检的,如果有,检测出来的占比多大

    注意理解 TP  FP


    展开全文
  • TensorFlow 之 物体检测

    2019-04-24 01:06:09
    NULL 博文链接:https://rensanning.iteye.com/blog/2381885
  • SSD物体检测源代码

    2018-05-30 16:35:48
    SSD物体检测源代码,基于谷歌object detection api,可以直接运行,不需要复杂的配置过程
  • 传统物体检测

    2017-05-14 16:18:46
    1 传统物体检测过程概览1.1 图像数据库汇总 数据库 图像数 类别数 应用场景 图像大小 难度 Mnist 60000 10 字符识别 28*28 容易 Cifar10 60000 10 物体分类 32*32 中等 PASCAL VOC 20010
  • yolo3物体检测源代码

    2018-05-09 17:03:21
    基于keras和tensorflow的物体检测python源代码,可以直接使用!
  • 使用中心点检测的物体检测,3D检测和姿势估计
  • 物体检测及检测方法

    2019-08-01 09:36:25
  • SNIP物体检测算法理解

    2019-02-28 21:12:41
    看了文章,觉得还不错,在现有的best object-detection model上能增加3%~4%...基本思想是:浅层的feature map语义特征比较弱,但是小物体特征比较明显,适合在较浅的层检测物体,但是对于大物体,由于语义特征比较...
  • 物体检测识别python源代码,可以识别很多类物体,源码简洁
  • 物体检测

    2018-04-13 11:35:00
    Ref: https://docs.google.com/presentation/d/1OTfGn6mLe1VWE8D0q6Tu_WwFTSoLGd4OF8WCYnOWcVo/edit#slide=id.p3 转载于:https://www.cnblogs.com/penguins/p/8819342.html
  • 视频中的物体检测

    2018-10-29 13:04:58
    使用OPENCV+VS2013实现在视频中检测物体,并用矩形框将物体标出
  • 物体检测是计算机视觉的基础环节,对于很多计算机视觉任务的落地和研究都有非常重要的意义。本次分享主要从物体检测的问题切入,讨论物体检测的发展历程,从传统视觉年代,到深度学习时代的变革,到未来的发展趋势。...
  • YOLO 物体检测

    2018-06-19 17:49:30
    YouOnly Look Once:Unified,Real-Time Object DetectionYOLO(You only look once):将物体检测重新绘制作为一个简单的回归问题,直接从图像像素生成bounding box的坐标和类的预测。Using our system, you only ...
  • RCNN物体检测

    千次阅读 2015-11-13 16:37:37
    物体检测 所以看了下CNN大火以后的几篇经典文献,OverFeat,Region CNN, Dense Neural Pattern等等。 
  • 平面物体检测

    千次阅读 2014-03-25 22:09:54
    这个教程的目标是学习如何使用 features2d 和 calib3d 模块来检测场景中的已知平面物体。 测试数据: 数据图像文件,比如 “box.png”或者“box_in_scene.png”等。 创建新的控制台(console)项目。读入两...

空空如也

1 2 3 4 5 ... 20
收藏数 11,626
精华内容 4,650
关键字:

物体检测