一. 算法背景

1. 机器视觉实际应用往往涉及包含多个物体的复杂场景,基于深度卷积神经网络的特征提取器,需要结合其他算法来准确定位多个目标,并进行识别。

2. 工业领域,目标检测算法在安防和质检系统都有广泛应用,前者可以检测出误入特定区域或穿戴不合规的人员;后者可以检测产品外观或表面缺陷。

二. yolo-v3与faster-rcnn

1. 架构

传统目标检测方法大致流程为:区域选择,特征提取,分类器分类。

yolo-v3是one-stage算法,faster-rcnn是two-stage。简言之,作为yolo系列的最新版,yolo-v3能够检测出输入的图像的目标所在区域同时给出识别结果;faster-rcnn则需要两步走,先框选出位置再做预测。前者较快而准确性稍差,后者慢但是准。

faster-rcnn:b-box回归+分类                                                    yolo-v3:统一为回归问题

2. 特征提取

yolo-v3以darknet53为基础,通过上采样,输出了3个不同尺度(13*13,26*26,52*52/深度255)的feature map(借鉴FPN)。Darknet是全卷积网络(FCN),基础结构为DBL和resn,仅使用卷积层,没有池化层和全连接层,前向传播过程中,卷积核的stride参数决定输出tensor的尺寸,共经历5次缩小(下采样)。

faster-rcnn借鉴VGG16的结构,使用一组基础的conv+relu+pooling层提取input image的feature maps, 该feature maps会用于后续的RPN层和全连接层。13个conv层不会改变图片大小(kernel_size=3,pad=1,stride=1), 4个pooling层每层输出缩小1/2。

3. b-box及类别预测

卷积层学习的特征会被分类器/回归器解析,预测坐标和类别。

yolo-v3使用1×1卷积生成了与特征图大小相同的预测图,三个尺度,深度同样是255。这个255是怎么来的?以13*13的特征图为例,可以按照这样的维度将输入图像划分为13 x 13个网格,用B表示每个网格可以预测的b-box数量(yolo-v3中B=3),其中每个b-box可能专门检测某种目标且都有5(b-box相对于左上角网格的中心坐标x,y;b-box尺寸w,h;目标分数objectness score) + C(C个类的置信度)个属性,所以特征图中有B*(5+C)=3*(5+80)=255个item(切片)。

如图,模型规定,包含目标(label决定的真实标签框)中心的网格(红色)负责预测,如何根据这个网格来预测b-box呢?基于初始尺寸,也就是anchor或者叫默认框。通过网络原始给定的anchor box坐标经过线性回归微调(平移加尺度缩放)去逐渐靠近groundtruth。在yolo-v3中anchor共有9个,可以通过k-means算法在数据集上聚类得到,每个尺寸的特征图分配3个(实际上,我们最终会在特征图中选择1个与真实标签框有最高IoU值的anchor来做b-box预测),原则上,特征图越大,感受野越小,选取的anchor越小。b-box预测基于右上图公式,tx、ty、tw、th是网络输出的offsets,其中tx,ty是预测的坐标偏移值,tw,th是尺度缩放,这4个输出可以通过真实标签框来求;cx和cy表示网格的左上角坐标;bx,by,bw,bh是预测得到的b-box的中心坐标x,y,宽度和高度,通过4个offsets间接学习,更方便;pw和ph是anchor box的宽度和高度。公式中sigmoid函数将b-box中心坐标的偏移量映射到0和1之间,这样,以图中红色网格为例,在加上偏移量cx和cy后,狗的中心依然保持在当前负责预测的红色网格中,不会出现矛盾。预测b-box的尺寸bw,bh涉及tw,th的指数运算,之后与anchor box的宽和高相乘,采用指数运算是由于在学习tw和th时尺度缩放到对数空间来避免训练带来不稳定的梯度。目标分数objectness score,是b-box内包含目标的概率,如果某个网格无object则Pr(Object) =0,否则Pr(Object) =1,这个score不仅反映了该网格是否含有物体,还反映这个bbox坐标预测的有多准,预测时乘以当前box有对象的前提下的类别条件概率Pr(class|object)就得到了具体类别分数,既反映了b-box预测的class的概率,又反映了b-box是否包含目标和b-box坐标的准确度,分类时使用sigmoid取代softmax计算类别条件概率,避免类别之间的互相排斥。在这里要明确的是,yolo_v3只会对1个anchor prior进行操作,objectness score采用的逻辑回归就是从每个scale每个网格的3个候选anchor box中找到得分最高的一个,这一步是在上述b-box坐标及尺度预测之前进行的,因此去掉了不必要的anchor,减少了计算量。图中,红色及其相邻网格的目标分数应该接近1,而位于角落的网格接近0。综上,b-box的位置、尺寸及目标分数都是通过逻辑回归来预测的。然而这样的预测方式会在3中不同尺度上共产生[(52*52)+(26*26)+(13*13)]*3=10647个预测框(3个anchor box中2个只计算置信度误差且target为0),而图像中目标只有一个。所以我们要转换到原图的坐标系,计算IOU并根据目标分数对b-box们进行过滤。首先低于阈值分数的框会被删除,然后,针对其他冗余的检测框可能导致的多重检测问题,采用NMS(非极大值抑制)加以去除。这样,就可以定位到最佳的红色网格所对应的目标分数最高的b-box并计算loss了。yolo-v3中,w, h的损失函数采用总方误差,其他部分则是binary_cross_entropy,最后把他们加到一起。

