一位导演想拍一部“看懂世界”的电影——让AI演员学会把相机里的每一帧画面,逐像素认出“这是行人、那边是汽车、远处是树木”。但真实片场的取景费贵得吓人:请一群标注员把照片里每个物体的边缘一点点描出来,一张图就要几个小时。导演灵机一动,搭了一座虚拟摄影棚:用3D软件搭建布景和数码演员,灯光、机位全部数字化可控。每当演员彩排(渲染)一帧,系统就自动输出一张“角色卡”——画面里每个像素属于谁,一清二楚。这座摄影棚产出的海量排练素材,就是合成数据;自动生成的角色卡,就是像素级标注。本文带你从零搭起这座摄影棚,并让AI演员在真实片场也有稳定发挥。

岗位关联

掌握合成数据生成与分割模型训练方法,你就能以极低成本获得海量像素级标注、突破真实数据瓶颈,这是 CV 算法工程师在冷启动项目中快速交付模型的核心竞争力。

目录
  1. 可视化演示
  2. 合成场景构建
  3. 像素级标注生成
  4. 域适应训练
  5. 分割任务策略
  6. 合成数据评估
  7. 精度提升技巧
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示3D渲染生成像素级分割掩码的流程,以及合成到真实图像的域适应迁移与mIoU提升曲线。

本节配有交互动效(进入视口后自动加载,约 3KB)。

像素级分割标注自动生成 3D渲染时利用深度缓冲和物体ID缓冲 ID缓冲区直接映射为分割掩码 语义/实例/全景分割自动标注 mask(x,y) = class(ID_buffer(x,y)) 渲染即标注实现像素级标注零成本。

合成场景构建

搭建虚拟摄影棚的第一步,是搭台布景。导演不会在空荡荡的棚里直接开拍:需要会走位的数码演员(3D 资产)、专业灯光师(光照模拟)、扛机器的摄影师(相机位姿),还有负责演员服装质感的化妆师(材质纹理)。这四类角色分工明确,共同决定“排练剧照”长什么样——哪几样物件出现在画面里、光照亮不亮、从什么角度拍、物体表面是磨砂还是光滑。

切换到技术视角,合成场景构建就是用 3D 渲染引擎生成结构与真实场景分布相似的图像。3D 资产是网格模型库,决定场景里“有哪些东西”;光照模拟控制光源的类型、强度与方向,决定明暗与阴影;相机位姿由内外参数指定视角、景深;材质纹理定义表面反射属性,决定颜色与质感。四者共同作用于每个像素,渲染引擎就能生成一张接近照片的合成图。

与传统拍照不同,合成渲染是“白盒”的:我们掌握场景的全部参数,因此可以随意操纵数据分布——要晴天就出阳光,要雨夜就洒雨水,这种灵活性是真实拍摄没法比的。渲染引擎把信息综合成像素颜色的过程,可以用下面这个函数直观理解:

台子搭好了,灯光师和摄影师就位,数码演员站在镜头前,按下渲染键——第一张 “排练剧照” 就此诞生。但这张剧照还只是普通照片,真正的王牌是下一节:剧照拍完的瞬间,标注也跟着出来了。

I(x,y)=R(Geo(x,y), Light, Mat(x,y))\displaystyle I(x,y) = \mathcal{R}\big(\text{Geo}(x,y),\, \text{Light},\, \text{Mat}(x,y)\big)
一个像素的颜色,不是天生就该是什么颜色,而是“它在3D空间里的几何位置 + 现场灯光 + 表面材质”三个因素共同调出来的结果。
  1. 像素位置 (x,y)渲染器逐像素扫描画面,x 是列坐标,y 是行坐标,每个像素都独立计算一次颜色。
    (x,y)∈R2(x,y) \in \mathbb{R}^2
  2. 几何信息 Geo(x,y)该像素对应到 3D 世界中的表面位置、朝向与法线,决定“这里是墙还是天花板”。
    Geo(x,y)=(X,Y,Z,n⃗)\text{Geo}(x,y) = (X, Y, Z, \vec{n})
  3. 光照 Light场景中全部光源的强度、方向与颜色,决定阴影与明暗层次。
    Light={ Lk,  Ik,  ck }k=1K\text{Light} = \{\,L_k,\; I_k,\; c_k\,\}_{k=1}^{K}
  4. 材质 Mat(x,y)该表面点的颜色、反光率、粗糙度,决定物体是哑光还是高光。
    Mat(x,y)=(ρ,  α,  spec)\text{Mat}(x,y) = (\rho,\; \alpha,\; \text{spec})
  5. 渲染函数 R把几何、光照、材质三个输入合成一个 RGB 颜色,是渲染器的核心计算。
    R:(Geo, Light, Mat)→RGB\mathcal{R}: (\text{Geo},\,\text{Light},\,\text{Mat}) \to \text{RGB}

