鲸尾识别获奖方案总结

文章目录

    • 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;
• 图片翻转 -> 5004
2
• 伪标签

补充:

我的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

原文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/633422.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Wireshark 提示和技巧 | 如何合并多个捕获文件

背景 想到介绍合并捕获文件这个事情&#xff0c;源自于朋友的一个问题&#xff0c;虽然我用到的场景不是很多&#xff0c;但是可能会有更多的同学需要&#xff0c;就简单说说我知道的几个方法。 示例 测试的捕获文件主要信息如下&#xff0c;其中 test.pcapng 文件数据包数量…

遍历列表

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 遍历列表中的所有元素是常用的一种操作&#xff0c;在遍历的过程中可以完成查询、处理等功能。在生活中&#xff0c;如果想要去商场买一件衣服&#…

Sui主网升级至V1.25.1版本

其他升级要点如下所示&#xff1a; 协议 #17335 在DeepBook上交易时&#xff0c;lot_size代表min_size&#xff0c;表示交易所需的最小数量。quantity_min_tick&#xff08;一个常数&#xff0c;1000&#xff09;现在是lot_size。交易数量现在必须是quantity_min_tick的倍数…

数据访问层设计_6.连接对象管理设计

1.数据库连接管理 在基于JDBC的数据库应用开发中&#xff0c;数据库连接的管理是一个难点&#xff0c;因为它是决定该应用性能的一个重要因素。 对于共享资源&#xff0c;有一个很著名的设计模式——资源池。该模式正是为了解决资源频繁分配、释放所造成的问题。把该模式应用到…

nss刷题(关于ssti)

1、[HNCTF 2022 WEEK2]ez_SSTI 首先是注入${7*7}没有回显出49的情况&#xff0c;再次注入{{7*7}}如果还是没有回显49就代表这里没有模板注入&#xff1b;如果注入{{7&#xff0a;7}}回显了49代表执行成功&#xff0c;继续往下走注入{{7*7}}&#xff0c;如果执行成功回显7777777…

基于深度学习OCR文本识别

第一步&#xff1a;概要 基于深度学习OCR文本识别分为两个模块&#xff1a;DBNet和CRNN。 DBNet是基于分割的文本检测算法&#xff0c;算法将可微分二值化模块(Differentiable Binarization)引入了分割模型&#xff0c;使得模型能够通过自适应的阈值图进行二值化&#xff0c;并…

复制即用!纯htmlcss写的炫酷input输入框

一般我们写css样式都要用样式库&#xff0c;但是嫌麻烦&#xff0c;如果能找到现成的内容复制上去就很香了&#xff0c;下文是笔者觉得好看的纯html&css写的样式&#xff0c;可以直接复制到Vue等内&#xff0c;十分方便。 input组件 1&#xff09; 下面这个很推荐&#…

微信小程序抓取数据包(Proxifier联动burpsuite)

1、打开bp&#xff0c;确保开启127.0.0.1&#xff1a;8080监听地址。 2、点击setting--proxy&#xff0c;点击impor CA certificate&#xff0c;生成bp的证书。 保存到桌面为1.cer&#xff0c;文件后缀为cer就OK了&#xff0c;前缀任意 3、安装证书&#xff0c;双击打开刚刚生成…

js的算法-选择排序(简单选择排序)

选择排序 每一趟&#xff08;如第i趟&#xff09;在后面n-i1(i1,2,……n-1)个待排序元素中选取关键字最小的元素&#xff0c;作为有序子序列的第i 个元素&#xff0c;直到第i个元素&#xff0c;直到第n-1趟做完&#xff0c;待排序元素只剩下1个&#xff0c;就不用再选了。 快…

C - Sigma Problem(AtCoder Beginner Contest 353)

题目的链接: C - Sigma Problem (atcoder.jp) 题目&#xff1a; 样例&#xff1a; 题目大致含意: 给你n个数&#xff0c;让你对这n个数进行操作&#xff0c;比如当前是第i个&#xff0c;那么让a[i] 和 后面的每个数进行相加, 例如a[i] a[i 1] 注意的是a[i] a[i 1]的结果…

