news 2026/8/24 1:55:31

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零跑通 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/CLAN

CLAN(Category-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 python=3.6 && conda activate clan_env pip install torch==1.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.txtdataset/gta5_list/train.txtdataset/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_DEVICES=0 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.pyCLAN_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:损失函数,含加权 BCE(WeightedBCEWithLogitsLoss),即训练里"自适应对抗损失"的实现,预热期后启用。
  • CLAN_train.py主体:训练主循环,G 和 D 交替更新、damping 衰减、warmup + 多项式学习率调度都在这一个文件里,读它就能看懂全流程。

数据加载逻辑在dataset/下的三个数据集类里,改数据协议时从这里入手。

高频踩坑与对策

最后集中回答跑不通时最常见的几类报错。

  • CUDA OOM / 显存不足:官方要求显存 ≥11G。显存小卡可把--input-size-source--input-size-target调低(如640,360),NUM_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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/24 1:54:10

3步接入Builder.io可视化编辑:React页面改文案不再等发版

3步接入Builder.io可视化编辑:React页面改文案不再等发版 【免费下载链接】builder Visual Development for React, Vue, Svelte, Qwik, and more 项目地址: https://gitcode.com/GitHub_Trending/bu/builder 上周二,首页 banner 的文案改了三次才…

作者头像 李华
网站建设 2026/8/24 1:53:39

QQ空间历史说说一键导出:扫码即用的 4 步本地备份方案

QQ空间历史说说一键导出:扫码即用的 4 步本地备份方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你翻相册看到 2014 年的一张合影,顺手去 QQ 空间找当年配的…

作者头像 李华
网站建设 2026/8/24 1:50:48

PAIR:前缀感知内部奖励模型如何优化多轮对话Agent学习效率

1. 从“奖励模型”到“内部奖励模型”:为什么我们需要PAIR?如果你最近在关注大语言模型(LLM)驱动的智能体(Agent)优化,尤其是那些需要多轮对话才能完成复杂任务(比如写代码、数据分析…

作者头像 李华
网站建设 2026/8/24 1:50:38

AI智能体长程记忆管理:基于轻量评分器的选择性遗忘机制

1. 项目概述:当AI智能体需要“选择性遗忘” 最近在折腾AI智能体(Agent)项目时,我遇到了一个几乎所有开发者都会头疼的经典问题:内存不够用。不是物理内存,而是模型上下文窗口(Context Window&am…

作者头像 李华