赞
踩
Mosaic数据增强通过随机选择4张图片并将它们拼接在一起来创建一个新的合成图像,然后对这个新的合成图像进行数据增强操作,包括翻转、缩放和色彩增强等,以增加训练集的多样性和鲁棒性。在拼接图片时,每张图片的边缘会有一定重叠,这使得模型可以学习到不同图片之间的平滑过渡。
推理时并不需要进行Mosaic数据增强操作,因为Mosaic数据增强只是一种训练技巧,旨在增加训练数据的多样性和鲁棒性。在推理阶段,模型会直接对输入图像进行预测,并输出检测结果。
Mosaic数据增强的操作流程:
注意:数据增广包括:翻转、缩放以及色域变化(明亮度、饱和度、色调)等操作。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NVeRtkhA-1679467701748)(null)]
越来越平滑
ReLU(Rectified Linear Unit)是一种常用的激活函数,它的定义为 f ( x ) = max ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x),即将输入信号小于0的部分设置为0,大于等于0的部分保持不变。ReLU具有简单、高效的特点,并且在深度神经网络中表现出了出色的性能,成为了目前最常用的激活函数之一。
Leaky ReLU是对ReLU的改进,它在负半轴上引入一个较小的斜率,定义为 f ( x ) = max ( α x , x ) f(x) = \max(\alpha x, x) f(x)=max(αx,x),其中 α \alpha α为小于1的超参数,通常取0.1。Leaky ReLU的主要目的是解决ReLU在负半轴上的“死亡区域”问题,即在负半轴上,ReLU函数的梯度为0,导致神经元的更新停滞,影响模型的收敛性和泛化能力。
改善了模型的鲁棒性。由于Leaky ReLU在负半轴上有梯度,使得模型对于输入的微小扰动具有一定的稳定性,从而提高了模型的鲁棒性。
Mish是一种近年来提出的激活函数,它被认为比ReLU和Leaky ReLU表现更好。Mish的定义为 f ( x ) = x ⋅ tanh ( ln ( 1 + exp ( x ) ) ) f(x) = x \cdot \tanh(\ln(1+\exp(x))) f(x)=x⋅tanh(ln(1+exp(x))),它的形状类似于Softplus函数,但具有更平滑的曲线,使得它可以在激活函数中保持较好的梯度传播,从而有助于提高模型的收敛速度和泛化能力。
Mish函数和ReLU函数一样,在正半轴上都没有上限,这使得神经元可以接收更强的信号,避免了梯度饱和问题。同时,Mish函数是光滑的,有助于优化器更好地进行参数更新,提高模型的收敛速度和泛化能力。
与此同时,Mish函数的计算复杂度确实比ReLU函数要高,这也是需要注意的一个问题。在计算资源受限的情况下,可以考虑使用LeakyReLU等其他激活函数代替Mish函数,以平衡计算效率和模型性能。
梯度流(Gradient Flow)指的是神经网络中参数更新的梯度信息在网络中的流动过程。在神经网络中,通常使用反向传播算法来计算损失函数对网络参数的梯度信息,然后使用梯度下降等优化算法来更新网络参数。在更新参数的过程中,梯度信息通过网络的连接和计算,从输出层向输入层进行反向传播,从而更新各层的参数。
具体来说,神经网络中每个神经元的输出都会被传递到下一层的神经元中,通过计算和激活函数等操作,生成下一层的输出。在反向传播算法中,损失函数对于每个神经元的输出都有一个梯度值,该梯度值代表着该神经元对于损失函数的贡献程度。这些梯度值在反向传播过程中,会根据网络连接和计算的规则,向上一层的神经元传递,最终到达输入层,从而得到各层参数的梯度信息,用于更新参数。
梯度流的流动过程是神经网络中非常重要的一部分,它直接影响了神经网络的训练效果和收敛速度。在神经网络的设计和优化过程中,通常需要考虑如何优化梯度流的流动,以获得更好的训练效果和更快的收敛速度。
我的理解梯度分割流就是让卷积提取不同feature map的特征 因为卷积也是会反向传播传递梯度,这里传递的梯度是不同层次的
跟ResNet都是残差的结构, 但是实现方法是可以充分利用前面曾的特征图。相似点是将网络分为多个阶段(Stage),每个阶段由多个密集块(Dense Block)组成。
最后使用的是Avgpooling + softmax做分类
这里就是拿CSPNet去改进PeleeNet, 通过分配不同比例的gamma, 也就是Part1的比例
不同的分配会有不同的参数量和精度, 作者建议自己的实用场景去做
下图肯定是Part1分配的越多精度越差但是速度越快
SPDarkNet同时使用了Fusion Last和Fusion First, 基于这种思想做出来了上面这个基本的组件
从这个结构图来看, 这个基本的组件还是CBA, conv + BN + Activation(Mish)
上面是一个Block,可以看出来上面先分割一半特征是先transition再Concat, 图是错的,last, First写反了
下面是先Concat再去做transition
V4最多可以产生9个正样本但是V3只能最多3个,每个尺度一个正样本 三个层就是说8倍下采样, 16倍下采样, 32倍速下采样
只要大于IoU阈值的anchor box,都统统视作正样本,换言之,那些原本在YOLOv3中会被忽略掉的样本,在YOLOv4中则统统成为了正样本
L1损失(也称为绝对误差)是将预测值与真实值之间的差值(即误差)取绝对值后求和得到的。数学公式为: L 1 = ∑ i = 1 n ∣ y i − y i ^ ∣ L1 = \sum_{i=1}^{n} |y_i - \hat{y_i}| L1=∑i=1n∣yi−yi^∣,其中 y i y_i yi是真实值, y i ^ \hat{y_i} yi^是模型预测值,n是数据样本的数量。L1损失对于异常值(outlier)比较敏感,容易受到离群点的影响。
L2损失(也称为均方误差)是将预测值与真实值之间的差值平方后求和得到的。数学公式为: L 2 = ∑ i = 1 n ( y i − y i ^ ) 2 L2 = \sum_{i=1}^{n} (y_i - \hat{y_i})^2 L2=∑i=1n(yi−yi^)2,其中 y i y_i yi是真实值, y i ^ \hat{y_i} yi^是模型预测值,n是数据样本的数量。与L1损失相比,L2损失对于异常值不太敏感。
add(self, other) 定义加法的行为:+
sub(self, other) 定义减法的行为:-
mul(self, other) 定义乘法的行为:*
truediv(self, other) 定义真除法的行为:/
floordiv(self, other) 定义整数除法的行为://
mod(self, other) 定义取模算法的行为:%
divmod(self, other) 定义当被 divmod() 调用时的行为
pow(self, other[, modulo]) 定义当被 power() 调用或 ** 运算时的行为
lshift(self, other) 定义按位左移位的行为:<<
rshift(self, other) 定义按位右移位的行为:>>
and(self, other) 定义按位与操作的行为:&
xor(self, other) 定义按位异或操作的行为:^
or(self, other) 定义按位或操作的行为:|
import math def euclidean_distance(p1, p2): ''' 计算两个点的欧式距离 ''' x1, y1 = p1 x2, y2 = p2 return math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2) class BBox: def __init__(self, x, y, r, b): self.x, self.y, self.r, self.b = x, y, r, b def __xor__(self, other): ''' 计算box和other的IoU ''' cross = self & other union = self | other return cross / (union + 1e-6) def __or__(self, other): ''' 计算box和other的并集 ''' cross = self & other union = self.area + other.area - cross return union def __and__(self, other): ''' 计算box和other的交集 ''' xmax = min(self.r, other.r) ymax = min(self.b, other.b) xmin = max(self.x, other.x) ymin = max(self.y, other.y) return BBox(xmin, ymin, xmax, ymax).area def boundof(self, other): ''' 计算box和other的边缘外包框,使得2个box都在框内的最小矩形 ''' xmin = min(self.x, other.x) ymin = min(self.y, other.y) xmax = max(self.r, other.r) ymax = max(self.b, other.b) return BBox(xmin, ymin, xmax, ymax) def center_distance(self, other): ''' 计算两个box的中心点距离 ''' return euclidean_distance(self.center, other.center) def bound_diagonal_distance(self, other): ''' 计算两个box的bound的对角线距离 ''' bound = self.boundof(other) return euclidean_distance((bound.x, bound.y), (bound.r, bound.b)) @property def center(self): return (self.x + self.r) / 2, (self.y + self.b) / 2 @property def area(self): return self.width * self.height @property def width(self): return self.r - self.x @property def height(self): return self.b - self.y def __repr__(self): return f"{self.x}, {self.y}, {self.r}, {self.b}"
def IoU(a, b):
return a ^ b
a = BBox(10, 10, 100, 200)
b = BBox(50, 50, 150, 180)
IoU(a, b)
GIoU(广义交并比)是IOU的扩展,它还考虑了预测边界框和真实边界框并集以外的区域。这有助于提高度量的准确性,当边界框的大小或形状显着不同时。
def GIoU(a, b):
bound_area = a.boundof(b).area
union_area = a | b
return IoU(a, b) - (bound_area - union_area) / bound_area
GIoU(a, b)
def DIoU(a, b):
d = a.center_distance(b)
c = a.bound_diagonal_distance(b)
return IoU(a, b) - (d ** 2) / (c ** 2)
DIoU(a, b)
def CIoU(a, b):
v = 4 / (math.pi ** 2) * (math.atan(a.width / a.height) - math.atan(b.width / b.height)) ** 2
iou = IoU(a, b)
alpha = v / (1 - iou + v)
return DIoU(a, b) - alpha * v
CIoU(a, b)
总的来说,这些度量有助于评估目标检测算法的性能,并且可以用于比较不同目标检测方法的结果。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。