像素级标注生成

传统剧组拍完戏后,剪辑师要一帧一帧手动抠图、描边,费时费力。虚拟摄影棚则完全不同:每一个数码演员身上都别着一块“电子工牌”,工牌里写着一个唯一编号。只要一声“卡”,系统立刻生成一份全员位置清单——画面里每个像素背后是几号演员、几号道具,全部自动记录在案,这就是渲染 ID 映射。

技术上说,合成数据的最大红利就是“标注免费”。渲染器不只是输出一张彩色图,还额外输出一张 ID 图:这张图和原图逐像素对齐,每个像素记录的数值是它所对应物体的唯一编号。接下来拿一张映射表(比如 3 号是行人的类别,7 号是汽车的类别),把 ID 图翻译成语义标签图,就得到了像素级分割标注。整个过程无需人工描边,标注成本趋近于零。

实例边界也不需要额外处理:把 ID 相同的像素聚成连通区域,每个连通区就是一个实例的轮廓。若要全景标注,只需把语义层与实例层按规则叠起来——例如“stuff 类(天空、道路)直接用语义类别,thing 类(人、车)用实例编号”。这种自动化的标注生成,可以用一个极简公式概括:

电子工牌自动记录每个数码演员的位置与归属,导演再也不用熬通宵盯剪辑抠图了。不过,虚拟棚里的戏排得再好,也不能保证一到真实片场就完全不出戏——这就引出下一节的水土不服问题。

Label(p)=M(IDp)\displaystyle \text{Label}(p) = \mathcal{M}\big(\text{ID}_p\big)
每个像素的标签,只是“查户口”:先问渲染器这个像素属于几号,再查这张编号到类别的映射表。
  1. 像素 p图像中的任意一个像素点,在 ID 图中都有唯一登记。
    p∈Ωp \in \Omega
  2. ID_p该像素在渲染 ID 图中对应的物体编号,不同物体编号不同。
    IDp∈{1,2,…,N}\text{ID}_p \in \{1, 2, \dots, N\}
  3. 映射表 M一张人工配置的字典,把编号翻译为语义类别或实例编号。
    M:ID→{Class,  Instance}\mathcal{M}: \text{ID} \to \{\text{Class},\; \text{Instance}\}
  4. Label(p)最终供模型训练的像素级标注,与原图像素完全对齐。
    Label(p)∈{person,  car,  road,… }\text{Label}(p) \in \{\text{person},\; \text{car},\; \text{road}, \dots\}

域适应训练

数码演员在虚拟摄影棚里排练得很熟练,可一到真实片场,灯光昏暗、布景杂乱、镜头眩光全来了,动作顿时走样。这就是典型的“水土不服”:虚拟世界里学到的经验,在现实里打了折扣。导演要做的是让演员提前适应真实片场的氛围。

这个问题的技术名称叫“域差异”(Domain Gap):合成图像与真实图像虽然内容相似,但像素分布有明显差距——真实照片有传感器噪声、白平衡偏移、复杂的遮挡关系,而这些在渲染图里往往过于“干净”。直接把合成数据训练出的模型放到真实图片上测试,mIoU 常常暴跌二三十个点。域适应训练专门处理这个鸿沟。

