7.7. التطبيع (Normalization)¶
ml.Model.predict() تأخذ قائمة من المدخلات لأن بعض الشبكات لها أكثر من موتر إدخال، لكن القائمة لا تملك طريقةً لحمل وسائط خاصة بكل مُدخل ضمنيًا -- فليس هناك خانة كلمة مفتاحية تقول "اقصص هذا المُدخل إلى (x, y, w, h) ولكن اترك المدخلات الأخرى وشأنها". ml.preprocessing.Normalization هي الغلاف الذي يسدّ تلك الفجوة. يحمل كائن Normalization معاملات مُدخل واحد؛ ويمرّر البرنامج النصي المُدخل المُغلَّف في قائمة predict كلما احتاج إلى أي شيء غير القيم الافتراضية.
السبب الأكثر شيوعًا للجوء إليه هو قصّ منطقة محددة من الإطار المُلتقَط إلى الشبكة بدلًا من الصورة كاملةً.
7.7.1. المعاملات¶
Normalization(scale=(0.0, 1.0),
mean=(0.0, 0.0, 0.0),
stdev=(1.0, 1.0, 1.0),
roi=None)
roi-- المستطيل(x, y, w, h)في الإطار المصدر المراد قصّه قبل إعادة التحجيم. القيمة الافتراضية هي الإطار كاملًا. معظم استخداماتNormalizationتضبط هذا المعامل فقط.scale-- المدى(min, max)الذي تتوقعه موترات الإدخال ذات الفاصلة العائمة بعد التطبيع. يُربط مدى البكسل0..255خطيًا داخل هذا المدى. القيم الشائعة هي(0.0, 1.0)للشبكات المُدرَّبة بـ ReLU و(-1.0, 1.0)للشبكات المُطبَّعة بشكل متماثل.mean-- المتوسط(R, G, B)لكل قناة الذي يُطرح من الصورة بعد القياس. يطابق إحصاءات القنوات التي دُرّبت عليها الشبكة -- و(0.485, 0.456, 0.406)للشبكات المشتقة من ImageNet هو المثال المعياري. تختزل شبكات تدرج الرمادي المتوسط إلى قيمة لمعان (luma) باستخدام الصيغة القياسية0.299*R + 0.587*G + 0.114*B.stdev-- الانحراف المعياري(R, G, B)لكل قناة الذي تُقسَّم عليه الصورة بعد طرح المتوسط، مطابقًا مرةً أخرى لإحصاءات تدريب الشبكة. ويُختزل إلى لمعان بالطريقة نفسها لشبكات تدرج الرمادي.
7.7.2. متى تهم المعاملات¶
تُتجاهَل scale و mean و stdev عندما يكون input_dtype الخاص بالشبكة هو int8 أو uint8. ففي الشبكات ذات الإدخال الصحيح تُكتب بايتات الصورة المقصوصة في الموتر مباشرةً، وتتولى input_scale و input_zero_point الخاصتان بالشبكة تحويل الصحيح إلى الحقيقي. لا تهم المعاملات الثلاثة إلا عندما تتوقع الشبكة إدخالًا ذا فاصلة عائمة.
تُقرأ roi في كل حالة -- فهي تتحكم بأي جزء من الإطار المصدر يصل إلى الشبكة بصرف النظر عن نوع بيانات الإدخال.
7.7.3. منطقة الاهتمام (ROI) وإعادة التحجيم¶
تُحجَّم منطقة الاهتمام تحجيمًا ثنائي الخطية (bilinearly) من أبعادها المصدرية إلى أبعاد إدخال الشبكة. تُوضع الصورة في مركز الوجهة ويملأ التحجيم الوجهة -- وهو لا يحافظ على نسبة العرض إلى الارتفاع. تخرج منطقة الاهتمام غير المربعة المُغذّاة إلى إدخال شبكة مربع ممطوطةً أفقيًا أو رأسيًا.
يعتمد ما إذا كان المطّ يهم على الشبكة. دُرّبت نماذج كشف الوجوه والمعالم مثل عائلة MediaPipe (BlazeFace، FaceLandmarks، HandLandmarks، MoveNet) على قصاصات مربعة وتتدهور بسرعة عندما تكون نسبة عرض الإدخال غير صحيحة؛ ولتلك النماذج يحتاج التطبيق إلى إعطائها منطقة اهتمام مربعة -- إما بالالتقاط بحجم إطار مربع عبر window() أو بالقصّ باستخدام المعامل roi=. أما كاشفات الأجسام من عائلة YOLO فتُدرَّب عادةً بتعزيز (augmentation) يتضمن مطّات عشوائية وتقبل مناطق اهتمام غير مربعة دون خسارة كبيرة في الدقة؛ وتمرير الإطار المُلتقَط كاملًا مباشرةً يكون عادةً جيدًا.
عندما تطابق أبعاد إدخال الشبكة منطقة الاهتمام تمامًا ينهار التحجيم إلى مجرد نسخ، وهي الحالة الأقل كلفةً.
7.7.4. تجاوز الافتراضي¶
predict() تُغلّف كل مُدخل image.Image بـ Normalization() تلقائيًا -- بالمعاملات الافتراضية أعلاه. معظم النماذج التي تُشحن مع الكاميرا دُرّبت على مديات بكسل تغطيها القيم الافتراضية أصلًا، لذا فالحالة الشائعة هي تمرير الصورة مباشرةً:
result = model.predict([img])
لاستخدام منطقة اهتمام مخصصة -- وهو التجاوز الأكثر شيوعًا -- أنشئ Normalization مع ضبط منطقة الاهتمام واربط الصورة بها:
from ml.preprocessing import Normalization
norm = Normalization(roi=(80, 60, 160, 120))
result = model.predict([norm(img)])
لمطابقة إحصاءات القنوات في وقت تدريب الشبكة، اضبط معاملات الفاصلة العائمة:
norm = Normalization(scale=(0.0, 1.0),
mean=(0.485, 0.456, 0.406),
stdev=(0.229, 0.224, 0.225))
result = model.predict([norm(img)])
إن استدعاء كائن Normalization على الصورة يُعيد كائنًا مربوطًا جديدًا يملأ المحرك الموتر منه. الكائن المربوط هو ما تقبله predict بدلًا من الصورة الخام، ولأنه كائن خاص بكل مُدخل، يمكن لشبكة متعددة المدخلات أن تمزج صورًا بمناطق اهتمام مختلفة في قائمة predict نفسها.
بالنسبة للشبكات التي تتوقع مدخلات أنتجها التطبيق بالفعل بصيغة موتر -- مخزن مؤقت من طرفية، أو ndarray حسبه خط أنابيب آخر، أو بيانات رقمية غير صورية -- تخطَّ Normalization بالكامل ومرّر الـ ndarray أو كائنًا قابلًا للاستدعاء يُنتجه. predict() تمرّر تلك إلى المحرك دون تغليف.