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

محاولة تعديل الكود ليصبح قادر على معالجة أكثر من صورة

Zeina Almakdisi

السؤال

مرحبا..

اعمل على خوارزمية 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 يظهر الخطأ هنا عند تمرير 

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

لتتمكنين من معالجة أكثر من صورة مدخلة وحفظها، عليك إجراء التغييرات التالية:

  1. في حلقة for image_path in args['images']:، عليك إنشاء كائن image جديد لكل مسار صورة.
  2. بعد استدعاء دالة 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، والتي ستحتوي على الكائنات المكتشفة في كل صورة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 57 دقائق مضت قال Mustafa Suleiman:

لتتمكنين من معالجة أكثر من صورة مدخلة وحفظها، عليك إجراء التغييرات التالية:

  1. في حلقة for image_path in args['images']:، عليك إنشاء كائن image جديد لكل مسار صورة.
  2. بعد استدعاء دالة 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

ذلك  لأن دالة 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
بتاريخ 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
رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...