mirror of
https://github.com/unanmed/ginka-generator.git
synced 2026-08-14 18:12:28 +08:00
62 lines
2.7 KiB
Markdown
62 lines
2.7 KiB
Markdown
# 基于矩形掩码修补的生成策略设计
|
||
|
||
## 背景
|
||
|
||
当前生成策略是从训练集采样地图,经 VQ-VAE 编码得到码本 z,再用**随机采样的 z**(而非真实 z)作为 MaskGIT 的条件进行三阶段级联生成。在当前数据规模下,模型难以从纯随机条件中学习到合理的生成分布,效果不佳。
|
||
|
||
## 新策略目标
|
||
|
||
降低任务难度:保持从训练集采样,但不再用随机 z,而是**在真实地图上施加随机矩形掩码**,让模型作为"修补(inpainting)"任务来完成。这样模型既有真实地图的结构先验(通过 z 条件),又有明确的局部填空目标。
|
||
|
||
## 核心改动
|
||
|
||
### 1. 掩码方式
|
||
|
||
**仅使用矩形分块掩码**(`dataset.py` `std_mask` 的第二种模式),不采用散点随机掩码。
|
||
|
||
验证时掩码比例随机采样自 `Uniform(0.2, 0.8)`。
|
||
|
||
### 2. 条件输入 z
|
||
|
||
不再随机采样 z,改为使用**完整地图(掩码前)经 VQ-VAE 编码后得到的真实 z**:
|
||
|
||
- 对掩码后的地图做 VQ 编码没有意义——掩码区域噪声会污染码本表示
|
||
- z 携带完整地图的全局结构信息,作为"答案的轮廓"注入 MaskGIT
|
||
- MaskGIT 以完整 z 为条件,对照可见图块,在掩码区域补全被遮盖的图块
|
||
|
||
### 3. 生成流程
|
||
|
||
仍然采用三阶段级联,但每个阶段统一使用同一份掩码布局:
|
||
|
||
```
|
||
输入: 完整地图 gt [13×13]
|
||
↓ ↓
|
||
VQ-VAE 编码 生成矩形掩码 mask [13×13 bool]
|
||
gt → z1,z2,z3 gt[mask] = MASK_TOKEN → inp
|
||
↓ ↓
|
||
└──────┬─────────┘
|
||
↓
|
||
Stage1: mg1(inp, z1) → 补全墙壁
|
||
Stage2: mg2(inp1+stage1_out, z2) → 补全门/怪物/入口
|
||
Stage3: mg3(inp2+stage2_out, z3) → 补全资源
|
||
↓
|
||
输出: 最终地图 + 逐阶段可视化对比
|
||
```
|
||
|
||
### 4. 逐阶段保留未掩码区域
|
||
|
||
与 `full_generate_specific_z` 不同,修补场景下需要将**未掩码区域的原始图块逐阶段传递**,避免被误当成空地重填:
|
||
|
||
- Stage1 后将 raw_map 中未掩码区的非 0/1 图块覆盖到 stage1 输出
|
||
- Stage3 前将 raw_map 中未掩码区的资源覆盖回去
|
||
|
||
### 5. 验证可视化
|
||
|
||
替换现有的验证 `rand{batch_idx}.png`(原为随机墙壁种子 + 随机 z 生成),改为修补方式:
|
||
|
||
- 不显示真实地图,仅展示掩码输入与生成结果的对比
|
||
- 每张 `rand` 图展示 4 组样本,每组为"掩码地图 + 生成结果"并排
|
||
- 2 行 × 4 列布局:每行放 2 组,每组左侧掩码输入、右侧生成结果
|
||
- 掩码区域由 MASK 图块(ID=7)自身标识,无需额外叠加颜色
|
||
- 每张子图标注样本名称和掩码比例(如 `map_v1 34%`)
|