HRNet网络结构及TensorFlow实现

HRNet网络结构

HRNet是王井东老师团队提出的网络框架,据王老师介绍,HRNet将是继AlexNet、GoogleNet、VGGNet、ResNet、DenseNet之后,用于多种视觉任务的新颖的网络框架。目前已经在人体姿态估计、关键点检测、图像分割、物体识别、物体分类等任务上取得了出色的结果。
论文地址(HRNet V1):Deep High-Resolution Representation Learning for Human Pose Estimation
论文地址(HRNet V2):Deep High-Resolution Representation Learning for Visual Recognition
开源地址(Pytorch):https://github.com/HRNet
由于王老师团队使用Pytorch实现的,对于熟悉TensorFlow的同学了解起来比较吃力(虽然TensorFlow和Pytorch都应该掌握)。所以博主在查阅资料后收集了HRNet得到TensorFlow实现。
开源地址(TensorFlow):https://github.com/AI-Chen/HRNet-V2
由于TensorFlow是有其他人复现的,所以与官方版本存在一定的出入,因此建议结合论文阅读代码,部分可能存在问题的程序建议结合Pytorch确认。博主发现了TensorFlow版本存在的一个问题,将在后面提出。
在这篇博客中主要想介绍HRNet的网络结构。由于HRNet网络结构比较庞大,所以得静下心来认真阅读源代码才能真正的了解HRNet的网络结构。首先是HRNet论文中的网络结构
在这里插入图片描述

以下是博主通过自己的理解绘制的网络结构,不适之处希望指出。
HRNet网络结构
在网络结构中每一个conv之后都接了BN,而且在大部分conv之后都会使用Relu作为激活函数,由于篇幅原因,并没有在网络结构中体现。只有部分block(Basic Block, Bottleneck Block)是在求和之后接的Relu。
Block
在绘制的网络结构中Fusion Layer可能比较杂乱无章,因此给出论文中的Fusion 模块的示意图。
在这里插入图片描述
为了适用于不同的任务,网络针对于主干网络的输出提出了不同的处理方式,即不同的head。
在这里插入图片描述
(a)HRNet V1(用于姿态估计) (b)HRNet V2(用于语义分割) (c)HRNet V2p (用于目标检测)另外还有一种用于分类任务的处理方式
在这里插入图片描述
网络结构结合论文以及程序一起看能够起到事半功倍的效果。
虽然在在论文中王老师一直强调HRNet能够维持高分辨率表示,而不是像之前的网络框架那样从低分辨率中恢复高分辨。但是仔细阅读程序实现会发现,为了减少GPU内存的使用以及降低计算量,在网络之初,已经进行了两次下采样,而最后只是粗略的使用一次resize来恢复原始的分辨率。
另外在TensorFlow实现的程序中,个人感觉 utils\HighResolutionModule.py 中的_make_fuse_layers是有问题。

def _make_fuse_layers(self,x):
        if self.num_branches == 1:
            return x
        num_branches = self.num_branches
        num_inchannels = self.num_inchannels
        fuse_layers = []
        for i in range(num_branches if self.multi_scale_output else 1):
            temp_layer = []
            for j in range(num_branches):
                if j > i:
                    with tf.variable_scope(self.stage + '_fuse_layers' + str(i)+str(j)):
                        temp = block_Model.conv(x[j], 1, num_inchannels[i], 'conv_', stride=1)
                        temp = block_Model.batch_norm(temp, self._is_training)
                        temp = tf.image.resize_bilinear(temp, x[i].get_shape().as_list()[1:3])
                        temp_layer.append(temp)
                elif j == i:
                    temp_layer.append(x[j])
                else:
                    with tf.variable_scope(self.stage + '_fuse_layers' + str(i) + str(j)):
                        temp = block_Model.conv(x[j], 3, num_inchannels[i], 'conv_', stride=2)
                        temp = block_Model.batch_norm(temp, self._is_training)
                        temp_layer.append(temp)
            for k in range(len(temp_layer)):
                fuse = 0
                fuse = fuse + temp_layer[k]
            fuse_layers.append(fuse)
        return fuse_layers

当j<i时,只进行了一次下采样,事实上应该根据i-j来确定下采样的次数。根据论文及Pytorch的实现重写了该方法。

    def _make_fuse_layers(self,x):
        if self.num_branches == 1:
            return x
        num_branches = self.num_branches
        num_inchannels = self.num_inchannels
        fuse_layers = []
        for i in range(num_branches if self.multi_scale_output else 1):
            temp_layer = []
            for j in range(num_branches):
                if j > i:
                    with tf.variable_scope(self.stage + '_fuse_layers' +  '_' + str(j)+ '_' + str(i)):
                        temp = block_Model.conv(x[j], 1, num_inchannels[i], 'conv_', stride=1)
                        temp = block_Model.batch_norm(temp, self._is_training)
                        temp = tf.image.resize_bilinear(temp, x[i].get_shape().as_list()[1:3])
                        temp_layer.append(temp)
                elif j == i:
                    temp_layer.append(x[j])
                else:
                    temp = x[j]
                    for k in range(i - j):
                        if k == i - j - 1:
                            with tf.variable_scope(self.stage + '_fuse_layers' + '_' + str(j) +  '_' + str(i) + '_' + str(k)):
                                temp = block_Model.conv(temp, 3, num_inchannels[i], 'conv_', stride=2)
                                temp = block_Model.batch_norm(temp, self._is_training)
                        else:
                            with tf.variable_scope(self.stage + '_fuse_layers' + '_' + str(j) +  '_' + str(i) + '_' + str(k)):
                                temp = block_Model.conv(temp, 3, num_inchannels[i], 'conv_', stride=2)
                                temp = block_Model.batch_norm(temp, self._is_training)
                                temp = tf.nn.relu(temp)
                    temp_layer.append(temp)
            for k in range(len(temp_layer)):
                print("stage{}, branche{}, temp{} shape:{}".format(num_branches, i, k, temp_layer[k].get_shape().as_list()))
                fuse = 0
                fuse = fuse + temp_layer[k]
            print("stage{}, branche{} fused shape: {}".format(num_branches, i, fuse.get_shape().as_list()))
            fuse_layers.append(fuse)
        return fuse_layers

