我們今天在 Hugging Face 上以 Apache-2.0 授權發布了 [虛擬試穿安全分類器](https://huggingface.co/Genlook/tryon-safety-classifier)(Virtual Try-On Safety Classifier)。它能透過商品照片回答一個核心問題:如果顧客試穿這件商品,生成的照片會呈現什麼畫面?

我們開發此模型的初衷,是在商品進入 [虛擬試穿](/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`。普通(regular)和近乎迷你(near micro)屬於 `revealing`,迷你(micro)則屬於 `adult`。商品名稱中的「microkini」無關緊要,一切由照片決定。
- **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 的 SigLIP 2(so400m,patch 16,384 px),採用 Apache-2.0 授權。我們提供兩種變體:

| 變體 | 大小 | 內容 |
|---|---|---|
| 微調版 (預設) | 約 0.9 GB | 最後 6 個 transformer 區塊和池化層進行端到端訓練,搭配四個線性層 |
| 凍結版 | 在 SigLIP 2 基礎上增加約 120 KB | 原始視覺編碼器,在照片嵌入特徵的平均值與最大值上應用邏輯迴歸分類器 |

系統會針對商品的所有照片進行綜合評分,因為一張照片中隱藏的細節往往會在另一張照片(如背面圖、布料特寫)中顯露。

我們也曾嘗試使用輸入相同策略的頂尖 LLM。雖然準確率相近,但每次呼叫大約需要 1.6 秒,且仍需為超時情況設定備用方案。而視覺分類器在 GPU 上處理每張照片只需幾十毫秒,每次都會給出相同的答案,並且可以在策略改變時重新訓練。

## 模型表現

我們對 2,596 件商品進行了五折交叉驗證:每件商品都由在訓練期間從未見過它的模型進行評分。

| | 微調版 | 凍結版 |
|---|---|---|
| 準確率,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),新帳號還可獲得免費額度。

## 總結

- **本次發布:** 基於 SigLIP 2 開發、採用 Apache-2.0 授權的分類器,能透過商品照片預測商品虛擬試穿後的結果畫面。
- **存在意義:** NSFW 偵測器根據商品照片的像素進行判斷,這在虛擬試穿中是錯誤的切入點。三款 NSFW 偵測器在我們的標籤測試中,準確率僅有 48% 到 62%。
- **輸出結果:** 四個分級(ok、revealing、lingerie、adult),以及主體、泳裝和派對服飾標籤。
- **準確率:** 在刻意設計的高難度資料集中,四個分級的綜合準確率為 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>