تشخیص چهره به زبان ساده



تشخیص چهره بر پایه هوش مصنوعی


  • روش­های تشخیص چهره
    • مبتنی بر هندسه / مبتنی بر الگو
      • تکه تکه / کل گرایانه
      • مبتنی بر ظاهر / مبتنی بر مدل
      • مبتنی بر الگو / آماری / شبکه­های عصبی
        • تطبیق الگو
        • رویکرد آماری
        • تحلیل مولفه اصلی [PCA]
  • فرمولاسیون مسئله تحلیل مولفه اصلی [PCA]

تشخیص چهره یکی از تکنیک­های تشخیص است که برای شناسایی چهره افرادی که تصاویر آنها در مجموعه داده­ها ذخیره شده استفاده می­گردد . گرچه روش­های دیگر در زمینه شناسایی می­توانند دقیق­تر باشند ، اما تشخیص چهره به دلیل ماهیت غیر مداخله­گر بودن ، روش آسانی برای شناسایی تعیین هویت افراد می­باشد که همیشه مورد توجه پژوهشگر­ها بوده است .

روش­های تشخیص چهره

مبتنی بر هندسه / مبتنی بر الگو

الگوریتم­های تشخیص چهره ­در قالب الگوریتم­های مبتنی بر هندسه یا الگو طبقه بندی می­شوند .

روش­های مبتنی بر الگو را می­توان با استفاده از ابزارهای آماری مانندSVM :  (ماشین­های بردار پشتیبان) ، PCA (تجزیه و تحلیل ناشر اصلی) LDA (تحلیل تفکیک خطی) ، روش­های کرنل[1] یا تبدیل­های ردیابی[2] ایجاد کرد . روش­های مبتنی بر ویژگی هندسی ، مشخصات محلی چهره و رابطه هندسی آنها را تجزیه و تحلیل می­کنند . به اینگونه روش­ها ، روش­های مبتنی بر ویژگی نیز گفته می­شود.

تکه تکه / کل گرایانه

ارتباط بین نماد یا یک تابع با کل چهره ، مقداری نیست . بنابراین بسیاری از محققان این روش را دنبال کرداند و تلاش آنها بر این بود که مهمترین ویژگی­ها را استنباط کنند . در برخی روش­ها از چشم ، به عنوان ترکیبی ویژه استفاده میشود . برخی مانند مدل پنهان مارکوف نیز در تشخیص چهره بسیار معروف است .

مبتنی بر ظاهر / مبتنی بر مدل

روش مبتنی بر ظاهر : در این روش یک چهره را در چندین تصویر نشان می­دهد . تصویری به عنوان بردار با ابعاد بالا در نظر گرفته  و این روش معمولاً برای استخراج یک فضای ویژه از تقسیم تصویر استفاده می­شود . تصویر نمونه با مجموعه آموزشی مقایسه می­گردد ، از طرف دیگر رویکرد مبتنی بر مدل ، سعی در مدل سازی چهره دارد . نمونه­ی جدید در مدل پیاده سازی می­شود و پارامترهای مدل برای شناسایی تصویر استفاده می­گردند .

روش مبتنی بر ظاهر را می­توان به دو صورت خطی یا غیرخطی طبقه بندی کرد . PCA ، LDA ،IDA در رویکرد خطی استفاده می­شوند در حالی که Kernel PCA در رویکرد غیرخطی مورد استفاده قرار می­گیرد . از طرف دیگر، روش مبتنی بر مدل را هم می­توان به دو صورت Ex-Elastic Bunch Graph Match دو بعدی یا سه بعدی طبقه بندی نمود .

مبتنی بر الگو / آماری / شبکه­های عصبی

تطبیق الگو

الگوها بوسیله­ی نمونه­ها ، مدل­ها ، پیکسل­ها ، بافت­ها و … نشان داده می­شوند . تابع تشخیص معمولاً یک معیار همبستگی یا فاصله است .

رویکرد آماری

الگوها به عنوان ویژگی بیان می­شوند که تشخیص در قالب یک تابع ممیز عمل می­کند . هر تصویر با D ویژگی نمایش داده می­شود . بنابراین هدف ، انتخاب و استفاده از ابزار آماری مناسب برای استخراج و آنالیز است .