个人感觉HRNet中通过多分辨率信息交互,能够离开一些高级语义特征增强高分辨率特征的语义表示,而且它在空间上也会更加精确。最终促进许多对位置比较敏感的任务。
以上只是博主个人的一些理解,才疏学浅,不适之处,希望大家指正。

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
### 回答1: HRNet是一种高分辨率的网络结构,其目标是解决传统网络在处理高分辨率输入(例如图像)时的信息丢失问题。HRNet通过构建并行的多分辨率分支来实现这一目标。 为了更好地理解HRNet网络结构,我使用Visio软件绘制了一个示意图。该示意图包含了HRNet的主要组件和结构。 首先,HRNet有一个输入层,用于接收高分辨率的输入图像。该输入图像经过一系列的卷积层和池化层,提取出图像的低级特征。 接下来,HRNet引入了一个关键的模块,叫做High-Resolution Block,简称HRB。HRB由一个并行的多分辨率分支组成,包括高分辨率分支和低分辨率分支。这两个分支都有自己的卷积层和池化层。高分辨率分支重点关注提取高级特征,而低分辨率分支重点关注提取粗略的全局特征。 接着,HRNet将高分辨率分支和低分辨率分支的输出进行融合,形成新的特征表达。这种融合方式能够保留高分辨率分支的细节信息,同时结合低分辨率分支的全局感知能力。 最后,HRNet通过一系列的残差连接和卷积层对特征进行进一步处理,将特征映射到最终的分类或回归结果。 在Visio示意图中,我使用不同的形状和颜色来表示HRNet的不同组件和连接关系,以便更清晰地展示网络结构。 通过这个Visio示意图,我们可以更好地理解HRNet网络结构,并且细致地观察每个组件之间的连接和信息传递。这有助于我们更好地理解HRNet网络在处理高分辨率输入时的工作方式和优势。 ### 回答2: HRNet(High-Resolution Network)是一种高分辨率网络结构,在计算机视觉领域中被广泛应用于目标检测、姿态估计等任务。HRNet通过多级分支和深度监督的方式来处理特征图的多尺度信息,以实现更准确的目标识别和定位。 HRNet网络结构图可以使用Visio这样的绘图工具来展示。在Visio中,可以利用不同的形状和连接线来描述HRNet的结构,并标注各个部分的名称和参数。 HRNet的主要结构包括高分辨率级联的特征提取和信息融合模块。首先,输入图像经过一个基础的特征提取网络,如ResNet等,得到低分辨率的特征图。然后,通过多级分支的方式,将低分辨率特征图进行上采样,得到多个不同分辨率的特征图。每个分辨率的特征图都保留了不同尺度的信息。 接着,这些不同分辨率的特征图经过信息融合模块,进行特征的交互和融合。信息融合模块使用逐级融合的策略,将不同分辨率的特征图进行级联连接,以保留更丰富的多尺度信息。同时,为了防止信息传递过程中的信息丢失,HRNet还引入了深度监督机制,在不同分辨率的特征图中添加监督损失,以促进每个分辨率的特征图的学习和优化。 综上所述,HRNet网络结构图Visio可以展示出HRNet网络的整体架构和不同分支的层次关系,帮助我们更好地理解HRNet的特点和原理,进而在实践中应用该网络结构来解决计算机视觉任务。 ### 回答3: HRNet是一种高分辨率网络结构,它在计算机视觉领域被广泛应用于人体关键点检测等任务中。HRNet网络结构图是指HRNet网络的可视化表示,通过使用Visio等图形化工具,可以清晰地展示HRNet的网络层次结构和连接方式。 HRNet网络结构图通常包括输入层、基础网络、后续网络和输出层。输入层用来接收待处理的图像数据,通常是一张二维图像。基础网络是HRNet的核心部分,它由多个分辨率较低的子网络组成,每个子网络分别处理不同分辨率的特征图。这种特殊的设计使得HRNet可以同时保留高分辨率和丰富的语义信息。 后续网络是基于基础网络得到的特征图进行进一步的处理,常用的包括上采样、融合和卷积等操作。上采样操作可以将低分辨率的特征图进行放大,使其与高分辨率的特征图保持一致。融合操作可以将多个子网络的特征图进行融合,获得更全面的特征表达。卷积操作则用来提取特征的空间信息。 最后,输出层将处理得到的特征图映射到人体关键点的位置,并输出关键点的坐标信息。这个过程通常使用全连接层或者卷积层来实现,以实现特征图和关键点之间的转换。 总的来说,HRNet网络结构图通过可视化的方式展示了HRNet网络的层次结构和连接方式,帮助人们更加直观地了解HRNet的工作原理和特点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Timer-419

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值