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

مُدرَّجات الاتجاهات التكرارية لاكتشاف البشر

Histograms of Oriented Gradients for Human Detection

Dalal, N. · Triggs, B. — CVPR

المشكلة

قبل عام 2005 لم تكن هناك طريقة موثوقة لاكتشاف الأشخاص في الصور. الأساليب المتاحة آنذاك، كمُويجات هار في كاشف فيولا-جونز للوجوه، لم تتعامل جيداً مع التنوع الكبير في أوضاع الجسم والملابس والخلفيات. سمات الحواف كانت موجودة لكنها تتأثّر بشدّة بتغيُّرات الإضاءة، ولم تنجح أي مجموعة سمات مصمَّمة يدوياً في التقاط الصورة الظِلِّية للإنسان بشكل متين تحت ظروف متباينة.

الإسهام

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

الأثر

ظلّ خط معالجة HOG+SVM الأسلوب المهيمن في طوال عقد كامل تقريباً، وعمل في أنظمة فعلية للقيادة الذاتية والمراقبة والروبوتات. مبادئ تصميمه — الشبكات الكثيفة المتداخلة، ومُدرَّجات الاتجاه المحلية، وتسوية الكُتل — انتقلت لاحقاً إلى بنى وأثّرت في طريقة فيها. شبكة R-CNN عام 2014 استعارت فكرة من عصر HOG وطوّرتها إلى أسلوب اقتراح المناطق، فشكَّلت الجسر بين السمات المصمَّمة يدوياً والسمات التي تتعلّمها الشبكة بنفسها.

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

هذا هو جوهر ما يفعله HOG. يتجاهل الألوان والسطوع تماماً، ويحتفظ فقط بـاتجاه كل حافة وقوّتها عند كل نقطة في الصورة، ثم يُجمِّعها في وصف مُكثَّف. بعد ذلك يأتي دور : مُصنِّف تعلَّم مسبقاً أن يقول «نمط الحواف هذا يُشبه إنساناً».

لماذا الحواف؟ قوة السمات المبنية على التدرُّج

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

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

خط معالجة HOG: من البكسلات إلى اكتشاف الشخص

يمرّ بناء واصف HOG بخمس مراحل متتابعة، كل مرحلة تُنقّح مخرجات سابقتها. تخيّل الأمر كأنبوب معالجة: تدخل البكسلات الخام من طرف، ويخرج من الطرف الآخر وصف مُكثَّف لشكل الجسم. فهْم كل مرحلة — ولماذا هي ضرورية — هو المفتاح لفهم كيف كانت اليدوية تقود أفضل أساليب في ذلك العصر.

افتح في المختبر
تابع المراحل الخمس لخط معالجة HOG. انقر على كل مرحلة لترى ماذا تفعل ولماذا.
تستيقظ التجربة عند وصولك…

المرحلة الأولى: حساب التدرُّجات

نبدأ بالبحث عن الحواف. الفكرة بسيطة: عند كل بكسل نقيس مدى سرعة تغيُّر الشدة الضوئية في الاتجاهين الأفقي والعمودي. المفاجأة التي وجدها دلال وتريغز أنّ أبسط ممكن يعطي أفضل النتائج: اطرح قيمة البكسل الأيسر من الأيمن للحصول على التدرُّج الأفقي، واطرح الأعلى من الأسفل للتدرُّج العمودي. لا تنعيم غاوسي ولا عوامل سوبل — مجرد فرق مركزي خام [1,0,1][-1, 0, 1].

من المُركَّبين gxg_x وgyg_y نستخرج شيئين: المقدار الذي يُعبِّر عن قوة الحافة، والاتجاه الذي يُحدّد الناحية التي تسير فيها. المقدار يُجيب عن سؤال «ما مدى وضوح الحافة هنا؟»، والاتجاه يُجيب عن «إلى أين تتّجه؟».

gx=I(x+1,y)I(x1,y),gy=I(x,y+1)I(x,y1)g_x = I(x+1,y) - I(x-1,y), \quad g_y = I(x,y+1) - I(x,y-1)
مُركَّبا التدرُّج الأفقي والعموديأبسط مرشّح فرق مركزي. لا حاجة للتنعيم — أثبت دلال وتريغز أنه يتفوق على مرشّحات سوبل ومشتقات الدوال الغاوسية في هذه المهمة.
m=gx2+gy2,θ=arctan(gy/gx)m = \sqrt{g_x^2 + g_y^2}, \quad \theta = \arctan(g_y / g_x)
مقدار التدرُّج واتجاههm = قوة الحافة · θ = اتجاه الحافة. هاتان القيمتان عند كل بكسل هما المادة الخام التي ينظّمها HOG في مُدرَّجات تكرارية.
افتح في المختبر
مرِّر المؤشر فوق البكسلات لترى كيف يُحسَب التدرُّج من القيم المجاورة. الأسهم تُوضّح الاتجاه، والسطوع يُوضّح المقدار.
تستيقظ التجربة عند وصولك…

المرحلة الثانية: بناء مُدرَّجات الخلايا

الآن نُقسّم الصورة إلى رُقع صغيرة تُسمى خلايا، حجم كل منها عادةً 8×8 بكسل. داخل كل خلية نبني مُدرَّجاً تكرارياً يُلخّص توزيع اتجاهات الحواف فيها: نأخذ النطاق الكامل من 0° إلى 180° ونُقسّمه على 9 سلال (كل سلّة تغطي 20°)، ثم يُصوّت كل بكسل للسلّة المناسبة لاتجاه تدرُّجه، وتكون قوة تصويته متناسبة مع مقدار ذلك التدرُّج.

لماذا نكتفي بالنطاق 0°–180° (غير مُوقَّع) بدلاً من 0°–360° (مُوقَّع)؟ لأنّنا هنا نهتمّ بالشكل لا بجهة التباين. ذراع الشخص تُنشئ حافة عمودية سواء كانت الذراع أغمق أو أفتح من الخلفية — الحافة من الداكن إلى الفاتح تحمل المعلومة الشكلية نفسها التي تحملها حافة من الفاتح إلى الداكن. وقد أكّدت تجارب دلال وتريغز أنّ التدرُّجات غير المُوقَّعة تُعطي نتائج أفضل فعلاً في اكتشاف المُشاة.

تخيّل مُدرَّج كل خلية وكأنه بوصلة: يُخبرك أي اتجاهات حواف تُهيمن على تلك الرقعة الصغيرة. خلية واقعة على الكتف ستبرز فيها السلال الأفقية، وخلية على الساق ستبرز فيها السلال العمودية.

افتح في المختبر
انقر على خلايا مختلفة لترى كيف تُوزَّع اتجاهات التدرُّج على مُدرَّج بـ 9 سلال. الأعمدة الأطول تعني طاقة حواف أكبر في ذلك الاتجاه.
تستيقظ التجربة عند وصولك…

المرحلة الثالثة: تسوية الكُتل — التغلُّب على تغيُّرات الإضاءة

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

الحل هو . يجمع HOG الخلايا في كُتل أكبر — عادةً 2×2 خلية (أي 16×16 بكسل) — ثم يُسوّي المُدرَّجات المُسلسلة داخل كل كتلة. النقطة المهمة أنّ هذه الكُتل تتداخل: تنزلق بمقدار خلية واحدة في كل مرة، فتظهر كل خلية ضمن عدة كُتل بسياقات تسوية مختلفة. هذا التكرار ليس هدراً بل مقصود — فهو ما يمنح الواصف متانته.

اختبر دلال وتريغز أربعة أساليب للتسوية ووجدا أنّ معيار L2 متبوعاً بقصّ القيم عند 0.2 ثم إعادة التسوية (ما يُعرف بـ L2-Hys) يُحقّق أفضل أداء:

v=ff22+ϵ2,vimin(vi,0.2),vvv22+ϵ2v = \frac{f}{\sqrt{\|f\|_2^2 + \epsilon^2}}, \quad v_i \leftarrow \min(v_i, 0.2), \quad v \leftarrow \frac{v}{\sqrt{\|v\|_2^2 + \epsilon^2}}
تسوية الكُتل L2-Hysf = متجه المُدرَّج الخام للكتلة · نُسوّيه بمعيار L2 · نقصّ أي قيمة تتجاوز 0.2 (لمنع تدرُّج واحد من الهيمنة) · نُعيد التسوية. الأثر: تختفي تأثيرات الإضاءة وتبقى معلومات الشكل سليمة.
افتح في المختبر
شاهد كيف تُغطّي الكُتل المتداخلة نافذة الاكتشاف. بدّل الإضاءة لتراقب كيف تُثبّت التسوية المُدرَّجات.
تستيقظ التجربة عند وصولك…

المرحلة الرابعة: متجه السمات النهائي

بعد التسوية، تُسلسَل مُدرَّجات جميع الكُتل وتُصفّ في متجه واحد طويل. لنأخذ نافذة اكتشاف نموذجية بحجم 64×128 بكسل مع خلايا 8×8 وكُتل 2×2 خلية و9 سلال اتجاه، ونحسب:

  • النافذة تحوي 8×16 = 128 خلية
  • الكُتل المتداخلة: 7×15 = 105 كُتلة
  • كل كتلة: 2×2 خلية × 9 سلال = 36 قيمة
  • الواصف النهائي: 105 × 36 = 3,780 بُعداً

هذا المتجه ذو الـ 3,780 عنصراً هو بصمة شكلية كاملة لما يحدث داخل نافذة الاكتشاف: أين توجد كل حافة، وما قوتها، وإلى أين تتّجه — وكل ذلك بعد إزالة أثر الإضاءة المحلية.

المرحلة الخامسة: مُصنِّف آلة متجهات الدعم الخطية

يُمرَّر متجه HOG ذو الـ 3,780 بُعداً إلى الخطية، وهي مُصنِّف يبحث عن واحد يفصل بين «شخص» و«ليس شخصاً» في هذا الفضاء عالي الأبعاد. خلال ، تتعلّم آلة متجهات الدعم أي أنماط تدرُّج تُميّز الجسم البشري: تدرُّجات أفقية قوية عند مستوى الكتفين، وعمودية عند الساقين، ومُقوَّسة عند الرأس.

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

الاكتشاف: أسلوب النافذة المنزلقة

كيف نعثر على الأشخاص في صورة كاملة؟ يستخدم خط معالجة HOG+SVM نافذة منزلقة: نافذة بحجم 64×128 تتحرك فوق الصورة على عدة مقاييس، وعند كل موضع يُحسب واصف HOG ويُمرَّر إلى آلة متجهات الدعم. المُصنِّف يُصدر حُكمه: «شخص» أو «ليس شخصاً». بعد ذلك تُدمج الاكتشافات المتداخلة بأسلوب لإنتاج النهائية.

العملية مُكلفة حوسبياً — آلاف النوافذ لكل صورة على مقاييس متعددة — لكنها كانت عملية للمعالجة المُؤجَّلة وشبه آنية مع بعض التحسينات. لاحقاً استُبدل أسلوب النافذة المنزلقة باقتراحات المناطق في R-CNN، لكن HOG أثبت أنّ المسح الكثيف مع واصف قوي يُحقّق نتائج فعّالة.

افتح في المختبر
راقب النافذة المنزلقة وهي تمسح الصورة. الصناديق الخضراء تُمثّل الاكتشافات الإيجابية، ودرجة ثقة المُصنِّف مُبيَّنة بجانب كل منها.
تستيقظ التجربة عند وصولك…

خيارات التصميم التي صنعت الفارق

