Gabriel Pato mostra que com inteligência artificial dar pra ir pelo menos burlar o sistema de reCaptcha.

Gabriel Pato mostra que com inteligência artificial dar pra ir pelo menos burlar o sistema de reCaptcha.

TND

Um dia ao acessar o site da Globo.com vi que um dos "paredões" do BBB havia batido o recorde mundial de votações em um reality show. Logo imaginei que grande parte dos votos teria sido feito através de robôs (assim como a maior parte do fluxo de toda a internet). Mesmo que houvesse um captcha na votação, ele poderia ser resolvido através de serviços existentes como o DeatchByCaptcha. Eis que ao entrar no site de votação, vejo que a Globo.com tem um captcha próprio💡(ideia de projeto).

A imagem acima mostra como é o captcha. Ele contém cinco símbolos e você deve clicar em cima daquele correspondente à palavra escrita na página. Super simples para um ser humano resolver. E para uma máquina?

Vou mostrar abaixo em cinco passos, como ensinar uma máquina a reconhecer os símbolos e saber aonde deve ser clicado usando classificação de imagens com Deep Learning.

Vamos lá… 

Passo 1: Tenha imagens de exemplo

Para resolver um problema de classificação de imagens, obviamente, você precisa de imagens do que será reconhecido. Procurando no Google/Github por "image dataset" é possível achar uma infinidade destes, com: pessoas, faces, veículos, objetos, placas de sinalização, entre outros. Para este problema, precisaremos criar nosso banco de imagens.

Ao debugar a página de votação, verifiquei que o botão de reload do captcha faz uma requisição para uma página que retorna uma nova imagem do captcha em Base64. Assim, escrevi um script para baixar 15,000 imagens únicas de captchas.

2.Entenda essas imagens

Antes de colocar a mão na massa, SEMPRE dedique um tempo para analisar as imagens que serão reconhecidas. Tente identificar padrões, suas características, entenda a relação entre elas. Isso lhe poupará muito tempo.

Alguns insights das imagens:

1 - Todas as imagens tem o tamanho 280x56.

2 - Todo captcha possui 5 ícones diferentes.

3 - Dividindo a imagem em quadrados iguais de 56x56, cada porção da imagem corresponde a um único símbolo (precisamos ter cada ícone separado para fazer a classificação).

4 - São 59 tipos diferentes de ícones (cada tipo diferente de objeto que será reconhecido é uma classe, que depois será uma saída de nossa rede neural).

3. Crie o dataset

A classificação de imagens é um método de aprendizado supervisionado, ou seja, a máquina não irá aprender sozinha apenas olhando as imagens. A máquina precisa ser ensinada. Para isso, ela precisa que cada imagem esteja relacionada à uma classe.

O desafio é atribuir uma classe para cada uma das 75,000 imagens (15,000 captchas x 5). Como existem poucas variações nas imagens (o ícone é sempre o mesmo, o que muda é o seu ruído - riscos no fundo da imagem- e a posição dele dentro do quadrado de 56x56). Trabalhei com um conjunto menor de 5,000 imagens (~80 imagens para cada classe).

Mesmo assim, seria um trabalho bem demorado fazer a anotação de uma por uma dessas imagens manualmente. Para isso, extraí as características da imagem com Zernike Moments (que extraí características referente à forma da imagem) e usando a distância Euclidiana entre esses vetores de características, agrupei os similares nas mesmas pastas. A assertividade desse classificador ficou abaixo de 70%, com um pouco mais de trabalho manual, para agrupar os restantes. Em pouco mais de uma hora, tinha todas as imagens dos ícones separados em pasta (cada uma com as imagens da sua classe).

4. Treine sua rede

Com as imagens separadas por classe, vamos fazer o treinamento de nossa rede neural.

Primeira tentativa. Após 15 épocas de treinamento, apenas 3% de assertividade, e nenhuma perspectiva de melhora.


Possíveis soluções? Treinar mais épocas? Inserir mais imagens, será que 80 imagens por classe é pouco? Tentar outras arquiteturas de rede? Voltamos ao passo 2: entender as imagens.

O ruído inserido em cada imagem atrapalha o reconhecimento, precisamos fazer um pré-processamento destas imagens antes de enviá-las para treinamento da rede neural. Vamos recorrer às ferramentas tradicionais de processamento de imagem: Filtro de fechamento para remover os "riscos" e um edge detection para extrair o ícone do fundo branco. Pronto! Vamos tentar novamente.

Segunda tentativa. Com as imagens pré-processadas, após 15 épocas de treinamento (sem GPU no meu Macbook i5) temos um modelo com 99% de assertividade.


Este é um bom exemplo também de que, mesmo com todos os avanços dos algoritmos de Deep Learning, as técnicas tradicionais de processamento de imagem continuam sendo muito úteis.

Curta o resultado

Obs: O reconhecimento é realizado em menos de 1s (apesar de parecer mais lento no video acima).

Report Page