神经网络-CV-YOLO-V0-V5(笔记)


计算机视觉:图像分类、目标检测、图像分割、风格迁移、图像重构、超分辨率、图像生成、人脸等。视频中的图片处理也隶属于计算机视觉研究对象,包括视频分类、检测、生成等。
1. YOLO (You Only Look Once) 
You only look once (YOLO) is a state-of-the-art, real-time object detection system.是最先进的实时对象检测系统
2. YOLO 版本 --- V1..V5
3. YOLO 算法思想
--一个深度学习神经网络模型的构成:
    -前向传播部分:90%
    -损失函数部分
    -反向传播部分
--神经网络模型结构大致样子:
    - 分类器:img --> cbrp16--> cbrp32--> cbrp64--> cbrp128--> ...--> fc256-fc[10]
    - cbrp指的是conv,bn,relu,pooling的串联。2个fc层(fully connencted layer),我们称之为“分类头”或者“决策层”。
--分类器和检测器的输入输出有什么不一样:
    -相同点:两者输入都是图像Image
    -不同点:输出不一样,分类器(one-hot vector);检测器(一个框-Bounding box)
--图片的Bounding box框相关:
    -x,y,w,h
    -p1,p2,p3,p4(4个点坐标)
    -cx,cy,w,h(cx,cy为中心点坐标)
    -x,y,w,h,angle(还有的目标是有角度的,这时叫做Rotated Bounding Box)......
--进化的分类器模型(YOLO V0):img --> cbrp16--> cbrp32--> cbrp64--> cbrp128--> ...--> fc256-fc[5] --> c,x,y,w,h
--conv(卷积)操作是位置强相关的,就是原来的目标在哪里,你conv之后的feature map上还在哪里,所以图片划分为16个区域,结果也应该分布在16个区域上
--检测框结构筛选:聚类、NMS(非极大值抑制:交并比IoU=两个框的交集面积/两个框的并集面积)。 1图多目标检测时用NMS
--进化的分类器模型(YOLO V1):img --> cbrp16--> cbrp32--> cbrp64--> cbrp128--> ...--> fc256-fc[5+2]*N --> [c,x,y,w,h,one-hot]*N

--滑动窗口分类方法:标注框、检测框滑动遍历图片。
--前置:R-CNN 到Faster R-CNN一直采用的思路是Proposal + 分类,前者提供图像位置信息,后者提供类别信息,虽然精度已经很高,但因为是two-stage的方法,其中Proposal过程耗费时间比较多;faster-RCNN 中也直接用整张图作为输入,但是 faster-RCNN 整体还是采用了RCNN 那种 proposal+classifier 的思想,只不过是将提取 proposal 的步骤放在 CNN 中实现了,而 YOLO 则采用直接回归的思路。因而总体处理速度不太理想,达不到实时处理的效果。
--YOLO 模型的思路比较直接:在输出层直接进行“回归(动词)”Bounding Box的位置和Bounding Box所属的类别;进化成把整张图作为网络的输入,因此把目标检测的问题转化成了一个回归问题。
--YOLO的实现方法:将一幅图像分成 SxS 个网格(grid cell),如果某个 object 的中心落在这个网格中,则这个网格就负责预测这个 object。每个网格要预测 B 个 bounding box,每个 bounding box 除了要回归自身的位置之外,还要附带预测一个 confidence 值。这个 confidence 代表了所预测的 box 中含有 object 的置信度(应该也是一个概率比值)和这个 box 预测的有多准(概率)这两重信息,值的计算:Pr(Object)*IOU(truth:pred). 其中如果有 object 落在一个 grid cell 里,第一项取 1,否则取 0。 第二项是预测的 bounding box 和实际的 groundtruth 之间的 IoU 值。每个 bounding box 要预测 (x, y, w, h) 和 confidence 共5个值(边界框带有的特征值),每个网格还要预测一个类别信息(预测分类的特征值),记为 C 类。则 SxS个 网格,每个网格要预测 B 个 bounding box 还要预测 C 个 categories。输出就是 S x S x (5*B+C) 的一个 tensor。注意:class 信息是针对每个网格的,confidence 信息是针对每个 bounding box 的。白话:边界框界定的边界中,位置中心点的格子标签(分类值)就代表了此边界框内图像大概率是某个分类。

