返回列表

11th place solution with code

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

开始: 2023-02-23 结束: 2023-05-01 音视频处理 数据算法赛
第11名解决方案及代码

第11名解决方案及代码

作者:Camaro(Kaggle Grandmaster)
发布时间:2023年5月3日

感谢组织者和Kaggle举办这个有趣的挑战赛。
我特别喜欢严格的推理时间限制,这使得模型大小保持合理,并要求我们使用一些实用技巧。

TL;DR

概述

我从@hengck23精彩讨论notebook开始。再次感谢分享了许多有用的技巧!

我做的更改如下:

  • 将模型架构更改为HuggingFace中的CLIP transformer
  • 减小参数规模,在保持相同精度的前提下最大化延迟
  • 一些强数据增强:
    • 水平翻转(p=0.5)
    • 随机3D旋转(p=1, -45~45度)
    • 随机缩放(p=1, 0.5~1.5)
    • 随机平移(p=1, 0.7~1.3)
    • 随机遮罩帧(p=1, 遮罩比例=0.5)
    • 随机调整大小(p=1, 0.5~1.5)
  • 添加运动特征:
    • 当前帧 - 前一帧
    • 下一帧 - 当前帧
    • 速度
  • 更长的训练轮数:5折时为250轮,使用全部数据时为300轮

详细信息请参考代码。(计划上传)

模型转换

我太懒了,不想在TensorFlow数据集中实现数据增强,所以我继续使用PyTorch训练流程。但我发现,通过onnx_tf转换的模型推理速度比纯TensorFlow模型慢得多。然后我尝试了一些模型转换框架,如nobuco,但由于某些原因出现了太多错误。最后,我决定在PyTorch和TensorFlow中都编写模型架构,然后手动移植权重。幸运的是,HuggingFace同时提供了PyTorch和TensorFlow的CLIP实现,这项工作比我想象的要容易。这显著加快了推理速度,我可以在集成时放入更多模型。

集成

我尝试在相同的精度范围内尽可能多样化模型。

种子 层数 维度 激活函数 最大长度 特征
0 2 384 relu 64 嘴唇/手部
1 3 256 relu 48 嘴唇/手部/眼睛/运动
2 2 384 geru 64 嘴唇/手部
3 2 384 geru 64 嘴唇/手部/眼睛/运动
4 3 256 geru 48 嘴唇/手部/眼睛/运动

分数如下:

公开榜 私有榜
单个最佳模型 0.786 0.865
集成5个模型 0.794 0.87

无效尝试

  • 归一化非常重要,我尝试了很多变体,但无法得到比简单的视频均值/标准差归一化更好的结果。
  • 更多的地标(如手臂、耳朵、鼻子或姿态)
  • Conv1d
  • 知识蒸馏
  • 模型融合(Model soup)
  • 更大的模型
  • 预训练模型(例如,CLIP预训练模型或使用NTU数据集预训练)
  • 等等...

代码

https://github.com/bamps53/kaggle-asl-11th-place-solution

同比赛其他方案