Maio de 2017

Volume 32 - Número 5

Serviços Cognitivos - Proteja os aplicativos Web usando o Microsoft Content Moderator

Por Maarten Van De Bospoort | Maio de 2017

Todos os dias, bilhões de usuários tiram fotos e fazem vídeos para compartilhar em mídias sociais. Como qualquer pessoa que já tenha lidado com conteúdo gerado por usuários na Internet sabe, a anonimidade da rede não suscita o melhor do comportamento humano. 

Outra tendência recente importante é a proliferação de chat bots. Não há um dia em que não sejam lançados novos conjuntos de bots capazes de fazer de tudo, de reservas de viagens, organização de reuniões a bancos online. Embora esses bots sejam certamente úteis, o chat bot perfeito ainda é uma utopia, ou seja, aquele bot que todas as plataformas de mensagem querem para ultrapassar a meta do 1 bilhão de usuários ativos por dia.

Agora, imagine que você criou simplesmente isso: Butterfly, o bot com o qual todos se sentem na obrigação de se envolver. Os usuários podem compartilhar mídia com seu bot e por meio de seu algoritmo secreto de aprendizado de máquina, fazendo com que o bot preveja o futuro dos usuários nas 24 horas seguintes. Após um ano de trabalho duro, você lança seu bot. O Butterfly se torna viral do dia para a noite. Infelizmente, sua start-up de sonho se torna um pesadelo de relações públicas. Os usuários começam a publicar conteúdo adulto e racista, que é compartilhado e disponibilizado publicamente a outros usuários do bot. E uma boa parte desse conteúdo é ruim. Muito ruim. Os usuários agora estão processando você, o telefone não para de tocar, e você está recebendo ameaças de interrupção de seu serviço Web. Você precisa de uma solução poderosa que ajude a detectar e evitar que esse conteúdo ruim fique visível a outros usuários. E você precisa disso rápido.

É aqui que o Microsoft Content Moderator entra em ação!

Neste artigo, mostraremos como o Microsoft Content Moderator pode ajudar. Começaremos criando um chat bot usando o Microsoft Bot Framework, mas não se esqueça que as informações também se aplicam a qualquer aplicativo da Web ou de cliente. O Butterfly permitirá que os usuários finais compartilhem texto, imagens e vídeos, e usará o Content Moderator para filtrar materiais inapropriados antes de eles serem publicados. Pelo caminho, você aprenderá como configurar de forma personalizada os fluxos de trabalho do Content Moderator e para ajustar os limites dos classificadores de conteúdo. Também discutiremos os diferentes conectores que podem ser usados no fluxo de trabalho, como texto e exploração infantil. Vamos começar com uma visão geral da moderação de conteúdo.

Moderação de Conteúdo

A Microsoft tem experiência reconhecida no combate ao crime digital. A Microsoft Digital Crimes Unit trabalha arduamente para combater botnets, limitar fraudes de suporte técnico, impedir esquemas de phishing e muito mais. Uma atividade menos visível da unidade é o seu auxílio na aplicação das leis de combate à exploração infantil em todo o mundo. A Microsoft oferece o PhotoDNA como serviço gratuito desde 2009, e a mesma equipe agora apresenta a moderação de conteúdo.

A moderação de conteúdo é uma área do aprendizado de máquina em que os computadores podem ser uma ajuda enorme para os humanos. A quantidade de dados gerados pelos usuários é simplesmente grande demais para ser revisada rapidamente e de forma economicamente eficaz por humanos. Além disso, a moderação de conteúdo não é uma atividade agradável para humanos. Para mais informações, consulte tcrn.ch/2n1d9M0.

A moderação de conteúdo faz parte do conteúdo crescente de APIs de Serviços Cognitivos da Microsoft executadas no Azure. Essas APIs são todas implementações específicas dos modelos de aprendizado de máquina, o que significa que a Microsoft treinou esses modelos com muitos dados. Como desenvolvedor, basta chamar uma das APIs para obter um resultado, seja para visual computacional, reconhecimento do locutor ou compreensão vocal, para citar apenas alguns. A API da Content Moderator Image usa reconhecimento de imagem, uma área do aprendizado de máquina que progrediu muito nos últimos anos.