GPIO模拟IIC通信测量环境光

目录 iic.h iic.c ap3216c.h ap3216.c main.c 实验效果 iic.h #ifndef __IIC_H__ #define __IIC_H__#include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h" //SDA 数据线为PF15 //SCL 时钟线为PF14//配置PF15为输出模式 #define SET_SDA_OUT d…

医药进出口交易|基于SSM+vue的医药进出口交易系统的设计与实现(源码+数据库+文档)

医药进出口交易系统 目录 基于SSM&#xff0b;vue的医药进出口交易系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 5.1系统登录 5.2管理员功能模块 5.3仓储部门功能模块 5.4业务部门功能模块 5.5供应部门功能模块 5.6财务部功能模块 5.7客户功能模块 …

【BUG】流式响应requests得到: ping - 和时间戳

前情提要 运行Langchain-Chatchat项目&#xff0c;使用自定义请求访问API Server流式输出 报错展示 b: ping - 2024-05-22 00:46:04.83252000:00\r\n\r\n报错原因 这通常是由于 Server-Sent Events (SSE) 实现中使用的“心跳”机制&#xff0c;以确保连接保持活跃。一些 SSE…

反序列化漏洞(JBoss、apache log4、apache Shiro、JWT)Weblogic未授权访问、代码执行、任意上传

1.1什么是反序列化 就是把一个对象变成可以传输的字符串&#xff0c;目的就是为了方便传输。假设&#xff0c;我们写了一个class&#xff0c;这个class里面存有一些变量。当这个class被实例化了之后&#xff0c;在使用过程中里面的一些变量值发生了改变。以后在某些时候还会用到…

附代码:策略常用-正余弦优化算法

正余弦优化算法作为群智能优化算法的一种, 正弦余弦算法 (sine cosine algorithm, SCA) 是 2016 年由 Mirjalili 提出的一种新型仿自然优化算法, 通过创建多个随机候选解, 利用正余弦函数的数学性质来平衡算法在搜系过程中的全局探索和局部开发能力。该算法具有结构简单、参数少…

鸿蒙开发接口应用程序包管理:【ApplicationInfo】

ApplicationInfo 说明&#xff1a; 本模块首批接口从API version 7 开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 开发前请熟悉鸿蒙开发指导文档&#xff1a; gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。…

ARTS Week 29

Algorithm 本周的算法题为 2413. 最小偶倍数 给你一个正整数 n &#xff0c;返回 2 和 n 的最小公倍数&#xff08;正整数&#xff09;。 示例 1&#xff1a;输入&#xff1a;n 5输出&#xff1a;10解释&#xff1a;5 和 2 的最小公倍数是 10 。 实现代码如下&#xff1a; con…

P6【力扣144,94,145】【数据结构】【二叉树遍历】C++版

【144】二叉树的前序遍历 1、递归法&#xff1a; class Solution { public:void preorder(TreeNode* root, vector<int> &res){if(root nullptr){return;}res.push_back(root->val);preorder(root->left, res);preorder(root->right, res);}vector<in…

AI--构建检索增强生成 (RAG) 应用程序

LLM 所实现的最强大的应用之一是复杂的问答 (Q&A) 聊天机器人。这些应用程序可以回答有关特定源信息的问题。这些应用程序使用一种称为检索增强生成 (RAG) 的技术。 典型的 RAG 应用程序有两个主要组件 索引&#xff1a;从源中提取数据并对其进行索引的管道。这通常在线下…

递增链表去重

题目描述&#xff1a; 题目思路&#xff1a; 1.链表内的val是递增的&#xff0c;所以相同的值只会连续重复地出现。 2.设置三个指针&#xff1a; ①指向头结点指针&#xff0c;用于返回链表 ②指向返回链表链尾的指针&#xff0c;用于在新链表添加结点 ③遍历旧链表结点的…