Распознавание разных лиц

Видеоурок 19 - Распознавание разных лиц: https://singtown.com/learn/50033/

В этом разделе рассказывается, как использовать признаки LBP для различения разных лиц.

Сначала нам нужно создать собственную библиотеку изображений. Сначала создаём новую папку на флеш-накопителе OpenMV (обратите внимание, что для этого нужно вставить SD-карту) и называем её singtown, а затем создаём n подпапок с именами s1, s2, s3...sn внутри папки singtown, где 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 будут выглядеть следующим образом (обратите внимание, что каждый раз, когда OpenMV записывает новое изображение/файл на флеш-накопитель, нужно перезагрузить 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 ""