从零跑通 CLAN 域适应:GTA5 到 Cityscapes 语义分割完整实战指南

📅 2026/8/24 1:55:38
从零跑通 CLAN 域适应:GTA5 到 Cityscapes 语义分割完整实战指南
从零跑通 CLAN 域适应GTA5 到 Cityscapes 语义分割完整实战指南【免费下载链接】CLAN( TPAMI2022 / CVPR2019 Oral ) Taking A Closer Look at Domain Shift: Category-level Adversaries for Semantics Consistent Domain Adaptation项目地址: https://gitcode.com/gh_mirrors/cl/CLANCLANCategory-level Adversaries是一个做「语义一致域适应」的经典 PyTorch 项目出自 CVPR 2019 Oral 与 TPAMI 2022 两篇论文。域适应说白了就是把游戏画面GTA5上学到的语义分割能力迁移到真实街景Cityscapes上——目标域一张标注都不用。本文带你走一条「环境→数据→训练→mIoU」的最短链路照着做即可出结果。CLAN 域适应是什么先搞清能力边界在动手前花两分钟定位这个项目能帮你避开一半的期望落差。它解决什么问题普通语义分割模型换一套数据就懵了CLAN 的核心贡献是用「类别级判别器Category-level Discriminator」逐类地对抗让特征分布按类别对齐而不是全局硬拉。配合一个权重失配损失防止特征空间退化迁移后的语义一致性显著更好。它能做什么、不能做什么能GTA5 → Cityscapes、SYNTHIA → Cityscapes 这两条仿真到真实sim2real的语义分割域适应链路输出 Cityscapes 标准 19 类结果。不能它不是即插即用的通用工具箱。源域和目标域的数据规格、列表文件dataset/gta5_list/train.txt等都是写死约定换数据集要改代码且单卡显存要求 11G 起步默认 batch size 为 1。搞清楚边界后我们进入流水线。先搭环境。第 1 步一键装好环境与代码环境很简单官方口径是 Python 3.6 PyTorch 1.0.0属于老配置别用新版 torch 硬套。git clone https://gitcode.com/gh_mirrors/cl/CLAN cd CLAN conda create -n clan_env python3.6 conda activate clan_env pip install torch1.0.0 torchvision pillow numpy matplotlib imageio⚠️ 还有一个容易漏的件ImageNet 预训练权重DeepLab-ResNet训练脚本启动时直接从./model/目录读取RESTORE_FROM指向model/DeepLab_resnet_pretrained_init-f81d91e8.pth没有它训练第一步就会崩。记得按这个文件名放好否则改一下脚本里的RESTORE_FROM变量。代码和环境都就位下面解决数据这个大头。第 2 步数据集怎么摆对位置需要三个数据集GTA5源域、Cityscapes目标域需申请授权、SYNTHIA可选替代源域。下载后按下面的目录结构摆进项目根目录脚本里的路径变量如DATA_DIRECTORY ./data/GTA5都是相对它写的├── data/ │ ├── Cityscapes/ │ │ ├── gtFine/ # 真值标注 │ │ └── leftImg8bit/ # 街景原图 │ ├── GTA5/ │ │ ├── images/ │ │ └── labels/ │ └── SYNTHIA/ │ └── RAND_CITYSCAPES/摆好图之后还要把图片列表文件和内容对上dataset/cityscapes_list/train.txt、dataset/gta5_list/train.txt、dataset/synthia_list/train.txt里写的是相对路径如aachen/aachen_000000_000019_leftImg8bit.png如果你的数据目录名不同要么统一目录名要么批量改列表。Cityscapes 的 19 类映射规则在dataset/cityscapes_list/info.json里一般无需动它。数据齐了最后一条命令链就能出 mIoU。第 3 步训练到出 mIoU 的完整链路这一条线分三个脚本按顺序跑即可。训练默认源域 GTA5、目标域 Cityscapes共 10 万 iter每 2000 iter 存一个 checkpoint 到 snapshots 目录CUDA_VISIBLE_DEVICES0 python CLAN_train.py --snapshot-dir ./snapshots/GTA2Cityscapes训练过程中会滚动打印 loss_seg / loss_adv / loss_weight同时写入 snapshots 目录的loss.txt可以直接盯它判断是否收敛。评估拿某个 checkpoint 在 Cityscapes val 集上跑推理python CLAN_evaluate.py --restore-from ./snapshots/GTA2Cityscapes/GTA5_100000.pth --save ./result/GTA2Cityscapes_100000算 mIoU把预测结果和 gtFine 真值对齐求交并比python CLAN_iou.py ./data/Cityscapes/gtFine/val result/GTA2Cityscapes_100000 一个实用技巧表现最好的 checkpoint 往往不是最后一个。CLAN_evaluate_bulk.py和CLAN_iou_bulk.py可以批量评测 snapshots 下所有模型结果自动汇总成 Excel 表适合训练完做横向对比挑最优。想看它学到了什么仓库gifs/目录下有 GTA5 风格街景被分割成彩色 mask 的动图示例直观感受域适应效果。跑通全流程后如果你打算魔改网络花十分钟看一眼模块地图会省很多事。进阶核心模块地图G 和 D 到底在哪代码量不大值得花 10 分钟扫一遍重点就四个文件model/CLAN_G.py生成器网络Res_Deeplab类。ResNet-101 骨干 两个解耦的 DeepLabV2 头对应 pred_source1/2解耦正是 CLAN 对抗训练的载体。model/CLAN_D.py类别级判别器FCDiscriminator注意它的输入是逐类别的 softmax 概率而非普通特征——这就是category-level的落点。utils/loss.py损失函数含加权 BCEWeightedBCEWithLogitsLoss即训练里自适应对抗损失的实现预热期后启用。CLAN_train.py主体训练主循环G 和 D 交替更新、damping 衰减、warmup 多项式学习率调度都在这一个文件里读它就能看懂全流程。数据加载逻辑在dataset/下的三个数据集类里改数据协议时从这里入手。高频踩坑与对策最后集中回答跑不通时最常见的几类报错。CUDA OOM / 显存不足官方要求显存 ≥11G。显存小卡可把--input-size-source、--input-size-target调低如640,360NUM_WORKERS也可降到 2。启动即报找不到权重文件就是上面说的 ImageNet 预训练权重没放进model/文件名要对上RESTORE_FROM。FileNotFoundError 报某个 png列表文件和实际目录对不上先检查data/下的层级名是否完全一致再核对*_list/*.txt第一行的前缀。mIoU 比预期低先确认评估用的是 val 列表cityscapes_list/val.txt且真值目录传的是gtFine/val再试试 bulk 评测换几个 checkpoint 对比。新环境装不上 torch 1.0.0这是 2019 年的依赖组合最稳的方案就是 Python 3.6 官方老版 torch 原样复刻而不是升级到新版 PyTorch 后逐个修兼容问题。到这一步环境、数据、训练、评估、指标五块就全部闭环了。下一步可以从换源域SYNTHIA或调整对抗损失权重Lambda_adv等开始做自己的实验。【免费下载链接】CLAN( TPAMI2022 / CVPR2019 Oral ) Taking A Closer Look at Domain Shift: Category-level Adversaries for Semantics Consistent Domain Adaptation项目地址: https://gitcode.com/gh_mirrors/cl/CLAN创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考