Mayo de 2017

Volumen 32, número 5

Cognitive Services: proteger aplicaciones web con Microsoft Content Moderator

Por Maarten Van De Bospoort | Mayo de 2017

Cada día, miles de millones de usuarios hacen fotos y graban vídeos para compartirlos en las redes sociales. Como sabrá cualquiera que haya tratado con contenido generado por el usuario en Internet, el anonimato de la red no tapa necesariamente el mejor comportamiento humano. 

Otra tendencia reciente que cabe destacar es la proliferación de los bots de chat. No hay día en que no se lance un nuevo conjunto de bots capaz de todo, desde reservar viajes hasta coordinar reuniones y realizar transacciones bancarias en línea. Aunque esos bots resultan útiles sin duda alguna, el bot de chat asesino sigue siendo impreciso: el bot que todas las plataformas de mensajería quieren para alcanzar el objetivo de mil millones de usuarios activos al día.

Imaginemos ahora que creó justo eso: Butterfly, el bot que todo el mundo se ve obligado a usar. Los usuarios pueden compartir contenido multimedia con el bot y, a través del algoritmo de Machine Learning secreto, el bot predecirá su futuro para las 24 horas siguientes. Después de un año de duro trabajo, lanzó su bot. De la noche a la mañana, Butterfly se convirtió en viral. Lamentablemente, su nueva empresa soñada se convirtió rápidamente en una pesadilla de relaciones públicas. Los usuarios envían contenido para adultos y subido de tono, que luego se comparte y pasa a estar disponible para otros usuarios del bot. Parte del contenido es perjudicial. Realmente perjudicial. Los usuarios le están demandando, el teléfono suena más de lo normal y recibe amenazas sobre el cierre de su sitio web. Necesita una solución eficaz que le ayude a detectar contenido perjudicial y evitar que se muestre a otros usuarios. Y lo necesita rápido.

Aquí es donde Microsoft Content Moderator sale al rescate.

En este artículo, le mostraremos cómo puede ayudarle Content Moderator. Comenzaremos creando un bot de chat mediante Microsoft Bot Framework, pero tenga en cuenta que la información se aplica por igual a cualquier aplicación web o cliente. Butterfly permitirá a los usuarios finales compartir texto, imágenes y vídeos, y usará Content Moderator para filtrar material inapropiado antes de su publicación. Durante el proceso, aprenderá a configurar flujos de trabajo personalizados de Content Moderator y a ajustar los umbrales de los clasificadores de contenido. También explicaremos los distintos conectores que se pueden usar en el flujo de trabajo, como Texto y Explotación infantil. Comenzaremos con una introducción a la moderación de contenido.

Moderación de contenido

Microsoft tiene una trayectoria dilatada y probada de lucha contra el crimen digital. La Unidad de crímenes digitales de Microsoft trabaja sin cesar para desmantelar redes de robots (botnets), limitar el fraude de soporte técnico, frustrar los intentos de suplantación de identidad (phishing), etc. Un área activa menos visible es la manera en que la unidad contribuye a la aplicación de la ley en todo el mundo al reprimir la explotación infantil. Microsoft ofrece la tecnología PhotoDNA como un servicio gratuito desde 2009. El mismo equipo también presenta ahora la moderación de contenido.

La moderación de contenido es un área de Machine Learning donde los equipos pueden ofrecer una valiosa ayuda a los humanos. La cantidad de datos que generan los usuarios es excesiva para que los humanos puedan revisarla rápidamente y de manera rentable. Y más importante, la moderación de contenido no es una actividad agradable para los humanos. Para ver algunas referencias, consulte tcrn.ch/2n1d9M0.

La moderación de contenido forma parte del creciente conjunto de Microsoft Cognitive Services API que se ejecutan en Azure. Estas API son implementaciones específicas de modelos de Machine Learning, lo que significa que Microsoft entrenó estos modelos con una gran cantidad de datos. Como desarrollador, solo llama a una de las API para obtener un resultado, ya sea Computer Vision API, Speaker Recognition API o Language Understanding API, por citar algunas. Content Moderator Image API usa el reconocimiento de imágenes, un área de Machine Learning que ha experimentado un enorme progreso en los últimos años.

