Skip to content

samuel-cavalcanti/teddy_bear_filter

Repository files navigation

teddy bear filter

Teddy Bear Filter é um Bot no telegram que recebe uma imagem e diz se é ou não um conteúdo pornográfico. Caso seja pornografia o Bot substitui a foto enviada por um ursinho :). Esse filtro foi pensado para crianças e esse bot é apenas um protótipo. apresentação

instalação dos pacotes necessários

pip install -r requirements.txt 

OBS: versão do python utilizada foi a 3.7.5

Base de dados utilizada

Para o treinamento dessa Deep learning foi utilizado duas bases de dados.

  • A primeira foi uma base de dados do pornHub publicada no Kaggle.
    Porn Data kaggle.

  • A segunda base de dados, dados não pornográficos foi construída minerando fotos do google images.

Baixando o Porn Data

Para baixar esse dataset, eu criei o script porn_dataset.py. Nele eu utilizei os seguintes pacotes python:

  • csv
  • requests
  • os
  • time
  • concurrent
  • kaggle

A maioria dos pacotes são nativos do python então você não tem que se preocupar com isso apenas se atentar que eu utilizei o python na versão 3.7.4.
Já o kaggle é uma Api criada pelo pessoal do site https://www.kaggle.com, com o intuito para facilitar o download de datasets e submissão deles. Mais informações você pode encontrar no GitHub deles: kaggle API.

Minerando Dados do Google imagens

Para baixar fotos do Google Imagens eu utilizei o python script Google Images Download. Através dele fiz uma pesquisa pelas seguintes palavras chaves :

  • wrestling (luta livre)

  • beach clothes (roupas de praia)

  • swimming (natação)

  • breastfeeding (amamentação)

  • games (essa você consegue)

  • cat (acredito no seu potencial)

  • gym clothes (roupas de academia)

feito o download das imagens observei que o Google Images Download criou uma pasta chamada downloads e dentro dela ele agrupou as imagens em pastas com o nome de cada palavra chave. Então criei uma nova pasta dentro da pasta dataset chamada de nonPorn e movi todas as imagens para ela.

mkdir dataset/nonPorn                     

NONPORN=../dataset/nonPorn/ 

cd downloads

