الرؤية الحاسوبية2015متوسط10 دقيقة قراءة

FaceNet: تضمين موحَّد للتعرّف على الوجوه وتعنقدها

FaceNet: A Unified Embedding for Face Recognition and Clustering

Schroff, F. · Kalenichenko, D. · Philbin, J. — CVPR

المشكلة

حتى عام 2015، كانت الطريقة السائدة للتعرّف على الوجوه تسير بأسلوب غير مباشر: درّب مصنِّفاً بطبقة softmax على مجموعة أشخاص معروفين، ثم احذف طبقة واستخرج تمثيلاً وسيطاً من داخل الشبكة ليكون «بصمة» للوجه. المشكلة أنّ الشبكة هنا تتعلّم التصنيف وليس بناء تمثيل جيد، فالتمثيلات الناتجة ضخمة الأبعاد وصعبة المقارنة ولا تعمل جيداً مع أشخاص جدد لم تتدرّب عليهم. فوق ذلك، كانت كل مهمة — التحقّق والتعرّف والتجميع — تحتاج نظاماً منفصلاً.

الإسهام

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

الأثر

حقّق FaceNet دقة 99.63% على معيار LFW و95.12% على YouTube Faces DB، وخفّض أفضل نسبة خطأ سابقة بمقدار 30%. لكن الأثر الأكبر تجاوز الوجوه: أصبحت الخسارة الثلاثية أداة أساسية في تعلّم المقاييس، واستُخدمت في إعادة تعريف الأشخاص واسترجاع الصور وتمثيل الجمل (Sentence-BERT) والتعلّم البصري ذاتي الإشراف (SimCLR). المبدأ الذي رسّخه FaceNet — أنّ «التشابه هو مسافة في فضاء مُتعلَّم» — أصبح اليوم العمود الفقري للتعلّم التبايني في الذكاء الاصطناعي.

تخيّل مصوّراً في مدرسة لا يكتب اسم الطالب على كل صورة، بل يضع لكل وجه دبّوساً على خريطة ضخمة. الطالب نفسه في يوم آخر؟ الدبّوسان يقعان على بُعد أمتار. طالبان مختلفان؟ الدبّوسان يبعدان كيلومترات. بهذه الطريقة يتحوّل سؤال «هل هذا الشخص نفسه؟» إلى قياس بين دبّوسين، وسؤال «من هذا؟» إلى البحث عن أقرب دبّوس موجود، وتصنيف صور الفصل إلى مجرد للدبابيس المتجاورة — والخريطة واحدة لكل هذه المهام.

FaceNet هو ذلك المصوّر: يتعلّم وضع كل وجه عند نقطة في فضاء من 128 بحيث تصبح المسافة بين النقاط هي الهوية ذاتها.

المشكلة: التضمينات غير المباشرة تُهدر طاقة الشبكة

قبل FaceNet، كان الأسلوب المعتاد للتعرّف على الوجوه يمرّ بثلاث خطوات:

  1. درّب كـمصنِّف خرج واحد لكل شخص في مجموعة التدريب.
  2. احذف التصنيف الأخيرة.
  3. خُذ تنشيطات إحدى واستخدمها بوصفها «بصمة» للوجه.

هذا ما يُعرف بأسلوب ، وفيه مشكلتان أساسيتان. الأولى أنّ الشبكة تُحسِّن دقة التصنيف عبر ، لكنها لا تهتمّ بجودة نفسه — ليس هناك ما يدفعها لتقريب تضمينات الشخص الواحد أو إبعاد تضمينات الأشخاص المختلفين. المشكلة الثانية أنّ حجم الناتج مرتبط بتصميم الشبكة الداخلي، وغالباً يخرج بـ 4096 بُعداً أو أكثر — رقم غير عملي حين تحتاج البحث في ملايين الوجوه لحظياً.

ما كان مطلوباً هو أن تتعلّم الشبكة التضمين مباشرةً: أن تهتمّ بـالمسافات في فضاء المخرجات بدلاً من احتمالات التصنيف.

افتح في المختبر
على اليسار: الأسلوب القديم الذي يستخرج الواصفات من مصنِّف. على اليمين: أسلوب FaceNet الذي يُدرّب التضمين مباشرةً بالخسارة الثلاثية. بدّل بينهما للمقارنة.
تستيقظ التجربة عند وصولك…

الفكرة الجوهرية: علّم المسافات بالثُلاثيات

الفكرة وراء FaceNet بسيطة بشكل مفاجئ: بدلاً من أن تتعلّم الشبكة تصنيف الوجوه إلى فئات، علّمها علاقة مكانية بين الصور. في كل خطوة تدريب تستخدم ثلاث صور:

  • المرجع (Anchor) — أي صورة وجه.
  • الإيجابية (Positive) — صورة أخرى لنفس الشخص.
  • السلبية (Negative) — صورة لشخص مختلف.

دالة الخسارة تقول ببساطة: «اجعل المسافة من المرجع إلى الإيجابية أقل من المسافة إلى السلبية، بهامش أمان α\alpha على الأقل.» لا طبقة تصنيف، ولا softmax، ولا عصبون مخصّص لكل شخص. كل ما تفعله الشبكة هو إنتاج متّجه من 128 بُعداً تكون فيه المسافة الإقليدية هي مقياس بين الوجوه.

فكّر في الأمر كتوزيع مقاعد في قاعة حفلات: الأصدقاء يجلسون على بُعد ذراع من بعضهم، بينما الغرباء يفصلهم عدة صفوف. الهامش α\alpha هو الحدّ الأدنى من الفجوة التي تفرضها بين أي صديقين وأي غريب.

L=iN[f(xia)f(xip)22    f(xia)f(xin)22  +  α]+\mathcal{L} = \sum_{i}^{N} \Bigl[\, \|f(x_i^a) - f(x_i^p)\|_2^2 \;-\; \|f(x_i^a) - f(x_i^n)\|_2^2 \;+\; \alpha \,\Bigr]_+
دالة الخسارة الثلاثية — إشارة التدريب بالكاملf(x) = المتّجه الناتج من 128 بُعداً · ‖·‖² = مربع مسافة L2 · α = الهامش (يُضبط عادةً على 0.2) · [·]₊ = max(0, ·). حين تكون الإيجابية أقرب من السلبية بمقدار α على الأقل تصبح الخسارة صفراً — الثلاثية «مستوفاة» ولا تولّد أي تدرّج.
افتح في المختبر
اسحب المرجع والإيجابية والسلبية في فضاء التضمين. راقب كيف تتغيّر قيمة الخسارة حين يُستوفى شرط الهامش أو يُنتهَك.
تستيقظ التجربة عند وصولك…

اختيار الثُلاثيات: فن انتقاء التحدّي المناسب

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

الحلّ الذي يقدّمه FaceNet هو استخراج السلبيات شبه الصعبة: لكل زوج مرجع-إيجابية في ، اختر سلبية أبعد عن المرجع من الإيجابية لكنها لا تزال داخل نطاق الهامش. هذه الثلاثيات تقع في المنطقة المثالية — صعبة بما يكفي لتوليد مفيد، لكنها لا تُزعزع استقرار التدريب.

رياضياً، السلبية شبه الصعبة nn تحقّق الشرط: f(xa)f(xp)22<f(xa)f(xn)22<f(xa)f(xp)22+α\|f(x^a) - f(x^p)\|_2^2 < \|f(x^a) - f(x^n)\|_2^2 < \|f(x^a) - f(x^p)\|_2^2 + \alpha

الأمر أشبه بمعلّم يختار مسائل تمرين لطلابه: لو كانت سهلة جداً لن يستفيد الطالب، ولو كانت صعبة جداً سيُحبَط وينسحب. السلبيات شبه الصعبة هي المسائل التي تقع بالضبط خارج منطقة الراحة — تتحدّى الطالب دون أن تكسره.

افتح في المختبر
انقر على زوج مرجع-إيجابية لترى المناطق الثلاث: سلبيات سهلة (بعيدة جداً)، سلبيات شبه صعبة (المنطقة المثالية)، وسلبيات صعبة (قريبة جداً).
تستيقظ التجربة عند وصولك…

البنية المعمارية: من البكسلات إلى 128 رقماً

ينظر FaceNet إلى الشبكة الالتفافية العميقة بوصفها دالة مُتعلَّمة f(x)R128f(x) \in \mathbb{R}^{128} تأخذ صورة وجه وتُخرج نقطة على سطح كرة فائقة في 128 بُعداً، بعد L2 بحيث f(x)2=1\|f(x)\|_2 = 1. جرّبت الورقة عائلتين من البنى:

  • NN1 (على طراز Zeiler & Fergus): شبكة من 22 طبقة مع 1×1، تضمّ 140 مليون و1.6 مليار عملية حسابية (FLOPS). تحقّق أعلى دقة.
  • NN2 إلى NN4 وNNS1 إلى NNS2 (على طراز Inception / GoogLeNet): فروع متوازية من التفافات 1×1 و3×3 و5×5 في كل وحدة. NN2 يصل إلى دقة مماثلة بـ 7.5 مليون معامل فقط — أي أقل بعشرين ضعفاً من NN1. أما الأصغر NNS2 (4.3 مليون معامل، 20 مليون عملية) فيعمل على الهاتف المحمول.

