留个笔记自用
An Efficient PointLSTM for Point Clouds Based Gesture Recognition
做什么
Gesture Recognition手势识别,常见的手势识别使用的是RGB视频
这里论文使用的是Shrec’17 track: 3d hand gesture recognition using a depth and skeletal dataset所提供的数据集,也就是手部手势识别
做了什么
这里将手势识别表述为一个不规则序列识别问题,相比于RGB数据,点云精确地描述了物体表面潜在的几何结构和距离信息。
上图的a情况是假象型,假设的是当前帧也就是第t帧的点云中每个点都能找到t-1帧的点云中的点与它对应,也就是下一帧时点云中点的变化轨迹都能对应,然后使用同样的点轨迹进行状态更新
然后就是b类型,连接当前点的特征和先前点的相邻状态,使用加权共享的LSTM来更新每个点对的状态,然后汇聚一下,这样的话就防止了两帧间点云没有对称的情况,t帧点可以找t-1帧的相邻点
上面两者图中的s就是坐标,f是特征,两个组成一个点的元素
怎么做
首先还是老样子,定义一个输入P
这里的P表示某一帧的点云,总共有T帧,整个P是一个点云序列,每个时刻的P有Pi(t)个即nt个点
然后这里假设的是可能出现第二种情况,也就是可能点云中的点不存在时间序列的对应关系(但也不排除对应可能)
每个点可以解释成两个部分,一个d维的坐标xi和一个m维的特征fi,N(xi)是这个点pi的邻域
常见的LSTM可以这么定义👆
接下来假设两种情况来对上式进行改变,第一种Point-independent states也就是点独立情况,第二种Point-shared states也就是点共享情况
首先是独立情况
这里点独立的意思是每个点pi均有它独立的隐藏状态hi和细胞状态ci。
对于每个点对(pi(t),pj(t-1)),这里的意思就是t帧的第i个点和t-1帧的第j个点,这里的j个点均是第i个点的邻域。之后就可以对其更新
首先,先将两个对应点的坐标作相对差,再和当前帧的特征concat起来作为当前对应的特征提取。使用LSTM对这个对应关系的h和c进行更新。最后再将i点的所有邻域中的对应关系通过一个g函数(max-pool层)聚合在一起。最终得到这个点pi(t)的h和c
然后是点共享情况
这里就是为了节约时间和资源,假设在第t帧中的所有点都共享一个隐藏状态h和细胞状态c
整体的公式和上面解释几乎相同,区别就是从对应关系改成了点,从点改成了帧,这里的g改成了avg-pool
定义完了更新方式,来回头看看怎么定义邻域
这里也假设了两种定义邻域的方式。第一种是Direct grouping,第二种是Aligned grouping
首先是Direct grouping,这种定义邻域方式就很简单了,根据p点在t帧的位置,在t-1帧使用knn来寻找邻域点
第二种是Aligned grouping,这里的意思是根据两帧中的 centroid point质心点的移动来进行其余点的对齐
简单来说就是计算t帧所有点的中心点和t-1帧所有点的中心点,计算这两个中心点的位移后就默认将t帧所有其余点的位移与中心点的位移方式相同
接下来就是整体模型结构的展现
整体结构有5个stage,第一个stage是用spatial grouping提取内部特征,第二个stage到第四个stage是用spatial-temporal grouping and density basedsampling提取内部特征。
这里的基于密度的采样的意思就是,对于点pi在位置xi,r是knn的半径大小,这里的意思就是计算x邻域的密度大小,根据小密度来进行点的sample选择
第五个stage是提取点状特征,然后再使用一个max-pooling得到全局特征。具体点说,这里的baseline使用的是FlickerNet
第一个stage的feature extrator和第二到第四个的feature extrator均是PointNet++中的类似结构。
PointLSTM可以直接嵌入现有的模型结构中,同时这里为了验证PointLSTM在不同stage中的效果,还设计了多款
首先是PointLSTM-raw,这里是将第一个内部特征的提取层直接换成PointLSTM
然后是PointLSTM-early, middle, and late,这里是将第二个stage到第四个stage的三个部分分别换成PointLSTM。最后也展示了各自的结果↓
总结
1.非常值得学习的一种做法,同样也算是一个即插即用的
2.感觉在点的对应上还有很大的上升空间,因为这种对应方式无法适应非常快速的运动