《Cascaded Pyramid Network for Multi-Person Pose Estimation》--旷世2017COCO keypoints冠军论文解读

本文介绍了一种名为CPN的串接金字塔网络模型,该模型在2017年COCO关键点挑战赛中获得冠军。CPN由GlobalNet和RefineNet组成,能够兼顾局部和全局信息,有效解决多人姿态估计中的遮挡问题。

简介

Cascaded Pyramid Network for Multi-Person Pose Estimation》,这是Face++旷世科技2017年取得COCO Keypoints Challenge冠军的文章,主要目的是解决 in the wild 场景下多人的姿态估计,即关键点回归。
这里对这篇文章做一个简单的总结,如有理解不对的地方,欢迎指正!!
文章的主要贡献是:重点内容
1  提出了一种金字塔型的串接模型,即CPN(cascaded pyramid network),这个模型能够同时兼顾人体关节点的局部信息以及全局信息,结果取得了不错的效果;

2   使用了在线难例挖掘(online hard keypoints mining)的技术,这对于人体姿态估计任务中一些存在遮挡的“hard”的关键点的预测有所帮助;

3   测试阶段考量了soft-NMS和传统的hard-NMS(非极大值抑制)在human detection阶段产生的影响,结论是soft-NMS对于最后的结果是有所帮助的。

方法

pipeline

首先,整体的方法仍然是一个传统的top-down的pipeline,即现在图片中检测到人体,再做一个单人的human pose estimation。

pipeline

motivation

下面这张图阐述了作者的网络设计思路,即一些比较容易识别出来的人体关键点,直接利用一个CNN模型就可以回归得到;而对于一些遮挡比较严重的关节点,则需要增大局部区域感受野以及结合上下文信息才能够进一步refine得到。

motivation

网络结构

Figure1给出的就是作者提出的CPN模型网络结构。
可以看到,整个模型由两部分构成,GlobalNet和RefineNet。
GlobalNet的作用就是简单的前向CNN组成的回归模型,目的是回归得到一些易于识别的人体关键点位置,这里作者是使用的ResNet的网络架构回归heatmap。
RefineNet的目的则是利用GlobalNet产生的金字塔模型的特征图,融合多个感受野信息,最后concatenate所有的同一尺寸特征图进一步回归一些有歧义的关键点位置。注意,这里作者使用的是concatenate的策略,而并不是像Stacked Hourglass Networks那样的简单的upsampling。


CPN网路结构

实验

针对上面所提到的三个贡献,作者通过下面几个实验进行了证明:
首先针对human detection阶段NMS的策略,结论毫无疑问的是Soft-NMS(关于soft-NMS,这是目标检测领域提出来的一个策略,具体可以参考原文)更好,下面的表是几个不同阈值的NMS和Soft-NMS的结果比较。

NMS




对于在线难例挖掘策略的使用,主要体现在RefineNet究竟需要对多少个关键点进行Refine,根据COCO keypoints人体标注的关键点数量(17个)作者做了下面的一个实验:

在线难例挖掘1

可以看到,对于“Hard”的关键点的定义,在M=8的时候是比较好的,这可以理解为当M增大时一些之前GlobalNet已经预测得到非常好的关键点反而被RefineNet加上了人工干扰。

接下来,对于两个子网络的训练,是否使用在线难例挖掘,作者也做了实验:

在线难例挖掘2

可以看到当RefineNet加上在线难例挖掘之后取得的效果是最好的,这也证明了这个措施的有效性,至于为什么最后两行GlobalNet加上在线难例挖掘之后结果反而下降了,大概是这个阶段的网络效果受限于感受野尺寸,即预测不准的点loss加大惩罚之后还是预测不准,也就没有什么用处了。


最后,当然就是这个方法在COCO关键点挑战赛上面的表现了:

结果

72.1的准确率,比第二名高了0.7个点。