أجرى دلال وتريغز مُوسَّعة — غيّرا عنصراً واحداً في كل تجربة مع تثبيت الباقي — ليتعرّفا على القرارات الأكثر تأثيراً:

  • مقياس تدرُّج دقيق — المُرشّح [1,0,1][-1, 0, 1] تفوّق على سوبل ومشتقات الدوال الغاوسية والأقنعة الأكبر. التنعيم يضرّ لأنه يُطمس الحواف ذاتها التي نحاول التقاطها.
  • تدرُّجات غير مُوقَّعة مع تقسيم اتجاهي ناعم — 9 سلال على 0°–180° تفوّقت على التدرُّجات المُوقَّعة (0°–360°) والتقسيم الأخشن. لاكتشاف الأشكال ما يهمّك هو الاتجاه لا القطبية.
  • تسوية كُتل متداخلة — هذا هو خيار التصميم الأكثر تأثيراً على الإطلاق. بدونه ينهار الأداء بشكل حاد. تسوية التباين المحلي هي ما يمنح HOG متانته أمام تغيُّرات الإضاءة.
  • آلة متجهات دعم خطية — مُصنِّف بسيط فوق سمات مُهندَسة بإتقان. وهذا يُؤكّد القاعدة: جودة السمات أهم من تعقيد المُصنِّف.

HOG مقابل SIFT: كثيف مقابل متناثر

كلا SIFT وHOG يستخدمان مُدرَّجات تدرُّج، لكنهما يُجيبان عن سؤالين مختلفين تماماً. SIFT يسأل: «ما النقاط المفتاحية المميّزة في الصورة، وكيف أصف المنطقة المحيطة بكل نقطة؟» أما HOG فيسأل: «ما بنية التدرُّج الشاملة لنافذة الاكتشاف بأكملها؟»

SIFT متناثر — يختار نقاطاً مميّزة ويتجاهل ما بينها، وهذا يجعله ممتازاً لمطابقة أجسام بعينها. HOG كثيف — يُغطّي كل خلية في النافذة بلا استثناء، وهذا يجعله ممتازاً لاكتشاف فئات كاملة من الأجسام (مثل «أي شخص») حيث يتنوّع الشكل لكنه يتبع نمطاً عاماً مشتركاً.

لتقريب الفكرة: SIFT يصف وجهاً من خلال شاماته ونمشه — معالم فريدة تُميّز شخصاً بعينه. HOG يصف الوجه من خلال الترتيب العام لحوافه — العينان هنا، والأنف هناك، والذقن أسفل — وهذا الوصف يصلح لأي وجه بشري.

افتح في المختبر
يساراً: نقاط SIFT المفتاحية (متناثرة، لكل منها واصفها الخاص). يميناً: شبكة HOG (كثيفة، تُغطّي النافذة بالكامل). كلاهما يعتمد مُدرَّجات التدرُّج لكن بطريقة مختلفة.
تستيقظ التجربة عند وصولك…

HOG في شيفرة برمجية

حساب واصف HOG مُبسَّطpython

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

import numpy as np

def compute_gradients(image):
    """احسب مقدار التدرُّج واتجاهه عند كل بكسل."""
    gx = np.zeros_like(image, dtype=float)
    gy = np.zeros_like(image, dtype=float)
    gx[:, 1:-1] = image[:, 2:] - image[:, :-2]   # مرشّح [-1, 0, 1]
    gy[1:-1, :] = image[2:, :] - image[:-2, :]
    magnitude = np.sqrt(gx**2 + gy**2)
    orientation = np.degrees(np.arctan2(gy, gx)) % 180  # غير مُوقَّع: 0-180
    return magnitude, orientation

def cell_histogram(magnitude, orientation, bins=9):
    """ابنِ مُدرَّجاً تكرارياً من 9 سلال لخلية 8×8 واحدة."""
    hist = np.zeros(bins)
    bin_width = 180.0 / bins
    for i in range(magnitude.shape[0]):
        for j in range(magnitude.shape[1]):
            bin_idx = int(orientation[i, j] / bin_width) % bins
            hist[bin_idx] += magnitude[i, j]    # تصويت بوزن المقدار
    return hist

