web-dev-qa-db-fra.com

L'objet numpy.ndarray n'a pas d'attribut 'read' (et 'seek')

J'obtiens l'erreur numpy.ndarray object has no attribute 'read' et numpy.ndarray object has no attribute 'seek'. J'ai essayé de chercher la réponse en ligne mais j'ai échoué.

Ce que j'essaie de faire, c'est de détecter des objets dans une vidéo - dans ce cas, je veux détecter les zèbres.

J'ai pris un détecteur d'image et j'essaye de l'appliquer à la vidéo. J'essaie de faire une boucle sur chaque image de la vidéo et finalement de passer l'image à la fonction draw_boxes.

Voici le message d'erreur:

Traceback (most recent call last):
  File "/Users/ysquared/Library/Python/3.7/lib/python/site-packages/PIL/Image.py", line 2770, in open
    fp.seek(0)
AttributeError: 'numpy.ndarray' object has no attribute 'seek'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 204, in <module>
  File "<string>", line 118, in load_image_pixels
  File "/Users/ysquared/Library/Python/3.7/lib/python/site-packages/keras_preprocessing/image/utils.py", line 110, in load_img
    img = pil_image.open(path)
  File "/Users/ysquared/Library/Python/3.7/lib/python/site-packages/PIL/Image.py", line 2772, in open
    fp = io.BytesIO(fp.read())
AttributeError: 'numpy.ndarray' object has no attribute 'read'

Et voici le code pertinent:

model = load_model('model.h5')

# define the expected input shape for the model
input_w, input_h = 416, 416

# define the anchors
anchors = [[116,90, 156,198, 373,326], [30,61, 62,45, 59,119], [10,13, 16,30, 33,23]]

# define the labels
labels = ["person", "bicycle", "car", "motorbike", "aeroplane", "bus", "train", "truck",
        "boat", "traffic light", "fire hydrant", "stop sign", "parking meter", "bench",
        "bird", "cat", "dog", "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe",
        "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard",
        "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard",
        "tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana",
        "Apple", "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake",
        "chair", "sofa", "pottedplant", "bed", "diningtable", "toilet", "tvmonitor", "laptop", "mouse",
        "remote", "keyboard", "cell phone", "microwave", "oven", "toaster", "sink", "refrigerator",
        "book", "clock", "vase", "scissors", "teddy bear", "hair drier", "toothbrush"]

vs = cv2.VideoCapture('Zebras.mp4')
fourcc = cv2.VideoWriter_fourcc(*'XVID')
writer = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))

class_threshold = 0.6
boxes = list()

while True:
    (grabbed, frame) = vs.read()

    if grabbed==True:

        image, image_w, image_h = load_image_pixels(frame, (input_w, input_h))
        yhat = model.predict(image)

        for i in range(len(yhat)):
            # decode the output of the network
            boxes += decode_netout(yhat[i][0], anchors[i], class_threshhold, input_h, input_w)
         # correct the sizes of the bounding boxes for the shape of the image
        correct_yolo_boxes(boxes, image_h, image_w, input_h, input_w)
         # suppress non-maximal boxes
        do_nms(boxes, 0.5)

         # get the details of the detected objects
        v_boxes, v_labels, v_scores = get_boxes(boxes, labels, class_threshold)

         # draw what we found
        frame = draw_boxes(frame, v_boxes, v_labels, v_scores)

        writer.write(frame)

        cv2.imshow('frame', frame)

        if cv2.waitkey(1) & 0xFF == ord('q'):
            break

    else:
        break

vs.release()

writer.release()

cv2.destroyAllWindows()

2
ysquared

Voici comment j'ai résolu le problème (c'est-à-dire débarrassé de l'erreur):


##[..] 
cv2.imwrite("framex.jpg", frame)
filename = "framex.jpg"

image, image_w, image_h = load_image_pixels(filename, (input_w, input_h))

##[..]

frame = draw_boxes(filename, v_boxes, v_labels, v_scores)

##[..]
1
ysquared