Image Caption Generation
يعد توليد التسمية التوضيحية للصور (Image Caption Generation) تحدياً في الذكاء الاصطناعي، وهي مهمة الوصف التلقائي لمحتوى صورة باللغة الطبيعية. وقد اجتذبت التسمية التوضيحية للصور اهتمامات متزايدة في رؤية الحاسب. حيث أنها تهدف إلى فهم معلومات بصرية ضخمة والتعبير عنها باللغة الطبيعية.
وهي تقنية تتطلب الجمع بين رؤية الحاسب (Computer Vision) لفهم محتوى الصورة ومجال معالجة اللغة الطبيعية (Natural Language Processing) لتحويل مفهوم الصورة إلى كلمات بالترتيب الصحيح.
يدوياً يتطلب ذلك من المستخدمين البحث بواسطة مفاهيم الصور مثل اللون والأشكال، وقد تتجاوز بعض ميزات الصورة المفهوم الذي يركز عليه المستخدم. وقد اعتمدت الأساليب التقليدية لإسترجاع الصور مثل تلك المستخدمة من قبل المكتبات على الصور المشروحة يدوياً، والتي تعد مكلفة وتستغرق وقتا طويلاً، وخاصة بالنظر إلى قاعدة بيانات الصور الكبيرة والمتنامية.
في البداية دعونا نتعرف على COCO، هي مجموعة بيانات ضخمة للصور يتم استخدامها بشكل شائع لتدريب ومعايرة خوارزميات الكشف عن الكائنات (detection) والتقسيم (segmentation) والتسمية التوضيحية (captioning). يمكنك قراءة المزيد حول مجموعة البيانات من هنا أو في ورقة البحث هذه.
إعداد COCO API (كما هو موضح في الملف التمهيدي هنا)
سنقوم بتقسيم المشروع إلى 4 أجزاء، وكل جزء يحتوي على خطوات
الجزء الأول
.التي سنستخدمها للحصول على البيانات COCO API نبدأ بتهيئة
الجزء الثاني
في هذا الجزء، سنتعلم كيفية تحميل البيانات ومعالجتها من (dataset).
سنقوم أيضاً بتصميم نموذج CNN-RNN لإنشاء التسميات التوضيحية للصور تلقائياً.
ستتكون مجموعة البيانات في النموذج من الصور المدخلة والتعليقات التوضيحية الناتجة المقابلة لها [image → captions].
الترميز:
يمكن اعتبار الشبكة العصبية الترشيحية (CNN) بمثابة مُرَمِّز. يتم إعطاء صورة الإدخال إلى CNN لاستخراج الخصائص (features), و آخر طبقة مخفية لـ CNN متصلة بفك الترميز.
فك الترميز:
وحدة فك الترميز هي شبكة عصبية تكرارية (RNN) تقوم بإستقبال مخرجات الترميز من
المُرَمِّز.
الخطوة 1: أداة تحميل البيانات
أداة تحميل البيانات يمكن استخدامها لتحميل مجموعة بيانات COCO على دفعات.
في التعليمات البرمجية أدناه، سنقوم بتهيئة أداة تحميل البيانات باستخدام دالة get_loader في الملف الموجود في الاسفل مع كامل المشروع data_loader.py.
إذا كنت غير ملم بتحميل البيانات ومجموعة البيانات انصحك بهذا الدرس. تأخذ الدالة (get_loader) إدخال عدد من الوسائط التي يمكن استكشافها في (data_loader).
سأشرح هنا بعض الدوال (methods):
(transform): تحدد كيفية المعالجة المسبقة للصور وتحويلها إلى PyTorch قبل استخدامها كمدخلات إلى الترميز عن طريق CNN.
(mode ): تأخذ واحدة من قيمتين، إما ‘train’ (تحميل البيانات التدريبية على دفعات) أو ‘test’ (بيانات الاختبار). سنقول إن data loader في وضع التدريب أو الاختبار، على التوالي.
(batch_size): يحدد حجم الدفعة عند تدريب النموذج.
(vocab_threshold): إجمالي عدد المرات التي يجب أن تظهر فيها كلمة في التسميات التوضيحية للتدريب قبل استخدامها كجزء من الجملة. تعتبر الكلمات التي تحتوي على أقل من vocab_threshold كلمات غير معروفة.
(vocab_from_file): قيمة منطقية تقرر ما إذا كان سيتم تحميل المفردات من الملف.
عند تشغيل التعليمات البرمجية أدناه، سيتم تخزين محمل البيانات في المتغير (data_loader).
تحدد الدالة (getitem) في (CoCoDataset) كيفية معالجة التسمية التوضيحية للصورة مسبقاً. وهذا ينطبق على كافة فئات (Dataset) في PyTorch. إذا كانت غير ملم بهذا يرجى مراجعة البرنامج التعليمي هنا. عندما يكون محمل البيانات في وضع التدريب، تبدأ هذه الدالة أولاً بالحصول على مسار الملف للصورة التدريب والتسمية التوضيحية المناظرة لها:
بعد تحميل الصورة في مجلد التدريب مع اسم المسار، تتم معالجة الصورة باستخدام نفس التحويل (transform_train) الذي تم توفيره عند إنشاء أداة تحميل البيانات.
قبل معالجة التسميات التوضيحية
تحتاج التسميات التوضيحية أيضًا إلى معالجتها مسبقًا وتجهيزها للتدريب. في هذا المشروع، لتوليد التسميات التوضيحية نهدف إلى إنشاء نموذج يتنبأ بالرمز التالي للجملة من الرموز المميزة السابقة، لذلك نحول التسمية التوضيحية المرتبطة بأي صورة إلى قائمة بالكلمات الرمزية، قبل إرسالها إلى PyTorch التي يمكننا استخدامها لتدريب الشبكة.
لفهم مزيد من التفاصيل حول كيفية معالجة التسميات التوضيحية (COCO) مسبقًا، سنحتاج أولاً إلى إلقاء نظرة على المتغير (vocab) في (CoCoDataset).
أدناه جزء الكود من الدالة ( init) الخاصة بـ (CoCoDataset):
نستخدم هذا المثال لإجراء معالجة مسبقة للتسميات التوضيحية .
يحول الكود أعلاه أي جملة توضيح إلى كلمات، قبل إرسالها إلى ( PyTorch)، لمعرفة كيفية عمله سأقوم بشرح الكود.
في السطر 1، يتم تحويل كل حرف في التسمية التوضيحية إلى أحرف صغيرة، ويتم استخدام الدالة (nltk.tokenize.word_tokenize) للحصول على قائمة بالأرقام المميزة.
في السطر 2 والسطر 3، نقوم بتهيئة قائمة فارغة وإلحاق عدد صحيح لوضع علامة على بداية التسمية التوضيحية. تستخدم هذه الورقة كلمة (start)، وكلمة (end) لتحديد بداية ونهاية التسمية التوضيحية.
يتم استخدام العدد الصحيح 0 دائمًا لتحديد بداية التسمية التوضيحية، والرقم 1 لتحديد النهاية.
في السطر 4، نواصل القائمة بإضافة أعداد صحيحة تتوافق مع كل من الرموز المميزة في التسمية التوضيحية.
أخيرًا، نقوم بتحويل قائمة الأعداد الصحيحة إلى (PyTorch). يمكنك قراءة المزيد حول الأنواع المختلفة من TORCH.TENSOR.
باختصار، يتم تحويل أي تسمية توضيحية إلى قائمة بالرموز المميزة، مع رموز خاصة بالبداية والنهاية في بداية الجملة ونهايتها:
ثم يتم تحويل قائمة الرموز هذه إلى قائمة من الأعداد الصحيحة، حيث يكون لكل كلمة مميزة في المفردات قيمة عدد صحيح مرتبطة به: