La realidad de que hay aproximadamente 4.54 mil millones de usuarios de Internet (junio de 2020) en todo el mundo, generando una cantidad de contenido sin precedentes solo aumenta el impulso de encontrar un enfoque para optimizar la moderación de contenido. Y esta tarea se está volviendo más pesada según los hechos de que el número de usuarios activos es constantemente removedor, los volúmenes de contenido también crecen exponencialmente, el aprendizaje automático y la IA pueden ser muy caros y la moderación manual es muy lento y retrasada en el tiempo.
Así que ahora estamos en un punto en el que cualquier plataforma que permita contenido generado por el usuario enfrenta un problema similar. Afortunadamente, el aprendizaje automático ya ha madurado hasta el punto en que los avances en la potencia de procesamiento de computadoras, el almacenamiento, las herramientas de datos, la web, etc., las tecnologías de aprendizaje automático hicieron que se vuelvan cada vez más asequibles. Esto y el esfuerzo constante de la innovación, llevó al equipo de Sashido a crear este servicio de moderación de contenido completamente funcional simple y elegante construido con solo herramientas y bibliotecas de código abierto . Consiste en tres componentes principales: la API REST de clasificación de imágenes, el motor de automatización y el panel de administración, que se puede integrar por separado o en total en cualquier proyecto Node.js del servidor de Parse y alojado en cualquier lugar.
Un simple ilustario de nuestro escritorio y panel de administración amigable para dispositivos móviles. Revise la demostración completa aquí.
Las imágenes que se muestran para su aprobación en la aplicación de administración son las que se marcan para la moderación manual del motor de automatización en función de sus criterios específicos.
Aquí hay algunos ejemplos de cómo las imágenes de clases específicas son clasificadas por la API REST.
Fuente de la imagen | Fuente de la imagen | Fuente de la imagen |
---|---|---|
Resultado de clasificación | Resultado de clasificación | Resultado de clasificación |
[{ "ClassName": "Neutral", "Probabilidad": 0.93821 }, { "ClassName": "Drawing", "Probabilidad": 0.05473 }, { "ClassName": "Sexy", "Probabilidad": 0.00532 }, { "ClassName": "Hentai", "Probabilidad": 0.00087 }, { "ClassName": "Porn", "Probabilidad": 0.00085 }] | [{ "ClassName": "Sexy", "Probabilidad": 0.99394 }, { "ClassName": "Neutral", "Probabilidad": 0.00432 }, { "ClassName": "Porn", "Probabilidad": 0.00164 }, { "ClassName": "Drawing", "Probabilidad": 0.00006 }, { "ClassName": "Hentai", "Probabilidad": 0.00001 }] | [{ "ClassName": "Drawing", "Probabilidad": 0.96063 }, { "ClassName": "Neutral", "Probabilidad": 0.03902 }, { "ClassName": "Hentai", "Probabilidad": 0.00032 }, { "ClassName": "Sexy", "Probabilidad": 0.00001 }, { "ClassName": "Porn", "Probabilidad": 0.00005 }] |
Demostración neutral | Demo sexy | Demostración de dibujo |
Este servicio está integrado en Node.js con Mongo DB y servidor de PARSE. Puede usarlo en una aplicación expresa estándar, pero tenga en cuenta que la estructura de archivos del repositorio es específica de un análisis. El código está organizado en una carpeta src
y src/cloud/main.js
es el archivo root para el servicio. React Vizualización La lógica se coloca respectivamente en la carpeta scr/react
.
La API REST funciona con la clasificación NSFW.JS, que utiliza modelos previamente capacitados de TensorFlow. Dada una URL, devuelve las predicciones de la probabilidad de que la imagen caiga en cada una de las clases: dibujo, neutral, sexy, porno y hentai. Más detalles sobre la lógica detrás y la pila utilizada que puede encontrar en esta publicación de blog.
La API ofrece dos enfoques para clasificar imágenes, desde una ruta expresa o directamente desde una función de código de nube utilizando cualquiera de los SDK de análisis o la API de reposo de análisis.
Clasificar desde el punto final expreso
curl http://localhost:1337/api/image/classify?url=https://nsfw-demo.sashido.io/sexy.png
Clasifique desde una función de código de nube NSFWIMAGECLASSIFY - Ejemplo de API REST.
curl -X POST
-H "X-Parse-Application-Id: myAppId"
-H "X-Parse-REST-API-Key: myRestApiKey"
--data-urlencode "{"url":"https://nsfw-demo.sashido.io/sexy.png"}"
http://localhost:1337/functions/nsfwImageClassify
El propósito del motor de automatización es verificar cómo la clasificación de una determinada imagen corresponde a los parámetros que ha establecido como seguros para su proyecto. El proceso se automatiza con un activador posterior del servidor de análisis.
Al principio, es esencial definir cuál de las cinco clases y valores NSFW puede contener imágenes tóxicas y cuáles son seguras. Todas las clases que pueden ser inquietantes para su audiencia deben incluirse en las preferencias de moderación.
Para ilustrar cuál es la idea y la configuración, imaginemos que necesitamos establecer los criterios para la aplicación de citas de los adultos. Como cualquier aplicación de citas, los usuarios tienen una foto de perfil y pueden subir diferentes fotos. Podemos suponer que el tipo de fotos debería ser principalmente neutral ... y tal vez también se permitan algunas fotos sexys. Entonces agregaremos todas las demás clases a nuestras preferencias de moderación. Algo como:
{
"Sexy": { "min": 0.6, "max": 1 },
"Drawing": { "min": 0.5, "max": 0.8 },
"Porn": { "min": 0.4, "max": 0.8 },
"Hentai": { "min": 0.2, "max": 0.8 }
}
El motor de automatización reexpijará automáticamente todas las imágenes que se clasifican por encima del límite max
establecido en nuestras preferencias y aprobarán todos los que están por debajo del valor min
.
Más detalles sobre cómo ajustar los parámetros para su proyecto que puede encontrar en el artículo aquí.
Las preferencias de moderación se guardarán en un parámetro de configuración de moderacionescores para la aplicación de producción, ya que eso le permitirá modificarlas en la mosca si es necesario.
Un desencadenante posterior está conectado a la colección generada por el usuario verifica automáticamente fotos recién cargadas y las marca como seguras, eliminadas o para moderación. AfterSafe contiene lógica para hacer coincidir cómo la clasificación API de una imagen corresponde a las preferencias de moderación definidas. Según todos los datos aprobados, se toma la decisión y el resultado se guarda en su base de datos.
Para mantener un registro ordenado de las predicciones API REST y los resultados de la automatización del motor, deberá agregar algunas columnas a la colección de su base de datos que contiene contenido generado por el usuario .
Debe agregar las siguientes columnas a UserImageCollection
min
de sus preferencias de moderación, está marcada isSafe - true
.deleted - true
. Esas imágenes no se eliminarán automáticamente del almacenamiento de archivos.Los disparos posteriores automáticamente, pero hemos agregado un punto final API adicional, en caso de que necesite verificar la manual si una imagen es tóxica para su audiencia.
curl http://YOUR_PARSE_SERVER_URL/api/image/is_safe?url=https://nsfw-demo.sashido.io/sexy.png
El toque final es una aplicación de administración basada en ReactJS. Tiene una función simple de inicio de sesión/cierre de sesión y solo se otorgan a los moderadores aprobados acceso.
Las imágenes que marcan el motor de automatización como moderationRequired=true
se muestran en la aplicación. Nos hemos asegurado de construir tanto la interfaz de usuario de escritorio como para dispositivos móviles, para que pueda aprobar o rechazar imágenes fácilmente incluso desde su teléfono mientras viaja.
¡Prueba solo jugando con las imágenes en nuestra demostración!
Node.js> = 10.2.1
Mongo DB
Servidor de análisis
Clon el repositorio:
git clone https://github.com/SashiDo/content-moderation-application.git
cd content-moderation-application
Copie el ENV.example a .env archivo y establezca las variables de entorno para su entorno local con su editor favorito:
cp env.example .env
Coloque su URI MongoDB y URL de archivos. Si su aplicación está alojada en Sashido, puede usar las credenciales de su proyecto Sashido. Puede encontrar todas las teclas y URL en el tablero de aplicaciones -> Configuración de la aplicación.
¡NÓTESE BIEN! Para cargar imágenes que requieren moderación manual en la aplicación de administración localmente, ¡también deberá colocar el APP_ID real!
Como este es un ejemplo de función completa, todas las dependencias están presentes en el paquete.json. Solo necesitas ejecutar:
npm install
npm run dev
Establezca el siguiente parse.configs para su servidor de producción.
El objeto ModerationsCores debe guardarse como un parse.config, por lo que las preferencias se pueden actualizar sobre la marcha.
Opción de Automation de moderación del tipo booleano que permite habilitar/deshabilitar la automatización de moderación de contenido.
Para la producción, debe establecer la URL del modelo NSFW , el tamaño de la forma del modelo NSFW y la variable para el almacenamiento en caché de las configuraciones de automatización .
URL modelo | Tamaño | Tamaño de forma | Exactitud |
---|---|---|---|
https://ml.files-sashido.cloud/models/nsfw_inception_v3/ | Enorme | 299 | 93% |
https://ml.files-sashido.cloud/models/nsfw_mobilenet_v2/90/ | 2.6 MB | 224 | 90% |
https://ml.files-sashido.cloud/models/nsfw_mobilenet_v2/93/ | 4.2 MB | 224 | 93% |
Tenga en cuenta que el modelo Inception_V3 utilizado para estos proyectos tiene un alto consumo de RAM/CPU. Mientras que los dos modelos MobileNet son mucho más livianos.
TF_MODEL_URL = MODEL_URL
TF_MODEL_INPUT_SHAPE_SIZE = MODEL_SHAPE_SIZE
CONFIG_CACHE_MS = CONFIG_CAHE_IN_MILISECONDS
# Example
TF_MODEL_URL = " https://ml.files-sashido.cloud/models/nsfw_mobilenet_v2/93/ "
TF_MODEL_INPUT_SHAPE_SIZE = 224
CONFIG_CACHE_MS = 10000
Conecte su aplicación Sashido con GitHub y luego el código se puede implementar fácilmente con dos comandos simples para agregar una rama remota y presionar cambios.
git remote add production [email protected]:parsegroundapps/<your-pg-app-your-app-repo>.git
git push -f production master
Gracias por mirar esta sección. Estamos abiertos a cualquier idea interesante, por lo que si tiene una y está dispuesto a compartir: bifurca el repositorio, aplique cambios y abra una solicitud de extracción. :)
Copyright © 2020, Cloudstap AD. Vea la licencia para obtener más detalles.