Как использовать caffe convnet для обнаружения объектов в видеокадрах?

Я использую коды из эта ссылка и успешно выполнила обнаружение, но проблема в том, что это только с веб-камеры. Я попытался изменить код, чтобы он мог читать из файла. часть, которую я изменил: я написал это

print("[INFO] starting video stream...")
vs= cv2.VideoCapture('cars.avi')
time.sleep(2.0)
fps = FPS().start()
# loop over the frames from the video stream
while True:
# grab the frame from the threaded video stream and resize it
# to have a maximum width of 400 pixels
frame = vs.read()

вместо этого (код из приведенной выше ссылки)

print("[INFO] starting video stream...")
vs = VideoStream(src=0).start()
time.sleep(2.0)
fps = FPS().start()
# loop over the frames from the video stream
while True:
# grab the frame from the threaded video stream and resize it
# to have a maximum width of 400 pixels
frame = vs.read()

Для запуска программы из терминала я использую эту команду для обоих случаев:

python real_time_object_detection.py  --prototxt 
MobileNetSSD_deploy.prototxt.txt  --model MobileNetSSD_deploy.caffemodel

Ошибка, которую я получаю при чтении из файла,

ошибка, которую я получаю:

C:\Users\DEBASMITA\AppData\Local\Programs\Python\Python35\real-time-object-
detection>python videoobjectdetection.py  --prototxt 
MobileNetSSD_deploy.prototxt.txt  --model MobileNetSSD_deploy.caffemodel
[INFO] loading model...
Traceback (most recent call last):
  File "videoobjectdetection.py", line 54, in <module>
    frame = imutils.resize(frame, width=400)
  File "C:\Users\DEBASMITA\AppData\Local\Programs\Python\Python35\lib\site-
packages\imutils\convenience.py", line 69, in resize
    (h, w) = image.shape[:2]
AttributeError: 'tuple' object has no attribute 'shape' 

Я не знаю, где я делаю неправильно. Пожалуйста, помогите мне.


person Debasmita Bhoumik    schedule 16.03.2018    source источник
comment
взгляните на формат vs в обоих приложениях и найдите различия.   -  person Micka    schedule 16.03.2018
comment
можешь немного объяснить? Я новичок в этой области и делаю это как свой проект mtech.   -  person Debasmita Bhoumik    schedule 16.03.2018
comment
извините, я имел в виду: посмотрите формат кадра в обоих приложениях и найдите отличия. Вероятно, вы не можете ожидать, что VideoStream и cv2.VideoCapture будут предоставлять изображения с одинаковыми свойствами/форматом.   -  person Micka    schedule 16.03.2018
comment
хорошо.. проверю это   -  person Debasmita Bhoumik    schedule 16.03.2018
comment
Как я уже сказал в своем ответе, я согласен с Микой, VideoStream и cv2.VideoCapture не возвращают одни и те же объекты, вы определенно получаете кортеж из VideoStream.   -  person Jeff Ellen    schedule 16.03.2018
comment
Мика, моя проблема решена. да проблема была в видеозахвате. Я должен использовать FileVideoStream вместо VideoStream, и все готово.   -  person Debasmita Bhoumik    schedule 16.03.2018


Ответы (1)


Я не знаком ни с одним кодом, на который вы ссылаетесь, но ошибка проста, и ответы на аналогичные ошибки были даны в другие вопросы: вы пытаетесь применить необычный метод к простому объекту кортежа. Вот пример этой концепции Python с использованием общего пакета numpy для массивов:

#an example of the error you are getting with a plain tuple
>>>tup = (1,2,3,4)
>>>len(tup)
4
>>> tup.shape
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'shape'

#an example that uses an attribute called 'shape'
>>> import numpy as np
>>> x = np.array([1,2,3,4])
>>> x.shape
(4,)
>>> x.shape.shape
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'shape'

Как вы можете видеть в моих последних двух строках, при первом вызове .shape в массиве numpy вызов действителен. Этот вызов возвращает кортеж, поэтому последний вызов .shape.shape недействителен, он работает с (4,). Что касается того, как это исправить? Я не знаю. Например, в этом вопросе первоначальный автор подумал, что они возвращали какой-то объект изображения, вместо этого они получали кортеж (возможно, кортеж объектов изображения). Что-то похожее происходит и с вами: ваш вызов VideoStream.read() возвращает кортеж. Поэтому, когда вы вызываете imutils.resize(frame, width=400), вы передаете кортеж, а не изображение или кадр. Поэтому, когда этот метод пытается вызвать .shape, вы получаете сообщение об ошибке. VideoStream.read() может возвращать кортеж по замыслу или в результате ошибки. Вы должны были бы прочитать на VideoStream, чтобы быть уверенным.

person Jeff Ellen    schedule 16.03.2018
comment
моя проблема решена. да проблема была в видеозахвате. Я должен использовать FileVideoStream вместо VideoStream, и все готово. Спасибо. - person Debasmita Bhoumik; 16.03.2018
comment
@DebasmitaBhoumik отлично, если мой ответ помог, пожалуйста, примите его. - person Jeff Ellen; 16.03.2018