从零开始,用 USO 把“风格迁移”与“主体定制”一次搞定

“我想让 AI 画一只猫,但要用梵高的笔触,还要保留我家那只橘猫的脸,能做到吗?”
——答案是:可以,而且只需一张主体图、一张风格图、一句话。


目录

  1. USO 是什么?
  2. 为什么以前做不到,现在可以?
  3. 安装与准备(含低显存方案)
  4. 四种典型用法与命令示例
  5. 效果对比:USO 与常见工具
  6. 常见问题 FAQ
  7. 技术原理速览
  8. 一句话总结 & 下一步阅读

1. USO 是什么?

一句话:
USO(Unified Style and Subject-Driven Generation) 是一个开源模型,它把“风格迁移”和“主体定制”这两个原本分开的任务合并到一个框架里,让你用一张“主体图”+一张“风格图”+一句提示词,直接生成符合要求的新图片。

任务 传统做法 USO 做法
风格迁移 只改画风,主体不变 可同时替换主体或保留主体
主体定制 只保留主体,画风随机 可指定任意画风
两者结合 需两个模型+后处理 一个模型一步到位

2. 为什么以前做不到,现在可以?

过去遇到的三大难题:

  1. 任务隔离
    风格模型只管风格,主体模型只管主体,互不通信。
  2. 信息纠缠
    参考图里既有“画风”又有“人物”,模型分不清哪些该学、哪些该扔。
  3. 数据缺失
    缺少同时标注了“主体、风格、合成结果”的大规模数据集。

USO 用三步解决:

步骤 技术关键词 通俗解释
① 造数据 交叉任务三元组 先让 AI 生成 20 万张“主体-风格-合成图”三元组,保证训练时有标准答案
② 拆信息 解耦编码器 用两个独立编码器:一个看“主体”,一个看“风格”,互不干扰
③ 学奖励 风格奖励学习 额外训练一个“打分器”告诉模型:画得像不像参考风格,分数越高越好

3. 安装与准备(含低显存方案)

3.1 系统要求

  • Python 3.10 ~ 3.12
  • CUDA ≥ 12.1(NVIDIA 显卡)
  • 显存:

    • 16 GB 可用:直接跑 fp8 权重
    • ≤ 12 GB:加 --offload 参数把部分权重卸载到内存

3.2 一键安装步骤

# 1. 创建并激活虚拟环境
python -m venv uso_env
source uso_env/bin/activate   # Windows 用 uso_env\Scripts\activate

# 2. 安装 PyTorch(CUDA 12.4 示例)
pip install torch==2.4.0 torchvision==0.19.0 --index-url https://download.pytorch.org/whl/cu124

# 3. 安装依赖
pip install -r requirements.txt

# 4. 下载权重
cp example.env .env
# 打开 .env,把 HF_TOKEN 换成你的 Hugging Face token
python weights/downloader.py

3.3 低显存启动模板

python inference.py \
  --prompt "一只橘猫在咖啡馆打盹" \
  --image_paths "my_cat.jpg" "van_gogh.jpg" \
  --width 1024 --height 1024 \
  --offload --model_type flux-dev-fp8
  • --offload:显存不足时自动把权重搬到内存
  • --model_type flux-dev-fp8:官方推荐低显存版本

4. 四种典型用法与命令示例

场景 主体图 风格图 提示词示例 启动命令
1. 主体驱动 需提供 “穿西装的柯基在演讲” 见 4.1
2. 风格驱动 留空 需提供 “雪山落日” 见 4.2
3. 主体+风格 需提供 需提供 “我家柯基在雪山落日中奔跑” 见 4.3
4. 多风格混合 留空 多张 “赛博朋克城市” 见 4.4

小提示:路径用空格隔开,第一张永远是主体图,留空用 ""

4.1 主体驱动(保持主体,换背景)

python inference.py \
  --prompt "The man in flower shops carefully match bouquets" \
  --image_paths "assets/gradio_examples/identity1.jpg"

4.2 风格驱动(换画风,主体随机)

python inference.py \
  --prompt "A cat sleeping on a chair" \
  --image_paths "" "assets/gradio_examples/style1.webp"

4.3 主体+风格(既要脸又要画风)

python inference.py \
  --prompt "The woman gave an impassioned speech on the podium" \
  --image_paths "assets/gradio_examples/identity2.webp" "assets/gradio_examples/style2.webp"

4.4 多风格混合(一张图里融合多种画风)

python inference.py \
  --prompt "A handsome man" \
  --image_paths "" "style3.webp" "style4.webp"

5. 效果对比:USO 与常见工具

作者在 USO-Bench(50 张内容图 × 50 张风格图 × 多种提示词)上跑了大量实验,核心结论:

指标 含义 USO 得分 次优模型得分
CLIP-I ↑ 主体相似度 0.623 0.605 (UNO)
DINO ↑ 身份一致性 0.793 0.789 (UNO)
CSD ↑ 风格相似度 0.557 0.540 (InstantStyle-XL)
CLIP-T ↑ 文本一致性 0.282 0.282 (StyleStudio)

图片示例
效果对比
左:原风格;中:InstantStyle;右:USO,笔触更接近梵高。


6. 常见问题 FAQ

Q1:我只有 8 GB 显存,跑得动吗?

可以。使用 flux-dev-fp8 + --offload,峰值显存约 16 GB,但系统内存够大即可。

Q2:主体图一定要是人像吗?

不限制。猫、狗、产品 logo、动漫角色都可以,只要主体清晰即可。

Q3:风格图可以用插画、油画以外的类型吗?

可以。照片、3D 渲染、像素风、甚至布料纹理都支持。

Q4:提示词该怎么写?

  • 想保留姿势:用空提示词 ""
  • 想换动作:直接写 “主体 + 动作 + 场景”,例如“穿西装的柯基在演讲”

Q5:生成的图版权归谁?

代码 Apache 2.0,生成图由用户自行负责,请遵守当地法律。


7. 技术原理速览(写给好奇宝宝)

7.1 训练数据怎么来?

  • 从公开图库 + 合成数据里挑 20 万张“风格化图”
  • 再用两个专家模型来回倒腾:

    • 风格专家:把普通图→指定风格
    • 去风格专家:把风格图→还原成普通图
  • 最终得到三元组:

    [风格参考图, 去风格主体图, 合成结果图]
    

    这样模型既有“标准答案”,又能学到“哪些信息该保留/丢弃”。

7.2 模型结构长什么样?

  • SigLIP 编码器:提风格特征(颜色、笔触)
  • VAE 编码器:提主体特征(脸、姿势)
  • 分层映射器(Hierarchical Projector):把不同层特征拼一起,再送进 DiT 生成图片
  • 风格奖励模型:实时给生成图打分,分数高才回传梯度

7.3 训练两阶段

阶段 目标 解冻参数 数据
① 风格对齐 让模型先学会“按风格出图” 仅映射器 {风格图 → 结果图}
② 解耦训练 同时喂主体+风格,学会分离 DiT 全部 {主体+风格 → 结果图}

8. 一句话总结 & 下一步阅读

  • :一张主体、一张风格、一句话,就能生成高质量定制图。
  • :想深挖原理,直接看 技术报告 arXiv:2508.18966
  • :在线 demo 已上线 Hugging Face,免安装直接体验。

祝你玩得开心,创作愉快!