Hoy lanzamos el Clasificador de seguridad para probadores virtuales en Hugging Face bajo la licencia Apache-2.0. Analiza las fotos de un producto y responde a una sola pregunta: si un cliente se lo prueba, ¿qué mostrará la foto generada?
Lo creamos para filtrar los productos antes de que lleguen a un modelo de probador virtual. Cualquier servicio de prueba virtual que acepte imágenes de productos aleatorias se enfrenta al mismo problema, así que hemos decidido publicar el modelo, la política de etiquetado y la evaluación.
Por qué los detectores NSFW no funcionan en probadores virtuales
Un probador virtual toma la foto de una persona y la foto de un producto, y devuelve una imagen de la persona llevando dicho producto. El riesgo reside en el resultado final, pero lo único que puedes comprobar antes de generarlo es el producto.
Los detectores NSFW genéricos evalúan los píxeles de la imagen que reciben. Y esa no es la pregunta adecuada para la foto de un producto:
- Una foto plana de lencería no contiene desnudos. Pero el resultado del probador virtual mostrará a la clienta en lencería.
- Unas pezoneras sobre un fondo blanco son solo unos centímetros de tela. Pero el resultado del probador virtual será un topless.
- Una máscara fetiche en un maniquí no es explícita. Pero sigue siendo un producto sexual.
- Una modelo fotografiada desnuda llevando solo un collar es una imagen explícita. Pero el collar es un producto normal.
Cuando probamos tres populares clasificadores de imágenes NSFW de código abierto (NudeNet, nsfw-vit y Falconsai) en un conjunto inicial de 141 productos etiquetados, solo coincidieron con nuestras etiquetas entre un 48 y un 62 % de las veces. ShieldGemma 2 de Google, utilizando políticas personalizadas redactadas para esta misma cuestión, alcanzó el 71,6 %. Los modelos funcionan como deberían. Simplemente, responden a una pregunta distinta.
Qué predice el clasificador
Cada producto recibe un nivel, ordenado por gravedad:
| Nivel | Qué muestra el resultado del probador virtual | Ejemplos |
|---|---|---|
ok | El cliente vestido normalmente | Ropa de diario, ropa deportiva, trajes de neopreno, cosplay que cubre como ropa normal, accesorios |
revealing | Cobertura nivel traje de baño | Bikinis y bañadores, ropa interior masculina, fajas, micro shorts, la mayoría de la ropa de festival |
lingerie | Ropa interior femenina, sin zonas íntimas visibles | Sujetadores, bragas, conjuntos de lencería, bodys, ligueros, corsés usados como lencería |
adult | Zonas íntimas expuestas o un producto sexual | Micro bañadores, pezoneras, prendas transparentes, diseños de copa abierta, ropa BDSM y fetiche, disfraces de rol sexual |
Junto al nivel, se incluyen tres resultados adicionales:
- subject:
human_clothing,petonot_clothing. Un arnés para perros y uno de bondage se parecen mucho en una foto de producto. Las pelucas, los cosméticos y los artículos para el hogar se marcan como no ropa (not_clothing). - swimwear:
regular,near_microomicro. Los regulares y casi micro sonrevealing, los micro sonadult. La palabra "microkini" en el nombre de un producto no decide nada; las fotos sí. - ravewear: verdadero o falso, para trajes de festival. No cambia el nivel, pero la ropa de fiesta es donde el modelo duda más, por lo que resulta útil saberlo.
Los niveles describen el resultado, no el producto ni la tienda. El filtro adecuado depende del público: una marca de lencería permitirá la etiqueta lingerie, mientras que un marketplace infantil podría bloquear la etiqueta revealing. El modelo también devuelve un indicador blocked (probabilidad de adult de 0,3 o superior), que detecta más productos para adultos que el nivel principal por sí solo, a cambio de un pequeño aumento en los bloqueos falsos.
Los casos difíciles
La mayoría de los productos son fáciles de clasificar. La política existe para aquellos que no lo son, y cada regla proviene de un producto real que requirió una decisión:
| Producto | Nivel | Por qué |
|---|---|---|
| Sujetador deportivo vendido como ropa de gimnasio | ok | Se usa como top en público |
| El mismo corte vendido como bralette de lencería | lingerie | Ropa interior femenina |
| Sujetador de encaje, pezones claramente visibles en las fotos | adult | Transparente sobre los pezones |
| Bóxers para hombre | revealing | Cobertura nivel traje de baño |
| Traje de neopreno, camiseta de surf, burkini | ok | Cobertura total |
| Pantalones de cuero, vestido con aspecto de látex | ok | Artículos de moda |
| Traje tipo "catsuit" de cuero o látex vendido como ropa fetiche | adult | Traje fetiche |
| Arnés de pecho de cuero sobre una camisa | ok | Accesorio sobre la ropa |
| Arnés de correas sobre la piel desnuda | adult | Artículo fetiche |
| Máscara de animal para Halloween | ok | Disfraz |
| Máscara de "pup-play" | adult | Máscara fetiche |
| Cadena para el cuerpo estilizada sobre un vestido | ok | Joyería sobre la ropa |
| Cadena para el cuerpo sobre un torso desnudo | adult | Se lleva sin nada debajo |
| Cosplay que cubre como la ropa normal | ok | Disfraz |
| Traje de anime estilo lencería | adult | Cosplay sexualizado |
La política completa, con las reglas para cada nivel y etiqueta, está publicada como LABELLING_POLICY.md junto a los pesos del modelo.
Los ejemplos al principio de este artículo son del modelo publicado ejecutándose en nuestro propio catálogo de demostración. El bañador de manga larga es un caso útil: tiene manga larga y cremallera frontal, pero la parte inferior tiene corte de bañador de una pieza, por lo que el probador virtual muestra una cobertura de nivel traje de baño y el modelo dice revealing. El sujetador deportivo con cuello halter que aparece a su lado en nuestro catálogo se mantiene como ok con un 0,97.
Cómo lo creamos
Datos. Unos 2600 productos (aproximadamente 5000 fotos) de catálogos de tiendas online, elegidos para cubrir los casos difíciles: lencería, micro bañadores, ropa fetiche, ropa de festival, cosplay y ropa para mascotas, junto a una gran proporción de moda de diario para que el modelo no bloquee en exceso. Solo se usan fotos de productos, nunca fotos de clientes. Cualquier producto que pudiera mostrar a un menor en un contexto revelador o sexual se eliminó de los datos de forma permanente.
Etiquetas. Claude etiquetó cada producto tras analizar cada foto y leer el título y la descripción, siguiendo la política redactada. Un revisor humano comprobó ejemplos de calibración para cada nivel y corrigió los casos límite, y esas decisiones se reincorporaron a la política. La política pasó por varias versiones; por ejemplo, el nivel lingerie se separó de adult cuando quedó claro que la mayoría de la ropa interior no es explícita.
Modelo. La base es SigLIP 2 de Google (so400m, parche 16, 384 px), Apache-2.0. Se incluyen dos variantes:
| Variante | Tamaño | Qué es |
|---|---|---|
| finetuned (predeterminado) | unos 0,9 GB | Los últimos 6 bloques del transformador y el cabezal de agrupación (pooling) entrenados de principio a fin, con cuatro cabezales lineales |
| frozen | unos 120 KB sobre SigLIP 2 | La torre de visión original, cabezales logísticos en la media y el máximo de las incrustaciones (embeddings) de la foto |
Un producto se puntúa en base a todas sus fotos, porque a menudo una foto oculta lo que otra muestra (una vista trasera, una toma detallada de la tela).
También probamos un LLM de última generación con la misma política. Estuvo cerca en precisión, pero cada llamada tardaba unos 1,6 segundos y seguía necesitando un sistema de respaldo para los tiempos de espera agotados. Un clasificador de visión se ejecuta en decenas de milisegundos por foto en una GPU, da siempre la misma respuesta y puede volver a entrenarse cuando cambie la política.
Resultados y precisión
Validación cruzada quíntuple sobre 2596 productos: cada producto es puntuado por un modelo que nunca lo vio durante el entrenamiento.
| finetuned | frozen | |
|---|---|---|
| Precisión, 4 niveles | 94,6 % | 94,2 % |
Productos para adultos no detectados, indicador blocked | 34 de 534 | 39 de 534 |
Falsos adultos, indicador blocked | 52 | 55 |
| Tasa de recuperación (Recall) lencería | 90 % | 89 % |
| Precisión del sujeto (subject) | 99,2 % | |
| Precisión etiqueta ropa de baño | 90,0 % |
Por grupo de productos (finetuned, nivel superior):
| Grupo | Productos | Precisión |
|---|---|---|
| Catálogos de moda de diario | 1032 | 97,5 % |
| Cuerdas y bondage | 75 | 100 % |
| Marcas de trajes de baño | 230 | 95,2 % |
| Marcas de lencería | 120 | 94,2 % |
| Anime y cosplay | 63 | 93,7 % |
| Catálogos fetiche, lencería y mascotas | 631 | 92,6 % |
| Trajes de baño exóticos y micro | 330 | 91,8 % |
| Festival y fiesta (rave) | 115 | 85,2 % |
Micro bañadores reales: 91 de 95 detectados.
El conjunto de pruebas es difícil a propósito. En los catálogos de moda de diario, el tipo de ropa que venden la mayoría de las tiendas, la precisión es del 97,5 %.
Limitaciones
- La lencería transparente es el límite más complicado. Que los pezones o los genitales sean claramente visibles es lo que decide entre
lingerieyadult, y hay productos muy similares en ambos lados. La mayoría de los errores restantes ocurren aquí. - La ropa de festival y de fiesta es el grupo más débil. Las redes, las mallas y los diamantes de imitación empujan al modelo hacia la etiqueta
adult. - Fotografía de comercio electrónico principalmente occidental. Es de esperar una menor precisión en estilos fotográficos muy diferentes.
- Clasifica productos, no personas. No lo utilices para identificar o tomar decisiones sobre una persona.
Cómo usarlo
# 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"]) # todas las fotos de un producto
print(pred.level, pred.blocked, pred.subject, pred.swimwear, pred.ravewear)
Fija la versión con revision="v1.0" para que ninguna actualización altere tus resultados sin que tú lo elijas. La inferencia solo necesita open_clip y torch, y los pesos son safetensors.
Los falsos positivos, falsos negativos y las ideas para la próxima versión son bienvenidos en la pestaña Discussions del repositorio del modelo.
Qué significa esto para Genlook
La API de prueba virtual de Genlook ya comprueba cada producto antes de devolver una prueba virtual: los productos para adultos y fetiche se rechazan, y los trajes de baño, ropa interior y lencería requieren una cuenta de pago. Una prueba virtual rechazada falla con CONTENT_POLICY_VIOLATION y se reembolsa su crédito (referencia de errores). Este clasificador es el modelo que creamos para esa misma comprobación.
Para los desarrolladores, esto significa que la seguridad es parte de la API en lugar de algo que haya que construir en torno a ella. Un único punto de conexión (endpoint) cubre todos los tipos de productos, a un coste de 0,02 $ por prueba virtual en un plan, reduciéndose a 0,015 $ por volumen (0,04 $ en la modalidad de pago por uso), y las cuentas nuevas empiezan con créditos gratuitos.
Resumen
- El lanzamiento: un clasificador Apache-2.0 basado en SigLIP 2 que predice qué mostraría una prueba virtual de un producto, analizando las fotos de dicho producto.
- Por qué existe: los detectores NSFW evalúan los píxeles de la foto de un producto, lo cual es un enfoque incorrecto para los probadores virtuales. Tres de ellos obtuvieron entre un 48 y un 62 % en nuestras etiquetas.
- Resultados: cuatro niveles (ok, revealing, lingerie, adult), además de etiquetas para el sujeto, ropa de baño y ropa de festival.
- Precisión: 94,6 % en cuatro niveles en un conjunto deliberadamente difícil, 97,5 % en moda de diario, 100 % en cuerdas y bondage.
- Abierto: los pesos, el código de inferencia y la política de etiquetado son públicos. Los datos de entrenamiento no lo son.
Obtén el modelo en Hugging Face, consigue una clave API en platform.genlook.app, o añade el probador virtual a tu tienda.
FAQ