En la Figura 1 se muestra cómo se configura la canalización de Content Moderator. En función de sus necesidades, la moderación de contenido ofrece distintas API a las que llamar, que incluyen la moderación, la revisión y los trabajos en niveles crecientes de capacidad de personalización. Por ejemplo, la API de flujo de trabajo permite modificar mediante programación flujos de trabajo usados en los trabajos. A continuación, puede ver los distintos clasificadores de imagen, texto y vídeo, así como de CSAM, siglas en inglés para referirse a material de abuso sexual de menores. PhotoDNA es la tecnología que ayuda a las organizaciones a combatir la difusión de estas imágenes. El "clasificador" de CSAM funciona de manera un poco diferente a los mencionados anteriormente: PhotoDNA usa una tecnología de hash y coincidencia, que realiza la comparación con una base de datos de imágenes conocidas. En Content Moderator, puede configurar flujos de trabajo que conecten varios filtros (por ejemplo, primera comprobación de CSAM y, a continuación, de contenido para adultos o subido de tono en las imágenes). El flujo de trabajo también puede convocar a humanos para la revisión. Finalmente, la canalización de Content Moderator es flexible y, en un futuro, también permitirá enlazar otras API.

Flujos de contenido del usuario a través de Content Moderator, donde humanos y modelos de Machine Learning cooperan para filtrar material indecente
Figura 1 Flujos de contenido del usuario a través de Content Moderator, donde humanos y modelos de Machine Learning cooperan para filtrar material indecente

Moderar el contenido de los usuarios

Ahora que conoce un poco la tecnología de moderación, vamos a asociarla a nuestro bot Butterfly. Compilaremos el bot con Microsoft Bot Framework, con el toque de Node.js que ofrece Bot Framework para Butterfly. Dado que todas estas API son simples llamadas de API de REST, puede moderar su contenido de manera tan sencilla como lo haría desde C#; en realidad, podría ser aún más fácil, ya que existe un SDK de .NET para Content Moderator (bit.ly/2mXQqQV). 

Existen varios artículos en esta publicación que ofrecen excelentes introducciones sobre los bots. Si todavía no compiló ninguno, le recomiendo encarecidamente consultar lo siguiente:

  • "Bot Framework - Solving Business Problems with the Microsoft Bot Framework" (Bot Framework: resolver problemas empresariales con Microsoft Bot Framework) en msdn.com/magazine/mt788623.
  • "Microsoft Bot Framework: use Bot Framework para acceder a datos de la aplicación en cualquier momento y lugar" (msdn.com/magazine/mt790202)
  • "Bot Framework: cómo mejorar la inteligencia de los bots" (msdn.com/magazine/mt795186)

Otra opción son las guías de inicio rápido de dev.botframework.com, que le permitirán ponerse en marcha sin perder tiempo.

Aquí, usaremos la solución de inicio más rápida para Node.js. Usaremos el modelo de diálogo que proporciona el marco de Node.js para dividir la conversación en distintos diálogos. En el código del diálogo que se muestra en la Figura 2, el bot pide al usuario una dirección URL a una imagen en la primera función. A continuación, el control se devuelve al usuario. Cuando el usuario envía algo de texto, el flujo del diálogo pasa la entrada del usuario a la segunda función. A continuación, el bot reenvía la entrada para su evaluación en moderate.js. En nuestro primer intento, llamamos a Moderator API simple (en lugar de a Review API y Job API, que son más sofisticadas).

Figura 2 Código del diálogo

bot.dialog('/moderateImage', [
  function (session, args) {
    builder.Prompts.text(session, 'Give me a picture URL to moderate, please.');
  },
  function (session, results){
    var input = session.message.text;
    var cm = require('./moderate.js');
    cm( 'ImageUrl', input, function(err, body) {
      if (err) {
        session.send('Oops. Something went wrong.');
        return;
      }
      var output = JSON.stringify(body);
      session.endDialog(output);
    });
  }
]);

Para llamar a Content Moderator API, necesita credenciales, que puede obtener del sitio web de Content Moderator o de Azure. Aquí, usaremos el último enfoque. En Azure Portal (portal.azure.com), haga clic en el signo más de color verde y especifique Cognitive Services para crear una nueva cuenta de Cognitive Services. Después de hacer clic en Crear, especifique Content Moderator como el tipo de API (consulte la Figura 3). Use el nivel F0, ya que es gratuito y permite una llamada por segundo, lo que de momento debería ser suficiente para probar. Una vez creada la cuenta, encontrará el nombre de cuenta y la clave debajo de Claves en Administración de recursos. Tenga en cuenta que usará una de las claves y la cadena de Id. de recurso (de Propiedades) para conectar Content Moderator API al portal de revisiones de Content Moderator más tarde.

