Files
RoRD-Layout-Recognation/README.md
2025-10-20 22:52:51 +08:00

482 lines
17 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# RoRD: 基于 AI 的集成电路版图识别
[//]: # (徽章占位符:您可以根据需要添加构建状态、版本号等徽章)
![Python Version](https://img.shields.io/badge/Python-3.12-blue)
![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg)
## ⚡ Quick Start含合成数据与H校验
```bash
# 一键生成→渲染→预览→H校验→写回配置开启合成混采与 Elastic
uv run python tools/synth_pipeline.py \
--out_root data/synthetic \
--num 50 \
--dpi 600 \
--config configs/base_config.yaml \
--ratio 0.3 \
--enable_elastic \
--validate_h --validate_n 6
```
提示zsh 下使用反斜杠续行时,确保每行末尾只有一个 `\` 且下一行不要粘连参数(避免如 `6uv` 这样的粘连)。
可选:为 KLayout 渲染指定图层配色/线宽/背景(示例:金属层绿色、过孔红色、黑底)
```bash
uv run python tools/layout2png.py \
--in data/synthetic/gds --out data/synthetic/png --dpi 800 \
--layermap '1/0:#00FF00,2/0:#FF0000' --line_width 2 --bgcolor '#000000'
```
## 📖 描述
本项目实现了 **RoRD (Rotation-Robust Descriptors)** 模型这是一种先进的局部特征匹配方法专用于集成电路IC版图的识别。
IC 版图在匹配时可能出现多种方向0°、90°、180°、270° 及其镜像RoRD 模型通过其**几何感知损失函数**和**曼哈顿结构优化**的设计,能够有效应对这一挑战。项目采用**几何结构学习**而非纹理学习的训练策略,专门针对 IC 版图的二值化、稀疏性、重复结构和曼哈顿几何特征进行了深度优化。
👉 增量报告与性能分析见:`docs/reports/Increment_Report_2025-10-20.md`
### ✨ 主要功能
* **模型实现**:基于 D2-Net 思路,使用 PyTorch 实现了适用于 IC 版图的 RoRD 模型,**专门针对几何结构学习优化**;支持可切换骨干(`vgg16` / `resnet34` / `efficientnet_b0`)。
* **数据加载**:提供了自定义的 `ICLayoutDataset` 类,用于加载光栅化的 IC 版图图像,支持**曼哈顿几何感知采样**。
* **训练脚本**:通过**几何感知损失函数**训练模型,学习**几何结构描述子**而非纹理特征,确保对二值化、稀疏性、重复结构的鲁棒性。
* **评估脚本**:可在验证集上评估模型性能,**专门针对IC版图特征**计算几何一致性指标。
* **匹配工具**:支持 FPN 多尺度推理与滑窗两种路径,并提供半径 NMS 去重;可直接输出多实例匹配结果。
* **灵活配置与日志**:引入 OmegaConf 驱动的 YAML 配置 (`configs/*.yaml`),配合 `utils.config_loader` 与 TensorBoard 监控实现参数/路径集中管理。
* **性能工具**:提供 FPN vs 滑窗的对标脚本与多骨干 A/B 基准脚本,便于快速评估速度/显存与精度。
## 🛠️ 安装
### 环境要求
* Python 3.8 或更高版本
* CUDA (可选, 推荐用于 GPU 加速)
### 依赖安装
**使用 uv推荐**
```bash
# 安装 uv如果尚未安装
pip install uv
# 安装项目依赖
uv sync
```
**使用 pip**
```bash
pip install -e .
```
## 🚀 使用方法
### 📁 项目结构
```
RoRD-Layout-Recognation/
├── configs/
│ └── base_config.yaml # YAML 配置入口
├── data/
│ └── ic_dataset.py # 数据集与数据接口
├── docs/
│ ├── data_description.md
│ ├── feature_work.md
│ ├── loss_function.md
│ └── NextStep.md
├── models/
│ └── rord.py # RoRD 模型与 FPN多骨干支持
├── utils/
│ ├── config_loader.py # YAML 配置加载与路径转换
│ ├── data_utils.py
│ └── transforms.py
├── losses.py # 几何感知损失集合
├── train.py # 训练脚本YAML + TensorBoard
├── evaluate.py # 评估脚本
├── match.py # 模板匹配脚本FPN / 滑窗 + NMS
├── tests/
│ ├── benchmark_fpn.py # FPN vs 滑窗性能对标
│ ├── benchmark_backbones.py # 多骨干 A/B 前向基准
│ ├── benchmark_attention.py # 注意力 none/se/cbam A/B 基准
│ └── benchmark_grid.py # 三维基准Backbone × Attention × Single/FPN
├── config.py # 兼容旧流程的 YAML 读取 shim
├── pyproject.toml
└── README.md
```
### 🧩 配置与模块化更新
- **YAML 配置中心**:所有路径与超参数集中存放在 `configs/*.yaml`,通过 `utils.config_loader.load_config` 统一解析CLI 的 `--config` 参数可切换实验配置,`to_absolute_path` 则保证相对路径相对配置文件解析。
- **旧配置兼容**`config.py` 现在仅作为兼容层,将 YAML 配置转换成原有的 Python 常量,便于逐步迁移历史代码。
- **损失与数据解耦**`losses.py` 汇总几何感知损失,`data/ic_dataset.py``utils/data_utils.py` 分离数据准备逻辑,便于扩展新的采样策略或损失项。
# 5. 运行 A/B 基准(骨干、注意力、三维网格)
PYTHONPATH=. uv run python tests/benchmark_backbones.py --device cpu --image-size 512 --runs 5
PYTHONPATH=. uv run python tests/benchmark_attention.py --device cpu --image-size 512 --runs 10 --backbone resnet34 --places backbone_high desc_head
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
- **日志体系**`logging` 配置节配合 TensorBoard 集成,`train.py``evaluate.py``match.py` 可统一写入 `log_dir/子任务/experiment_name`
- **模型配置扩展**
- `model.backbone.name`: `vgg16 | resnet34 | efficientnet_b0`
- `model.backbone.pretrained`: 是否加载 ImageNet 预训练
- `model.attention`: `enabled/type/places`(默认关闭,可选 `cbam` / `se`
- `model.fpn`: `enabled/out_channels/levels`
## 🚀 使用方法
### 📋 训练准备清单
在开始训练前,请确保完成以下准备:
#### 1. 数据准备
- **训练数据**准备PNG格式的布局图像如电路板布局、建筑平面图等
- **数据目录结构**
```
your_data_directory/
├── image1.png
├── image2.png
└── ...
```
#### 2. 配置文件修改
项目默认从 `configs/base_config.yaml` 读取训练、评估与日志参数。建议复制该文件并按实验命名,例如:
```bash
cp configs/base_config.yaml configs/exp_ic_baseline.yaml
```
在 YAML 中修改路径与关键参数:
```yaml
paths:
layout_dir: "数据集/训练图像目录"
save_dir: "输出目录(模型与日志)"
val_img_dir: "验证集图像目录"
val_ann_dir: "验证集标注目录"
template_dir: "模板图像目录"
training:
num_epochs: 50
batch_size: 8
learning_rate: 5.0e-5
logging:
use_tensorboard: true
log_dir: "runs"
experiment_name: "baseline"
```
> 保留 `config.py` 仅用于兼容旧版脚本;新流程全部通过 YAML + `utils.config_loader` 载入配置。
#### 3. 环境检查
确保已正确安装所有依赖:
```bash
python -c "import torch; print('PyTorch version:', torch.__version__)"
python -c "import cv2; print('OpenCV version:', cv2.__version__)"
```
### 🎯 开始训练
#### 基础训练
```bash
uv run python train.py --config configs/exp_ic_baseline.yaml
```
上述命令将读取 `configs/exp_ic_baseline.yaml` 中的路径和训练参数;若未指定 `--config`,脚本会回落到 `configs/base_config.yaml`。
#### 自定义训练参数
```bash
uv run python train.py \
--config configs/exp_ic_baseline.yaml \
--data_dir /override/layouts \
--save_dir /override/models \
--epochs 60 \
--batch_size 16 \
--lr 1e-4
```
#### 查看所有可用参数
```bash
python train.py --help
```
### 📊 训练监控
训练过程中会在 `SAVE_DIR` 目录下生成:
- 日志文件:`training_YYYYMMDD_HHMMSS.log`
- 最佳模型:`rord_model_best.pth`
- 最终模型:`rord_model_final.pth`
### 📈 TensorBoard 实验追踪
`configs/base_config.yaml` 中新增的 `logging` 区块用于控制 TensorBoard
```yaml
logging:
use_tensorboard: true # 是否启用 TensorBoard 记录
log_dir: "runs" # 日志根目录(相对/绝对路径均可)
experiment_name: "default" # 实验名称,将作为子目录名
```
需要临时覆盖时,可在命令行传入参数(以下命令均可用 `uv run` 直接执行):
```bash
uv run python train.py --log_dir logs --experiment_name exp001
uv run python evaluate.py --log_dir logs --experiment_name exp001
uv run python match.py --tb_log_matches --log_dir logs --experiment_name exp001
uv run python train.py --disable_tensorboard # 如需关闭记录
```
执行训练、评估或模板匹配后,通过下列命令启动 TensorBoard
```bash
uv run tensorboard --logdir runs
```
TensorBoard 中将展示:
- `train.py`:损失、学习率、梯度范数等随时间变化曲线;
- `evaluate.py`:精确率 / 召回率 / F1 分数;
- `match.py`(配合 `--tb_log_matches`):每个匹配实例的内点数量、尺度和总检测数量。
### 🚀 快速开始示例
```bash
# 1. 安装依赖
uv sync
# 2. 复制并编辑 YAML 配置
cp configs/base_config.yaml configs/exp_ic_baseline.yaml
# 根据数据路径与实验需求调整 paths/training/logging 字段
# 3. 开始训练
uv run python train.py --config configs/exp_ic_baseline.yaml
# 4. 使用训练好的模型进行匹配
uv run python match.py --config configs/exp_ic_baseline.yaml \
--model_path ./output/rord_model_final.pth \
--layout ./test/layout.png \
--template ./test/template.png \
--output ./result.png
```
### 4. 模板匹配
```bash
python match.py --model_path /path/to/your/models/rord_model_final.pth \
--layout /path/to/layout.png \
--template /path/to/template.png \
--output /path/to/result.png
```
### 5. 评估模型
```bash
python evaluate.py --model_path /path/to/your/models/rord_model_final.pth \
--val_dir /path/to/val/images \
--annotations_dir /path/to/val/annotations \
--templates_dir /path/to/templates
```
## 📦 数据准备
### 训练数据
* **格式**: PNG 格式的 IC 版图图像,可从 GDSII 或 OASIS 文件光栅化得到。
* **要求**: 数据集应包含多个版图图像,建议分辨率适中(例如 1024x1024
* **存储**: 将所有训练图像存放在一个目录中(例如 `path/to/layouts`)。
### 验证数据
* **图像**: PNG 格式的验证集图像,存储在指定目录(例如 `path/to/val/images`)。
* **模板**: 所有模板图像存储在单独的目录中(例如 `path/to/templates`)。
* **标注**: 真实标注信息以 JSON 格式提供,文件名需与对应的验证图像一致,并存储在指定目录(例如 `path/to/val/annotations`)。
JSON 标注文件示例:
```json
{
"boxes": [
{"template": "template1.png", "x": 100, "y": 200, "width": 50, "height": 50},
{"template": "template2.png", "x": 300, "y": 400, "width": 60, "height": 60}
]
}
```
## 🧠 模型架构 - IC版图专用优化版
RoRD 模型基于 D2-Net 架构,使用 VGG-16 作为骨干网络,**专门针对IC版图的几何特征进行了深度优化**。
### 网络结构创新
* **检测头**: 用于检测**几何边界关键点**输出二值化概率图专门针对IC版图的黑白边界优化
* **描述子头**: 生成 128 维的**几何结构描述子**,而非纹理描述子,具有以下特性:
- **曼哈顿几何感知**: 专门针对水平和垂直结构优化
- **重复结构区分**: 能有效区分相同图形的不同实例
- **二值化鲁棒性**: 对光照变化完全不变
- **稀疏特征优化**: 专注于真实几何结构而非噪声
### 核心创新 - 几何感知损失函数
**专为IC版图特征设计**
- **曼哈顿一致性损失**: 确保90度旋转下的几何一致性
- **稀疏性正则化**: 适应IC版图稀疏特征分布
- **二值化特征距离**: 强化几何边界特征,弱化灰度变化
- **几何感知困难负样本**: 基于结构相似性而非像素相似性选择负样本
## 🔎 推理与匹配FPN 路径与 NMS
项目已支持通过 FPN 单次推理产生多尺度特征,并在匹配阶段引入半径 NMS 去重以减少冗余关键点:
在 `configs/base_config.yaml` 中启用 FPN 与 NMS
```yaml
model:
fpn:
enabled: true
out_channels: 256
levels: [2, 3, 4]
backbone:
name: "vgg16" # 可选vgg16 | resnet34 | efficientnet_b0
pretrained: false
attention:
enabled: false
type: "none" # 可选none | cbam | se
places: [] # 插入位置backbone_high | det_head | desc_head
matching:
use_fpn: true
nms:
enabled: true
radius: 4
score_threshold: 0.5
```
运行匹配并将过程写入 TensorBoard
```bash
uv run python match.py \
--config configs/base_config.yaml \
--layout /path/to/layout.png \
--template /path/to/template.png \
--tb_log_matches
```
如需回退旧“图像金字塔”路径,将 `matching.use_fpn` 设为 `false` 即可。
也可使用 CLI 快捷开关临时覆盖:
```bash
# 关闭 FPN等同 matching.use_fpn=false
uv run python match.py --config configs/base_config.yaml --fpn_off \
--layout /path/to/layout.png --template /path/to/template.png
# 关闭关键点去重NMS
uv run python match.py --config configs/base_config.yaml --no_nms \
--layout /path/to/layout.png --template /path/to/template.png
```
### 训练策略 - 几何结构学习
模型通过**几何结构学习**策略进行训练:
- **曼哈顿变换生成训练对**: 利用90度旋转等曼哈顿变换
- **几何感知采样**: 优先采样水平和垂直方向的边缘点
- **结构一致性优化**: 学习几何结构描述子而非纹理特征
- **重复结构鲁棒性**: 有效处理IC版图中的大量重复图形
**关键区别**: 传统方法学习纹理特征,我们的方法**学习几何结构特征**完美适应IC版图的二值化、稀疏性、重复结构和曼哈顿几何特征。
## 📊 结果
可参考以下文档与脚本复现并查看最新结果:
- CPU 多骨干 A/B 基准512×5125 次):见 `docs/description/Performance_Benchmark.md`
- 三维基准Backbone × Attention × Single/FPN见 `docs/description/Performance_Benchmark.md` 与 `tests/benchmark_grid.py`
- FPN vs 滑窗对标脚本:`tests/benchmark_fpn.py`
- 多骨干 A/B 基准脚本:`tests/benchmark_backbones.py`
后续将在 GPU 与真实数据集上补充精度与速度的完整对标表格。
## 📄 许可协议
本项目根据 [Apache License 2.0](LICENSE.txt) 授权。
---
## 🧪 合成数据一键流程与常见问题
### 一键命令
```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
```
### YAML 关键片段
```yaml
synthetic:
enabled: true
png_dir: data/synthetic/png
ratio: 0.3
augment:
elastic:
enabled: true
alpha: 40
sigma: 6
alpha_affine: 6
prob: 0.3
```
### 参数建议
- DPI600900图形极细时可到 1200注意磁盘占用与 IO
- ratio数据少取 0.30.5;中等 0.20.3;数据多 0.10.2。
- Elasticalpha=40, sigma=6, prob=0.3 为安全起点。
### FAQ
- 找不到 `klayout`:安装系统级 KLayout 并加入 PATH或使用回退gdstk+SVG
- `cairosvg`/`gdstk` 报错:升级版本、确认写权限、检查输出目录存在。
- 训练集为空:检查 `paths.layout_dir` 与 `synthetic.png_dir` 是否存在且包含 .png若 syn 目录为空将自动仅用真实数据。
---
## 🧪 合成数据管线与可视化
### 1) 生成合成 GDS
```bash
uv run python tools/generate_synthetic_layouts.py --out_dir data/synthetic/gds --num 200 --seed 42
```
### 2) 批量转换 GDS → PNG
```bash
uv run python tools/layout2png.py --in data/synthetic/gds --out data/synthetic/png --dpi 600
```
若本机未安装 KLayout将自动回退到 gdstk+SVG 路径;图像外观可能与 KLayout 有差异。
### 3) 开启训练混采
在 `configs/base_config.yaml` 中设置:
```yaml
synthetic:
enabled: true
png_dir: data/synthetic/png
ratio: 0.3
```
### 4) 预览训练对(目检增强/H 一致性)
```bash
uv run python tools/preview_dataset.py --dir data/synthetic/png --out preview.png --n 8 --elastic
```
### 5) 开启/调整 Elastic 变形
```yaml
augment:
elastic:
enabled: true
alpha: 40
sigma: 6
alpha_affine: 6
prob: 0.3
photometric:
brightness_contrast: true
gauss_noise: true
```