تحمل درجات البني الداكن (sepia) والتدرجات الرمادية للصور الفوتوغرافية القديمة سحرًا فريدًا، حيث تلتقط لحظات مجمدة في الزمن. ومع ذلك، غالبًا ما تفتقر إلى الحيوية الفورية للمشهد الأصلي. تخيل بث ألوان الحياة مرة أخرى في هذه الذكريات العزيزة، وتحويل صورة شخصية باهتة بالأبيض والأسود إلى نافذة تكشف عن عالم الشخص بألوانه الكاملة. لطالما أسرت هذه العملية التحويلية، المعروفة باسم تلوين الصور (image colorization)، الفنانين والمؤرخين. اليوم، وبفضل التقدم في الذكاء الاصطناعي، وخاصة التعلم العميق (deep learning)، يحقق التلوين الآلي نتائج كانت في السابق من نسج الخيال العلمي.
يمثل جلب الألوان إلى صورة ذات تدرج رمادي تحديًا رائعًا. يتم فقدان قدر كبير من المعلومات - بيانات الألوان الأصلية - بطبيعتها عند عرض الصورة بلون واحد (monochrome). كيف يمكن لخوارزمية أن تعرف اللون الحقيقي لزهرة أو فستان أو سماء من قيم السطوع (luminance) وحدها؟ تكمن الإجابة في الأدلة الدقيقة المضمنة في الصورة ذات التدرج الرمادي نفسها: القوام (textures)، والأشكال (shapes)، والسياق (context)، والتفاعل بين الضوء والظل. في حين أن تحديد اللون الأصلي بالضبط قد يكون مستحيلًا (هل كانت تلك الوردة قرمزية حقًا، أم ربما درجة من اللون الوردي؟)، يتحول الهدف نحو إنشاء تلوين مقبول ومقنع من الناحية الجمالية. الهدف هو إنتاج صورة يجدها المراقب البشري قابلة للتصديق، وربما لا يمكن تمييزها عن صورة ملونة أصلية.
تتفوق نماذج التعلم العميق في الكشف عن الأنماط المعقدة والعلاقات الإحصائية ضمن مجموعات البيانات الضخمة. من خلال تدريب هذه النماذج على ملايين الصور، ومقارنة النسخ ذات التدرج الرمادي بنظيراتها الملونة الأصلية، تتعلم الخوارزميات ربط قوام وهياكل معينة بألوان محتملة. تتعلم أن العشب عادة ما يكون أخضر، والسماء غالبًا ما تكون زرقاء، وأن قوامًا معينًا يتوافق مع حبيبات الخشب أو النسيج. إنه أشبه بتخمين مدروس، ولكنه مستنير بموسوعة بصرية هائلة. لا ‘تعرف’ الخوارزمية اللون الحقيقي بالمعنى البشري، ولكن يمكنها إجراء تنبؤات ذات احتمالية عالية بناءً على الارتباطات المكتسبة.
لغة الألوان: CIELab والشبكات العصبية
لمعالجة التلوين حسابيًا، نحتاج إلى طريقة مناسبة لتمثيل اللون. بينما يعد RGB
(الأحمر والأخضر والأزرق) شائعًا للشاشات، إلا أنه يمزج معلومات السطوع (luminance) واللونية (chrominance). النظام الأكثر فائدة لهذه المهمة هو فضاء الألوان CIELab. يفصل هذا النموذج اللون بأناقة إلى ثلاثة مكونات متميزة:
- L (Lightness): تمثل هذه القناة معلومات التدرج الرمادي، وتتراوح من الأسود النقي إلى الأبيض النقي. إنها بشكل أساسي بيانات الإدخال التي لدينا بالفعل في صورة بالأبيض والأسود.
- a: تشفر هذه القناة الطيف من الأخضر (القيم السالبة) إلى الأحمر (القيم الموجبة).
- b: تشفر هذه القناة الطيف من الأزرق (القيم السالبة) إلى الأصفر (القيم الموجبة).
يكمن جمال CIELab
في هذا الفصل. يمكن لنموذج التعلم العميق الخاص بنا التركيز على التنبؤ بقناتي اللونية (‘a’ و ‘b’) بناءً فقط على قناة السطوع (‘L’) المدخلة. تصبح المهمة الأساسية: بالنظر إلى معلومات التدرج الرمادي (L)، ما هي قيم ‘a’ و ‘b’ المقابلة الأكثر احتمالًا لكل بكسل؟
غالبًا ما استخدمت المحاولات المبكرة الشبكات العصبية التلافيفية (CNNs
) - وهي نوع من بنى التعلم العميق البارعة بشكل خاص في معالجة البيانات الشبيهة بالشبكة مثل الصور. تم تدريب هذه الشبكات على مجموعات بيانات صور كبيرة (مثل ImageNet
) للتنبؤ مباشرة بقيم ‘a’ و ‘b’ لكل بكسل، مع التعامل معها كمشكلة انحدار (regression) (التنبؤ بقيم مستمرة). ومع ذلك، ظهر عيب شائع: غالبًا ما بدت الألوان الناتجة باهتة أو خافتة (desaturated or muted). لماذا؟ لنأخذ مثالاً كالتفاحة. يمكن أن تكون حمراء أو خضراء أو حتى صفراء بشكل معقول. إذا حاولت الشبكة حساب متوسط هذه الاحتمالات أثناء الانحدار، فقد تستقر على حل وسط باهت ومائل للبني بدلاً من لون نابض بالحياة ومحدد. هذا التأثير المتوسطي عبر ألوان متعددة محتملة يميل إلى إضعاف النتائج.
نقلة نوعية: التلوين كمهمة تصنيف
للتغلب على مشكلة الألوان الباهتة وإنتاج ألوان أكثر حيوية وواقعية، يعيد نهج أكثر تطوراً صياغة المشكلة. بدلاً من التعامل مع التنبؤ بالألوان كانحدار، يُنظر إليه على أنه مهمة تصنيف (classification task).
إليك التحول المفاهيمي:
- فضاء الألوان المكمم (Quantized Color Space): يتم تحويل الطيف المستمر لقيم ‘a’ و ‘b’ الممكنة إلى مجموعة محددة مسبقًا من ‘صناديق’ أو فئات الألوان التمثيلية. فكر في الأمر على أنه تقليل لوحة ألوان واسعة إلى مجموعة يمكن التحكم فيها، ولكنها شاملة، من خيارات الألوان المتميزة داخل المستوى ‘a’-‘b’.
- التنبؤ بالاحتمالات (Predicting Probabilities): لكل بكسل في صورة التدرج الرمادي المدخلة، لا تتنبأ
CNN
بقيمة واحدة لـ ‘a’ و ‘b’. بدلاً من ذلك، تُخرج توزيعًا احتماليًا عبر صناديق الألوان المكممة. تقول بشكل أساسي، ‘لهذا البكسل، هناك احتمال 70% أنه ينتمي إلى ‘صندوق الأحمر الزاهي رقم 5’، واحتمال 20% أنه ‘صندوق الأحمر الباهت رقم 2’، واحتمال 5% أنه ‘صندوق البني رقم 12’، وهكذا. - معالجة الغموض (Addressing Ambiguity): يتعامل هذا النهج الاحتمالي بطبيعته مع غموض الألوان. إذا كان يمكن أن يكون للكائن ألوان متعددة (مثل التفاحة)، يمكن للشبكة تعيين احتمالات كبيرة لعدة صناديق ألوان مختلفة، مما يعكس عدم اليقين هذا دون اللجوء إلى متوسط باهت.
- فك التشفير إلى لون نابض بالحياة (Decoding to Vibrant Color): تتضمن الخطوة الأخيرة ترجمة هذا التوزيع الاحتمالي مرة أخرى إلى لون واحد محدد لكل بكسل. قد يكون النهج الساذج هو ببساطة اختيار صندوق الألوان ذي الاحتمالية الأعلى (الوضع - mode). ومع ذلك، لتشجيع الحيوية وتجنب مشكلة الألوان الباهتة، يتم استخدام تقنيات مثل حساب المتوسط الملدن (annealed mean) للتوزيع. تعطي هذه الطريقة وزنًا أكبر للتنبؤات الأقل احتمالًا ولكن الأكثر تلونًا (تشبع أعلى)، مما يؤدي فعليًا إلى ‘كسر التعادل’ لصالح الحيوية مع الاستمرار في احترام التوزيع المتوقع العام.
يسمح إطار التصنيف هذا، جنبًا إلى جنب مع التصميم الدقيق لدالة الخسارة (loss function) (المقياس المستخدم لتقييم أداء النموذج أثناء التدريب) خصيصًا للتلوين، للنموذج بتعلم العلاقة المعقدة بين ميزات التدرج الرمادي وتوزيع الألوان المحتملة. والنتيجة هي صور ليست فقط ملونة بشكل معقول ولكنها تمتلك أيضًا ثراءً وجاذبية بصرية غالبًا ما تفتقر إليها الطرق السابقة القائمة على الانحدار.
نظرة خاطفة تحت الغطاء: سير عمل عملي للتعلم العميق
في حين أن تدريب مثل هذه CNN
المتطورة من الصفر يعد مهمة ضخمة تتطلب موارد حسابية هائلة ومجموعات بيانات واسعة، فإن الاستفادة من النماذج المدربة مسبقًا (pre-trained) تجعل هذه التكنولوجيا في المتناول. دعنا نستعرض الخطوات المفاهيمية المتضمنة في استخدام نموذج تعلم عميق مدرب مسبقًا (تحديدًا نموذج تم بناؤه باستخدام إطار عمل Caffe
، كما في المثال الأصلي) لتلوين الصور، والذي تم تنفيذه باستخدام Python
والمكتبات الشائعة.
1. تجميع مجموعة الأدوات:
عادةً ما يتضمن الأساس Python
، وهي لغة برمجة متعددة الاستخدامات شائعة في علوم البيانات والذكاء الاصطناعي. تلعب المكتبات الرئيسية أدوارًا حاسمة:
- NumPy: ضرورية للعمليات العددية الفعالة، وخاصة التعامل مع المصفوفات متعددة الأبعاد التي تمثل الصور.
- OpenCV (cv2): مكتبة قوية لمهام رؤية الكمبيوتر. توفر وظائف لقراءة الصور وكتابتها ومعالجتها وعرضها، والأهم من ذلك، تتضمن وحدة شبكة عصبية عميقة (
DNN
) قادرة على تحميل وتشغيل النماذج المدربة في أطر عمل مختلفة مثلCaffe
وTensorFlow
وPyTorch
. - Argparse: مكتبة
Python
قياسية لإنشاء واجهات سطر أوامر سهلة الاستخدام، مما يسمح للمستخدمين بتحديد معلمات الإدخال بسهولة مثل مسار ملف الصورة. - OS: تستخدم لتفاعلات نظام التشغيل الأساسية، مثل بناء مسارات الملفات بطريقة تعمل عبر أنظمة مختلفة (
Windows
,macOS
,Linux
).
2. الحصول على الذكاء المدرب مسبقًا:
بدلاً من بناء الشبكة العصبية لبنة لبنة، نستخدم ملفات تمثل شبكة تم تدريبها بالفعل على التلوين. تشمل هذه عادةً:
- ملف بنية النموذج (
.prototxt
لـCaffe
): يحدد هذا الملف بنية الشبكة العصبية - الطبقات وأنواعها واتصالاتها ومعلماتها. إنه مخطط النموذج. - ملف الأوزان المدربة (
.caffemodel
لـCaffe
): يحتوي هذا الملف على الأوزان العددية التي تعلمتها الشبكة أثناء عملية التدريب المكثفة. تلخص هذه الأوزان ‘المعرفة’ التي اكتسبها النموذج حول ربط ميزات التدرج الرمادي باحتمالات الألوان. إنها الذكاء المقطر. - بيانات تكميم الألوان (ملف
.npy
): يخزن ملفNumPy
هذا عادةً النقاط المركزية لصناديق الألوان المكممة المستخدمة في نهج التصنيف الموصوف سابقًا. يعمل كلوحة الألوان المرجعية لاحتمالات الألوان المتوقعة.
تمثل هذه الملفات تتويجًا لأسابيع أو أشهر محتملة من التدريب على أجهزة قوية.
3. تحميل محرك التلوين:
مع تحديد موقع الملفات الضرورية، توفر وحدة DNN
في OpenCV
الآلية لتحميل الشبكة المدربة مسبقًا في الذاكرة. تأخذ الدالة cv2.dnn.readNetFromCaffe
(أو ما يعادلها لأطر العمل الأخرى) ملفات البنية والأوزان كمدخلات وتنشئ مثيلاً للشبكة، مما يجعلها جاهزة للاستدلال (inference) (عملية إجراء التنبؤات على بيانات جديدة). يتم أيضًا تحميل نقاط تكميم الألوان من ملف .npy
، عادةً باستخدام NumPy
.
4. الضبط الدقيق لمكونات الشبكة (إذا لزم الأمر):
في بعض الأحيان، تحتاج طبقات معينة داخل الشبكة المدربة مسبقًا إلى تعديلات طفيفة قبل الاستدلال. في سياق نموذج التلوين القائم على التصنيف الذي تمت مناقشته:
- تعديل طبقة الإخراج: قد تحتاج الطبقة النهائية المسؤولة عن إخراج تنبؤات قناتي ‘a’ و ‘b’ (على سبيل المثال، المسماة
class8_ab
في النموذج المرجعي) إلى تحميلها صراحةً بمراكز صناديق الألوان من ملف.npy
. يضمن هذا أن احتمالات إخراج الشبكة تتوافق بشكل صحيح مع لوحة الألوان المحددة مسبقًا. غالبًا ما يتم إعادة تشكيل النقاط وتحويلها إلى نوع البيانات المناسب (مثلfloat32
) قبل تعيينها إلى ‘blobs’ الطبقة (مصطلحCaffe
لحاويات البيانات). - إعادة توازن الألوان: قد يتم تعديل طبقة أخرى (مثل
conv8_313_rh
) للتأثير على التوازن بين الألوان المختلفة في الإخراج، مما قد يعزز التشبع أو يصحح التحيزات المكتسبة أثناء التدريب. غالبًا ما يتضمن ذلك تعيين ‘blobs’ الطبقة إلى قيم معينة تم تعلمها (مثل القيمة2.606
المذكورة في الكود الأصلي، والتي من المحتمل أن تكون مشتقة تجريبيًا أو أثناء التدريب).
تقوم هذه الخطوات بتكييف النموذج العام المدرب مسبقًا للفروق الدقيقة المحددة لمهمة التلوين باستخدام نهج التصنيف.
5. تحضير الصورة المدخلة:
تحتاج صورة التدرج الرمادي المدخلة إلى الخضوع لعدة خطوات معالجة مسبقة قبل إدخالها إلى الشبكة العصبية:
- التحميل: تتم قراءة الصورة من مسار الملف المحدد باستخدام
cv2.imread
. حتى لو كانت بتدرج رمادي، قد يقومOpenCV
بتحميلها كصورةBGR
ثلاثية القنوات افتراضيًا، مكررًا قيمة الرمادي عبر القنوات. - التطبيع (Normalization): يتم تحجيم قيم البكسل، التي تتراوح عادةً من 0 إلى 255، إلى نطاق أصغر، غالبًا من 0.0 إلى 1.0، عن طريق القسمة على 255.0. يساعد هذا التطبيع على استقرار عملية تعلم الشبكة واستدلالها.
- تحويل فضاء الألوان: يتم تحويل الصورة من فضاء الألوان
BGR
الافتراضي إلى فضاء الألوانCIELab
باستخدامcv2.cvtColor
. هذا أمر بالغ الأهمية لعزل قناة السطوع (L). - تغيير الحجم (Resizing): تتوقع معظم شبكات
CNN
المدربة مسبقًا صورًا مدخلة بحجم ثابت (على سبيل المثال، 224 × 224 بكسل، وهو معيار شائع متأثر بمجموعات البيانات مثلImageNet
). يتم تغيير حجم صورةLAB
وفقًا لذلك باستخدامcv2.resize
. يضمن هذا التوحيد القياسي التوافق مع بنية الشبكة. - عزل قناة L وتوسيطها: يتم استخراج قناة السطوع (L) من صورة
LAB
التي تم تغيير حجمها. غالبًا ما يتم بعد ذلك توسيط قيمها (عادةً 0-100 فيLAB
) حول الصفر عن طريق طرح قيمة متوسطة (مثل 50). يعد هذا التوسيط ممارسة شائعة أخرى يمكن أن تحسن أداء الشبكة.
قناة L المعالجة مسبقًا بدقة جاهزة الآن لتقديمها إلى الشبكة.
6. خطوة الاستدلال: التنبؤ بالألوان:
هنا يحدث السحر:
- إنشاء Blob: يتم تحويل قناة L المعالجة (الآن مصفوفة ثنائية الأبعاد) إلى ‘blob’، وهو تنسيق مصفوفة رباعي الأبعاد تتوقعه وحدة
DNN
(cv2.dnn.blobFromImage
). يتضمن هذا التنسيق عادةً أبعادًا لحجم الدفعة (batch size) والقنوات والارتفاع والعرض. - التمرير الأمامي (Forward Pass): يتم تعيين الـ blob كمدخل للشبكة المحملة باستخدام
net.setInput
. ثم، يتم استدعاء طريقةnet.forward()
. يؤدي هذا إلى بدء الحساب: تتدفق بيانات الإدخال عبر طبقات الشبكة، وتخضع لتحويلات تمليها الأوزان المكتسبة، وتنتج في النهاية الإخراج المتوقع. بالنسبة لنموذج التلوين الخاص بنا، يمثل الإخراج قناتي ‘a’ و ‘b’ المتوقعتين (أو بالأحرى، التوزيعات الاحتمالية على صناديق الألوان). - إعادة تشكيل الإخراج: يحتاج الإخراج الخام من الشبكة إلى إعادة تشكيله ونقله مرة أخرى إلى تنسيق مكاني ثنائي الأبعاد يتوافق مع قناتي ‘a’ و ‘b’.
لقد أنتجت الشبكة الآن أفضل تخمين لها لمعلومات الألوان بناءً على صورة التدرج الرمادي المدخلة.
7. إعادة بناء الصورة الملونة:
تتضمن المرحلة النهائية دمج معلومات الألوان المتوقعة مع بيانات الصورة الأصلية:
- تغيير حجم القنوات المتوقعة: تحتاج قناتا ‘a’ و ‘b’ المتوقعتان (اللتان بحجم 224 × 224 حاليًا، بما يتوافق مع مدخلات الشبكة) إلى تغيير حجمهما مرة أخرى إلى الأبعاد الأصلية للصورة المدخلة باستخدام
cv2.resize
. يضمن هذا محاذاة معلومات الألوان بشكل صحيح مع بنية الصورة الأصلية. - استخراج السطوع الأصلي: بشكل حاسم، يتم استخراج قناة السطوع (L) من صورة
LAB
الأصلية كاملة الحجم (التي تم إنشاؤها أثناء المعالجة المسبقة قبل تغيير الحجم). يحافظ استخدام قناة L الأصلية على تفاصيل الصورة الأصلية وبنية السطوع، والتي قد تتدهور إذا تم استخدام قناة L التي تم تغيير حجمها. - الدمج (Concatenation): يتم دمج قناة L الأصلية (سلسلتها) مع قناتي ‘a’ و ‘b’ المتوقعتين والمغير حجمهما على طول محور قناة اللون. يعيد هذا تجميع صورة
LAB
كاملة، الآن بألوان متوقعة. - التحويل مرة أخرى إلى تنسيق قابل للعرض: يتم تحويل صورة
LAB
الناتجة مرة أخرى إلى فضاء الألوانBGR
باستخدامcv2.cvtColor
، حيث أن هذا هو التنسيق القياسي المتوقع من قبل معظم وظائف عرض الصور (مثلcv2.imshow
). - القص والتحجيم (Clipping and Scaling): يتم قص قيم البكسل في صورة
BGR
، الموجودة حاليًا في النطاق المطبع (غالبًا 0.0 إلى 1.0)، لضمان بقائها ضمن هذا النطاق الصالح (يمكن للقيم أحيانًا تجاوز الحدود قليلاً بسبب عملية التنبؤ). بعد ذلك، يتم تحجيمها مرة أخرى إلى النطاق الصحيح القياسي 0-255 المطلوب للعرض أو الحفظ كملف صورة قياسي.
8. التصور(Visualization):
أخيرًا، يمكن استخدام وظائف مثل cv2.imshow
لعرض صورة التدرج الرمادي الأصلية جنبًا إلى جنب مع نظيرتها الملونة حديثًا، مما يسمح بمقارنة بصرية فورية.
تنفيذ العملية:
عادةً، يتم تشغيل نص برمجي ينفذ هذه الخطوات من سطر الأوامر. باستخدام إعداد argparse
، سيوفر المستخدم مسار صورة التدرج الرمادي المدخلة كوسيطة (على سبيل المثال، python colorize_image.py --image my_photo.jpg
). يقوم النص البرمجي بعد ذلك بتنفيذ خطوات التحميل والمعالجة المسبقة والاستدلال وإعادة البناء، وفي النهاية يعرض أو يحفظ النتيجة الملونة.
يحول سير العمل هذا، الذي يستفيد من النماذج المدربة مسبقًا والمكتبات القوية، النظرية المعقدة لتلوين التعلم العميق إلى أداة عملية قادرة على إضافة ألوان نابضة بالحياة ومعقولة إلى الصور أحادية اللون، مما يسد الفجوة بشكل فعال بين الماضي والحاضر.