Skip to content

图片拟合

  • 来源:noai-train/联合训练/Day2/T1 ImageFitting 任长谦
  • 类型:CV / implicit neural representation
  • 原始资料:ImageFitting.mdbaseline.pymetrics.pyattempt/ref_result.py
  • 题面完整性:完整
  • 解法资料完整性:有参考代码,完整题解需结合代码推断

题面大意

给定一张分辨率 960 x 540 的 RGB 图片,但选手不能直接读取完整图片数组。评测器会通过选手实现的 Dataset 取坐标/索引,再用固定训练循环训练选手构造的神经网络,让网络拟合像素颜色。限制包括 CPU、内存 512 MB、总时间 5 分钟、参数量不超过 50k、仅允许线性层和激活函数、不能用 nn.Sequential。最终按输出图像与原图的 MSE 映射为分数。

数据特点

图像是典型高频信号:局部细节、边缘、纹理较多。输入本质是坐标,输出是 RGB。模型容量和训练时间都受限,因此普通 MLP 直接用原始 (x, y) 坐标拟合会欠拟合高频细节。数据量是所有像素点,样本数大但每个样本目标固定,属于“让网络记住一张图”的任务。

考点

核心考点是坐标神经网络和高频信号表示。参赛者需要设计有效坐标编码、采样方式和小型 MLP 架构,在有限参数内提升拟合能力。题目也考察对评测训练循环的适配:Dataset.__getitem__ 返回的第二项必须能索引原图,第一项必须能作为模型输入。

涉及知识点

  • Implicit Neural Representation / coordinate-based MLP。
  • Fourier features、sin/cos 位置编码、归一化坐标。
  • 小模型容量分配:宽度、深度、激活函数选择。
  • 图像 MSE 与视觉质量的关系。
  • 数据集索引协议和高级索引。

解法思路

基础解法是把像素坐标归一化到 [0, 1][-1, 1],输入 MLP 输出 3 通道颜色。但对高频细节不够。更好的方案是在 Dataset 中返回多频率位置编码,例如 sin(2^k pi x), cos(2^k pi x), sin(2^k pi y), cos(2^k pi y),让线性层能更容易拟合高频变化。

模型可用 3 到 5 层小 MLP,激活函数选 ReLU、LeakyReLU、Tanh 或 Sin 类激活。若只允许常规激活,Fourier features 往往比加深网络更有效。训练参数应在有限时间内完成足够 epoch,batch size 不能太小,否则 CPU 开销过大。

可选/多种解法

Fourier feature MLP:最通用,少量参数即可表达纹理。

分块/多尺度编码:把图像坐标分成网格块,加入块编号或局部坐标,让模型分别拟合局部模式。

通道拆分:将像素通道也作为输入维度,输出单通道强度,可能增加样本量但简化输出;需要确保 idx 能正确索引原图。

特殊技巧

坐标归一化很关键。直接输入像素坐标 0..959,0..539 会导致优化困难。高频编码的频率数量要和参数量配合,过多会使输入维度膨胀、训练变慢。对固定图片,过拟合不是问题,目标就是记忆;但时间限制下需要优先优化收敛速度。

调参优化

这题调参围绕“有限参数和 CPU 时间内拟合固定图片”。优先调坐标编码频率数量、MLP 宽度/深度、激活函数、学习率、batch size、采样顺序和训练 epoch;Fourier features 频率过少会欠拟合,高频过多会让输入维度和优化难度上升。验证可以直接用重建 MSE 和运行时间双指标。若训练循环固定,Dataset 返回的坐标归一化范围和是否加入多尺度/周期编码通常比微调 optimizer 更关键。

注意事项

__getitem__ 返回的 idx 必须是一维整数 np.ndarray,否则评测器的 image[tuple(idx.t())] 会失败。不能使用卷积层,不能用 nn.Sequential。如果预测仍包含大量模糊区域,通常不是数据不够,而是坐标编码没有提供足够高频基。

推广意义

这题浓缩了 NeRF、SIREN、图像压缩和坐标网络的基本思想:用一个函数表示连续信号。它对理解“神经网络为什么难拟合高频”和“位置编码为什么有效”非常有价值。