def hog_descriptor(image, cell_size=8, block_size=2, bins=9):
    """HOG الكامل: خلايا ← كُتل ← تسوية ← سَلسَلة."""
    mag, ori = compute_gradients(image)
    h, w = image.shape
    cells_y, cells_x = h // cell_size, w // cell_size

    # بناء مُدرَّجات الخلايا
    cells = np.zeros((cells_y, cells_x, bins))
    for cy in range(cells_y):
        for cx in range(cells_x):
            y0, x0 = cy * cell_size, cx * cell_size
            cells[cy, cx] = cell_histogram(
                mag[y0:y0+cell_size, x0:x0+cell_size],
                ori[y0:y0+cell_size, x0:x0+cell_size], bins)

    # تسوية الكُتل (L2-Hys)
    descriptor = []
    for by in range(cells_y - block_size + 1):
        for bx in range(cells_x - block_size + 1):
            block = cells[by:by+block_size, bx:bx+block_size].flatten()
            norm = np.sqrt(np.sum(block**2) + 1e-6)
            block = block / norm
            block = np.minimum(block, 0.2)       # قصّ
            norm = np.sqrt(np.sum(block**2) + 1e-6)
            block = block / norm                  # إعادة تسوية
            descriptor.append(block)

    return np.concatenate(descriptor)  # 3780 بُعداً لنافذة 64×128

R-HOG وC-HOG: كُتل مستطيلة مقابل كُتل دائرية

جرّب دلال وتريغز شكلين هندسيين للكُتل. R-HOG (المستطيل) يعتمد شبكات مربّعة من الخلايا — وهو الشكل الذي شرحناه أعلاه والذي صار المعيار الفعلي. C-HOG (الدائري) يُرتّب الخلايا في قطاعات لوغاريتمية-قطبية تنطلق من نقطة مركزية، بأسلوب يُشبه ترتيب واصف SIFT.

في التجارب، تفوّق R-HOG بفارق طفيف في اكتشاف المُشاة وكان أبسط في البرمجة، فصار الخيار الافتراضي. C-HOG يتميّز مع الأجسام ذات التناظر الدوراني، لكنه يُضيف تعقيداً بلا مكاسب تُذكر حين يكون الهدف اكتشاف بشر منتصبي القامة.

الأثر: من السمات اليدوية إلى السمات المُتعلَّمة

  1. 1999

    SIFT (لاو)

    واصفات نقاط مفتاحية متناثرة ثابتة أمام تغيُّر المقياس، مبنية على مُدرَّجات التدرُّج. أثبتت أنّ التدرُّجات المُوجَّهة أساس قوي لبناء السمات.

  2. 2001

    فيولا-جونز (سمات هار)

    اكتشاف الوجوه في الزمن الحقيقي باستخدام مُويجات هار وسلاسل معزَّزة. سريع لكنه واجه صعوبة مع اكتشاف الجسم الكامل وتنوع الوضعيات.

  3. 2005

    HOG (دلال وتريغز)

    مُدرَّجات تدرج كثيفة مع تسوية الكُتل — اكتشاف مُشاة شبه مثالي. وضع المعيار لعقد كامل.

  4. 2008

    نماذج الأجزاء القابلة للتشوّه (DPM)

    وسّعت HOG بنماذج أجزاء قابلة للتشوّه — مرشّح جذري مع مرشّحات أجزاء متحركة تلتقط تنوّع الوضعيات. فازت بمسابقة PASCAL VOC ثلاث سنوات متتالية.

  5. 2012

    AlexNet

    الشبكات الالتفافية العميقة حطّمت أرقام ImageNet القياسية بتعلّم السمات تلقائياً بدل تصميمها يدوياً. بداية نهاية الواصفات المصنوعة يدوياً.

  6. 2014

    R-CNN (غيرشيك وآخرون)

    حلّت سمات CNN مع اقتراحات المناطق محل خط HOG+SVM. طوَّرت فكرة النافذة المنزلقة من عصر HOG إلى أسلوب اقتراح المناطق، فشكَّلت جسراً نحو الاكتشاف الحديث.

القيود

المرجعDalal, Triggs. Histograms of Oriented Gradients for Human Detection. CVPR, 2005.

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