APIs e Microsserviços

17 jul, 2017

Machine Learning com Algorithmia API e Go – Nudity Detection

Publicidade

A Algorithmia é um marketplace online para algoritmos disponíveis através de uma API simples e escalável. Atualmente, mais de 45 mil desenvolvedores têm acesso a uma biblioteca crescente de mais de 3.500 micro serviços algorítmicos.

De acordo com o site, a plataforma permite que você implemente qualquer algoritmo em 5 linhas de código (aproximadamente, é claro) e ela fornece hospedagem para que as pessoas publiquem seus algoritmos – e todos eles implementam a mesma interface para que você possa acessá-los através do cliente API do algoritmo.

Para começar, você cria uma nova conta na Algorithmia, que lhe dá acesso aos algoritmos. Lá, você irá obter uma API key do site que você pode usar para chamar os vários algoritmos disponíveis.

Recentemente, a plataforma recebeu substancial aporte do Google, então, vamos conferir!

Detecção de nudez

A detecção de nudez leva uma imagem como uma entrada e retorna um valor nos dizendo se a imagem contém nudez e um nível de confiança para essa previsão. Como pode haver falsos positivos e negativos, o ajuste do nível de confiança nos permite controlar quão rigorosos queremos que os resultados filtrados sejam.

Este algoritmo em particular opera sob alguns pressupostos. Primeiro, assume que as imagens nuas contêm muitos pixels coloridos para a pele e que esses pixels são principalmente interligados. As regiões ininterruptas de pixels coloridos da pele aumentam a probabilidade de uma imagem estar nua.

Em segundo lugar, assume que as regiões nuas são de cor de pele, em vez de preto e branco. Portanto, imagens de nus em preto e branco não são corretamente identificadas por esse algoritmo.

Aplicações

Inúmeros sites permitem que usuários façam upload de imagens, que são exibidas publicamente no site. Em muitos casos, a tarefa de revisar manualmente todos os carregamentos de imagens pode não ser muito boa para uma equipe gerenciar.

Mesmo quando isso é possível, os usuários podem não querer aguardar um processo de revisão manual sempre que publicarem novos conteúdos on-line.

Esse método é pesado tanto para os administradores, quanto para os usuários, mas serve como um impedimento para a participação ativa do usuário na geração de conteúdo.

A matemática

Embora a maioria dos algoritmos de classificação de imagem funcione utilizando dados de treinamento, comparando novas imagens de entrada com o conjunto de dados pré-categorizado, esse método apresenta algumas desvantagens.

A principal questão é que requer tempo e esforço humanos para reunir dados de treinamento e, em seguida, categorizar centenas (às vezes milhares) de imagens à mão.

Um método mais recente foi publicado no documento acadêmico “An Algorithm for Nudity Detection“, que descreve uma maneira diferente de abordar o problema da nudez, especificamente. Esta API do Algorithmia utiliza uma variação desta técnica, que exploraremos com mais detalhes.

A característica primária em que este algoritmo se baseia é a cor da pele. Analisar as cores contidas em uma imagem não é apenas eficaz, é computacionalmente barato. O objetivo principal é diferenciar entre pixels em uma imagem que são tons de pele e aqueles que não são.

Existem modelos de detecção de nudez para todas as cores comuns da pele.

Além disso, as técnicas de análise de imagens, hoje, podem compensar as diferenças de luminescência e focar estritamente a cor. Isso aumenta a precisão quando o algoritmo classifica cada pixel como tonificado, ou não.

Há um processo de quatro passos, delineado no artigo:

  1. Detectar pixels coloridos na imagem;
  2. Localize ou crie regiões de pele com base nos pixels de pele detectados;
  3. Analise as regiões da pele para indícios de nudez ou desnudez;
  4. Classifique a imagem como nua, ou não.

O primeiro passo usa um “modelo de distribuição de cores da pele” para analisar pixel por pixel da imagem para ver se cada um corresponde a uma cor de pele conhecida.

O algoritmo executa análise sofisticada da porcentagem de regiões coloridas da pele, seu tamanho relativo e suas posições relativas. Muitos fatores são levados em consideração e, finalmente, um valor booleano é retornado, juntamente com um índice de confiança.

A implementação desta API do Algorithmia também utiliza detecção de rosto para ajudar a eliminar falsos positivos.

Os métodos de detecção de rosto não estão dentro do escopo deste artigo, mas você pode aprender mais sobre a detecção de rosto ao analisar os algoritmos de detecção de rosto na Algorithmia.

