AN INTERACTIVE GUIDE TO NEURAL COMPRESSION
一张图像,
藏在网络里。
三张特征网格,一个小型神经网络。
用不同尺度与精度的局部特征,以接近 BC7 的数据量还原图像。
512 × 512 · 针对这张图单独训练 · 相近码率比较
BC7我们的模型
01 / FOLLOW A PIXEL
一个像素的旅程
在图上选一个位置。看它访问哪些特征,
又如何经过网络,变成一个颜色。
载入后,点击任意节点查看它的数值。
色块表示数值,不是 RGB 特征图。隐藏层颜色越深,激活绝对值越大;正负值用不同色相区分。
展开数学与解码细节 41 → 80 → 80 → 80 → 3
像素坐标使用 uv = ((x + 0.5) / 512, (y + 0.5) / 512)。每级网格坐标为 uv × size − 0.5,边界取值 Clamp。细网格四点直接拼接;粗网格与高精度网格分别双线性插值。高精度值按 code / 65535 解码,插值后减去 0.5 作为网络输入,不直接叠加到输出。
位置编码频率为 64、128、256 cycles,分别产生 sin(x)、sin(y)、cos(x)、cos(y)。隐藏层为 h = sin(30 × (Wh + b)),输出层线性映射到 RGB 后限制在 [0, 1]。
此处 JavaScript 解码器从真实的 model.bin 读取参数,浮点累计与 GPU 存在细微差异;全图指标来自已验证的 RGB8 重建。改变显示大小时先还原训练像素,再做图像重采样,不假设网络具有任意坐标的连续重建能力。
载入后执行参考像素校验。
02 / INSIDE THE FILE
255 KiB,
都用在了哪里?
约 91% 的空间留给局部特征。
小网络把这些特征解释成颜色。
压缩数据 + 解码描述
两者均不含通用解码程序。压缩体积、GLSL 文本体积与运行时显存是三个不同的量。
伪彩色表示量化特征值,不是缩小的原图。
03 / ENCODING THE IMAGE
图像如何
变成编码?
从图像拟合到量化,再到整数编码搜索。
这些步骤决定模型如何存储和还原图像。
- 01针对原图拟合
高精度网格用图像块均值初始化,再与其他特征和网络共同训练。训练后不要求保留底色含义。
- 02量化与解码器微调
两级网格使用 4-bit,高精度网格使用 16-bit,网络权重使用 10-bit;固定网格后微调解码器。
- 03直接挑选更好的编码
4-bit 编码尝试相邻值,高精度编码尝试多种步长;后段还联合搜索 4-bit 通道对,按当前目标保留更好的选择。
q − 1qq + 1候选集合示意 · 最优选项取决于实际误差
图中是本模型微调后的 15 轮真实搜索:前 12 轮优化浮点误差,后 3 轮优化区域加权 RGB8 误差。曲线统一展示全图 RGB8 PSNR。
搜索起点
固定展示搜索起点与最终结果,选区与上方像素同步。曲线滑块只改变指标,不代表中间轮次图像。
04 / LOOK CLOSER
让细节自己说话。
三张图,同一个位置,同一种放大方式。
全局指标更好,不代表每个局部都更好。
最近邻放大,保留原始像素。各图标题的 PSNR 为全图指标。
分区域看重建误差。
在这张图中,模型在边缘、平坦和其余三类区域的平均误差均低于 BC7。距边缘 2–8 像素的其余区域误差则高于 BC7:0.758 对 0.582。区域平均值与局部表现可以分别观察。
| 区域 | BC7 RMSE | 模型 RMSE |
|---|---|---|
| 边缘 · 20.84% | 3.429 | 2.137 |
| 平坦 · 11.95% | 0.304 | 0.116 |
| 其余 · 67.21% | 1.137 | 0.992 |
RMSE 使用 0–255 的 RGB 值,越低越好。