Seleccionar Content Moderator en la lista Cognitive Services
Figura 3 Seleccionar Content Moderator en la lista Cognitive Services

Azure Portal también muestra el punto de conexión como https://westus.api.cognitive.microsoft.com/contentmoderator. Aunque esta es la dirección base correcta, es demasiado corta. El punto de conexión completo está en la documentación de Content Moderator.

Como se muestra en la Figura 4, "URL" se especifica como DataRepresentation para enviar la dirección URL a la imagen, aunque puede enviar fácilmente la imagen en un blob. Después de llamar a la API del moderador, el cuerpo del resultado devuelto contiene los datos JSON con las puntuaciones de la imagen. Las puntuaciones van de 0.0 (inocente) a 1.0 (contenido para adultos o muy subido de tono).

Figura 4 Envío de la URL de una imagen a Content Moderator

var unirest = require("unirest");
var url = "https://westus.api.cognitive.microsoft.com/contentmoderator/
  moderate/v1.0/ProcessImage/Evaluate";
module.exports = function(input, cb) {
  unirest.post(url)
    .type("json")
    .headers({
      "content-type": "application/json",
      "Ocp-Apim-Subscription-Key":<Key from the Azure portal>,
    })
    .send({
      "DataRepresentation": "URL",
      "Value": input
    })
    .end(function (res) {
      return cb(res.error, res.body );
    });
};

Puede observar que el resultado, que se muestra en la Figura 5, contiene las puntuaciones de predicción de contenido para adultos o subido de tono, además de las conclusiones sobre si estableció el umbral en las marcas clasificadas. Feliz como una perdiz, genera estas pocas líneas de código en su bot y bloquea todo el contenido subido de tono o para adultos. Implementa la nueva versión del bot en Azure y los usuarios transmiten de nuevo para consultar su oráculo. Uf. Feliz con los resultados, se reúne con su equipo alrededor del surtidor para celebrarlo con una bebida refrescante.

Figura 5 Puntuaciones para la clasificación de contenido para adultos o subido de tono de una imagen

"AdultClassificationScore":0.0324602909386158,
"IsImageAdultClassified":false,
"RacyClassificationScore":0.06506475061178207,
"IsImageRacyClassified":false,
"AdvancedInfo":[],
"Result":false,
"Status":{
  "Code":3000,
  "Description":"OK",
  "Exception":null},
"TrackingId":"WU_ibiza_4470e022-4110-48bb-b4e8-7656b1f6703f_
  ContentModerator.F0_3e598d6c-5678-4e24-b7c6-62c40ef42028"

Apenas da un vistazo al archivo IPA microprocesado y los tweets hacen que su teléfono no deje de vibrar. Tiene un montón de clientes enfadados: "¿Por qué bloquean mis inocentes imágenes?" "Mi hermano puede hacer fotos enseñando mucha más piel. Tienen que arreglarlo."

La clasificación de imágenes es buena, pero no se adapta a todas las situaciones. Las API básicas de Content Moderator que acabamos de usar son capaces sin duda alguna de ayudar a los humanos a tomar buenas decisiones, pero no son perfectas. Una mejora que podríamos haber realizado es ajustar la moderación mediante puntuaciones sin procesar en lugar de usar clasificaciones de verdadero o falso para el contenido para adultos o subido de tono. Además, parece que los usuarios tienden a emplear las mismas imágenes repetidamente. Afortunadamente, Content Moderator proporciona List API para administrar un conjunto de imágenes o texto personalizado que ya filtró. Moderator API realiza alguna coincidencia aproximada con las imágenes, para evitar que los usuarios jugueteen con ella fácilmente y realicen pequeñas modificaciones o cambien su tamaño. Respecto del primer enfoque, esta es una práctica mejora, pero no descarta los falsos positivos a los que el departamento de soporte técnico debe lidiar. Como siempre, la solución óptima se encuentra cuando seres humanos y máquinas trabajan en equipo en los casos más complejos. Computer Vision puede ayudar a detectar los extremos en que las imágenes son claramente para adultos de subidas de tono o no lo son. Para los casos extremos entremedio, podemos decidir, como humanos, en qué lado de la cerca queda el contenido para nuestro escenario concreto. Aquí es donde la herramienta de revisión Content Moderator y la API brillan con todo su esplendor. Veamos cómo se puede usar para mejorar nuestra solución.

