返回列表

9th place solution

546. Google - Isolated Sign Language Recognition | asl-signs

开始: 2023-02-23 结束: 2023-05-01 音视频处理 数据算法赛

第9名解决方案

作者:slime, Tim Riggins

发布时间:2023-05-02 03:16:36

排名:第9名

票数:26票

感谢Google和Kaggle组织这场比赛,希望我们的解决方案能帮助开发PopSign产品,降低学习美国手语(ASL)的门槛。

在详细介绍前,我要祝贺队友@timriggins——通过这场比赛他成为了Kaggle竞赛特级大师!有趣的是,我们是在去年10月巴塞罗那Kaggle Days世界总决赛期间相识的,再次感谢HP和Kaggle Days提供的宝贵机会 :D

模型架构

我们使用了类似@hengck23分享的Transformer模型,主要改进如下:

  • 将Transformer层数从1层增加到2层(最终集成模型包含3个1层模型和1个2层模型)
  • 新增特征:
    • 嘴唇和眼睛的距离特征
    • 手部绝对坐标 abdcoords_r = (rhand - np.nanmean(rhand, 0))
    • 加速度特征 racc = np.pad(rh_dist[1:] - rh_dist[:-1], [[0,1], [0,0], [0,0]])

其中两个模型使用可学习的正弦位置编码,另外两个使用1D深度可分离卷积作为位置编码:

self.pe = nn.Conv1d(emb_dim, emb_dim, kernel_size=5, padding=2, stride=1, groups=emb_dim)
# x.shape (B, L, E)
x = self.pe(x.permute(0, 2, 1)).permute(0, 2, 1) + x

数据增强

我们验证了以下有效的增强方法:

  • 水平翻转
  • 随机降帧 xyz = xyz[::2]
  • 3D仿射变换(绕脊柱旋转)
  • 早期Mixup(关键点空间)和Manifold Mixup(嵌入空间)
  • 随机截取视频序列的首尾部分
  • 帧插值

Mixup是关键增强手段,使我们能够使用150个epoch的长时间训练配合余弦退火调度而不过拟合,所有模型均在最后一epoch收敛。

Pytorch转TFLite

我们使用了nobuco工具,它非常直观易用。

有趣的Bug

我在代码中意外引入了一个提升性能的Bug。在实现Mixup增强时,我在模型前向传播函数中错误使用了正态分布而非均匀分布:

if np.random.randn() < 0.5 and mode_flag == 'train':
    x, labels_ohe = self.mixup(x,labels_ohe)

后来发现这导致Mixup应用概率约为70%(基于正态分布PDF特性)。修正后性能反而下降,说明在此场景下更高概率的Mixup更优。

实验结果

  • 单模型在hengck验证集达到0.7316分
  • 4模型集成达到0.754分
  • CV/LB相关性完美,所有提升都同步反映在Public/Private榜
  • 单模型推理约30分钟,集成接近1小时(均在时间限制内完成)

未成功的尝试

  • 外部数据:WLASL预训练/添加WLASL到训练集/希腊手语预训练均无提升
  • 连续MLM/深度预测编码预训练:模型过浅难以受益
  • 1D-CNN架构(深度可分离卷积)
  • Arcface损失函数
  • 训练时过参数化(MobileOne论文中描述的方法)
同比赛其他方案