GaitSet学习笔记(不包括三元数损失,仅含主干网络)

本文介绍了一种新的步态分析方法,通过将步态序列视为有序集合而非压缩图,提出端到端网络,避免了时序信息丢失和外部条件影响。网络结构包括主干卷积网络、集合池化、水平金字塔映射和多层全局管道,提高了特征提取速度和模型鲁棒性。

论文

1 Introduction

1.1 旧方法

​ ① 将步态轮廓压缩为一张图(损失了时序信息与细粒度系信息)

​ ② 直接从原始步态轮廓序列中提取特征(极易受到外部条件影响)

image-20220209154551228

1.2 我们提出的方法

​ 步态序列可以看做一个周期,而特定帧有其特定的步态形态,人类很容易可以复原打乱的步态序列的顺序。因此,顺序信息不必需提供给网络,而将步态序列帧看做一个个具有位置信息的帧组成的集合,网络可以通过学习得到序列的时序信息。

image-20220209163759154

​ 基于步态具有位置信息的假设,我们提出了一个端到端的网络,并且具有以下的三大优点:

​ ① 灵活:输入不受到约束

​ ② 快速:直接对二维剪影序列进行特征提取,减少计算(相比于机器学习方法)

​ ③ 高效:缓解协变量影响,提高鲁棒性与泛化能力

image-20220209162309344

2 Related Work

​ 受到PointNet(处理点云信息)的启发,采用了无序集作为网路输入数据。点云模型是三维图形的一种表示模型,点云具有顺序无关性。PointNet利用无序集可以避免量化带来的噪声和数据扩展,并获得高性能。

image-20220209165029696

3 GaitSet

3.1 主干网络简介

​ F:通过卷积层,得到序列的帧级别特征

​ G:通过集合池化(Set Pooling),将帧级别特征映射到集合级别特征

​ H:通过水平金字塔映射,学习集合级别特征的判别性表示

image-20220209170923224

image-20220209191537282

3.2 集合池化(Set Pooling)

​ 作用:集合元素的步态信息,将帧级别特征映射为集合级别特征

​ 两个限制:

​ ① 必须是排列不变函数

​ ② 接受任何数量的集合输入

​ SP的几个实例:

​ ① Statistical Functions:为了满足排列不变,可以引入max,mean和median这类统计函数

​ ② Joint Functions:上述统计函数的两种连接方式

image-20220209174810359

​ ③ Attention:利用全局信息为每个帧级特征学习一个元素级的注意映射,并对其进行细化

image-20220209180742069

3.3 水平金字塔映射(Horizontal Pyramid Mapping)

image-20220209183018802

image-20220210150701061

​ ① 通过划分水平条的方式来获得多尺度的特征,该算法通常划分为S个尺度,由集合池化提取后的特征图在高度尺寸上被分成2^(k-1)条

​ ② 不同的水平条在不同的尺度上描述着不同的感受野,同时在每个尺度上描述不同空间位置的运动特征

​ ③ 结合使用平均与最大池化策略对不同尺度的空间条信息进行提取:平均池化可以感知空间条的全局信息最大池化可以提取最具判别性的信息,结合两种池化得到的融合特征将具有更强的判别能力

​ ④ 通过独立权重的全连接层将特征映射到更具判别力的空间,从而获得步态特征的判别性表示

⑤ MGP模块和主网络模块分别经过HPP操作,宽度和高度这两个维度被压缩成1,2,4,8,16这样的1个维度

3.4 多层全局管道(MGP)

MGP

​ 众所周知,浅层的网络学习局部信息以及细粒度信息,深层网络学习全局信息以及粗粒度信息。MGP的提出正是为了收集不同层次网络的集合级别特征信息

​ 注意,MGP后的HPM与主干网后的HPM不共享参数。

代码

1 主干网卷积网

image-20220210144357377

# 基本卷积核
class BasicConv2d(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size, **kwargs):
        super(BasicConv2d, self).__init__()
        self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, bias=False, **kwargs)

    def forward(self, x):
        x = self.conv(x)
        return F.leaky_relu(x, inplace=True)

# 卷积核 + 池化层
class SetBlock(nn.Module):
    def __init__(self, forward_block, pooling=False):
        super(SetBlock, self).__init__()
        self.f
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值