1. 引言
轻量化网络旨在减少模型参数和计算量,同时保持较高准确率。为了降低设备能耗,提升实时性,轻量化网络结构在嵌入式设备等资源受限环境中广泛应用。
2. 经典轻量化网络结构
2.1 MobileNetV3
总体介绍:采用神经架构搜索(NAS)技术优化网络宽度和深度,重新设计耗时层结构,分为 MobileNetV3-Large 和 MobileNetV3-Small 两种结构。通过堆叠不同配置的 block,配合卷积层、池化层和全连接层实现特征提取和分类。如 MobileNetV3-Large 适用于对精度要求较高的场景,MobileNetV3-Small 则更注重轻量性。
主要创新:在 MobileNetV2 的基础上,改进 bottleneck 结构,典型的创新点是加入 SE 模块,增强特征筛选能力。

SE 模块类似注意力机制,通过全局平均池化和两个全连接层,计算每个通道的权重系数,自适应调整特征。SE模块细节介绍如下

具体代码介绍,可见文章:【MobileNetV3】MobileNetV3网络结构详解。
2.2 EfficientNet
总体介绍:利用 NAS 技术,综合考虑输入分辨率、网络深度和宽度,平衡三者关系,构建高效网络。通过调整宽度系数和深度系数,改变网络的通道数和层数,有 EfficientNet-B0 到 B7 多个变体,EfficientNet-B0 作为基础版本,B1 - B7 在其基础上逐渐增加复杂度和性能。
MBConv 结构:包含 1x1 普通卷积(升维)、kxk 深度卷积(3x3 或 5x5)、SE 模块、1x1 普通卷积(降维)和 Dropout 层。SE 模块中第一个全连接层节点个数是输入特征矩阵通道数的 1/4,使用 Swish 激活函数;第二个全连接层节点个数等于深度卷积层输出通道数,使用 Sigmoid 激活函数。

3. HENet:地平线的高效轻量化网络
理论部分,https://developer.horizon.auto/blog/10144 介绍的很好!下面不会过多介绍,重点在代码使用。
HENet(Hybrid Efficient Network)是针对地平线 J6 系列芯片设计的高效网络。
3.1 HENet_TinyM理论简介
采用纯 CNN 架构,分为四个 stage,每个 stage 进行一次 2 倍下采样。通过不同的参数配置,如 depth、block_cls、width 等,构建高效的特征提取网络。
基础 block 结构
DWCB:主分支使用 3x3 深度卷积融合空间信息,两个连续的点卷积融合通道信息,借鉴 transformer 架构,在残差分支添加可学习的 layer_scale,平衡性能与计算量。

GroupDWCB:基于 DWCB 改进,将主分支第一个点卷积改为点分组卷积,在特定条件下可实现精度无损且提速(实验中观察到,当满足 ① channel 数量不太小 ② 较浅的位层 两个条件时,GroupDWCB 可以达到精度无损,同时提速的效果),在 TinyM 的第二个 stage 使用(g = 2)。

AltDWCB:DWCB 的变种,将深度卷积核改为(1,5)或(5,1)交替使用,在第三个 stage 使用可提升性能,适用于层数较多的 stage。

下采样方式:S2DDown 使用 space to depth 操作降采样,利用 J6 系列芯片对 tensor layout 操作的高效支持,快速完成降采样,改变特征的空间和通道维度。(自己设计时,谨慎使用 S2DDown 降采样方法。)

自行构建有效基础 block:构建 baseline 时,可先使用 DWCB,再尝试GroupDWCB/AltDWCB结构提升性能。
3.2 性能/精度数据对比
从帧率和精度数据来看,HENet_TinyM 和 HENet_TinyE 在 J6 系列芯片上表现出色,与其他经典轻量化网络相比,在保证精度的同时,具有更高的帧率,更适合实际应用。

3.3 HENet_TinyM代码详解
HENet源码在地平线docker路径:/usr/local/lib/python3.10/dist-packages/hat/models/backbones/henet.py
HENet_TinyM总体分为四个 stage,每个 stage 会进行一次 2 倍下采样。以下是总体的结构配置:
depth:每个 stage 包含的 block 数量
block_cls:每个 stage 使用的基础 block 类型
width:每个 stage 中 block 的输出 channel 数
attention_block_num:每个 stage 中的 attention_block 数量,将用在 stage 的尾部(TinyM 中没有用到)
mlp_ratios:每个stage中的mlp的通道扩增系数
act_layer:每个 stage 使用的激活函数
use_layer_scale:是否对 residual 分支进行可学习的缩放
final_expand_channel:在网络尾部的 pooling 之前进行 channel 扩增的数量,0 代表不使用扩增
feature_mix_channel :在分类 head 之前进行 channel 扩增的数量
down_cls:每个 stage 对应的下采样类型
代码解读:
4. 基于block构建网络
可参考如下代码构建:
输出信息如下:

