اگر شما کاربر عادی Google Photos هستید ، ممکن است متوجه شده باشید که چگونه این برنامه به صورت خودکار چهره افراد را از عکس هایی که در فضای ابری پشتیبان تهیه می کنید استخراج و گروه بندی می کند.

تشخیص چهره در برنامه وب Google Photosتشخیص چهره در برنامه وب Google Photos

یک برنامه عکس مانند Google با تشخیص چهره انسانها (و حیوانات خانگی نیز در عکسهای شما) و سپس گروه بندی چهره های مشابه با هم به این مهم دست می یابد. شناسایی و سپس طبقه بندی چهره ها در تصاویر یک کار مشترک در یادگیری عمیق با شبکه های عصبی است.

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

پیش نیازها

قبل از شروع با شناسایی و شناسایی چهره ها ، باید محیط توسعه خود را تنظیم کنید. اول ، شما باید تصاویر را از طریق پایتون قبل از پردازش روی آنها “بخوانید”. ما از کتابخانه نقشه کشی استفاده خواهیم کرد matplotlib برای خواندن و دستکاری تصاویر. آخرین نسخه را از طریق نصب کننده نصب کنید pip:

pip3 install matplotlib

برای استفاده از هر الگوریتم CNN ، باید نصب کنید keras. با استفاده از دستور زیر آخرین نسخه را بارگیری و نصب کنید:

pip3 install keras

الگوریتمی که ما برای تشخیص چهره استفاده خواهیم کرد MTCNN (شبکه های عصبی چند منظوره پیچیده) ، بر اساس مقاله “تشخیص و تراز مشترک مفصل با استفاده از شبکه های چند منظوره Cascaded Convolutional”(ژانگ و همکاران ، 2016). اجرای الگوریتم MTCNN برای TensorFlow در پایتون 3.4 بصورت بسته بندی موجود است. برای نصب بسته ، دستور زیر را اجرا کنید pip:

pip3 install mtcnn

برای مقایسه چهره ها پس از استخراج آنها از تصاویر ، ما استفاده خواهیم کرد الگوریتم VGGFace2 توسعه یافته توسط گروه هندسه بصری در دانشگاه آکسفورد. پیاده سازی الگوریتم VGG مبتنی بر Keras مبتنی بر TensorFlow به عنوان یک بسته برای نصب در دسترس است:

pip3 install keras_vggface

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

اکنون که پیش نیازها را با موفقیت نصب کردید ، بیایید وارد آموزش شویم!

مرحله 1: تشخیص چهره با مدل MTCNN

اهداف در این مرحله به شرح زیر است:

  • تصاویر میزبانی شده خارجی را در یک سرور محلی بازیابی کنید
  • خواندن تصاویر از طریق matplotlibاست imread() تابع
  • از طریق الگوریتم MTCNN چهره ها را شناسایی و کاوش کنید
  • چهره ها را از یک تصویر استخراج کنید

1.1 تصاویر خارجی را ذخیره کنید

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

برای ذخیره موقت تصاویر به صورت محلی برای تجزیه و تحلیل ، هرکدام را از URL آن بازیابی کرده و در یک فایل محلی می نویسیم. بیایید یک تابع را تعریف کنیم store_image به این منظور:

import urllib.request

def store_image(url, local_file_name):
  with urllib.request.urlopen(url) as resource:
    with open(local_file_name, 'wb') as f:
      f.write(resource.read())

اکنون می توانید به سادگی با URL و فایل محلی که می خواهید تصویر را در آن ذخیره کنید ، عملکرد را فراخوانی کنید:

store_image('https://ichef.bbci.co.uk/news/320/cpsprodpb/5944/production/_107725822_55fd57ad-c509-4335-a7d2-bcc86e32be72.jpg',
            'iacocca_1.jpg')
store_image('https://www.gannett-cdn.com/presto/2019/07/03/PDTN/205798e7-9555-4245-99e1-fd300c50ce85-AP_080910055617.jpg?width=540&height=&fit=bounds&auto=webp',
            'iacocca_2.jpg')

