【论文学习】轻量级网络——MobileNetV3终于来了(含开源代码)

论文名称:《Searching for MobileNetV3》

 

感谢github上大佬们开源,开源代码整理如下:

(1)PyTorch实现1:https://github.com/xiaolai-sqlai/mobilenetv3

(2)PyTorch实现2:https://github.com/kuan-wang/pytorch-mobilenet-v3

(3)PyTorch实现3:https://github.com/leaderj1001/MobileNetV3-Pytorch

(4)Caffe实现:https://github.com/jixing0415/caffe-mobilenet-v3

(5)TensorFLow实现:https://github.com/Bisonai/mobilenetv3-tensorflow

 

轻量化网络

        从SqueezeNet开始模型的参数量就不断下降,为了进一步减少模型的实际操作数(MAdds),MobileNetV1利用了深度可分离卷积提高了计算效率,而MobileNetV2则加入了线性bottlenecks和反转残差模块构成了高效的基本模块。随后的ShuffleNet充分利用了组卷积和通道shuffle进一步提高模型效率。CondenseNet则学习保留有效的dense连接在保持精度的同时降低,ShiftNet则利用shift操作和逐点卷积代替了昂贵的空间卷积。

MobileNetV3

        时隔一年,谷歌在arXiv上公布了MobileNetV3论文,详细介绍了MobileNetV3的设计思想和网络结构。下面一起来膜拜一下大佬们的思想!

整体来说MobileNetV3有两大创新点

(1)互补搜索技术组合:由资源受限的NAS执行模块级搜索,NetAdapt执行局部搜索。

(2)网络结构改进:将最后一步的平均池化层前移并移除最后一个卷积层,引入h-swish激活函数。

1、MobileNetV3 block

        上面两张图是MobileNetV2和MobileNetV3的网络块结构。可以看出,MobileNetV3是综合了以下三种模型的思想:MobileNetV1的深度可分离卷积depthwise separable convolutions)、MobileNetV2具有线性瓶颈的逆残差结构(the inverted residual with linear bottleneck)和MnasNet的基于squeeze and excitation结构的轻量级注意力模型。

        综合了以上三种结构的优点设计出了高效的MobileNetV3模块。

 

2、 互补搜索技术组合

(1)资源受限的NAS(platform-aware NAS):计算和参数量受限的前提下搜索网络的各个模块,所以称之为模块级的搜索(Block-wise Search)。

(2)NetAdapt:用于对各个模块确定之后网络层的微调。

        对于模型结构的探索和优化来说,网络搜索是强大的工具。研究人员首先使用了神经网络搜索功能来构建全局的网络结构,随后利用了NetAdapt算法来对每层的核数量进行优化。对于全局的网络结构搜索,研究人员使用了与Mnasnet中相同的,基于RNN的控制器和分级的搜索空间,并针对特定的硬件平台进行精度-延时平衡优化,在目标延时(~80ms)范围内进行搜索。随后利用NetAdapt方法来对每一层按照序列的方式进行调优。在尽量优化模型延时的同时保持精度,减小扩充层和每一层中瓶颈的大小。

 

3、网络结构的改进

        MobileNetV2模型中反转残差结构和变量利用了1*1卷积来构建最后层,以便于拓展到高维的特征空间,虽然对于提取丰富特征进行预测十分重要,但却引入了二外的计算开销与延时。为了在保留高维特征的前提下减小延时,将平均池化前的层移除并用1*1卷积来计算特征图。特征生成层被移除后,先前用于瓶颈映射的层也不再需要了,这将为减少10ms的开销,在提速15%的同时减小了30m的操作数。

h-swish激活函数

        作者发现swish激活函数能够有效提高网络的精度。然而,swish的计算量太大了。作者提出h-swish(hard version of swish)如下所示

