HRNet——个人学习记录
论文名称:
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——个人学习记录相关推荐
- Pytorch学习记录-torchtext和Pytorch的实例( 使用神经网络训练Seq2Seq代码)
Pytorch学习记录-torchtext和Pytorch的实例1 0. PyTorch Seq2Seq项目介绍 1. 使用神经网络训练Seq2Seq 1.1 简介,对论文中公式的解读 1.2 数据预 ...
- HTML5与CSS3权威指南之CSS3学习记录
title: HTML5与CSS3权威指南之CSS3学习记录 toc: true date: 2018-10-14 00:06:09 学习资料--<HTML5与CSS3权威指南>(第3版) ...
- springboot @cacheable不起作用_Springboot学习记录13 使用缓存:整合redis
本学习记录的代码,部分参考自gitee码云的如下工程.这个工程有详尽的Spingboot1.x教程.鸣谢! https://gitee.com/didispace/SpringBoot-Learnin ...
- 【Cmake】Cmake学习记录
Cmake学习记录 1.1 常例 add_library(gen_reference_infogen_reference_info/gen_reference_info.hgen_reference_ ...
- ASP.NETCore学习记录(一)
ASP.NETCore学习记录(一) asp.net core介绍 Startup.cs ConfigureServices Configure 0. ASP.NETCore 介绍 ASP.N ...
- Android开发技术周报176学习记录
Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...
- add函数 pytorch_Pytorch学习记录-Pytorch可视化使用tensorboardX
Pytorch学习记录-Pytorch可视化使用tensorboardX 在很早很早以前(至少一个半月),我做过几节关于tensorboard的学习记录. https://www.jianshu.co ...
- java之字符串学习记录
java之字符串学习记录 public class StringDemo { public static void main(String[] args) { //静态初始化字符串 String s1 ...
- Redis的学习记录
Redis的学习记录 1.先导了解 1.1 NOSQL概述 1.1.1 为什么要用NoSql? 1.1.2 NoSql了解 1.1.3 NoSql特点 1.1.4 NoSQL的四大分类 2. Redi ...
最新文章
- 小米宣布加入鸿蒙,中兴和OPPO抵制后,第一个宣布加入鸿蒙阵营的果然是魅族...
- UA MATH523A 实分析3 积分理论例题 Fubini定理计算简单二重积分的一个例题
- 设置、查看环境变量值
- Cs231n课堂内容记录-Lecture 5 卷积神经网络介绍
- 基线检查工具_最新版CAD燕秀工具箱2.87(支持20042021)
- Latex调整表格与标题表名之间的间距
- Application Request Route实现IIS Server Farms集群负载详解
- 保护我方小学生!腾讯游戏全面启用防沉迷规则,每月充值金额有上限
- 导航栏使用引导、下载资源支持试读、CSDN年终重磅福利来袭……
- hhvm mysql_Ubuntu 14.10 安装 Nginx + MySQL + HHVM + phpMyAdmin [LNMH]
- Python接口自动化测试实战系列02
- 母亲节第二期|有哪些母亲节祝福贺卡的素材灵感来源?
- Linux安全模块(LSM)
- 2022保密教育线上培训考试参考答案 05
- 一个美国人到中国当产品经理的心得:中国App设计真好!
- 沧州中考计算机考试时间,2017年沧州市中考考试科目及时间
- kotlin之开发经验整理
- 批量剔除consul无效服务
- 用python画写轮眼_创意scratch编程课:火影经典忍术,宇智波佐助的写轮眼!
- 总结VUE控制滚动滑动方法
热门文章
- python 批量替换srt文本_自动生成srt格式的脚本(Python实现)
- 划动浮空岛_划动浮空岛(LandSliders)隐藏关卡过关攻略
- 什么是Srt字幕,怎么添加srt字幕
- 现代轻奢——看一眼就心动
- Unity 双指旋转
- 腾讯云AMD云服务器使用体验?
- mysql 高并发写入锁表_使用mysql中的锁解决高并发问题
- BZOJ 4424: Cf19E Fairy【强行树链剖分
- pyqtgraph基础入门(二):使用pyqtgraph绘制折线图(同一坐标轴包含多条折线)
- java 类爆炸_设计模式系列·类爆炸之 Bridge 模式