ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

目标检测:yolo-v3与faster-rcnn

2020-02-19 12:54:22  阅读:1647  来源: 互联网

标签:box faster yolo 网格 v3 anchor 预测


一. 算法背景

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

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

二. yolo-v3与faster-rcnn

1. 架构

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

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

 

 faster-rcnn:回归(物体位置bounding 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

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

 

标签:box,faster,yolo,网格,v3,anchor,预测
来源: https://www.cnblogs.com/lh2n18/p/12310935.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有