论文名称:
Deep High-Resolution Representation Learning for Visual Recognition
论文地址:
https://arxiv.org/pdf/1908.07919
官方代码下载:
https://github.com/HRNet
作者:
Jingdong Wang
发表时间:
最早发表在CVRP2019,后被顶刊TPAMI录用

HRNet简介

HighResolution Net(HRNet),顾名思义,它能够在整个过程中保持高分辨率表示,通过并行连接多分辨率,反复交换并行多分辨率子网络中的信息,通过跨分辨率的信息交互,实现高分辨率丰富语义的特征输出,实现多尺度融合

关键特点:
1、多分辨率并行流的架构,实现了高分辨率的保持,保证了较为精确完整的空间位置信息,高分辨率和低分辨率并行连接,同步推进;
2、跨分辨率信息交互特征融合,高分辨率和低分辨率之间不断交换信息,实现语义融合,在原空间信息精确基础上,增加了丰富的语义;

HRNet网络架构

如上图所示,主要包括4个部分:
1、Stem: 处理输入图片尺寸,转换为能够输入主网络的特征图;
2、block: 指最小的特征提取单元(conv 单元) ,如图矩形框住的一个分支,由4个block组成;
3、stage: 一共有四个stage,第一个stage有一个分支(分辨率流),第n个stage有n个分支;
4、head: 决定HRNet的输出结构,对应三种输出;

主要模块:

Parallel Multi-Resolution Convolutions 并行多分辨率卷积

不同的多个分辨率feature map分支保持并行连接

分辨率拓展时机


每一个stage中的分支都包含四个block操作,运行结束后,在进入下一个stage的时候会进行分支拓展 —— 添加一个新的分辨率。

Repeated Multi-Resolution Fusions跨分辨率融合/聚合方式


上一个stage 的输出作为下一个stage前分支拓展与跨分辨率信息交互的输入。
如上图为stage3到stage4的变换图,但未包括分辨率分支拓展的部分:
1、假设输入从上到下可以定义为:H31,H32,H33,前一个3表示来自第三个stage,后一个为index
2、假设从stage3到stage4输出为:H41,H42,H43,H44,其中H44为分支拓展得到的新分辨率分支(图中并未画出来)
3、HRNet中,想得到stage4的分支,即H41,H42,H43,H44,需要利用stage3中的H31,H32,H33产生
4、HRNet的聚合方式,就是size匹配以及channel匹配后进行直接相加融合,
例如:H41 = f1(H31) + f2(H32) + f3(H33)
其中,对于H41,f1(H31) = H31 , f2和f3 则是通过1×1的卷积上采样,还原feature map大小和进行通道数变换,使得与f1(H31)一样,才能保证融合成功。
类似,H42 = f1(H31) + f2(H32) + f3(H33)
注意,此时,f1要进行3×3卷积的下采样,f2(H32) = H32 , f3要进行1×1的下采样,依旧是为了size和通道数的匹配(这里与之匹配的通道数是以H32为基准),然后融合。

Representation Head输出表示头

有三种表示头,如图所示,分别称为HRNetV1、HRNetV2和HRNetV2p。
a,HRNetV1,最后输出只是高分辨率特征,语义信息一般,用于人体姿态估计。
b,HRNetV2,是通过沿通道方向拼接的方式特征融合的,最后也进行了跨分辨率融合,再输出高分辨率特征。语义信息较丰富,用于语义分割。
c, HRNetV2p,先进行融合后输出高分辨的特征,再进行下采样得到多个sacle的输出,语义信息较丰富,且具有多个不同的分辨率尺度,它没有进行多次的跨分辨率的特征融合,而是只进行一次融合,然后进行下采样得到multi-scale的结果。

代码初步理解

HRnet由最基本的三种块构成。

第一种是普通的3x3的卷积它的结构如下:

def conv3x3(in_planes, out_planes, stride=1):"""3x3 convolution with padding"""return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride,padding=1, bias=False)

第二种是BasicBlock,它的结构如下:

class BasicBlock(nn.Module):expansion = 1def __init__(self, inplanes, planes, stride=1, downsample=None):super(BasicBlock, self).__init__()self.conv1 = conv3x3(inplanes, planes, stride)self.bn1 = nn.BatchNorm2d(planes, momentum=BN_MOMENTUM)self.relu = nn.ReLU(inplace=True)self.conv2 = conv3x3(planes, planes)self.bn2 = nn.BatchNorm2d(planes, momentum=BN_MOMENTUM)self.downsample = downsampleself.stride = stridedef forward(self, x):residual = xout = self.conv1(x)out = self.bn1(out)out = self.relu(out)out = self.conv2(out)out = self.bn2(out)if self.downsample is not None:residual = self.downsample(x)out += residualout = self.relu(out)return out

第三种结构是三层的残差块,结构如下图。这个结构里面有一个参数叫做expansion的参数,这个参数用来控制卷积的输入输出通道数。