Llamada a Moderator Review API

Hasta el momento, el enfoque es simple: Se trata de enviar una imagen y bloquearla o permitirla según las etiquetas de Content Moderator. Ahora, vamos a expandir la solución. La idea es configurar un flujo como se muestra en la Figura 6.

Bot Butterfly en funcionamiento con un flujo de trabajo de Content Moderator
Figura 6 Bot Butterfly en funcionamiento con un flujo de trabajo de Content Moderator

En este escenario, el usuario envía primero una imagen al bot Butterfly. En el paso 2, el servicio web del bot envía la imagen a Content Moderator mediante la operación Job de Review API, que toma el id. del flujo de trabajo como un parámetro. Configuraremos este flujo de trabajo en la herramienta de revisión. Nuestro flujo de trabajo específico (paso 3) permitirá automáticamente todas las imágenes con una puntuación de contenido para adultos o subido de tono por debajo de la especificada (por ejemplo, 0,7) y marcará las que superen un límite determinado (como 0,9). Nuestro bot permitirá el contenido con las puntuaciones bajas y bloqueará el contenido que sea claramente para adultos o subido de tono. En el área gris entremedio, queremos someter el contenido a la herramienta de revisión para que moderadores humanos lo inspeccionen (paso 4). Nuestro equipo de revisores puede decidir cómo tratar el contenido. Cuando terminen la revisión, Content Moderator volverá a llamar al servicio de aplicaciones del bot para compartir el resultado. En ese punto, el bot puede retirar el contenido si está marcado como ofensivo. Observe la flexibilidad aquí. Puede ajustar las puntuaciones en el flujo de trabajo y los revisores pueden decidir qué es apropiado para la aplicación concreta.

Para comenzar, tendrá que registrarse en la herramienta de revisión Content Moderator en bit.ly/2n8XUB6. Puede registrarse con su cuenta de Microsoft o crear una cuenta local. A continuación, el sitio le solicita que cree un equipo de revisión, cuya finalidad es revisar el contenido del área gris. Puede crear varios subequipos y crear flujos de trabajo que asignen revisiones a distintos subequipos. En la pestaña de credenciales de la página Configuración del portal, puede vincular la configuración de Content Moderator con el recurso Azure Cognitive Services que creó anteriormente. Solo tiene que copiar la clave y el identificador de recurso de Azure Portal en los campos Clave de suscripción e Id. de recurso de la interfaz de usuario de Moderator. Al crear inicialmente la cuenta, obtiene un flujo de trabajo denominado "default" que se configura automáticamente. Como puede ver en la interfaz de usuario de Review, este flujo de trabajo creará una revisión humana si se detecta que una imagen es contenido para adultos. Empecemos por usar este flujo de trabajo en la operación Job de Review API.

Para llamar a Review Job API, debe usar el código que se muestra en la Figura 7.

Figura 7 Llamada a Review Job API

var url = 'https://westus.api.cognitive.microsoft.com/contentmoderator/
  review/v1.0/teams/butterfly/jobs';
var req = unirest.post(url)
  .type("application/json")
  .query({
    ContentType: 'Image',
    ContentId: '67c21785-fb0a-4676-acf6-ccba82776f9a',
    WorkflowName: 'default',
    CallBackEndpoint: 'http://butterfly.azure.com/review'
  })
  .headers({
    "Ocp-Apim-Subscription-Key": <ocp_key>
  })
  .send({
    "ContentValue": pictureUrl
  })
  .end(function (res) {
    return callback(res.error, res.body );
});

Observe que la URL contiene el nombre del equipo Butterfly y el sufijo jobs. En CallBackEndpoint, especificamos el punto de conexión de REST al que Content Moderator llamará para notificar los resultados de la revisión. También especificamos un elemento ContentId único que nos permita correlacionar la imagen cuando Content Moderator nos devuelva la llamada y enviemos la URL de la imagen real de ContentValue. Si la llamada se realiza correctamente, el cuerpo del resultado no contiene ningún resultado de Content Moderator. En su lugar, devuelve el JobId:

