numpy .ndarray объект не имеет атрибута «чтение» (и «поиск») - PullRequest
1 голос
/ 11 января 2020

Я получаю сообщение об ошибке numpy.ndarray object has no attribute 'read' и numpy.ndarray object has no attribute 'seek'. Я попытался найти ответ в Интернете, но мне не удалось.

Я пытаюсь обнаружить объекты в видео - в этом случае я хочу обнаружить зебр.

Я взял детектор изображений и пытаюсь применить его к видео. Я пытаюсь l oop на каждом кадре видео и в конечном итоге передать кадр функции draw_boxes.

Вот сообщение об ошибке:

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'

А вот соответствующий код:

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 ]

1 голос
/ 11 января 2020

seek и read - это то, что может сделать открытый файл. Из трассировки я делаю вывод, что эта ошибка возникает в строке

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

, а проблема должна быть в аргументе frame. Эта функция ожидает открытия файла или имени файла, но frame, очевидно, является массивом numpy. Это определено выше в:

(grabbed, frame) = vs.read()

Таким образом, это кадр из mp4, массив, а не файл.

Так что вам либо нужно дать load_image_pixels имя файла или вам нужно использовать какую-то другую функцию для обработки массива frame.

Общий поиск в Интернете не помогает при такого рода ошибках. Он слишком широкий и слишком конкретный c.

no attribute ошибки в Python распространены. Это означает, что объект в этой точке имеет другой класс, чем тот, который предназначен программисту. Например, если чтение cv не может найти файл, оно возвращает None вместо изображения. Вы не можете обработать None, как если бы это было изображение. Но ваша конкретная комбинация использования массива вместо имени файла уникальна.

Прежде чем приступить к поиску в Интернете, попытайтесь понять, где происходит ошибка и какие переменные задействованы. Проверьте и его реальную природу (тип, форму и т. Д. c), и ожидания кода, вызываемой функции (ей).

0 голосов
/ 16 января 2020

Вот как я решил проблему (т.е. избавился от ошибки):


##[..] 
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)

##[..]
...