该示例为参考算法,仅作为在J6上模型部署的设计参考,非量产算法。
简介
性能精度指标
模型 | 输入大小 | J6E 帧率(FPS) | J6M 帧率(FPS) | 浮点精度 | 量化精度 | 数据集 |
|---|---|---|---|---|---|---|
resnet18 | 1x3x224x224 | 2456 | 3146 | 72.04 | 71.64 | ImageNet |
1x3x704x1280 | 306 | 391 | / | / | ImageNet | |
resnet50 | 1x3x224x224 | 1092 | 1490 | 77.38 | 76.78 | ImageNet |
1x3x704x1280 | 124 | 168 | / | / | ImageNet | |
efficientnet-b0 | 1x3x224x224 | 3379 | 4004 | 74.31 | 73.85 | ImageNet |
1x3x704x1280 | 472 | 620 | / | / | ImageNet | |
mobilenetv2 | 1x3x224x224 | 4172 | 5988 | 72.63 | 71.47 | ImageNet |
1x3x704x1280 | 732 | 942 | / | / | ImageNet | |
mixvargenet | 1x3x224x224 | 3928 | 4114 | 71.32 | 70.63 | ImageNet |
1x3x704x1280 | 485 | 653 | / | / | ImageNet | |
vargnetv2 | 1x3x224x224 | 2661 | 3307 | 73.93 | 73.17 | ImageNet |
1x3x704x1280 | 631 | 860 | / | / | ImageNet | |
HENet_TinyE | 1x3x224x224 | 2637 | 3268 | 77.67 | 76.92 | ImageNet |
1x3x704x1280 | 534 | 737 | / | / | ImageNet | |
HENet_TinyM | 1x3x224x224 | 2467 | 3114 | 78.38 | 77.62 | ImageNet |
1x3x704x1280 | 444 | 605 | / | / | ImageNet |
不同OE版本间可能存在差异,请以具体版本实测为准。
模型介绍
HENet_TinyM
总体结构
参数含义:
depth:每个 stage 包含的 block 数量
block_cls:每个 stage 使用的基础 block 类型
width:每个 stage 中 block 的输出 channel 数
attention_block_num:每个 stage 中的 attention_block 数量,将用在 stage 的尾部(TinyM 中没有用到)
act_layer:每个 stage 使用的激活函数
use_layer_scale:是否对 residual 分支进行可学习的缩放
final_expand_channel:在网络尾部的 pooling 之前进行 channel 扩增的数量,0 代表不使用扩增
feature_mix_channel :在分类 head 之前进行 channel 扩增的数量
down_cls:每个 stage 对应的下采样类型
基础 block 结构
DWCB
DWCB(DWConvBlock)是 HENet 中主要使用的一个基础 block,它在主分支上使用一个 depthwise 卷积进行空间维度的信息融合(k=3x3),然后使用两个连续的 pointwise 卷积进行 channel 维度的信息融合,这种结构一定程度上借鉴了 transformer 中的 attention + mlp 的架构,同时将 latency 控制在一个较轻量级的程度。在 residual 分支上,DWCB 使用了一层可学习的 layer_scale,然后将两个分支的输出做 elementwise_add 然后输出。

GroupDWCB
GroupDWCB 是基于 DWCB 的一个轻量化改进,相比 DWCB,GroupDWCB 将主分支的第一个 pointwise 卷积改为了 pointwise group 卷积,以此来达到提速的目的。我们在实验中观察到,当满足 ① channel 数量不太小 ② 较浅的位层 两个条件时,GroupDWCB 可以达到精度无损,同时提速的效果,推测可能是 low_level feature 的性质决定的。在 TinyM 中,我们在第二个 stage 使用 GroupDWCB 来构建(g=2)。
AltDWCB
AltDWCB 是基于 DWCB 的一个变种,相比 DWCB,AltDWCB 将主分支的 depthwise 卷积的 kernel 改为了(1,5)或者(5,1),根据 block 所在层次位置交替使用。在我们的实验中,使用 AltDWCB 构建第三个 stage 将带来一定的性能提升。我们推荐在层数较多的 stage 尝试交替使用 AltDWCB。
S2DDown
S2DDown(Space2Depth Downsample)用于各 stage 之间的降采样,将降采样与 pointwise conv 合并为一个 stride 卷积,在完成空间降采样的同时完成通道投影,对应代码实现如下:
地平线征程6系列芯片对于 tensor layout 相关操作的高效支持,这一降采样操作得以以较快的速度完成。
HENet_TinyE
地平线部署说明
HENet 作为针对 J6 平台专门设计的高效 backbone,其结构(depthwise conv、pointwise conv、layer_scale、stride conv 降采样等)均贴合 J6 BPU 的高效算子支持,无需额外改动即可在 J6E/M 上高效部署。以下为量化部署相关说明。
精度优化
浮点精度
量化精度
注:TinyE 与 TinyM 的 qconfig 接口一致,仅 model.py 的结构配置不同,量化配置可直接复用。
总结与建议
训练建议:
针对收敛情况不佳,可适当增加 Step 数。
用于 sparse 模型时,可以尝试对 backbone 配置较大的 lr,不使用 StepLrUpdater。
浮点训练建议采用 AdamW + CosLrUpdater(warmup 5 epoch)+ SoftTargetCrossEntropy(mixup),详细超参见对应 config 目录。
部署建议:
针对输入输出相近的场景,或者作为主 backbone 使用的场景,推荐直接使用 TinyM / TinyE 原生结构;其他场景建议参考 TinyM 的基础 block 结构灵活构建模型。
对于感知模型中的多 camera backbone,建议针对不同类型的 camera 使用不同量级的 backbone:front/rear camera 推荐使用较强的结构,side camera 推荐使用较轻量的结构。
如需快速构建 baseline,建议先全局使用 DWCB,然后尝试 GroupDWCB、AltDWCB 等结构提升速度精度。
建议在满足 ① channel 数量不太小 ② 较浅的位层 两个条件的 stage 尝试使用 GroupDWCB(例如 stage 2)。
建议在层数较多的 stage 尝试交替使用 AltDWCB。
建议在 backbone 最开始的降采样中谨慎使用 S2DDown,优先尝试带有 overlap 的降采样方法(例如 k=2,s=3 的 conv)。
本文介绍了针对 J6 系列芯片专门设计的高效 backbone HENet,通过 DWCB / GroupDWCB / AltDWCB 等基础 block 与 S2DDown 下采样的组合,在 ImageNet 上取得 77.67/78.38 的浮点精度与 76.92/77.62 的量化精度,同时在 J6E/M 上获得较高的部署帧率。
附录
参考算法(modellabs)官网:https://(待发布)
