添加数据增强方案以及扩散生成模型的想法

This commit is contained in:
Jiao77
2025-10-20 21:14:03 +08:00
parent d6d00cf088
commit 08f488f0d8
22 changed files with 1903 additions and 190 deletions

View File

@@ -1,173 +1,200 @@
# 下一步工作计划 (NextStep)
## 一、数据策略与增强 (Data Strategy & Augmentation)
**最后更新**: 2025-10-20
**范围**: 仅聚焦于 `feature_work.md` 的第二部分「模型架构 (Model Architecture)」的落地执行计划
**上下文**: 核心功能已完成,本文档将模型架构优化转化为可执行的工程计划,便于直接实施与验收。
> 目标:提升模型的鲁棒性和泛化能力,减少对大量真实数据的依赖。
> 参考来源:`docs/feature_work.md` 第二部分;更宏观的阶段规划见 `docs/todos/`
- [x] 引入弹性变形 (Elastic Transformations)
- ✔️ 价值:模拟芯片制造中可能出现的微小物理形变,使模型对非刚性变化更鲁棒。
- 🧭 关键原则(与当前数据管线一致):
- 现有自监督训练数据集 `ICLayoutTrainingDataset` 会返回 (original, rotated, H);其中 H 是两张 patch 间的单应关系,用于 loss 监督。
- 非刚性弹性变形若只对其中一张或在生成 H 之后施加,会破坏几何约束,导致 H 失效。
- 因此Elastic 需在“生成 homography 配对之前”对基础 patch 施加;随后对该已变形的 patch 再执行旋转/镜像与单应计算,这样 H 仍严格成立。
- 📝 执行计划:
1) 依赖核对
- `pyproject.toml` 已包含 `albumentations>=2.0.8`,无需新增依赖;确保环境安装齐全。
2) 集成位置与方式
-`data/ic_dataset.py``ICLayoutTrainingDataset.__getitem__` 中,裁剪并缩放得到 `patch` 后,转换为 `np.ndarray`,对其调用 `albumentations` 管道(包含 `A.ElasticTransform`)。
- 将变形后的 `patch_np_uint8` 作为“基准图”,再按现有逻辑计算旋转/镜像与 `homography`,生成 `transformed_patch`,从而确保 H 有效。
3) 代码改动清单(建议)
- `data/ic_dataset.py`
- 顶部新增:`import albumentations as A`
- `__init__` 新增可选参数:`use_albu: bool=False``albu_params: dict|None=None`
-`__init__` 构造 `self.albu = A.Compose([...])`(当 `use_albu` 为 True 时),包含:
- `A.ElasticTransform(alpha=40, sigma=6, alpha_affine=6, p=0.3)`
- (可选)`A.RandomBrightnessContrast(p=0.5)``A.GaussNoise(var_limit=(5.0, 20.0), p=0.3)` 以替代当前手写的亮度/对比度与噪声逻辑(减少重复)。
-`__getitem__`:裁剪与缩放后,若启用 `self.albu``patch_np_uint8 = self.albu(image=patch_np_uint8)["image"]`,随后再计算旋转/镜像与 `homography`
- 注意:保持输出张量与当前 `utils.data_utils.get_transform()` 兼容单通道→三通道→Normalize
- `configs/base_config.yaml`
- 新增配置段:
- `augment.elastic.enabled: true|false`
- `augment.elastic.alpha: 40`
- `augment.elastic.sigma: 6`
- `augment.elastic.alpha_affine: 6`
- `augment.elastic.prob: 0.3`
- (可选)`augment.photometric.*` 开关与参数
- `train.py`
- 从配置读取上述参数,并将 `use_albu``albu_params` 通过 `ICLayoutTrainingDataset(...)` 传入(不影响现有 `get_transform()`)。
4) 参数与默认值建议
- 起始:`alpha=40, sigma=6, alpha_affine=6, p=0.3`;根据训练收敛与可视化效果微调。
- 若发现描述子对局部形变敏感,可逐步提高 `alpha``p`;若训练不稳定则降低。
5) 验证与可视化
-`tests/benchmark_grid.py` 或新增简单可视化脚本中,采样 16 个 (original, rotated) 对,叠加可视化 H 变换后的网格,确认几何一致性未破坏。
- 训练前 1000 个 batch记录 `loss_det/loss_desc` 曲线,确认未出现异常发散。
---
- [x] 创建合成版图数据生成器
- ✔️ 价值:解决真实版图数据获取难、数量少的问题,通过程序化生成大量多样化的训练样本。
- 📝 执行计划:
1) 新增脚本 `tools/generate_synthetic_layouts.py`
- 目标:使用 `gdstk` 程序化生成包含不同尺寸、密度与单元类型的 GDSII 文件。
- 主要能力:
- 随机生成“标准单元”模版(如若干矩形/多边形组合)、金属走线、过孔阵列;
- 支持多层layer/datatype与规则化阵列row/col pitch、占空比density控制
- 形状参数与布局由随机种子控制,支持可重复性。
- CLI 设计(示例):
- `--out-dir data/synthetic/gds``--num-samples 1000``--seed 42`
- 版图规格:`--width 200um --height 200um --grid 0.1um`
- 多样性开关:`--cell-types NAND,NOR,INV --metal-layers 3 --density 0.1-0.6`
- 关键实现要点:
- 使用 `gdstk.Library()``gdstk.Cell()` 组装基本单元;
- 通过 `gdstk.Reference` 和阵列生成放置;
- 生成完成后 `library.write_gds(path)` 落盘。
2) 批量转换 GDSII → PNG训练用
- 现状核对:仓库中暂无 `tools/layout2png.py`;计划新增该脚本(与本项一并交付)。
- 推荐实现 A首选使用 `klayout` 的 Python API`pya`)以无头模式加载 GDS指定层映射与缩放导出为高分辨率 PNG
- 脚本 `tools/layout2png.py` 提供 CLI`--in data/synthetic/gds --out data/synthetic/png --dpi 600 --layers 1/0:gray,2/0:blue ...`
- 支持目录批量与单文件转换;可配置画布背景、线宽、边距。
- 替代实现 B导出 SVG 再用 `cairosvg` 转 PNG依赖已在项目中适合无 klayout 环境的场景。
- 输出命名规范:与 GDS 同名,如 `chip_000123.gds → chip_000123.png`
3) 数据目录与元数据
- 目录结构建议:
- `data/synthetic/gds/``data/synthetic/png/``data/synthetic/meta/`
- 可选:为每个样本生成 `meta/*.json`,记录层数、单元类型分布、密度等,用于后续分析/分层采样。
4) 与训练集集成
- `configs/base_config.yaml` 新增:
- `paths.synthetic_dir: data/synthetic/png`
- `training.use_synthetic_ratio: 0.0~1.0`(混合采样比例;例如 0.3 表示 30% 合成样本)
-`train.py` 中:
-`use_synthetic_ratio>0`,构建一个 `ICLayoutTrainingDataset` 指向合成 PNG 目录;
- 实现简单的比例采样器或 `ConcatDataset + WeightedRandomSampler` 以按比例混合真实与合成样本。
5) 质量与稳健性检查
- 可视化抽样:随机展示若干 PNG检查层次颜色、对比度、线宽是否清晰
- 分布对齐:统计真实数据与合成数据的连线长度分布、拓扑度量(如节点度、环路数量),做基础分布对齐;
- 训练烟雾测试:仅用 100200 个合成样本跑 12 个 epoch确认训练闭环无错误、loss 正常下降。
6) 基准验证与复盘
-`tests/benchmark_grid.py``tests/benchmark_backbones.py` 增加一组“仅真实 / 真实+合成”的对照实验;
- 记录 mAP/匹配召回/描述子一致性等指标,评估增益;
- 产出 `docs/Performance_Benchmark.md` 的对比表格。
## 🔴 模型架构优化Feature Work 第二部分)
### 验收标准 (Acceptance Criteria)
目标:在保证现有精度的前提下,提升特征提取效率与推理速度;为后续注意力机制与多尺度策略提供更强的特征基础。
- Elastic 变形:
- [ ] 训练数据可视化(含 H 网格叠加)无几何错位;
- [ ] 训练前若干 step loss 无异常尖峰,长期收敛不劣于 baseline
- [ ] 可通过配置无缝开/关与调参。
- 合成数据:
- [ ] 能批量生成带多层元素的 GDS 文件并成功转为 PNG
- [ ] 训练脚本可按设定比例混合采样真实与合成样本;
- [ ] 在小规模对照实验中,验证指标有稳定或可解释的变化(不劣化)。
### 总体验收标准(全局)
- [ ] 训练/验证流程在新骨干和注意力方案下均可跑通,无崩溃/NaN。
- [ ] 在代表性验证集上最终指标IoU/mAP不低于当前 VGG-16 基线;若下降需给出改进措施或回滚建议。
- [ ] 推理时延或显存占用至少一种维度优于基线,或达到“相当 + 结构可扩展”的工程收益。
- [ ] 关键改动均通过配置开关控制,可随时回退。
### 风险与规避 (Risks & Mitigations)
---
- 非刚性变形破坏 H 的风险:仅在生成 homography 前对基准 patch 施加 Elastic或在两图上施加相同变形但更新 H=f∘H∘f⁻¹当前计划采用前者简单且稳定
- GDS → PNG 渲染差异:优先使用 `klayout`,保持工业级渲染一致性;无 `klayout` 时使用 SVG→PNG 备选路径。
- 合成分布与真实分布不匹配:通过密度与单元类型分布约束进行对齐,并在训练中控制混合比例渐进提升。
## 2.1 实验更现代的骨干网络Backbone
### 里程碑与时间估算 (Milestones & ETA)
优先级:🟠 中 | 预计工期:~1 周 | 产出:可切换的 backbone 实现 + 对照报告
## 二、实现状态与使用说明2025-10-20 更新)
### 设计要点(小合约)
- 输入:与现有 `RoRD` 一致的图像张量 B×C×H×W。
- 输出:供检测头/描述子头使用的中高层特征张量通道数因骨干不同而异VGG:512、ResNet34:512、Eff-B0:1280
- 约束:不改变下游头部的接口形状(头部输入通道需根据骨干进行对齐适配)
- 失败模式:通道不匹配/梯度不通/预训练权重未正确加载/收敛缓慢。
- Elastic 变形已按计划集成:
- 开关与参数:见 `configs/base_config.yaml` 下的 `augment.elastic``augment.photometric`
- 数据集实现:`data/ic_dataset.py``ICLayoutTrainingDataset`
- 可视化验证:`tools/preview_dataset.py --dir <png_dir> --n 8 --elastic`
### 配置扩展YAML
`configs/base_config.yaml` 增加(或确认存在):
- 合成数据生成与渲染:
- 生成 GDS`tools/generate_synthetic_layouts.py --out-dir data/synthetic/gds --num 100 --seed 42`
- 转换 PNG`tools/layout2png.py --in data/synthetic/gds --out data/synthetic/png --dpi 600`
- 训练混采:在 `configs/base_config.yaml` 设置 `synthetic.enabled: true``synthetic.png_dir: data/synthetic/png``synthetic.ratio: 0.3`
```yaml
model:
backbone:
name: "vgg16" # 可选vgg16 | resnet34 | efficientnet_b0
pretrained: true
# 用于选择抽取的特征层(按不同骨干约定名称)
feature_layers:
vgg16: ["relu3_3", "relu4_3"]
resnet34: ["layer3", "layer4"]
efficientnet_b0: ["features_5", "features_7"]
- 训练脚本:
- `train.py` 已接入真实/合成混采ConcatDataset + WeightedRandomSampler验证集仅用真实数据
- TensorBoard 文本摘要记录数据构成mix 开关、比例、样本量)。
注意:若未安装 KLayout可自动回退 gdstk+SVG 路径;显示效果可能与 KLayout 存在差异。
- D1Elastic 集成 + 可视化验证(代码改动与测试)
- D2合成生成器初版GDS 生成 + PNG 渲染脚本)
- D3训练混合采样接入 + 小规模基准
- D4参数扫与报告更新Performance_Benchmark.md
### 一键流水线(生成 → 渲染 → 预览 → 训练)
1) 生成 GDS合成版图
```bash
uv run python tools/generate_synthetic_layouts.py --out_dir data/synthetic/gds --num 200 --seed 42
```
### 代码改动建议
- 文件:`models/rord.py`
1) 在 `__init__` 中根据 `cfg.model.backbone.name` 动态构建骨干:
- vgg16现状保持
- resnet34`torchvision.models.resnet34(weights=IMAGENET1K_V1)` 构建;保存 `layer3/layer4` 输出。
- efficientnet_b0`torchvision.models.efficientnet_b0(weights=IMAGENET1K_V1)` 构建;保存末两段 `features` 输出。
2) 为不同骨干提供统一的“中间层特征导出”接口(注册 forward hook 或显式调用子模块)。
3) 依据所选骨干的输出通道,调整检测头与描述子头的输入通道(如使用 1×1 conv 过渡层以解耦通道差异)。
4) 保持现有前向签名与返回数据结构不变(训练/推理兼容)。
2) 渲染 PNGKLayout 优先,自动回退 gdstk+SVG
```bash
uv run python tools/layout2png.py --in data/synthetic/gds --out data/synthetic/png --dpi 600
```
### 进展更新2025-10-20
- 已完成:在 `models/rord.py` 集成多骨干选择(`vgg16`/`resnet34`/`efficientnet_b0`),并实现统一的中间层抽取函数 `_extract_c234`(可后续重构为 `build_backbone`/`extract_features` 明确接口)。
- 已完成FPN 通用化,基于 C2/C3/C4 构建 P2/P3/P4按骨干返回正确的 stride。
- 已完成:单图前向 Smoke Test三种骨干单尺度与 FPN均通过。
- 已完成CPU 环境 A/B 基准(单尺度 vs FPN`docs/description/Performance_Benchmark.md`
- 待完成GPU 环境基准(速度/显存)、基于真实数据的精度评估与收敛曲线对比。
3) 预览训练对(核验增强/H 一致性
```bash
uv run python tools/preview_dataset.py --dir data/synthetic/png --out preview.png --n 8 --elastic
```
### 落地步骤Checklist
- [x]`models/rord.py` 增加/落地骨干构建与中间层抽取逻辑(当前通过 `_extract_c234` 实现)。
- [x] 接入 ResNet-34返回等价中高层特征layer2/3/4通道≈128/256/512
- [x] 接入 EfficientNet-B0返回 `features[2]/[3]/[6]`(约 24/40/192FPN 以 1×1 横向连接对齐到 `fpn_out_channels`
- [x] 头部适配单尺度头使用骨干高层通道数FPN 头统一使用 `fpn_out_channels`
- [ ] 预训练权重:支持 `pretrained=true` 加载;补充权重加载摘要打印(哪些层未命中)。
- [x] 单图 smoke test前向通过、无 NaN三种骨干单尺度与 FPN
### 评测与选择A/B 实验)
- [ ] 在固定数据与超参下,比较 vgg16/resnet34/efficientnet_b0
- 收敛速度loss 曲线 0-5 epoch
- 推理速度ms / 2048×2048与显存GB[CPU 初步结果已产出GPU 待复测;见 `docs/description/Performance_Benchmark.md`]
- 验证集 IoU/mAP真实数据集待跑
- [ ] 形成表格与可视化图给出选择结论与原因CPU 版初稿已在报告中给出观察)。
- [ ] 若新骨干在任一关键指标明显受损,则暂缓替换,仅保留为可切换实验选项。
### 验收标准2.1
- [ ] 三种骨干方案均可训练与推理(当前仅验证推理,训练与收敛待验证);
- [ ] 最终入选骨干在 IoU/mAP 不低于 VGG 的前提下,带来显著的速度/显存优势之一;
- [x] 切换完全配置化(无需改代码)。
### 风险与回滚2.1
- 通道不匹配导致维度错误 → 在进入头部前统一使用 1×1 conv 适配;
- 预训练权重与自定义层名不一致 → 显式映射并记录未加载层;
- 收敛变慢 → 暂时提高训练轮数、调学习率/BN 冻结策略;不达标即回滚 `backbone.name=vgg16`
---
## 2.2 集成注意力机制CBAM / SE-Net
优先级:🟠 中 | 预计工期:~710 天 | 产出:注意力增强的 RoRD 变体 + 对照报告
### 模块选择与嵌入位置
- 方案 ACBAM通道注意 + 空间注意),插入至骨干高层与两类头部之前;
- 方案 BSE-Net通道注意轻量但仅通道维插入多个阶段以增强稳定性
- 建议:先实现 CBAM保留 SE 作为备选开关。
### 配置扩展YAML
4) 在 YAML 中开启混采与 Elastic示例
```yaml
model:
attention:
synthetic:
enabled: true
png_dir: data/synthetic/png
ratio: 0.3
augment:
elastic:
enabled: true
type: "cbam" # 可选cbam | se | none
places: ["backbone_high", "det_head", "desc_head"]
# 可选超参reduction、kernel_size 等
reduction: 16
spatial_kernel: 7
alpha: 40
sigma: 6
alpha_affine: 6
prob: 0.3
```
### 代码改动建议
- 文件:`models/rord.py`
1) 实现 `CBAM``SEBlock` 模块(或从可靠实现迁移),提供简洁 forward。
2) 在 `__init__` 中依据 `cfg.model.attention` 决定在何处插入:
- backbone 高层输出后(增强高层语义的判别性);
- 检测头、描述子头输入前(分别强化不同任务所需特征)。
3) 注意保持张量尺寸不变;若引入残差结构,保证与原路径等价时可退化为恒等映射。
5) 开始训练
```bash
uv run python train.py --config configs/base_config.yaml
```
### 落地步骤Checklist
- [ ] 实现 `CBAM`通道注意MLP/Avg+Max Pool+ 空间注意7×7 conv
- [ ] 实现 `SEBlock`Squeeze全局池化+ ExcitationMLP, reduction
- [ ]`RoRD` 中用配置化开关插拔注意力,默认关闭。
- [ ] 在进入检测/描述子头前分别测试开启/关闭注意力的影响。
- [ ] 记录注意力图(可选):导出中间注意图用于可视化对比。
可选:使用单脚本一键执行(含配置写回
```bash
uv run python tools/synth_pipeline.py --out_root data/synthetic --num 200 --dpi 600 \
--config configs/base_config.yaml --ratio 0.3 --enable_elastic
```
### 训练与评估
- [ ] 以入选骨干为基线,分别开启 `cbam``se` 进行对照;
- [ ] 记录:训练损失、验证 IoU/mAP、推理时延/显存;
- [ ] 观察注意力图是否集中在关键几何(边角/交点/突变);
- [ ] 若带来过拟合迹象(验证下降),尝试减弱注意力强度或减少插入位置。
### 参数建议与经验
### 验收标准2.2
- [ ] 模型在开启注意力后稳定训练,无数值异常;
- [ ] 指标不低于无注意力基线;若提升则量化收益;
- [ ] 配置可一键关闭以回退。
- 渲染 DPI600900 通常足够,图形极细时可提高到 1200注意磁盘与 IO
- 混采比例 synthetic.ratio
- 数据少(<500 可取 0.30.5
- 数据中等5002000 建议 0.20.3
- 数据多>2000 张)建议 0.10.2 以免分布偏移。
- Elastic 强度:从 alpha=40, sigma=6 开始;若描述子对局部形变敏感,可小步上调 alpha 或 prob。
### 风险与回滚2.2
- 注意力导致过拟合或梯度不稳 → 降低 reduction、减少插入点、启用正则
- 推理时延上升明显 → 对注意力路径进行轻量化(如仅通道注意或更小 kernel
### 质量检查清单(建议在首次跑通后执行
---
- 预览拼图无明显几何错位orig/rot 对应边界对齐合理)。
- 训练日志包含混采信息real/syn 样本量、ratio、启停状态
- 若开启 Elastic训练初期 loss 无异常尖峰,长期收敛不劣于 baseline。
- 渲染 PNG 与 GDS 在关键层上形态一致(优先使用 KLayout
## 工程与度量配套
### 常见问题与排查FAQ
### 实验记录(建议)
- 在 TensorBoard 中新增:
- `arch/backbone_name``arch/attention_type`Text/Scalar
- `train/loss_total``eval/iou_metric``eval/map`
- 推理指标:`infer/ms_per_image``infer/vram_gb`
### 对照报告模板(最小集)
- 数据集与配置摘要(随机种子、批大小、学习率、图像尺寸)。
- 三个骨干 + 注意力开关的结果表(速度/显存/IoU/mAP
- 结论与落地选择(保留/关闭/待进一步实验)。
---
## 排期与里程碑(建议)
- M11 天):骨干切换基础设施与通道适配层;单图 smoke 测试。
- M223 天ResNet34 与 EfficientNet-B0 接入与跑通;
- M312 天A/B 评测与结论;
- M434 天):注意力模块接入、训练对照、报告输出。
---
## 相关参考
- 源文档:`docs/feature_work.md` 第二部分(模型架构)
- 阶段规划:`docs/todos/`
- 配置系统:`configs/base_config.yaml`
- klayout: command not found
- 方案A安装系统级 KLayout 并确保可执行文件在 PATH
- 方案B暂用 gdstk+SVG 回退(外观可能略有差异)。
- cairosvg 报错或 SVG 不生成
- 升级 `cairosvg``gdstk`;确保磁盘有写入权限;检查 `.svg` 是否被安全软件拦截
- gdstk 版本缺少 write_svg
- 尝试升级 gdstk脚本已做 library 与 cell 双路径兼容,仍失败则优先使用 KLayout。
- 训练集为空或样本过少
- 检查 `paths.layout_dir``synthetic.png_dir` 是否存在且包含 .pngratio>0 但 syn 目录为空会自动回退仅真实数据

View File

@@ -17,6 +17,53 @@
- 备注:本次测试在 CPU 上进行,`gpu_mem_mb` 始终为 0。
## 注意力 A/BCPUresnet34512×512runs=10places=backbone_high+desc_head
| Attention | Single Mean ± Std | FPN Mean ± Std |
|-----------|-------------------:|----------------:|
| none | 97.57 ± 0.55 | 124.57 ± 0.48 |
| se | 101.48 ± 2.13 | 123.12 ± 0.50 |
| cbam | 119.80 ± 2.38 | 123.11 ± 0.71 |
观察:
- 单尺度路径对注意力类型更敏感CBAM 开销相对更高SE 较轻;
- FPN 路径耗时在本次设置下差异很小(可能因注意力仅在 `backbone_high/desc_head`,且 FPN 头部计算占比较高)。
复现实验:
```zsh
PYTHONPATH=. uv run python tests/benchmark_attention.py \
--device cpu --image-size 512 --runs 10 \
--backbone resnet34 --places backbone_high desc_head
```
## 三维基准Backbone × Attention × Single/FPN
环境CPU输入 1×3×512×512重复 3 次places=backbone_high,desc_head。
| Backbone | Attention | Single Mean ± Std (ms) | FPN Mean ± Std (ms) |
|------------------|-----------|-----------------------:|--------------------:|
| vgg16 | none | 351.65 ± 1.88 | 719.33 ± 3.95 |
| vgg16 | se | 349.76 ± 2.00 | 721.41 ± 2.74 |
| vgg16 | cbam | 354.45 ± 1.49 | 744.76 ± 29.32 |
| resnet34 | none | 90.99 ± 0.41 | 117.22 ± 0.41 |
| resnet34 | se | 90.78 ± 0.47 | 115.91 ± 1.31 |
| resnet34 | cbam | 96.50 ± 3.17 | 111.09 ± 1.01 |
| efficientnet_b0 | none | 40.45 ± 1.53 | 127.30 ± 0.09 |
| efficientnet_b0 | se | 46.48 ± 0.26 | 142.35 ± 6.61 |
| efficientnet_b0 | cbam | 47.11 ± 0.47 | 150.99 ± 12.47 |
复现实验:
```zsh
PYTHONPATH=. uv run python tests/benchmark_grid.py \
--device cpu --image-size 512 --runs 3 \
--backbones vgg16 resnet34 efficientnet_b0 \
--attentions none se cbam \
--places backbone_high desc_head
```
运行会同时输出控制台摘要并保存 JSON`benchmark_grid.json`
## 观察与解读
- vgg16 明显最慢FPN 额外的横向/上采样代价在 CPU 上更突出(>2×
- resnet34 在单尺度上显著快于 vgg16FPN 增幅较小(约 +25%)。

View File

@@ -1,5 +1,41 @@
# 后续工作
## 新增功能汇总2025-10-20
- 数据增强:集成 `albumentations` 的 ElasticTransform配置在 `augment.elastic`),并保持几何配对的 H 正确性。
- 合成数据:新增 `tools/generate_synthetic_layouts.py`GDS 生成)与 `tools/layout2png.py`GDS→PNG 批量转换)。
- 训练混采:`train.py` 接入真实/合成混采,按 `synthetic.ratio` 使用加权采样;验证集仅使用真实数据。
- 可视化:`tools/preview_dataset.py` 快速导出训练对的拼图图,便于人工质检。
## 立即可做的小改进
-`layout2png.py` 增加图层配色与线宽配置(读取 layermap 或命令行参数)。
-`ICLayoutTrainingDataset` 添加随机裁剪失败时的回退逻辑(极小图像)。
- 增加最小单元测试:验证 ElasticTransform 下 H 的 warp 一致性(采样角点/网格点)。
- 在 README 增加一键命令合集(生成合成数据 → 渲染 → 预览 → 训练)。
## 一键流程与排查(摘要)
**一键命令**
```bash
uv run python tools/generate_synthetic_layouts.py --out_dir data/synthetic/gds --num 200 --seed 42
uv run python tools/layout2png.py --in data/synthetic/gds --out data/synthetic/png --dpi 600
uv run python tools/preview_dataset.py --dir data/synthetic/png --out preview.png --n 8 --elastic
uv run python train.py --config configs/base_config.yaml
```
或使用单脚本一键执行(含配置写回):
```bash
uv run python tools/synth_pipeline.py --out_root data/synthetic --num 200 --dpi 600 \
--config configs/base_config.yaml --ratio 0.3 --enable_elastic
```
**参数建议**DPI=600900ratio=0.20.3首训Elastic 从 alpha=40/sigma=6 起步。
**FAQ**
- 找不到 klayout安装后确保在 PATH无则使用回退渲染外观可能有差异
- SVG/PNG 未生成检查写权限与版本cairosvg/gdstk或优先用 KLayout。
本文档整合了 RoRD 项目的优化待办清单和训练需求,用于规划未来的开发和实验工作。
---
@@ -12,18 +48,70 @@
> *目标:提升模型的鲁棒性和泛化能力,减少对大量真实数据的依赖。*
- [ ] **引入弹性变形 (Elastic Transformations)**
- [x] **引入弹性变形 (Elastic Transformations)**
- **✔️ 价值**: 模拟芯片制造中可能出现的微小物理形变,使模型对非刚性变化更鲁棒。
- **📝 执行方案**:
1. 添加 `albumentations` 库作为项目依赖。
2.`train.py``ICLayoutTrainingDataset` 类中,集成 `A.ElasticTransform` 到数据增强管道中。
- [ ] **创建合成版图数据生成器**
- [x] **创建合成版图数据生成器**
- **✔️ 价值**: 解决真实版图数据获取难、数量少的问题,通过程序化生成大量多样化的训练样本。
- **📝 执行方案**:
1. 创建一个新脚本,例如 `tools/generate_synthetic_layouts.py`
2. 利用 `gdstk` 库 编写函数,程序化地生成包含不同尺寸、密度和类型标准单元的 GDSII 文件。
3. 结合 `tools/layout2png.py` 的逻辑,将生成的版图批量转换为 PNG 图像,用于扩充训练集。
- [ ] **基于扩散生成的版图数据生成器(研究型)**
- **🎯 目标**: 使用扩散模型Diffusion生成具备“曼哈顿几何特性”的版图切片raster PNG作为现有程序化合成的补充来源进一步提升数据多样性与风格覆盖。
- **📦 产物**:
- 推理脚本(计划): `tools/diffusion/sample_layouts.py`
- 训练脚本(计划): `tools/diffusion/train_layout_diffusion.py`
- 数据集打包与统计工具(计划): `tools/diffusion/prepare_patch_dataset.py`
- **🧭 范围界定**:
- 优先生成单层的二值/灰度光栅图像256512 像素方形 patch
- 短期不追求多层/DRC 严格约束的工业可制造性;定位为数据增强来源,而非版图设计替代。
- **🛤️ 技术路线**:
- 路线 A首选工程落地快: 基于 HuggingFace diffusers 的 Latent Diffusion/Stable Diffusion 微调;输入为 1 通道灰度(训练时复制到 3 通道或改 UNet 首层),输出为版图样式图像。
- 路线 B结构引导: 加入 ControlNet/T2I-Adapter 条件,如 Sobel/Canny/直方结构图、粗草图Scribble、程序化几何草图以控制生成的总体连通性与直角占比。
- 路线 C两阶段: 先用程序化生成器输出“草图/骨架”(低细节),再用扩散模型进行“风格化/细化”。
- **🧱 数据表示与条件**:
- Raster 表示PNG二值/灰度可预生成条件图Sobel、Canny、距离变换、形态学骨架等。
- 条件输入建议:`[image (target-like), edge_map, skeleton]` 的任意子集PoC 以 edge_map 为主。
- **🧪 训练配置(建议起点)**:
- 图像尺寸256PoC后续 384/512。
- 批大小816依显存学习率 1e-4训练步数 100k300k。
- 数据来源:`data/**/png` 聚合 + 程序合成数据 `data/synthetic/png`;采样时按风格/密度分层均衡。
- 预处理:随机裁剪非空 patch、二值阈值均衡、弱摄影增强噪声/对比度)控制在小幅度范围。
- **🧰 推理与后处理**:
- 采样参数:采样步数 30100、guidance scale 37、seed 固定以便复现。
- 后处理Otsu/固定阈值二值化,形态学开闭/细化断点连接morphology bridge可选矢量化`gdstk` 轮廓化)回写 GDS。
- **📈 评估指标**:
- 结构统计对齐:水平/垂直边比例、连通组件面积分布、线宽分布、密度直方图与真实数据 KL 距离。
- 规则近似性:形态学开闭后碎片率、连通率、冗余孤立像素占比。
- 训练收益:将扩散样本混入 `train.py`,对 IoU/mAP/收敛轮数的提升幅度(与仅程序合成相比)。
- **🔌 与现有管线集成**:
-`tools/synth_pipeline.py` 增加 `--use_diffusion``--diffusion_dir`,将扩散生成的 PNG 目录并入训练数据目录。
- 配置建议新增:
```yaml
synthetic:
diffusion:
enabled: false
png_dir: data/synthetic_diff/png
ratio: 0.1 # 与真实/程序合成的混采比例
```
- 预览与质检:重用 `tools/preview_dataset.py`,并用 `tools/validate_h_consistency.py` 跳过 H 检查(扩散输出无严格几何配对),改用结构统计工具(后续补充)。
- **🗓️ 里程碑**:
1. 第 1 周数据准备与统计、PoC预训练 SD + ControlNet-Edge 的小规模微调256 尺寸)。
2. 第 23 周扩大训练≥50k patch加入骨架/距离变换条件,完善后处理。
3. 第 4 周:与训练管线集成(混采/可视化),对比“仅程序合成 vs 程序合成+扩散”的增益。
4. 第 5 周:文档、示例权重与一键脚本(可选导出 ONNX/TensorRT 推理)。
- **⚠️ 风险与缓解**:
- 结构失真/非曼哈顿增强条件约束ControlNet提高形态学后处理强度两阶段草图→细化
- 模式崩塌/多样性不足分层采样、数据重采样、EMA、风格/密度条件编码。
- 训练数据不足:先用程序合成预训练,再混入少量真实数据微调。
- **📚 参考与依赖**:
- 依赖:`diffusers`, `transformers`, `accelerate`, `albumentations`, `opencv-python`, `gdstk`
- 参考Latent Diffusion、Stable Diffusion、ControlNet、T2I-Adapter 等论文与开源实现
### 二、 模型架构 (Model Architecture)
> *目标:提升模型的特征提取效率和精度,降低计算资源消耗。*
@@ -40,11 +128,19 @@
- 代码:`models/rord.py`
- 基准:`tests/benchmark_backbones.py`
- 文档:`docs/description/Backbone_FPN_Test_Change_Notes.md`, `docs/description/Performance_Benchmark.md`
- [ ] **集成注意力机制 (Attention Mechanism)**
- **✔️ 价值**: 引导模型自动关注版图中的关键几何结构(如边角、交点),忽略大面积的空白或重复区域,提升特征质量。
- **📝 执行方案**:
1. 寻找一个可靠的注意力模块实现,如 CBAM 或 SE-Net
2.`models/rord.py` 中,将该模块插入到 `self.backbone` 和两个 `head` 之间
- [x] **集成注意力机制 (Attention Mechanism)**
- **✔️ 价值**: 引导模型关注关键几何结构、弱化冗余区域,提升特征质量与匹配稳定性
- **✅ 当前进展2025-10-20**:
- 已集成可切换的注意力模块:`SE` 与 `CBAM`;支持通过 `model.attention.enabled/type/places` 配置开启与插入位置(`backbone_high`/`det_head`/`desc_head`
- 已完成 CPU A/B 基准none/se/cbamresnet34places=backbone_high+desc_head详见 `docs/description/Performance_Benchmark.md`;脚本:`tests/benchmark_attention.py`
- **📝 后续动作**:
1. 扩展更多模块ECA、SimAM、CoordAttention、SKNet并保持统一接口与配置。
2. 进行插入位置消融(仅 backbone_high / det_head / desc_head / 组合),在 GPU 上复测速度与显存峰值。
3. 在真实数据上评估注意力开/关的 IoU/mAP 与收敛差异。
- **参考**:
- 代码:`models/rord.py`
- 基准:`tests/benchmark_attention.py`, `tests/benchmark_grid.py`
- 文档:`docs/description/Performance_Benchmark.md`
### 三、 训练与损失函数 (Training & Loss Function)
@@ -181,6 +277,24 @@
--output-file export.md
```
### ✅ 三维基准对比Backbone × Attention × Single/FPN
- **文件**: `tests/benchmark_grid.py` ✅JSON 输出:`benchmark_grid.json`
- **功能**:
- 遍历 `backbone × attention` 组合当前vgg16/resnet34/efficientnet_b0 × none/se/cbam
- 统计单尺度与 FPN 前向的平均耗时与标准差
- 控制台摘要 + JSON 结果落盘
- **使用**:
```bash
PYTHONPATH=. uv run python tests/benchmark_grid.py \
--device cpu --image-size 512 --runs 3 \
--backbones vgg16 resnet34 efficientnet_b0 \
--attentions none se cbam \
--places backbone_high desc_head
```
- **结果**:
- 已将 CPU512×512runs=3结果写入 `docs/description/Performance_Benchmark.md` 的“三维基准”表格,原始数据位于仓库根目录 `benchmark_grid.json`。
### 📚 新增文档
| 文档 | 大小 | 说明 |
@@ -263,6 +377,8 @@
| | 全面评估指标 | ✅ | 2025-10-19 |
| **新增工作** | 性能基准测试 | ✅ | 2025-10-20 |
| | TensorBoard 导出工具 | ✅ | 2025-10-20 |
| **二. 模型架构** | 注意力机制SE/CBAM 基线) | ✅ | 2025-10-20 |
| **新增工作** | 三维基准对比Backbone×Attention×Single/FPN | ✅ | 2025-10-20 |
### 未完成的工作项(可选优化)
@@ -270,8 +386,52 @@
|------|--------|--------|------|
| **一. 数据策略与增强** | 弹性变形增强 | 🟡 低 | 便利性增强 |
| | 合成版图生成器 | 🟡 低 | 数据增强 |
| **二. 模型架构** | 现代骨干网络 | 🟠 中 | 性能优化 |
| | 注意力机制 | 🟠 中 | 性能优化 |
| | 基于扩散的版图生成器 | 🟠 中 | 研究型:引入结构条件与形态学后处理,作为数据多样性来源 |
---
## 扩散生成集成的实现说明(新增)
- 配置新增节点(已添加到 `configs/base_config.yaml`:
```yaml
synthetic:
enabled: false
png_dir: data/synthetic/png
ratio: 0.0
diffusion:
enabled: false
png_dir: data/synthetic_diff/png
ratio: 0.0
```
- 训练混采(已实现于 `train.py`:
- 支持三源混采:真实数据 + 程序合成 (`synthetic`) + 扩散合成 (`synthetic.diffusion`)。
- 目标比例:`real = 1 - (syn_ratio + diff_ratio)`;使用 `WeightedRandomSampler` 近似。
- 验证集仅使用真实数据,避免评估偏移。
- 一键管线扩展(已实现于 `tools/synth_pipeline.py`:
- 新增 `--diffusion_dir` 参数:将指定目录的 PNG 并入配置文件的 `synthetic.diffusion.png_dir` 并开启 `enabled=true`。
- 不自动采样扩散图片(避免引入新依赖),仅做目录集成;后续可在该脚本中串联 `tools/diffusion/sample_layouts.py`。
- 新增脚本骨架(`tools/diffusion/`:
- `prepare_patch_dataset.py`: 从现有 PNG 构建 patch 数据集与条件图CLI 骨架 + TODO
- `train_layout_diffusion.py`: 微调扩散模型的训练脚本CLI 骨架 + TODO
- `sample_layouts.py`: 使用已训练权重进行采样输出 PNGCLI 骨架 + TODO
- 使用建议:
1) 将扩散采样得到的 PNG 放入某目录,例如 `data/synthetic_diff/png`。
2) 运行:
```bash
uv run python tools/synth_pipeline.py \
--out_root data/synthetic \
--num 200 --dpi 600 \
--config configs/base_config.yaml \
--ratio 0.3 \
--diffusion_dir data/synthetic_diff/png
```
3) 在 YAML 中按需设置 `synthetic.diffusion.ratio`(例如 0.1),训练时即自动按比例混采。
| **二. 模型架构** | 更多注意力模块ECA/SimAM/CoordAttention/SKNet | 🟠 中 | 扩展与消融 |
| **三. 训练与损失** | 损失加权自适应 | 🟠 中 | 训练优化 |
| | 困难样本采样 | 🟡 低 | 训练优化 |

View File

@@ -82,6 +82,25 @@
- [ ] 特征维度一致性检查
- [ ] GPU/CPU 切换测试
#### 2.3 基准与评估补充(来自 NextStep 2.1 未完项)
- [ ] GPU 环境 A/B 基准(速度/显存)
- [ ] 使用 `tests/benchmark_backbones.py` 在 GPU 上复现20 次512×512记录 ms 与 VRAM
- [ ] 追加结果到 `docs/description/Performance_Benchmark.md`
- [ ] GPU 环境 Attention A/B 基准(速度/显存)
- [ ] 使用 `tests/benchmark_attention.py` 在 GPU 上复现10 次512×512覆盖 `places` 组合(`backbone_high`/`det_head`/`desc_head`
- [ ] 记录平均耗时与 VRAM 峰值,追加摘要到 `docs/description/Performance_Benchmark.md`
- [ ] 三维网格基准Backbone × Attention × Single/FPN
- [ ] 使用 `tests/benchmark_grid.py` 在 GPU 上跑最小矩阵(例如 3×3runs=5
- [ ] 将 JSON 存入 `results/benchmark_grid_YYYYMMDD.json`,在性能文档中追加表格摘要并链接 JSON
- [ ] 真实数据集精度评估IoU/mAP 与收敛曲线)
- [ ] 固定数据与超参,训练 5 个 epoch记录 loss 曲线
- [ ] 在验证集上评估 IoU/mAP并与 vgg16 基线对比
- [ ] 形成对照表与初步结论
**验收标准**:
- [ ] 所有测试用例通过
- [ ] 推理结果符合预期维度和范围
@@ -143,6 +162,12 @@
- [ ] 日志查看方法
- [ ] GPU 内存不足处理
#### 3.4 预训练权重加载摘要(来自 NextStep 2.1 未完项)
- [x]`models/rord.py` 加载 `pretrained=true` 时,打印未命中层摘要
- [x] 记录:加载成功/跳过的层名数量
- [x] 提供简要输出missing/unexpected keys参数量统计实现`models/rord.py::_summarize_pretrained_load`
#### 3.2 编写配置参数文档
- [ ] 创建 `docs/CONFIG.md`

View File

@@ -218,6 +218,41 @@
---
### 4. 注意力机制集成(来自 NextStep 2.2
**目标**: 在骨干高层与头部前集成 CBAM / SE并量化收益
#### 4.1 模块实现与插桩
- [ ] 实现 `CBAM``SEBlock`(或迁移可靠实现)
- [ ]`models/rord.py` 通过配置插拔:`attention.enabled/type/places`
- [ ] 确保 forward 尺寸不变,默认关闭可回退
#### 4.2 训练与评估
- [ ] 选择入选骨干为基线,分别开启 `cbam``se`
- [ ] 记录训练损失、验证 IoU/mAP、推理时延/显存
- [ ] 可选:导出可视化注意力图
**验收标准**:
- [ ] 训练稳定,无数值异常
- [ ] 指标不低于无注意力基线;若提升则量化收益
- [ ] 配置可一键关闭以回退
#### 4.3 扩展模块与插入位置消融
- [ ] 扩展更多注意力模块ECA、SimAM、CoordAttention、SKNet
- [ ]`models/rord.py` 实现统一接口与注册表
- [ ]`configs/base_config.yaml` 增加可选项说明
- [ ] 插入位置消融
- [ ]`backbone_high` / 仅 `det_head` / 仅 `desc_head` / 组合
- [ ] 使用 `tests/benchmark_attention.py` 统一基准,记录 Single/FPN 时延与 VRAM
- [ ]`docs/description/Performance_Benchmark.md` 增加“注意力插入位置”小节
**验收标准**:
- [ ] 所有新增模块 forward 通过,尺寸/类型与现有路径一致
- [ ] 基准结果可复现并写入文档
- [ ] 给出速度-精度权衡建议
---
## 🔄 实施流程
### 第 1 周: 实验管理集成