4.YOLO V1
--物体检测-->回归问题, 用一个卷积神经网络结构作用到输入图像,直接预测bounding box和类别概率。
    -输入图像
    -分成SxS格子
    -预测每个格子,每个格子都预测B个bounding bo,且每个格子包含x,y,w,h和confidence 5个预测值
    -x,y就是bounding box的中心坐标,与grid cell对齐(即相对于当前grid cell的偏移值),使得范围变成0到1;
    -w,h进行归一化(分别除以图像的w和h,这样最后的w和h就在0到1范围)。
    -confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息
--缺陷:YOLO对于相互靠的很近的物体(挨在一起且中点都落在同一个格子上的情况),还有很小的群体,检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类。
    -测试图像中,当同一类物体出现的不常见的长宽比和其他情况时泛化能力偏弱。
    -由于损失函数的问题,定位误差是影响检测效果的主要原因,尤其是大小物体的处理上,还有待加强。
5.YOLO V2(YOLO9000: Better, Faster, Stronger)
--Better : Batch Normalization
    -YOLOv2网络通过在每一个卷积层后添加batch normalization,一种新的训练方法–联合训练算法,极大的改善了收敛速度同时减少了对其它regularization方法的依赖(舍弃了dropout优化后依然没有过拟合),使得mAP获得了2%的提升。
    -联合训练算法的基本思路就是:同时在检测数据集和分类数据集上训练物体检测器(Object Detectors ),用监测数据集的数据学习物体的准确位置,用分类数据集的数据来增加分类的类别量、提升鲁棒性。
    -对数据进行预处理(统一格式、均衡化、去噪等)能够大大提高训练速度,提升训练效果。批量规范化 正是基于这个假设的实践,对每一层输入的数据进行加工.
    -BN 的做法是 在卷积池化之后,激活函数之前,对每个数据输出进行规范化(均值为 0,方差为 1)。第一部分是 Batch内数据归一化(其中 E为Batch均值,Var为方差),Batch数据近似代表了整体训练数据。
    -第二部分引入 附加参数 γ 和 β(Scale & Shift),Why? 因为简单的归一化 相当于只使用了激活函数中近似线性的部分(如下图红色虚线),破坏了原始数据的特征分布,这会降低模型表达能力。

--High Resolution Classifier: 预训练分类模型采用了更高分辨率的图片
--Convolutional With Anchor Boxes: YOLOv1是利用全连接层直接预测bounding box的坐标。YOLOv2则借鉴了Faster R-CNN的思想,引入anchor。YOLOv2移除了YOLOv1中的全连接层而采用了卷积和anchor boxes来预测边界框。为了使检测所用的特征图分辨率更高,移除其中的一个pool层。增加box数量是为了提高目标的定位准确率。
--Dimension Clusters(维度聚类)作者最终选取5个聚类中心作为先验框。对于两个数据集,5个先验框的width和height如下:
COCO: (0.57273, 0.677385), (1.87446, 2.06253), (3.33843, 5.47434), (7.88282, 3.52778), (9.77052, 9.16828)
VOC: (1.3221, 1.73145), (3.19275, 4.00944), (5.05587, 8.09892), (9.47112, 4.84053), (11.2364, 10.0071)
--Direct Location prediction : 作者在引入anchor box的时候遇到的第二个问题:模型不稳定,尤其是在训练刚开始的时候。作者认为这种不稳定主要来自预测box的中心坐标(x,y)值。在基于region proposal的目标检测算法中,是通过预测tx和ty来得到(x,y)值,也就是预测的是offsets。公式是无约束的,预测的边界框很容易向任何方向偏移。因此,每个位置预测的边界框可以落在图片任何位置,这导致模型的不稳定性,在训练时需要很长时间来预测出正确的offsets。
YOLOv2中没有采用这种预测方式,而是沿用了YOLOv1的方法,就是预测边界框中心点相对于对应cell左上角位置的相对偏移值。
网络在最后一个卷积层输出1313的feature map,有1313个cell,每个cell有5个anchor box来预测5个bounding box,每个bounding box预测得到5个值。
分别为:tx、ty、tw、th和to(类似YOLOv1的confidence).为了将bounding box的中心点约束在当前cell中,使用sigmoid函数将tx、ty归一化处理,将值约束在0~1,这使得模型训练更稳定。
--Fine-Grained Features :YOLOv2的输入图片大小为416×416,经过5次maxpooling之后得到13×13大小的特征图,并以此特征图采用卷积做预测。13×13大小的特征图对检测大物体是足够了,但是对于小物体还需要更精细的特征图(Fine-Grained Features)。因此SSD使用了多尺度的特征图来分别检测不同大小的物体,前面更精细的特征图可以用来预测小物体。YOLOv2提出了一种passthrough层来利用更精细的特征图。YOLOv2所利用的Fine-Grained Features是26×26大小的特征图(最后一个maxpooling层的输入),对于Darknet-19模型来说就是大小为26×26×512的特征图。passthrough层与ResNet网络的shortcut类似,以前面更高分辨率的特征图为输入,然后将其连接到后面的低分辨率特征图上。前面的特征图维度是后面的特征图的2倍,passthrough层抽取前面层的每个2×2的局部区域,然后将其转化为channel维度,对于26×26×512的特征图,经passthrough层处理之后就变成了13×13×2048的新特征图(特征图大小降低4倍,而channles增加4倍,图6为一个实例),这样就可以与后面的13×13×1024特征图连接在一起形成13×13×3072的特征图,然后在此特征图基础上卷积做预测。
--Multi-Scale Training : YOLOv2中只有卷积层和池化层,因此不需要固定的输入图片的大小。
为了让模型更有鲁棒性,作者引入了多尺度训练。就是在训练过程中,每迭代一定的次数,改变模型的输入图片大小。在输入size较大时,训练速度较慢,在输入size较小时,训练速度较快,而multi-scale training又可以提高准确率,因此算是准确率和速度都取得一个不错的平衡。
--YOLOv2和YOLOv1的损失函数一样,为均方差函数。
--Stronger :带标注的检测数据集量比较少,而带标注的分类数据集量比较大,因此YOLO9000主要通过结合分类和检测数据集使得训练得到的检测模型可以检测约9000类物体。一方面要构造数据集(采用WordTree解决),另一方面要解决模型训练问题(采用Joint classification and detection)。

