إنشاء شبكة عصبية للتعرف على الوجوه في الصور من فكونتاكتي





ستصف هذه المقالة تجربة إنشاء شبكة عصبية للتعرف على الوجوه ، لفرز جميع الصور من محادثة VK للعثور على شخص معين. بدون أي خبرة في كتابة الشبكات العصبية والحد الأدنى من المعرفة ببايثون.



المقدمة



لدينا صديق اسمه سيرجي ، يحب تصوير نفسه بطريقة غير معتادة وإرسال محادثة ، كما يقوم بتوابل هذه الصور بعبارات الشركة. لذا في إحدى أمسيات الخلاف ، كانت لدينا فكرة - لإنشاء جمهور في VK ، حيث يمكننا نشر Sergey مع اقتباساته. كانت المشاركات العشر الأولى في التأجيل سهلة ، ولكن اتضح بعد ذلك أنه لا فائدة من مراجعة جميع المرفقات في محادثة بيديك. لذلك تقرر كتابة شبكة عصبية لأتمتة هذه العملية.



خطة



  1. احصل على روابط للصور من محادثة
  2. تنزيل الصور
  3. كتابة شبكة عصبية


قبل البدء في التطوير
, Python pip. , 0, ,


1. الحصول على روابط للصور



لذلك نريد الحصول على جميع الصور من المحادثة ، فإن طريقة messages.getHistoryAttachments مناسبة لنا ، حيث تقوم بإرجاع مواد الحوار أو المحادثة.
منذ 15 فبراير 2019 ، رفضت فكونتاكتي الوصول إلى الرسائل الخاصة بالتطبيقات التي لم تنجح في الإشراف. كحل بديل ، يمكنني اقتراح vkhost ، والتي ستساعدك في الحصول على رمز مميز من برامج المراسلة التابعة لجهات خارجية


باستخدام الرمز المميز المستلم على vkhost ، يمكننا جمع طلب API الذي نحتاجه باستخدام Postman . يمكنك بالطبع ملء كل شيء بأقلام بدونها ، ولكن من أجل التوضيح







سنستخدمها.

  • peer_id - معرف الوجهة
    للمحادثة: 2،000،000،000 + معرف محادثة (يمكن رؤيته في شريط العناوين).

    للمستخدم: معرف المستخدم.
  • نوع الوسائط - نوع الوسائط
    في حالتنا ، الصورة
  • start_from - الإزاحة لتحديد عدة عناصر.
    دعنا نتركها فارغة الآن.
  • العد - عدد العناصر المستلمة
    200 كحد أقصى ، هذا هو المبلغ الذي سنستخدمه
  • photo_sizes - علم لإرجاع جميع الأحجام في المصفوفة
    1 أو 0. نحن نستخدم 1
  • keep_order - علامة تشير إلى ما إذا كان يجب إرجاع المرفقات بترتيبها الأصلي
    1 أو 0. نحن نستخدم 1
  • v - vk إصدار api
    1 أو 0. نحن نستخدم 1


ملء الحقول في ساعي البريد







انتقل إلى كتابة التعليمات البرمجية

للراحة ، سيتم تقسيم جميع التعليمات البرمجية إلى عدة نصوص منفصلة.


سيستخدم وحدة json (لفك تشفير البيانات) ومكتبة الطلبات (لتقديم طلبات http)



قائمة الرموز إذا كان هناك أقل من 200 صورة في محادثة / حوار



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 #   


إذا كان هناك أكثر من 200 صورة



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


حان وقت تنزيل الروابط



2. تنزيل الصور



لتنزيل الصور نستخدم مكتبة 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("")


عملية تنزيل جميع الصور ليست الأسرع ، خاصة إذا كانت الصور 8330. المساحة لهذه الحالة مطلوبة أيضًا ، إذا كان عدد الصور هو نفسه أو أكثر ، أوصي بتحرير 1.5 - 2 جيجا بايت لهذا الغرض .







انتهى العمل الصعب ، الآن يمكنك أن تبدأ بنفسك مثير للاهتمام - كتابة شبكة عصبية



3. كتابة شبكة عصبية



بعد البحث في العديد من المكتبات والخيارات المختلفة ، تقرر استخدام مكتبة التعرف على الوجوه





ماذا يمكن أن تفعل؟



من التوثيق ، ضع في اعتبارك أهم الميزات الأساسية



لوجوه البحث في الصور

قد تجد أي عدد من الأشخاص في الصورة ، حتى تتواءم مع التعريف الغامض







على الصور الفردية

يمكن أن تتعرف على من ينتمي إلى الشخص الموجود في الصورة







بالنسبة لنا ، فإن الطريقة الأنسب هي تحديد الأشخاص



تدريب



من متطلبات المكتبة ، مطلوب Python 3.3+ أو Python 2.7 .

فيما يتعلق بالمكتبات ، سيتم استخدام التعرف على الوجوه المذكورة أعلاه و PIL للعمل مع الصور.



مكتبة التعرف على الوجوه غير مدعومة رسميًا على Windows ، لكنها عملت معي. كل شيء يعمل بثبات مع macOS و Linux.




شرح ما يحدث



بادئ ذي بدء ، نحتاج إلى تعيين مصنف للبحث عن شخص ، سيتم بالفعل التحقق من الصور من خلاله.

أوصي باختيار أوضح صورة ممكنة لشخص كامل الوجه
عند تحميل صورة ، تقوم المكتبة بتقسيم الصور إلى إحداثيات ملامح وجه الشخص (الأنف والعينين والفم والذقن)







حسنًا ، فالأمر صغير ، كل ما تبقى هو تطبيق طريقة مماثلة على الصورة التي نريد مقارنتها مع المصنف الخاص بنا. ثم ندع الشبكة العصبية تقارن ملامح الوجه بالإحداثيات.



حسنًا ، الكود الفعلي نفسه:



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


من الممكن أيضًا تشغيل كل شيء من خلال التحليل المتعمق على بطاقة الفيديو ، لذلك تحتاج إلى إضافة معلمة النموذج = "cnn" وتغيير جزء الكود للصورة التي نريد البحث عن الشخص المناسب بها:



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


نتيجة



لا يوجد GPU. بمرور الوقت ، مرت الشبكة العصبية وفرز 8330 صورة في ساعة و 40 دقيقة وفي نفس الوقت عثرت على 142 صورة ، 62 منها مع صورة الشخص المطلوب. بالطبع ، كانت هناك إيجابيات خاطئة على الميمات والأشخاص الآخرين.



ج GPU. استغرق وقت المعالجة أكثر من ذلك بكثير ، 17 ساعة و 22 دقيقة ، ووجدت 230 صورة من بينهم 99 هم الأشخاص الذين نحتاجهم.



في الختام ، يمكننا القول أن العمل لم يتم سدى. لقد أتمتنا عملية فرز 8330 صورة ، وهو أفضل بكثير من فرزها بنفسك.



يمكنك أيضًا تنزيل كود المصدر بالكامل من جيثب



All Articles