在faster-rcnn中(假定规整化后,图像的输入M*N=1000*600,特征图维度为60*40*512),特征图进入RPN后,先经过一次3*3的卷积(保持原特征图大小)集中特征信息,再分成两个分支处理。上面的分支对特征图采用维度为1*1*18的1*1全卷积,使用18是因为共有9种Anchor box,每个要区分是前景还是背景,故一共需要18个特征图来达到分类的效果。这里,Anchor box是基于base_anchor进行等面积长宽比及scales两种变换生成的。进行完1*1*18卷积后的特征图,一方面reshape成caffe需要的数据格式,用于接下来的分类任务;另一方面,为特征图上每个像素生成9个Anchor box(在base_anchor基准坐标上以w:(0~60)*16,h:(0~40)*16平移,共60*40*9=21600个,乘以感受野16是为了在原图基准上与ground truth box进行比对),并对生成的Anchor box进行过滤(去除越原图边界的box)和标记(映射到原图后与ground truth box之间IOU>0.7的为正类,IOU<0.3的为负类,其余不用于训练)。这样,我可就可以根据特征图和Anchor box的标签训练Softmax分类器,得到Anchor box分类的概率。同时,预测的anchor box与ground truth之间的偏移量也被用来学习,使得RPN网络中的权重具备在regression分支中预测box位置的能力。

regression分支对特征图采用维度为1*1*36的的1*1全卷积,使用36是因为共有9种Anchor box,每个要区分4个坐标信息,故一共需要36个特征图来达到预测的效果。进行完1*1*36卷积后的特征图,根据上述的anchor box与ground truth之间的偏移量,可以通过smooth L1(L1和L2整合)损失函数进行训练,并学习四个回归值△x, △y, △w, △h,这样就可以修正Anchor box,形成较精确的proposal。具体来说就是重新生成60*40*9个Anchor box,然后累加上训练好的△x, △y, △w, △h, 再对预测的b-box进行越界剔除和NMS,最后再取前N个b-box。这时候的b-box称为region proposal,和ground truth box一起,为后面的ROIPooling准备更具体的标签(不再是简单的前景/背景类)和偏移量。ROIPooling遍历每个region proposal并将其坐标值缩小16倍映射到VGG16最后一层产生的特征图(60*40*512)上,从而在特征图上确定一个区域。根据参数将这个区域划分为pooled_w*pooled_h个相同大小的小区域,对于每个小区域,使用max pooling选择最大的像素点作为输出,这样,就形成了最终用于定位和分类的特征图(比起ROIAlign,ROIPooling可能会经历浮点数取整,损失部分精度)。

经过ROIPooling层之后,对新的特征图进行全连接,最后依然利用Softmax和smooth L1损失函数进行分类和定位。这里的分类是计算每个region proposal具体属于哪个类别并输出概率向量,所以标签要和前面的前景/背景区别开;这里的定位过程同样是通过b-box回归,获得每个region proposal的位置偏移量,通过训练获得更加精确的目标检测框。

4. 代码实践

yolo-v3推荐:

Pytorch版复现:https://github.com/BobLiu20/YOLOv3_PyTorch 简洁无darknet cfg且容易替换基础网络。

Keras版复现:https://github.com/qqwweee/keras-yolo3 简洁易于理解。

faster-rcnn推荐:

Tensorflow版复现:https://github.com/endernewton/tf-faster-rcnn

CSDN讲解:https://blog.csdn.net/char_QwQ/article/details/80980505

5. Reference

https://blog.csdn.net/leviopku/article/details/82660381

https://blog.csdn.net/qq_34199326/article/details/84109828

https://www.jiqizhixin.com/articles/2018-04-23-3

https://www.cnblogs.com/wangyong/p/8513563.html

https://blog.csdn.net/char_QwQ/article/details/80980505

在理解及分析模型过程中,参考了宝贵的经验分享,感谢上述博主,部分图片来源于相关章节。