Realizando a requisição da API

Neste artigo, usaremos Go para fazer o nosso pedido, mas tenha em mente que você pode executar qualquer pedido da API do Algorithmia com a maioria das linguagens à sua disposição.

Como ponto de partida, consulte o repositório para saber como configurar sua máquina para desenvolvimento com a Algorithmia API em Go. Uma vez que o ambiente esteja configurado, avancemos!

package main

import (
    "fmt"

    algorithmia "github.com/algorithmiaio/algorithmia-go"
)

var apiKey = "ALGORITHMIA_API_KEY"
var client = algorithmia.NewClient(apiKey, "")

func main() {
    input := "http://www.isitnude.com.s3-website-us-east-1.amazonaws.com/assets/images/sample/young-man-by-the-sea.jpg"

    algo, _ := client.Algo("algo://sfw/NudityDetection/1.1.6")
    resp, err := algo.Pipe(input)
    if err != nil {
        fmt.Println(resp, err)
        return
    }

    response := resp.(*algorithmia.AlgoResponse)
    fmt.Println(response.Result)
    fmt.Println(response.Metadata)
    fmt.Println(response.Metadata.Duration)
}

Como você pode ver no exemplo de código acima, a entrada que estamos enviando ao algoritmo através da chamada da API é um URL para uma imagem.

Substitua isso pela URL de qualquer imagem do seu agrado para ter uma ideia de como o algoritmo funciona (observe que a API key deve ser fornecida).

Você deve ter notado que o output.result retornou: {nude: ‘true’, confidence: 0.93}.

Você pode, então, avaliar o JSON para determinar dentro do seu aplicativo se a imagem está nua e se você está de acordo com a confiabilidade.

Decidindo o nível de confiança na filtragem

Digamos que você quer ter um cuidado extra ao avaliar imagens de nudez.

Você pode ajustar o limite do nível de confiança, permitindo assim uma maneira conveniente de marcar algumas imagens como “Duvidosas” ou “Revisão Necessária”. Desta forma, você pode deixar as imagens que estão acima do limite de nível de confiança e classificadas como desnudez serem apresentadas em sua aplicação e também observando quais imagens podem precisar de moderação antes de postar.

package main

import (
    "fmt"
    "reflect"

    algorithmia "github.com/algorithmiaio/algorithmia-go"
)

var apiKey = "ALGORITHMIA_API_KEY"
var client = algorithmia.NewClient(apiKey, "")

func main() {
    input := "http://www.isitnude.com.s3-website-us-east-1.amazonaws.com/assets/images/sample/young-man-by-the-sea.jpg"
    //input := "http://az616578.vo.msecnd.net/files/2016/12/30/6361871495693720411264482533_friendship.jpg"

    algo, _ := client.Algo("algo://sfw/NudityDetection/1.1.6")
    resp, err := algo.Pipe(input)
    if err != nil {
        fmt.Println(resp, err)
        return
    }

    response := resp.(*algorithmia.AlgoResponse)

    result, ok := response.Result.(map[string]interface{})
    if !ok {
        fmt.Printf("Convert Error")
    }

    for _, item := range result {
        r := reflect.TypeOf(item).Kind()
        switch r {
        case reflect.Float64:
            if item.(float64) < 0.85 {
                fmt.Printf("Uncertain: %v\n", item)
            } else {
                fmt.Printf("Certain: %v\n", item)
            }
        case reflect.String:
            if item.(string) == "true" {
                fmt.Println("Nude")
            } else {
                fmt.Println("Not nude")
            }
        default:
        }
    }

}

Aqui temos um exemplo em que analisamos o nível de confiança a partir do resultado do algoritmo, através de uma verificação condicional. Onde a confiança <0.85, sugere tomar medidas especiais, tais como adicionar a imagem a uma fila de moderação ou adicionar um aviso de que o conteúdo pode conter nudez.

Desta forma, você pode facilmente direcionar o valor retornado pelo algoritmo para os desenvolvedores web ou mobile, permitindo uma outra camada de segurança e o controle ao trabalhar com aplicativos que incluem conteúdo carregado pelo usuário.

Interessante, não é?! Então, Go é muito divertido, mas com machine learning e Algorithmia é divertido demais!

Git: https://github.com/edwardmartinsjr/iMasters-Go/tree/master/algorithmia-nudity-detection-go