A Figura 1 mostra como o pipeline do Content Moderator é configurado. Dependendo de suas necessidades, a moderação de conteúdo permite chamar APIs diferentes, incluindo moderação, revisão e tarefas em níveis crescentes de personalização. Por exemplo, a API de fluxo de trabalho permite que você modifique fluxos de trabalho usados em tarefas de forma programática. Em seguida, você pode observar os diversos classificadores por imagem, texto e vídeo, e CSAM, que significa em inglês Child Sexual Abuse Material (Material de Abuso Sexual Infantil). O PhotoDNA é a tecnologia que ajuda as organizações no combate à divulgação dessas imagens. O “classificador” CSAM trabalha um pouco diferente dos que eu mencionei anteriormente: O PhotoDNA usa uma tecnologia de hash e correspondência que faz comparações com um banco de dados de imagens conhecidas. No Content Moderator, você pode configurar fluxos de trabalho que conectam vários filtros (por exemplo, primeira verificação para CSAM, em seguida para imagens de conteúdo adulto/racista). O fluxo de trabalho também pode solicitar a revisão de humanos. Por fim, o pipeline do Content Moderator é flexível e, no futuro, outras APIs também podem ser anexadas.

Fluxos de conteúdo de usuários por meio do Content Moderator, no qual modelos de aprendizado de máquina e humanos trabalham juntos para filtrar material indecente
Figura 1 Fluxos de conteúdo de usuários por meio do Content Moderator, no qual modelos de aprendizado de máquina e humanos trabalham juntos para filtrar material indecente

Modere o conteúdo de seus usuários

Agora que você já tem entendeu um pouco como funciona a tecnologia de moderação, vamos conectá-la ao nosso bot Butterfly. Compilaremos o bot com o Microsoft Bot Framework usando o tipo de Node.js do Bot Framework para o Butterfly. Como essas APIs são apenas chamadas de REST API, você também poderá moderar seu conteúdo em C# facilmente. Na verdade, isso poderá ser ainda mais fácil, pois existe um .NET SDK para Content Moderator (bit.ly/2mXQqQV). 

Já foram publicados vários artigos nesta revista apresentando visões excelentes sobre os bots. Se você ainda não compilou um bot, recomendo a leitura dos seguintes artigos:

Em alternativa, os inícios rápidos no dev.botframework.com permitirão que você comece a trabalhar rapidamente.

Aqui, usaremos a solução inicial do Node.js. Usamos o modelo de diálogo que a estrutura do Node-js fornece para separar a conservação em diálogos separados. No código de diálogo mostrado na Figura 2, o bot solicita ao usuário uma URL de uma imagem na primeira função. Em seguida, o controle é transferido novamente ao usuário. Quando o usuário envia algum texto, o fluxo de diálogo transmite a entrada do usuário para a segunda função. Em seguida, o bot encaminha da entrada para avaliação no moderate.js. Em nossa primeira tentativa, chamamos o API Moderator simples (em oposição às APIs mais sofisticadas Review e Job).

Figura 2 Código de 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 chamar a API do Content Moderator, você precisa de credenciais, que podem ser obtidas no site do Content Moderator ou do Azure. Aqui, vamos usar a última abordagem. No Portal do Azure (portal.azure.com), crie uma nova conta dos Serviços Cognitivos clicando no sinal de mais verde e especificando os Serviços Cognitivos. Depois de clicar em Criar, especifique o Content Moderator como o tipo de API (veja a Figura 3). Use a classe F0, pois ela é gratuita e permite uma chamada por segundo, o que é suficiente para experimentar por enquanto. Quando a conta é criada, você encontrará o nome da Conta e a Chave em Chaves no Gerenciamento de recursos. Observe que você usará uma das Chaves e a cadeia de caracteres da ID do Recurso (de Propriedades) para associar a API do Content Moderator ao portal de revisão do Content Moderator mais tarde.

Selecione o Content Moderator na lista de Serviços Cognitivos
Figura 3 Selecione o Content Moderator na lista de Serviços Cognitivos

O Portal do Azure também mostra o ponto de extremidade como https://westus.api.cognitive.microsoft.com/contentmoderator. Apesar de ser o endereço base correto, é um pouco curto demais. O ponto de extremidade completo está na documentação do Content Moderator.

Conforme mostrado na Figura 4, especificamos a “URL” como DataRepresentation para enviar a URL para a imagem, mas você pode simplesmente enviar a imagem em um blob. Depois de ter chamado a API do moderador, o corpo do resultado retornado contém JSON com as pontuações da imagem. As pontuações variam de 0.0 (inocente) a 1.0 (muito adulto/racista).

