我是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
的方法是什么?请帮忙。提前谢谢。
答案 0 :(得分:4)
caffe.io.load_image做得不多。它只执行以下操作:
(参见来源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']