پس از بازیابی موفقیت آمیز تصاویر ، بیایید چهره ها را در آنها شناسایی کنیم.

1.2 شناسایی چهره ها در یک تصویر

برای این منظور ، ما دو واردات انجام خواهیم داد – matplotlib برای خواندن تصاویر ، و mtcnn برای تشخیص چهره در تصاویر:

from matplotlib import pyplot as plt
from mtcnn.mtcnn import MTCNN

استفاده از imread() عملکرد برای خواندن یک تصویر:

image = plt.imread('iacocca_1.jpg')

بعد ، مقداردهی اولیه را انجام دهید MTCNN() شی به detector متغیر و استفاده از .detect_faces() روش تشخیص چهره ها در یک تصویر. بیایید ببینیم چه چیزی باز می گردد:

detector = MTCNN()

faces = detector.detect_faces(image)
for face in faces:
  print(face)

برای هر چهره ، یک دیکشنری پایتون برگردانده می شود ، که شامل سه کلید است. box کلید حاوی مرز صورت در تصویر است. این چهار مقدار دارد: مختصات x- و y راس سمت چپ بالا ، عرض و ارتفاع مستطیل حاوی صورت. کلیدهای دیگر هستند confidence و keypoints. keypoints کلید شامل یک فرهنگ لغت است که شامل ویژگی های چهره ای است که به همراه مختصات آنها شناسایی شده است:

{'box': [160, 40, 35, 44], 'confidence': 0.9999798536300659, 'keypoints': {'left_eye': (172, 57), 'right_eye': (188, 57), 'nose': (182, 64), 'mouth_left': (173, 73), 'mouth_right': (187, 73)}}

1.3 برجسته کردن چهره ها در یک تصویر

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

برای ترسیم مستطیل ، Rectangle شی از matplotlib.patches:

from matplotlib.patches import Rectangle

بیایید یک تابع را تعریف کنیم highlight_faces برای اولین بار تصویر را نمایش دهید و سپس مستطیل هایی را روی چهره هایی که شناسایی شده ترسیم کنید. ابتدا تصویر را بخوانید imread() و طرح آن را از طریق imshow(). برای هر صورت که تشخیص داده شد ، با استفاده از Rectangle() کلاس

در آخر ، تصویر و مستطیل ها را با استفاده از نمایش دهید .show() روش. اگر از نوت بوک های Jupyter استفاده می کنید ، می توانید از آن استفاده کنید %matplotlib inline دستور جادویی برای نشان دادن نمودارها به صورت درون خطی:

def highlight_faces(image_path, faces):
  
  image = plt.imread(image_path)
  plt.imshow(image)

  ax = plt.gca()

  
  for face in faces:
    x, y, width, height = face['box']
    face_border = Rectangle((x, y), width, height,
                          fill=False, color='red')
    ax.add_patch(face_border)
  plt.show()

بیایید اکنون تصویر و چهره شناسایی شده را با استفاده از نمایش دهیم highlight_faces() تابع:

highlight_faces('iacocca_1.jpg', faces)
چهره شناسایی شده در تصویری از لی یاکوکاچهره شناسایی شده در تصویری از لی یاکوکا. منبع: بی بی سی

بیایید تصویر دوم و چهره (های) شناسایی شده در آن را نمایش دهیم:

image = plt.imread('iacocca_2.jpg')
faces = detector.detect_faces(image)

highlight_faces('iacocca_2.jpg', faces)

در این دو تصویر می بینید که الگوریتم MTCNN به درستی چهره ها را تشخیص می دهد. بیایید اکنون این چهره را از تصویر استخراج کنیم تا تجزیه و تحلیل بیشتر در مورد آن انجام شود.

در این مرحله ، شما مختصات چهره ها را از ردیاب می دانید. استخراج چهره ها با استفاده از شاخص های لیست کار نسبتاً ساده ای است. با این حال ، الگوریتم VGGFace2 که ما استفاده می کنیم نیاز به تغییر اندازه چهره ها به 224 22 224 پیکسل دارد. ما از کتابخانه PIL برای تغییر اندازه تصاویر استفاده خواهیم کرد.

کارکرد extract_face_from_image() همه چهره ها را از یک تصویر استخراج می کند:

from numpy import asarray
from PIL import Image

def extract_face_from_image(image_path, required_size=(224, 224)):
  
  image = plt.imread(image_path)
  detector = MTCNN()
  faces = detector.detect_faces(image)

  face_images = []

  for face in faces:
    
    x1, y1, width, height = face['box']
    x2, y2 = x1 + width, y1 + height

    
    face_boundary = image[y1:y2, x1:x2]

    
    face_image = Image.fromarray(face_boundary)
    face_image = face_image.resize(required_size)
    face_array = asarray(face_image)
    face_images.append(face_array)

  return face_images

extracted_face = extract_face_from_image('iacocca_1.jpg')


plt.imshow(extracted_face[0])
plt.show()

در اینجا نحوه استخراج صورت از تصویر اول آورده شده است.

چهره از تصویر اول استخراج و تغییر اندازه داده استچهره از تصویر اول استخراج و تغییر اندازه داده است

مرحله 2: تشخیص چهره با مدل VGGFace2

در این بخش ، بیایید ابتدا مدل دو تصویر لی Iacocca را که بازیابی کرده ایم ، آزمایش کنیم. سپس ، ما می خواهیم به مقایسه چهره های یازده ابتدایی تیم فوتبال چلسی در سال 2018 و 2019 بپردازیم. سپس می توانید ارزیابی کنید که آیا الگوریتم چهره بازیکنان مشترک بین تصاویر را شناسایی می کند یا خیر.

2.1 دو چهره را مقایسه کنید

در این بخش ، شما باید سه ماژول را وارد کنید: VGGFace برای آماده سازی چهره های استخراج شده برای استفاده در مدل های تشخیص چهره ، و cosine عملکرد از SciPy برای محاسبه فاصله بین دو چهره:

from keras_vggface.utils import preprocess_input
from keras_vggface.vggface import VGGFace
from scipy.spatial.distance import cosine

بیایید تابعی را تعریف کنیم که چهره های استخراج شده را به عنوان ورودی گرفته و نمرات مدل محاسبه شده را برگرداند. مدل یک بردار را برمی گرداند ، که نمایانگر ویژگی های یک چهره است:

def get_model_scores(faces):
  samples = asarray(faces, 'float32')

  
  samples = preprocess_input(samples, version=2)

  
  model = VGGFace(model='resnet50',
      include_top=False,
      input_shape=(224, 224, 3),
      pooling='avg')

  
  return model.predict(samples)

faces = [extract_face_from_image(image_path)
         for image_path in ['iacocca_1.jpg', 'iacocca_2.jpg']]

model_scores = get_model_scores(faces)

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

نمایش بردار چهره با شباهت کسینوس سازگار است. در اینجا یک مقایسه دقیق بین وجود دارد فاصله کسینوس و اقلیدسی با یک مثال.

cosine() تابع فاصله کسینوس بین دو بردار را محاسبه می کند. هرچه این عدد کمتر باشد ، مطابقت چهره شما بهتر است. در مورد ما ، ما آستانه را در یک فاصله قرار می دهیم 0.4. این آستانه قابل بحث است و با مورد استفاده شما متفاوت خواهد بود. شما باید این آستانه را براساس مطالعات موردی روی مجموعه داده خود تنظیم کنید:

if cosine(model_scores[0], model_scores[1]) <= 0.4:
  print("Faces Matched")

در این حالت ، دو چهره Lee Iacocca با هم مطابقت دارند:

Faces Matched

2.2 چندین چهره را در دو تصویر مقایسه کنید

بیایید در این بخش از آموزش ، از مدل به خوبی استفاده کنیم. ما چهره ها را در دو تصویر از یازده شروع باشگاه فوتبال چلسی در یک مقایسه خواهیم کرد بازی لیگ اروپا و اسلاویا پراگ در فصل 19-2018 و بازی سوپرجام یوفا و لیورپول در فصل 2019-2020. در حالی که بسیاری از بازیکنان در هر دو تیم روز مسابقه حضور دارند ، بیایید ببینیم آیا الگوریتم قادر به شناسایی تمام بازیکنان معمول است.