主流手段有三类:风格迁移,把真实图像的色彩/纹理风格迁到合成图上,让训练数据“看起来像真的”;自监督对齐,利用真实数据自身的结构(例如灰度不变性、几何一致性)拉近两个域的特征分布;对抗训练,让判别器分辨不出特征来自合成域还是真实域,迫使模型学到域无关的表征。整体训练目标可以写成一个加权求和:

导演安排演员先在虚拟棚打牢基本功,再安排真实片场的“彩排走位”,临场发挥自然更稳。但不同项目要拍的“剧本”不一样,演员需要掌握的技能粒度也不同,这就到了任务选型的环节。

L=Lseg(θ;Dsyn)+λ⋅Ladapt(θ;Dreal)\displaystyle \mathcal{L} = \mathcal{L}_{\text{seg}}\big(\theta; D_{\text{syn}}\big) + \lambda \cdot \mathcal{L}_{\text{adapt}}\big(\theta; D_{\text{real}}\big)
总损失 = 在虚拟棚里把戏演好的主任务损失 + 在真实片场踩点适应环境(哪怕没有台词,没有标注)的辅助损失,λ 是两者之间的配比。
  1. 模型参数 θ分割网络的可学习权重,域适应要调的就是它。
    θ∈Rd\theta \in \mathbb{R}^d
  2. 合成数据 D_syn虚拟摄影棚产出的图像 + 自动标注,主任务的“教材”。
    Dsyn={(xisyn,yisyn)}i=1ND_{\text{syn}} = \{(x_i^{\text{syn}}, y_i^{\text{syn}})\}_{i=1}^{N}
  3. 分割损失 L_seg主任务常用的交叉熵损失,衡量像素级预测与标注的偏差。
    Lseg(θ;Dsyn)=−1N∑i=1N∑c=1Cyi,clog⁡y^i,c\mathcal{L}_{\text{seg}}(\theta; D_{\text{syn}}) = -\frac{1}{N}\sum_{i=1}^{N}\sum_{c=1}^{C} y_{i,c} \log \hat{y}_{i,c}
  4. 真实数据 D_real真实场景图像,可以完全不带标注,是“踩点素材”。
    Dreal={xjreal}j=1MD_{\text{real}} = \{x_j^{\text{real}}\}_{j=1}^{M}
  5. 自适应损失 L_adapt风格迁移或对抗损失,让特征对齐。
    Ladapt=Ex∼Dreal[log⁡D(x)]+Ex∼Dsyn[log⁡(1−D(x))]\mathcal{L}_{\text{adapt}} = \mathbb{E}_{x \sim D_{\text{real}}}\big[\log D(x)\big] + \mathbb{E}_{x \sim D_{\text{syn}}}\big[\log(1 - D(x))\big]
  6. 权重系数 λ平衡主任务与适应任务,通常取 0.1~1.0。
    λ∈[0,1]\lambda \in [0, 1]

分割任务策略

拍战争片要分清“哪几个是同一个排的战友”,拍纪录片只需要认出“这是树、那是房子”——不同的剧本,对角色卡的要求精细程度完全不同。图像分割也有三种常见剧本:语义分割、实例分割、全景分割,虚拟摄影棚的标注系统要按剧本定制。

语义分割是像素级分类,只回答“这个像素是什么”,不在乎同类物体有几个,例如一片森林全标“树”。实例分割不仅要回答“这是车”,还要区分“这是第 1 号车、第 2 号车”,标注时每个物体必须独立编号。全景分割则是前两者的融合:对背景类(stuff,如天空、道路)做语义标注,对前景类(thing,如人、车)做实例标注,一张图同时输出两套信息。

这直接影响合成数据生成时的渲染 ID 粒度:只做语义分割,ID 可以按类别统一分配,所有树共用一个编号;做实例分割,每棵树都必须独立编号。评估指标也随之变化:语义分割看 mIoU,实例分割看重叠度和检测率的 mAP。mIoU 的计算方式如下:

剧本不同,角色卡详略不同,预算花在刀刃上。但无论哪种剧本,前期都要回答一个问题:这座虚拟摄影棚产出的素材到底靠不靠谱?下一节讲如何评估。

