返回列表

9th place solution

567. Google Research - Identify Contrails to Reduce Global Warming | google-research-identify-contrails-reduce-global-warming

开始: 2023-05-10 结束: 2023-08-09 双碳与可持续发展 数据算法赛
第9名解决方案 - tascj

第9名解决方案

作者:tascj

排名:第9名

票数:76票

发布时间:2023-08-10

感谢主办方举办本次比赛,也祝贺所有获奖者们。

关键发现

许多人可能已经注意到,在这个数据集上,翻转/旋转90度增强效果不佳。

我的猜测是,在将多边形标注转换为二进制掩码的过程中,最左侧的点未被包含,而最右侧的点被包含,导致图像与掩码之间出现错位。

  • 原始情况
    • img: [0, 128, 128, 3, 4, 5, 6]
    • mask: [0, 255a, 255b, 255pad, 0, 0, 0]
  • 无法正常工作的翻转
    • img: [6, 5, 4, 3, 128, 128, 0]
    • mask: [0, 0, 0, 255pad, 255b, 255a, 0]
  • 应保持一致性的翻转
    • img: [6, 5, 4, 3, 128, 128, 0]
    • mask: [0, 0, 0, 0, 255b, 255a, 255pad]

我尝试了两种方法来解决这个问题。

方案1:使用错位的(img, mask)进行训练

  • 训练阶段
    • img: 正常翻转
    • mask: 一致性翻转
  • 推理阶段
    • 翻转TTA:正常img翻转 -> 预测 -> 一致性mask翻转

这种情况下,训练/测试时增强处理起来有点棘手。

方案2:使用对齐的(img, mask)进行训练

  • 训练阶段
    • img: 向右移动+0.5像素
  • 推理阶段
    • img: 向右移动+0.5像素

这种情况下,训练/测试时增强可以正常处理。

两种方案都有效。出于简单性考虑,我选择了方案2。我使用以下代码来应用resize512和shift1:

img_affine_matrix = np.array([[2.0, 0.0, 1.5], [0.0, 2.0, 1.5]], dtype=np.float64)
img = cv2.warpAffine(
    img,
    img_affine_matrix,
    (512, 512),
    flags=cv2.INTER_LINEAR,
    borderMode=cv2.BORDER_CONSTANT,
    borderValue=0,
)

注意,你需要校准warpAffine的变换矩阵M,因此最终的仿射矩阵中平移项为1.5。

def calibrate(M):
    # dst + 0.5 = M(src + 0.5)
    M[:, 2] += M[:, 0] * 0.5 + M[:, 1] * 0.5 - 0.5
    return M

模型

我的提交笔记本公开[在此]。

我参赛较晚,只是简单探索了其他波段和2.5D方法,之后就放弃了。最终,我只使用了假彩色图像和UNet模型。

  • 强大的骨干网络非常有帮助。
  • 使用所有单独标注进行训练很有帮助。

我在小模型上做伪标签取得了一些成功,但遗憾的是没有时间将其应用到更大的模型上。

同比赛其他方案