文章目录
- 1st solution(classification)
- 2nd place code, end to end whale Identification model
- 3rd place solution with code: ArcFace
- 4th Place Solution: SIFT + Siamese
- 5th solution blog post + code -Siamese
- 7th place Pure Magic thanks Radek solution: classification
- 9th place solution or how we spent last one and a half month
- 10th Place Solution: Metric Learning, Classification, Siamese, LGBM
- 15-th plcae solution: sphereface, image alignment and multi-layer fusion
- 24th place solution
- 25-th place solution: CosFace + ProtoNets
- 31st place solution + source code
主要是学会常见方法的实践,解决工程问题;掌握每种方案的流程及思想。
1st solution(classification)
原文
code
方法介绍:采用SENet154作为基础模型,采用了PCB对local特征进行监督,对局部和全局特征进行triplet loss监督。作者认为没有triplet loss,精度也能达到 0.96。分类分支把数据看做5004类和new_whale类。关键是增加了掩膜输入,使用了两种损失函数。
概述:
0.8->0.96->0.973
在一开始,我们使用softmax +固定阈值(看代码应该是指损失函数使用了margin)来训练模型,但没有得到好的结果(<0.9)。 为了在我们的网络中使用new_whale图像,我们决定对每个鲸鱼类进行2分类(判断是否是new_whale吗?)。
经过几周的实验,senet154表现最好,我们得到了0.96(both public & private)结果(单一模型)。
为了进一步改进,我们添加了一些技巧(将在后面讨论)并得到0.969,加上4倍交叉验证和类平衡后处理以达到0.973。
我们还尝试将se154与SE-Resnext101,DPN131等其他网络组合,但没有得到任何提升。
-
网络输入及训练步骤:
输入尺寸 (512, 256)
4通道输入, RGB + masks (基于450 张已有标签进行训练)
Step 1: 训练图片数量 >10 的样本(更容易收敛)
Step 2:训练所有训练集, 固定网络除了最后两个全连接层. -
图片水平翻转(+0.006)
翻转图片作为新的类别,没有标签的数据不处理 -
伪标签 (+ 0.001)
在训练集中添加了约2000张测试图像(分类置信度> 0.96)。 -
标签平衡 (+0.001 ~ 0.002)
在我们持续改进期间(从0.8+到0.96),我们发现标签与分数相关。 因此,我们使用策略来进一步平衡我们的预测:
对于Top5预测中的类别class1到class5,如果:conf class1 - conf class 2 <0.3,并且class 2未在所有Top1预测中没有出现过,而class 1已多次出现在top2中,我们切换class1和class2的位置。
2nd place code, end to end whale Identification model
code
原文
方法介绍:多网络融合,多损失函数
模型
• 输入: 256x512 or 512512 cropped images;
• 骨架网络: resnet101, seresnet101, seresnext101;
• 损失函数: arcface loss + triplet loss + focal loss;
• 优化器: adam ,学习率热身;
• 数据增强: blur,grayscale,noise,shear,rotate,perspective transform;
• 图片翻转 -> 50042
• 伪标签
补充:
我的baseline模型仅在arcface上训练(非新鲸图像)。 为了推断,我删除了margin m并直接使用最后一个fc的softmax结果。 最后一个fc的L2范数权重矩阵接近于中心类特征。 我的arcface模型在public LB上可以达到0.930~940左右。 进一步的改进来自增加的具有focal loss的分类分支(在非新鲸图像和新鲸图像上)。 ID翻转策略非常重要,它让我获得了最后的0.01提升。
3rd place solution with code: ArcFace
原文
code
方法介绍:使用了ArcLoss,训练的时候,使用了多个检测框,保存每个类的多张图片的多部分的中心作为特征,测试的时候也是使用多个框的特征中心(估计是参考few-shot的思想)。其实有点类似考虑局部的特征。
解决方案摘要
数据集
•验证集:随机抽样400个类,其中每类包含2个图像+ 110个新鲸鱼(= 400 * 0.276)。
•训练集:除新鲸以外的所有图像。
•水平翻转将身份加倍。
模型
bounding box & landmark
•我使用了Paul Johnson和Radek Osmulski的标注。
•我制作了5交叉训练,并使用它们训练了5个模型。
•IOU:0.93
鲸鱼识别器:
•使用ArcFace损失
•最后一次卷积后的层被替换为 flattening -> BN -> dropout -> FC -> BN。
•densenet121
•m = 0.5(论文默认值)
•weight decay 0.0005, droupout 0.5
数据增强
• average blur, motion blur
• add, multiply, grayscale
• scale, translate, shear, rotate
• align or no-align
训练
•adam优化器
•学习率为0.00025 - > 0.000125 - > 0.0000625
测试
(1)获取每张图片的特征:
•对于每个图像,我通过使用5个bounding boxes 和 landmarks, 获得了多个特征向量。
•对于每个类,所有特征向量的中心用作最终特征。
(2)获取测试图像的特征
•对于每个图像,生成多个特征向量,计算特征向量的中心。
(3)计算相似度
•上述两个特征向量的余弦相似度用作相似性的度量。
(4)选择阈值
•选择新鲸鱼的阈值约为0.276。
以下是最终方法的过程。
Without landmark
起初,我从训练集中排除了只有一个图像的和新鲸鱼的图片。为了推断,使用训练集的最相似图像的身份作为预测身份。
Public LB: 0.90, Private LB: 0.90
在使用相同身份的所有特征向量的中心之后,我得到了:
Public LB: 0.942 / Private LB: 0.939
使用权重衰减weight decay 0.0005
Public LB: 0.946 / Private LB: 0.946
加入只有一张图片的类到训练集:
Public LB: 0.963 / Private LB: 0.961
with landmark
当我使用对齐图像时,网络训练得更快但分数没有提高
Public LB: 0.962 / Private LB: 0.959
一些图像的bounding boxes和landmarks非常差,似乎无法提高分数。所以我也使用了非对齐图像
Public LB: 0.965 / Private LB: 0.961
最后,我通过水平翻转加倍了身份。翻转的图像具有不同的身份,但在视觉上非常相似。所以我将logit值平滑为零以防止梯度消失。
Public LB: 0.968 ~ 0.971 / Private LB: 0.965 ~ 0.968
4th Place Solution: SIFT + Siamese
原文
code
作者关注的重点是如何识别new_whale(N = 0)和N = 1个样本。特别是如何识别尽可能多的N = 1个样本。
我的流程有三个主要组成部分:
(1)关键点匹配 – 传统方法和新tricks
(2)Siamese 网络
(3)后处理
1.关键点匹配
这占我最终预测的80%以上,并且是经典的关键点匹配,是原始的low-shot方法之一。我尝试过SIFT,ROOTSIFT和一系列binary descriptors和匹配器,不同技术之间没有太大区别。
这里的数据集处于最佳位置,其中强力关键点匹配发挥作用。 7960个测试图像与15,697个训练图像属于合理范围。我选择了完全图像分辨率的纯蛮力方法,所有测试图像与所有训练图像,没有词袋或关键点的knn聚类。我必须克服几个重大挑战:
1.速度。每个图像的关键点描述符/匹配最多可能需要1-2秒,具体取决于您的硬件设置,但我使用了一些技巧,例如将所有关键点索引到hdf5文件,在匹配期间将所有关键点存储到RAM中,以及使用伟大的faiss库。在两个系统中,我可以在大约12小时内完成整个数据集的强力运行。
2.误报。在这个数据集上kp匹配的主要问题是误报,它有两个来源:背景海洋和鲸鱼尾部的许多亮点。我通过使用unet仅分割鲸鱼尾巴和单应矩阵的自定义xgboost模型来解决这个问题,以将图像对之间的最终单应性分类为有效或无效。
最终的kp匹配流程:
从训练集和测试集中提取所有kps(原始图,全尺度)到hdf5文件,将关键点限制为unet预测的鲸鱼吸虫面具区域。从CLAHE预处理图像中提取效果最佳。
匹配:
a.一种。循环遍历所有测试/训练对
b.使用faiss匹配关键点
c.关键点的双重单应性过滤(LMEDS后跟RANSAC)
d. xgboost预测验证单应矩阵
e.如果#匹配>阈值,则使用预测
2.Siamese网络
这是我的管道中最弱的部分,还有其他帖子表明网络比我使用的更强大。我稍微调整了Martin的代码,并使用了InceptionResNetV2,InceptionV3和ResNet50的集合。我没有使用任何数据增强并坚持使用灰度图像。
为了帮助训练更快一点,我在进入Siamese网络之前做了大量的骨干网络预训练,这似乎有所帮助。
我的预训练流程是:
前200类进行训练分类
在N> 8(~576类)的所有类别上进行微调
对所有类别上进行微调
对所有类别上进行微调+混合+图像大小384x384
3.后期处理
我发现这次比赛和Statoil Iceberg挑战竞赛之间的数据有一些相似之处,所以我能够使用winning solution(https://www.kaggle.com/c/statoil-iceberg-classifier-challenge)的一些相同的技巧和我在那里的获胜解决方案。
当从Siamese网络分析得到的预测矩阵时,我注意到总是有一些相同的火车图像不成比例地占据前5个位置。这让我想到我需要找到一种方法来抑制支配预测,或者弄清楚如何让N = 1类更加公平地升到预测结果的顶端。
我提出的想法非常简单:我没有用传统的“哪种火车图像最接近我的测试图像”的方式查看预测矩阵,而是转换矩阵现在看“哪个测试图像最接近我的训练图像”图片”。当我将转置矩阵限制为N = 1个样本时,我发现我可以沿着训练轴使用N = 1个训练样本的新阈值。这在N = 1样本中,我的top1预测会产生更多正确的结果。我相信有更好的方法可以实现同一个目标。
我对其他竞争对手发现的错误标签的数量感到惊讶,并且感谢Alex Mokin和这篇文章的撰稿人,我相信多余的类有一定作用。
流程缺点:
再次,像赞助商一样思考,他们可能不喜欢我的解决方案有以下几个原因:
1.计算成本非常高,特别是关键点匹配了流程;
2. 将流程转换为简单的方法来进行单个图像推断在后期处理比较困难。
我可能会采取别人的siamese网络作为一个纯粹的替代品放入我的管道,这将需要重新调整后处理流程,但这是可能的。
流程优势:
我认为关键点步骤非常强大,如果使用传统的关键点算法,没有足够压缩的空间。 将unet和xgb模型合并到流程中确实有助于将误报减少到可以忽略不计。
5th solution blog post + code -Siamese
原文
code
博客:推荐详细研究
方法介绍:流程如上图,使用了DenseNet121作为骨架网络,使用了类似VGG的网络作为关键点提取,并获得尾部的图片。采用了困难样本挖掘。
7th place Pure Magic thanks Radek solution: classification
原文
code
9th place solution or how we spent last one and a half month
原文
TL;DR Adam, Cosine with restarts, CosFace, ArcFace, High-resolution images, Weighted sampling, new_whale distillation, Pseudo labeled test, Resnet34, BNInception, Densenet121, AutoAugment, CoordConv, GAPNet
参考文献
《Deep Face Recognition: A Survey》
损失函数:
《CosFace: Large Margin Cosine Loss for Deep Face Recognition》
《ArcFace: Additive Angular Margin Loss for Deep Face Recognition》
Cosface and Arcface parameters was optimised as well. Cosface: S = 32.0, M=0.35. Arcface: M1 = 1.0, M2 = 0.4, M3 = 0.15.
尝试的优化器: Adam, AdamW, SGD, SGDW. 最好的是 Adam with Cosine annealing.
网络结构:
CoordConv和 GapNet 有一些效果
《An Intriguing Failing of Convolutional Neural Networks and the CoordConv Solution》
《Human-level Protein Localization with Convolutional Neural Networks》
(https://openreview.net/forum?id=ryl5khRcKm)
Squeeze-and-Excitation, Convolutional Block Attention Module 没有效果
数据增强:
对于 zero and few-shot learning,参考文献进行增强
《AutoAugment: Learning Augmentation Policies from Data》
HorizontalFlip
Rotate with 16 degree limit
ShiftScaleRotate with 16 degree limit
RandomBrightnessContrast
RandomGamma
Blur
Perspective transform: tile left, right and corner
Shear
MotionBlur
GridDistortion
ElasticTransform
Cutout
相关实现代码:
https://github.com/albu/albumentations
https://github.com/mdbloice/Augmentor
无效果:TTA和Mixed precision learning
测试时增强(test time augmentation, TTA)。这里会为原始图像造出多个不同版本,包括不同区域裁剪和更改缩放程度等,并将它们输入到模型中;然后对多个版本进行计算得到平均输出,作为图像的最终输出分数,可调用learn.TTA()来使用该算法。
10th Place Solution: Metric Learning, Classification, Siamese, LGBM
原文
15-th plcae solution: sphereface, image alignment and multi-layer fusion
原文
24th place solution
原文
25-th place solution: CosFace + ProtoNets
原文
31st place solution + source code
原文