اذهب إلى المحتوى

برمجة لعبة حجرة ورقة مقص باستخدام لغة بايثون


أروى عفان

سنتعلم في هذا المقال كيفية إنشاء لعبة حجرة- ورقة- مقص، يكون خصمنا فيها هو الحاسوب، بحيث نُشكّل الحركات بيدنا ليتعرف عليها الحاسوب ويلعب الحركة المعاكسة. سنستخدم في هذا المشروع أساسيات تعلّم الآلة ولغة بايثون python، وسندرّب نموذجًا للتعرف على البيانات باستخدام أداة Teachable Machine.

هدفنا الحصول على نسخة بسيطة مشابهة لعمل هذا الروبوت المدهش:

يتطلب هذا المشروع وجود معرفة مُسبقة لدى القارئ بلغة بايثون Python وخاصًة الأفكار التالية:

ننصحك بكتاب البرمجة بلغة بايثون الذي يغطي كل تلك الأفكار.

ستحتاج في هذا المشروع إلى:

  1. حاسوب فيه كاميرا.
  2. اتصال بالإنترنت.
  3. حساب غوغل.

ستتعلم في هذا المشروع:

  • كيفية إنشاء نموذج Model رؤية آلية وتدريبه باستخدام موقع Teachable Machine من غوغل.
  • ما يجب عليك أخذه بالحسبان عند إنشاء نموذج لضمان عمله عند تجربته.
  • كيفية تضمين نموذج منُشأ مسبقًا في تطبيق سطح مكتب.

كما يمكنك الحصول على الملفات المطلوبة لهذا المشروع من هنا.

التعرف على موقع Teachable Machine

سنستخدم في مشروعنا موقع Teachable Machine، وهو أداةٌ مقدمةٌ من غوغل والتي تُتيح إنشاء نماذج لتعلّم الآلة في المتصفح، لذلك سننشئ نموذجًا يمكنه التعرف على الصور، ثم سنستخدم هذا النموذج في لعبة سننشئها على الحاسوب.

يمكن للنماذج المنشأة على موقع Teachable Machine التعرف على الصور، والأصوات ووضعيات الجسم، ولكننا سنستخدم الصور فقط في مشروعنا هذا.

أولًا، انتقل إلى صفحة تدريب نموذج للتعرف على الصور في Teachable Machine، حيث ستجد واجهة النموذج الفارغ التالية:

tm_start_screen.png

لاحظ أن النموذج فيه صنفين، وبما أننا نريد إنشاء لعبة "حجرة، ورقة، مقص" فسنحتاج لإنشاء صنفٍ ثالث.

ثانيًا، انقر على زر إضافة صنف Add a class، لإضافة صنف ثالث إلى النموذج.

tm_add_class.png

ثالثًا، سمِّ الأصناف الثلاثة "rock, paper, scissors" على التتالي بالنقر على رمز القلم بجانب كل صنف، واحرص على تسمية الأصناف بالترتيب الصحيح وباللغة الانجليزية، أي الصنف الأول "rock"، والثاني "paper" والثالث "scissors" لتفادي حصول الأخطاء عند كتابة الشيفرة وتنفيذها في الخطوات التالية.

تجميع بيانات التدريب

نحن الآن بحاجة إلى إضافة بيانات لتدريب الأصناف الثلاثة. لاحظ أن لكل صنف خيارين لإضافة الصور، الأول باستخدام كاميرا الويب Webcam والثاني عن طريق تحميل الصور Upload. يمكنك تحميل مجموعة صور إيماءات "حجرة، ورقة، مقص" من حاسوبك، أو يمكنك استخدام خيار كاميرا الويب ًWebcam لإلتقاط صور للإيماءات الثلاث، كما يمكنك استخدام لوحة راسبيري باي مزودة بكاميرا لالتقاط صور وذلك بعد إعداد الكاميرا.

