تشخیص چهره

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

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

 

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

 

تشخیص چهره مبتنی بر هندسه / مبتنی بر الگو

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

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

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

 

تشخیص چهره تکه تکه / کل گرایانه

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

 

تشخیص چهره مبتنی بر ظاهر / مبتنی بر مدل

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

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

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

 

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

 

تطبیق الگو

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

 

رویکرد آماری

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

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

 

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

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

 

فناوری تشخیص چهره در فرمولاسیون مسئله تحلیل مولفه اصلی [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) با درک چند لایه و غیره اشاره کرد، این­ها می­‌توانند کارایی مدل­‌ها را افزایش دهند.

 

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

این الگوریتم با پیاده‌سازی یک پرسپترون چند لایه با الگوریتم پس انتشار، به تشخیص چهره دست می­یابد. مرحله اول، مرحله پیش پردازش است. هر تصویر در فاز کنتراست و نوردهی نرمالیزه می‌شود. سپس هر تصویر از طریق فیلتر گابور پردازش می­گردد. فیلتر گابور دارای پنج پارامتر جهت گیری و سه فرکانس مکانی است، بنابراین 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()

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

احرازشو چیست؟

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