前言

谈到计算机视觉时,我们都会联想到图像分类,图像分类是计算机视觉最基本的任务之一,在图像分类的基础上,我们还有更复杂的任务,比如目标检测,物体定位,图像分割等,本文主要讲目标检测,目标检测是分类与定位的结合,在给定一张图片,目标检测的任务是要识别出图片的目标以及它的位置,由于图片中的目标个数不确定,且要精确定位目标,目标检测比分类任务更复杂。                         

        目标检测 

目标检测目前有两类流行算法:一类是基于Region Proposal的R-cnn系列(比如r-cnn,fast r-cnn,faster r-cnn),他们是属于two stage的,需要先使用Selective search 或者cnn网络(RPN)来产生Region proposal,然后再对Region proposal上做分类和回归。另一类就是yolo,ssd系列的one stage算法,它仅仅使用一个cnn来直接预测不同目标的类别和位置;第一类方法精确度要高一些,但速度比较慢,第二类方法精确度相比第一类要低一些,但速度比较快。本文主要讲述YOLO v1算法的原理。

一. yolo v1算法原理

从整体上看,yolo是通过一个cnn网络模型来实现end-to-end的目标检测,整个流程如下图所示:

YOLO的检测过程

该过程整体上首先是将输入的图像resize成448*448的大小,然后送入cnn中,运行该cnn网络,接着采用非极大值抑制的方法进行筛选,最后处理网络预测结果得到检测的目标。

接下来详细的分析整个过程,首先对输入的图像resize成448*448的大小送入到cnn模型中,yolo中的cnn模型是将输入的图像分割成S*S大小的网格,然后对每一个单元格都会预测B个边界框(bounding boxes),每个边界框都包含5个预测值:x,y,w,h 和confidence(置信度),其中x,y就是预测边界框的中心坐标,中心坐标(x,y)的预测值 是相对于该单元格左上角坐标点的偏移值,并且单位是相对于单元格大小的,与单元格对齐(即相对于当前grid cell的偏移值),使得范围变成0到1,单元格的坐标定义如图1所示;而边界框的w和h的预测值是相对于整个图片的宽和高的比例(即w和h进行归一化,分别除以图像的w和h,这样最后的w和h就在0到1范围了)。另外每一个单元格(grid cell)都有C个类别的概率预测值,其表示的是由该单元格负责预测的边界框,在包含目标条件下属于各个类别的概率。但是这些概率值其实是在各个边界框置信度下的条件概率,即p(classi  | object).

                        图1

所谓置信度其实就是这个边界框含有目标的可能性大小与这个边界框的准确度的乘积。前者记为Pr(object),当边界框的为背景时(没有目标),Pr(object)=0,当边界框包含目标时,Pr(object)=1,

后者记为边界框的准确度可以用预测框与实际框(ground truth)的IOU(intersection over union,交并比)来表示,记为 因此置信度为

前面已经有每一个单元格(grid cell)的C个类别的概率预测值Pr(class i  | object),我们可以计算每个边界框的类别置信度

边界框类别置信度反映的是该边界框中目标属于各个类别的可能性大小以及边界框匹配目标的好坏

每个边界框的类别置信度的过程图如下:这里把图片分割成了7*7的网格,每个单元格有2个预测边框,一共有20个类别,则整张图片共有7*7*2个边框,每个边框的类别置信度为20*1

 图2

即得到每个边界框属于20类的confidence score。也就是说最后会得到20*(7*7*2)=20*98的置信度矩阵。

二.网络模型

网络上采用的是GoogLeNet,24个卷积层+2个全连接层,卷积层主要用来提取特征,全连接层主要用来预测类别概率和坐标。输入的是448*448,最后的输出是7*7*30,这个30是20+2*5,20代表类别数量,2代表每一个单元格有2个边界框,5代表(x,y,w,h,c),具体含义前面讲过,7*7是单元格的数量。模型如下图3

图3

