Criação de uma rede neural para reconhecimento facial em fotos de Vkontakte





Este artigo descreverá a experiência de criar uma rede neural para reconhecimento de rosto, para classificar todas as fotos de uma conversa VK para encontrar uma pessoa específica. Sem qualquer experiência em escrever redes neurais e conhecimento mínimo de Python.



Introdução



Temos um amigo, que se chama Sergei, que adora se fotografar de uma forma incomum e colocá-lo em uma conversa, além de temperar essas fotos com frases corporativas. Então, em uma das noites da discórdia, tivemos uma ideia - criar um público em VK, onde pudéssemos postar Sergey com suas citações. As primeiras 10 postagens no adiamento foram fáceis, mas depois ficou claro que não fazia sentido revisar todos os anexos em uma conversa com as mãos. Então, decidiu-se escrever uma rede neural para automatizar esse processo.



Plano



  1. Obtenha links para fotos de uma conversa
  2. Baixar fotos
  3. Escrevendo uma rede neural


Antes de iniciar o desenvolvimento
, Python pip. , 0, ,


1. Obtendo links para fotos



Portanto, queremos obter todas as fotos da conversa, o método messages.getHistoryAttachments é adequado para nós , que retorna os materiais do diálogo ou conversa.
Desde 15 de fevereiro de 2019, Vkontakte negou o acesso a mensagens para aplicativos que não passaram pela moderação. Das opções de solução alternativa, posso sugerir vkhost , que ajudará você a obter um token de mensageiros de terceiros


Com o token recebido no vkhost, podemos coletar a solicitação de API de que precisamos usando o Postman . Claro, você pode preencher tudo com canetas sem ele, mas para maior clareza, vamos usá-lo.







Preencha os parâmetros:

  • peer_id - identificador de destino
    Para uma conversa: 2.000.000.000 + id de conversa (pode ser visto na barra de endereço).

    Para usuário: id do usuário.
  • media_type - tipo de mídia
    No nosso caso, foto
  • start_from - deslocamento para selecionar vários itens.
    Vamos deixar vazio por enquanto.
  • contagem - o número de objetos recebidos
    No máximo 200, é quanto vamos usar
  • photo_sizes - sinaliza para retornar todos os tamanhos na matriz
    1 ou 0. Usamos 1
  • preserve_order - sinalizador que indica se os anexos devem ser devolvidos em sua ordem original
    1 ou 0. Usamos 1
  • v - versão vk api
    1 ou 0. Usamos 1


Campos preenchidos no Postman







Vá para escrever o código

Por conveniência, todo o código será dividido em vários scripts separados.


Usará o módulo json (para decodificar os dados) e a biblioteca de solicitações (para fazer solicitações de http)



Lista de códigos se houver menos de 200 fotos em uma conversa / diálogo



import json
import requests

val = 1 #   

Fin = open("input.txt","a") #     
#  GET   API     response
response = requests.get("https://api.vk.com/method/messages.getHistoryAttachments?peer_id=2000000078&media_type=photo&start_from=&count=10&photo_size=1&preserve_order=1&max_forwards_level=45&v=5.103&access_token=_")
items = json.loads(response.text) #       JSON

#    GET            ,    

for item in items['response']['items']: #   items
    link = item['attachment']['photo']['sizes'][-1]['url'] #    ,      
    print(val,':',link) #       
    Fin.write(str(link)+"\n") #     
    val += 1 #   


Se houver mais de 200 fotos



import json
import requests

next = None #       
def newfunc():
    val = 1 #   
    global next
    Fin = open("input.txt","a") #     
    #  GET   API     response
    response = requests.get(f"https://api.vk.com/method/messages.getHistoryAttachments?peer_id=2000000078&media_type=photo&start_from={next}&count=200&photo_size=1&preserve_order=1&max_forwards_level=44&v=5.103&access_token=_")
    items = json.loads(response.text) #       JSON

    if items['response']['items'] != []: #     
        for item in items['response']['items']: #   items
            link = item['attachment']['photo']['sizes'][-1]['url'] #    ,      
            print(val,':',link) #   
            val += 1 #   
            Fin.write(str(link)+"\n") #     
        next = items['response']['next_from'] #      
        print('dd',items['response']['next_from'])
        newfunc() #  
    else: #    
        print("  ")

newfunc()


É hora de baixar links



