
传统的目标检测算法适用的场景有限,而且维护成本很大。深度学习方法应用于目标检测,不仅算法适应性好,还可以进行迁移学习,降低成本。
深度学习目标检测算法中,基于锚框(Anchor)的方法主要分为 一阶段 方法和 两阶段 方法。
两阶段 方法先对感兴趣的区域进行选择,然后进一步对候选框内做分类和回归,最终输出选择的框以及对应的分类。两阶段的模型有R-CNN系列,比如 R-CNN,Fast-RCNN,Faster-RCNN 等。两阶段模型的优点是精度高,但是速度及较慢。
一阶段 方法直接对anchor进行回归和分类,得到最终目标框厅做和类别,算法有 YOLOv2,v3,SSD,RetinaNet 等。一阶段模型的推理速度较快,但是相对的精度会下降一些。
此外还有一些 anchor-free 的方法,包括基于关键点的检测算法以及基于中心检测算法等。
下面是一些基础概念和缩写:
BBox :Bounding Box 边界框
Anchor :锚框
RoI : Region of Interest 特定的感兴趣区域
Region Proposal : 候选区域
RPN : Region proposal network 提取候选区域的网络
IoU : Intersaction over Union (Area of Overlap/ Area of Union) 交并比,预测框的质量
mAP :mean average precision
NMS :non-maximum suppression 非极大值抑制
YOLO系列的模型在保有一定精度的基础上拥有很快的推理速度,在下面图中YOLOv3的推理速度远超其他模型,因此在实时监测领域中有很好的应用。
YOLO的名字来源于you only look once,从名字上就道出了YOLO的精髓。
YOLOv1将图像划分为S*S个网络,物体真实框的中心落在哪个网格上,哪个网格对应的锚框就负责检测物体。
每个网格会预测一个边界框以及对应的置信度,这里的置信度反映的是模型认为这个框里包含着物体的把握以及它预测到这个物体的精确程度。所以置信度就等于 。如果物体不存在,那么置信度应该等于零。
每个边界框会预测5个值 。(x,y)坐标表示框相对于网格单元边界的中心。 w,y是相对于整个图像预测宽度和高度。 最后,置信度预测表示预测框与任何真实框之间的IOU。
YOLOv2在v1的基础上进行了优化,骨干网络使用了DarkNet19,并且将输入图片给尺寸从224增大到448,并且将网络结构设为全卷积网络结构加上Batch Norm,使用了Kmeans聚类方法来计算anchor,引入了多尺度训练,使网络在训练过程中学习不同尺度的图像。不过待改进的地方有在小目标上召回率不高,靠近的群体目标检测效果不好,检测精度还有优化空间。
YOLOv3使用了更加深的骨干网络DarkNet53,同时加入了多尺度预测,在COCO数据集上聚类; 9中不同尺度的anchor,在分类上使用sigmoid激活函数,支持了目标的多分类。YOLOv3的优点是推理速度快,性价比高,通用性强;缺点是召回率较扮碧衡低,定位精度较差,对于靠近或者遮挡的群体、小物体的检测能力相对较弱。
YOLOv3在v1的基础上做了很多改动。
边界框预测
YOLOv3使用聚类预测到的边界框作为锚框。网络为边界框预测4个坐标值 ,如果单元格从图像的左上角偏移了 ,并且先验边界框的宽度和高度为 ,则预测如下图:
YOLOv3给每个边界框用慧纤逻辑回归预测一个objectness score,如果某个边界框和真实框重合度比其他都高,那么它的objectness score应该是1。而其他框虽然也与真实框有重叠,会被忽略掉。
类别预测
使用的是sigmoid函数,没有用softmax因为没必要。
不同尺度的预测
YOLOv3使用k-means聚类来确定bounding box priors,选择了9个clusters和3个scales,然后在整个scales上均匀分割clusters。在COCO数据集上,9个cluster分别为(10×13),(16×30),(33×23),(30×61),(62×45),(59×119),(116×90) ,(156×198),(373×326)。
特征提取
YOLOv3使用了Darknet-53,特点是加入了残差,比之前的网络更深了(有53层卷积层所以叫Darknet-53)。
借一张图看一下YOLOv3的整个流程:
每个输出分支上对应着三个尺寸的先验框(总共3 3=9种尺度)。经过32倍下采样的网格,每一个网格对应着输入图像上32 32的区域,适合检测尺寸较大的目标,而8倍下采样的网格适合检测尺寸小的目标。
输出特征的高度H和宽度W,相当于将图像划分为H*W个网格,而不是直接在图像上画网格。也就是说32倍下采样之后得到的 ,相当于在输入图像上划一个 的网格,每一个网格对应着输出特征图上的一个点。
特征图的C通道上表示预测框的信息,包括坐标信息 ,目标置信度,分类。
C=B*(1+4+class_num),B为特征图上分配的锚框个数。
损失函数有三个,分类损失,定位损失和objectness损失。分类使用sigmoid激活函数,loss是sigmoid cross entropy。定位损失在x,y上使用sigmoid函数和sigmoid cross entropy损失,在w,h上使用L1损失。objectness损失用的是sigmoid激活函数和sigmoid cross entropy损失。
对于与真实框重叠的框,三种损失都要计算
对于没有真实框重叠的框,只计算objectness(0);对于与真实框重叠但不是最匹配的框,忽略它们。
YOLOv3: An Incremental Improvement 按照原文的说法,它其实是一篇技术试验的报告。本文通过一些试验来改进yolo方法。
这部分的预测和yolov2是一样的,详情可以参核虚考 yolov2算法详解 。
文章采用的是多标签的分类方法,文章认为softmax对于好的预测结果的获取不一定是有帮助的。训练的时候类别的loss采用的是binary cross-entropy loss。
对于多尺改誉燃度框的预测类似于有FPN结构的fastrcnn,不同的feature大小负责不同大小的框的检测。为了更好的解释,先看看yolov3的网络结构
上面为yolov3新提出的网络用于分类任务,网络中采用了resnet提出的残差结构,并且使用了53层卷积,所以网络称为Darknet-53。不同于分类任务,检测任务需要多尺度的特征来检测不同虚简尺度的物体,所以需要采用FPN的结构,具体网络结构图如下,下图中图片输入大小为416,通道顺序为(N,C,H,W),每个方块中的括号里的维度代表该方块的输出feature维度,标红的框为最终的输出
可以看到类似FPN结构有三层的输出,这里每一层有3类的anchor,三层总共为9类,而这9类anchor的设定是使用yolov2提出的kmeans聚类选出来的,不同数据集不一样,对于COCO数据集来说为 这9类尺度。
需要说明的是,上图中输出的通道是255,这个数字是针对COCO数据集有80类来举例的,具体的就是[3 * (4 + 1 + 80)] = 255,3表示3类anchor,4表示预测的框,1表示框的置信度,80表示类别置信度
上述1,2点可以参考 yolov2算法详解 , 第3点参考 Focal Loss for Dense Object Detection论文详解 ,第4点参考 Faster R-CNN文章详细解读
Yolo系列采用了one-stage的识别方案,故名思意,就是一个阶段,图像进来之后,卷积提取特征,到和labels计算损失,他就一个阶段。相教于fasterrcnn,masterrcnn等需要生成大量候选框的two-stage方案,在识别速度上还是比较到位的,这样就使得它非常的实用,传说被美军应用在了导d识别方面,传说的很玄乎,也确实,无论在速度还是准确率,yolov3都做的非常不错。
我们看下yolov3的结构,先附上一张整体结构图。
从上到下我们走一遍YOLOV3流程。
1.A位置,当图像输入进来以后,图像的尺寸并不是正方形的,为了后面的计算方便,我们首先把他转换成能被32整除的正方形。为什么是32,整个网络要经过16次放缩变换(步长为2的卷积 *** 作{替代池化}),最后得到的特征图尺寸是11*11 或者12*12或者14*14这样的方格。每次转换称的正方形图像并不是固定尺寸,这样就增强了网络适应不同大小图像的能力.
2.B位置, 一个conv2d是Convolution卷积+Batch Normalization+Leaky_relu激活的组合。Batch Normalization归一化替代正则,提升模型收敛速度。Leaky_relu软路激活解决了relu激活时负数不迹链学习的问题。
从A位置进来416*416*3的图像,经过了32(32个卷积核)*3*3(卷积核的尺寸3*3) 步长为1的卷积 *** 作之后,变成了416*416*32的输出。
3.B到C过程中,我们看到图像尺寸从416*416转换成208*208,中间有一层步长为2的卷积层,来替代池化层。比单纯的用池化层效果要好一些姿液孙。
4.C位置,这里是卷积和残差连接的组合,yolov3的残差连接是同模块内的残差连接,shape相同才能连接。
C位置以下的resnet层 ,我们就不再说明了,原理和连接都是一致的。越往下,特征图的尺寸约小,特征核的层数越多。
5.我们看下E位置的尺寸是13*13*1024,D位置的尺寸是26*26*512 ,越往下的层越能识别大物体,而上面的层越能识别小物体,我们把上下两层相加,使得它同时具备了识别大物体和小物体的能力。上下两层即E层和D层怎么融合呢,我们把E层上采样,变成26*26*256,这样他就能和D层首尾相连进行拼合了。
6.拼合以后我们看到到了F位置,注意F位置的尺寸 (batch_size,26,26,75),分类数是 70 ,这里却是75,多出来的五个就是,x,y,w,h,conf(是物体与不是物体的判断)。
7.YOLO层是一个预测值和Lables目标值相减求损失的层。
yolov3一共有三个YOLO层分别去训练网络,为什么有三个,较小的特征图有比较大的视埋败野,教大的特征图有比较小的视野,这样yolo3就拥有了既能识别大目标也能识别小目标的能力,同时,一个点既能是一种分类,也可以属于另外的分类.
8.好了,pytorch执行loss.back(),反向传播,就开始训练了。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)