الطبقة الأخيرة تُخرج 128 رقماً عشرياً تُسوَّى بمعيار L2 — لا softmax ولا طبقة تصنيف. الشبكة بأكملها، من إلى المتّجه النهائي، تُدرَّب من طرف إلى طرف بدالة الخسارة الثلاثية.

افتح في المختبر
تابع رحلة صورة وجه عبر خط أنابيب FaceNet: الدخل ← الشبكة الالتفافية العميقة ← متّجه من 128 بُعداً ← تسوية L2 ← تضمين على سطح الكرة الفائقة.
تستيقظ التجربة عند وصولك…

تضمين واحد، ثلاث مهام

أجمل ما في FaceNet أنّ تضميناً واحداً من 128 بُعداً يكفي لأداء ثلاث مهام كانت تحتاج أنظمة منفصلة:

  • («هل هذا الشخص نفسه؟»): احسب مسافة L2 بين التضمينين. إذا كانت d<العتبةd < \text{العتبة} فالإجابة نعم.
  • التعرّف («من هذا الشخص؟»): ابحث عن التضمين المسجّل الأقرب من حيث مسافة L2 — مجرد بحث عن الجار الأقرب.
  • التعنقد («جمّع هذه الوجوه حسب الهوية»): طبّق تعنقد قياسية (تراكمية أو k-means) على المتّجهات. وجوه الشخص الواحد تتجمّع طبيعياً في عناقيد متقاربة.

لا حاجة لضبط مخصّص لكل مهمة، ولا لنماذج منفصلة، ولا لمعالجة لاحقة. فضاء التضمين هو الحل بذاته.

افتح في المختبر
شاهد التحقّق والتعرّف والتعنقد أثناء العمل — كلها تستخدم فضاء التضمين نفسه. بدّل بين المهام الثلاث.
تستيقظ التجربة عند وصولك…

الفكرة الجوهرية في شيفرة برمجية

دالة الخسارة الثلاثية مع استخراج السلبيات شبه الصعبةpython

مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.

import numpy as np

def l2_normalize(x):
    """إسقاط التضمينات على سطح الكرة الفائقة الواحدية."""
    return x / np.linalg.norm(x, axis=-1, keepdims=True)

def triplet_loss(anchor, positive, negative, margin=0.2):
    """حساب الخسارة الثلاثية لثلاثية واحدة.
    جميع المدخلات متّجهات من 128 بُعداً مُسوّاة بـ L2."""
    d_pos = np.sum((anchor - positive) ** 2)   # مربع مسافة L2 إلى الإيجابية
    d_neg = np.sum((anchor - negative) ** 2)   # مربع مسافة L2 إلى السلبية
    return max(0, d_pos - d_neg + margin)       # صفر حين يُستوفى شرط الهامش

def select_semi_hard_negatives(anchor_emb, pos_emb, neg_embs, margin=0.2):
    """اختر السلبية شبه الصعبة من دفعة سلبيات.
    شبه صعبة: أبعد من الإيجابية لكن داخل نطاق الهامش."""
    d_pos = np.sum((anchor_emb - pos_emb) ** 2)
    d_negs = np.sum((anchor_emb - neg_embs) ** 2, axis=1)

    # شبه صعبة: d_pos < d_neg < d_pos + margin
    mask = (d_negs > d_pos) & (d_negs < d_pos + margin)
    if mask.any():
        # اختر أقرب سلبية شبه صعبة (الأكثر إفادة)
        candidates = d_negs[mask]
        return neg_embs[mask][np.argmin(candidates)]
    # بديل: أصعب سلبية لا تزال أبعد من الإيجابية
    valid = d_negs[d_negs > d_pos]
    if len(valid) > 0:
        idx = np.where(d_negs == valid.min())[0][0]
        return neg_embs[idx]
    return neg_embs[np.argmax(d_negs)]  # الأبعد إن كانت كلها صعبة

# يُدرَّب FaceNet من طرف إلى طرف: الشبكة الالتفافية تُخرج
# 128 رقماً، تُسوّيها بـ L2، ثم تُنشر الخسارة الثلاثية
# تدرّجاتها عبر الشبكة بأكملها. هذه هي الحيلة بالكامل.

التدريب على نطاق واسع: البيانات والتقارب

دُرِّب FaceNet على ما بين 100 و200 مليون صورة وجه مصغّرة تغطّي نحو 8 ملايين هوية. استُخدم مع عبر الشبكة بالكامل، والهامش α\alpha مضبوط على 0.2. احتاج التدريب ما بين 1000 و2000 ساعة على عنقود معالجات، والدقة ظلّت تتحسّن حتى بعد 500 ساعة — مما يدلّ على أنّ تعلّم المقاييس بهذا الحجم يحتاج صبراً طويلاً.