أولًا، انقر على خيار الكاميرا لصنف المقص "rock"، فستظهر لك رسالةٌ على الشاشة تسألك إن كنت تريد السماح لموقع Teachable Machine بالوصول إلى كاميرا حاسوبك واستخدامها، انقر على خيار السماح Allow.

tm_webcam_images.png

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

ستظهر الصور التي التقطها في قسم إضافة عينات الصور Add Image Samples على الجهة اليمنى، استمر بالتقاط الصور حتى تحصل على 300 عينة على الأقل، إذ كلما زاد عدد الصور كلما زادت دقة نموذج التعلم الآلي الذي سننشئه.

إليك بعض الاقتراحات لتحسين جودة بيانات التدريب وتنويعها:

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

ننصحك بعدم تسجيل الصور الخاصة بالصنف الواحد دفعةً واحدة، التقط بعض الصور للصنف الأول ثم الثاني، وهكذا، وذلك كي تتجنب تعلُّم النموذج أمرًا خاطئًا؛ كأن يربط تعبير وجهك أو حركة شخص ما في الخلفية بإيماءةٍ ما.

هل لديك اقتراحات لأمور أخرى يجب أخذها بالحسبان؟

ثالثًا، التقط صور الصنفين الآخرين بطريقة مماثلة.

إنشاء نموذج التعلم الآلي

حان الآن وقت إنشاء النموذج وتدريبه بعد أن حصلنا على البيانات اللازمة.

أولًا، انقر على زر تدريب النموذج Train Model.

tm_train_model.png

عند بدء تدريب النموذج يجب عليك إبقاء صفحة Teachable Machine مفتوحةً في المتصفح وإلا سيتوقف التدريب. لا تقلق، فلن يستغرق التدريب سوى فترة قصيرة، وسيظهر لك على الشاشة عدد مرات المرور على كامل بيانات التدريب أو ما يُدعى epoch، وستتمكن بعد انتهاء التدريب، من اختبار النموذج في مستطيل المعاينة Preview، شكّل الإيماءات باستخدام يدك واختبر دقة عمل النموذج، إذ أن النسب المئوية أدنى شاشة المعاينة تعبر عن مدى صحة تفسير الإيماءة.

اختبر نموذجك بدقة، وإذا لم ترضَ عن النتائج فإليك بعض الاقتراحات لتحسينها:

  • أضف مزيدًا من بيانات التدريب لكل من الأصناف.
  • زَد عدد مرات المرور epoch لزيادة وقت التدريب، وذلك بالنقر على الخيارات المتقدمة Advanced في مربع التدريب:

Advanced-options.png

تذكر أن النموذج لا بُد له أن يخطئ، لذلك حين تشعر أنك حصلت على نتيجة ترضاها، انقر على زر تصدير النموذج Export Model كي تتمكن من استخدامه في اللعبة التي سننشئها.

tm_export_model.png

انقر على نافذة تنسرفلو TensorFlow في الشاشة التي ستظهر لك، ثم اختر نوع كيراس Keras لتحويل النموذج، ثم انقر بعدها على زر تنزيل النموذج Download my model.

tm_download_model.png

أصبحت الآن جاهزًا لإنشاء اللعبة.

إعداد اللعبة

ستجد في هذه الخطوة أننا سنزودك ببرنامج اللعبة مكتوبًا بلغة بايثون، أي أنه ليس عليك كتابة الشيفرة وإنما التركيز على فهم آلية تعلّم الآلة في هذا المشروع، ومع ذلك يمكنك تحسين واجهة اللعبة إذا كانت لديك أساسيات التعامل مع واجهات المستخدم الرسومية GUI، كما يمكنك تعديل آلية اختيار الحاسوب خطوته التالية؛ بحيث يفوز اللاعب دائمًا، أو يمكنك جعله يختار خطوته عشوائيًا.

أولاً، نزّل الملف الأولي للمشروع وأعدّه للعمل وفق نظام تشغيل حاسوبك، كما يلي:

نظام ويندوز

  • نزّل الملف الأولي المضغوط للمشروع وفُك ضغطه في مجلد مناسب على حاسوبك.

*نزّل المكتبات اللازمة لعمل المشروع باستخدام واجهة سطر الأوامر command line interface -أو اختصارًا CLI-، والتي تُدعى موجه الأوامر command prompt في نظام ويندوز.

تذكر أن واجهة سطر الأوامر ليست واجهة رسومية، إذ يجب عليك كتابة دليل الملف للوصول إليه، بدلًا من مجرد الضغط عليه، سواءٌ كان الدليل نسبيًا relative path أي المكان الحالي للملف، أو كان الدليل مطلقًا absolute path أي دليل كامل بدءًا من قرص التخزين على الحاسب، أو من جذر نظام الملفات root أي يبدأ بهذه الإشارة /.

  • انتقل إلى مجلد المشروع الذي نزلته، ثم انقر على شريط التنقل وانسخ دليل الملف.

NavigationBar.png

  • استبدل اسم المجلد directory في نافذة موجه الأوامر باسم المجلد[directory_path] للانتقال إلى مجلد مشروعك، حتى يصبح بإمكانك تنفيذ أوامر بايثون.
cd [directory_path]
  • اكتب الأمر التالي الذي يستخدم نظام إدارة الحزم pip في بايثون لتنصيب المكتبات اللازمة من الإنترنت، والذي قد يستغرق بعض الوقت:
pip install requirements.txt

ننصحك بتنصيب المكتبات اللازمة باستخدام الأمر pip عوضًا عن تنزيلها يدويًا، لأن بعض المكتبات قد تحتاج إلى مكتبات أخرى أو ما يُعرف بالاعتماديات dependencies والتي ينصبها "pip" تلقائيًا، إذ يمكن استخدام "pip" لتنصيب قائمة من المكتبات التي يحتاجها المشروع، والتي غالبًا تضمن في مجلد يسمى "requirements.txt".

نظام ماك أو إس MacOS

تدعى واجهة سطر الأوامر في نظام ماك بالطرفية Terminal.

  • اكتب الأمر التالي في الطرفية وذلك للانتقال إلى المجلد الرئيسي home والذي تدل عليه الإشارة التالية ~:
cd ~
  • الآن بعد أن أصبحنا في المجلد الرئيسي، اكتب الأمر التالي لتنصيب سكربت مكتوب بلغة باش Bash لتسهيل تنزيل البرنامج الأولي للعبة:
curl -L http://rpf.io/proj-rps | sudo bash -s $USER

كما يمكنك الإطلاع على السكربت  إذا أحببت ذلك.

قد يستغرق الأمر بعض الوقت أو بضع دقائق، بناءً على سرعة حاسوبك وسرعة اتصال الإنترنت لديك، وستلاحظ بمجرد انتهاء التثبيت مجلدًا جديدًا ضمن المجلد الرئيسي باسم "amazing_image_identifier".

  • انتقل إلى المجلد الجديد باستخدام الأمر cd:
cd amazing_image_identifier

نظامي لينكس وراسبيان

يدعى نظام التشغيل الخاص براسبيري باي بنظام راسبيان Raspbian، أو راسبيري باي أو إس Raspberry Pi OS وهو مبنيٌ على إحدى توزيعات لينكس.

  • انتقل إلى المجلد الرئيسي home:
cd ~
  • الآن بعد أن أصبحنا في المجلد الرئيسي، اكتب الأمر التالي لتنصيب سكربت مكتوب بلغة باش Bash لتسهيل تنزيل البرنامج الأولي للعبة:
curl -L http://rpf.io/proj-rps | sudo bash -s $USER

قد يستغرق الأمر بعض الوقت أو بضع دقائق بناءً على سرعة حاسوبك وسرعة اتصال الإنترنت لديك، وستلاحظ بمجرد انتهاء التنصيب مجلدًا جديدًا ضمن المجلد الرئيسي باسم "rps_by_hand".

  • انتقل إلى المجلد الجديد باستخدام الأمر cd:
cd rps_by_hand

