目录
YOLO系列算法
学习目标
- 知道yolo网络架构,理解其输入输出
- 知道yolo模型的训练样本构建的方法
- 理解yolo模型的损失函数
- 知道yoloV2模型的改进方法
- 知道yoloV3的多尺度检测方法
- 知道yoloV3模型的网络结构及网络输出
- 了解yoloV3模型先验框设计的方法
- 知道yoloV3模型为什么适用于多标签的目标分类
- 了解yoloV4模型
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u1IVdIYj-1646276606890)(笔记图片/image-20200915142921616.png)]](https://img-blog.csdnimg.cn/dff370908cee4889b3e0035811392e5a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
YOLO系列算法是一类典型的one-stage目标检测算法,其利用anchor box将分类与目标定位的回归问题结合起来,从而做到了高效、灵活和泛化性能好,所以在工业界也十分受欢迎,接下来我们介绍YOLO 系列算法。
yolo算法
Yolo算法采用一个单独的CNN模型实现end-to-end的目标检测,核心思想就是利用整张图作为网络的输入,直接在输出层回归 bounding box(边界框) 的位置及其所属的类别,整个系统如下图所示:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W7Rgq5YO-1646276606891)(笔记图片/image-20200915144129736.png)]](https://img-blog.csdnimg.cn/99eaad6ff3024b51aaa06538b355bc83.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
首先将输入图片resize到448x448,然后送入CNN网络,最后处理网络预测结果得到检测的目标。相比R-CNN算法,其是一个统一的框架,其速度更快。
Yolo算法思想
在介绍Yolo算法之前,我们回忆下RCNN模型,RCNN模型提出了候选区(Region Proposals)的方法,先从图片中搜索出一些可能存在对象的候选区(Selective Search),大概2000个左右,然后对每个候选区进行对象识别,但处理速度较慢。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uIVmkMmT-1646276606892)(笔记图片/image-20200915150333995.png)]](https://img-blog.csdnimg.cn/644f586f3460443da571ed376141d332.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
Yolo意思是You Only Look Once,它并没有真正的去掉候选区域,而是创造性的将候选区和目标分类合二为一,看一眼图片就能知道有哪些对象以及它们的位置。
Yolo模型采用预定义预测区域的方法来完成目标检测,具体而言是将原始图像划分为 7x7=49 个网格(grid),每个网格允许预测出2个边框(bounding box,包含某个对象的矩形框),总共 49x2=98 个bounding box。我们将其理解为98个预测区,很粗略的覆盖了图片的整个区域,就在这98个预测区中进行目标检测。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pKAVNy6q-1646276606892)(笔记图片/image-20200915150718666.png)]](https://img-blog.csdnimg.cn/ba98440dc544491baa13350829aa0a49.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
只要得到这98个区域的目标分类和回归结果,再进行NMS就可以得到最终的目标检测结果。那具体要怎样实现呢?
Yolo的网络结构
YOLO的结构非常简单,就是单纯的卷积、池化最后加了两层全连接,从网络结构上看,与前面介绍的CNN分类网络没有本质的区别,最大的差异是输出层用线性函数做激活函数,因为需要预测bounding box的位置(数值型),而不仅仅是对象的概率。所以粗略来说,YOLO的整个结构就是输入图片经过神经网络的变换得到一个输出的张量,如下图所示:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5IrhY9yq-1646276606893)(笔记图片/image-20200915151948836.png)]](https://img-blog.csdnimg.cn/e2529bbce9c74c9eba5a91e81fd6af94.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
网络结构比较简单,重点是我们要理解网络输入与输出之间的关系。
网络输入
网络的输入是原始图像,唯一的要求是缩放到448x448的大小。主要是因为Yolo的网络中,卷积层最后接了两个全连接层,全连接层是要求固定大小的向量作为输入,所以Yolo的输入图像的大小固定为448x448。
网络输出
网络的输出就是一个7x7x30 的张量(tensor)。那这个输出结果我们要怎么理解那?
7X7网格
根据YOLO的设计,输入图像被划分为 7x7 的网格(grid),输出张量中的 7x7 就对应着输入图像的 7x7 网格。或者我们把 7x7x30 的张量看作 7x7=49个30维的向量,也就是输入图像中的每个网格对应输出一个30维的向量。如下图所示,比如输入图像左上角的网格对应到输出张量中左上角的向量。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Opjy0IEm-1646276606893)(笔记图片/image-20200915152825629.png)]](https://img-blog.csdnimg.cn/9663caa942d54021b5673f03b451c6a7.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
30维向量
30维的向量包含:2个bbox的位置和置信度以及该网格属于20个类别的概率
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dvHTUC0q-1646276606894)(笔记图片/image-20200915153123684.png)]](https://img-blog.csdnimg.cn/123c14630bde4590826979ac2a5128d7.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
- 2个bounding box的位置 每个bounding box需要4个数值来表示其位置,(Center_x,Center_y,width,height),即(bounding box的中心点的x坐标,y坐标,bounding box的宽度,高度),2个bounding box共需要8个数值来表示其位置。
- 2个bounding box的置信度 bounding box的置信度 = 该bounding box内存在对象的概率 * 该bounding box与该对象实际bounding box的IOU,用公式表示就是:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yCA8yb7G-1646276606894)(笔记图片/image-20200915153543735.png)]](https://img-blog.csdnimg.cn/4191517e545d45fd8dbf09eee9ae54fc.png)
Pr(Object)是bounding box内存在对象的概率
- 20个对象分类的概率
Yolo支持识别20种不同的对象(人、鸟、猫、汽车、椅子等),所以这里有20个值表示该网格位置存在任一种对象的概率.
Yolo模型的训练
在进行模型训练时,我们需要构造训练样本和设计损失函数,才能利用梯度下降对网络进行训练。
训练样本的构建
将一幅图片输入到yolo模型中,对应的输出是一个7x7x30张量,构建标签label时对于原图像中的每一个网格grid都需要构建一个30维的向量。对照下图我们来构建目标向量:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dRlyHzQJ-1646276606895)(笔记图片/image-20200915155204485.png)]](https://img-blog.csdnimg.cn/62951fdd999942f5931b559b1bd63354.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_15,color_FFFFFF,t_70,g_se,x_16)
- 20个对象分类的概率
对于输入图像中的每个对象,先找到其中心点。比如上图中自行车,其中心点在黄色圆点位置,中心点落在黄色网格内,所以这个黄色网格对应的30维向量中,自行车的概率是1,其它对象的概率是0。所有其它48个网格的30维向量中,该自行车的概率都是0。这就是所谓的"中心点所在的网格对预测该对象负责"。狗和汽车的分类概率也是同样的方法填写
- 2个bounding box的位置
训练样本的bbox位置应该填写对象真实的位置bbox,但一个对象对应了2个bounding box,该填哪一个呢?需要根据网络输出的bbox与对象实际bbox的IOU来选择,所以要在训练过程中动态决定到底填哪一个bbox。
- 2个bounding box的置信度
预测置信度的公式为:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2TgxHUzV-1646276606896)(笔记图片/image-20200915155812745.png)]](https://img-blog.csdnimg.cn/f76c68b50ccf4deeb753811090b34f54.png)
IOUpredtruth利用网络输出的2个bounding box与对象真实bounding box计算出来。然后看这2个bounding box的IOU,哪个比较大,就由哪个bounding box来负责预测该对象是否存在,即该bounding box的置信度目标值为1,同时对象真实bounding box的位置也就填入该bounding box。另一个不负责预测的bounding box的置信度目标值为0。
上图中自行车所在的grid对应的结果如下图所示:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t5Bd4u8i-1646276606897)(笔记图片/image-20200915160053996.png)]](https://img-blog.csdnimg.cn/f7ea04b45a3f494b87952fe54e73c291.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
损失函数
损失就是网络实际输出值与样本标签值之间的偏差:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ft5wrUDh-1646276606897)(笔记图片/image-20200915160218266.png)]](https://img-blog.csdnimg.cn/5d3932f628e64f58b8614bb5cc7f8fce.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
yolo给出的损失函数:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1xT6CEhL-1646276606898)(笔记图片/image-20200915160632201.png)]](https://img-blog.csdnimg.cn/3ed121f532f94b9eadfb7b410036ae72.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
注:其中1iobj表示目标是否出现在网格单元i中,1ijobj表示单元格i中的第j个边界框预测器负责该预测,YOLO设置 λcoord=5 来调高位置误差的权重, λnoobj=0.5 即调低不存在对象的bounding box的置信度误差的权重。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pKMlwwEX-1646276606899)(笔记图片/image-20200915160850102.png)]](https://img-blog.csdnimg.cn/f4f2578e36444fd8a77d501fc846adf9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
模型训练
Yolo先使用ImageNet数据集对前20层卷积网络进行预训练,然后使用完整的网络,在PASCAL VOC数据集上进行对象识别和定位的训练。
Yolo的最后一层采用线性激活函数,其它层都是Leaky ReLU。训练中采用了drop out和数据增强(data augmentation)来防止过拟合.
模型预测
将图片resize成448x448的大小,送入到yolo网络中,输出一个 7x7x30 的张量(tensor)来表示图片中所有网格包含的对象(概率)以及该对象可能的2个位置(bounding box)和可信程度(置信度)。在采用NMS(Non-maximal suppression,非极大值抑制)算法选出最有可能是目标的结果。
yolo总结
优点
- 速度非常快,处理速度可以达到45fps,其快速版本(网络较小)甚至可以达到155fps。
- 训练和预测可以端到端的进行,非常简便。
缺点
- 准确率会打折扣
- 对于小目标和靠的很近的目标检测效果并不好
yoloV2
YOLOv2相对v1版本,在继续保持处理速度的基础上,从预测更准确(Better),速度更快(Faster),识别对象更多(Stronger)这三个方面进行了改进。其中识别更多对象也就是扩展到能够检测9000种不同对象,称之为YOLO9000。 下面我们看下yoloV2的都做了哪些改进?
预测更准确(better)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YxQQFlBl-1646276606899)(笔记图片/image-20200915164503590.png)]](https://img-blog.csdnimg.cn/ebacc12007da4906b202c344562a9960.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
batch normalization
批标准化有助于解决反向传播过程中的梯度消失和梯度爆炸问题,降低对一些超参数的敏感性,并且每个batch分别进行归一化的时候,起到了一定的正则化效果,从而能够获得更好的收敛速度和收敛效果。在yoloV2中卷积后全部加入Batch Normalization,网络会提升2%的mAP。
使用高分辨率图像微调分类模型
YOLO v1使用ImageNet的图像分类样本采用 224x224 作为输入,来训练CNN卷积层。然后在训练对象检测时,检测用的图像样本采用更高分辨率的 448x448 的图像作为输入。但这样切换对模型性能有一定影响。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fW6qh1ic-1646276606900)(笔记图片/image-20200915165005595.png)]](https://img-blog.csdnimg.cn/ac1689a6c7f846a98796dd470436b2e2.png)
YOLOV2在采用 224x224 图像进行分类模型预训练后,再采用 448x448 的高分辨率样本对分类模型进行微调(10个epoch),使网络特征逐渐适应 448x448 的分辨率。然后再使用 448x448 的检测样本进行训练,缓解了分辨率突然切换造成的影响。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UWAHMKNX-1646276606901)(笔记图片/image-20200915165015860.png)]](https://img-blog.csdnimg.cn/1121f53a19974142a0fa8a327dcf7eb4.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
使用该技巧后网络的mAP提升了约4%。
采用Anchor Boxes
YOLO1并没有采用先验框,并且每个grid只预测两个bounding box,整个图像98个。YOLO2如果每个grid采用5个先验框,总共有13x13x5=845个先验框。通过引入anchor boxes,使得预测的box数量更多(13x13xn)。
聚类提取anchor尺度
Faster-rcnn选择的anchor比例都是手动指定的,但是不一定完全适合数据集。YOLO2尝试统计出更符合样本中对象尺寸的先验框,这样就可以减少网络微调先验框到实际位置的难度。YOLO2的做法是对训练集中标注的边框进行聚类分析,以寻找尽可能匹配样本的边框尺寸。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D6pwflqE-1646276606901)(笔记图片/image-20200915165616802.png)]](https://img-blog.csdnimg.cn/7df261f380894ce0b6c55a69de73ee48.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
YoloV2选择了聚类的五种尺寸最为anchor box。
边框位置的预测
Yolov2中将边框的结果约束在特定的网格中:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GNolV45x-1646276606902)(笔记图片/image-20200915171150105.png)]](https://img-blog.csdnimg.cn/31081821f5ce43dd89af2b7e340cb617.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_16,color_FFFFFF,t_70,g_se,x_16)
其中,
bx,by,bw,bh是预测边框的中心和宽高。Pr(object)∗IOU(b,object)是预测边框的置信度,YOLO1是直接预测置信度的值,这里对预测参数to*进行σ变换后作为置信度的值。 cx,cy是当前网格左上角到图像左上角的距离,要先将网格大小归一化,即令一个网格的宽=1,高=1。 pw,ph是先验框的宽和高。 σ是sigmoid函数。 tx,ty,tw,th,to是要学习的参数,分别用于预测边框的中心和宽高,以及置信度。
如下图所示:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YZ1n8CQA-1646276606903)(笔记图片/image-20200915171632888.png)]](https://img-blog.csdnimg.cn/a4e80f86aeec44ebb26f23f4711dd853.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
由于σ函数将 tx,ty约束在(0,1)范围内,预测边框的蓝色中心点被约束在蓝色背景的网格内。约束边框位置使得模型更容易学习,且预测更为稳定。
假设网络预测值为:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0U86C3iJ-1646276606903)(笔记图片/image-20200915171823875.png)]](https://img-blog.csdnimg.cn/1e6503b2512b46788187b7967c30b4c9.png)
anchor框为:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4lPDA1iV-1646276606904)(笔记图片/image-20200915171844683.png)]](https://img-blog.csdnimg.cn/82fa138e1c3744c58b1f55671fe2bad8.png)
则目标在特征图中的位置:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zwPv90Az-1646276606904)(笔记图片/image-20200915171906489.png)]](https://img-blog.csdnimg.cn/a8fc6cf181404073b3bd91c8cf7e7546.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_18,color_FFFFFF,t_70,g_se,x_16)
在原图像中的位置:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EhnvQ4HH-1646276606905)(笔记图片/image-20200915171925122.png)]](https://img-blog.csdnimg.cn/46a7dbf8706a4af1b7c1f0b0d1352af8.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_16,color_FFFFFF,t_70,g_se,x_16)
细粒度特征融合
图像中对象会有大有小,输入图像经过多层网络提取特征,最后输出的特征图中,较小的对象可能特征已经不明显甚至被忽略掉了。为了更好的检测出一些比较小的对象,最后输出的特征图需要保留一些更细节的信息。
YOLO2引入一种称为passthrough层的方法在特征图中保留一些细节信息。具体来说,就是在最后一个pooling之前,特征图的大小是26x26x512,将其1拆4,直接传递(passthrough)到pooling后(并且又经过一组卷积)的特征图,两者叠加到一起作为输出的特征图。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KZRm3jxs-1646276606906)(笔记图片/image-20200915172541517.png)]](https://img-blog.csdnimg.cn/764c22688aa845bc8f8530b4462260c7.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
具体的拆分方法如下所示:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fkXadG47-1646276606906)(笔记图片/image-20200915172504922.png)]](https://img-blog.csdnimg.cn/c5a57668a8774c90b4a8783713ae6a47.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
多尺度训练
YOLO2中没有全连接层,可以输入任何尺寸的图像。因为整个网络下采样倍数是32,采用了{320,352,…,608}等10种输入图像的尺寸,这些尺寸的输入图像对应输出的特征图宽和高是{10,11,…19}。训练时每10个batch就随机更换一种尺寸,使网络能够适应各种大小的对象检测。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JQrIsMnB-1646276606907)(笔记图片/image-20200915172724192.png)]](https://img-blog.csdnimg.cn/4b4f21e4bf904a50b36be2a663323554.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
速度更快(Faster)
yoloV2提出了Darknet-19(有19个卷积层和5个MaxPooling层)网络结构作为特征提取网络。DarkNet-19比VGG-16小一些,精度不弱于VGG-16,但浮点运算量减少到约⅕,以保证更快的运算速度。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZYc3R4N9-1646276606908)(笔记图片/image-20200915173047956.png)]](https://img-blog.csdnimg.cn/18d4965cbd9640faa06aad3a05a697ae.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
yoloV2的网络中只有卷积+pooling,从416x416x3 变换到 13x13x5x25。增加了batch normalization,增加了一个passthrough层,去掉了全连接层,以及采用了5个先验框,网络的输出如下图所示:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CPmETzdf-1646276606909)(笔记图片/image-20200915173440874.png)]](https://img-blog.csdnimg.cn/6d4a583f93cf4be382f890dcfe6bfbcd.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
识别对象更多
VOC数据集可以检测20种对象,但实际上对象的种类非常多,只是缺少相应的用于对象检测的训练样本。YOLO2尝试利用ImageNet非常大量的分类样本,联合COCO的对象检测数据集一起训练,使得YOLO2即使没有学过很多对象的检测样本,也能检测出这些对象。
yoloV3
yoloV3以V1,V2为基础进行的改进,主要有:利用多尺度特征进行目标检测;先验框更丰富;调整了网络结构;对象分类使用logistic代替了softmax,更适用于多标签分类任务。
算法简介
YOLOv3是YOLO (You Only Look Once)系列目标检测算法中的第三版,相比之前的算法,尤其是针对小目标,精度有显著提升。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8tpBI0LU-1646276606909)(笔记图片/image-20200502103836394.png)]](https://img-blog.csdnimg.cn/289558db42b34465a5439ecf839516e8.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
yoloV3的流程如下图所示,对于每一幅输入图像,YOLOv3会预测三个不同尺度的输出,目的是检测出不同大小的目标。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UuCrrIXI-1646276606909)(笔记图片/image-20200502104048380.png)]](https://img-blog.csdnimg.cn/07f158b225ef4a5cad4fb39c47a95d8f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
多尺度检测
通常一幅图像包含各种不同的物体,并且有大有小。比较理想的是一次就可以将所有大小的物体同时检测出来。因此,网络必须具备能够“看到”不同大小的物体的能力。因为网络越深,特征图就会越小,所以网络越深小的物体也就越难检测出来。
在实际的feature map中,随着网络深度的加深,浅层的feature map中主要包含低级的信息(物体边缘,颜色,初级位置信息等),深层的feature map中包含高等信息(例如物体的语义信息:狗,猫,汽车等等)。因此在不同级别的feature map对应不同的scale,所以我们可以在不同级别的特征图中进行目标检测。如下图展示了多种scale变换的经典方法。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0ma9rzl7-1646276606910)(笔记图片/image-20200502104855459.png)]](https://img-blog.csdnimg.cn/65056b6998ef480bb02977def5bbdd62.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
(a) 这种方法首先建立图像金字塔,不同尺度的金字塔图像被输入到对应的网络当中,用于不同scale物体的检测。但这样做的结果就是每个级别的金字塔都需要进行一次处理,速度很慢。
(b) 检测只在最后一层feature map阶段进行,这个结构无法检测不同大小的物体
© 对不同深度的feature map分别进行目标检测。SSD中采用的便是这样的结构。这样小的物体会在浅层的feature map中被检测出来,而大的物体会在深层的feature map被检测出来,从而达到对应不同scale的物体的目的,缺点是每一个feature map获得的信息仅来源于之前的层,之后的层的特征信息无法获取并加以利用。
(d) 与©很接近,但不同的是,当前层的feature map会对未来层的feature map进行上采样,并加以利用。因为有了这样一个结构,当前的feature map就可以获得“未来”层的信息,这样的话低阶特征与高阶特征就有机融合起来了,提升检测精度。在YOLOv3中,就是采用这种方式来实现目标多尺度的变换的。
网络模型结构
在基本的图像特征提取方面,YOLO3采用了Darknet-53的网络结构(含有53个卷积层),它借鉴了残差网络ResNet的做法,在层之间设置了shortcut,来解决深层网络梯度的问题,shortcut如下图所示:包含两个卷积层和一个shortcut connections。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jutdPg1x-1646276606910)(笔记图片/image-20200502110956252.png)]](https://img-blog.csdnimg.cn/e66361e7bf694dc28014fd8303552ed5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
yoloV3的模型结构如下所示:整个v3结构里面,没有池化层和全连接层,网络的下采样是通过设置卷积的stride为2来达到的,每当通过这个卷积层之后图像的尺寸就会减小到一半。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ild5r13B-1646276606910)(笔记图片/image-20210106152945470.png)]](https://img-blog.csdnimg.cn/c3898169567347d69b239bc6d582ac6a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
下面我们看下网络结构:
- 基本组件:蓝色方框内部分
1、CBL:Yolov3网络结构中的最小组件,由Conv+Bn+Leaky_relu激活函数三者组成。 2、Res unit:借鉴Resnet网络中的残差结构,让网络可以构建的更深。 3、ResX:由一个CBL和X个残差组件构成,是Yolov3中的大组件。每个Res模块前面的CBL都起到下采样的作用,因此经过5次Res模块后,得到的特征图是416->208->104->52->26->13大小。
- 其他基础操作:
1、Concat:张量拼接,会扩充两个张量的维度,例如26×26×256和26×26×512两个张量拼接,结果是26×26×768。
2、Add:张量相加,张量直接相加,不会扩充维度,例如104×104×128和104×104×128相加,结果还是104×104×128。
- Backbone中卷积层的数量:
每个ResX中包含1+2×X个卷积层,因此整个主干网络Backbone中一共包含1+(1+2×1)+(1+2×2)+(1+2×8)+(1+2×8)+(1+2×4)=52,再加上一个FC全连接层,即可以组成一个Darknet53分类网络。不过在目标检测Yolov3中,去掉FC层,仍然把Yolov3的主干网络叫做Darknet53结构。
先验框
yoloV3采用K-means聚类得到先验框的尺寸,为每种尺度设定3种先验框,总共聚类出9种尺寸的先验框。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HDp6JtPa-1646276606911)(笔记图片/image-20200502103458654.png)]](https://img-blog.csdnimg.cn/75c8f2fa87cd47e586291b8bf19cb25a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
在COCO数据集这9个先验框是:(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)。在最小的(13x13)特征图上(有最大的感受野)应用较大的先验框(116x90),(156x198),(373x326),适合检测较大的对象。中等的(26x26)特征图上(中等感受野)应用中等的先验框(30x61),(62x45),(59x119),适合检测中等大小的对象。较大的(52x52)特征图上(较小的感受野)应用,其中较小的先验框(10x13),(16x30),(33x23),适合检测较小的对象。
直观上感受9种先验框的尺寸,下图中蓝色框为聚类得到的先验框。黄色框式ground truth,红框是对象中心点所在的网格。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GdVWCyx7-1646276606911)(笔记图片/image-20200502103442569.png)]](https://img-blog.csdnimg.cn/8489409e353b485e8512994eb59e4e81.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
logistic回归
预测对象类别时不使用softmax,而是被替换为一个1x1的卷积层+logistic激活函数的结构。使用softmax层的时候其实已经假设每个输出仅对应某一个单个的class,但是在某些class存在重叠情况(例如woman和person)的数据集中,使用softmax就不能使网络对数据进行很好的预测。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c20hqyzy-1646276606911)(笔记图片/image-20200502112750112.png)]](https://img-blog.csdnimg.cn/ebbeb22c72844b3c96a8a6d0a2c199ee.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
yoloV3模型的输入与输出
YoloV3的输入输出形式如下图所示:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bf3aFnQa-1646276606912)(笔记图片/image-20200502111721372.png)]](https://img-blog.csdnimg.cn/9b7282a40cf049139f6f1316a0256f34.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
输入416×416×3的图像,通过darknet网络得到三种不同尺度的预测结果,每个尺度都对应N个通道,包含着预测的信息;
每个网格每个尺寸的anchors的预测结果。
YOLOv3共有13×13×3 + 26×26×3 + 52×52×3个预测 。每个预测对应85维,分别是4(坐标值)、1(置信度分数)、80(coco类别概率)。
yoloV4
YOLO之父在2020年初宣布退出CV界,YOLOv4 的作者并不是YOLO系列 的原作者。YOLO V4是YOLO系列一个重大的更新,其在COCO数据集上的平均精度(AP)和帧率精度(FPS)分别提高了10% 和12%,并得到了Joseph Redmon的官方认可,被认为是当前最强的实时对象检测模型之一。
yoloV4总结了大部分检测技巧,然后经过筛选,排列组合,挨个实验(ablation study)哪些方法有效,总体来说,Yolov4并没有创造新的改进,而是使用了大量的目标检测的技巧。在这里我们主要给大家看下它的网络架构:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kN8ElNBY-1646276606912)(笔记图片/image-20200915180225300.png)]](https://img-blog.csdnimg.cn/65b669bb3a704e41879e8a84b00b015d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyA55m944Gu55m96I-c,size_20,color_FFFFFF,t_70,g_se,x_16)
Yolov4的结构图和Yolov3是相似的,不过使用各种新的算法思想对各个子结构都进行了改进。 先整理下Yolov4的结构组件
- 基本组件:
- CBM:Yolov4网络结构中的最小组件,由Conv+Bn+Mish激活函数三者组成。
- CBL:由Conv+Bn+Leaky_relu激活函数三者组成。
- Res unit:借鉴Resnet网络中的残差结构,让网络可以构建的更深。
- CSPX:由三个卷积层和X个Res unint模块Concate组成。
- SPP:采用1×1,5×5,9×9,13×13的最大池化的方式,进行多尺度融合。
- 其他基础操作:
- Concat:张量拼接,维度会扩充,和Yolov3中的解释一样,对应于cfg文件中的route操作。
- Add:张量相加,不会扩充维度,对应于cfg文件中的shortcut操作。
- Backbone中卷积层的数量: 每个CSPX中包含3+2×X个卷积层,因此整个主干网络Backbone中一共包含2+(3+2×1)+2+(3+2×2)+2+(3+2×8)+2+(3+2×8)+2+(3+2×4)+1=72。
注意:
网络的输入大小不是固定的,在yoloV3中输入默认是416×416,在yoloV4中默认是608×608,在实际项目中也可以根据需要修改,比如320×320,一般是32的倍数。 输入图像的大小和最后的三个特征图的大小也是对应的,比如416×416的输入,最后的三个特征图大小是13×13,26×26,52×52, 如果是608×608,最后的三个特征图大小则是19×19,38×38,76×76。
总结
- 知道yolo网络架构,理解其输入输出
YOLO的整个结构就是输入图片经过神经网络的变换得到一个输出的张量
- 知道yolo模型的训练样本构建的方法
对于原图像中的每一个网格grid都需要构建一个30维的向量:分类,置信度,回归的目标值
- 理解yolo模型的损失函数
损失函数分为3部分:分类损失,回归损失,置信度损失
- 知道yoloV2模型的改进方法
使用了BN层,高分辨率训练,采用Anchorbox,聚类得到anchorbox的尺寸,改进边界框预测的方法,特征融合,多尺度训练,网络模型使用darknet19,利用imagenet数据集识别更多的目标
- yoloV3的多尺度检测方法
在YOLOv3中采用FPN结构来提高对应多尺度目标检测的精度,当前的feature map利用“未来”层的信息,将低阶特征与高阶特征进行融合,提升检测精度。
- yoloV3模型的网络结构
以darknet-53为基础,借鉴resnet的思想,在网络中加入了残差模块,利于解决深层次网络的梯度问题
整个v3结构里面,没有池化层和全连接层,只有卷积层
网络的下采样是通过设置卷积的stride为2来达到的
- yoloV3模型先验框设计的方法
采用K-means聚类得到先验框的尺寸,为每种尺度设定3种先验框,总共聚类出9种尺寸的先验框。
- yoloV3模型为什么适用于多标签的目标分类
预测对象类别时不使用softmax,而是使用logistic的输出进行预测
- yoloV3模型的输入输出
对于416×416×3的输入图像,在每个尺度的特征图的每个网格设置3个先验框,总共有 13×13×3 + 26×26×3 + 52×52×3 = 10647 个预测。每一个预测是一个(4+1+80)=85维向量,这个85维向量包含边框坐标(4个数值),边框置信度(1个数值),对象类别的概率(对于COCO数据集,有80种对象)。
版权归原作者 最白の白菜 所有, 如有侵权,请联系我们删除。