赞
踩
目录
【深度学习】总目录
LoadImagesAndLabels类自定义了数据集的处理过程,该类继承pytorch的Dataset类,需要实现父类的__init__方法, __getitem__方法和__len__方法, 在每个step训练的时候,DataLodar迭代器通过__getitem__方法获取一批训练数据。自定义数据集的重点是 __getitem__函数,各种数据增强的方式就是在这里进行的。
1.1.1 MixUp数据增强
论文(ICLR2018收录):mixup: BEYOND EMPIRICAL RISK MINIMIZATION
Mixup数据增强核心思想是从每个Batch中随机选择两张图片,并以一定比例混合生成新的图像,训练过程全部采用混合的新图像训练,原始图像不再参与训练。
假设图像1坐标为(xi,yi),图像2坐标为(xj,yj),混合图像坐标为(x',y'),则混合公式如下:
λ∈[0,1],为服从Beta分布(参数都为α)的随机数。
从原文实验结果中可以看出,mixup在ImageNet-2012上面经过200 epoch后在几个网络上提高了1.2 ~ 1.5个百分点。在CIFAR-10上提高1.0 ~ 1.4个百分点,在CIFAR-100上提高1.9 ~ 4.5个百分点。
Yolov5中的mixup实现
1 2 3 4 5 6 |
|
1.1.2 Cutout数据增强
Cutout论文:Improved Regularization of Convolutional Neural Networks with Cutout
CNN具有非常强大的能力,然而,由于它的学习能力非常强,有时会导致过拟合现象的出现。为了解决这个问题,文章提出了一种简单的正则化方法:cutout。它的原理是在训练时随机地屏蔽输入图像中的方形区域。类似于dropout,但有两个主要的区别:(1)它丢弃的是输入图像的数据。(2)它丢弃的是一整块区域,而不是单个神经元。这能够有效地帮助CNN关注不同的特征,因为去除一个区域的神经元可以很好地防止被去除的神经元信息通过其它渠道向下传递。同时,dropout由于(1)卷积层拥有相较于全连接层更少的参数,因此正则化的效果相对欠佳;(2)图像的相邻元素有着很强的相关性的原因,在卷积层的效果不好。而cutout因为去除了一块区域的神经元,且它相比更接近于数据增强。因此在卷积层的效果要相对更好。cutout不仅容易实现,且实验证明,它能够与其它的数据增强方法一起作用,来提高模型的表现。作者发现,比起形状,cutout区域的大小更为重要。因此为了简化,他们选择了方形,且如果允许cutout区域延伸到图像外,效果反而会更好。
Yolov5中的cutout实现(默认不启用)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
CutMix
CutMix论文:CutMix:Regularization Strategy to Train Strong Classifiers with Localizable Features
cutmix在cutout的基础上进行改进,cutout的部分用另一张图像上cutout的部分进行填充,这样即保留了cutout的优点:让模型从目标的部分视图去学习目标的特征,让模型更关注那些less discriminative的部分。同时比cutout更高效,cutout的部分用另一张图像的部分进行填充,让模型同时学习两个目标的特征。
1.1.3 Mosaic数据增强
Mosaic是YOLOV4中提出的新方法,参考2019年底提出的CutMix数据增强的方式,但CutMix只使用了两张图片进行拼接,而Mosaic数据增强则采用了4张图片,通过随机缩放、随机裁减、随机排布的方式进行拼接。Mosaic有如下优点:
(1)丰富数据集:随机使用4张图片,随机缩放,再随机分布进行拼接,大大丰富了检测数据集,特别是随机缩放增加了很多小目标,让网络的鲁棒性更好;
(2)减少GPU显存:直接计算4张图片的数据,使得Mini-batch大小并不需要很大就可以达到比较好的效果。
初始化整个背景图, 大小为(2 × image_size, 2 × image_size, 3)
保留一些边缘留白,随机取一个中心点
基于中心点分别将4个图放到左上、右上、左下、右下,此部分可能会出现小图出界的情况,所以拼接的时候可能会进行裁剪
计算真实框的偏移量,在大图中重新计算框的位置
Yolov5中的4-mosaic和9-mosaic实现
切换使用
1 2 3 4 5 6 7 8 9 10 11 |
|
1.1.4 Copy paste数据增强
论文:Simple Copy-Paste is a Strong Data Augmentation Method for Instance Segmentation
中文名叫复制粘贴大法,将部分目标随机的粘贴到图片中,前提是数据要有segments数据才行,即每个目标的实例分割信息。
在COCO实例分割上,实现了49.1%mask AP和57.3%box AP,与之前的最新技术相比,分别提高了+0.6%mask AP和+1.5%box AP。
Yolov5中的copy paste实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
1.1.5 Random affine仿射变换
在yolov5中Mosaic数据增强部分的代码包括了仿射变换,如果部采用Mosaic数据增强也会单独进行仿射变换。yolov5的仿射变换包含随机旋转、平移、缩放、错切(将所有点沿某一指定方向成比例地平移)、透视操作,根据hyp.scratch-low.yaml,默认情况下只使用了Scale和Translation即缩放和平移。通过degrees设置图片旋转角度,perspective、shear设置透视变换和错切。
Yolov5中的random_perspective实现
1.1.6 HSV随机增强图像
Yolov5使用hsv增强的目的是令模型在训练过程中看到的数据更加的多样,而通过HSV增强获得的”多样性“也可以从3个角度来说:
HSV增强在目标检测模型的训练中是非常常用的方法,它在不破坏图像中关键信息的前提下提高了数据集的丰富程度,且计算成本很低,是很实用的数据增强方法。
Yolov5中的augment_hsv实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
1.1.7 随机水平翻转
Yolov5中的Flip实现
1 2 3 4 5 6 7 8 9 10 11 |
|
1.1.8 Albumentations数据增强工具包
Albumentations工具包涵盖了绝大部分的数据增强方式,使用方法类似于pytorch的transform。不过,在Albumentations提供的数据增强方式比pytorch官方的更多,使用也比较方便。
github地址:GitHub - albumentations-team/albumentations: Fast image augmentation library and an easy-to-use wrapper around other libraries. Documentation: https://albumentations.ai/docs/ Paper about the library: https://www.mdpi.com/2078-2489/11/2/125
docs使用文档:Albumentations Documentation
YOLOv5的 Albumentations类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
下面是yolov5 v7.0中的anchor,这是在coco数据集上通过聚类方法得到的。当我们的输入尺寸为640*640时,会得到3个不同尺度的输出:80x80(640/8)、40x40(640/16)、20x20(640/32)。其中,80x80代表浅层的特征图(P3),包含较多的低层级信息,适合用于检测小目标,所以这一特征图所用的anchor尺度较小;20x20代表深层的特征图(P5),包含更多高层级的信息,如轮廓、结构等信息,适合用于大目标的检测,所以这一特征图所用的anchor尺度较大。另外的40x40特征图(P4)上就用介于这两个尺度之间的anchor用来检测中等大小的目标。对于20*20尺度大小的特征图,由原图下采样32倍得到,因此先验框由640*640尺度下的 (116 × 90), (156 × 198),(373 × 326) 缩小32倍,变成 (3.625× 2.8125), (4.875× 6.1875),(11.6563×10.1875),其共有13*13个grid cell,则这每个169个grid cell都会被分配3*13*13个先验框。
在Yolov3、Yolov4中,训练不同的数据集时,计算初始锚框的值是通过单独的程序运行的。但Yolov5中将此功能嵌入到代码中,每次训练时,自适应的计算不同训练集中的最佳锚框值。当然,如果觉得计算的锚框效果不是很好,也可以在train.py中将自动计算锚框功能关闭。
Yolov5的自适应锚框计算函数kmean_anchors(位于utils/autoanchor.py)
在常用的目标检测算法中,不同的图片长宽都不相同,因此常用的方式是将原始图片缩放填充到标准尺寸,再送入检测网络中。在项目实际使用时,很多图片的长宽比不同,因此缩放填充后,两端的黑边大小都不同,而如果填充的比较多,则存在信息冗余,影响推理速度。因此在Yolov5的代码中utils/augmentations.py的letterbox函数中进行了修改,对原始图像自适应的添加最少的黑边。
Yolov5的letterbox函数(utils/augmentations.py)
假设图片原来尺寸为(1080, 1920),我们想要resize的尺寸为(640,640)。要想满足收缩的要求,640/1080= 0.59,640/1920 = 0.33,应该选择更小的收缩比例0.33,则图片被缩放为(360,640)。下一步则要填充灰白边至360可以被32整除,则应该填充至384,最终得到图片尺寸(384,640)。
CSP结构的核心思想是将输入特征图分成两部分,一部分经过一个小的卷积网络(称为子网络)进行处理,另一部分则直接进行下一层的处理。然后将两部分特征图拼接起来,作为下一层的输入。Yolov4和Yolov5都使用了CSP结构,yolov4只在backbone中使用了CSP结构,yolov5有两种CSP结构,以Yolov5s网络为例,CSP1_X结构应用于Backbone主干网络,另一种CSP2_X结构则应用于Neck中。残差组件由两个CBL组成,因此两个CSP的区别在于有没有shortcut(通过BottleneckCSP类的shortcut参数设置)。
在YOLOv5 v4.0中,作者将BottleneckCSP模块转变为了C3模块,经历过残差输出后的Conv模块被去掉了。C3包含了3个标准卷积层以及多个Bottleneck模块(数量由配置文件.yaml的n和depth_multiple参数乘积决定),concat后的标准卷积模块中的激活函数也由LeakyRelu变为了SiLU。
YOLOv5中的C3类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
2014年何恺明提出了空间金字塔池化SPP,能将任意大小的特征图转换成固定大小的特征向量。在Yolov5中,SPP的目的是在不同尺度下对图像进行池化(Pooling)。这种结构可以在不同尺寸的特征图上利用ROI池化不同尺度下的特征信息,提高模型的精度和效率。在YOLOv5的实现中,SPP结构主要包含两个版本,分别为SPP和SPPF。其中,SPP代表“Spatial Pyramid Pooling”,而SPPF则代表“Fast Spatial Pyramid Pooling”。两者目的是相同的,只是在结构上略有差异,从SPP改进为SPPF后(Yolov5 6.0),模型的计算量变小了很多,模型速度提升。结构图如下图所示,下面的Conv是CBS=conv+BN+SiLU。
YOLOv5中的SPP/SPPF类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
论文:Path Aggregation Network for Instance Segmentation
PANet是香港中文大学 2018 作品,在COCO2017的实例分割上获得第一,在目标检测任务上获得第二。作者通过研究Mask R-CNN发现底层特征难以传达到高层次,因此设计了自下而上的路径增强,如下图里的(b)所示,(c)是Adaptive feature pooling。红色线表达了图像底层特征在FPN中的传递路径,要经过100多层layers;绿色线表达了图像底层特征在PANnet 中的传递路径,只需要经过小于10层layers。
Yolov5中的PAN结构
FPN层自顶向下传达强语义特征(高层语义是经过特征提取后得到的特征信息,它的感受野较大,提取的特征抽象,有利于物体的分类,但会丢失细节信息,不利于精确分割。高层语义特征是抽象的特征)。而PAN则自底向上传达强定位特征,两两联手,从不同的主干层对不同的检测层进行参数聚合。原本的PANet网络的PAN结构中,两个特征图结合是采用shortcut操作,而Yolov4/5中则采用concat操作,特征图融合后的尺寸发生了变化。
什么是正负样本?
正负样本都是针对于算法经过处理生成的框,用于计算损失,而在预测过程和验证过程是没有这个概念的。正例用来使预测结果更靠近真实值的,负例用来使预测结果更远离除了真实值之外的值的。正负样本的比例最好为1:1到1:2左右,数量差距不能太悬殊,特别是正样本数量本来就不太多的情况下。如果负样本远多于正样本,则负样本会淹没正样本的损失,从而降低网络收敛的效率与检测精度。这就是目标检测中常见的正负样本不均衡问题,解决方案之一是增加正样本数。
yolov5通过以下三个方法增加正样本数量:
(1) 跨anchor预测
假设一个GT框落在了某个预测分支的某个网格内,该网格具有3种不同大小anchor,若GT可以和这3种anchor中的多种anchor匹配,则这些匹配的anchor都可以来预测该GT框,即一个GT框可以使用多种anchor来预测。预测边框的宽高是基于anchor来预测的,而预测的比例值是有范围的,即0-4,如果标签的真实宽高与anchor的宽高的比例超过了4,那是不可能预测成功的,所以哪些anchor能匹配上哪些标签,就看anchor的宽(高)与标签的宽(高)的比例有没有超过4,如果超过了,那就不匹配。注意,这个比例是双向的比例,比如标签宽/anchor宽>4,不匹配,而anchor宽/标签宽>4,也是不匹配的。
(2) 跨grid预测
假设一个GT框落在了某个预测分支的某个网格内,则该网格有左、上、右、下4个邻域网格,根据GT框的中心位置,将最近的2个邻域网格也作为预测网格,也即一个GT框可以由3个网格来预测。有下面5种情况(如果标签边框的中心点正好落在格子中间,就只有这个格子了):
(3) 跨分支预测
假设一个GT框可以和2个甚至3个预测分支上的anchor匹配,则这2个或3个预测分支都可以预测该GT框,即一个GT框可以由多个预测分支来预测,重复anchor匹配和grid匹配的步骤,可以得到某个GT 匹配到的所有正样本。
yolov5的正样本匹配:即找到与targets对应的所有正样本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
|
Yolov5官方文档:Architecture Summary - Ultralytics YOLOv8 Docs
损失函数的调用点如下,在train.py中
pre:网络从三个特征图上得到3*(20*20+40*40+52*52)个先验框,每个先验框由6个参数:px,py,pw,ph,po和pcls
targets:一个batch中所有的目标(如果开启开启mosaic数据增强的话,每张图就包含原本多张图中的目标),每个目标有(image,class,x,y,w,h)共6个参数,shape=[ num,6]。
损失函数分三部分:(1)分类损失Lcls (BCE loss) (2)置信度损失Lobj(BCE loss) (3)边框损失Lloc(CIOU loss)
其中置信度损失在三个预测层(P3, P4, P5)上权重不同,分别为[4.0, 1.0, 0.4]
这三者的权重都是可以设置的,在默认的data/hyps/hyp.scratch-low.yaml中,如下图
这三个损失权重会根据类别、图像大小、检测层数量进行scale
4.2.1 分类损失
按照640乘640分辨率,3个输出层来算的话,P3是80乘80个格子,P4是40乘40,P5是20乘20,一共有8400个格子,并不是每一个格子上的输出都要去做分类损失计算的,只有负责预测对应物体的格子才需要做分类损失计算(边框损失计算也是一样)。
分类损失采用nn.BCEWithLogitsLoss,即二分类损失,比如现在有4个分类:猫、狗、猪、鸡,当前标签真值为猪,那么计算损失的时候,targets就是[0, 0, 1, 0],推理结果的分类部分也会有4个值,分别是4个分类的概率,就相当于计算4次二分类损失,取均值。分类的真值也不一定是0或1,因为可以做label smoothing。
1 2 3 4 5 |
|
4.2.2 置信度损失
每一个格子都要计算置信度损失,置信度的真值并不是固定的,如果该格子负责预测对应的物体,那么置信度真值就是预测边框与标签边框的IOU。如果不负责预测任何物体,那真值就是0。
与早期版本的YOLO相比,YOLOv5架构对预测框策略进行了更改。在YOLOv2和YOLOv3中,使用最后一层的激活直接预测框坐标。如下图所示
而在YOLOv5中,用于预测框坐标的公式已经更新,以降低网格灵敏度,并防止模型预测没有边界。计算预测边界框的修订公式如下:
Yolov5预测框坐标计算,以与target的iou计算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
4.2.3 边框损失
Bounding Box Regeression的Loss近些年的发展过程是:Smooth L1 Loss-> IoU Loss(2016)-> GIoU Loss(2019)-> DIoU Loss(2020)->CIoU Loss(2020),Yolov5用的是CIOU。
其中,ρ预测框和真实框的中心点的欧式距离,也就是图中的d,c代表的是能够同时包含预测框和真实框的最小闭包区域的对角线距离,v测量纵横比的一致性,α是正的权衡参数,
Yolov5中IOU、CIoU、DIoU、GIoU的计算
论文:Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
参考:
5. 复制-粘贴大法(Copy-Paste):简单而有效的数据增强
6. 数据增强mixup技术
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。