mv "beach clothes"/* $NONPORN
mv breastfeeding/*  $NONPORN
mv cat/* $NONPORN
mv games/* $NONPORN
mv "gym clothes"/* $NONPORN
mv swimming/* $NONPORN
mv wrestling/* $NONPORN

cd $NONPORN

echo "Número de arquivos é $(ls | wc -l)"

esse script pode ser encontrando aqui move_files.

Foi observado também que dentro do dataset existiam gifs e webps então converti os gifs e webs em imagens .jpg com esse comando:

convert  -coalesce *.gif *.webps image.jpg

OBS: o comando convert não gera só image.jpg ele vai transformando os gits e webps em image-1.jpg, image-2.jpg, image-3.jpg... e asim sucessivamente.

organizando o Dataset em Train e Test

Após baixar Todas as Fotos e organiza-los em apenas duas pastas: porn ,nonPorn . Foi feito o script build_database.py que utiliza os pacotes: numpy, scikit-learn, opencv. Para fazer o pré-processamento dos dados, sendo mais específico, foi feito o escalonamento de todas as imagens para as dimensões 200x200, o embaralhamento dos dados e separado os dados que serão para o treinamento e os dados para validação. Foi decido que 40% do dataset seria validação e logicamente 60% para treinamento. Ao final do script ele gera um arquivo chamado Pornography_Database.npz. Outro fator que deve-se ser ressaltado é que como a base de dados é derivado de fotos aleatórias de vídeos pornôs nem sempre a foto em questão mostra um conteúdo pornográfico.

OBS: Dos dados coletados foi utilizado 8807 deles, sendo 4406 imagens pornográficas e 4401 imagens não pornográficas.

Uma Amostra do conjuto de dados

amostra

Construindo o classificador

Após a construção do conjunto de dados. Foi feita a avaliação de dois classificadores para avaliar esse dataset.

  • vetor de suporte de classificação não linear com kernel RBF (NuSVC)

  • rede neural convolucional (CNN)

NuSVC

O NuSVC utilizado foi o algoritmo já implementado no scikit-learn e não apresentou bons resultados.

No vetor de suporte de classificação não linear os parâmetros foram:

Parâmetros Tipo ou Valor
kernel rbf
coeficiente γ 1/120000
coeficiente 0 0

OBS:_ os parâmetros da NuSVC são os valores padrões do scikit-learn. Foi experimentado outro valor para γ mas apresentou o mesmo resultado. No caso γ igual a 5.

Matrix de confusão da SVM

nan Conteúdo não pornográfico Conteúdo pornográfico
Conteúdo não pornográfico 0 2648
Conteúdo pornográfico 0 2636

CNN

Outro classificador implementado para resolver o problema foi a CNN. Para implementar a CNN foi utilizado a biblioteca keras. Através do keras foi construído uma CNN semelhante ao exemplo usado no mnist_cnn.py. A CNN possuí a seguinte configuração:

CNN

Camadas Tipo
Imagem (200x200)
Conv 2D
Max Pool 2D
Drop Out
Conv 2D
Max Pool 2D
Drop Out
Flatten
Dense
Dense

O otimizador utlizado foi ADADELTA e a função perda foi a categorical_crossentropy que são parâmetros recomendados para problemas de classificação binária. Após o treinamento foi realizado avaliação da CNN. Ela acertou 5207 de 5284 amostras. Dando uma precisão de 96.9% do conjunto de dados.

Gráfico de treinamento e Validação

acurácia

função erro

Matrix de confusão da CNN

nan Conteúdo não pornográfico Conteúdo pornográfico
Conteúdo não pornográfico 2576 72
Conteúdo pornográfico 94 2542

Comparação entre CNN e NuSVC

nan Precisão
NuSVC 49.9%
CNN 96.9%

Vale Ressaltar que ao olhar a matrix de confusão da NuSVC, pode-se perceber que ela praticamente chutou que todas as amostras eram imagens pornográficas. Com base nesse comportamento podemos afirmar que ela é um péssimo classificador. O que ao contrário da CNN, que demonstrou ser promissor e talvez com uma base de dados maior possa ter melhores resultados. Como Já mencionando anteriormente, os dados minerados nem sempre são verídicos, ou seja, existem imagens classificadas como pornográficas mans não necessariamente possui conteúdo pornográfico, logo um algoritmo tem que acerta 100% desse conjunto de dados não seria algo positivo.

Telegram bot

Como exemplo de aplicação para o filtro de pornografia, foi feito um bot no telegram chamado TeddyBearFilter. O código fonte Bot pode ser encontrado na pasta telegramBot. Esse bot é capaz de baixar a imagem enviada e enviar via socket para o um servidor. Servidor esse que possui um CNN a qual faz a predição da imagem e envia para Bot se a imagem é pornográfica ou não.Caso a imagem é pornográfica o Bot substitui a imagem por um urso fofinho. O código do servidor pode ser encontrado aqui : servidor. Para mostrar o funcionamento do bot foi feito um vídeo:
Teddy em Ação

Conclusões

Apesar dos resultados satisfatórios da CNN. Como toda técnica de aprendizado de máquina, a CNN é limitada ao conjunto de dados. Um vez que foi ligado o bot, enviamos prints de sites pornográficos para ele, mas o Bot não soube reconhecer que se tratava de pornográfica. O bot só reconhecia que o conteúdo era pornográfico quando era retirado imagens dentro dos vídeos pornográficos. Futuramente quem sabe eu não aprimoro o conjunto de dados :).

About

Um Filtro para conteúdos Adultos +18

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published