Pembuatan jaringan saraf untuk pengenalan wajah di foto dari Vkontakte





Artikel ini akan menjelaskan pengalaman membuat jaringan saraf untuk pengenalan wajah, untuk menyortir semua foto dari percakapan VK untuk menemukan orang tertentu. Tanpa pengalaman dalam menulis jaringan saraf dan pengetahuan minimal tentang Python.



pengantar



Kami memiliki seorang teman, bernama Sergei, yang suka memotret dirinya sendiri dengan cara yang tidak biasa dan mengirim percakapan, dan juga membumbui foto-foto ini dengan frasa perusahaan. Jadi salah satu malam tentang perselisihan itu, kami punya ide - untuk membuat publik di VK, di mana kami dapat memposting Sergey dengan kutipannya. Sepuluh pos pertama dalam penundaan itu mudah, tetapi kemudian menjadi jelas bahwa tidak ada gunanya membahas semua lampiran dalam percakapan dengan tangan Anda. Jadi diputuskan untuk menulis jaringan saraf untuk mengotomatiskan proses ini.



Rencana



  1. Dapatkan tautan ke foto dari percakapan
  2. Unduh foto
  3. Menulis jaringan saraf


Sebelum memulai pengembangan
, Python pip. , 0, ,


1. Mendapatkan link ke foto



Jadi kami ingin mendapatkan semua foto dari percakapan, metode messages.getHistoryAttachments cocok untuk kami , yang mengembalikan materi dialog atau percakapan.
Sejak 15 Februari 2019, Vkontakte menolak akses ke pesan untuk aplikasi yang belum lolos moderasi. Dari opsi solusi, saya dapat menawarkan vkhost , yang akan membantu Anda mendapatkan token dari messenger pihak ketiga


Dengan token yang diterima di vkhost, kami dapat mengumpulkan permintaan API yang kami butuhkan menggunakan Postman . Anda dapat, tentu saja, mengisi segala sesuatu dengan pena tanpa itu, tapi untuk kejelasan kami akan menggunakan







it.Fill dalam parameter:

  • peer_id - pengidentifikasi tujuan
    Untuk percakapan: 2.000.000.000 + id percakapan (bisa dilihat di address bar).

    Untuk pengguna: id pengguna.
  • media_type - jenis media
    Dalam kasus kami, foto
  • start_from - offset untuk memilih beberapa item.
    Biarkan kosong untuk saat ini.
  • hitung - jumlah objek yang diterima
    Maksimal 200, itulah yang akan kami gunakan
  • photo_sizes - bendera untuk mengembalikan semua ukuran dalam larik
    1 atau 0. Kami menggunakan 1
  • save_order - bendera yang menunjukkan apakah lampiran harus dikembalikan dalam urutan aslinya
    1 atau 0. Kami menggunakan 1
  • v - versi api vk
    1 atau 0. Kami menggunakan 1


Kolom yang diisi di Postman







Pergi ke penulisan kode

Untuk kenyamanan, semua kode akan dipecah menjadi beberapa skrip terpisah.


Akan menggunakan modul json (untuk memecahkan kode data) dan perpustakaan permintaan (untuk membuat permintaan http)



Daftar kode jika ada kurang dari 200 foto dalam percakapan / dialog



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 #   


Jika ada lebih dari 200 foto



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()


Saatnya mengunduh tautan



2. Mendownload gambar



Untuk mengunduh foto kami menggunakan perpustakaan 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("")


Proses mendownload semua gambar bukanlah yang tercepat, apalagi jika fotonya 8330. Space untuk case ini juga diperlukan, jika jumlah foto sama dengan milik saya atau lebih, saya sarankan untuk membebaskan 1,5 - 2 GB untuk ini . Pekerjaan







kasar sudah selesai, sekarang kamu bisa mulai sendiri menarik - menulis jaringan saraf



3. Menulis jaringan saraf



Setelah melihat banyak pustaka dan opsi yang berbeda, diputuskan untuk menggunakan pustaka

Pengenalan Wajah



Apa yang bisa dilakukannya?



Dari dokumentasi, pertimbangkan fitur paling dasar dari



pencarian wajah di foto

dapat menemukan sejumlah orang di foto, bahkan mengatasi







identifikasi kabur pada foto individu

dapat mengenali siapa milik orang dalam gambar







bagi kami metode yang paling cocok adalah identifikasi orang



Latihan



Dari persyaratan untuk pustaka, diperlukan Python 3.3+ atau Python 2.7 .

Mengenai pustaka, Pengenalan Wajah dan PIL yang disebutkan di atas akan digunakan untuk bekerja dengan gambar.



Pustaka Pengenalan Wajah tidak secara resmi didukung di Windows , tetapi berfungsi untuk saya. Semuanya bekerja secara stabil dengan macOS dan Linux.




Penjelasan tentang apa yang terjadi



Untuk memulainya, kita perlu mengatur pengklasifikasi untuk mencari seseorang yang dengannya verifikasi foto lebih lanjut akan dilakukan.

Saya merekomendasikan memilih foto orang yang paling jelas dalam tampilan depan.
Saat mengunggah foto, perpustakaan memecah gambar menjadi koordinat fitur wajah seseorang (hidung, mata, mulut, dan dagu)







Nah, masalahnya kecil, yang tersisa hanyalah menerapkan metode serupa pada foto yang ingin kita bandingkan dengan pengklasifikasi kita. Kemudian kami membiarkan jaringan saraf membandingkan fitur wajah dengan koordinat.



Nah, kode sebenarnya itu sendiri:



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,"-","  !")


Dimungkinkan juga untuk menjalankan semuanya melalui analisis mendalam pada kartu video, untuk ini Anda perlu menambahkan parameter model = "cnn" dan mengubah fragmen kode untuk gambar yang ingin kita cari orang yang tepat:



    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) #    


Hasil



Tanpa GPU. Berdasarkan waktu, jaringan saraf melewati dan menyortir 8.330 foto dalam 1 jam 40 menit dan pada saat yang sama menemukan 142 foto, 62 di antaranya dengan gambar orang yang diinginkan. Tentu saja ada kesalahan positif pada meme dan orang lain.



C GPU. Waktu pemrosesan memakan waktu lebih lama, 17 jam dan 22 menit, dan saya menemukan 230 foto yang 99 di antaranya adalah orang yang kami butuhkan.



Kesimpulannya, kita dapat mengatakan bahwa pekerjaan itu tidak dilakukan dengan sia-sia. Kami telah mengotomatiskan proses penyortiran 8330 foto, yang jauh lebih baik daripada menyortirnya sendiri.



Anda juga dapat mengunduh seluruh kode sumber dari github



All Articles