التمييز بين الوجوه المختلفة

الفيديو التعليمي رقم 19 - التمييز بين الوجوه المختلفة: https://singtown.com/learn/50033/

يشرح هذا القسم كيفية استخدام ميزات LBP للتمييز بين الوجوه المختلفة.

نحتاج أولًا إلى بناء مكتبة الصور الخاصة بنا. ننشئ أولًا مجلدًا جديدًا في قرص OpenMV U (لاحظ أنه يجب إدخال بطاقة SD) ونسميه singtown، ثم ننشئ داخل مجلد singtown عددًا n من المجلدات الفرعية بأسماء s1 و s2 و s3...sn، حيث n هو عدد الأشخاص في مكتبة الصور بأكملها. كما هو موضح أدناه:

بعد ذلك، يمكننا تشغيل الكود التالي لجمع عينات مختلفة من الوجوه. لاحظ أنه عند جمع العينات، حاول أن تكون الخلفية موحّدة وأن يملأ الوجه الشاشة بأكملها قدر الإمكان. يمكن أن يكون الوجه مبتسمًا أو غير مبتسم، مستقيمًا أو مائلًا، مرتديًا نظارات أو غير مرتدٍ لها، إلخ. يمكنك اختيار 10-20 صورة لكل شخص.

# Snapshot Example
#
# Note: You will need an SD card to run this example.
#
# You can use your OpenMV Cam to save image files.

import csi, image, machine
csi0 = csi.CSI()

#import pyb

RED_LED_PIN = 1
BLUE_LED_PIN = 3

csi0.reset() # Initialize the camera sensor.
csi0.pixformat(csi.GRAYSCALE) # or csi.GRAYSCALE
csi0.framesize(csi.QQVGA) # or csi.QQVGA (or others)
csi0.window((92,112))
csi0.snapshot(frames=10) # Let new settings take affect.
csi0.snapshot(time = 2000)

num = 1 # اضبط رقم الشخص المُصوَّر، تُحفظ صور الشخص الأول في مجلد s1، وصور الشخص الثاني في مجلد s2، وهكذا. عند تغيير الشخص المصوَّر، غيّر قيمة num.

n = 20 # اضبط عدد الصور المُلتقطة لكل شخص.

# التقط n صورة متتالية، بفاصل 3 ثوانٍ بين كل التقاط.
while(n):
    # الضوء الأحمر يضيء
    machine.LED("LED_RED").on()
    #pyb.LED(RED_LED_PIN).on()
    csi0.snapshot(time = 3000) # Give the user time to get ready. انتظر 3 ثوانٍ، استعد لتعبير الوجه.

    # الضوء الأحمر ينطفئ، الضوء الأزرق يضيء
    machine.LED("LED_RED").off()
    machine.LED("LED_BLUE").on()
    #pyb.LED(RED_LED_PIN).off()
    #pyb.LED(BLUE_LED_PIN).on()

    # احفظ الصورة الملتقطة على بطاقة SD
    print(n)
    csi0.snapshot().save("singtown/s%s/%s.pgm" % (num, n) ) # or "example.bmp" (or others)

    n -= 1

    #pyb.LED(BLUE_LED_PIN).off()
    machine.LED("LED_BLUE").off()
    print("Done! Reset the camera to see the saved image.")

بعد التصوير، تظهر الصور في قرص OpenMV U كما يلي (لاحظ أنه في كل مرة يكتب فيها قرص OpenMV U صورة/ملفًا جديدًا، تحتاج إلى إعادة تشغيل OpenMV لرؤيتها):

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

# Face recognition with LBP descriptors.
# See Timo Ahonen's "Face Recognition with Local Binary Patterns".
#
# Before running the example:
# 1) Download the AT&T faces database http://www.cl.cam.ac.uk/Research/DTG/attarchive/pub/data/att_faces.zip
# 2) Exract and copy the orl_faces directory to the SD card root.


import csi, time, image
csi0 = csi.CSI()

csi0.reset() # Initialize the camera sensor.
csi0.pixformat(csi.GRAYSCALE) # or csi.GRAYSCALE
csi0.framesize(csi.QQVGA) # or csi.QQVGA (or others)
csi0.window((92,112))
csi0.snapshot(frames=10) # Let new settings take affect.
csi0.snapshot(time = 5000) # انتظر 5 ثوانٍ



#SUB = "s1"
NUM_SUBJECTS = 6 # عدد الأشخاص المختلفين في مكتبة الصور، 6 أشخاص إجمالًا
NUM_SUBJECTS_IMGS = 20 # لكل شخص 20 صورة عينة

# التقط صورة الوجه الحالي.
img = csi0.snapshot()
#img = image.Image("singtown/%s/1.pgm"%(SUB))
d0 = img.find_lbp((0, 0, img.width(), img.height()))
# d0 هي ميزة LBP للوجه الحالي
img = None
pmin = 999999
num=0

def min(pmin, a, s):
    global num
    if a<pmin:
        pmin=a
        num=s
    return pmin

for s in range(1, NUM_SUBJECTS+1):
    dist = 0
    for i in range(2, NUM_SUBJECTS_IMGS+1):
        img = image.Image("singtown/s%d/%d.pgm"%(s, i))
        d1 = img.find_lbp((0, 0, img.width(), img.height()))
        # d1 هي ميزة LBP للصورة رقم i في المجلد رقم s
        dist += image.match_descriptor(d0, d1)# احسب الفرق بين ميزتي d0 وd1، أي درجة الاختلاف بين صورة العينة والوجه المكتشف.
    print("Average dist for subject %d: %d"%(s, dist/NUM_SUBJECTS_IMGS))
    pmin = min(pmin, dist/NUM_SUBJECTS_IMGS, s)# كلما قلّت درجة الاختلاف، كان الوجه المكتشف أكثر تشابهًا وتطابقًا مع هذه العينة.
    print(pmin)

print(num) # num هو رقم الشخص الأكثر تطابقًا حاليًا.

تظهر نتائج التشغيل في الشكل:

results matching ""

    No results matching ""