{"JobId":"2017035c6c5f19bfa543f09ddfca927366dfb7"}

Obtendrá el resultado a través de la devolución de llamada que especifique en CallBackEndpoint. De nuevo, este resultado tendrá el elemento JobId, posiblemente un elemento ReviewId y también un elemento ContentId para que pueda establecer una referencia cruzada a este. Para el flujo de trabajo default, Content Moderator devolverá la llamada inmediatamente con el resultado en Metadata si la imagen no se considera contenido para adultos. Los datos JSON reales serán similares a los que se muestran en la Figura 8.

Figura 8 Resultados del flujo de trabajo default

{
  "JobId": "2017035c6c5f19bfa543f09ddfca927366dfb7",
  "ReviewId": "",
  "WorkFlowId": "default",
  "Status": "Complete",
  "ContentType": "Image",
  "CallBackType": "Job",
  "ContentId": "67c21785-fb0a-4676-acf6-ccba82776f9a",
  "Metadata": {
    "adultscore": "0.465",
    "isadult": "False",
    "racyscore": "0.854",
    "isracy": "True"
  }
}

El estado de Job está establecido en Complete y el valor de CallbackType es Job. No obstante, si la imagen se considera material para adultos, Content Moderator creará una revisión y rellenará el campo ReviewId con un identificador. A continuación, la imagen pasará a la interfaz de usuario de Review para que el equipo la revise (consulte la Figura 9).

Herramienta de revisión Content Moderator con imágenes y etiquetas no seleccionadas
Figura 9 Herramienta de revisión Content Moderator con imágenes y etiquetas no seleccionadas

La herramienta de revisión y su uso mejorarán con algunas explicaciones. La herramienta está diseñada para controlar grandes volúmenes de imágenes. Un revisor mira todas las imágenes de una pantalla, etiqueta las que no pasan la inspección y, luego, pasa a la siguiente pantalla. La herramienta proporciona al revisor unos segundos para volver atrás si cree que cometió un error. Después de unos segundos, Content Moderator guarda las imágenes con las etiquetas finales y vuelve a llamar a la función de devolución de llamada especificada, esta vez con la decisión final. Ahora podemos realizar la acción adecuada: retirar el contenido o publicarlo según nuestros requisitos empresariales. La segunda devolución de llamada tendrá un aspecto similar al de la Figura 10.

Figura 10 Resultados de la devolución de llamada Review

{
  "ReviewId": "201703367f430472074c1fb18651a04750448c",
  "ModifiedOn": "2017-03-07T18:34:17.9436621Z",
  "ModifiedBy": "Bob",
  "CallBackType": "Review",
  "ContentId": "67c21785-fb0a-4676-acf6-ccba82776f9a",
  "ContentType": "Image",
  "Metadata": {
    "adultscore": "0.465",
    "isadult": "False",
    "racyscore": "0.854",
    "isracy": "True"
  },
  "ReviewerResultTags": {
    "a": "True",
    "r": "True",
    "pt": "False"
  }
}

El valor de CallBackType es ahora Review en lugar de Job, y puede observar que se agregaron elementos ReviewerResultTags, mientras que ContentId y ReviewId coinciden con los resultados de la primera devolución de llamada.

Flujos de trabajo personalizados

Ahora que conocemos bien el flujo de trabajo default, podemos comenzar a mover algunos mandos y diales. Para Butterfly, queremos permitir todo aquello con una puntuación de contenido subido de tono inferior al 0,7, pero bloquear todo aquello que supere una puntuación de 0,9. Queremos que el equipo de revisión eche un segundo vistazo a todo el contenido entremedio. Por tanto, en el editor de flujo de trabajo, crearemos un nuevo flujo de trabajo.

Observará que existen numerosas opciones en los menús desplegables de Connect to (Conectar a). Estas opciones permiten crear flujos de trabajo avanzados, por ejemplo, con texto de reconocimiento óptico de caracteres (OCR) de Images API y Face Detection API. La herramienta también permite declarar un punto de conexión de devolución de llamada para una revisión. Si especifica una devolución de llamada en CallBackEndpoint para Job API, igual que aquí, la del flujo de trabajo reemplazará la de CallBackEndpoint.