Figura 4 Enviando uma URL de imagem para o 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 );
    });
};

Você pode ver que o resultado, mostrado na Figura 5, contém as pontuações de previsão de conteúdo adulto e racista, assim como as conclusões sobre se ele atingiu o limite nos sinalizadores classificados. Feliz da vida, você lança alguma linhas de código no seu bot e bloqueia todo o conteúdo racista ou adulto. Então, você implanta a nova versão do bot no Azure e o fluxo de usuários que consulta seu oráculo volta ao normal. Que alívio! Feliz com seus resultados, você e sua equipe se reúne em torno do kegerator para comemorar com uma bebida refrescante.

Figura 5 Pontuações de classificação de conteúdo adulto e racista para uma imagem

"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 dois goles de cerveja artesanal mais tarde, seu telefone não para de vibrar com tantos tweets. É uma chuva de reclamações de clientes: “Por que vocês estão bloqueando minhas imagens inocentes?” “Meu irmão consegue publicar imagens com muito mais pele à mostra. Vocês precisam corrigir isso!”

A classificação de imagens está boa, mas não existe uma fórmula única que se adapta a todas as situações. As APIs de nudez do Content Moderator que acabamos de usar podem claramente ajudar humanos a tomar boas decisões, mas não são perfeitas. Uma melhoria que poderia ter sido feita é a afinação da moderação usando pontuações brutas em vez de classificações de conteúdo adulto e racista com base em falso/verdadeiro. Além disso, parece que os usuários tendem a usar as mesmas imagens repetidamente. Felizmente, o Content Moderator fornece uma API de lista para gerenciar um conjunto personalizado de imagens ou texto que você já filtrou. A API do moderador faz uma correspondência difusa das imagens para evitar que os usuários a enganem facilmente com pequenas modificações ou redimensionamento. Isso é um ótimo aprimoramento em relação à primeira abordagem, mas não descartaria o trabalho do help desk em lidar com eventuais falsos positivos. Como sempre, a solução ideal é encontrada quando humanos e máquinas trabalham em conjunto nos casos mais difíceis. A Visão Computacional pode ajudar a detectar casos extremos quando as imagens são claramente racistas ou adultas, ou quando claramente não são. Nos casos extremos intermediários, nós como humanos podemos decidir para que lado o conteúdo pende em nosso cenário específico. É aqui que a ferramenta de revisão e a API do Content Moderator realmente se destacam. Vejamos como podemos usá-la para melhorar nossa solução.

Chamando a API de revisão do moderador

Até agora, a abordagem tem sido simples: Bloqueie ou autorize uma imagem com base nos rótulos do Content Moderator. Agora vamos expandir a solução. A ideia é configurar um fluxo como mostrado na Figura 6.

O bot do Butterfly funcionando com um fluxo de trabalho do Content Moderator
Figura 6 O bot do Butterfly funcionando com um fluxo de trabalho do Content Moderator

Neste cenário, o usuário primeiro envia uma imagem para o bot do Butterfly. Na Etapa 2, o serviço Web do bot envia a imagem para o Content Moderator usando a operação de trabalho da API Review, que usa uma ID de fluxo de trabalho como parâmetro. Vamos configurar este fluxo de trabalho na ferramenta de revisão. Nosso fluxo de trabalho específico (Etapa 3) permitirá automaticamente que todas as imagens abaixo de uma determinada pontuação de conteúdo adulto/racista (por exemplo, 0.7) e sinalize outras que excedem um determinado limite (como 0.9). Nosso bot autorizará o conteúdo com as pontuações baixas e bloqueará o conteúdo quando for claramente racista ou adulto. Em situações pouco claras, queremos que o conteúdo vá para a ferramenta de revisão e seja inspecionada por moderadores humanos (Etapa 4). Assim, nossa equipe de revisores pode decidir como lidar com o conteúdo. Ao concluir a revisão, o Content Moderator chamará novamente nosso serviço de aplicativo do bot para compartilhar o resultado. Nessa altura, o bot pode eliminar o conteúdo se ele for sinalizado como ofensivo. Repare aqui na flexibilidade. Você pode ajustar as pontuações em seu fluxo de trabalho e os revisores podem decidir o que é apropriado para seu aplicativo específico.

