التطبيقات الروبوتية - الذكاء الاصطناعي - ثالث ثانوي
الجزء الأول
1. أساسيات الذكاء الاصطناعي
2. خوارزميات الذكاء الاصطناعي
3. معالجة اللغات الطبيعية
الجزء الثاني
4. التعرف على الصور
5. خوارزميات التحسين واتخاذ القرار
6. الذكاء الاصطناعي والمجتمع
رابط الدرس الرقمي www.ien.edu.sa الدرس الثالث التطبيقات الروبوتية 2 الروبوتية ورؤية الحاسب والذكاء الاصطناعي Robotics, Computer Vision and Al رؤية الحاسب ( Computer Vision) والروبوتية (Robotics) مجالان متطوران من مجالات التقنية يعملان معًا على متابعة التغيير السريع لطريقة حياة الناس وعملهم، وعندما يُدمجان فإنهما يفتحان مجموعة واسعة من الإمكانيات للأتمتة (Automation) والتصنيع وتطوير التطبيقات الأخرى. يُعدُّ الذكاء الاصطناعي مُكوِّنًا رئيسًا من مُكوِّنات رؤية الحاسب والروبوتية على حد سواء؛ مما يُمكِّن الآلات من التعلم والتكيُّف مع بيئتها بمرور الوقت، حيث تستطيع الروبوتات باستخدام خوارزميات الذكاء الاصطناعي أن تُحلَّل وتُفسِّر كميات هائلة من البيانات المرئية؛ مما يسمح لها باتخاذ قرارات والقيام بإجراءات في الوقت الفعلي. كما يُمكِّن الذكاء الاصطناعي الروبوتات من تحسين أدائها ودقتها بمرور الوقت، إذ أنها تتعلّم من تجاربها وتُعدِّل سلوكها وفقًا لذلك ، وهذا يعني أن الروبوتات المزودة برؤية الحاسب وقدرات الذكاء الاصطناعي يمكنها أداء مهام شديدة التعقيد بشكل أكثر دقة وكفاءة. و في هذا الدرس ستعمل على ترقية المشروع الأولي للطائرة المسيَّرة الذي تم توضيحه في الدرس السابق، وذلك باستخدام رؤية الحاسب لاكتشاف وتحديد الشَّخوص البشرية القريبة من المنزل، حيث يُمكن النظر إليهم على أنهم أعداء في سيناريو العالم الواقعي وتستخدم الطائرة المسيَّرة الكاميرا المزود بها؛ لتكون بمثابة نظام مراقبة، كما يُمكن تطبيق هذا المثال وتنفيذه بسهولة على العديد من المباني الأخرى والبنية التحتية والممتلكات الخاصة والشركات مثل : المصانع ومحطات توليد الطاقة. سيتم استخدام مكتبة أوبن سي في (OpenCV) من لغة البايثون لاكتشاف الشخوص البشرية، وهي مكتبة رؤية حاسوبية مفتوحة المصدر توفر مجموعة من خوارزميات رؤية الحاسب ومعالجة الصور بالإضافة إلى مجموعة من أدوات البرمجة؛ لتطوير التطبيقات في هذه المجالات. & OpenCV يُمكن استخدام مكتبة أوبن سي في (OpenCV) في الروبوتية للقيام بمهام مثل : اكتشاف الكائنات وتتبعها، وإعادة البناء ثلاثي الأبعاد، والملاحة، وتشمل ميزاتها كذلك اكتشاف الكائنات والتعرف عليها ، واكتشاف الوجوه والتعرف عليها، ومعالجة الصور ومقاطع الفيديو، ومعايرة الكاميرا (Camera Calibration) ، وتعلم الآلة، وغيرها. تُستخدم مكتبة أو بن سي في (OpenCV) على نطاق واسع في مشاريع البحوث والتطوير في مجالات متعددة تشمل: الروبوتية والأتمتة والمراقبة والتصوير الطبي (Medical Imaging) ، كما أنها تُستخدم في التطبيقات التجارية الخاصة بالتعرف على الوجوه والمراقبة بالفيديو والواقع المعزّز ) Augmented Reality). Female Female Male وزارة التعليم Ministry of Education 2024 1446 Adult Male Adult Male Adult Male شكل 6.16 : اكتشاف البشر في الوقت الفعلي Adult Male Adult Male Adult Male Adult Male Adult Male 328 Adult Male Adult Male
التطبيقات الروبوتية 2: الروبوتية ورؤية الحاسب والذكاء الاصطناعي\
329 وزارة التعليم Ministry of Education 2024-1446 و لنستعرض التغييرات التي ستجريها لإضافة وظائف رؤية الحاسب للطائرة المسيرة. إضافة المؤقت Adding a Timer يُمكن أن يكون التقاط صورة ومعالجتها وحفظها مكلفا من الناحية الحاسوبية إذا حُسب لكل إطار من إطارات المحاكاة، ولذلك ستضيف مؤقتًا زمنيًا لاستخدامه؛ لتنفيذ هذه الإجراءات كل خمس ثوان فقط. # time intervals used for adjustments in order to reach the target altitude t1 = self.getTime() # time intervals between each detection for human figures self.getTime() t2 إنشاء مجلد Creating a Folder سيتم حفظ الصور الملتقطة التي يتم فيها اكتشاف الشّخوص البشرية في مجلد، حيث يُعد جزءًا من أرشيف المراقبة الأمنية الذي سيساعد على فحص الصور في المستقبل. أولًا: عليك أن تستخدم الدالة ( )getcwd لتسترد مسار دليل العمل الحالي لبرنامج المتحكّم (وهو المجلد الذي يتضمن برنامج المُتحكِّم حتى يتعرف البرنامج على المكان الذي يضع فيه المجلد الجديد باسم: detected (تم الاكتشاف) ، بحيث تُستخدم الدالة ( )path.join لربط اسم المسار بسلسلة اسم المجلد النصية، وتتمثل الخطوة الأخيرة في التحقق مما إذا كان المجلد موجودًا بالفعل أم لا، وفي تلك الحالة يتم إنشاء مجلد جديد. # gets the current working directory cwd = os.getcwd() # sets the name of the folder where the images # with detected humans will be stored folder_name = "detected" #joins the current working directory and the new folder name folder_path = os.path.join(cwd, folder_name) if not os.path.exists(folder_path): # creates the folder if it doesn't exist already os.makedirs(folder_path) print(f"Folder \"detected\" created!") else: print(f"Folder \"detected\" already exists!") معالجة الصورة Image Processing في هذا التوقيت يمكنك الآن استرداد (قراءة) الصورة من الجهاز لمعالجتها قبل محاولة الكشف. لاحظ أن كل ما يتعلق بمعالجة الصورة وصولاً إلى حفظها يحدث كل خمس ثوان فقط، كما هو مبين في الشرط # initiates the image processing and detection routine every 5 seconds if self.getTime() - t2 > 5.0: # retrieves image array from camera cameraImg = self.camera.getImageArray() ."self.getTime( ) - t2> 5.0
إضافة المؤقت
إنشاء مجلد
معالجة الصورة
240- وزارة التعليم Ministry of Education 2024-1446 وس بعد التحقق من استرداد الصورة بنجاح، تنتقل الخوارزمية إلى تعديل بعض خصائصها ، بحيث تكون الصورة ثلاثية الأبعاد ، ولها أبعاد طول وعرض وقنوات ألوان، حيث تلتقط كاميرا الطائرة المُسيَّرة صورًا بارتفاع 240 بكسل وعرض 400 بكسل، كما أنها تستخدم 3 قنوات ألوان لحفظ معلومات الصورة وهي: الأحمر والأخضر والأزرق. يجب معالجة الصورة أولًا حتى يتم استخدامها في الكشف، ولكي يتم تطبيق الدوال بشكل صحيح في وقت لاحق، لا بد أن تحقق الصورة تركيبًا معيّنا . في هذا المثال، يجب أن يتغير تسلسل الأبعاد من (الطول والعرض، وقنوات الألوان) إلى (قنوات الألوان، والطول والعرض) باستخدام الدالة ( )transpose ، حيث تُقدم صورة الكاميرا (Cameralmg)، والتسلسل الجديد (1، 0، 2 كمعاملات لهذه الدالة، بافتراض أن الترتيب الأصلي كان (2، 1، 0). كما يجب تعديل أحجام الأبعاد بعد تغيير التسلسل، حيث تُستخدم الدالة ( )reshape بالطريقة نفسها، ولكن أحجام الأبعاد المعنيّة كالمعامل الثاني منها تكون (400، 240 ، 3) . ول 400. # reshapes image array to (channels, height, width) format cameraImg = camera Img = np.transpose(cameraImg, (2, 0, 1)) np.reshape(cameraImg, (3, 240, 400)) 0 1 2 قنوات الألوان 3 العرض 400 الطول 240 العرض 400 الطول 240 قنوات الألوان 3 2 مصفوفة RGB 0 شكل 6.17 : تغيير تسلسل الأبعاد الطول 240- 1 صورة ملونة أصلية 400 العرض قنوات الألوان شكل 6.18: أبعاد الصورة 330
بعد التحقق من استرداد الصورة بنجاح تنتقل الخوارزمية إلى تعديل بعض خصائصها
بعد ذلك، يجب تغيير الصورة إلى التدرج الرمادي حيث أن خوارزمية الاكتشاف تستلزم ذلك، مع وجوب تخزينها أولًا في كائن صورة ووجوب الجمع بين قنوات ألوانها الثلاثة، وهنا يجب دمج قنوات الألوان وتخزينها باستخدام الدالة ( )merge في تسلسل عكسي: أي أن يكون تسلسل الألوان ( أزرق أخضر، أحمر ) بدلا من (أحمر، أخضر، أزرق) ، وأن يكون تسلسلها الرقمي (0 ، 1 ، 2) بدلا من (2، 1، 0) على الترتيب. # creates RGB image from merged channels img Image.new('RGB', (400, 240)) img = = cv2.merge((cameraImg[2], cameraImg[1], cameraImg[0])) وأخيرًا، يتم تحويل الصورة إلى التدرج الرمادي باستخدام الدالة ()cvtColor التي تستخدم مُعامل COLOR_BGR2GRAY لتغيير الألوان من الأزرق والأخضر والأحمر إلى التدرج الرمادي. # converts image to grayscale gray = cv2.cvtColor(np. uint8(img), cv2.COLOR_BGR2GRAY) اكتشاف صور الحدود البشرية Human Silhouette Detection لكي تكتشف الصورة، عليك أن تستخدم مصنف هار کاسکید (Haar Cascade Classifier)، وهـو خوارزمية لاكتشاف الكائنات تعتمد على تعلم الآلة، وتُستخدم لتحديد الكائنات في الصور أو مقاطع الفيديو ولاستخدام هذا المصنّف تحتاج أن تُدرِّب نموذج تعلُّم الآلة على مجموعة من الصور التي تحتوي على الكائن الذي تريد البحث عنه، وعلى صور أخرى لا تحتوي على هذا الكائن حيث تقوم الخوارزمية بالبحث عن أنماط معينة في الصور لتحديد مكان الكائن. وفي العادة تُستخدم هذه الخوارزمية للعثور على أشياء محددة مثل: الوجوه، أو أشخاص يسيرون في مقطع فيديو. ومع ذلك قد لا تعمل هذه الخوارزمية بشكل جيد في بعض المواقف التي يكون فيها الكائن محجوبا جزئيًا أو كليًّا أو معرضًا لإضاءة منخفضة. تم تدريب المصنّف في مشروعك تدريبًا خاصًا على اكتشاف البشر، وعليك أن تستخدم ملف haarcascade_fullbody.xml الذي ستزود به، وهو نموذج تعلم آلة مُدرَّب مسبقًا ويشكّل جزءًا من مكتبة أوبن سي في (OpenCV) ، ويُقدَّم كمُعامِل لكائن ( )Cascade Classifier، ثم تستخدم الدالة ( ) detectMultiScale للقيام بعملية الاكتشاف. لگا # loads and applies the Haar cascade classifier to detect humans in image human_cascade = cv2.Cascade Classifier('haarcascade_fullbody.xml') humans = human_cascade.detectMultiScale(gray) الصورة الأصلية صورة الحدود المستخرجة شكل 6.19 مثال على إكتشاف صور الحدود البشرية 331 وزارة التعليم Ministry of Education 2024-1446
بعذ ذلك يجب تغيير الصورة الى التدرج الرمادي حيث أن الاكتشاف يستلزم ذلك
اكتشاف صور الحدود البشرية
(x, y) تقرير الطائرة المسيرة وحفظ الصور المكتشفة Drone Report and Saving of the Detected Images و الإضافة النهائية لبرنامج المتحكّم الخاص بك هو نظام تقرير بسيط تقدمه الطائرة المسيَّرة عن طريق طباعة رسالة على وحدة التحكم ( Console) عند اكتشاف شكل بشري، وحفظ الصورة في المجلد الذي أنشأته من قبل. يقوم المتغيّر humans (البشر) بحمل المستطيلات الإطارية التي يُكتشف البشر بداخلها في حال عُثر عليهم. تُعرَّف المستطيلات بواسطة أربعة متغيّرات: وهي الزوج x و y اللذان يمثلان الإحداثيين اللذين في الصورة وذلك في الزاوية العليا من الجهة اليسرى للمستطيل، وكذلك الزوج w و ، الذي يمثل عرض المستطيل وارتفاعه. في جميع الاكتشافات الموجودة في الصورة تُحدد الدالة ( ) rectangle البشر بمستطيل أزرق، حيث تنظر الدالة إلى متغيرات الصورة على أنها تتمثل في الزاوية اليسرى العلوية ، والزاوية اليمنى السفلية ) من المستطيل، ولون المستطيل وعرضه ، وفي الصورة الموضّحة تلاحظ أن لون المستطيل أزرق 0 0 255 وعرضه 2 . (x+w, y+h) -W- شكل 6.20: متغيرات المستطيل سيقوم نظام التقرير باسترجاع التاريخ والوقت الحاليين باستخدام الدالة ) ) datetime.now وطباعتها على وحدة التحكم بالإضافة إلى إحداثيات الطائرة المسيَّرة في وقت التقرير، ويتم تعديل تنسيق التاريخ والوقت بطريقة بسيطة عن طريق إدراج الشرطات العلوية (-) والشرطات السفلية (_) لاستخدامها كجزء من اسم الملف المحفوظ، ثم يتم حفظها في المجلد باستخدام الدالة ( )imwrite، وعند اكتمال كل شيء تقوم الدالة ( )gettime بإعادة ضبط المؤقت. وزارة التعليم Ministry of Education 2024-1446 # loop, through detected human images, annotates them with a bounding box # and prints a timestamp and an info message on the console for (x, y, w, h) in humans: # the image, the top left corner, the bottom right corner, color and width of the rectangle cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) current_time = datetime.now() print(current_time) print("Found a person in coordinates [{:.2f}, {:.2f}]" .format(x_pos, y_pos)) #saves annotated image to file with timestamp current_time = current_time.strftime("%Y-%m-%d %H-%M-%S") filename = f"detected/IMAGE_{current_time}.png" cv2.imwrite(filename, img) t2 = self.getTime() في السلسلة النصية يتم استخدام الترميز {2f.} كاختصار لعدد حقيقي (floating number) ذي خانتين عشريتين، وهنا يتم استخدام الاختصارين و للمتغيرين x_pos وy_pos 332
تقرير الطائرة المسيرة وحفظ الصور المكتشفة
333 وزارة التعليم Ministry of Education 2024-1446 بعد إضافة كل هذه الوظائف يجب أن تظهر الدالة ( )run الخاصة ببرنامج المتحكّم كما يلي: def run(self): # time intervals used for adjustments in order to reach the target altitude t1 = self.getTime() # time intervals between each detection for human figures t2 = self.getTime() roll disturbance = 0 pitch_disturbance = Θ yaw_disturbance = 0 # specifies the patrol coordinates waypoints = [[-30, 20], [-60, 30], [-75, 0], [-40, -10]] # target altitude of the drone in meters self.target_altitude = 8 # gets the current working directory cwd = os.getcwd() # sets the name of the folder where the images # with detected humans will be stored folder_name = "detected" #joins the current working directory and the new folder name folder_path = os.path.join(cwd, folder_name) if not os.path.exists(folder_path): #creates the folder if it doesn't exist already os.makedirs(folder_path) else: print(f" Folder \"detected\" created!") print(f" Folder \"detected\\" already exists!") while self.step(self.time_step) != -1: # reads sensors roll, pitch, yaw = self.imu.getRoll Pitch Yaw() x_pos, y_pos, altitude = self.gps.getValues() roll_acceleration, pitch_acceleration, _ = self.gyro.getValues() self.current_pose = [x_pos, y_pos, altitude, roll, pitch, yaw] if altitude> self.target_altitude # as soon as it reaches the target altitude, - 1: # computes the disturbances to go to the given waypoints if self.getTime() t1 > 0.1: yaw_disturbance, pitch_disturbance = self.move_to_target ( waypoints) t1 = self.getTime() # initiates the image processing and detection routine every 5 seconds if self.getTime() - t2 > 5.0: # retrieves image array from camera cameraImg = self.camera.getImageArray() # checks if image is successfully retrieved if cameraImg:
بعد اضافة كل هذه الوظائف يجب أن تظهر الدالة run() الخاصة ببرنامج المتحكم كما يلي
وزارة التعليم Ministry of Education 2024-1446 # reshapes image array to (channels, height, width) format cameraImg = np.transpose(cameraImg, (2, 0, 1)) cameraImg = np.reshape(cameraImg, (3, 240, 400)) # creates RGB image from merged channels img Image.new('RGB', (400, 240)) = img = cv2.merge((camera Img[2], cameraImg[1], cameraImg[0])) # converts image to grayscale gray = cv2.cvtColor(np. uint8(img), cv2.COLOR_BGR2GRAY) # loads and applies the Haar cascade classifier to detect humans in image human_cascade = cv2.Cascade Classifier('haarcascade_fullbody.xml') humans human_cascade.detectMultiScale(gray) = #loop, through detected human images, annotates them with a bounding box # and prints a timestamp and an info message on the console for (x, y, w, h) in humans: cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) current_time = datetime.now() print(current_time) print("Found a person in coordinates [{:.2f}, {:.2f}]" .format(x_pos, y_pos)) # saves annotated image to file with timestamp current_time = current_time.strftime("%Y-%m-%d %H-%M-%S") filename f" detected/IMAGE_{current_time}.png" cv2.imwrite(filename, img) t2 = self.getTime() # calculates the desired input values for roll, pitch, yaw, # and altitude using various constants and disturbance values roll input = self.K_ROLL_P* clamp(roll, -1, 1) + roll_acceleration + roll_disturbance pitch_input = self.K_PITCH_P * clamp(pitch, -1, 1) yaw_input yaw_disturbance = + pitch acceleration + pitch_disturbance altitude self.K_VERTICAL_OFFSET, -1, 1) clamped_difference_altitude = clamp(self.target_altitude vertical_input = self.K_VERTICAL_P* pow(clamped_difference_altitude, 3.0) #calculates the motors' input values based on the desired roll, pitch, yaw, and altitude values front_left_motor_input = self.K_VERTICAL_THRUST + vertical_input - yaw_input + pitch_input pitch_input - roll_input front_right_motor_input = self.K_VERTICAL_THRUST + roll input + vertical_input + yaw_input + pitch_input rear left_motor_input = self.K_VERTICAL_THRUST + vertical_input yaw_input - pitch_input - roll_input + rear_right_motor_input = self.K_VERTICAL_THRUST + vertical_input yaw_input pitch_input + roll input - - # sets the velocity of each motor based on the motors' input values calculated above self.front_left_motor.setVelocity (front_left_motor_input) self.front_right_motor.setVelocity(-front_right_motor_input) self.rear left_motor.setVelocity (-rear_left_motor_input) self.rear_right_motor.setVelocity(rear_right_motor_input) 334
عنوان جديد 1بعد اضافة كل هذه الوظائف يجب أن تظهر الدالة run() الخاصة ببرنامج المتحكم كما يلي1
335 الآن شغل المحاكاة لترى الطائرة المُسيَّرة وهي تُقلع وتُحلّق حول المنزل. لاحظ مخرجات وحدة التحكم الجديدة والصور التي تم إنشاؤها في المجلد. File Edit View Simulation Build Overlays Tools Help DJI Mavic 2 PRO demo 0 + 8 Q 0:00:16:768 - 0.00x IMPORTABLE EXTERNPROTO > Floor "floor" > Pedestrian "pedestrian(2)" > Pedestrian "pedestrian(1)" > Road "road" > Pedestrian "pedestrian" > Windmill "windmill" SmallManor "small manor" > Windmill "windmill(1)" > Windmill "windmill(2)" > > > SquareManhole "manhole" CardboardBox "cardboard box" Tesla Model3Simple "vehicle" > Forest Mavic2Pro "Mavic 2 PRO" translation -1.13 0.327 8.27 rotation -0.00798 0.00138 1 2.96 name "Mavic 2 PRO" controller "drone_controller" controllerArgs window "<generic>" customData"" supervisor FALSE synchronization TRUE battery Console - All INFO: drone_controller: Starting controller: python.exe -u drone_controller.py Folder "detected" created! 2023-04-20 10:50:17.093902 Found a person in coordinates [-0.20, 0.13] 2023-04-20 10:50:22.546951 Found a person in coordinates [-0.81, 0.25] وزارة التعليم Ministry of Education 2024-1446 شكل 6.21: ☑ ...llers\drone_controller\drone_controller.py D BBQ a drone_controller.py x 回冈 1 # Copyright 1996-2023 Cyberbotics Ltd. 2 # 3 # Licensed under the Apache License, Ve 4 # you may not use this file except in c 5 # You may obtain a copy of the License 6 # 7 # 8 # https://www.apache.org/licenses/L 9 # Unless required by applicable law or 10 # distributed under the License is dist 11 # WITHOUT WARRANTIES OR CONDITIONS OF A 12 # See the License for the specific lang 13 # Limitations under the License. 14 15 16 from controller import Robot 17 import numpy as np # Used for mathemc 18 import os #Used for folder creation 19 import cv2 # Used for image manipulat 20 from PIL import Image # Used for imag 21 from datetime import datetime # Used 23 # Auxiliary function used for calculati 22222 24 def clamp (value, value_min, value_max): return min(max(value, value_min), v 25 26 Console - All INFO: drone_controller: Starting controller: python.exe -u drone_controller.py Folder "detected" created! 2023-04-20 10:50:17.093902 Found a person in coordinates [-0.20, 0.13] 2023-04-20 10:50:22.546951 Found a person in coordinates [-0.81, 0.25] Open File... Х > This PC > Documents > A12_U3_Drone > controllers > drone_controller ✓ Search drone_controller Organize New folder Quick access PC Creative Cloud Files تم إنشاء المجلد. This PC Network drone_controller. ру haarcascade_full body.xml detected File name: drone_controller.py IMAGE_2023-04-20_10-50-17.png IMAGE_2023-04-20_10-50-22.png شكل 6.22 إنشاء المجلد والصور المحفوظة التي تحتوي على الاكتشافات All Files (*) Open Cancel
الآن شغل المحاكاة لترى الطائرة المسيرة وهي تقلع وتحلق حول المنزل
336 1 تمرينات عدل برنامج المتحكّم الخاص بك بحيث لا يتحقق من وجود المجلد بالفعل في المسار. هل يتسبب ذلك في أية تعقيدات في تنفيذ المحاكاة؟ 2 عدل برنامج المتحكّم بحيث يقوم بالاكتشاف كل 10 ثوان. هل تلاحظ أي فرق في تكرار ما تطبعه وحدة التحكم وفي الصور المحفوظة؟ وزارة التعليم Ministry of Education 2024-1446
عدل برنامج المتحكم الخاص بك بحيث لا يتحقق من وجود المجلد بالفعل في المسار، هل يتسبب ذلك في أية تعقيدات في تنفيذ المحاكاة
عدل برنامج المتحكم بحيث يقوم بالاكتشاف كل 10 ثوان هل تلاحظ أي فرق في تكرار ما تطبعه وحدة التحكم وفي الصور المحفوظة
337 ماذا سيحدث مخرجات الصورة إذا قمت بدمج أبعاد الألوان حسب التسلسل المعتاد بدلًا من التسلسل المعكوس؟ دون ملاحظاتك وفقًا لذلك. 3 4 أجر تجارب على المعاملين الرابع والخامس في الدالة ()rectangle . دون ملاحظاتك وفقًا لذلك. عدل برنامج المتحكّم الخاص بك بحيث يطبع قيم الالتفاف والانحدار والانعراج للطائرة المسيرة عند اكتشاف أي شخص. وزارة التعليم Ministry of Education 2024-1446 5