mIoU=1C∑c=1CTPcTPc+FPc+FNc\displaystyle \text{mIoU} = \frac{1}{C}\sum_{c=1}^{C} \frac{\text{TP}_c}{\text{TP}_c + \text{FP}_c + \text{FN}_c}
mIoU 是分割任务最常用的体检指标:对每一个类,先算“预测与真实重合面积 / 两者的并集面积”,再把所有类的结果取平均。
  1. 类别总数 C分割任务需要识别的语义类别个数,例如 19 类或 80 类。
    C=∣ClassSet∣C = |\text{ClassSet}|
  2. TP_c第 c 类的真阳性像素,即预测正确且真实也是该类的像素数。
    TPc=∣{p:y^p=c  ∧  yp=c}∣\text{TP}_c = |\{p : \hat{y}_p = c \; \wedge \; y_p = c\}|
  3. FP_c第 c 类的假阳性像素,预测是该类但实际不是。
    FPc=∣{p:y^p=c  ∧  yp≠c}∣\text{FP}_c = |\{p : \hat{y}_p = c \; \wedge \; y_p \neq c\}|
  4. FN_c第 c 类的假阴性像素,实际是该类但预测漏掉了。
    FNc=∣{p:y^p≠c  ∧  yp=c}∣\text{FN}_c = |\{p : \hat{y}_p \neq c \; \wedge \; y_p = c\}|
  5. 平均符号 ∑把每个类的 IoU 加起来除以类别数,得到整体指标。
    IoUc=TPcTPc+FPc+FNc\text{IoU}_c = \frac{\text{TP}_c}{\text{TP}_c + \text{FP}_c + \text{FN}_c}

合成数据评估

电影上映前要有试映会,请真实观众打分。合成数据能不能用,也不能只看虚拟棚里的“剧照”美不美,要看真实片场的最终表现。评估合成数据,业内通常从三个维度体检:标注质量、仿真度、迁移效果。

标注质量检查标注本身是否正确——虽然渲染 ID 图是“自动”生成的,但遮挡处、动态物体、半透明材质仍可能产生标签孔洞或边缘错位,方法是从合成集里随机抽一批图,人工快速复核标注的像素准确率。仿真度衡量合成图像与真实图像分布的距离,常用 FID(Fréchet Inception Distance)分数,越低表示两域分布越接近。迁移效果是终极标准:用合成数据训练模型,在真实数据集上测精度,看 drop 了多少。

三个维度各有侧重,但真正拍板的是第三个。项目里最规范的评估方式是做基准对比实验:同一套分割模型分别用“全真实数据”“合成数据预训练 + 少量真实微调”“纯合成数据”三种方案训练,在固定真实测试集上对比 mIoU,并计算与全监督上限的差距:

试映会的真实反馈是检验演员成色最硬的尺子。差评不可怕,可怕的是不知道如何改进——下一节正是对症下药的提升技巧。

Δsim2real=mIoUDreal−mIoUDsyn→Dreal\displaystyle \Delta_{\text{sim2real}} = \text{mIoU}_{D_{\text{real}}} - \text{mIoU}_{D_{\text{syn}}\to D_{\text{real}}}
这个差值就是“合成数据信息损耗率”:真实数据训练到 80 分,合成数据训练只能到 65 分,差值 15 分就是要用域适应或微调追回的缺口。
  1. 真实训练上界 mIoU_D_real用大量真实标注训练同模型能达到的精度,作为满分参考。
    mIoUDreal=max⁡θ mIoU(θ;Dtestreal)\text{mIoU}_{D_{\text{real}}} = \max_{\theta} \, \text{mIoU}(\theta; D_{\text{test}}^{\text{real}})
  2. 合成迁移精度 mIoU_D_syn→D_real只用合成数据训练,在真实测试集上得到的精度。
    mIoUDsyn→Dreal=mIoU(θ∗;Dtestreal),θ∗=arg⁡min⁡θLseg(θ;Dsyn)\text{mIoU}_{D_{\text{syn}}\to D_{\text{real}}} = \text{mIoU}(\theta^*; D_{\text{test}}^{\text{real}}), \quad \theta^* = \arg\min_\theta \mathcal{L}_{\text{seg}}(\theta; D_{\text{syn}})
  3. 差值 Δ衡量合成数据与真实数据之间的信息鸿沟,数值越小越好。
    Δsim2real≥0\Delta_{\text{sim2real}} \geq 0

