IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> HRNet -> 正文阅读

[人工智能]HRNet

HRNet

人体关键点检测

论文:Deep High-Resolution Representation Learning for Hunman Pose Estimation

图1 人体关键点检测示意图 (左)原图 (右)关键点检测图

HRNet 是一个 2D 的检测方案,并非是一个 3D 的检测方案。它是一个单一个体姿态评估,每次只能识别一个人的姿势。所以需要一个特定的目标检测网络,先将每个人的位置信息得到,之后再逐个输入。

0 0 0nose 1 1 1left_eye 2 2 2right_eye 3 3 3left_ear 4 4 4right_ear 5 5 5left_shoulder 6 6 6right_shoulder 7 7 7left_elbow 8 8 8right_elbow 9 9 9left_wrist 10 10 10right_wrist 11 11 11left_hip 12 12 12right_hip 13 13 13left_knee 14 14 14right_knee 15 15 15left_ankle 16 16 16right_ankle
——COCO数据集针对人体检测的标点。

对于 Human Pose Estimation 任务,现在基于深度学习的方法主要有两种:

  • 基于 regressing 的方式,即直接预测每个关键点的位置坐标。
  • 基于 heatmap 的方式,即针对每个关键点预测一张热力图(预测出现在每个位置上的分数)。

HRNet 就是基于 heatmap 的一种方式。

目录

  1. HRNet 网络结构

  2. 预测结果(heatmap)可视化

  3. 损失的计算

  4. 评价准则

  5. 其他

    5.1 数据增强
    5.2 注意输入图片比例

项目结构

图2 HRNet-w32 的模型结构简图

如图 2 2 2 ,是我寻找到的关于 HRNet-w32 的模型结构简图,在论文中除了提出 HRNet-w32 外还有一个 HRNet-w48 的版本,两者区别仅仅在每个模块所采用的通道个数不同,网络的整体结构都是一样的。而该论文的核心思想就是不断地去融合不同尺度上的信息,也就是论文中所说的 Exchange Blocks 。

通过图 2 2 2 可以看出, HRNet 首先通过两个卷积核大小为 3 × 3 3\times3 3×3 步距为 2 2 2 的卷积层(后面都跟有 BN 以及ReLU )共下采样缩小图片)了 4 4 4 倍。然后通过 Layer1 模块,这里的 Layer1 其实和之前讲的 ResNet 中的 Layer1 类似,就是重复堆叠 Bottleneck ,注意这里的 Layer1 只会调整通道个数,并不会改变特征层大小。下面是实现 Layer1 时所使用的代码。

# Stage1
downsample = nn.Sequential(
    nn.Conv2d(64, 256, kernel_size=1, stride=1, bias=False),
    nn.BatchNorm2d(256, momentum=BN_MOMENTUM)
    # 使用 Batch Normalization
)
self.layer1 = nn.Sequential(
    Bottleneck(64, 64, downsample=downsample),
    Bottleneck(256, 64),
    Bottleneck(256, 64),
    Bottleneck(256, 64)
    # 重复堆叠
)

接着通过一系列 Transition 结构以及 Stage 结构,每通过一个 Transition 结构都会新增一个尺度分支。比如说 Transition1 ,它在 layer1 的输出基础上通过并行两个卷积核大小为 3 × 3 3\times3 3×3 的卷积层得到两个不同的尺度分支,即下采样4倍的尺度以及下采样8倍的尺度。在 Transition2 中在原来的两个尺度分支基础上再新加一个下采样16倍的尺度,注意这里是直接在下采样8倍的尺度基础上通过一个卷积核大小为 3 x 3 3x3 3x3 步距为 2 2 2 的卷积层得到下采样16倍的尺度。如若读过原论文肯定会有些疑惑,因为在论文的图 1 1 1 中,给出的 Transition2 应该是通过融合不同尺度的特征层得到的(下图用红色矩形框框出的部分)。但根据源码的实现过程确实就和我上面图中画的一样,就一个 3 × 3 3\times3 3×3 的卷积层没做不同尺度的融合,包括看其他代码仓库实现的 HRNet 都是如此。可以看源码对比一下。

