سيوضح لك هذا البرنامج التعليمي كيفية إنشاء صور GIF متحركة باستخدام OpenCV و Python و ImageMagick. ثم قم بدمج هذه الطرق لإنشاء مولد ميمي باستخدام OpenCV!
كلنا بحاجة إلى الضحك من وقت لآخر. وربما تكون أفضل طريقة للعثور على lulza هي الميمات. بعض المفضلة:
- الضفدع كيرميت: "لكن هذا ليس من شأني"
- قطة غاضبة
- فشل ملحمي
- رجل جيد جريج
ولكن بالنسبة لي شخصياً ، لا يمكن مقارنة أي من هذه الميمات بالميمي "التعامل معها" ("تعامل معها" أو "افهمها بنفسك") ، ومثال على ذلك في بداية المقالة.يتم استخدامه عادة في الحالات التالية:
- كرد أو اعتراض على شخص لا يوافق على شيء فعلته / قلته ("تعامل معه")
- وضع نظارتك كما لو كنت تغادر وتترك الشخص بمفرده مع المشكلة ("افهمها بنفسك")
قبل بضع سنوات ، قرأت مقالة ممتعة على مدونة المؤلف ، والتي لا أتذكر كيفية إنشاء مثل هذه الميمات باستخدام رؤية الكمبيوتر. في الأسبوع الماضي لم أتمكن من العثور على هذا الدليل في أي مكان ، لذلك بصفتي مدونًا وخبيرًا في رؤية الكمبيوتر وخبيرًا في الميمات ، قررت كتابة برنامج تعليمي بنفسي! (بالمناسبة ، إذا كنت تعرف عن طريق الخطأ المصدر الأصلي ، فيرجى إبلاغي بذلك حتى أتمكن من شكر المؤلف.
UPD: لقد عثرت على المقالة الأصلية من مدونة كيرك كايزر
MakeArtWithPython ).
إن تطوير مولد ميمي على OpenCV سيعلمنا عددًا من المهارات العملية القيمة ، بما في ذلك:
- كشف الوجه باستخدام تقنيات التعلم العميق
- استخدام مكتبة dlib لاكتشاف معالم الوجه واستخراج مناطق العين
- كيفية حساب زاوية الدوران بين العينين بناءً على المعلومات المستلمة
- وأخيرًا ، كيفية إنشاء صور GIF متحركة باستخدام OpenCV (مع القليل من المساعدة من ImageMagick)
يجب أن يكون هذا الدليل ممتعًا وممتعًا - وفي نفس الوقت يعلمك مهارات برمجة رؤية الكمبيوتر القيمة التي تكون مفيدة في العالم الحقيقي.
إنشاء ملفات GIF باستخدام OpenCV
في الجزء الأول من الدليل ، سنناقش الشروط والتبعيات اللازمة لهذا المشروع ، بما في ذلك التكوين المناسب لبيئة التطوير.
ثم ضع في اعتبارك بنية المشروع / الكتالوج لمولد GIF OpenCV.
بمجرد أن نفهم بنية المشروع ، سننظر في: 1) ملف التكوين الخاص بنا ؛ 2) نص Python النصي المسؤول عن إنشاء ملفات GIF باستخدام OpenCV.
أخيرًا ، سنقيم نتائج البرنامج على الميم الشعبي "التعامل معها".
المتطلبات والتبعيات
التين. 1. سوف نستخدم OpenCV و dlib و ImageMagick لإنشاء ملفات GIFOpencv و dlib
يلزم وجود OpenCV لتحديد الوجوه في الإطار ومعالجة الصور الأساسية. اتبع أحد
أدلة تثبيت OpenCV إذا لم يكن
OpenCV مثبتًا على النظام.
نستخدم Dlib للكشف عن معالم الوجه ، مما يسمح لنا بإيجاد عينين على الوجه ووضع نظارة شمسية فوق. يمكنك
تثبيت dlib باستخدام هذه التعليمات .
Imagemagick
إذا لم تكن على دراية بـ
ImageMagick ، فمن دون جدوى. إنها أداة سطر أوامر عبر النظام الأساسي مع العديد من ميزات معالجة الصور.
هل تريد تحويل PNG / JPG إلى PDF باستخدام أمر واحد؟ لا مشكلة.
هناك العديد من الصور التي تحتاج منها لإنشاء ملف PDF متعدد الصفحات؟ بسهولة.
هل تحتاج إلى رسم المضلعات والخطوط والأشكال الأخرى؟ وهذا ممكن.
ماذا عن تصنيف الدفعة أو تغيير حجم جميع الصور بأمر واحد؟ للقيام بذلك ، لا تحتاج إلى كتابة بضعة أسطر في Python لـ OpenCV.
يولد ImageMagick أيضًا ملفات GIF من أي صورة.
لتثبيت ImageMagick على Ubuntu (أو Raspbian) ، استخدم apt:
إنشاء ملفات GIF باستخدام OpenCVShell
$ sudo apt-get install imagemagick
على نظام macOS ، يمكنك استخدام HomeBrew:
$ brew install imagemagick
إيموتيلز
في معظم المقالات والدورات والكتب ، أستخدم
حزمة معالجة الصور
imutils المناسبة . يتم تثبيته على نظام أو بيئة افتراضية باستخدام النقطة:
$ pip install imutils
هيكل المشروع
التين. 2. يتضمن هيكل المشروع دليلين ، ملف تكوين و سكربت Pythonيوجد كتالوجان في مشروعنا:
images/
: أمثلة على الصور المدخلة التي نرغب في إنشاء صورة GIF متحركة لها. لقد وجدت بعض الصور معي ، ولكن لا تتردد في إضافة صورك الخاصة.assets/
: يحتوي هذا المجلد على كاشف الوجه ، وكشف معالم الوجه وجميع الصور + الأقنعة ذات الصلة. باستخدام هذه الأصول ، سنضع نقاطًا ونصًا على الصور الأصلية من المجلد الأول.
نظرًا للعدد الكبير من المعلمات القابلة للتهيئة ، قررت إنشاء ملف تهيئة JSON ، والذي: 1) سيسهل تحرير المعلمات ؛ 2) ستحتاج إلى عدد أقل من وسيطات سطر الأوامر. ترد جميع معلمات التكوين المطلوبة لهذا المشروع في
config.json
.
خذ بعين الاعتبار محتويات
config.json
و
create_gif.py
.
ملاحظة Per: يتم إصدار رمز المشروع ودليل من 17 صفحة حول رؤية الكمبيوتر والتعلم الآلي و OpenCV بعد التسجيل (مرآة: شفرة المصدر ، دليل ).إنشاء ملفات GIF باستخدام OpenCV
لذا ، دعنا نواصل ونبدأ في إنشاء مولد OpenCV GIF!
محتوى ملف تكوين JSON
لنبدأ بملف تهيئة JSON ، ثم ننتقل إلى نص Python النصي.
افتح ملف
config.json
جديد وأدخل أزواج المفتاح / القيمة التالية:
إنشاء ملفات GIF باستخدام OpenCVPython
{ "face_detector_prototxt": "assets/deploy.prototxt", "face_detector_weights": "assets/res10_300x300_ssd_iter_140000.caffemodel", "landmark_predictor": "assets/shape_predictor_68_face_landmarks.dat",
هذه ملفات
OpenCV لنموذج
كاشف الوجه في التعلم العميق .
السطر الأخير هو المسار إلى متنبئ وجه dlib.
والآن لدينا بعض المسارات إلى ملفات الصور:
"sunglasses": "assets/sunglasses.png", "sunglasses_mask": "assets/sunglasses_mask.png", "deal_with_it": "assets/deal_with_it.png", "deal_with_it_mask": "assets/deal_with_it_mask.png",
هذه هي المسارات لنظاراتنا الشمسية ، والنص ، والأقنعة المطابقة لها ، وهي موضحة أدناه.
أولاً ، النظارات الشمسية الفاخرة والقناع:
التين. 3. أنت لا تحب النظارات ذات البكسل؟ فقط تحمل معهاالتين. 4. أنت لا تفهم لماذا تحتاج إلى قناع للنظارات الشمسية؟ فقط طرحها - أو اقرأ بقية المقال للإجابة.والآن نصنا هو "التعامل معها" والقناع:
التين. 5. هل تكره Helvetica Neue المكثف؟ تعامل معهاالتين. 6: يسمح لك هذا القناع برسم حد حول النص. أوه ، ربما لا تريد ألا تريد الحدود؟ حسنا ، تحمل ذلكهناك حاجة إلى أقنعة من أجل تراكب الصورة المقابلة على الصورة: سنتعامل مع هذا لاحقًا.
الآن قم بتعيين بعض المعلمات لمولد ميمي:
"min_confidence": 0.5, "steps": 20, "delay": 5, "final_delay": 250, "loop": 0, "temp_dir": "temp" }
فيما يلي تعريفات لكل من المعلمات:
min_confidence
: الحد الأدنى من احتمال الكشف عن الوجه المطلوب.steps
: عدد الإطارات في الرسوم المتحركة النهائية. كل "خطوة" تحرك النظارات الشمسية من الحد العلوي إلى الهدف (أي إلى العينين).delay
: تأخير بين الإطارات في أجزاء من الثانية.final_delay
: تأخير الإطار الأخير final_delay
أجزاء الثانية (مفيد في هذا السياق ، لأننا نريد أن يعرض النص لفترة أطول من بقية الإطارات).loop
: تشير القيمة الصفرية إلى أن صورة GIF تتكرر إلى الأبد ، وإلا حدد عددًا صحيحًا موجبًا لعدد مرات تكرار الرسم المتحرك.temp_dir
: الدليل المؤقت الذي سيتم تخزين كل إطار فيه قبل إنشاء ملف GIF النهائي.
الميمات وملفات GIF و OpenCV
لقد أنشأنا ملف تهيئة JSON ، فلننتقل الآن إلى الكود الحقيقي.
افتح ملفًا جديدًا ، واسمه
create_gif.py
والصق الرمز التالي:
هنا نستورد الحزم اللازمة. على وجه الخصوص ، سوف نستخدم imutils و dlib و OpenCV. لتثبيت هذه التبعيات ، راجع قسم المتطلبات الأساسية والتبعيات أعلاه.
يحتوي النص البرمجي الآن على الحزم اللازمة ، لذلك
overlay_image
نحدد وظيفة
overlay_image
:
def overlay_image(bg, fg, fgMask, coords):
تفرض دالة
overlay_image
مقدمة (
fg
) في الجزء العلوي من صورة الخلفية (
bg
) عند إحداثيات
coords
( إحداثيات
(x، y) ) ، مما يحقق شفافية ألفا فوق قناع القناع الأمامي
fgMask
.
لتتعرف على أساسيات OpenCV ، مثل العمل مع الأقنعة ، تأكد من قراءة
هذا الدليل .
لإكمال عملية المزج ، قم بمزج ألفا:
def alpha_blend(fg, bg, alpha):
تطبيق مزج ألفا هذا متاح أيضًا
على مدونة LearnOpenCV .
في الجوهر ، سنحول قناة المقدمة والخلفية وألفا إلى أرقام النقطة العائمة في النطاق
[0 ، 1] . ثم نقوم بإجراء مزج ألفا ، وإضافة المقدمة والخلفية للحصول على النتيجة التي نعود إليها لوظيفة الاستدعاء.
سننشئ أيضًا وظيفة مساعد تسمح بإنشاء ملفات GIF من مجموعة من مسارات الصور باستخدام ImageMagick والأمر
convert
:
def create_gif(inputPath, outputPath, delay, finalDelay, loop):
تأخذ وظيفة
create_gif
مجموعة من الصور وتجمعها في صور متحركة GIF بتأخير محدد بين الإطارات والحلقات. ImageMagick يعالج كل هذا - نحن ببساطة نلف الأمر
convert
في دالة تعالج ديناميكيًا معلمات مختلفة.
لمشاهدة وسيطات
convert
المتاحة ،
راجع الوثائق . هناك سترى عدد الوظائف التي يمتلكها هذا الفريق!
على وجه التحديد في هذه الوظيفة ، نقوم بما يلي:
- التقاط
imagePaths
. - اختر مسار الصورة الأخيرة ، التي سيكون لها تأخير منفصل.
- إعادة
imagePaths
لاستبعاد المسار الأخير. - نقوم بتجميع أمر باستخدام وسيطات سطر الأوامر ، ثم نوجه نظام التشغيل
convert
لإنشاء رسوم متحركة GIF.
تعيين البرنامج النصي الحجج الخاصة به سطر الأوامر:
لدينا ثلاث وسيطات سطر أوامر تتم معالجتها في وقت التشغيل:
--config
: المسار إلى ملف تهيئة JSON. راجعنا ملف التكوين في القسم السابق.--image
: مسار للصورة المدخلة التي يتم إنشاء الرسوم المتحركة عليها (أي اكتشاف وجه ، وإضافة نظارات شمسية ، ثم النص).--output
: المسار إلى GIF الناتج.
كل من هذه الوسيطات مطلوبة عند تشغيل البرنامج النصي على سطر الأوامر / المحطة الطرفية.
قم بتنزيل ملف التكوين ، وكذلك النظارات والقناع المقابل:
نقوم هنا بتحميل ملف التكوين (الذي قد يكون متاحًا في المستقبل كقاموس Python). ثم قم بتحميل النظارات الشمسية والقناع.
إذا بقي شيء من البرنامج النصي السابق ، فاحذف الدليل المؤقت ، ثم أعد إنشاء الدليل المؤقت الفارغ. سيحتوي المجلد المؤقت على كل إطار فردي من الرسوم المتحركة بتنسيق GIF.
الآن قم بتحميل
كاشف الوجه ذي التعلم العميق OpenCV في الذاكرة:
للقيام بذلك ، اتصل بـ
cv2.dnn.readNetFromCaffe
. وحدة
dnn
متاحة فقط في OpenCV 3.3 أو أحدث. يكتشف كاشف الوجه وجود الوجوه في الصورة:
التين. 7. تشغيل كاشف الوجه باستخدام OpenCV DNNثم قم بتحميل مؤشر
توقع وجه dlib . سيسمح لك بتوطين الهياكل الفردية: العيون والحاجبين والأنف والفم وخط الذقن:
التين. 8. إن المعالم المكتشفة بواسطة dlib متراكبة على وجهيلاحقًا في هذا النص ، نستخرج فقط منطقة العين.
بالانتقال ، دعنا نجد الوجه:
في هذه الكتلة نقوم بما يلي:
- قم بتنزيل
image
الأصلية. - نقوم ببناء
blob
لإرسالها إلى كاشف الوجه للشبكة العصبية. توضح هذه المقالة كيفية عمل blobFromImage
من OpenCV. - قم بإجراء كشف الوجه.
- نجد الشخص ذو القيمة الاحتمالية الأعلى ونقارنه بالحد الأدنى الاحتمالي المقبول. إذا لم يتم استيفاء المعايير ، فقط قم بإنهاء البرنامج النصي. خلاف ذلك ، تابع.
الآن سنقوم باستخراج الوجه وحساب المعالم:
لاستخراج الوجه والعثور على معالم الوجه ، نقوم بما يلي:
- نستخرج إحداثيات الصندوق المحيط حول الوجه.
- إنشاء كائن
rectangle
في dlib وتطبيق تعريب الوجه. - نقوم باسترجاع إحداثيات (x، y) لـ
leftEyePts
و rightEyePts
، على التوالي.
بالنظر إلى إحداثيات العين ، يمكنك حساب مكان وكيفية وضع النظارات الشمسية:
أولاً ، نحسب مركز كل عين ، ثم الزاوية بين النقطتين الوسطى. يتم تنفيذ نفس العملية مع
المحاذاة الأفقية
للوجه في الإطار .
الآن يمكنك تدوير وتغيير حجم النظارات. لاحظ أننا نستخدم
وظيفة rotate_bound ، وليس فقط
rotate
، بحيث لا يقوم OpenCV
بقص الأجزاء غير المرئية بعد التحويل التابع.
نفس العمليات التي تم تطبيقها على النظارات ، تنطبق على القناع. لكن عليك أولاً تحويله إلى ظلال رمادية وثنائية ، لأن الأقنعة ثنائية دائمًا. ثم نقوم بتدوير القناع وتغيير حجمه بنفس الطريقة التي قمنا بها مع النظارات.
ملاحظة: لاحظ أنه عند تغيير حجم القناع ، نستخدم الاستيفاء لأقرب النقاط المجاورة ، لأن القناع يجب أن يحتوي على قيمتين فقط (0 و 255). طرق الاستيفاء الأخرى أكثر جمالية ، لكنها ليست مناسبة للأقنعة. هنا يمكنك الحصول على معلومات إضافية حول الاستيفاء في أقرب النقاط المجاورة.الكتل الثلاثة المتبقية من الكود تنشئ إطارات للصور المتحركة GIF:
تقع النظارات من أعلى الصورة. على كل إطار ، يتم عرضها بالقرب من الوجه حتى تغطي أعينهم. باستخدام متغير
"steps"
في ملف تكوين JSON ، نقوم بإنشاء إحداثيات ص لكل إطار. للقيام بذلك ، دون بذل الكثير من الجهد ، نستخدم وظيفة
linspace
من
linspace
.
قد تبدو الخطوط ذات التحول الطفيف إلى اليسار وأعلى غريبة بعض الشيء ، ولكنها ضرورية للتأكد من أن النظارات تغطي العينين ككل ، ولا تنتقل فقط إلى النقطة التي يوجد بها مركز العين. لقد حددت تجريبيًا النسب المئوية لحساب الإزاحة على طول كل محور. يضمن السطر التالي عدم وجود قيم سالبة.
باستخدام دالة
overlay_image
،
overlay_image
بإنشاء إطار
output
النهائي.
الآن قم بتطبيق النص "تعامل مع ذلك" باستخدام قناع آخر:
في الخطوة الأخيرة ، نفرض النص ، وهو في الواقع صورة أخرى.
قررت استخدام صورة لأن إمكانات عرض خطوط OpenCV محدودة للغاية. بالإضافة إلى ذلك ، أردت إضافة ظل وحدود حول النص ، والذي لا يعرف OpenCV مرة أخرى كيف.
في باقي هذا الكود ، نقوم بتحميل كل من الصورة والقناع ، ثم نقوم بإجراء مزج ألفا لتوليد النتيجة النهائية.
يبقى فقط لحفظ كل إطار على القرص مع الإنشاء اللاحق لصور GIF المتحركة:
نكتب النتيجة على القرص. بعد إنشاء جميع الإطارات ،
create_gif
وظيفة
create_gif
لإنشاء ملف الرسوم المتحركة GIF. تذكر أن هذه هي الصدفة التي تمرر المعلمات إلى أداة
convert
سطر الأوامر ImageMagick.
أخيرًا ، احذف دليل الإخراج المؤقت وملفات الصور الفردية.
النتائج
الآن الجزء الممتع: دعنا نرى ما أنشأه مولد الميمات الخاص بنا!
تأكد من
تنزيل شفرة المصدر ونماذج الصور ونماذج التعلم العميق. ثم افتح نافذة طرفية وقم بتشغيل الأمر التالي:
$ python create_gif.py --config config.json --image images/adrian.jpg \ --output adrian_out.gif [INFO] loading models... [INFO] computing object detections... [INFO] creating GIF... [INFO] cleaning up...
شكل 9. رسوم متحركة بتنسيق GIF تم إنشاؤها باستخدام OpenCV و ImageMagick باستخدام نص Python النصي هذاهنا يمكنك مشاهدة ملف GIF الذي تم إنشاؤه باستخدام OpenCV و ImageMagick. يتم تنفيذ الإجراءات التالية عليه:
- الكشف الصحيح عن وجهي.
- توطين العيون وحساب مراكزها.
- تقع النظارات بشكل صحيح على الوجه.
يعرف قراء مدونتي أنني من المهووسين في Jurassic Park وغالباً ما أذكر ذلك في كتبي ودوراتي وأدلة الدراسة.
لا تحب
الحديقة الجوراسية ؟
حسنًا ، إليك إجابتي:
$ python create_gif.py --config config.json --image images/adrian_jp.jpg \ --output adrian_jp_out.gif [INFO] loading models... [INFO] computing object detections... [INFO] creating GIF... [INFO] cleaning up...
التين. 10. OpenCV GIF للرسوم المتحركة مبني على صورة من العرض الأخير للعبة Jurassic World 2أنا هنا في عرض "Jurassic World: 2" في قميص موضوعي ، مع كوب من الضوء وكتاب مجموعة.
قصة ممتعة:
قبل خمس أو ست سنوات ، زرت أنا وزوجتي منتزه Epcot Center الترفيهي في عالم ديزني بولاية فلوريدا.
قررنا القيام برحلة للابتعاد عن الشتاء القارس في كونيتيكت ، وضوء الشمس الذي تمس الحاجة إليه.
لسوء الحظ ، كانت السماء تمطر طوال الوقت في فلوريدا ، ولم تتجاوز درجة الحرارة بالكاد 10 درجات مئوية.
بالقرب من الحدائق الكندية ، التقطت تريشا صورة لي: تقول إنني أبدو مثل مصاص دماء ببشرة شاحبة ، ملابس داكنة وغطاء ، على خلفية الحدائق المورقة وراء:
$ python create_gif.py --config config.json --image images/vampire.jpg \ --output vampire_out.gif [INFO] loading models... [INFO] computing object detections... [INFO] creating GIF... [INFO] cleaning up...
التين. 11. باستخدام OpenCV و Python ، يمكنك عمل هذا الميم أو ملف GIF متحرك آخرفي ذلك المساء نفسه ، نشرت تريشا صورة على الشبكات الاجتماعية - اضطررت لتحملها.
أولئك الذين حضروا PyImageConf 2018 (
اقرأ المراجعة ) يعرفون أنني مستعد دائمًا للنكات. هنا مثال:
السؤال: لماذا يعبر الديك الطريق؟ $ python create_gif.py --config config.json --image images/rooster.jpg \ --output rooster_out.gif [INFO] loading models... [INFO] computing object detections... [INFO] creating GIF... [INFO] cleaning up...
التين. 12. يتم التعرف على الوجه حتى مع التباين المنخفض ، وتقوم OpenCV بمعالجة الصورة بشكل صحيح وتخفض النظارات الشمسيةالإجابة: لن أقول الإجابة - طرح هذا.أخيرًا ، نختتم دليل اليوم بمذكرة جيدة.منذ حوالي ست سنوات ، تبنينا أنا ووالدي بيجل الصغير ، جيما.هنا يمكنك رؤية جيما على كتفي: $ python create_gif.py --config config.json --image images/pupper.jpg \ --output pupper_out.gif [INFO] loading models... [INFO] computing object detections... [INFO] creating GIF... [INFO] cleaning up...
التين. 13. جيما لذيذ. ألا تعتقد ذلك؟ ثم "تعامل معها!"لا توافق على أنها لطيفة؟ تعامل معها.هل لديك خطأ AttributeError؟
لا تقلق!إذا رأيت هذا الخطأ: $ python create_gif.py --config config.json --image images/adrian.jpg \ --output adrian_out.gif ... Traceback (most recent call last): File "create_gif.py", line 142, in <module> (lStart, lEnd) = face_utils.FACIAL_LANDMARKS_IDXS["left_eye"] AttributeError: module 'imutils.face_utils' has no attribute 'FACIAL_LANDMARKS_IDXS'
... فأنت بحاجة فقط إلى تحديث حزمة imutils: $ pip install --upgrade imutils Collecting imutils ... Successfully installed imutils-0.5.1
?
imutils.face_utils
68- , dlib ( ).
5- , imutils. imutils ( ).
الملخص
, GIF OpenCV.
, OpenCV GIF- “Deal With It”, ( ), .
:
- ( , )
- حساب الزاوية بين العينين لمحاذاة الوجه
- قم بإنشاء خلطات شفافة مع مزج ألفا
أخيرًا ، التقطنا مجموعة من الصور التي تم إنشاؤها وأنشأنا صورة GIF متحركة باستخدام OpenCV و ImageMagick.آمل أن تكون قد استمتعت بالبرنامج التعليمي اليوم!إذا أعجبك ، يرجى ترك تعليق وإخباري.حسنًا ، إذا لم تعجبك ، فلا يهم ، فقط تحملها. ؛)