精度提升技巧

优秀导演会让数码演员做“百变训练”:服装换着穿、灯光随机闪、把虚拟演员抠出来放进真实照片里拍,甚至先从最简单的站位排起。排练的花样越多,正式开拍越不慌。这些技巧,正是把合成数据分割精度往上顶的四板斧。

域随机化:在渲染时随机化颜色、亮度、纹理、相机参数,让模型不被某一套渲染风格绑定,见过的外观越多样,泛化越好。混合现实:把合成的前景物体用真实场景做背景拼接,合成的物体加真实的上下文,弥合背景分布的差异。课程学习:先让模型在简单场景(物体少、光照好、视角正)训练,再逐步过渡到困难场景,减轻早期训练震荡。伪标签细化:把训练好的模型放到无标注真实图片上推理,挑出高置信度预测当伪标签,混合进训练集再迭代一轮。

伪标签技术的核心在于“挑可信的用”,不能把模型所有预测全部当真。用置信度阈值卡一道门槛,只保留足够有把握的像素,然后把它当作额外监督信号:

四板斧组合使用,往往能把合成数据的真实测试精度再拉高 5~10 个百分点。数码演员练就一身临场应变的功夫,真实片场的正式开拍自然一条过。

Lpseudo=1N∑p=1N1[conf(y^p)>τ]⋅ℓ(y^p,yppseudo)\displaystyle \mathcal{L}_{\text{pseudo}} = \frac{1}{N}\sum_{p=1}^{N} \mathbb{1}\big[\text{conf}(\hat{y}_p) > \tau\big] \cdot \ell\big(\hat{y}_p, y_p^{\text{pseudo}}\big)
公式的意思是:伪标签不能照单全收,只把模型拍胸脯保证(置信度超过阈值 τ)的预测拿来回炉训练,其余不确定的都丢掉。
  1. 像素索引 p遍历真实图像中的每个像素,逐个决定是否纳入伪标签训练。
    p∈{1,2,…,N}p \in \{1, 2, \dots, N\}
  2. 预测置信度 conf(ŷ_p)模型对该像素预测结果的概率分数,越高越可信。
    conf(y^p)=max⁡c y^p(c)\text{conf}(\hat{y}_p) = \max_c \, \hat{y}_p^{(c)}
  3. 阈值 τ一个用户设定的超参数,通常取 0.9~0.99,只留高置信度像素。
    τ∈(0,1)\tau \in (0, 1)
  4. 指示函数 1[·]条件成立时取 1,不成立取 0,即“不合格的伪标签不参与损失计算”。
    1[conf(y^p)>τ]∈{0,1}\mathbb{1}[\text{conf}(\hat{y}_p) > \tau] \in \{0, 1\}
  5. 损失函数 ℓ通常为交叉熵,监督模型输出向选中的伪标签靠拢。
    ℓ(y,y^)=−∑c=1Cy(c)log⁡y^(c)\ell(y, \hat{y}) = -\sum_{c=1}^{C} y^{(c)} \log \hat{y}^{(c)}

AI 应用场景

自动驾驶街景分割

阶段:数据准备与模型训练

解决的问题:真实街景像素级标注成本极高,一张图数百元且需反复质检;更棘手的是极端场景(黑夜、暴雨、罕见车型)难以采集。合成数据用仿真引擎搭建数字城市,自动产出任意天气、任意时段的街景与像素级标注,让分割模型在长尾场景上也能稳定发挥。

具体案例:某自动驾驶团队用合成街景预训练语义分割模型,在 Cityscapes 真实测试集上比随机初始化高 12 个百分点;随后用少量真实标注微调,逼近全监督训练的精度上限,数据预算降低约 70%。

医疗影像病灶分割

阶段:数据增强与样本扩充

解决的问题:医疗影像标注依赖放射科专家,稀缺且昂贵,罕见病变的标注样本尤其难凑。合成数据用物理仿生成像 + 生成模型,合成带病灶的 CT/MRI 图像,同时自动产出像素级病灶掩膜,大幅提高罕见病例的样本身量。

具体案例:某医学影像 AI 团队用合成方式生成肝脏病灶样本(肿瘤、囊肿、转移灶各数百例),配合真实数据混合训练,将罕见病变的像素级召回率从 0.61 提升到 0.84,且无需额外专家标注时间。

工业质检缺陷分割

阶段:缺陷检测模型迭代

解决的问题:产线上不良品率极低,缺陷形态却千变万化,人工标注缺陷掩膜既慢又容易漏。用 CAD 模型 + 纹理扰动 + 光照变化合成“带缺陷产品图”,缺陷的像素级位置由渲染过程直接指定,训练数据可以按缺陷类型无限扩充。

具体案例:某手机制造厂用合成缺陷数据训练屏幕划痕分割模型,将真实产线上的缺陷检出率从 82% 提升到 96%,同时误检率下降一半,从数据准备到上线仅用两周。

Python 演示

python52 行
# 合成数据域随机化生成彩色矩形与像素级标签 免人工标注# 用像素颜色特征训练逻辑回归分类器完成最小分割闭环import numpy as npfrom sklearn.linear_model import LogisticRegression  def make_synth_image(h=64, w=64):    """生成一张含两个矩形物体的合成图, 返回图像与像素级标注"""    img = np.zeros((h, w, 3), dtype=np.float32)    gt = np.zeros((h, w), dtype=np.int64)    # 背景: 随机灰度, 模拟域随机化    bg = 0.5 + 0.1 * np.random.rand()    img[:, :] = (bg, bg, bg)    # 物体1: 红色系矩形, 标注类别1    x0 = np.random.randint(0, w - 16)    y0 = np.random.randint(0, h - 16)    x1 = x0 + np.random.randint(10, 20)    y1 = y0 + np.random.randint(10, 20)    img[y0:y1, x0:x1] = (1.0, 0.1 + 0.2 * np.random.rand(), 0.1)    gt[y0:y1, x0:x1] = 1    # 物体2: 蓝色系矩形, 标注类别2    x0 = np.random.randint(0, w - 16)    y0 = np.random.randint(0, h - 16)    x1 = x0 + np.random.randint(10, 20)    y1 = y0 + np.random.randint(10, 20)    img[y0:y1, x0:x1] = (0.1, 0.1 + 0.2 * np.random.rand(), 1.0)    gt[y0:y1, x0:x1] = 2    return img, gt  def train_and_eval(n_train=200, n_test=50):    """用合成数据训练像素分类器并在新合成图上评估"""    X_tr, y_tr = [], []    for _ in range(n_train):        img, gt = make_synth_image()        X_tr.append(img.reshape(-1, 3))        y_tr.append(gt.reshape(-1))    X_tr = np.concatenate(X_tr, axis=0)    y_tr = np.concatenate(y_tr, axis=0)    clf = LogisticRegression(max_iter=300)    clf.fit(X_tr, y_tr)    acc = 0.0    for _ in range(n_test):        img, gt = make_synth_image()        pred = clf.predict(img.reshape(-1, 3))        acc += float((pred == gt.reshape(-1)).mean())    return acc / n_test  if __name__ == '__main__':    acc = train_and_eval()    print('synthetic data pixel acc: %.3f' % acc)
目的:用合成矩形物体自动生成像素级标注,训练一个按颜色分类的分割器,演示“合成数据免人工标注训练分割模型”的最小闭环。
  1. img[:, :] = (bg, bg, bg)背景灰度随机抖动,这就是最简单的域随机化,让模型不依赖固定渲染参数。
  2. gt[y0:y1, x0:x1] = 1在标签图上直接写类别号,模拟渲染 ID 自动生成像素级标注的核心思路。
  3. X_tr.append(img.reshape(-1, 3))把每个像素的 RGB 三通道当成一个训练样本特征。
  4. clf.fit(X_tr, y_tr)逻辑回归在这里扮演“分割模型”,学习从像素颜色到类别的映射。
  5. acc += float((pred == gt.reshape(-1)).mean())逐像素对比预测与真标签,统计分割准确率。