PS:这里有三点需要注意

①原文YOLO模型未使用inception module,而是使用1x1卷积层(此处1x1卷积层的存在是为了跨通道信息整合)+3x3卷积层简单替代

②原文YOLO作者先在ImageNet数据集上预训练网络,而且网络只采用fig3的前面20个卷积层,输入是224*224大小的图像。然后在检测的时候再加上随机初始化的4个卷积层和2个全连接层,同时输入改为更高分辨率的448*448。

③Relu层改为pRelu,即当x<0时,激活值是0.1*x,而不是传统的0。

三.损失函数

YOLO算法是将目标检测看出一个回归问题,所以将均方差作为损失函数,损失函数分为定位误差部分和分类误差部分,对于不同部分他们的比重值λ;对于定位误差,即边界框中心坐标误差以及边界框的宽高误差,均采用的比重是λcoord​=5,而对于不含目标的边界框的置信度误差所采用的比重是λnoobj​=0.5,含有目标的边框的置信度误差的比重λ=1,每个单元格的分类误差的比重λ=1,所以采用均方误差

对于相等的误差值,大物体误差对检测的影响应小于小物体误差对检测的影响。这是因为,相等的位置偏差占大物体的比例远小于同等偏差占小物体的比例,比如原来大物体w=10,h=20,预测出来w=8,h=22,跟原来小物体w=3,h=5,预测出来w1,h=7相比,经过计算两个物体损失影响是一样的,实际上大物体的误差对检测的影响要比小物体小,所以YOLO将物体大小的信息项(w和h)进行求平方根来改进这个问题,即预测值变为了(x,y,w,h)

另外由于每一个单元格有多个边界框,但是每一个单元格其对应类别只有一个,如果在训练时,多个边界框存在目标,那就只选择与真实边框(ground truth)的IOU最大的那个边界框来负责预测该目标,而其它边界框认为不存在目标。这样设置的结果使每一个单元格只对应一个边框,一个类别。大家可能会想如果一个单元格内存在多个目标怎么办,其实这时候Yolo算法就只能选择其中一个来训练,这也是Yolo算法的缺点之一。要注意的一点时,对于不存在对应目标的边界框,其误差项就是只有置信度,坐标项误差是没法计算的。而只有当一个单元格内确实存在目标时,才计算分类误差项,否则该项也是无法计算的。
综上所述,损失函数如下:

第一行的式子表示边界框中心坐标的误差,第二行式子表示边界框的宽高误差,第三行式子表示含有目标的边界框的置信度误差,第四项式子表示不含有目标的边界框的置信度误差,第五行式子表示含有目标的单元格的类别误差;这里注意置信度Ci的值,如果不存在目标,则Pr(object)=0,那么置信度Ci=0,如果存在目标,则Pr(object)=1,需要确定值,才能得到置信度Ci的值;为了方便计算,你可以将Ci置为1;

四.网络训练

前面已经讲过YOLO的cnn模型(GoogleNet),在训练之前,先在ImageNet上进行了预训练,其预训练的分类模型采用之前图中前20个卷积层,然后添加一个average-pool层和全连接层。预训练之后,在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层。由于检测任务一般需要更高清的图片,所以将网络的输入从224x224增加到了448x448。整个网络的流程如下图所示:

一张图片经过该模型的处理后得到一个7*7*30的张量,刚好是我们需要的所有数据信息,这个30是20+2*5,20代表类别数量,2代表每一个单元格有2个边界框,5代表(x,y,w,h,c),具体含义前面讲过,7*7是单元格的数量。我们可以将其划分为三个部分:①类别概率部分,[7,7,20],②边界框置信度部分,[7,7,2],③边界框部分,[7,7,2,4],类别概率部分*边界框置信度部分=边界框类别置信度(矩阵[7,7,2]乘以[7,7,20],为了方便计算,我们可以先将它们各补一个维度来完成[7,7,2,1]×[7,7,1,20]),两者相乘可以得到边界框类别置信度[7,7,2,20],这里总共有7*7*2=98个边界框,如前面的图二所示,所有的数据信息已经得到,接下来有两种策略得到边界框的类别结果和置信度

第一种策略:对于每个预测框选择类别置信度最大的类别作为该预测框的类别标签,然后通过上一步得到了每个预测框的类别标签以及该类别的置信度,然后设置置信度阈值,将小于该置信度阈值的边框过滤掉,经过这样处理后,剩下的就是置信度比较高的边框,然后对这些预测框进行NMS算法处理,最后留下来的检测结果。

这里提一下非极大值抑制算法(NMS),NMS算法主要解决一个目标被多次检测到的问题,比如人脸识别,如果人脸被多个边界框检测到,这时我们通过nms算法得到的是一个效果最好的检测框;NMS算法原理是首先从所有预测边界框中选择类别置信度最大的边界框,然后计算该边界框与剩余其他边界框进行IOU(交并比),如果其IOU值大于一定阈值(重复度过高),则将该边界框过滤掉,接下来对剩余的边界框重复上述过程,直至处理完所有的边界框。

第二种策略:是原YOLO论文中使用的策略,首先对每个类别使用NMS,然后再确定各个边界框的类别,其过程如下图4所示,其过程是对于7*7*2=98个边界框,首先设置一定阈值,然后对每一个边界框的类别置信度与阈值作比较,如果小于该阈值,则将该类别置信度设置为0,接着对所有边界框的置信度从高到低做排序,然后对所有边界框分类别(矩阵的每一行)进行NMS,得到一个最佳边界框获得该类别以及其置信度(该过程NMS:针对某一类别,选择类别置信度最大的bounding box,然后计算它和其它bounding box的IOU值,如果IOU大于阈值0.5,说明重复率较大,该置信度设为0,如果IOU不大于阈值0.5,则不改,再选择该行剩下的置信度里面最大的那个bounding box,然后计算该bounding box和其它bounding box的IOU,重复比较阈值过程,直到这一行所有的边界框结束为止;然后进行下一个类别,每一类别重复以上过程直到最后),这里不是剔除其他边界框,最后从每一个边界框中选择最大的类别置信度作为该边界框的类别标签以及置信度,最后筛选出置信度大于0的边界框作为检测的最后结果,如果小于0,说明这个边界框里面没有物体,跳过即可

   图4

五.YOLO v1的代码实现

源码:https://e.coding.net/xucancan1/yolov1/YOLOv1.git

效果:

六.YOLO的优缺点

优点:

第一点Yolo采用一个CNN网络来实现检测,是单管道策略,其训练与预测都是end-to-end,所以Yolo算法比较简洁且速度快。

第二点由于Yolo是对整张图片做卷积,所以其在检测目标有更大的视野,它不容易对背景误判。

缺点:

第一点Yolo各个单元格仅仅预测两个边界框,而且属于一个类别,如果一个单元格有两个以上的目标,就只能预测一个,对于小目标物体以及物体比较密集的也检测不好,比如一群小鸟

第二点定位不准确,Yolo对于在物体的宽高比方面泛化率低,就是无法定位不寻常比例的物体。

参考:

https://blog.csdn.net/u014380165/article/details/72616238

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