ابزارهای آماری بسیاری وجود دارد که برای شناسایی چهره استفاده می­شوند . این ابزارهای تحلیلی در دو یا چند گروه یا روش­های مختلف طبقه بندی مورد استفاده قرار می­گیرند . این ابزارها به شرح زیر است :

تحلیل مولفه اصلی [PCA]

یکی از پرکاربردترین و پر استنادترین روش­های آماری ، تحلیل ناشر اصلی است . در این روش که یک روش ریاضی می­باشد ، کاهش ابعاد بوسیله­ی استخراج ناشر اصلی داده­های چند بعدی انجام می­شود . 

فرمولاسیون مسئله تحلیل مولفه اصلی [PCA]

تبدیل کسینوس گسسته [DCT]

این روش ، مجموعه­ای از نقاط داده درمورد مجموع توابع کسینوس با فرکانس­های نوسانی مختلف را نشان می­دهد . تبدیل کسینوس گسسته بر مبنای تبدیل گسسته فوریه ساخته شده است و بنابراین با ایجاد تغییرات ، می­توان از آن برای تبدیل تصاویر و کاهش موثر ابعاد استفاده نمود .

آنالیز تشخیص خطی [LDA]

روش LDA برای یافتن ترکیب خطی ویژگی­ها و در عین حال حفظ تفکیک کلاس ، مورد استفاده قرار می­گیرد . LDA برخلاف PCA  ، سعی می­کند تا تفاوت بین سطوح را مدلسازی کند . برای هر سطح LDA بردارهای تصویر مختلفی وجود دارد .

تصویرسازی حفظ موقعیت [LPP]

HE ،  LPP، NIYOGI را معرفی کردند . این روش بهترین جایگزین PCA برای حفظ ساختار محلی و طراحی است . الگوریتم­های تشخیص الگو معمولاً به دنبال نزدیکترین الگو یا همسایه­ها هستند . بنابراین ، LLP با حفظ موقعیت می­تواند سرعت تشخیص را افزایش دهد .

موجک گابور

طبق این الگوریتم ، شواهد داده­های عصبی و فیزیولوژیکی از قشر بینایی مغز پستانداران نشان می­دهد که سلول­های ساده در قشر بینایی را می­توان به عنوان خانواده­ای از موجک­های 2 بعدی گابور خود متشابه در نظر گرفت . توابع گابور که توسط داگمن پیشنهاد شدند ، فیلترهای باندگذر مکانی محلی هستند که به حد تئوری برای تفکیک مشترک اطلاعات در حوزه­های دو بعدی مکانی و 2 بعدی فوریه دست می­یابند .

آنالیز  مولفه­های مستقل [ICA]

ICA داده­ها را به ترکیبات خطی از نقاط داده آماری مستقل تبدیل می­کند. بنابراین، هدف آن ارائه یک تصویر مستقل به جای نمایش تصویر غیر همبسته است. ICA جایگزینی برای PCA است، که داده­ها را به روش قدرتمندتری ارائه­ می­دهد. این روش، یک معیار آنالیز تشخیص است که می­توان از آن برای بهبود PCA استفاده کرد.

مبتنی بر کرنل PCA

Scholkopf روش استفاده از توابع کرنل برای انجام PCA غیرخطی را معرفی کرد . مبنای اصلی این روش ، اعمال نگاشت غیرخطی بر ورودی و سپس حل یک PCA خطی در زیرفضای ویژگی حاصل است .

شبکه­های عصبی

در شبکه عصبی نیز همچنان از تشخیص و طبقه بندی الگو استفاده می­شود . Kohonen اولین کسی بود که نشان داد می توان از یک شبکه عصبی برای تشخیص چهره­های همراستا و نرمالیزه استفاده کرد . روش­هایی وجود دارد که با استفاده از شبکه­های عصبی  استخراج ویژگی انجام می­دهند . روش­های زیادی وجود دارد که در ترکیب با ابزارهایی مانند PCA یا LCA ، یک طبقه بندی کننده­ی ترکیبی برای تشخیص چهره ایجاد می­کنند . از جمله این روش­ها می­توان به Feed Forward Neural Network با بایاس اضافی ، نگاشت­های خودسازمانده با PCA و شبکه­های عصبی چرخشی (Convolutional) با درک چند لایه و غیره اشاره کرد ، این­ها می­توانند کارایی مدل­ها را افزایش دهند .

شبکه­های عصبی با فیلترهای گابور:

این الگوریتم با پیاده­سازی یک پرسپترون چند لایه با الگوریتم پس انتشار[3] ، به تشخیص چهره دست می­یابد . مرحله اول ، مرحله پیش پردازش است . هر تصویر در فاز کنتراست و نوردهی نرمالیزه می­شود . سپس هر تصویر از طریق فیلتر گابور پردازش می­گردد . فیلتر گابور دارای پنج پارامتر جهت گیری و سه فرکانس مکانی است ، بنابراین 15 طول موج گابور وجود دارد .

شبکه­های عصبی و مدل­های پنهان مارکوف

مدل­های پنهان مارکوف ابزار آماری هستند که در تشخیص چهره استفاده می­شوند . آنها در ترکیب با شبکه­های عصبی مورد استفاده قرار می­گیرند. این روش در یک شبکه عصبی ایجاد می­شود که شبه HMM دو بعدی را آموزش می­دهد . ورودی این فرایند HMM دو بعدی ، خروجی ANN است و برای الگوریتم ، کاهش ابعاد مناسب را فراهم می­کند .

شبکه­های عصبی فازی

شبکه­های عصبی فازی برای تشخیص چهره در سال 2009 معرفی شدند . در این روش ، سیستم شناسایی چهره از یک پرسپترون چند لایه استفاده می­کند . مفهومی که در پس این روش وجود دارد ، دریافت سطوح تصمیم گیری در منیفولدهای غیرخطی است؛  کاری که یک MLP ساده به سختی می­تواند آن را انجام دهد . بردارهای ویژگی با استفاده از تبدیل طول موج گابور بدست می­آیند.

نحوه کار تشخیص چهره

روش­های زیادی برای تشخیص چهره وجود دارد . در اینجا ما از OpenCV برای تشخیص چهره استفاده می­کنیم . در تشخیص چهره، تصویر ابتدا برای پیش پردازش آماده می­شود و سپس به تشخیص­گر چهره ، آموزش می­دهیم که چگونه چهره­ها را شناسایی کند . پس از آموزش تشخیص­گر، آن را آزمایش می­کنیم تا نتایج را ببینیم . تشخیص­گر OpenCV سه نوع است که به شرح زیر می­باشد :

  • تشخیص­گر EigenFaces

تشخیص­گر EigenFaces تمام تصاویر آموزشی از همه شخصیت­ها را به صورت یک کامپلکس می­بیند و سعی می­کند مولفه­ها را استنباط کند . این مولفه­ها ضروری و مفید هستند ( قسمتهایی که بیشترین واریانس / تغییر را دارند) و بقیه تصاویر را دور می­اندازند ، به این ترتیب نه تنها المان­های ضروری را از داده­های آموزشی استخراج می­کند بلکه با رد بخش­های کم اهمیت­تر در استفاده از حافظه نیز صرفه جویی می­کند .

  • تشخیص­گر FisherFaces

الگوریتم Fisherfaces به جای دریافت ویژگی­های مفیدی که نشانگر تمام چهره­های همه افراد هستند ، ویژگی­های ارزشمندی را که یک فرد را از دیگران متمایز می­کنند حذف می­کند . این ویژگی­های یک فرد ، روی ویژگی­های دیگران غالب نیست و شما ویژگی­هایی در اختیار دارید که یک فرد را از دیگران متمایز می­کند.

  • هیستوگرام الگوهای باینری محلی

ما می­دانیم که Eigenfaces و Fisherfaces هر دو تحت تأثیر نور قرار دارند و در شرایط واقع، ما نمی­توانیم شرایط نوری کامل را تضمین کنیم. تشخیص­گر LBPHبر این اشکال غلبه کرده است . الگوریتم LBPH ، به دنبال یافتن ویژگی­های محلی یک تصویر نیست . این الگوریتم سعی می­کند ساختار محلی یک تصویر را پیدا کند و این کار را با مقایسه هر پیکسل با پیکسل­های همسایه خود انجام می­دهد .

نحوه اجرای تشخیص چهره

