Zeina Almakdisi نشر 28 سبتمبر 2023 أرسل تقرير نشر 28 سبتمبر 2023 مرحبا.. اعمل على خوارزمية yolov3 لاكتشاف الاشياء احاول تعديل الكود ليصبح قادر على معالجة أكثر من صورة مدخلة وحفظهم وضعت تعليقات لتوضيح مكان الخطأ import cv2 from pathlib import Path import pafy import argparse import numpy as np classesf="yolov3.txt" weights="yolov3.weights" config="yolov3.cfg" scale=0.00392 classes=None with open(classesf,'r') as f: classes=[line.strip() for line in f.readlines()] COLORS =np.random.uniform(0,255,size=(len(classes),3)) net=cv2.dnn.readNet(weights,config) ############################################التعديل هنا لادخال الصور ap = argparse.ArgumentParser() ap.add_argument('-i', '--images',nargs='+', default=["sam.jpg"], help = 'path to input image') ap.add_argument('-c', '--config', default="yolov3.cfg", help = 'path to yolo config file') ap.add_argument('-w', '--weights', default="yolov3.weights", help = 'path to yolo pre-trained weights') ap.add_argument('-cl', '--classes', default="yolov3.txt", help = 'path to text file containing class names') args =vars(ap.parse_args()) for image_path in args['images']: image = cv2.imread('Images/frame*.jpg') #################################################################### def get_output_layers(net): layer_names = net.getLayerNames() try: output_layers = [layer_names[i - 1] for i in net.getUnconnectedOutLayers()] except: output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()] return output_layers def draw_prediction(img, class_id, confidence, x, y, x_plus_w, y_plus_h): label = str(classes[class_id]) color = COLORS[class_id] cv2.rectangle(img, (x,y), (x_plus_w,y_plus_h), color, 2) cv2.putText(img, label, (x-10,y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2) def video_detector(image_path): while True: image = cv2.imread(image_path) Width = image.shape[1] Height = image.shape[0] blob = cv2.dnn.blobFromImage(image, 0.00392, (416,416), (0,0,0), True, crop=False) net.setInput(blob) outs = net.forward(get_output_layers(net)) class_ids = [] confidences = [] boxes = [] conf_threshold = 0.5 nms_threshold = 0.4 scale = 0.00392 classes = None for out in outs: for detection in out: scores = detection[5:] class_id = np.argmax(scores) confidence = scores[class_id] if confidence > 0.5: center_x = int(detection[0] * Width) center_y = int(detection[1] * Height) w = int(detection[2] * Width) h = int(detection[3] * Height) x = center_x - w / 2 y = center_y - h / 2 class_ids.append(class_id) confidences.append(float(confidence)) boxes.append([x, y, w, h]) # print(class_id) indices = cv2.dnn.NMSBoxes(boxes, confidences, conf_threshold, nms_threshold) for i in indices: try: box = boxes[i] except: i = i[0] box = boxes[i] x = box[0] y = box[1] w = box[2] h = box[3] draw_prediction(image, class_ids[i], confidences[i], round(x), round(y), round(x+w), round(y+h)) cv2.imshow("object detection", image) cv2.waitKey() if cv2.waitKey(1) & 0xff ==ord('q'): break cv2.imwrite("object-detection.jpg", image) output_image_path = "object-detection-" + image_path.split('.')[0] + ".jpg" cv2.imwrite(output_image_path, image) cv2.destroyAllWindows() if __name__ == "__main__": video_detector(args['image'])#############image يظهر الخطأ هنا عند تمرير 1 اقتباس
0 Mustafa Suleiman نشر 28 سبتمبر 2023 أرسل تقرير نشر 28 سبتمبر 2023 لتتمكنين من معالجة أكثر من صورة مدخلة وحفظها، عليك إجراء التغييرات التالية: في حلقة for image_path in args['images']:، عليك إنشاء كائن image جديد لكل مسار صورة. بعد استدعاء دالة video_detector()، قومي بحفظ الصورة الناتجة إلى ملف جديد باسم فريد باستخدام متغير image_path لإنشاء اسم فريد لكل صورة ناتجة. import cv2 from pathlib import Path import pafy import argparse import numpy as np classesf="yolov3.txt" weights="yolov3.weights" config="yolov3.cfg" scale=0.00392 classes=None with open(classesf,'r') as f: classes=[line.strip() for line in f.readlines()] COLORS =np.random.uniform(0,255,size=(len(classes),3)) net=cv2.dnn.readNet(weights,config) ############################################التعديل هنا لادخال الصور ap = argparse.ArgumentParser() ap.add_argument('-i', '--images',nargs='+', default=["sam.jpg"], help = 'path to input image') ap.add_argument('-c', '--config', default="yolov3.cfg", help = 'path to yolo config file') ap.add_argument('-w', '--weights', default="yolov3.weights", help = 'path to yolo pre-trained weights') ap.add_argument('-cl', '--classes', default="yolov3.txt", help = 'path to text file containing class names') args =vars(ap.parse_args()) for image_path in args['images']: image = cv2.imread(image_path) # Call the video_detector() function video_detector(image) # Save the output image to a new file with a unique name output_image_path = "object-detection-" + image_path.split('.')[0] + ".jpg" cv2.imwrite(output_image_path, image) وما قمت به هو: إنشاء حلقة for لمعالجة كل صورة مدخلة. إنشاء كائن image جديد لكل صورة مدخلة. استدعاء دالة video_detector() لمعالجة الصورة الحالية. حفظ الصورة الناتجة إلى ملف جديد باسم فريد. لإنشاء اسم فريد للصورة الناتجة، قمت باستخدام متغير image_path لفصل اسم الصورة عن امتدادها ثم قمت بإضافة بادئة "object-detection-" إلى اسم الصورة الأساسي. والآن ما عليك سوى تمرير مسارات الصور المدخلة كوسائط إلى البرنامج، أي لمعالجة الصور sam.jpg و cat.jpg، ستقومين بتشغيل الأمر التالي: python object_detection.py -i sam.jpg cat.jpg وذلك من أجل إنشاء صورتين، object-detection-sam.jpg و object-detection-cat.jpg، والتي ستحتوي على الكائنات المكتشفة في كل صورة. 1 اقتباس
0 Zeina Almakdisi نشر 28 سبتمبر 2023 الكاتب أرسل تقرير نشر 28 سبتمبر 2023 بتاريخ 57 دقائق مضت قال Mustafa Suleiman: لتتمكنين من معالجة أكثر من صورة مدخلة وحفظها، عليك إجراء التغييرات التالية: في حلقة for image_path in args['images']:، عليك إنشاء كائن image جديد لكل مسار صورة. بعد استدعاء دالة video_detector()، قومي بحفظ الصورة الناتجة إلى ملف جديد باسم فريد باستخدام متغير image_path لإنشاء اسم فريد لكل صورة ناتجة. import cv2 from pathlib import Path import pafy import argparse import numpy as np classesf="yolov3.txt" weights="yolov3.weights" config="yolov3.cfg" scale=0.00392 classes=None with open(classesf,'r') as f: classes=[line.strip() for line in f.readlines()] COLORS =np.random.uniform(0,255,size=(len(classes),3)) net=cv2.dnn.readNet(weights,config) ############################################التعديل هنا لادخال الصور ap = argparse.ArgumentParser() ap.add_argument('-i', '--images',nargs='+', default=["sam.jpg"], help = 'path to input image') ap.add_argument('-c', '--config', default="yolov3.cfg", help = 'path to yolo config file') ap.add_argument('-w', '--weights', default="yolov3.weights", help = 'path to yolo pre-trained weights') ap.add_argument('-cl', '--classes', default="yolov3.txt", help = 'path to text file containing class names') args =vars(ap.parse_args()) for image_path in args['images']: image = cv2.imread(image_path) # Call the video_detector() function video_detector(image) # Save the output image to a new file with a unique name output_image_path = "object-detection-" + image_path.split('.')[0] + ".jpg" cv2.imwrite(output_image_path, image) وما قمت به هو: إنشاء حلقة for لمعالجة كل صورة مدخلة. إنشاء كائن image جديد لكل صورة مدخلة. استدعاء دالة video_detector() لمعالجة الصورة الحالية. حفظ الصورة الناتجة إلى ملف جديد باسم فريد. لإنشاء اسم فريد للصورة الناتجة، قمت باستخدام متغير image_path لفصل اسم الصورة عن امتدادها ثم قمت بإضافة بادئة "object-detection-" إلى اسم الصورة الأساسي. والآن ما عليك سوى تمرير مسارات الصور المدخلة كوسائط إلى البرنامج، أي لمعالجة الصور sam.jpg و cat.jpg، ستقومين بتشغيل الأمر التالي: python object_detection.py -i sam.jpg cat.jpg وذلك من أجل إنشاء صورتين، object-detection-sam.jpg و object-detection-cat.jpg، والتي ستحتوي على الكائنات المكتشفة في كل صورة. شكرا لك قمت بتطبيق الخطوات اصبح يظهر الخطأ التالي image = cv2.imread(image_path) TypeError: Can't convert object to 'str' for 'filename' يشير الى : def video_detector(image_path): while True: image = cv2.imread(image_path)#################### هنااا Width = image.shape[1] Height = image.shape[0] اقتباس
0 Mustafa Suleiman نشر 28 سبتمبر 2023 أرسل تقرير نشر 28 سبتمبر 2023 ذلك لأن دالة cv2.imread() تتوقع اسم ملف نصي كوسيطة، وأنتِ تمررين كائن args['images']، والذي هو قائمة من مسارات الصور. حاولي تحويل كائن args['images'] إلى سلسلة باستخدام الدالة str(). import cv2 from pathlib import Path import pafy import argparse import numpy as np classesf="yolov3.txt" weights="yolov3.weights" config="yolov3.cfg" scale=0.00392 classes=None with open(classesf,'r') as f: classes=[line.strip() for line in f.readlines()] COLORS =np.random.uniform(0,255,size=(len(classes),3)) net=cv2.dnn.readNet(weights,config) ############################################التعديل هنا لادخال الصور ap = argparse.ArgumentParser() ap.add_argument('-i', '--images',nargs='+', default=["sam.jpg"], help = 'path to input image') ap.add_argument('-c', '--config', default="yolov3.cfg", help = 'path to yolo config file') ap.add_argument('-w', '--weights', default="yolov3.weights", help = 'path to yolo pre-trained weights') ap.add_argument('-cl', '--classes', default="yolov3.txt", help = 'path to text file containing class names') args =vars(ap.parse_args()) for image_path in args['images']: image_path = str(image_path) # Call the video_detector() function video_detector(image_path) # Save the output image to a new file with a unique name output_image_path = "object-detection-" + image_path.split('.')[0] + ".jpg" cv2.imwrite(output_image_path, image) اقتباس
0 عمار معلا نشر 28 سبتمبر 2023 أرسل تقرير نشر 28 سبتمبر 2023 بتاريخ 2 ساعة قال Zeina Almakdisi: مرحبا.. اعمل على خوارزمية yolov3 لاكتشاف الاشياء احاول تعديل الكود ليصبح قادر على معالجة أكثر من صورة مدخلة وحفظهم وضعت تعليقات لتوضيح مكان الخطأ مرحبا, يمكنك حل المشكلة عبر تمرير المسار الخاص بمجلد يحوي هذه الصور وباستخدام المكتبة glob التي تمكنك من استخراج المسار الكامل لكل صورة في هذا المجلد, يصبح بإمكانك معالجة كل صورة وحفظها باسم مختلف import cv2 from pathlib import Path import pafy import argparse import numpy as np import glob # new import os #new classesf="yolov3.txt" weights="yolov3.weights" config="yolov3.cfg" scale=0.00392 classes=None with open(classesf,'r') as f: classes=[line.strip() for line in f.readlines()] COLORS =np.random.uniform(0,255,size=(len(classes),3)) net=cv2.dnn.readNet(weights,config) ############################################التعديل هنا لادخال الصور ap = argparse.ArgumentParser() ap.add_argument('-i', '--images', default=["images"], #new help = 'path to folder image') #new ap.add_argument('-c', '--config', default="yolov3.cfg", help = 'path to yolo config file') ap.add_argument('-w', '--weights', default="yolov3.weights", help = 'path to yolo pre-trained weights') ap.add_argument('-cl', '--classes', default="yolov3.txt", help = 'path to text file containing class names') args =vars(ap.parse_args()) image_paths = glob.glob(os.path.join(args["images"],'*.jpg')) # new for image_path in image_paths: #new image = cv2.imread(image_path) # Call the video_detector() function video_detector(image) # Save the output image to a new file with a unique name output_image_path = image_path[:-4] + "_new.jpg" #new cv2.imwrite(output_image_path, image) في الكود السابق عند التعديل يتم في الاسطر التي تحوي تعليق new في البداية تم استدعاء glob, os ثم تغيير argparse لتمرير مسار المجلد بدلا من عدة صور ثم استخدام الدالة glob في المكتبة glob لتقوم بتوليد جميع المسارات الكاملة للصور الموجودة في المجلد عبر تمرير مسار المجلد مع تحديد اللاحقة jpg لأخذ الصور فقط وسوف يكون شكل الخرج في حال الطباعة ['E:\\old_pc\\collage\\temper\\Ai5\\٢٠١٨١١٠٦_١٧٠٤٣٠.jpg', 'E:\\old_pc\\collage\\temper\\Ai5\\٢٠١٨١١٠٦_١٧٥٣١٧.jpg', 'E:\\old_pc\\collage\\temper\\Ai5\\٢٠١٨١١٢٧_٢٢٤٤٢٢.jpg', 'E:\\old_pc\\collage\\temper\\Ai5\\٢٠١٨١١٢٩_٠٨٤٧٢٢.jpg'] ثم مرور حلقة على جميع المسارات وقراءة كل صورة ومعالجتها ثم تعيين اسم جديد عبر إضافة _new في نهاية الصورة لتميزها عن الاصلية ويكون شكل الخرج في حال الطباعة E:\old_pc\collage\temper\Ai5\٢٠١٨١١٠٦_١٧٠٤٣٠.jpg E:\old_pc\collage\temper\Ai5\٢٠١٨١١٠٦_١٧٠٤٣٠_new.jpg E:\old_pc\collage\temper\Ai5\٢٠١٨١١٠٦_١٧٥٣١٧.jpg E:\old_pc\collage\temper\Ai5\٢٠١٨١١٠٦_١٧٥٣١٧_new.jpg E:\old_pc\collage\temper\Ai5\٢٠١٨١١٢٧_٢٢٤٤٢٢.jpg E:\old_pc\collage\temper\Ai5\٢٠١٨١١٢٧_٢٢٤٤٢٢_new.jpg E:\old_pc\collage\temper\Ai5\٢٠١٨١١٢٩_٠٨٤٧٢٢.jpg E:\old_pc\collage\temper\Ai5\٢٠١٨١١٢٩_٠٨٤٧٢٢_new.jpg اقتباس
0 Qor Qar نشر 17 أكتوبر 2023 أرسل تقرير نشر 17 أكتوبر 2023 الاستاذ زيان المقدسى هل يمكن لهذا الكود ان يكتشف النص والاشكال الهندسية فى صورة اقتباس
السؤال
Zeina Almakdisi
مرحبا..
اعمل على خوارزمية yolov3 لاكتشاف الاشياء
احاول تعديل الكود ليصبح قادر على معالجة أكثر من صورة مدخلة وحفظهم
وضعت تعليقات لتوضيح مكان الخطأ
5 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.