class Bottleneck(nn.Module):expansion = 4def __init__(self, inplanes, planes, stride=1, downsample=None):super(Bottleneck, self).__init__()self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False)self.bn1 = nn.BatchNorm2d(planes, momentum=BN_MOMENTUM)self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride,padding=1, bias=False)self.bn2 = nn.BatchNorm2d(planes, momentum=BN_MOMENTUM)self.conv3 = nn.Conv2d(planes, planes * self.expansion, kernel_size=1,bias=False)self.bn3 = nn.BatchNorm2d(planes * self.expansion,momentum=BN_MOMENTUM)self.relu = nn.ReLU(inplace=True)self.downsample = downsampleself.stride = stridedef forward(self, x):residual = xout = self.conv1(x)out = self.bn1(out)out = self.relu(out)out = self.conv2(out)out = self.bn2(out)out = self.relu(out)out = self.conv3(out)out = self.bn3(out)if self.downsample is not None:residual = self.downsample(x)out += residualout = self.relu(out)return out

总结

初步阅读,自我感觉HRNet是个不错的backbone,未来想应用于目标检测领域,但又怕其计算量较大,消耗显存。代码比较长,阅读起来难懂,难懂的我也没写下来,未来等攻克代码,会再来修改,想了解的建议阅读官方代码。

HRNet——个人学习记录相关推荐

  1. Pytorch学习记录-torchtext和Pytorch的实例( 使用神经网络训练Seq2Seq代码)

    Pytorch学习记录-torchtext和Pytorch的实例1 0. PyTorch Seq2Seq项目介绍 1. 使用神经网络训练Seq2Seq 1.1 简介,对论文中公式的解读 1.2 数据预 ...

  2. HTML5与CSS3权威指南之CSS3学习记录

    title: HTML5与CSS3权威指南之CSS3学习记录 toc: true date: 2018-10-14 00:06:09 学习资料--<HTML5与CSS3权威指南>(第3版) ...

  3. springboot @cacheable不起作用_Springboot学习记录13 使用缓存:整合redis

    本学习记录的代码,部分参考自gitee码云的如下工程.这个工程有详尽的Spingboot1.x教程.鸣谢! https://gitee.com/didispace/SpringBoot-Learnin ...

  4. 【Cmake】Cmake学习记录

    Cmake学习记录 1.1 常例 add_library(gen_reference_infogen_reference_info/gen_reference_info.hgen_reference_ ...

  5. ASP.NETCore学习记录(一)

    ASP.NETCore学习记录(一) asp.net core介绍  Startup.cs  ConfigureServices  Configure  0. ASP.NETCore 介绍 ASP.N ...

  6. Android开发技术周报176学习记录

    Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...

  7. add函数 pytorch_Pytorch学习记录-Pytorch可视化使用tensorboardX

    Pytorch学习记录-Pytorch可视化使用tensorboardX 在很早很早以前(至少一个半月),我做过几节关于tensorboard的学习记录. https://www.jianshu.co ...

  8. java之字符串学习记录

    java之字符串学习记录 public class StringDemo { public static void main(String[] args) { //静态初始化字符串 String s1 ...

  9. Redis的学习记录

    Redis的学习记录 1.先导了解 1.1 NOSQL概述 1.1.1 为什么要用NoSql? 1.1.2 NoSql了解 1.1.3 NoSql特点 1.1.4 NoSQL的四大分类 2. Redi ...

最新文章

  1. 小米宣布加入鸿蒙,中兴和OPPO抵制后,第一个宣布加入鸿蒙阵营的果然是魅族...
  2. UA MATH523A 实分析3 积分理论例题 Fubini定理计算简单二重积分的一个例题
  3. 设置、查看环境变量值
  4. Cs231n课堂内容记录-Lecture 5 卷积神经网络介绍
  5. 基线检查工具_最新版CAD燕秀工具箱2.87(支持20042021)
  6. Latex调整表格与标题表名之间的间距
  7. Application Request Route实现IIS Server Farms集群负载详解
  8. 保护我方小学生!腾讯游戏全面启用防沉迷规则,每月充值金额有上限
  9. 导航栏使用引导、下载资源支持试读、CSDN年终重磅福利来袭……
  10. hhvm mysql_Ubuntu 14.10 安装 Nginx + MySQL + HHVM + phpMyAdmin [LNMH]
  11. Python接口自动化测试实战系列02
  12. 母亲节第二期|有哪些母亲节祝福贺卡的素材灵感来源?
  13. Linux安全模块(LSM)
  14. 2022保密教育线上培训考试参考答案 05
  15. 一个美国人到中国当产品经理的心得:中国App设计真好!
  16. 沧州中考计算机考试时间,2017年沧州市中考考试科目及时间
  17. kotlin之开发经验整理
  18. 批量剔除consul无效服务
  19. 用python画写轮眼_创意scratch编程课:火影经典忍术,宇智波佐助的写轮眼!
  20. 总结VUE控制滚动滑动方法

热门文章

  1. python 批量替换srt文本_自动生成srt格式的脚本(Python实现)
  2. 划动浮空岛_划动浮空岛(LandSliders)隐藏关卡过关攻略
  3. 什么是Srt字幕,怎么添加srt字幕
  4. 现代轻奢——看一眼就心动
  5. Unity 双指旋转
  6. 腾讯云AMD云服务器使用体验?
  7. mysql 高并发写入锁表_使用mysql中的锁解决高并发问题
  8. BZOJ 4424: Cf19E Fairy【强行树链剖分
  9. pyqtgraph基础入门(二):使用pyqtgraph绘制折线图(同一坐标轴包含多条折线)
  10. java 类爆炸_设计模式系列·类爆炸之 Bridge 模式