أبرز القرارات التدريبية:

  • دفعات كبيرة (نحو 1800 مثال) حتى تتوفّر هويات كافية في كل دفعة لاستخراج ثلاثيات مفيدة.
  • 128 بُعداً لـالتضمين — جرّبت الورقة 64 و128 و256 و512 ووجدت أنّ 128 يحقّق أفضل توازن.
  • محاذاة تقريبية للصور عبر كاشف وجوه بسيط، دون الحاجة إلى محاذاة ثلاثية الأبعاد — الشبكة تعلّمت وحدها التعامل مع تغيّرات الوضعية والإضاءة.

النتائج: تحطيم المعايير المرجعية

حقّق FaceNet أرقاماً قياسية جديدة على المعيارين الرئيسيين:

  • LFW: دقة 99.63% ± 0.09 — أي أنه خفّض نسبة الخطأ مقارنة بأفضل نتيجة سابقة (DeepId2+ عند 99.47%) بنحو 30%. حتى النموذج الأصغر NN3 وصل إلى نتائج لا تختلف إحصائياً عن هذا الرقم.
  • YouTube Faces DB: دقة 95.12% ± 0.39، مع خفض الخطأ السابق إلى النصف تقريباً.

لكنّ الأمر اللافت هو حجم : 128 رقماً فقط لكل وجه. الأساليب السابقة كانت تستخدم متّجهات من 4096 بُعداً أو أكثر. هذا الضغط بمقدار 32 ضعفاً هو ما يجعل FaceNet قابلاً للعمل على الهاتف المحمول وفي قواعد بيانات بمليارات الوجوه.

افتح في المختبر
جرّب أبعاد التضمين المختلفة: 64 → 128 → 256. لاحظ كيف يحقّق 128 التوازن الأفضل بين صغر الحجم وجودة فصل العناقيد.
تستيقظ التجربة عند وصولك…

الإرث والتأثير

  1. 2005

    عصر الوجوه الذاتية

    اعتمد التعرّف على الوجوه على الوجوه الذاتية (Eigenfaces) المبنية على تحليل المكونات الرئيسية — إسقاطات خطية لا تتعامل جيداً مع اختلافات الوضعية والإضاءة وتعبيرات الوجه.

  2. 2014

    DeepFace (فيسبوك)

    أول نظام تعلّم عميق يقترب من الأداء البشري في التحقّق من الوجوه، لكنه ظلّ يعتمد على أسلوب التصنيف غير المباشر مع عنق الزجاجة.

  3. 2015

    FaceNet

    تعلّم التضمين مباشرةً عبر الخسارة الثلاثية. وصل إلى 99.63% على LFW ووحّد التحقّق والتعرّف والتجميع في نظام واحد. وقدّم آلية استخراج السلبيات شبه الصعبة.

  4. 2016

    انفجار التعلّم المتريّ

    انتشرت الخسارة الثلاثية في مجالات متعددة: إعادة تعريف الأشخاص، واسترجاع الصور، والتعرّف على المركبات. وظهرت امتدادات مثل خسارة N-pair والخسارة البنيوية المرفوعة.

  5. 2019

    Sentence-BERT

    نقلت فكرة التدريب بالثلاثيات إلى عالم اللغة: تمثيلات جمل تكون فيها المسافة الإقليدية مقياساً للتشابه الدلالي. أصبحت أساس البحث الدلالي الحديث.

  6. 2020

    SimCLR

    تعلّم تبايني ذاتي الإشراف لبناء تمثيلات بصرية. امتداد طبيعي لفلسفة FaceNet: تعلّم المسافات بدلاً من التسميات.

  7. 2020

    ArcFace وCosFace

    طوّرت دوال خسارة تعمل في الفضاء الزاوي بدلاً من الإقليدي، فرفعت دقة التعرّف على الوجوه أكثر. وريثة مباشرة لمنهج تعلّم المقاييس الذي أرساه FaceNet.

لماذا كان مهماً

الدرس الأهمّ من FaceNet هو أنّ اختيار دالة الخسارة المناسبة قد يكون أهمّ من اختيار البنية المعمارية. الشبكة الالتفافية نفسها مع خسارة تصنيف تُنتج تضمينات عادية، لكن مع خسارة ثلاثية تُنتج تضمينات بمستوى عالمي. ما يُشكّل التمثيل في النهاية ليس حجم الشبكة أو عمقها، بل الإشارة التي تتعلّم منها.

المرجعSchroff, Kalenichenko, Philbin. FaceNet: A Unified Embedding for Face Recognition and Clustering. CVPR, 2015.

مصطلحات هذه الورقة