Ahora, al llamar a Review Job API y especificar este flujo de trabajo, obtendrá un elemento JobId, igual que al llamar al flujo de trabajo default. En función de la puntuación de contenido subido de tono de la imagen (entre 0,7 y 0,9 en nuestro caso), Content Moderator volverá a crear una revisión y verá esas imágenes en la interfaz de usuario de Review (Revisión) de Content Moderator.

Tenemos dos notas para concluir con los flujos de trabajo. La primera, si la imagen no es apta para una revisión en la devolución de llamada de Job inicial, debemos averiguar si la imagen está en el límite superior y debe bloquearse, o bien en el límite inferior y se permite. Para ello, debe duplicar un poco la lógica, lo que significa que todo podría quedar sin sincronizar. Afortunadamente, la herramienta de revisión expone el flujo de trabajo con el formato JSON. Aún mejor, existe una API de REST de flujo de trabajo que se puede usar para enviar los flujos de trabajo a Content Moderator API. Con algunas conexiones, puede usar los mismos datos JSON para mantener la lógica del bot y la herramienta de la interfaz de usuario de Review sincronizadas.

Una segunda nota sobre los flujos de trabajo tiene que ver con su extensibilidad. Un punto focal para el equipo es convertir la herramienta de revisión en un destino común para distintas API. Al navegar a la pestaña Connectors de la interfaz de usuario de Review (Revisión), puede ver los conectores disponibles actualmente. Para activar estos conectores, puede introducir las claves de suscripción correspondientes. El caso de la tecnología PhotoDNA es fácil de crear. Si el producto obtiene algún tipo de contenido del usuario, querrá asegurarse de que no se compartan imágenes de explotación infantil. La conexión a un flujo de trabajo existente es fácil después de registrarse en el servicio. Sin duda, más que llamar a las API de REST por separado. En el momento de escribir este artículo, Text Analytics API y Face Detection API están disponibles como conectores. Si puede acceder a Azure Portal, cree un servicio de Cognitive Services como hicimos anteriormente y escriba la clave de suscripción en la interfaz de usuario de Content Moderator.

Resumen

Existen otras características avanzadas que no tenemos tiempo de explicar en profundidad. Por ejemplo, puede crear sus propias etiquetas en Configuración para usarlas en sus flujos de trabajo. Creamos una etiqueta "pt" para etiquetar las blasfemias en el texto. La usaremos en un flujo de trabajo que esté configurado para la moderación de contenido de texto. Además, los flujos de trabajo pueden alternar entradas para controlar situaciones donde el formato de entrada no coincide con un calificador. Por ejemplo, si necesita detectar blasfemias en el texto de una imagen por medio de OCR. Puede registrarse en Video Moderation, actualmente en versión preliminar privada. Por último, puede esperar que se muestren más conectores en el portal, disponibles para compilar y ampliar sus flujos de trabajo.

Content Moderator le permite escalar horizontalmente sus capacidades de moderación de contenido a todos los formatos multimedia en grandes volúmenes. Content Moderator es una plataforma: conjunto de API y soluciones que compilamos específicamente para la moderación de contenido vertical. Si lo usa, podrá escalar y cambiar a otros formatos multimedia y nuevas capacidades de moderación de contenido, a medida que estén disponibles. Content Moderator usa los mejores clasificadores basados en Machine Learning, además de otras tecnologías que mejoran constantemente. Las mejoras en los clasificadores mejorarán automáticamente sus resultados. 


Maarten van de Bospoort es ingeniero jefe de desarrollo de software del equipo de Experiencia de Desarrollo de Microsoft en Redmond. Trabaja con desarrolladores y arquitectos de grandes ISV de consumo para facilitar la adopción de tecnologías de Microsoft, como bots, Cognitive Services y, ocasionalmente, una aplicación para la Plataforma universal de Windows.

Sanjeev Jagtap es administrador de productos senior del equipo de Content Moderator de Microsoft en Redmond. Le apasionan los clientes, las tecnologías de Microsoft y Hackathons.

Gracias al siguiente experto técnico de Microsoft por revisar este artículo: Christopher Harrison y Sudipto Rakshit