💡💡💡本文解决什么问题:Yolov8-pose关键点检测轻量级模型设计
轻量化模型设计:模型压缩率从6842降低到1018,GFLOPs从9.6降低至2.2, mAP50从0.921变为0.92(几乎不变)
直接先上图
layers | parameters | GFLOPs | kb | mAP50 | mAP50-95 | |
---|---|---|---|---|---|---|
yolov8-pose | 187 | 3379496 | 9.6 | 6842 | 0.921 | 0.697 |
yolov8-lite-s-pose | 220 | 411484 | 2.2 | 1018 | 0.92 | 0.651 |
yolov8-lite-t-pose | 220 | 329808 | 1.9 | 858 | 0.828 | 0.55 |
Stemblock最初来源于轻量级神经网络PeleeNet
ResNet和DenseNet在第一层都是用的是一个7x7、stride为2的卷积层,浅层网络的作用一般是提取图像的边缘、纹理等信息;Stem Block的设计就是打算以比较小的代价取代7x7的卷积,这个模块可以在几乎不增加计算量的情况下提升特征的表达能力;block先使用strided=2的3x3卷积进行快速降维,然后用了两分支的结构,一个分支用1*1卷积进行降维、strided=2的3x3卷积, 另一个分支使用了一个maxpool;这一部分和组合池化非常相似,stem block使用了strided=2的3x3卷积和最大值池化两种的优势引申而来的池化策略(而组合池化使用的是最大值池化和均值池化),可以丰富特征层。
MobileNet使用3x3深度可分离卷积,计算量比标准卷积缩减8到9倍,只有很小的准确率的损失,可以再第4部分看到。另外在空间维度上的分解如[16,31]中,并不省太多额外的计算量,小的计算都是在深度方向的卷积。图2。标准卷积滤波器在(a)中被两个层替代:深度卷积在(b)和点卷积在(c)构建深度可分离滤波器。
class StemBlock(nn.Module):
def __init__(self, c1, c2, k=3, s=2, p=None, g=1, d=1, act=True):
super(StemBlock, self).__init__()
self.stem_1 = Conv(c1, c2, k, s, p, g, d, act)
self.stem_2a = Conv(c2, c2 // 2, 1, 1, 0)
self.stem_2b = Conv(c2 // 2, c2, 3, 2, 1)
self.stem_2p = nn.MaxPool2d(kernel_size=2,stride=2,ceil_mode=True)
self.stem_3 = Conv(c2 * 2, c2, 1, 1, 0)
def forward(self, x):
stem_1_out = self.stem_1(x)
stem_2a_out = self.stem_2a(stem_1_out)
stem_2b_out = self.stem_2b(stem_2a_out)
stem_2p_out = self.stem_2p(stem_1_out)
out = self.stem_3(torch.cat((stem_2b_out,stem_2p_out),1))
return out
class conv_bn_relu_maxpool(nn.Module):
def __init__(self, c1, c2): # ch_in, ch_out
super(conv_bn_relu_maxpool, self).__init__()
self.conv = nn.Sequential(
nn.Conv2d(c1, c2, kernel_size=3, stride=2, padding=1, bias=False),
nn.BatchNorm2d(c2),
nn.SiLU(inplace=True),
)
self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
def forward(self, x):
return self.maxpool(self.conv(x))
class DWConvblock(nn.Module):
"Depthwise conv + Pointwise conv"
def __init__(self, in_channels, out_channels, k, s):
super(DWConvblock, self).__init__()
self.p = k // 2
self.conv1 = nn.Conv2d(in_channels, in_channels, kernel_size=k, stride=s, padding=self.p, groups=in_channels, bias=False)
self.bn1 = nn.BatchNorm2d(in_channels)
self.act1 = nn.SiLU(inplace=True)
self.conv2 = nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=1, padding=0, bias=False)
self.bn2 = nn.BatchNorm2d(out_channels)
self.act2 = nn.SiLU(inplace=True)
def forward(self, x):
x = self.conv1(x)
x = self.bn1(x)
x = self.act1(x)
x = self.conv2(x)
x = self.bn2(x)
x = self.act2(x)
return x
轻量化模型设计:模型压缩率从6842降低到1018,GFLOPs从9.6降低至2.2,mAP50从0.921变为0.92(几乎不变)
by CSDN AI小怪兽
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。