图3 不同尺度的特征结构

介绍完 Transition 结构后,接着描述网络中最重要的 Stage 结构。为了方便理解,这里以 Stage3 为例,对于每个尺度分支,首先通过4个 Basic Block ,没错就是 ResNet 里的 Basic Block ,然后融合不同尺度上的信息。对于每个尺度分支上的输出都是由所有分支上的输出进行融合得到的。比如说对于下采样4倍分支的输出,它是分别将下采样4倍分支的输出(不做任何处理) 、 下采样 8 倍分支的输出通过 U p × 2 Up\times2 Up×2 上采样2倍 以及下采样16倍分支的输出通过 U p × 4 Up\times4 Up×4 上采样 4 倍进行相加最后通过 ReLU 得到下采样 4 4 4 倍分支的融合输出。其他分支也是类似的,下图描述已经非常清楚了。图中右上角的 × 4 \times4 ×4 表示该模块(Basic Block和Exchange Block)要重复堆叠 4 次。

在这里插入图片描述

图4 Stage3 结构

接着再来阐述图中的 Up 和 Down 究竟是怎么实现的,对于所有的 Up 模块就是通过一个卷积核大小为 1 × 1 1\times1 1×1 的卷积层然后 BN 层最后通过 Upsample 直接放大 n 倍得到上采样后的结果(这里的上采样默认采用的是 nearest 最邻近插值)。 Down 模块相比于 Up 稍微麻烦点,每下采样 2 倍都要增加一个卷积核大小为 3 × 3 3\times3 3×3 步距为 2 的卷积层(注意下图中 Conv 和 Conv2d 的区别,Conv2d 就是普通的卷积层,而 Conv 包含了卷积、BN 以及 ReLU 激活函数)。

在这里插入图片描述

图5 up and down 操作

最后,需要注意的是在 Stage4 中的最后一个 Exchange Block 只输出下采样 4 倍分支的输出(即只保留分辨率最高的特征层),然后接上一个卷积核大小为 1 × 1 1\times1 1×1卷积核个数为 17 (因为 COCO 数据集中对每个人标注了 17 个关键点)的卷积层。最终得到的特征层( 64 × 48 × 17 64\times48\times17 64×48×17 )就是针对每个关键点的 heatmap (热力图)。

预测结果(heatmap)可视化

关于预测得到的 heatmap (热力图),为了方便理解,画了下面这幅图。首先,左边是输入网络的预测图片,大小为 256 × 192 256\times192 256×192,为了保证原图像比例,在两侧进行了 padding 。右侧是我从预测结果,也就是heatmap( 64 × 48 × 17 64\times48\times17 64×48×17 )中提取出的部分关键点对应的预测信息( 48 × 17 × 1 48\times17\times1 48×17×1 )。上面有提到过,网络最终输出的 heatmap 分辨率是原图的 1 / 4 1/4 1/4 ,所以高宽分别对应的是 64 和 48 ,接着对每个关键点对应的预测信息求最大值的位置,即预测 score 最大的位置,作为预测关键点的位置,映射回原图就能得到原图上关键点的坐标(下图有画出每个预测关键点对应原图的位置)。

图6 heatpmap 演示图

在原论文中,对于每个关键点并不是直接取 score 最大的位置(如果为了方便直接取其实也没太大影响)。在原论文的 4.1 章节中有提到:

Each keypoint location is predicted by adjusting the highest heatvalue location with a quarter offset in the direction from the highest response to the second highest response.

for n in range(coords.shape[0]):
    for p in range(coords.shape[1]):
        hm = batch_heatmaps[n][p]
        px = int(math.floor(coords[n][p][0] + 0.5))
        py = int(math.floor(coords[n][p][1] + 0.5))
        if 1 < px < heatmap_width-1 and 1 < py < heatmap_height-1:
            diff = np.array(
                [
                    hm[py][px+1] - hm[py][px-1],
                    hm[py+1][px]-hm[py-1][px]
                ]
            )
            coords[n][p] += np.sign(diff) * .25