总的说来,这篇文章的设计思路是比较巧妙的,用人体关键点中存在的一些遮挡严重的情况作为切入点,设计了拥有两个子网络构成的CPN模型,这对于其他的一些CV任务也有一定的参考意义。
CVANet(Cascaded Visual Attention Network)是一种专门设计用于单幅图像超分辨率(Single Image Super-Resolution, SISR)任务的深度学习模型。该网络通过引入级联的视觉注意力机制,旨在提高图像重建的质量,尤其是在恢复图像的高频细节方面。以下是对该网络的原理和实现的详细解释。 ### 网络结构 CVANet的核心思想是通过级联的注意力模块逐步增强图像的细节。整个网络结构可以分为以下几个主要部分: 1. **特征提取模块**:首先,输入的低分辨率图像通过一个浅层的卷积层提取初始特征。这一步骤旨在捕捉图像的基本特征,如边缘和纹理。 2. **级联注意力模块**:CVANet的关键部分是其级联的视觉注意力模块。每个注意力模块由两个子模块组成: - **通道注意力模块**:该模块通过全局平均池化(Global Average Pooling, GAP)将特征图的空间信息压缩为通道特征,然后通过全连接层生成通道权重。这些权重用于强调重要的通道特征,抑制不重要的通道特征。 - **空间注意力模块**:该模块通过卷积操作生成空间权重,用于强调重要的空间区域,抑制不重要的空间区域。 3. **多尺度融合模块**:在每个注意力模块之后,CVANet使用多尺度融合策略,将不同尺度的特征进行融合,以进一步增强图像的细节。 4. **重建模块**:最后,经过多级注意力模块处理后的特征被输入到重建模块,生成高分辨率图像。重建模块通常由多个卷积层和亚像素卷积层组成,用于将特征图转换为高分辨率图像。 ### 实现细节 在实现CVANet时,通常会使用PyTorch或TensorFlow等深度学习框架。以下是一个简单的PyTorch代码示例,展示了如何实现CVANet的基本结构: ```python import torch import torch.nn as nn class ChannelAttention(nn.Module): def __init__(self, in_channels, reduction_ratio=16): super(ChannelAttention, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.fc = nn.Sequential( nn.Linear(in_channels, in_channels // reduction_ratio), nn.ReLU(), nn.Linear(in_channels // reduction_ratio, in_channels) ) def forward(self, x): b, c, _, _ = x.size() y = self.avg_pool(x).view(b, c) y = self.fc(y).view(b, c, 1, 1) return x * torch.sigmoid(y) class SpatialAttention(nn.Module): def __init__(self, kernel_size=7): super(SpatialAttention, self).__init__() self.conv = nn.Conv2d(2, 1, kernel_size, padding=kernel_size//2) def forward(self, x): avg_out = torch.mean(x, dim=1, keepdim=True) max_out, _ = torch.max(x, dim=1, keepdim=True) x = torch.cat([avg_out, max_out], dim=1) x = self.conv(x) return x * torch.sigmoid(x) class CascadedVisualAttentionBlock(nn.Module): def __init__(self, in_channels): super(CascadedVisualAttentionBlock, self).__init__() self.channel_attention = ChannelAttention(in_channels) self.spatial_attention = SpatialAttention() def forward(self, x): x = self.channel_attention(x) x = self.spatial_attention(x) return x class CVANet(nn.Module): def __init__(self, upscale_factor=2): super(CVANet, self).__init__() self.feature_extractor = nn.Conv2d(3, 64, kernel_size=3, padding=1) self.attention_blocks = nn.Sequential( CascadedVisualAttentionBlock(64), CascadedVisualAttentionBlock(64), CascadedVisualAttentionBlock(64) ) self.reconstruction = nn.Sequential( nn.Conv2d(64, 64 * upscale_factor**2, kernel_size=3, padding=1), nn.PixelShuffle(upscale_factor), nn.Conv2d(64, 3, kernel_size=3, padding=1) ) def forward(self, x): x = self.feature_extractor(x) x = self.attention_blocks(x) x = self.reconstruction(x) return x ``` ### 总结 CVANet通过级联的视觉注意力模块,能够有效地增强图像的细节,特别是在恢复高频信息方面表现出色。这种设计使得网络能够在不同层次上关注重要的特征,从而提高图像超分辨率的质量。
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值