数据集增广:对数据集进行操作、旋转、翻转等操作。添加干扰也可以认为是一种数据增强的方法。
模型过于复杂:针对于mnist等比较简单的数据集却安排了一个比较强的模型。
Dropout与多任务学习
并不是,首先随着卷积核变大,网络的训练参数会出现激增的情况,难以拟合;在VGG中提出用两个3×3的卷积可以实现代替5×5的卷积。卷积核如果多大会导致对于小目标内容的分类与检测效果不够好。
ResNet与DenseNet
原有的线性网络由于一味的网络层级叠加,由于反向传播中链式法则所决定的累乘效应,又或者存在极小梯度在传递链上的连续出现,又或者出现连续出现的极大梯度就会导致浅层网络无法接受反向传播给定的变化值,出现梯度弥散与梯度爆炸的问题。
样本类别分布不均衡导致的危害?
样本类别不均衡将导致样本量少的分类所包含的特征过少,并很难从中提取规律;即使得到分类模型,也容易产生过度依赖与有限的数据样本而导致过拟合问题,当模型应用到新的数据上时,模型的准确性会很差。
解决方法:
随机过采样:从少数类样本集中随机重复抽取样本(有放回)以得到更多的样本;
随机欠采样:从多数类样本集中随机选择较少的样本(有放回/无放回);
随机过采样缺点:会导致对少量的困难样本复制多份,虽然扩大了困难样本的数据规模,但是也导致了模型出现了过拟合的问题,可能对于经过过采样的样本会有比较好的效果,但是对于新的困难样本表现的很差。随机欠采样缺点:对于简单样本会丢失部分样本,可能会丢失比较有用的样本,会导致某些特征出现欠拟合的问题。
卷积前后大小的计算公式:
普通卷积:
分组卷积:将通道数进行分割,然后对不同的通道分别卷积,可以有效的减少参数。
空间可分离卷积:用参数更少的卷积核之积代替已有的卷积核
深度可分离卷积:考虑到原有的卷积将一张图片的不同通道层进行统一运算,没有考虑到不同通道之间的差异性,所以用depthwise与pointwise取代原有的卷积方式,在可以减少参数的情况下可以提高检测模型的能力。
空洞卷积:可以保证在参数量相同的情况下,实现更大的感受野,将原有的3*3的卷积核,中间添加不可训练的0值,可以模拟出不同大小的感受野。
可形变卷积:可以直接在原来的过滤器前面再加一层过滤器,这层过滤器学习的是下一层卷积核的位置偏移量(offset),这样只是增加了一层过滤器,或者直接把原网络中的某一层过滤器当成学习offset的过滤器,
train(),启动BN层和Dropout的参数,并将它们设置成True
eval(),不启动BN层和Dropout中的参数,并设置成True
在eval中,Dropout的处理办法,假设Dropout中drop_rate设置成0.5,则在eval时,激活所有神经元,并且乘上一个补偿系数。BN层则是进行一个Batch中的平移操作。
针对问题:
效果:
缺点:
Sigmoid
SGD
SGD with momentum(SGDM)
Adagrad
RMSProp
Adam
import torch
import torch.nn as nn
import numpy as np
from PIL import Image
import pdb
import math
class Grid(object):
def __init__(self, d1, d2, rotate = 1, ratio = 0.5, mode=0, prob=1.):
# 初始化参数
self.d1 = d1
self.d2 = d2
self.rotate = rotate
self.ratio = ratio
self.mode=mode
self.st_prob = self.prob = prob
def set_prob(self, epoch, max_epoch):
# 类似一个预热的过程,如果epoch>max_epoch
self.prob = self.st_prob * min(1, epoch / max_epoch)
def __call__(self, img):
if np.random.rand() > self.prob:
return img
h = img.size(1)
w = img.size(2)
# 1.5 * h, 1.5 * w works fine with the squared images
# But with rectangular input, the mask might not be able to recover back to the input image shape
# A square mask with edge length equal to the diagnoal of the input image
# will be able to cover all the image spot after the rotation. This is also the minimum square.
hh = math.ceil((math.sqrt(h*h + w*w)))
# d 表示随机数(d1,d2)之间
d = np.random.randint(self.d1, self.d2)
#d = self.d
# maybe use ceil? but i guess no big difference
self.l = math.ceil(d*self.ratio)
# 定义一个hh*hh大小的mask,hh可以认为根号下h平方+w平方
mask = np.ones((hh, hh), np.float32)
st_h = np.random.randint(d)
st_w = np.random.randint(d)
# d表示distance 表示间隔距离
for i in range(-1, hh//d+1):
s = d*i + st_h
t = s+self.l
s = max(min(s, hh), 0)
t = max(min(t, hh), 0)
mask[s:t,:] *= 0
for i in range(-1, hh//d+1):
s = d*i + st_w
t = s+self.l
s = max(min(s, hh), 0)
t = max(min(t, hh), 0)
mask[:,s:t] *= 0
r = np.random.randint(self.rotate)
mask = Image.fromarray(np.uint8(mask))
mask = mask.rotate(r)
mask = np.asarray(mask)
mask = mask[(hh-h)//2:(hh-h)//2+h, (hh-w)//2:(hh-w)//2+w]
mask = torch.from_numpy(mask).float().cuda()
if self.mode == 1:
mask = 1-mask
mask = mask.expand_as(img)
img = img * mask
return img
class GridMask(nn.Module):
def __init__(self, d1, d2, rotate = 1, ratio = 0.5, mode=0, prob=1.):
super(GridMask, self).__init__()
self.rotate = rotate
self.ratio = ratio
self.mode = mode
self.st_prob = prob
self.grid = Grid(d1, d2, rotate, ratio, mode, prob)
def set_prob(self, epoch, max_epoch):
self.grid.set_prob(epoch, max_epoch)
def forward(self, x):
if not self.training:
return x
n,c,h,w = x.size()
y = []
for i in range(n):
y.append(self.grid(x[i]))
y = torch.cat(y).view(n,c,h,w)
return y
比如下图(该图为了方便,将二维简化为一维),这个三层的神经卷积神经网络,每一层卷积核的 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lrdYhW87-1650337802831)(https://www.zhihu.com/equation?tex=kernel_size%3D3)], [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qib1N3D2-1650337802832)(https://www.zhihu.com/equation?tex=stride%3D1)] ,那么最上层特征所对应的感受野就为如图所示的7x7。
二、计算方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SGcsPw72-1650337802834)(https://www.zhihu.com/equation?tex=RF_{l%2B1}%3DRF_{l}%2B(kernel_size_{l%2B1}-1)]\times+feature_stride_{l})
其中 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5CQjES5E-1650337802836)(https://www.zhihu.com/equation?tex=RF)] 表示特征感受野大小, [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7c5rd9p7-1650337802837)(https://www.zhihu.com/equation?tex=l)] 表示层数, [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vdBXNMhC-1650337802838)(https://www.zhihu.com/equation?tex=feature_stride_l%3D\prod_{i%3D1}^{l}stride_i)], [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pnhLjMFC-1650337802838)(https://www.zhihu.com/equation?tex=l%3D0)] 表示输入层, [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kMXq941L-1650337802839)(https://www.zhihu.com/equation?tex=RF_{0}%3D1)] , [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nh5Gnfdn-1650337802839)(https://www.zhihu.com/equation?tex=feature_stride_0%3D1)] 。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cB9gNpPR-1650337802840)(https://www.zhihu.com/equation?tex=RF_{1}%3DRF_{0}%2B(kernel_size_{1}-1)]\times+feature_stride_{0}%3D1%2B(3-1)\times+1%3D3)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QT7BQORj-1650337802841)(https://www.zhihu.com/equation?tex=RF_{2}%3DRF_{1}%2B(kernel_size_{2}-1)]\times+feature_stride_{1}%3D3%2B(3-1)\times+1%3D5)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-98qkXyoT-1650337802842)(https://www.zhihu.com/equation?tex=RF_{3}%3DRF_{2}%2B(kernel_size_{3}-1)]\times+feature_stride_{2}%3D5%2B(3-1)\times+1%3D7)
如果有dilated conv的话,计算公式为
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m8yAdwjb-1650337802843)(https://www.zhihu.com/equation?tex=RF_{l%2B1}%3DRF_{l}%2B(kernel_size_{l%2B1}-1)]\times+feature_stride_{l}\times+dilation_{l%2B1})
本期更新的AI-hub的topic是Object Detection,主要包含的内容有:
在计算机视觉中,Attention Mechanism很早就出现了。对于一张图像或一个通过CNN的feature map,它有空间域(Spatial Domain)、通道域(Channel Domain),那么最早的一些工作就是通过对每个通道进行加权得到最终的feature map,那么这就是SE-Net (Squeeze and Excitation Network),这个Squeeze和Excitation就是vision attention的一个范式了。通道上可以,空间像素上也是可以的,那么混合(Mixed Domain)也是可以的。有一些著名的工作比如SE-Net, CBAM, ResAttention, ECA, A2Net, BAM, RAM, FCA等等.
以上的文章都可以分为squeeze阶段和excitation阶段。简略介绍下:以SE-Net为例,一个feature map有H W C三个维度,那么我们要做的是给这个feature map的每个通道上乘以一个[0,1]的权重,那么有的通道就不重要就不会被激活了在后面的网络中。第一步:我们要将HxWxC变成1xC的张量,这个过程就是squeeze,这个部分就可以很多自由发挥的room,比如Global Max/Average Pooling;第二步:我们需要通过一个网络得到一系列的weight,那么很简单地,我们可以通过一个fully-connected neural network就可以了,而ECA中,使用的是Conv1D的卷积。这就是所有文章关注设计的两个主要stages。
Attention不仅于此,attend的东西可以更加抽象!比如,可以是一系列行为,举个例子,CVPR2019上有paper介绍了这样一份工作关于image restoration。那我们知道,image会受到噪声、压缩、模糊等等,那么这些攻击有可能是都发生的,或有可能是发生了其中几个。作者就根据此提出了使用Attention的机制进行图像恢复。
最后几个问题:
Hard Attention通常不可微,需要使用强化学习!
将权重赋予到object的各个component上的方法有很多,不仅仅是标准的vector之间的inner-product。
query and key是通常在Attention中出现的角色,你需要关注Q,K,V。
Attention通常会带来很多可解释性的副产品。Attention和Explainable Learning有密切的联系。
Self-Attention是Attention的一种。不要混淆Self-Attention和Attention。
通过数据集的增广:可以对数据集进行一些简单的操作,旋转、翻转等操作下,添加一些必要的扰动模型也可以认为是保护模型多样性的一个结果。例如一些数据集增强方法:GridMask和Mixup(比较有名)。
Color Jittering:对颜色的数据增强:图像亮度、饱和度、对比度变化(此处对色彩抖动的理解不知是否得当);
PCA Jittering:首先按照RGB三个颜色通道计算均值和标准差,再在整个训练集上计算协方差矩阵,进行特征分解,得到特征向量和特征值,用来做PCA Jittering;
Random Scale:尺度变换;
Random Crop:采用随机图像差值方式,对图像进行裁剪、缩放;包括Scale Jittering方法(VGG及ResNet模型使用)或者尺度和长宽比增强变换;
Horizontal/Vertical Flip:水平/垂直翻转;
Shift:平移变换;
Rotation/Reflection:旋转/仿射变换;
Noise:高斯噪声、模糊处理;
Label Shuffle:类别不平衡数据的增广;
GridMask:是一种自动的数据集增强方法主要用于目标检测等领域,通过生成一个与原图大小相同的Mask,在有规律的设置出一些数值伪0的黑色区域让其与原题相乘
添加BN层有什么好处?
BN层的过程有哪些?
这两个超参数有什么用?
超参λ和超参β
还有什么其他正则化方法?
LN(Layer Normalization)是对每一层的所有神经元进行归一化,一般常用于RNN网络中,与BN的差距如下:
IN(Instance Normalizaion)主要用于风格迁移的这一类内容,主要是为了保持每张图片本身具有的独立性
其他还有GN、SN(采用所有的正则化方法,但是具体的参数交给网络自己去选择,有早期的那种NAS的感觉)
评价:ResNet是CV领域的最要标志性成果,完成了技术爆炸的关键一环,ResNet首次解决了网络退化问题,网络退化指的是网络层数变深、卷积层的提取效果变好,但是效果并没有变好的这样一个问题。
描述:其中两层weight layer称之为残差结构而不是identity这条分支被认为是。因此,让模型自己去拟合残差特征图,残差哪怕没有学号也会影响到恒等变换,这样就可以提升模型的自主选择能力。
ResNet为什么能够解决网络退化呢?
输入端:
(1)Mosaic数据增强
Yolov5的输入端采用了和Yolov4一样的Mosaic数据增强的方式。
Mosaic数据增强提出的作者也是来自Yolov5团队的成员,不过,随机缩放、随机裁剪、随机排布的方式进行拼接,对于小目标的检测效果还是很不错的。
个人理解:主要是为了解决前期数据量不足的问题,采用数据增强的方法对于数据进行增广。
(2) 自适应锚框计算
(3)自适应图片缩放
a.这里大白填充的是黑色,即**(0,0,0),而Yolov5中填充的是灰色,即(114,114,114)**,都是一样的效果。
b.训练时没有采用缩减黑边的方式,还是采用传统填充的方式,即缩放到416*416大小。只是在测试,使用模型推理时,才采用缩减黑边的方式,提高目标检测,推理的速度。
BackBone:
(1) Focus结构
Focus结构主要是用于将输入的图片的大小进行放缩、同时不影响图像本身的内容,将一张图变成多张图进行操作。这样可以有效的提升Flops速度(作者说的)。
(2) CSP结构
U-Net网络主要应用于医学领域或者细胞分割,相较于FCN这种全卷积网络具有更好的鲁棒性和兼容性。因此,在目标分割领域以至于后期的显著性检测等领域都非常重视该文章的复现了了解。
首先,数据集我们的原始图像的尺寸都是 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yiKZYpfn-1650337802847)(https://www.zhihu.com/equation?tex=512\times512)] 的。为了能更好的处理图像的边界像素,U-Net使用了镜像操作(Overlay-tile Strategy)来解决该问题。镜像操作即是给输入图像加入一个对称的边,那么边的宽度是多少呢?一个比较好的策略是通过感受野确定。因为有效卷积是会降低Feature Map分辨率的,但是我们希望 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TB8gFk8H-1650337802847)(https://www.zhihu.com/equation?tex=512%5Ctimes512)] 的图像的边界点能够保留到最后一层Feature Map。所以我们需要通过加边的操作增加图像的分辨率,增加的尺寸即是感受野的大小,也就是说每条边界增加感受野的一半作为镜像边。
U-Net整体可以分为3个不同的子模块:主干特征提取网络、加强特征提取网络、预测网络三个不同的模块。
主干特征提取网络:原始图像为512×512大小的图片,考虑到边界值直接参与卷积会导致边缘信息的丢失,所以原本中采用镜像操作,可以认为是Padding,但是Padding的内容是受到局限的,是和像素有关的内容进行30个像素值的翻转。主干特征提取网络的主要结构还是与VGG具有较高的相似度,
Unet所使用的加强特征提取网络是一个U的形状。
利用第一步我们可以获得五个初步的有效特征层,在加强特征提取网络这里,我们会利用这五个初步的有效特征层进行特征融合,特征融合的方式就是对特征层进行上采样并且进行堆叠。
损失部分:采用交叉熵和Dice Loss
Cross Entropy Loss就是普通的交叉熵损失,当语义分割平台利用Softmax对像素点进行分类的时候,进行使用。
Dice loss将语义分割的评价指标作为Loss,Dice系数是一种集合相似度度量函数,通常用于计算两个样本的相似度,取值范围在[0,1]。
计算公式如下:
就是预测结果和真实结果的交乘上2,除上预测结果加上真实结果。其值在0-1之间。越大表示预测结果和真实结果重合度越大。所以Dice系数是越大越好。
如果作为LOSS的话是越小越好,所以使得Dice loss = 1 - Dice,就可以将Loss作为语义分割的损失了。
https://zhuanlan.zhihu.com/p/331783358转载
IOU损失表示预测框A和真实框B之间交并比的差值,反映预测检测框的检测效果。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0A35VesQ-1650337802849)(https://www.zhihu.com/equation?tex=L_{IOU}%3D1-IOU(A%2CB)])
但是,作为损失函数会出现以下问题:
GIOU是为了缓解IOU损失在检测框不重叠时出现的梯度问题而提出来的,在原来的IOU损失的基础上加上一个惩罚项。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fWR2lwoC-1650337802849)(https://www.zhihu.com/equation?tex=L_{GIOU}%3D1-IOU(A%2CB)]%2B\left|+C-A\cup+B+\right|%2F\left|+C+\right|)
其中,A是预测框,B是真实框,C是A和B的最小包围框,A、B、C的关系具体如下图所示。
惩罚项的意思是下图右边黄色区域的比值。
可以看出,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1zOgpKKI-1650337802852)(https://www.zhihu.com/equation?tex=L_{GIOU})]从0到2,越小越好。但是,作为损失函数会出现以下问题:
下图中,绿色框为真实框,黑色框为先验Anchor,蓝色为预测框。预测框是以先验框为基础进行位置移动和大小缩放。GIOU首先尝试增大预测框的大小,使得它能够与真实框有所重叠(如下图中间所示),然后进行上述公式中 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PGtpjIYe-1650337802852)(https://www.zhihu.com/equation?tex=IOU(A%2CB)]) 的计算。会消耗大量的时间在预测框尝试与真实框接触上,影响损失的收敛速度。
为了加快收敛速度,DIOU在IOU损失的基础上加一个惩罚项,用来最小化两个检测框中心点之间的标准化距离。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jx3AzfUg-1650337802853)(https://www.zhihu.com/equation?tex=L_{DIOU}%3D1-IOU(A%2CB)]%2B\rho{2}(A_{ctr}%2CB_{ctr})%2Fc{2})
其中,A为预测框,B为真实框;[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F7W2jcry-1650337802853)(https://www.zhihu.com/equation?tex=A_{ctr})]为预测框中心点坐标,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dpUjLsLC-1650337802853)(https://www.zhihu.com/equation?tex=B_{ctr})]为真实框中心点坐标。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tbMH8Q3j-1650337802854)(https://www.zhihu.com/equation?tex=\rho(\cdot)])是欧式距离计算;c为A、B最小包围框的对角线长度。
与GIoU loss类似,DIoU loss在预测框与目标框不重叠时,仍然可以为边界框提供优化移动方向。由于DIoU loss可以直接最小化两个目标框的距离,因此比GIoU loss收敛要快。此外,DIoU还可以替换普通的IoU评价策略,应用于NMS中,使得NMS得到的结果更加合理和有效。
CIOU在DIOU的基础上将长宽比吸纳进来。CIOU损失包括重叠面积、中心点距离和长宽比三项。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4E9l8Pt4-1650337802855)(https://www.zhihu.com/equation?tex=L_{CIOU}%3D1-IOU(A%2CB)]%2B\rho{2}(A_{ctr}%2CB_{ctr})%2Fc{2}%2B\alpha\upsilon)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-njmfkots-1650337802855)(https://www.zhihu.com/equation?tex=\upsilon%3D\frac{4}{\pi{2}}(arctan\frac{w{gt}}{h{gt}}-arctan\frac{w}{h})]{2}) [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oyByEBe8-1650337802855)(https://www.zhihu.com/equation?tex=\alpha%3D\frac{\nu}{(1-IoU)]%2Bv})
其中,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TFUyNZZN-1650337802856)(https://www.zhihu.com/equation?tex=w{gt})]和[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6WwHfomb-1650337802856)(https://www.zhihu.com/equation?tex=h{gt})]分别表示真实框的宽和高;w和h分别表示预测框的宽和高。
若真实框和预测框的宽高相似,那么[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gAKyDwjB-1650337802856)(https://www.zhihu.com/equation?tex=v)]为0,该惩罚项就不起作用了。所以很直观地,这个惩罚项作用就是控制预测框的宽高能够尽可能快速地与真实框的宽高接近。
Precision / Recall / F_1 Score
对于二分类问题,我们常常使用精确率(Precision)、召回率(Recall)以及F_1 Score来评估二分类模型的性能。对于一个二分类器,在数据集上的预测情况可以分为以下4种:
有了以上概念,我们可以给出以下评估指标的定义:
精确率定义为:
P = T P T P + F P P=\frac{TP}{TP+FP} P=TP+FPTP
即在模型预测为正类的样本中,预测正确的比例。可以看到,精确率更加关注于模型认为是正类样本的结果。
召回率定义为:
R = T P T P + F N R=\frac{TP}{TP+FN} R=TP+FNTP
即在正类的样本中,模型预测正确的比例。相比之下,召回率更加关注于那些真实值为正类的样本。
此外,F_1 值定义为精确率与召回率的调和均值,即
2 F 1 = 1 P + 1 R \frac{2}{F_1}=\frac{1}{P}+\frac{1}{R} F12=P1+R1
F 1 = 2 × P × R P + R = 2 T P 2 T P + F P + F N F_1 = \frac{2 \times P \times R}{P + R} = \frac{2TP}{2TP+FP+FN} F1=P+R2×P×R=2TP+FP+FN2TP
当精确率和召回率都高时,F_1值也会高。
混淆矩阵 Confusion Matrix
分类结果的混淆矩阵如下表所示。