6. YOLO V3
--DBL:代码中的Darknetconv2d_BN_Leaky,是yolo_v3的基本组件。就是卷积+BN+Leaky relu。
--resn:n代表数字,有res1,res2, … ,res8等等,表示这个res_block里含有多少个res_unit。不懂resnet请戳这儿
--concat:张量拼接。将darknet中间层和后面的某一层的上采样进行拼接。拼接的操作和残差层add的操作是不一样的,拼接会扩充张量的维度,而add只是直接相加不会导致张量维度的改变。
--backbone:darknet-53 Yolo_v3使用了darknet-53的前面的52层(没有全连接层),yolo_v3这个网络是一个全卷积网络,大量使用残差的跳层连接,并且为了降低池化带来的梯度负面效果,作者直接摒弃了POOLing,用conv的stride来实现降采样。在这个网络结构中,使用的是步长为2的卷积来进行降采样。为了加强算法对小目标检测的精确度,YOLO v3中采用类似FPN的upsample和融合做法(最后融合了3个scale,其他两个scale的大小分别是26×26和52×52),在多个scale的feature map上做检测。作者在3条预测支路采用的也是全卷积的结构,其中最后一个卷积层的卷积核个数是255,是针对COCO数据集的80类:3*(80+4+1)=255,3表示一个grid cell包含3个bounding box,4表示框的4个坐标信息,1表示objectness score。
--output 所谓的多尺度就是来自这3条预测之路,y1,y2和y3的深度都是255,边长的规律是13:26:52。yolo v3设定的是每个网格单元预测3个box,所以每个box需要有(x, y, w, h, confidence)五个基本参数,然后还要有80个类别的概率。所以3×(5 + 80) = 255。这个255就是这么来的。
--Bounding Box YOLO v3的Bounding Box由YOLOV2又做出了更好的改进。在yolo_v2和yolo_v3中,都采用了对图像中的object采用k-means聚类。 feature map中的每一个cell都会预测3个边界框(bounding box) ,每个bounding box都会预测三个东西:(1)每个框的位置(4个值,中心坐标tx和ty,,框的高度bh和宽度bw),(2)一个objectness prediction ,(3)N个类别,coco数据集80类,voc20类。三次检测,每次对应的感受野不同,32倍降采样的感受野最大,适合检测大的目标,所以在输入为416×416时,每个cell的三个anchor box为(116 ,90); (156 ,198); (373 ,326)。16倍适合一般大小的物体,anchor box为(30,61); (62,45); (59,119)。8倍的感受野最小,适合检测小目标,因此anchor box为(10,13); (16,30); (33,23)。所以当输入为416×416时,实际总共有(52×52+26×26+13×13)×3=10647个proposal(提取) box。

7.YOLO V4

