2506 字
13 分钟
GAN 迷彩生成项目阶段记录

这个项目最初是在尝试用 GAN 生成迷彩图案。随着模型逐步跑通,我开始把目标进一步明确:输入一张背景图,再指定一种迷彩类别,让生成结果保留该类别的图案特征,同时使用背景中的颜色。

比如,同样一张条纹迷彩,放到沙地场景中使用棕黄色系,换成雪地背景后使用蓝白色系,换成林地后使用绿色系。图案的主要走向、斑块位置和尺度尽量保持一致。 目前,这个想法已经有了可以运行和对比的原型。这篇文章记录现阶段做了什么、得到了哪些结果,以及还没有解决的问题。

一、先明确目标:类别管结构,背景管配色#

我现在采用的任务定义是:

类别控制图案结构,背景控制配色,先保留纹理尺度特征。

这里的“指定类别”,不再要求生成结果保留该类别原有的颜色。例如,某种林地迷彩的斑块结构可以保留,但颜色允许来自沙地背景。 这也改变了评价方式:如果分类器原本依赖绿色、棕色等颜色信息识别类别,那么重配色后分类准确率下降,并不一定意味着图案结构被破坏。后续需要把“结构保留”和“颜色匹配”分开检查。 当前模型本身还没有学到完全独立的结构与颜色表示。它依然先生成带有原始配色的 RGB 图,再通过后处理完成配色替换。

二、模型迭代#

项目经历了以下迭代:

DCGAN 基线
  ↓
WGAN-GP 多个实验版本
  ↓
条件 WGAN-GP:加入迷彩类别
  ↓
V6a:条件归一化相关改进
  ↓
V6b:残差生成器与判别器
  ↓
V6c:增加多尺度条件局部评分

当前使用的数据来自项目整理的 CamoNet synthetic 数据,包含 40 个类别。生成器的原生输出分辨率为 64×64。 V6c 沿用了 V6b 的生成器,在判别器中加入 16×16 和 8×8 特征图上的条件局部评分分支,将全局评分与局部评分结合。 V6c 已完成 120 个 epoch 的训练,并保存了多个 checkpoint。当前背景配色原型使用的是第 80 轮权重,选的是当前的best。

已保存的生成模型评估结果#

下表是各版本选中 checkpoint 的测试结果,每个选中模型生成 4,000 张样本进行评估。这些是背景重配色之前的结果。

版本选中 epoch类别一致率 ↑Feature KID ↓综合诊断误差 ↓
条件 WGAN-GP 基线10082.42%0.026550.3930
V6a8087.90%0.038310.3644
V6b10086.12%0.018770.2340
V6c8085.10%0.017140.2063

从这些记录看,V6c 的 Feature KID 和综合诊断误差较低,但类别一致率并不是最高的。因此,目前不能简单说它在所有方面都更好。 这里的 Feature KID 使用项目中的真实图像分类器特征计算,不是标准 Inception KID;综合诊断误差也是自定义的颜色、边缘、频率和多样性诊断,并不是 FID。

三、背景配色原型做法#

我暂时没有重新训练一个直接接收背景图的 GAN,而是复用已有模型,先把流程跑通:

类别 + 随机噪声
↓
条件 GAN 生成原始 RGB 迷彩
↓
量化成有限色层 → 固定区域 ID 图 ─────┐
│
背景图 → 等比例缩小 → 主色与占比 ────┤
↓
色层与背景颜色匹配
↓
重配色迷彩图

1. 背景尺寸不需要统一#

目前使用了沙漠、草地、沙地、雪地、林地五张背景图。它们的宽高比和分辨率虽各不相同,但这不会阻碍提色。

2. 背景提取 5 色,迷彩默认保留 4 层#

第一版采用 Pillow 的 median-cut 颜色量化方法,关闭抖动。背景默认提取 5 种候选颜色及其像素占比,也支持手动设置 3~7 色。 这里要区分两个参数:

参数含义当前默认值
背景候选色数背景提供多少种颜色供选择5
迷彩色层数原始迷彩划分成多少个颜色层4

背景有 5 种候选色,不代表输出必须使用全部 5 种。当前 4 层迷彩会从候选色中选择 4 种,再按亮度顺序进行映射;背景颜色占比作为软参考,不强制复制到迷彩中。严格匹配背景颜色占比可能需要改变斑块面积,而现阶段更优先保留区域结构。

3. 固定区域之后,只改变颜色#