目标检测:yolo-v3与faster-rcnn的更多相关文章

  1. 目标检测(四)Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

    作者:Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun SPPnet.Fast R-CNN等目标检测算法已经大幅降低了目标检测网络的运行时间. ...

  2. 目标检测论文解读4——Faster R-CNN

    背景 Fast R-CNN中的region proposal阶段所采用的SS算法成为了检测网络的速度瓶颈,本文是在Fast R-CNN基础上采用RPN(Region Proposal Networks ...

  3. 目标检测算法的总结(R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD、FNP、ALEXnet、RetianNet、VGG Net-16)

    目标检测解决的是计算机视觉任务的基本问题:即What objects are where?图像中有什么目标,在哪里?这意味着,我们不仅要用算法判断图片中是不是要检测的目标, 还要在图片中标记出它的位置 ...

  4. 小白也能弄得懂的目标检测YOLO系列之YOLOv1网络训练

    上期给大家介绍了YOLO模型的检测系统和具体实现,YOLO是如何进行目标定位和目标分类的,这期主要给大家介绍YOLO是如何进行网络训练的,话不多说,马上开始! 前言: 输入图片首先被分成S*S个网格c ...

  5. 深度学习笔记之目标检测算法系列(包括RCNN、Fast RCNN、Faster RCNN和SSD)

    不多说,直接上干货! 本文一系列目标检测算法:RCNN, Fast RCNN, Faster RCNN代表当下目标检测的前沿水平,在github都给出了基于Caffe的源码. •   RCNN RCN ...

  6. 第四节,目标检测---YOLO系列

    1.R-CNN回顾 适应全卷积化CNN结构,提出全卷积化设计 共享ResNet的所有卷积层 引入变换敏感性(Translation variance) 位置敏感分值图(Position-sensiti ...

  7. [目标检测]YOLO原理

    1 YOLO 创新点: 端到端训练及推断 + 改革区域建议框式目标检测框架 + 实时目标检测 1.1 创新点 (1) 改革了区域建议框式检测框架: RCNN系列均需要生成建议框,在建议框上进行分类与回 ...

  8. 目标检测(三)Fast R-CNN

    作者:Ross Girshick 该论文提出的目标检测算法Fast Region-based Convolutional Network(Fast R-CNN)能够single-stage训练,并且可 ...

  9. 目标检测-yolo

    论文下载:http://arxiv.org/abs/1506.02640 代码下载:https://github.com/pjreddie/darknet 1.创新点 端到端训练及推断 + 改革区域建 ...

  10. 目标检测YOLO进化史之yolov1

    yolov3在目标检测领域可以算得上是state-of-art级别的了,在实时性和准确性上都有很好的保证.yolo也不是一开始就达到了这么好的效果,本身也是经历了不断地演进的. yolov1 测试图片 ...

随机推荐

  1. Web测试中定位bug的方法

    在web测试过程中,经常会遇到页面中内容或数据显示错误,甚至不显示,第一反应就是BUG,没错,确实是BUG.进一步了解这个BUG的问题出在那里,是测试人员需要掌握的,可以简单的使用浏览器自带开发者工具 ...

  2. django 数据库中的表生成model

    https://blog.csdn.net/weixin_34405354/article/details/93582647 还没有证实是否有效

  3. git 远程托管

    1.创建别名 git remote add orgin(别名) url 2.推入云端 git push 别名 master(分支) git push 别名 dev 3.克隆(默认只有master分支) ...

  4. kuangbin专题专题十一 网络流 POJ 3436 ACM Computer Factory

    题目链接:https://vjudge.net/problem/POJ-3436 Sample input 1 3 4 15 0 0 0 0 1 0 10 0 0 0 0 1 1 30 0 1 2 1 ...

  5. Python-logging模块简单使用

    logging模块只要用于日志的打印.模块的源码在:Lib/logging/__init__.py 其中,logging.basicConfig(**kwargs)方法用于进行基本的属性配置,它的参数 ...

  6. AVLTree(C++实现)没有统一旋转操作

    最近疫情比较严重,只能在家里休息,利用休息之余,我用C++把AVL树实现了一遍 大学老师只讲一些比较简单的数据结构和算法,这些高级数据结构还是需要自己主动学习并且动手来实现的, 从前只听说过AVLTr ...

  7. mybatis generator cmd 终端命令 生成dao model mapper

    mybatis generator cmd 终端命令 生成dao model mapper 文件包下载 mybatis-generator-core-1.3.2.jar 下载地址:https://gi ...

  8. Kafka系列1:Kafka概况

    Kafka系列1:Kafka概况 Kafka是当前分布式系统中最流行的消息中间件之一,凭借着其高吞吐量的设计,在日志收集系统和消息系统的应用场景中深得开发者喜爱.本篇就聊聊Kafka相关的一些知识点. ...

  9. spring mvc 框架运行机制 + 数据绑定原理

    spring mvc 运行主要的组件: 1 前端控制器 (dispatchservlet) 相当于一个重要处理器,它用来调用其他功能模块来分工的效应一次请求,主要起调度的作用. 2. handler ...

  10. Pileup 格式详细说明

    转自: https://blog.csdn.net/herokoking/article/details/79276939 Pileup 格式最初是由Sanger Institute的Tony Cox ...