--CBM:Conv+BN+Mish的卷积组合。
--CBL:Conv+BN+Leaky_relu的卷积组合。
--SPP:与yolov3相同,采用了5×5,9×9,13×13的Max_pooling的concat。
--CSPX:采用CSPNet的卷积模块(本质是将不同分组生成的卷积concat与densenet相似),并结合Bottleneck形式融入残差。在yolov4中CSPX的stride均为2,即CSP模块起到下采样的作用,将608×608的输入下采样至304->152->76->38->19。网络最终的输出层size为76,38,19.
--在Backbone上,作者使用Dropblock来缓和过拟合,提高模型的泛化能力,使用CSPdarkent53作为Backbone及Mish激活,并结合FPN,PAN作为Neck,既在自上而下的特征生成方式下融合了自下而上的特征,提高特征提取的效率与性能。anchor机制与yolov3相同,训练时采用CIOU_Loss来提高bbox的坐标定位性能。
--Dropblock:和dropout原理相似,dropout一般对全连接的作用比较大,对卷积层效果甚微,原因可能是在随机删除部分特征后,对激活函数影响不大。DropBlock有两个参数,block_size,是我们要drop 的模块的大小,当block_size=1时,就是常用的dropout。另一个参数,γ 控制要丢弃的特征的数量。
--损失函数:目标检测任务的损失函数一般由Classificition Loss(分类损失函数)和Bounding Box Regeression Loss(回归损失函数)两部分构成。Bounding Box Regeression的Loss近些年的发展过程是:Smooth L1 Loss-> IoU Loss(2016)-> GIoU Loss(2019)-> DIoU Loss(2020)->CIoU Loss(2020)。好的目标框回归函数应该考虑三个重要几何因素:重叠面积、中心点距离,长宽比。
--各个Loss函数的不同点:
    -IOU_Loss:考虑检测框和目标框重叠面积。
    -GIOU_Loss:解决边界框不重合时的问题。
    -DIOU_Loss:考虑边界框中心点距离的信息。
    -CIOU_Loss:考虑边界框宽高比的尺度信息。
-Yolov4中默认采用CIOU_Loss的回归方式,让预测框回归的速度和精度更高一些。
-图片数据增强随机缩放、随机裁剪、随机排布的方式进行拼接,丰富检测的数据集,可以增加小目标训练数据,让网络层的鲁棒性更好。

8.YOLO V5

--可以通过chaneel与layer的控制因子来根据落地要求灵活配置模型。与YOLO系列1-4不同的是YOLOv5对正样本的定义:其采用了跨领域网格,并在不同输出层匹配,极大的扩增了正样本anchor,加速模型收敛速度并提高模型召回率。
--Backbone部分:采用Focus结构,CSP结构(CSPNet的跨阶段局部融合网络),减少bp时梯度信息的重复,降低计算量,提高CNN的学习能力。
--Neck部分:模块采用PFN+PAN,融合不同维度的特征。YOLOv5引入了depth_multiple(channel的缩放系数)和width_multiple系数(BottleneckCSP模块的层缩放系数)来得到不同大小模型。
--head部分:部分与YOLOv4相同,三个输出,分别对应8,16,32步长,不同步长的输出,预测不同尺寸的目标。
--结构:
    -模型输入端:Mosaic数据增强、自适应anchor、自适应图片缩放(letterbox)
    -LOSS:分类分支采用的loss是BCE、conf分支也是BCE,可以通过h[‘fl_gamma’]参数开启focal Loss,默认配置没有采用focal los,而bbox分支采用的是Giou loss。
    -匹配规则:(1) shape匹配规则,分别将ground truth的宽高与anchor的宽高求比值,如果宽高比例小于设定阈值,则说明该GT和anchor匹配,将该anchor认定为正样本。否则,该anchor被滤掉,不参与bbox与分类计算。(2) 将GT的中心最邻近网格也作为正样本anchor的参考点。因此,bbox的xy回归分支的取值范围不再是0-1,而是-0.5-1.5(0.5是网格中心偏移),因为跨网格预测了。

9.小结
--YOLO V0 : 只能输出一个目标
--YOLO V1 : 输出多目标,检测多类目标,检测小目标 ; 样本不均衡没解决,直接回归出位置
--YOLO V2 : 全流程多尺度方法
--YOLO V3 : 多尺度检测头,resblock darknet53
--YOLO V4 : cspdarknet53,spp,panet,tricks
--YOLO V5 : 跨领域网格,速度快

参考内容:一文看懂YOLO v2_小小小绿叶的博客-CSDN博客_yolov2 聚类

你可能感兴趣的:(AI人工智能,计算机视觉CV,人工智能,计算机视觉)