2. Baixando imagens



Para baixar as fotos usamos a biblioteca urllib



import urllib.request

f = open('input.txt') #    

val = 1 #   
for line in f: #   
    line = line.rstrip('\n')
    #     "img"
    urllib.request.urlretrieve(line, f"img/{val}.jpg")
    print(val,':','') #      
    val += 1 #  
print("")


O processo de carregamento de todas as imagens não é dos mais rápidos, principalmente se as fotos forem 8330. Espaço para este caso também é necessário, se o número de fotos for igual ao meu ou mais, recomendo liberar 1,5 - 2 GB para isso . O







trabalho bruto está concluído, agora você pode começar interessante - escrever uma rede neural



3. Escrevendo uma rede neural



Depois de examinar muitas bibliotecas e opções diferentes, decidiu-se usar a biblioteca

Face Recognition



O que é que isso pode fazer?



A partir da documentação, considere os recursos mais básicos de



rostos de busca em fotos

podem encontrar qualquer número de pessoas na foto, até mesmo lida com







identificação difusa em fotos individuais

pode reconhecer quem pertence à pessoa na imagem







para nós o método mais adequado será a identificação de pessoas



Treinamento



Dos requisitos para a biblioteca é necessário o Python 3.3+ ou Python 2.7.No caso das bibliotecas, o reconhecimento facial e o PIL mencionados acima serão usados para trabalhar com imagens.





A biblioteca Face Recognition não é oficialmente suportada no Windows , mas funcionou para mim. Tudo funciona de forma estável com macOS e Linux.




Explicação do que está acontecendo



Para começar, precisamos definir um classificador para procurar uma pessoa por quem já ocorrerá uma verificação posterior das fotos.

Recomendo escolher a foto mais nítida possível de uma pessoa em vista frontal.
Ao enviar uma foto, a biblioteca divide as imagens nas coordenadas das características faciais de uma pessoa (nariz, olhos, boca e queixo).







Bem, então a questão é pequena, resta apenas aplicar um método semelhante à foto que queremos comparar com nosso classificador. Em seguida, deixamos a rede neural comparar as características faciais por coordenadas.



Bem, o próprio código em si:



import face_recognition
from PIL import Image #     

find_face = face_recognition.load_image_file("face/sergey.jpg") #    
face_encoding = face_recognition.face_encodings(find_face)[0] #    ,      

i = 0 #   
done = 0 #  
numFiles = 8330 #   - 
while i != numFiles:
    i += 1 #    
    unknown_picture = face_recognition.load_image_file(f"img/{i}.jpg") #   
    unknown_face_encoding = face_recognition.face_encodings(unknown_picture) #    

    pil_image = Image.fromarray(unknown_picture) #    

    #     
    if len(unknown_face_encoding) > 0: #   
        encoding = unknown_face_encoding[0] #   0 ,  
        results = face_recognition.compare_faces([face_encoding], encoding) #  

        if results[0] == True: #   
            done += 1 #    
            print(i,"-","   !")
            pil_image.save(f"done/{int(done)}.jpg") #     
        else: #    
            print(i,"-","   !")
    else: #    
        print(i,"-","  !")


Também é possível executar tudo de acordo com uma análise aprofundada em uma placa de vídeo, para isso você precisa adicionar o parâmetro model = "cnn" e alterar o fragmento de código da imagem com a qual queremos procurar a pessoa certa:



    unknown_picture = face_recognition.load_image_file(f"img/{i}.jpg") #   
    face_locations = face_recognition.face_locations(unknown_picture, model= "cnn") #   GPU
    unknown_face_encoding = face_recognition.face_encodings(unknown_picture) #    


Resultado



Sem GPU. Ao mesmo tempo, a rede neural passou e classificou 8.330 fotos em 1 hora e 40 minutos e ao mesmo tempo encontrou 142 fotos, 62 delas com a imagem da pessoa desejada. Claro, houve falsos positivos em memes e outras pessoas.



C GPU. O tempo de processamento demorou muito mais, 17 horas e 22 minutos, e encontrei 230 fotos das quais 99 são as pessoas de que precisamos.



Em conclusão, podemos dizer que o trabalho não foi feito em vão. Automatizamos o processo de classificação de 8330 fotos, o que é muito melhor do que classificá-las você mesmo.



Você também pode baixar o código-fonte completo do github



All Articles