目标检测 /yolo算法原理的详解相关推荐

  1. 目标检测 | RCNN算法系列汇总+详解(包括Fast, Faster)

    一.RCNN 1. 介绍 2. 步骤流程 3. 部分详解 4. 缺点 二.Fast RCNN 1. 介绍: 2. 步骤流程 3. 部分详解 4. 比较 三.Faster RCNN 1. 介绍 2. 步 ...

  2. 目标检测特殊层:PSROIPooling详解

    1. Position Sensitive ROI-Pooling 简介 Position Sensitive ROI Pooling(位置敏感的候选区域池化)是检测框架R-FCN的主要创新点.一般来 ...

  3. 今日头条推荐算法原理全文详解之一

    本次分享将主要介绍今日头条推荐系统概览以及内容分析.用户标签.评估分析,内容安全等原理. 今日头条推荐算法原理全文详解 今日头条 数据分析 产品经理 产品 好文分享 第1张 一.系统概览 推荐系统,如 ...

  4. 抖音推荐算法原理全文详解

    阅读目录 一.系统概览 二.内容分析 三.用户标签 四.评估分析 五.内容安全 抖音推荐算法原理全文详解 本次分享将主要介绍今日头条推荐系统概览以及内容分析.用户标签.评估分析,内容安全等原理. 回到 ...

  5. 深度学习之目标检测(十一)--DETR详解

    深度学习之目标检测(十一)-- DETR详解 目录 深度学习之目标检测(十一)-- DETR详解 1. 前言 2. DETR 框架 2.1 CNN Backbone 2.2 Transformer E ...

  6. onestage方法_目标检测——One-stage和Two-stage的详解

    目标检测--One-stage和Two-stage的详解 发布时间:2019-01-15 14:16, 浏览次数:2784 , 标签: One stage Two 二.Two-stage类别的目标检测 ...

  7. 今日头条推荐算法原理全文详解之四

    三.用户标签 内容分析和用户标签是推荐系统的两大基石.内容分析涉及到机器学习的内容多一些,相比而言,用户标签工程挑战更大. 今日头条推荐算法原理全文详解 今日头条 数据分析 产品经理 产品 好文分享 ...

  8. 目标检测经典算法和API详解(笔记)

    文章目录 商品目标检测 1. 目标检测概述 1.1.项目演示介绍 学习目标 1.1.1 项目演示 1.1.2 项目结构 1.1.3 项目安排 1.2 图像识别背景 学习目标 1.2.1 图像识别三大任 ...

  9. 目标检测-YOLO算法实现

    注:此篇博文未经过仔细整理,几乎全文拷贝参考论文,写得并不清楚,仅用来博主未来自查.未免浪费读者时间,特此注明! 前段时间跟着吴恩达大牛的视频学了深度学习,做了课后的作业"YOLO算法实现自 ...

最新文章

  1. mysql索引红黑联盟_MySQL索引
  2. javascript设计模式-模板方法模式(Template)
  3. Android—EventBus使用与源码分析
  4. 全国计算机等级考试题库二级C操作题100套(第66套)
  5. JS根据文本框内容匹配并高亮显示
  6. 设置在最小数目的阵列
  7. make_pair 简单使用
  8. rpg制作大师2003_RPG制作大师MV 我们一起做游戏(十五)
  9. 新道电子沙盘系统_电子沙盘系统在房地产开发与销售过程中的优势
  10. 数字集成电路设计之加法器
  11. linux 有dll文件吗,linux上可以运行dll吗
  12. 软件工程师是青春饭吗?
  13. 重新安装Windows应用商店
  14. cf 581B-------Luxurious Houses
  15. 网络与社会导论课上所学感悟
  16. WEB - 作业(1)
  17. conda创建环境报错conda.core.subdir_data.Response304ContentUnchanged
  18. 张亚飞《.Net for Flash FMS》读后笔记一
  19. 国内一元夺宝行业兴起 需理性区别对待
  20. 【UE4】unlua往c++传动态委托参数的方式

热门文章

  1. GDCM:将PDF文件转换为DICOM / PDF文件的测试程序
  2. Boost:以协程的方式实现重构echo服务器的实例
  3. DCMTK:DcmItem和DcmSequenceOfItem的路径功能测试程序
  4. VTK:可视化算法之CutWithCutFunction
  5. VTK:可视化算法之CreateBFont
  6. QML中定义JavaScript资源
  7. Qt Creator使用版本控制系统
  8. OpenGL HDR曝光的实例
  9. c++中的引用和指针
  10. C++union 联合