前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Yolov8-pose关键点检测:模型轻量化设计 | 模型压缩率从6842降低到1018,GFLOPs从9.6降低至2.2

Yolov8-pose关键点检测:模型轻量化设计 | 模型压缩率从6842降低到1018,GFLOPs从9.6降低至2.2

原创
作者头像
AI小怪兽
发布2023-12-08 13:51:50
发布2023-12-08 13:51:50
1.8K10
代码可运行
举报
文章被收录于专栏:YOLO大作战YOLO大作战
运行总次数:0
代码可运行

💡💡💡本文解决什么问题:Yolov8-pose关键点检测轻量级模型设计

轻量化模型设计:模型压缩率6842降低到1018GFLOPs9.6降低至2.2 mAP500.921变为0.92(几乎不变)

1.Yolov8-pose轻量化模型设计

直接先上图

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

2. yolov8-lite-pose介绍

2.1 Stemblock

论文:1804.06882.pdf (arxiv.org)

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卷积和最大值池化两种的优势引申而来的池化策略(而组合池化使用的是最大值池化和均值池化),可以丰富特征层。

2.2 DWConvblock

MobileNet使用3x3深度可分离卷积,计算量比标准卷积缩减8到9倍,只有很小的准确率的损失,可以再第4部分看到。另外在空间维度上的分解如[16,31]中,并不省太多额外的计算量,小的计算都是在深度方向的卷积。图2。标准卷积滤波器在(a)中被两个层替代:深度卷积在(b)和点卷积在(c)构建深度可分离滤波器。

3.加入yolov8

3.1修改ultralytics/nn/modules/block.py

代码语言:javascript
代码运行次数:0
运行
复制
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小怪兽

https://blog.csdn.net/m0_63774211/article/details/134174684

我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.Yolov8-pose轻量化模型设计
  • 2. yolov8-lite-pose介绍
    • 2.1 Stemblock
    • 2.2 DWConvblock
  • 3.加入yolov8
    • 3.1修改ultralytics/nn/modules/block.py
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档