第4名解决方案 - ASL手势识别竞赛
作者:ohkawa3(Kaggle Grandmaster)
排名:第4名
发布时间:2023-05-03
我要感谢组织者和所有参赛者。
我的解决方案的整体概况如下图所示。

预处理
- 使用XY坐标
- 将眉毛之间的坐标归一化到(0,0)
- 比较左右手检测到的帧数,仅当右手检测到的帧数少于左手时进行翻转(x=-x)
- 使用右手21个特征点的XY坐标(翻转左手)和嘴唇40个特征点,总共122维
- 删除未检测到手部特征点的帧。因此,手部和嘴唇的帧数将不同
建模
- 我构建了两种类型的一维卷积神经网络
- 第一种是分类固定长度序列的模型(1DCNN-FixLen)
- 第二种是分类可变长度序列的模型(1DCNN-VariableLen)
- 两个模型都有手部主干网络、嘴唇主干网络和分类头部
- 手部和嘴唇主干网络相似,只是卷积维度不同:手部主干使用128维,嘴唇主干使用64维
1DCNN-FixLen
- 将序列插值到96帧。这一过程同时应用于手部和嘴唇特征点
主干网络
- 应用11次卷积和3次最大池化,将序列长度减少到12(=96/(2**3))
- 应用卷积将维度增加到512,然后应用全局最大池化
- 将全局最大池化改为全局平均池化导致性能显著下降。这可能是因为序列中的重要特征只包含在少数几帧中。我们认为使用全局平均池化时,这些特征会被平均掉而消失
- 我尝试了其他门控机制如Gated Linear Unit,但全局最大池化效果最好
头部
- 将手部特征(512维)和嘴唇特征(512维)相加
- 应用6个全连接层(浅层版本,stochastic_depth=0.1)或18个全连接层(深层版本,stochastic_depth=0.5)
- 分类为250个类别
1DCNN-VariableLen
主干网络
- 总共应用5次卷积(kernel_size=3)和6次卷积(kernel_size=1)。与上述不同,这里不应用池化
- 因此,感受野大小为11帧。由于进一步减少帧数会使情况恶化,增加帧数也会使情况恶化,似乎有意义的序列即使在长序列中也约为11帧
- 通过卷积将维度增加到512后应用全局最大池化
- 训练期间,输出会通过序列长度进行掩码处理,然后应用全局最大池化。这是因为应用了0填充以按批次中的最大长度进行归一化
头部
训练
- 3折参与者交叉验证
- 300个epoch,15个epoch后应用SWA
- AdamW优化器
- 使用ArcMarginProduct,但由于margin m=0,仅应用特征和权重的归一化
- 随机深度(Stochastic Depth),0.1或0.5
- 标签平滑损失(Label Smoothing Loss),epsilon=0.5
数据增强
- 随机丢弃帧(p=0.3)
- 增强手部位置、大小和角度
- 输入到1DCNN-FixLen的序列长度在64到128之间
CleanLab
- 使用CleanLab移除约5000个被认为是噪声的场景
- 使用21个参与者折叠计算后验概率,并使用filter_by="both"
- 在清理后的数据集上训练的模型在独立模型中提升了LB,但在集成时提升不大
- 是因为数据太干净,模型的多样性减少了吗?老实说我不知道
- 此外,CV与LB之间出现了差距,所以我尝试不要过于自信
- 在最终提交中,CleanLab仅应用于6个集成模型中的2个
额外实验
我做了一些实验,包括一些未包含在最终提交中的实验。从该评估中可以得出以下两点:
- CleanLab有效(+0.003)(比较A和B,D和E)
- 集成FixedLen和VariableLen效果显著(+0.01)(A0+D)
- 仅靠集成fixedlen无法获奖
| 模型 |
长度 |
头部大小 |
cleanlab |
种子 |
Private |
Public |
| A0 |
fixed |
deep |
no |
0 |
0.8661 |
0.7843 |
| A1 |
fixed |
deep |
no |
1 |
0.8682 |
0.7842 |
| B0 |
fixed |
deep |
yes |
5 |
0.8721 |
0.7848 |
| B1 |
fixed |
deep |
yes |
6 |
0.8702 |
0.7862 |
| C0 |
fixed |
shallow |
no |
5 |
0.8651 |
0.7794 |
| C1 |
fixed |
shallow |
no |
6 |
0.8665 |
0.7825 |
| D |
variable |
deep |
no |
25 |
0.8653 |
0.7812 |
| E |
variable |
deep |
yes |
35 |
0.8688 |
0.7840 |
| F |
variable |
shallow |
no |
150 |
0.8647 |
0.7794 |
| A0+A1 |
fixed |
- |
no |
- |
0.8722 |
0.7905 |
| B0+B1 |
fixed |
- |
yes |
- |
0.8761 |
0.7935 |
| A0+D |
- |
- |
no |
- |
0.8766 |
0.7945 |
| fixedlen only (A0+A1+B0+B1+C0+C1) |
fixed |
- |
- |
- |
0.8774 |
0.7962 |
| best sub(A0+B0+B1+C0+E+F) |
- |
- |
- |
- |
0.8824 |
0.7999 |