量化后,每个像素都有一个区域 ID。不同背景下的颜色变化,都通过替换区域对应的颜色实现,不重新划分区域。 程序还会从最终输出颜色反推区域 ID,检查它是否与源区域完全一致。 这个检查保证的是量化之后的区域不变。 从连续 RGB 图转为有限色层时,本身就可能丢失细节,不能把区域检查通过解释成原始 GAN 图像的全部细节都被保留下来。

四、第一轮结果:配色确实跟着背景变化#

第一轮选取了 Flecktarn、Tigerstripe 和 CADPAT TW 三类,每类生成两张样本,再分别适配五张背景,共得到 30 张配色图。 first_comparison.png 左侧两列分别为原始 RGB 图和量化结构图,右侧五列为不同背景下的配色结果。图中放大仅用于观察,原生输出仍为 64×64。

结果基本符合预期:同一图案在不同背景下呈现不同的配色,而区域位置保持一致。沙地背景颜色比较接近,输出斑块的视觉对比也较弱;雪地背景提取出的颜色偏蓝白,生成结果也会呈现这种倾向。

五、扩大到 40 类:3、4、5 色层到底怎么选?#

三类样例看起来可行后,我进一步把实验扩展到了全部 40 类:

  • 每类生成 3 张固定源图,共 120 张源图。
  • 每张源图分别量化为 3、4、5 色层。
  • 每种色层设置再适配 5 张背景。
  • 总计得到 40 × 3 × 3 × 5 = 1,800 张配色结果。 同一张源图复用于不同色层数和背景的比较,避免随机生成差异干扰判断。

平均诊断指标#

这轮评价的参考图是原始 GAN 输出,目的是观察量化带来的变化。

色层数RGB 重建 RMSE ↓强边缘位置重合率 ↑边缘能量比四邻域孤立像素比例
30.05020.57030.69971.57%
40.03400.67210.78933.39%
50.03190.69190.81724.87%

RGB RMSE 在 0~1 数值范围内计算;强边缘重合率比较两幅图中前 20% 的强边缘位置;边缘能量比以原始输出为参考,接近 1 表示平均强度更接近。孤立像素是与上下左右邻居区域 ID 均不同的像素,不一定都是噪声。 目前比较明确的是:从 3 层增加到 4 层,平均改善较明显;从 4 层增加到 5 层,收益变小,同时孤立像素增多。 因此,我暂时保留默认 4 色层,没有把所有类别统一升级到 5 层。

条纹类:主要走向可以保留#

tigerstripe_layers.png 每张对照图从上到下依次为 3、4、5 色层;各行使用同一张源图。

这个 Tigerstripe 样例中,条纹走向在三种色层设置下都比较明显。增加色层能补充细微层次,但不能简单认为色层越多就越好。

大斑块类:更多色层也可能带来多余分区#

klmk_layers.png 这个 样例主要由大块平滑区域组成,3 层已经保留了大体轮廓。增加到 5 层后,原图中较细微的颜色变化也可能变成明显分区。

强边缘重合率低,不一定就代表结构最差。对平滑图像而言,弱梯度和并列数值会影响排序,仍然需要结合图像判断。

原图模糊时,增加色层无法补回结构#

kryptek_layers.png 这个样例的原始 GAN 输出本身就比较模糊。量化后边界变硬,但增加色层不能恢复原图中没有生成出来的结构。

所以后续需要区分:问题来自生成器,还是来自量化和配色流程。单纯调整色层数量,不可能解决所有问题。

GAN 迷彩生成项目视频Bilibili

六、接下来工作#

现阶段先保留“5 种背景候选色 + 4 个迷彩色层”作为基线。下一步主要关注三件事。

第一,改进色层选择。 每类只有 3 个样本,还不足以确定每个类别的最佳色层数。后续需要增加样本,同时考虑重建误差、区域碎化和轮廓保留,避免只因为误差下降就不断增加颜色。

第二,改进背景提色。 当前仍是整图提色。如果背景中存在大面积无关区域,它们也会进入调色板。后续可以增加局部区域选择,再研究自动选择颜色数量和合并过近颜色。

第三,把结构质量与配色质量分开评价。 当前的区域一致性检查只验证重配色实现是否正确,并不验证类别结构是否真实。生成器原生分辨率仍是 64×64,更高分辨率、连续铺贴以及真正独立的结构表示,都还没有完成。 当前比较让我兴奋的是已经能够对同一张迷彩图进行可复现的背景换色,并把不同设置放在一起比较。接下来的工作,会围绕这些具体差异继续推进。

GAN 迷彩生成项目阶段记录
https://258931.xyz/posts/blog/202609122/
作者
亖月三日 君寻
发布于
2026-09-13
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取

评论

正在加载评论...