Para começar, você precisará se inscrever na ferramenta de revisão do Content Moderator em bit.ly/2n8XUB6. Você pode se inscrever com sua conta da Microsoft ou criar uma conta local. Em seguida, o site pergunta se você deseja criar uma equipe de revisão, cujo objetivo é revisar conteúdo indefinido. Você pode criar várias subequipes e fluxos de trabalho que atribuem revisões a diferentes subequipes. Na guia de credenciais da página Configurações do portal, você pode associar as configurações de seu Content Moderator com o recurso de Serviços Cognitivos do Azure criado anteriormente. Basta copiar a Chave e a ID do Recurso do portal do Azure para as configurações da Chave de Assinatura e ID de Recurso na interface de usuário do Moderator. Ao criar sua conta pela primeira vez, você obtém um fluxo de trabalho “padrão” configurado automaticamente. Como você pode ver na interface do usuário Review, este fluxo de trabalho criará uma revisão humana se uma imagem for considerada como conteúdo adulto. Vamos começar usando este fluxo de trabalho da operação de trabalho da API Review.

Para chamar a API Review Job, use o código mostrado na Figura 7.

Figura 7 Chamando a API Review Job

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 a URL contém o nome da equipe do Butterfly e dos trabalhos pós-fixados. No CallBackEndpoint especificamos o ponto de extremidade REST que o Content Moderator chamará para notificar os resultados da revisão. Também especificamos um ContentId exclusivo para que possamos correlacionar a imagem quando o Content Moderator nos retorna a chamada e enviamos a URL da imagem real no ContentValue. Quando a chamada é bem-sucedida, o corpo do resultado não contém nenhum resultado do Content Moderator. Em vez disso, ele retorna o JobId:

{"JobId":"2017035c6c5f19bfa543f09ddfca927366dfb7"}

Você obterá o resultado por meio do retorno de chamada que você especificou CallBackEndpoint. Este resultado terá novamente o JobId, potencialmente um ReviewId, e um ContentId para que você possa fazer referência cruzada. Para o fluxo de trabalho padrão, o Content Moderator retornará a chamada imediatamente com o resultado em metadados se a imagem não for considerada adulta. O JSON real será parecido com o mostrado na Figura 8.

Figura 8 Resultados do fluxo de trabalho padrão

{
  "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"
  }
}

O status para este Job é definido como Complete e o CallbackType é o Job. Se, no entanto, a imagem for considerada material adulto, o Content Moderator criará uma revisão e preencherá o campo ReviewId com um identificador. Em seguida, a imagem acabará na interface do usuário Review para a equipe de revisão (consulte a Figura 9).

A ferramenta de revisão do Content Moderator com imagens e marcas não selecionadas
Figura 9 A ferramenta de revisão do Content Moderator com imagens e marcas não selecionadas

É interessante explicar um pouco a ferramenta de revisão e como é usada. A ferramenta foi criada para lidar com grandes volumes de imagens. Um revisor olha para todas as imagens em uma tela, marca as que não passam na inspeção e, em seguida, muda para a próxima tela. A ferramenta dá ao revisor alguns segundos para voltar atrás caso ele considere que cometeu um engano. Após esses poucos segundos, o Content Moderator salva as imagens com as marcas finais e chama a função de retorno de chamada que especificamos novamente, agora com a avaliação final. Agora podemos tomar a ação adequada, seja vetando o conteúdo ou publicando-o com base nas necessidades de nosso negócio. O segundo retorno de chamada será parecido com o mostrado na Figura 10.

Figura 10 Resultados do retorno de chamada em 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"
  }
}

O CallBackType é agora Review em vez de Job, e você pode ver as ReviewerResultTags adicionadas, enquanto a ContentId e a ReviewId correspondem com os resultados do primeiro retorno de chamada.

Fluxos de trabalho personalizados

Agora que temos uma boa compreensão do fluxo de trabalho padrão, podemos começar a apertar alguns botões. No Butterfly, queremos permitir que todo o conteúdo racista fique abaixo de 0.7, mas o que estiver acima de 0.9 seja bloqueado. Tudo o que estiver entre essas pontuações, queremos que a equipe de revisão dê uma segunda olhada. Portanto, no editor do fluxo de trabalho, criaremos um novo fluxo de trabalho.

Você verá que há muitas opções nas listas suspensas de Conectar a. Essas opções permitem que você compile, por exemplo, fluxos de trabalho com texto de Reconhecimento Óptico de Caracteres (OCR) a partir de APIs de detecção de imagens e rostos. A ferramenta também permite que você declare um ponto de extremidade de retorno de chamada para uma revisão. Se você especificar um retorno de chamada no CallBackEndpoint na API Job, assim como aqui, o que estiver no fluxo de trabalho substitui o CallBackEndpoint.

