今天我们在 Hugging Face 上发布了[虚拟试穿安全分类器](https://huggingface.co/Genlook/tryon-safety-classifier)(基于 Apache-2.0 协议开源)。它可以通过分析商品照片,回答一个关键问题:如果顾客试穿这件商品,生成的照片会是什么样?

我们开发它的目的是在商品进入[虚拟试穿](/glossary/virtual-try-on)模型之前进行拦截。任何接受任意商品图片的试穿服务都会面临同样的问题,因此我们将模型、标签策略和评估结果一并开源发布。

![Genlook 演示目录中的八张商品照片及其分类器输出:运动内衣、沙滩短裤和短款夹克被标记为 ok(正常),三套泳衣被标记为 revealing(暴露),狗狗背带被标记为 ok 和 pet(宠物),假发被标记为 ok 和 not clothing(非服装)。](/blog-images/tryon-safety-classifier-examples.webp)

## 为什么 NSFW 检测器对虚拟试穿无效

虚拟试穿的过程是接收一张人物照片和一张商品照片,然后生成该人物穿着该商品的画面。真正的风险在于输出结果,但在生成之前,你唯一能检查的只有商品照片。

通用的 NSFW(工作场合不宜)检测器只会根据输入的图像像素来进行判断。对于商品照片来说,这种方式完全是在答非所问:

- **一张平铺拍摄的内衣照片本身不包含任何裸露画面。**但虚拟试穿的结果会展示顾客穿着内衣的样子。
- **白色背景下的乳贴只有几厘米的布料。**但虚拟试穿的结果却是上身半裸。
- **穿在假人模特身上的恋物癖头套并不露骨。**但它仍然属于性暗示商品。
- **模特全裸只戴了一条项链的照片非常露骨。**但项链本身只是一件普通商品。

我们在 141 个已标注商品的早期测试集中,测试了三个流行的开源 NSFW 图像分类器(NudeNet、nsfw-vit 和 Falconsai),它们与我们标注结果的一致率仅为 48% 到 62%。而 Google 的 ShieldGemma 2 在针对这一具体问题输入自定义策略后,达到了 71.6% 的准确率。这些模型都正常发挥了作用,它们只是回答了不同的问题。

## 分类器预测什么

每个商品都会获得一个安全等级,按严重程度排序:

| 等级 | 虚拟试穿结果展示 | 示例 |
|---|---|---|
| `ok`(正常) | 顾客正常着装 | 日常服装、运动服、潜水服、像衣服一样包裹身体的 Cosplay 服装、配饰 |
| `revealing`(暴露) | 泳衣级别的覆盖度 | 比基尼和连体泳衣、男士内裤、塑身衣、超短裤、多数音乐节服装 |
| `lingerie`(内衣) | 女士内衣,不可见私密部位 | 文胸、内裤、内衣套装、连体衣、吊袜带、作为内衣穿着的紧身胸衣 |
| `adult`(成人) | 暴露私密部位,或性暗示商品 | 微型泳衣、乳贴、透视装、开杯设计、BDSM 和恋物癖服装、性暗示角色扮演服装 |

除了等级之外,还有三个附加的输出标签:

- **subject(主体)**:`human_clothing`(人类服装)、`pet`(宠物)或 `not_clothing`(非服装)。狗狗背带和束缚带在商品包装照上看起来很像。假发、化妆品和家居用品会被标记为非服装。
- **swimwear(泳装)**:`regular`(常规)、`near_micro`(近微型)或 `micro`(微型)。常规和近微型属于 `revealing`(暴露),微型属于 `adult`(成人)。商品名称中包含“微型比基尼”并不起决定作用,照片才是关键。
- **ravewear(狂欢节服装)**:true 或 false,适用于音乐节服装。这不会改变安全等级,但这属于模型最不确定的类别,因此了解这一点会有帮助。

这些等级描述的是输出结果,而不是商品或店铺。适当的拦截策略取决于受众:内衣品牌会允许 `lingerie`(内衣)级别的商品,而儿童用品市场可能会拦截 `revealing`(暴露)级别的商品。该模型还会返回一个 `blocked`(拦截)标志(即 `adult` 的概率为 0.3 或更高),相比仅依据最高等级,它能拦截更多的成人商品,且误拦率上升很小。

## 疑难案例

大多数商品都很容易判断。制定策略是为了应对那些难以判断的商品,每条规则都源于需要做出决策的真实商品:

| 商品 | 等级 | 原因 |
|---|---|---|
| 作为健身服出售的运动内衣 | ok(正常) | 在公共场合作为上衣穿着 |
| 同样款式但作为内衣文胸出售 | lingerie(内衣) | 女士内衣 |
| 蕾丝文胸,照片中乳头清晰可见 | adult(成人) | 乳头部位透视 |
| 男士平角内裤 | revealing(暴露) | 泳衣级别的覆盖度 |
| 潜水服、防磨衣、布基尼泳衣 | ok(正常) | 全面覆盖 |
| 皮裤、乳胶质感连衣裙 | ok(正常) | 时尚单品 |
| 作为恋物癖服装出售的皮革或乳胶紧身衣 | adult(成人) | 恋物癖服装 |
| 穿在衬衫外面的皮革胸衣 | ok(正常) | 穿在衣服外面的配饰 |
| 直接穿在裸露皮肤上的束缚带 | adult(成人) | 恋物癖物品 |
| 万圣节动物面具 | ok(正常) | 服装配饰 |
| 宠物扮演面具 | adult(成人) | 恋物癖面具 |
| 搭配在连衣裙外面的身体链 | ok(正常) | 穿在衣服外面的珠宝首饰 |
| 戴在裸露躯干上的身体链 | adult(成人) | 里面什么都没穿 |
| 像衣服一样包裹身体的 Cosplay 服装 | ok(正常) | 服装 |
| 内衣风格的动漫服装 | adult(成人) | 性感化的 Cosplay 服装 |

完整的策略以及每个等级和标签的具体规则,已作为 [LABELLING_POLICY.md](https://huggingface.co/Genlook/tryon-safety-classifier/blob/main/LABELLING_POLICY.md) 文件与模型权重一起发布。

本文顶部的示例是在我们自己的演示目录中运行发布的模型所得出的结果。长袖泳衣是一个很有用的案例:虽然有长袖和前拉链,但下半身的剪裁像连体泳衣,因此虚拟试穿结果展示了泳衣级别的覆盖度,模型将其判定为 `revealing`(暴露)。我们目录中它旁边的挂脖运动内衣则以 0.97 的置信度保持为 `ok`(正常)。

## 我们是如何构建它的

**数据。** 约 2,600 件商品(约 5,000 张照片)来自在线商店目录,专门挑选了涵盖疑难案例的商品:内衣、微型泳装、恋物癖服装、音乐节服装、Cosplay 服装和宠物服装。同时,我们还加入了一大批日常时尚服饰,以防止模型过度拦截。我们只使用商品照片,从不使用顾客的照片。任何可能在暴露或性暗示背景下展示未成年人的商品,都会从数据中彻底剔除。

**标注。** Claude 在查看每张照片并阅读标题和描述后,按照书面策略对每件商品进行了标注。人工审核员检查了每个级别的校准示例,并纠正了边界案例,这些调整又反馈到了策略中。该策略经历了几个版本的迭代;例如,当明确了大多数内衣并非露骨商品后,`lingerie`(内衣)级别就从 `adult`(成人)级别中分离了出来。

**模型。** 基础模型是 Google 基于 Apache-2.0 协议开源的 SigLIP 2 (so400m,patch 16,384 px)。我们发布了两个变体:

| 变体 | 大小 | 说明 |
|---|---|---|
| finetuned(微调版,默认) | 约 0.9 GB | 最后的 6 个 Transformer 块和池化头进行端到端训练,带有四个线性头 |
| frozen(冻结版) | 在 SigLIP 2 基础之上增加约 120 KB | 原始的视觉塔,基于照片嵌入平均值和最大值的逻辑回归头 |

模型会对商品的所有照片进行综合打分,因为一张照片经常会掩盖另一张照片展示的细节(比如背面视图或面料的细节特写)。

我们还尝试了使用相同的策略提示词来驱动前沿的大型语言模型 (LLM)。它的准确率很接近,但每次调用大约需要 1.6 秒,而且仍然需要一个处理超时的备用方案。而视觉分类器在 GPU 上处理每张照片只需几十毫秒,每次都能给出相同的答案,并且可以在策略改变时重新训练。

## 它的表现如何

对 2,596 件商品进行五折交叉验证:每件商品都由一个在训练期间从未见过它的模型进行评分。

| | finetuned(微调版) | frozen(冻结版) |
|---|---|---|
| 准确率,4 个级别 | 94.6% | 94.2% |
| 漏网的成人商品,`blocked` 标志 | 534 个中的 34 个 | 534 个中的 39 个 |
| 误判的成人商品,`blocked` 标志 | 52 个 | 55 个 |
| 内衣召回率 | 90% | 89% |
| 主体准确率 | 99.2% | |
| 泳装标签准确率 | 90.0% | |

按商品组划分(微调版,最高级别):

| 分组 | 商品数量 | 准确率 |
|---|---|---|
| 日常时尚目录 | 1,032 | 97.5% |
| 绳索和束缚装备 | 75 | 100% |
| 泳装品牌 | 230 | 95.2% |
| 内衣品牌 | 120 | 94.2% |
| 动漫和 Cosplay | 63 | 93.7% |
| 恋物癖、内衣和宠物目录 | 631 | 92.6% |
| 异域风情和微型泳装 | 330 | 91.8% |
| 音乐节和狂欢节服装 | 115 | 85.2% |

真正的微型泳装:95 件中成功拦截 91 件。

测试集是经过刻意挑选的,难度很高。在日常时尚目录(大多数商店销售的商品类型)中,准确率高达 97.5%。

## 局限性

- **轻薄透明的内衣是最难界定的。** 乳头或生殖器是否清晰可见是区分 `lingerie`(内衣)和 `adult`(成人)的关键,而看起来相似的商品可能分别属于这两边。剩下的大部分错误都出在这里。
- **音乐节和狂欢节服装是表现最弱的一组。** 渔网、网眼布和水钻等元素会让模型倾向于将其判定为 `adult`(成人)。
- **主要针对西方的电商摄影风格。** 对于差异很大的照片风格,预计准确率会降低。
- **它只对商品进行分类,不对人进行分类。** 请勿使用它来识别个人或做出针对个人的决定。

## 如何使用

```python
# pip install torch open_clip_torch safetensors huggingface_hub pillow
from huggingface_hub import hf_hub_download
import importlib.util

spec = importlib.util.spec_from_file_location(
    "tryon_safety",
    hf_hub_download("Genlook/tryon-safety-classifier", "tryon_safety.py"),
)
tryon_safety = importlib.util.module_from_spec(spec)
spec.loader.exec_module(tryon_safety)

clf = tryon_safety.TryOnSafetyClassifier.from_pretrained(
    "Genlook/tryon-safety-classifier", revision="v1.0"
)
pred = clf.predict(["front.jpg", "back.jpg"])  # 一件商品的所有照片
print(pred.level, pred.blocked, pred.subject, pred.swimwear, pred.ravewear)
```

请固定 `revision="v1.0"` 版本,这样在您未主动选择的情况下,更新永远不会改变您的结果。推理过程只需要 `open_clip` 和 `torch`,模型权重为 safetensors 格式。

如果您发现了假阳性、假阴性案例,或者对下一个版本有任何想法,欢迎在[模型仓库](https://huggingface.co/Genlook/tryon-safety-classifier)的 Discussions(讨论)选项卡中留言。

## 这对 Genlook 意味着什么

[Genlook 试穿 API](https://platform.genlook.app) 已经在返回虚拟试穿结果之前,对每件商品进行了检查:成人和恋物癖商品会被拒绝处理;泳衣、内衣和女士内衣需要付费账户才能使用。被拒绝的虚拟试穿请求将返回 `CONTENT_POLICY_VIOLATION` 错误,并退还相应的积分(请参阅[错误参考文档](/docs/tryon-api/errors))。这个分类器正是我们为了这项检查而构建的模型。

对于开发者来说,这意味着安全性已经内置于 API 中,无需您在外部额外构建。一个端点即可覆盖所有商品类型,订阅套餐下每次虚拟试穿的费用为 0.02 美元,大用量情况下可低至 0.015 美元(按需付费模式为 0.04 美元),并且新注册账户都会获赠免费积分。

## 总结

- **发布内容:** 一个基于 Apache-2.0 协议和 SigLIP 2 的分类器,通过商品照片预测该商品虚拟试穿后会展示出什么画面。
- **为什么需要它:** NSFW 检测器只判断商品照片的像素,这对于虚拟试穿来说是答非所问。其中三个模型在我们的标签测试中仅获得了 48% 到 62% 的准确率。
- **输出结果:** 四个等级(正常、暴露、内衣、成人),以及主体、泳装和狂欢节服装标签。
- **准确率:** 在一个刻意提高难度的测试集中,四个等级的整体准确率为 94.6%;在日常时尚类目中准确率为 97.5%;在绳索和束缚装备类目中准确率为 100%。
- **开源情况:** 模型权重、推理代码和标签策略已公开。训练数据未公开。

---

_[在 Hugging Face 获取模型](https://huggingface.co/Genlook/tryon-safety-classifier)、[在 platform.genlook.app 获取 API 密钥](https://platform.genlook.app),或者[为您的网店添加虚拟试穿功能](/get-started)。_

<Faq>
  <FaqItem
    question="什么是虚拟试穿安全分类器?"
    answer="它是 Genlook 基于 Apache-2.0 协议发布的一款开源图像分类器。它可以读取商品照片,并预测虚拟试穿该商品会展示出的画面等级:ok(正常)、revealing(暴露)、lingerie(内衣)或 adult(成人)。它还会给商品主体(人类服装、宠物或非服装)、泳装覆盖度以及音乐节服装打上标签。"
  />
  <FaqItem
    question="为什么不能在虚拟试穿中使用 NSFW 检测器?"
    answer="NSFW 检测器只根据图像本身的像素进行判断。而对于虚拟试穿来说,商品照片并不是最终的输出结果:例如一张平铺拍摄的内衣照片本身不包含任何裸露画面,但虚拟试穿结果却会展示顾客穿着内衣的样子。根据我们的标签测试,三个开源 NSFW 分类器的一致率仅为 48% 到 62%。"
  />
  <FaqItem
    question="它的准确率有多高?"
    answer="在一个包含 2,596 件商品(专为涵盖疑难案例而挑选)的五折交叉验证测试集中,它在四个等级上的准确率达到了 94.6%,在日常时尚目录中的准确率达到了 97.5%。借助 `blocked`(拦截)标志,它在 534 件成人商品中仅漏掉了 34 件。"
  />
  <FaqItem
    question="我可以将其用于商业用途吗?"
    answer="可以。该模型与其基础模型 SigLIP 2 一样,均采用 Apache-2.0 协议开源。不过训练数据尚未公开。"
  />
  <FaqItem
    question="Genlook 虚拟试穿 API 包含安全检查吗?"
    answer="是的。在返回虚拟试穿结果之前,我们会对每件商品进行检查。成人和恋物癖商品会被拒绝处理;泳装、男士内裤和女士内衣需要付费账户才能使用;被拒绝的虚拟试穿请求将获得退款。成人用品零售商可以通过 support@genlook.app 申请访问权限。"
  />
</Faq>