h-swish如图所示

        这种非线性在保持精度的情况下带了了很多优势,首先ReLU6在众多软硬件框架中都可以实现,其次量化时避免了数值精度的损失,运行快。这一非线性改变将模型的延时增加了15%。但它带来的网络效应对于精度和延时具有正向促进,剩下的开销可以通过融合非线性与先前层来消除。

 

4、MobileNetV3网络结构

作者提出了MobileNetV3-Large和MobileNetV3-Small两种不同大小的网络结构。如下图所示

                 

   

        MobileNet-v3 small网络结构

 

 

5、实验结果

(1)ImageNet分类实验结果

(2)在SSDLite目标检测算法中精度

(3)用于语义分割

(4)性能比较结果

 

        文章看完还是感觉很棒的,欢迎大家一起学习交流!

### 如何在 YOLOv8 中使用 MobileNetV3 作为 Backbone 为了实现将 MobileNetV3 替换到 YOLOv8 的 backbone 部分,以下是详细的说明: #### 1. **理解架构调整** YOLOv8 是一种端到端的目标检测框架,其主要由三个部分组成:backbone、neck 和 head。其中,backbone 负责提取图像中的特征图[^1]。通过将原始的 YOLOv8 backbone 替换为更轻量级MobileNetV3,可以在减少计算成本的同时提高效率。 MobileNetV3 提供了两种变体——Large 和 Small,分别适用于不同的硬件资源环境[^3]。因此,在实际应用中可以根据具体需求选择合适的版本。 #### 2. **加载预训练权重** 通常情况下,直接从头开始训练一个复杂的神经网络是非常耗时且困难重重的任务。幸运的是,MobileNetV3 已经有官方发布的 ImageNet 数据集上的预训练模型可供下载并迁移学习[^2]。这些预训练好的参数能够显著加速收敛过程,并提升最终性能表现。 #### 3. **修改配置文件** 对于 Ultralytics 提供的标准版 PyTorch 实现来说,所有的超参数设置都存储在一个 YAML 格式的配置文件当中。要完成上述更改,则需要编辑该文档来指定新的骨干网结构以及相应的输入输出通道数等细节信息。 下面是一个简单的例子展示如何定义一个新的基于 MobileNetV3-large 的自定义 backbones.yaml 文件片段: ```yaml # Custom Backbone Configuration for YOLOv8 with MobileNetV3-Large as the feature extractor. backbone: # Define each layer of Mobilenet V3 Large here... [[...]] ``` 注意这里省略了一些具体的层定义代码,因为它们会非常冗长复杂;但是你可以参考原论文或者开源项目里的实现方式来进行填充。 #### 4. **编写适配器模块** 由于两者的接口可能并不完全兼容,所以还需要创建一个小规模的过渡组件用来连接两者之间的差异之处。这个环节涉及到对原有 Neck 层做适当调整以便接受来自新 BackBone 输出的不同尺寸特征映射矩阵。 #### 5. **重新编译与测试** 最后一步就是把所有改动后的脚本再次打包成可执行程序包形式,并运行一系列验证实验确认整个流程是否正常运作无误。如果一切顺利的话,那么恭喜您成功构建出了一个融合了最新研究成果的新一代实时物体探测系统! ```python import torch from torchvision import models def load_mobilenet_v3_large(pretrained=True): """Load a pre-trained MobileNetV3-Large model.""" mobilenet = models.mobilenet_v3_large(pretrained=pretrained) return mobilenet.features # Return only the features part, excluding classifier. if __name__ == "__main__": device = 'cuda' if torch.cuda.is_available() else 'cpu' # Load pretrained MobileNetV3-Large as backbone backbone = load_mobilenet_v3_large().to(device) dummy_input = torch.randn(1, 3, 640, 640).to(device) # Example input size matching YOLOv8's default resolution output_features = backbone(dummy_input) print(output_features.shape) # Should match expected dimensions required by YOLOv8 neck component. ``` 以上即是在 YOLOv8 架构下采用 MobileNetV3 作为主干网络的主要步骤概述[^3]。
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值