常见误区

误区以为照片级真实感是合成数据质量的唯一标准,花大量精力把渲染调得跟照片一模一样才肯开始训练。

正解大量研究发现,域随机化带来的外观多样性,往往比单一的高逼真渲染更有用。模型需要的是覆盖真实分布的各种外观,而不是一张“完美但单调”的风格。就像排练时让演员适应各种灯光和服装,上台才不怯场,学会应付变化比练一种固定姿势更重要。

为何常见:人眼判断“真实”和模型需要的“分布覆盖”是两码事,直觉上容易把画质与可用性划等号。

误区被“零成本标注”的宣传吸引,认为合成数据可以彻底替代真实数据,项目里一张真实图都不用。

正解受域差异影响,纯合成数据训练的模型在真实场景上通常有明显掉点。正确的姿势是合成数据做主力预训练/数据扩充,保留少量真实数据(即使没有标注)用于域适应、伪标签细化或最终微调校准。就像新人演员要在虚拟棚练基本功,也要到真实片场踩点才能学会临场反应。

为何常见:只看到了合成数据“便宜量大”的一面,忽略了 sim-to-real gap 这个客观存在的瓶颈。

误区渲染自动输出的标注“绝对正确”,不必检查直接拿来训练,出问题了也怀疑是模型不对。

正解自动标注同样会出纰漏:物体互相遮挡、半透明材质、景深边缘、动态物体都可能让 ID 图产生标签孔洞或边缘错位。规范做法是在评估阶段抽样复核标注质量,或用一致性约束过滤明显噪声。自动不等于无错,就像电子工牌在信号被遮挡时也会漏读。

为何常见:把“不需要人工”与“零错误”混为一谈,缺少对训练数据质量的敬畏。

误区一套合成数据生成完就存在服务器上,任何项目、任何模型都能拿来直接用,永远不用更新。

正解合成数据需要随任务迭代:类别增减、场景分布变化、模型短板暴露后,都要重新调整生成参数(光照、相机、物体组合、纹理)。数据生产与模型训练是互相喂给的闭环,而不是一次性交付。就像剧本改了,摄影棚布景和演员调度也得跟着调。

为何常见:把数据当成静态资产,没有意识到数据与模型是共生演化的关系。

面试题

Q1. 合成数据用于分割标注最核心的优势是什么?

单选题 · easy

  • A.不需要任何人工参与标注
  • B.像素标注自动随渲染产生← 正确答案
  • C.生成的图像都是真实照片
  • D.标注成本比人工反而更高

答案:B。合成数据最核心的优势是渲染时 ID 图与图像同时生成,像素级标注“免费”产生,因此 B 正确。A 过于绝对,场景配置和质检仍需人工;C 错误,合成图不是真实照片;D 与事实相反,合成标注成本远低于人工。

Q2. 渲染 ID 映射指的是什么?

单选题 · easy

  • A.给整张图像打上一个总体标签
  • B.每个物体编号像素记录归属← 正确答案
  • C.用哈希函数对图像数据加密
  • D.给场景中的多个相机分配编号

答案:B。渲染 ID 映射是指渲染器额外输出一张与图像逐像素对齐的编号图,记录每个像素所属物体的唯一 ID,因此 B 正确。A 是图像分类的做法;C 是加密概念;D 是相机标定,均与像素级归属无关。

Q3. 语义分割和实例分割的主要区别是什么?

单选题 · easy

  • A.语义分割只区分类别不区分个体← 正确答案
  • B.实例分割只区分个体不区分类别
  • C.语义和实例分割实际完全等同
  • D.语义分割要求实时处理视频流

