将捕获的视频帧(numpy array object)从webcam feed传递到caffe模型

时间:2016-10-12 11:58:37

标签: python opencv video caffe pycaffe

我是Caffe的初学者,我正在尝试使用Imagenet模型进行对象分类。我的要求是我想从网络摄像头源中使用它并检测网络摄像头源中的对象。为此,我使用以下代码

    cap = cv2.VideoCapture(0)
    while(True):    
        ret, frame = cap.read() #frame is of type numpy array       
        #frame = caffe.io.array_to_datum(frame) 
        img = caffe.io.load_image(frame)

显然这不起作用,因为caffe.io.load_image需要一个图像路径。 正如您所看到的,我还尝试使用caffe io.py的{​​{1}}函数(从this stackoverflow question 获取)并将框架传递给caffe io load_image,但这也不起作用。 如何将捕获的视频帧从网络摄像头直接传递到array_to_datum? 如果那是不可能的,那么将帧加载到caffe io load_image的方法是什么?请帮忙。提前谢谢。

2 个答案:

答案 0 :(得分:4)

caffe.io.load_image做得不多。它只执行以下操作:

  1. 从磁盘读取图像(给定路径)
  2. 确保返回的图像具有3个尺寸(HxWx1或HxWx3)
  3. (参见来源caffe.io.load_image

    因此将图像加载到模型中,它只是一个从磁盘加载图像的辅助函数。要将图像加载到内存中,您可以随意加载它(从磁盘,从webcam..etc)。要加载网络,将图像输入网络并进行推理,您可以执行以下操作:

    # Load pre-trained network
    net=caffe.Net(deployprototxt_path, caffemodel_path, caffe.TEST)
    # Feed network with input
    net.blobs['data'].data[0,...] = frame
    # Do inference
    net.forward()
    # Access prediction
    probabilities = net.blobs['prob'].data
    

    确保框架尺寸符合deploy.prototxt中指定的预期输入尺寸(请参阅example for CaffeNet

答案 1 :(得分:0)

如果您使用OpenCV读取摄像机帧,则需要将颜色空间从OpenCV的默认空间(BGR)重新排序为Caffe输入顺序RGB,然后将所有值都放入单精度浮点数:

# load caffe model
net = caffe.Net(model_def,  # defines the structure of the model
            model_weights,  # contains the trained weights
            caffe.TEST)     # use test mode (e.g., don't perform dropout)

cap = cv2.VideoCapture(1)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH,1280);
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT,720);

while(True):

    ret,frame = cap.read()
    image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB).astype(np.float32)/255.0
    # you can now pass image to Caffe
    net.blobs['data'].data[...] = image
    # forward pass, obtain detections
    detections = net.forward()['detection_out']