如果看不懂的话可以借鉴下图。假设对于某一关键点的预测 heatmap 如下所示,根据寻找最大 score 可以找到坐标 ( 3 , 3 ) (3, 3) (3,3) 点,接着分别对比该点左右两侧( x x x 方向),上下两侧( y y y 方向)的 score 。比如说先看左右两侧,明显右侧的 score 比左侧的大(蓝色越深代表 score 越大),所以最终预测的 x x x 坐标向右侧偏移 0.25 0.25 0.25 故最终 x = 3.25 x=3.25 x=3.25 ,同理上侧的 score 比下侧大,所以 y y y 坐标向上偏移 0.25 0.25 0.25 故最终 y = 2.75 y=2.75 y=2.75

图7 坐标偏移图

损失的计算

在论文第 3 3 3 章 Heatmap estimation 中作者说训练采用的损失就是均方误差 Mean Squared Error。

The loss function, defined as the mean squared error, is applied for comparing the predicted heatmaps and the groundtruth heatmaps. The groundtruth heatmpas are generated by applying 2D Gaussian with standard deviation of 1 pixel centered on the grouptruth location of each keypoint.

通过前面讲的内容我们知道网络预测的最终结果是针对每个关键点的 heatmap ,那训练时对应的 GT 又是什么呢。根据标注信息我们是可以得知每个关键点的坐标的(原图尺度),接着将坐标都除以 4 (缩放到 heatmap 尺度)在进行四舍五入。针对每个关键点,我们先生成一张值全为 0 的 heatmap ,然后将对应关键点坐标处填充 1 就得到下面左侧的图片。如果直接拿左侧的 heatmap 作为 GT 去训练网络的话,你会发现网络很难收敛(可以理解为针对每个关键点只有一个点为正样本,其他 64 × 48 ? 1 64\times48-1 64×48?1 个点都是负样本,正负样本极度不均),为了解决这个问题一般会以关键点坐标为中心应用一个 2D 的高斯分布(没有做标准化处理)得到如右图所示的 GT(随手画的不必深究)。利用这个 GT heatmap 配合网络预测的 heatmap 就能计算 MSE 损失了。

下面这幅图是某张真实训练样本(左侧)对应 nose 关键点的GT heatmap(右侧)。

图8 真实训练样本对应的 heatmap

我们知道如何计算每个关键点对应的损失后还需要留意一个小细节。代码中在计算总损失时,并不是直接把每个关键点的损失进行相加,而是在相加前对于每个点的损失分别乘上不同的权重。下面给出了每个关键点的名称以及所对应的权重。

"kps": ["nose", "left_eye", "right_eye", "left_ear", "right_ear", "left_shoulder", "right_shoulder","left_elbow","right_elbow","left_wrist","right_wrist","left_hip","right_hip","left_knee","right_knee","left_ankle","right_ankle"]
"kps_weights": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.2, 1.2, 1.5, 1.5, 1.0, 1.0, 1.2, 1.2, 1.5, 1.5]

评价准则

在目标检测( Object Detection )任务中可以通过 IoU(Intersection over Union)作为预测 bbox 和真实 bbox 之间的重合程度或相似程度。在关键点检测(Keypoint Detection)任务中一般用 OKS( Object Keypoint Similarity )来表示预测 keypoints 与真实 keypoints 的相似程度,其值域在 0 到 1 之间,越靠近 1 表示相似度越高。在 MS COCO 官网中有详细介绍 OKS 指标,详情参考: https://cocodataset.org/#keypoints-eval
O K S = ∑ i [ e ? d i 2 / 2 s 2 k i 2 ? δ ( v i > 0 ) ] ∑ i [ δ ( v i > 0 ) ] O K S=\frac{\sum_{i}\left[e^{-d_{i}^{2} / 2 s^{2} k_{i}^{2}} \cdot \delta\left(v_{i}>0\right)\right]}{\sum_{i}\left[\delta\left(v_{i}>0\right)\right]} OKS=i?[δ(vi?>0)]i?[e?di2?/2s2ki2??δ(vi?>0)]?
其中:

  • i i i 代表第 i i i 个关键点。
  • v i v_{i} vi? 代表第 i i i 个关键点的可见性,这里的 v i v_{i} vi? 是由 G T GT GT 提供的。 v i = 0 v_{i}=0 vi?=0 表示该点一般是在图像外无法标注, v i = 1 v_{i}=1 vi?=1 表示虽然该点不可见但大概能猜测出位置(比如人侧着站时虽然有一只耳朵被挡住了,但大概也能猜出位置), v i = 2 v_{i}=2 vi?=2 表示该点可见。
  • σ ( x ) \sigma (x) σ(x) x x xTrue 时值为 1 1 1 x x xFalse 时值为 0 0 0。通过上面公式可知, OKS 只计算 G T GT GT 中标注出的点,即 v i > 0 v_{i}>0 vi?>0
  • d i d_{i} di?为第 i i i 个预测关键点与对应 G T GT GT 之间的欧氏距离。
  • s s s 为目标面积的平方根,原话:scale s which we define as the square root of the object segment area,这里的面积应该指的是分割面积。该数据在 COCO 数据集标注信息中都是有提供的。
  • k i k_{i} ki? 是用来控制关键点类别 i i i 的衰减常数,原话:κi is a per-keypont constant that controls falloff,这个常数是在验证集( 5000 张)上统计得到的,具体如何计算 k i k_{i} ki? 参考官网中1.3. Tuning OKS的介绍。

其他

数据增强

在论文中作者采用的数据增强有:随机旋转(在 ? 4 5 ° -45^{\circ} ?45° 4 5 ° 45^{\circ} 45° 之间),随机缩放(在 0.65 0.65 0.65 1.35 1.35 1.35 之间),随机水平翻转以及 half body(有一定概率会对目标进行裁剪,只保留半身关键点,上半身或者下半身)。在源码中,作者主要是通过仿射变换来实现的以上操作,如果对仿射变换不太了解看代码会比较吃力。

注意输入图片比例

假设对于输入网络图片固定尺寸是 256 × 192 256\times192 256×192 (height : width = 4 : 3),但要预测的人体目标的高宽比不是4 : 3,此时千万不要直接简单粗暴的拉伸到 256 × 192 256\times192 256×192 ,正确的方法是保持目标原比例缩放到对应尺度然后再进行相应的 padding (如下图中间所示,由于目标的 height : width > 4 : 3,所以保持原比例将 height 缩放到 256,然后在图片 width 两测进行 padding 得到 256 × 192 256\times192 256×192 )。如果拥有原始图像的上下文信息的话可以直接在原图中固定 height(目标 height : width > 4 : 3 的情况)然后调整 width 保证 height : width = 4 : 3,再重新裁剪目标并缩放到 256 × 192 256\times192 256×192 (如下图右侧所示)。这样预测的结果才是准确的。如果直接简单粗暴的拉伸目标,准确率会明显下降。因为作者源码中训练网络时始终保证目标的比例不变,那么我们在预测时也要保证相同的处理方式,即保证目标比例不变。前人在 COCO2017 val 数据上对齐论文精度时,就是由于没有注意这个细节,导致精度差了十几个点。
标并缩放到 256 × 192 256\times192 256×192 (如下图右侧所示)。这样预测的结果才是准确的。如果直接简单粗暴的拉伸目标,准确率会明显下降。因为作者源码中训练网络时始终保证目标的比例不变,那么我们在预测时也要保证相同的处理方式,即保证目标比例不变。前人在 COCO2017 val 数据上对齐论文精度时,就是由于没有注意这个细节,导致精度差了十几个点。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 18:51:13  更:2022-07-20 18:55:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 8:38:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计