والآن بعد أن أصبح برنامج اللعبة جاهزًا ومنصبًا على حاسوبك، حان وقت تشغيله.

ثانيًا، شغّل البرنامج باستخدام الأمر التالي في نظامي ويندوز ولينكس:

python project.py

والأمر التالي لنظام ماك:

python3 project.py

قد يستغرق تشغيل البرنامج بعض الوقت، ولكن عند تشغيله ستظهر لك الشاشة التالية:

app_start.png

حان الآن وقت ربط النموذج باللعبة.

ربط النموذج باللعبة

أولًا، فُكَّ ضغط الملف "converted_keras.zip" الذي نزلته من موقع Teachable Machine، ثم انسخ منه الملف "keras_model.h5" والصقه في المجلد الذي يحتوي على شيفرة برنامج اللعبة.

لاحظ أن ملف التسميات "labels.txt" في المجلد المضغوط، يحتوي على قائمة بالتسميات القابلة للقراءة وأرقام العقد التي تتطابق معها في خرج النموذج، وبما أنه ليس لدينا سوى ثلاث تصنيفات categories في مشروعنا: الحجرة، والورقة، والمقص، فقد ضمّنّا هذه التسميات في شيفرة اللعبة بقائمة list تدعى "THROWS"، لكن عندما يحتوي المشروع على تصنيفات عديدة فيفضل قراءة الملف "labels.txt" وتحميله إلى المشروع تلقائيًا باستخدام أوامر بايثون.

ثانيًا، أصبح بإمكانك تحميل النموذج داخل اللعبة، بعد أن وضعته وبرنامج اللعبة في نفس المجلد، وذلك بإضافة السطر التالي قبل دالة get_player_throw:

model = tf.keras.models.load_model('keras_model.h5', compile=False)

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

def get_player_throw():
    image = tf.keras.preprocessing.image.load_img(IMG_NAME, target_size=(IMAGE_SIZE, IMAGE_SIZE))
    image = tf.keras.preprocessing.image.img_to_array(image)
    image = np.expand_dims(image, axis=0)

    prediction_result = model.predict(image)

    best_prediction = THROWS[np.argmax(prediction_result[0])]

    return best_prediction

إليك شرحًا مبسطًا للشيفرة السابقة:

  • تُحوّل الأسطر التي تبدأ بالمعامل image الصور إلى الصيغة المناسبة للنموذج.
  • يحتوي السطر prediction_result على نتيجة التنبؤ من النموذج بصيغة أرقام تدل على أرجحية صحة كل تخمين.
  • يعتمد السطر best_predicion على التنبؤ ذي الأرجحية الأعلى، بينما يجلب التابع np.argmax دليل ذلك التنبؤ ويستخدمه ليعرف تسمية التنبؤ في القائمة THROWS

شغّل البرنامج عدّة مرات، وإذا لم ترضَ عن جودة التخمينات، ففكر ما هي الاختلافات التي قد تحدث بين بيانات التدريب والمُدخلات التي تقدمها للعبتك والتي قد تؤثر على الجودة؟ فقد يؤثر اختلاف شدة الإضاءة أو ارتداءك ملابسًا مختلفة، لذلك سجّل مزيدًا من بيانات التدريب في Teachable Machine، ودرّب النموذج مرةً أخرى، ثم نزّله واستبدل نموذج اللعبة الحالي به.

خاتمة

تهانينا، فقد أتممت مشروع إنشاء لعبة "حجرة- ورقة- مقص" باستخدام لغة بايثون، والذي استخدمت فيه أساسيات تعلّم الآلة، ودرّبت نموذجًا للتعرف على البيانات باستخدام أداة Teachable Machine.

أطلق العنان لإبداعك ونفّذ مشاريع مماثلة في خطوتك التالية.

إذا واجهت مشاكلًا مع لغة بايثون، فيمكنك الحصول على الدعم والمساعدة عن طريق إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب.

ترجمة -وبتصرف- للمقال Rock, paper, scissors by hand من الموقع الرسمي لراسبيري باي.

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...