#import OpenCV module
import cv2
import os
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline#function to detect face
def detect_face (img):#convert the test image to gray image
gray = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY)#load OpenCV face detector
face_cas = cv2.CascadeClassifier (‘-File name.xml-‘)
faces = face_cas.detectMultiScale (gray, scaleFactor=1.3, minNeighbors=4);#if no faces are detected then return image
if (len (faces) == 0):
return None, None#extract the face
faces [0]=(x, y, w, h)#return only the face part
return gray[y: y+w, x: x+h], faces [0]#this function will read all persons’ training images, detect face #from each image
#and will return two lists of exactly same size, one list
def prepare_training_data(data_folder_path):#——STEP-1——–
#get the directories (one directory for each subject) in data folder
dirs = os.listdir(data_folder_path)
faces = []labels = []for dir_name in dirs:#our subject directories start with letter ‘s’ so
#ignore any non-relevant directories if any
if not dir_name.startswith(“s”):
continue;#——STEP-2——–
#extract label number of subject from dir_name
#format of dir name = slabel
#, so removing letter ‘s’ from dir_name will give us label
label = int(dir_name.replace(“s”, “”))#build path of directory containin images for current subject subject
#sample subject_dir_path = “training-data/s1”
subject_dir_path = data_folder_path + “/” + dir_name#get the images names that are inside the given subject directory
subject_images_names = os.listdir(subject_dir_path)#——STEP-3——–
#go through each image name, read image,
#detect face and add face to list of faces
for image_name in subject_images_names:#ignore system files like .DS_Store
if image_name.startswith(“.”):
continue;#build image path
#sample image path = training-data/s1/1.pgm
image_path = subject_dir_path + “/” + image_name#read image
image = cv2.imread(image_path)#display an image window to show the image
cv2.imshow(“Training on image…”, image)
cv2.waitKey(100)#detect face
face, rect = detect_face(image)#——STEP-4——–
#we will ignore faces that are not detected
if face is not None:#add face to list of faces
faces.append(face)#add label for this face
labels.append(label)
cv2.destroyAllWindows()
cv2.waitKey(1)
cv2.destroyAllWindows()
return faces, labels#let’s first prepare our training data
#data will be in two lists of same size
#one list will contain all the faces
#and other list will contain respective labels for each face
print(“Preparing data…”)
faces, labels = prepare_training_data(“training-data”)
print(“Data prepared”)#print total faces and labels
print(“Total faces: “, len(faces))
print(“Total labels: “, len(labels))#create our LBPH face recognizer
face_recognizer = cv2.face.createLBPHFaceRecognizer()#train our face recognizer of our training faces
face_recognizer.train(faces, np.array(labels))#function to draw rectangle on image
#according to given (x, y) coordinates and
#given width and heigh
def draw_rectangle(img, rect):
(x, y, w, h) = rect
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)#function to draw text on give image starting from
#passed (x, y) coordinates.
def draw_text(img, text, x, y):
cv2.putText(img, text, (x, y), cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 255, 0), 2)#this function recognizes the person in image passed
#and draws a rectangle around detected face with name of the subject
def predict(test_img):#make a copy of the image as we don’t want to chang original image
img = test_img.copy()#detect face from the image
face, rect = detect_face(img)#predict the image using our face recognizer
label= face_recognizer.predict(face)#get name of respective label returned by face recognizer
label_text = subjects[label]#draw a rectangle around face detected
draw_rectangle(img, rect)#draw name of predicted person
draw_text(img, label_text, rect[0], rect[1]-5)
return img#load test images
test_img1 = cv2.imread(“test-data/test1.jpg”)
test_img2 = cv2.imread(“test-data/test2.jpg”)#perform a prediction
predicted_img1 = predict(test_img1)
predicted_img2 = predict(test_img2)
print(“Prediction complete”)#create a figure of 2 plots (one for each test image)
f, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))#display test image1 result
ax1.imshow(cv2.cvtColor(predicted_img1, cv2.COLOR_BGR2RGB))#display test image2 result
ax2.imshow(cv2.cvtColor(predicted_img2, cv2.COLOR_BGR2RGB))#display both images
cv2.imshow(“Tom cruise test”, predicted_img1)
cv2.imshow(“Shahrukh Khan test”, predicted_img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)
cv2.destroyAllWindows()

مترجم: عارف ارازپور

نظرات

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

طراحی توسط نام برند