ابتدا ، اجازه دهید منابع را از URL ها بازیابی کنیم ، چهره های موجود در هر تصویر را شناسایی کرده و برجسته کنیم:

store_image('https://cdn.vox-cdn.com/thumbor/Ua2BXGAhneJHLQmLvj-ZzILK-Xs=/0x0:4872x3160/1820x1213/filters:focal(1877x860:2655x1638):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/63613936/1143553317.jpg.5.jpg',
            'chelsea_1.jpg')

image = plt.imread('chelsea_1.jpg')
faces_staring_xi = detector.detect_faces(image)

highlight_faces('chelsea_1.jpg', faces_staring_xi)

store_image('https://cdn.vox-cdn.com/thumbor/mT3JHQtZIyInU8_uGxVH-TCbF50=/0x415:5000x2794/1820x1213/filters:focal(1878x1176:2678x1976):format(webp)/cdn.vox-cdn.com/uploads/chorus_image/image/65171515/1161847141.jpg.0.jpg',
            'chelsea_2.jpg')

image = plt.imread('chelsea_2.jpg')
faces = detector.detect_faces(image)

highlight_faces('chelsea_2.jpg', faces)

قبل از اینکه بیشتر ادامه دهیم ، در اینجا یازده یازده شروع از هر دو مسابقه آورده شده است:

ما هشت بازیکن داریم که در شروع XI مشترک هستند و در حالت ایده آل باید با الگوریتم مطابقت داشته باشند.

ابتدا امتیازات را محاسبه می کنیم:

slavia_faces = extract_face_from_image('chelsea_1.jpg')
liverpool_faces = extract_face_from_image('chelsea_2.jpg')

model_scores_starting_xi_slavia = get_model_scores(slavia_faces)
model_scores_starting_xi_liverpool = get_model_scores(liverpool_faces)
``
for idx, face_score_1 in enumerate(model_scores_starting_xi_slavia):
  for idy, face_score_2 in enumerate(model_scores_starting_xi_liverpool):
    score = cosine(face_score_1, face_score_2)
    if score <= 0.4:
      
      print(idx, idy, score)
      
      plt.imshow(slavia_faces[idx])
      plt.show()
      plt.imshow(liverpool_faces[idy])
      plt.show()

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

هشت چهره به درستی شناخته شدههشت چهره به درستی شناخته شده (Kepa ، Azpilicueta ، Emerson ، Giroud ، Kante ، Pedro ، Christensen ، Kovacic)

در حالی که ما با موفقیت توانستیم هر چهره را در تصاویر خود مطابقت دهیم ، مایلم یک قدم به عقب بروم و درباره نتایج امتیازات بحث کنم. همانطور که قبلاً بحث شد ، هیچ آستانه جهانی وجود ندارد که بتواند دو تصویر را با هم مطابقت دهد. ممکن است لازم باشد با داده های جدیدی که در تجزیه و تحلیل قرار می گیرند ، این آستانه ها را دوباره تعریف کنید. به عنوان مثال ، حتی وقتی Google Photos قادر به تعیین برنامه ریزی بهترین آستانه برای یک جفت نیست ، ورودی های شما را نیز می گیرد.

Google Photos ورودی کاربر را برای تطبیق چهره می گیردGoogle Photos ورودی کاربر را برای تطبیق چهره می گیرد

بهترین راه پیش رو ارزیابی دقیق مواردی است که با انواع مختلف چهره ها مطابقت دارد. احساسات چهره و زوایای آنها نیز در تعیین دقت نقش دارد. در مورد استفاده ما ، توجه کنید که من عمداً از عکسهای یازده نفره استفاده کرده ام ، زیرا بازیکنان دقیقاً به دوربین خیره شده اند! می توانید یازده چهره ابتدایی را با چهره های یک جشن تطبیق مطابقت دهید و من مطمئن هستم که دقت کاهش می یابد.

نتیجه

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

آیا برای شناسایی و مطابقت چهره ها از الگوریتم دیگری استفاده می کنید؟ به من اطلاع دهید توییتر!