文章目录
- HRNet CVPR2019
- 1. 简介
- 2. 网络架构
- 2.1 总揽图
- 2.2 3*3卷积块
- 2.3 BasicBlock
- 2.4 三层残差块
- 2.5 HighResolutionNet
- 结构初始化
__init__() - 构建 stage 间转换层
_make_transition_layer() - 构建 stage1 的 layer
_make_layer() - 构建 stage 2/3/4 的 layer
_make_stage
- 2.6 高分辨率模块HighResolutionModule
- check_branches()
- 构建一个横向分支make_one_branch
- forward
- 构建 multi-scale 特征融合层:fuse_layer函数
- transition_layers函数(上图中画叉的那一个分支)
- 3. 训练
- 4. 代码
- 4.1 简易版
- 4.2 原版
HRNet,是高分辨率网络 (High-Resolution Net) 的缩写。
论文地址
代码链接
代码链接2
中科大和微软亚洲研究院,发布了新的人体姿态估计模型,刷新了三项COCO纪录,还中选了CVPR 2019。
这个名叫HRNet的神经网络,拥有与众不同的并联结构,可以随时保持高分辨率表征,不只靠从低分辨率表征里,恢复高分辨率表征。如此一来,姿势识别的效果明显提升:
在COCO数据集的关键点检测、姿态估计、多人姿态估计这三项任务里,HRNet都超越了所有前辈。
改变输入头,就可以做目标分割,分类等任务
从 IMG 到 1⁄4 大小的 feature map,得到此尺寸的特征图后,之后的 HRNet 始终保持此尺寸的图片
:如下图所示的 4 阶段 由 组成的模型
- 每个stage产生的multi-scale特征图
- stage 的连接处有 transition 结构,用于在不同 stage 之间连接,完成 channels 及 feature map 大小对应。

将stage4输出的4种scale特征concat到一起,加上num_channels->num_classes层,得到分割结果


expansion的参数,这个参数用来控制卷积的输入输出通道数。

- 原图先降成1/4大小
- 执行1个stage1(4个block)
- 通过卷积生成1/2分辨率的流(现在有两条流)
- 执行1个stage2(两个流的4个block以及两个流之间交融)
- 通过卷积生成1/4分辨率的流(现在有三条流)
- 执行4个stage3(三个流的4个block以及三个流之间交融)
- 通过卷积生成1/8分辨率的流(现在有四条流)
- 执行3个stage4(四个流的4个block以及四个流之间交融)
- 上采样下面三条流,使之大小变回原大小,在concat拼接channel用于后续分割任务
结构初始化
HRNet 类定义,通过 config 指定的模型结构,实例化特定结构的模型,构建过程如下
构建 stage 间转换层
transition layer 完成 stage 之间连接需要的 两种转换
- input channels 转换
- feature size downsample
以下为 hrnet_w48 的 transition 具体结构
构建 stage1 的 layer
stage1 产生 1⁄4 feature map,没有 branch 分支结构,采用与 resnet 完成一样的 函数构建层
构建 stage 2/3/4 的 layer
stage 2/3/4 为 HRNet 核心结构,用到了 ,内含 branch 构建和 特征 fuse 模块

实现下图红框中的,branch 并行 多 scale 特征提取 和 末端将 多 scale 特征通过 upsample/downsample 方式融合

check_branches()
这个函数的作用是检查,在高分辨率模块中num_branches(int类型),和len(num_inchannels(里面的元素是int)),和len(num_channels(里面的元素是int))它们三个的值是否相等。
构建一个横向分支make_one_branch
它的作用就是创建一个新的分支,如图

make_branches函数是看看每个stage里面有多少branch,然后有几个就调用几次_make_one_branch函数。
根据 stage cfg 中指定的 branch 数量,构建多个并行的 branch,调用之前的 ,如 stage 2/3/4 各有 2/3/4 个 branches
forward
构建 multi-scale 特征融合层:fuse_layer函数
HighResolutionModule 末尾的特征融合层
以下图红框即 stage3 中 蓝色 branch 输出结果为例,其输出结果要转换成 4 种尺度的特征,用于每个 branch 末尾的特征融合
- 1⁄8 ↗ 1/4,不同层,channel 不同,size 不同 👉 通道转换 + 上采样 (在 forward 函数中由双线性插值完成)
- 1⁄8 → 1/8,相同层,channel 一致,size 一致 👉 None,直接使用 feature
- 1⁄8 ↘ 1/16,不同层,channel 不同,size 不同 👉 通道转换 + 下采样 (通过串联的 stride=2 的 3x3 conv 完成)
- 1⁄8 ↘ 1/32,同上

transition_layers函数(上图中画叉的那一个分支)
transition layer 完成 stage 之间连接需要的 两种转换
(1)input channels 转换
(2)feature size downsample
- 构建 stage1 的 layer _make_layer()
stage1 产生 1⁄4 feature map,没有 branch 分支结构,采用与 resnet 完成一样的 _make_layer() 函数构建层 - 构建 stage 2/3/4 的 layer _make_stage
stage 2/3/4 为 HRNet 核心结构,用到了核心类 HighResolutionModule,内含 make_branches 构建和特征 _make_fuse_layers 模块

原文博客地址


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/165840.html