Agora, quando você chama a API Review Job e especifica este fluxo de trabalho, você obterá novamente uma JobId, da mesma forma quando você chamou o fluxo de trabalho padrão. Dependendo da pontuação racista de sua imagem (entre 0.7 e 0.9 em nosso caso), o Content Moderator criará novamente uma revisão e você verá essas imagens na interface de usuário de revisão do Content Moderator.

Ainda há duas observações finais sobre fluxos de trabalho. Primeiro, se a imagem não se qualificar para uma revisão no retorno de chamada Job inicial, ainda precisamos descobrir se a imagem estava no nível alto e precisa ser bloqueada ou se estava no nível baixo e está autorizada. Para fazer isso, você deve duplicar um pouco a lógica, o que pode dessincronizar as coisas. Felizmente, a ferramenta de revisão expõe o fluxo de trabalho como JSON. Ainda melhor, há uma API REST de fluxo de trabalho que você pode usar para enviar os fluxos de trabalho para a API do Content Moderator. Com um pouco de análise, você pode usar o mesmo JSON para manter sua lógica do bot e a ferramenta da interface de usuário Review em sincronia.

Uma segunda observação relacionada aos fluxos de trabalho corresponde à sua extensibilidade. Um ponto focal para a equipe é tornar a ferramenta de revisão um destino comum para várias APIs. Ao navegar para a guia Conectores na interface de usuário de revisão, você pode ser os conectores atualmente disponíveis. Você pode ativar esses conectores inserindo as chaves de assinatura correspondentes. A caso do PhotoDNA é fácil de fazer. Se o seu produto obtiver qualquer tipo de conteúdo de usuário, você pode ter a certeza de que nenhuma imagem de exploração infantil é compartilhada. Ligar isso ao fluxo de trabalho existente é fácil depois de se inscrever no serviço. Isso é certamente muito melhor do que chamar APIs REST separadamente. No momento em que este arquivo foi escrito, a API Text Analytics e a API de Detecção Facial estavam disponíveis como conectores. Para obtê-las, você pode ir ao portal do Azure, criar um Serviço Cognitivo como fizemos anteriormente e inserir a chave de assinatura na interface de usuário do Content Moderator.

Conclusão

Existem outros recursos avançados que não tivemos espaço para explorar. Por exemplo, você pode criar suas próprias marcas em Configurações para usá-las em seus fluxos de trabalho. Criamos uma marca “pt” para marcar profanidade em textos. Usaremos isto em um fluxo de trabalho configurado para moderar conteúdo de texto. Além disso, os fluxos de trabalho têm entradas alternativas para lidar com situações em que o formato de entrada não corresponde com um qualificador. Por exemplo, quando você precisa detectar profanidade por escrito em uma imagem por meio de OCR. Você pode assinar a Moderação de Vídeo, que está atualmente em modo de visualização privada. Por fim, você pode contar com o lançamento de mais conectores no portal, os quais você poderá usar para compilar e ampliar seus fluxos de trabalho.

Usar o Content Moderator permite que você amplie suas habilidades de moderação de conteúdo em todos os formatos de mídia e em grandes volumes. O Content Moderator é uma plataforma com APIs e soluções que estamos criando especificamente para verticalizar a moderação de conteúdo. Com ela, é possível ampliar seu formato mídia ou migrar para outros formatos de mídia e recursos de moderação de conteúdo que surjam no mercado. O Content Moderator usa os melhores classificadores baseados em aprendizado de máquina e outras tecnologias que estão em constante aprimoramento. Ao aprimorar os classificadores, seus resultados serão automaticamente melhorados. 


Maarten van de Bospoort é um engenheiro de desenvolvimento de software principal em Experiência do Desenvolvedor na Microsoft em Redmond. Ele trabalha com desenvolvedores e arquitetos de ISVs para facilitar a adoção de tecnologias da Microsoft como bots, serviços cognitivos e ocasionalmente uma Plataforma Universal do Windows.

Sanjeev Jagtap é gerente de produto sênior na equipe do Content Moderator na Microsoft em Redmond. Ele é aficionado por clientes, tecnologias Microsoft e Hackathons.

Agradecemos aos seguintes especialistas técnicos da Microsoft pela revisão deste artigo: Christopher Harrison e Sudipto Rakshit