返回列表

[8th Place] Brief solution.

391. ALASKA2 Image Steganalysis | alaska2-image-steganalysis

开始: 2020-04-27 结束: 2020-07-20 网络安全 数据算法赛
[第8名] 简要解决方案
作者: Wonho Song | 比赛排名: 第8名

发布前

在发布本文之前,感谢主办方举办了这场精彩的比赛。同时,也要感谢我们优秀的队友:@titericz, @youhanlee, @wonhyukahn, @bhjang

很抱歉目前只能提供简要的解决方案,详细内容将很快更新。

流程

我们的流程如下:

EDA(探索性数据分析) -> CV策略(交叉验证) -> 数据处理 -> 数据增强 -> 模型 -> 集成

1. EDA

将很快更新

2. CV策略

  • 基于质量因子和隐写信息插入量的分层K折交叉验证

信息插入量可以通过以下方式计算:

a = 每个通道的载体和隐写图像之间DCT系数的差异
b = 每个通道非零DCT系数的数量
信息插入量 = a / b

然后,将信息分箱为10个等级后,根据每个质量因子划分为K折。早期阶段我们使用了5折,但后来使用了10折。

因为训练模型花费的时间太长,我们没有训练所有的折。我们选择了K折中的一折作为留出集。

3. 数据

  • 图像:从RGB转为重建RGB(ReconstructedRGB)
  • 标签:从二分类转为多标签

对于图像,我们使用重建RGB而不是RGB。当使用cv2加载JPEG图像时,微小的数值会被舍入和截断。由于隐写信息是非常细微的信息,保留这些数值非常重要。因此,我们使用jpegio库创建了没有舍入和截断的图像。

对于标签,正如之前讨论中提到的,使用了多标签分类而不是二分类标签。我们使用了10个目标(载体,3个质量因子 * 3个隐写算法)。

4. 数据增强

  • 翻转、旋转90度、Cutout、网格混洗、网格丢弃

我尝试了很多数据增强实验。
首先最重要的是,我们去除了改变原始像素值的数据增强。因此,我们使用了翻转、旋转90度、Cutout、网格混洗和网格丢弃

效果最好的是网格混洗。这种增强方法源于对以下问题的思考:如何让我们的模型关注细微的隐写信息,而不是图像中物体的形状?
为了回答这个问题,我们尝试了先混洗像素,然后混洗8x8的图块。在JPEG图像中,8x8的图块非常重要,因为DCT信息包含在8x8的图块中。隐写信息是在DCT层级插入的,由于DCT信息在8x8图块内是连续的,我们决定混合这些8x8图块。
如果将图块的单大小设置为8x8,总共会生成64*64个图块。混合所有这些图块会破坏纹理信息以及形状信息,这会阻碍模型的训练。因此,我们选择了大小合适且不太小的图块来训练模型。
网格丢弃也是类似的原理。

代码如下:

  • 网格混洗 (Albumentations库)
grid_shuffle = OneOf([
        RandomGridShuffle((2, 2), p=1.0),
        RandomGridShuffle((2, 4), p=1.0),
        RandomGridShuffle((2, 8), p=1.0),
        RandomGridShuffle((2, 16), p=1.0),
        RandomGridShuffle((2, 32), p=1.0),
        RandomGridShuffle((4, 4), p=1.0),
        RandomGridShuffle((4, 8), p=1.0),
        RandomGridShuffle((4, 16), p=1.0),
        RandomGridShuffle((4, 32), p=1.0),
        RandomGridShuffle((8, 8), p=1.0),
        RandomGridShuffle((8, 16), p=1.0),
        RandomGridShuffle((8, 32), p=1.0),
        RandomGridShuffle((16, 16), p=1.0),
        RandomGridShuffle((16, 32), p=1.0),
        RandomGridShuffle((32, 32), p=1.0),
    ], p=0.7)

5. 模型

  • 框架:Pytorch
  • 主干网络:Efficientnet b0, b0(双倍分辨率), b3, b4, b7, resnext
  • 调度器:ReduceOnplateau
  • 损失函数:交叉熵损失
  • 优化器:AdamP, AdamW
  • 轮数:100+
  • 使用TTA 8x

6. 其他

同比赛其他方案