返回列表

8th place solution ... close but no cigar

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

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

第8名解决方案……功亏一篑

作者: Darragh

排名: 第8名

发布时间: 2023年5月2日

以下是第8名解决方案的简要概述。

3个Transformer模型,每层2层(384隐藏单元,512隐藏单元FFN),带有一个FFN编码器(512->384),从头开始训练。学习率8e-4,使用余弦调度,训练约300个epoch,dropout 0.1,batch size 1024,label smoothing 0.1。使用手部、嘴唇和姿态(仅腰部以上)。在一个Transformer模型中,使用了全部姿态和部分嘴唇数据以增加多样性。

数据增强

  • 最重要的是序列切出(sequence cutout)。对每个样本和每个身体部位(左手、右手、嘴唇、姿态)以0.4的概率将5个随机切片(每个切片长度为序列长度的0.15倍)转换为NaN。这样做很难过拟合。
  • 镜像翻转
  • 随机旋转

预处理

  • 对较长的序列进行线性插值,最大长度设为96。
  • 对每个身体部位进行最小-最大归一化——我发现这比均值/标准差归一化效果更好。在其中一个模型中,我使用均值/标准差归一化以增加多样性。
  • 在部分关键点创建时间偏移差值特征,使用的时间偏移为[1, 2, 3, 4, 6, 8, 12, 16]。重要的是使用前向填充NaN值,而不是用0填充。
  • 在几个不同关节(嘴角、手、手臂)上计算xyz位置和xy位置之间的角度特征。
  • 一些点对之间的距离特征,有趣的是这并没有带来太大帮助。

Tflite
训练全部在PyTorch中进行。转换为TFLite时,特征预处理用TensorFlow重写,基础模型通过ONNX转换为TF(从第2名解决方案来看,这是一个错误,我应该重写Transformer编码器)。这是一个学习TensorFlow的绝佳机会。我喜欢它。
一个有趣的事情……在转换为ONNX之前,对PyTorch模型执行model = model.half().float()操作,最终在TFLite推理中获得了很好的加速。我尝试量化PyTorch模型,但并没有进一步提升速度。

在最后一周,我发现在预处理中,对整个序列按通道进行归一化带来了很好的提升。具体来说,我尝试对每个身体部位获取通道方向的范围(最大值-最小值),然后计算所有帧的平均范围,并用此来归一化时间差值和原始坐标——而不是独立归一化每一帧。每次我提交这个版本,大约25分钟后都会得到一个非常低的分数。我多次用不同方式重写,在Kaggle kernels中配合TFLite工作正常,但提交后就不行。最后这非常令人沮丧。然而,我认为这个提升也不足以让我进入获奖范围,而这才是目标🤑

失败的尝试

  • Mixup是有效的(第9名团队也提到有效),我尝试在嵌入层上使用,效果还可以。关于Mixup请参见下方的评论。
  • 使用Mixup的CNN——尝试了EfficientNet和EdgeNext。我尝试在原始点上使用,但没有效果,看起来是第2名解决方案中归一化方式有误。使用FFN编码器时效果很好,但推理速度太慢。看起来我错过了将其重写为TF版本,或在TF中训练。
同比赛其他方案