答案:A。语义分割做像素级分类,只回答“这是什么类别”;实例分割在分类之外还要区分同类中的不同个体,所以 A 正确。B 说反了,实例分割同样要分类;C 忽略了两者的粒度差异;D 实时性与是否语义分割没有必然联系。

Q4. 合成数据训练分割模型面临的核心问题是什么?

单选题 · mid

  • A.合成数据样本总量不足够大
  • B.合成域与真实域的分布差异← 正确答案
  • C.分割模型训练收敛速度太慢
  • D.渲染引擎代码无法正常运行

答案:B。合成数据通常量大且标注免费,问题不在于样本量,而在于合成图与真实图存在域差异(光照、纹理、噪声),导致模型迁移后精度下降,所以 B 正确。A 与事实不符;C 是工程优化问题;D 是开发环境问题,均不是核心瓶颈。

Q5. 以下哪种做法属于域适应训练?

单选题 · mid

  • A.把合成图做风格迁移逼近真实域← 正确答案
  • B.训练时把学习率调得更大一些
  • C.把分割网络模型的层数加深
  • D.在训练时使用更大批量的数据

答案:A。风格迁移是把合成图的纹理/色彩迁向真实域、缩小域差异的典型域适应手段,A 正确。B 是超参数调整;C 是模型结构调整;D 是训练工程技巧,三者都不直接作用于合成域与真实域之间的分布对齐。

Q6. 关于 mIoU 的描述正确的是哪一项?

单选题 · hard

  • A.对所有像素计算平均分类准确率
  • B.各类IoU取算术平均得到指标← 正确答案
  • C.只统计前景像素的IoU数值
  • D.无需模型训练即可直接算出

答案:B。mIoU 先对每个类别计算预测与真实的交集除以并集,再把所有类的 IoU 取平均,B 正确。A 是像素准确率(PA);C 忽略了背景类;D 不正确,mIoU 必须用模型预测结果来计算。

Q7. 全景分割的标注输出是什么?

单选题 · mid

  • A.只输出每个像素的语义类别标签
  • B.同时输出语义标签和实例编号← 正确答案
  • C.只输出目标物边界框坐标信息
  • D.只进行像素级前景背景二分类

答案:B。全景分割对 stuff 类(天空、道路)输出语义标签,对 thing 类(人、车)输出实例编号,两者联合输出,B 正确。A 是纯语义分割;C 是目标检测;D 是显著性分割,均不是全景分割的定义。

Q8. 合成数据评估常用的方法有哪些?

多选题 · mid

  • A.对合成标注抽样人工审核← 正确答案
  • B.用FID衡量图像分布距离← 正确答案
  • C.在真实测试集上做迁移实验← 正确答案
  • D.全部用人工方式重新标注

答案:ABC。合成数据评估包括标注质量抽样复核(A)、仿真度指标 FID(B)、以及真实数据上的迁移测试(C),这三者分别对应标注质量、分布距离、下游精度三个维度。D 与“评估合成数据”无关,重新人工标注违背了合成数据的初衷。

Q9. 提升合成数据分割精度的常用技巧有哪些?

多选题 · hard

  • A.对场景元素做域随机化← 正确答案
  • B.真实背景拼接合成前景物体← 正确答案
  • C.课程学习从简单到困难渐进← 正确答案
  • D.删除所有材质纹理只留线框

答案:ABC。域随机化增加外观多样性(A),混合现实用真实背景补足上下文(B),课程学习稳定训练曲线(C),三者都是被验证有效的提升技巧。D 会破坏表面信息,导致模型学不到材质特征,是错误操作。

Q10. 关于伪标签细化,下列说法正确的是?

多选题 · hard

  • A.用高置信度预测作为伪标签← 正确答案
  • B.完全弃用合成的数据资产
  • C.结合少量真实标注迭代优化← 正确答案
  • D.模型任何预测都直接当标签

答案:AC。伪标签细化的关键是只保留模型高置信度预测(A),并与合成数据、少量真实标注混合迭代训练(C)。B 说法极端,伪标签正是为了补充而非替代合成数据;D 缺少置信度过滤,会把噪声当标签,损害模型性能。