Python Tensorflow——多幅图像的批量预测

Python Tensorflow——多幅图像的批量预测,python,tensorflow,keras,Python,Tensorflow,Keras,我有一个faces列表,其中列表的每个元素都是一个具有形状(1224224,3)的numpy数组,即一个人脸图像。我有一个模型,它的输入形状是(None,224,224,3),输出形状是(None,2) 现在我想对faces列表中的所有图像进行预测。当然,我可以遍历列表并逐个获得预测,但我希望将所有图像作为一个批处理,只需调用一次model.predict(),即可更快地获得结果 如果我像现在一样直接传递faces列表(最后完成代码),我只会得到第一张图像的预测 print(f"{len(fac

我有一个
faces
列表,其中列表的每个元素都是一个具有形状(1224224,3)的numpy数组,即一个人脸图像。我有一个模型,它的输入形状是
(None,224,224,3)
,输出形状是
(None,2)

现在我想对
faces
列表中的所有图像进行预测。当然,我可以遍历列表并逐个获得预测,但我希望将所有图像作为一个批处理,只需调用一次
model.predict()
,即可更快地获得结果

如果我像现在一样直接传递faces列表(最后完成代码),我只会得到第一张图像的预测

print(f"{len(faces)} faces found")
print(faces[0].shape)
maskPreds = model.predict(faces)
print(maskPreds)
输出:

3 faces found
(1, 224, 224, 3)
[[0.9421933  0.05780665]]
但3幅图像的
遮罩应该是:

[[0.9421933  0.05780665], 
 [0.01584494 0.98415506], 
 [0.09914105 0.9008589 ]] 
完整代码:

从tensorflow.keras.models导入负荷模型
从cvlib导入检测面部
进口cv2
将numpy作为np导入
def detectAllFaces(帧):
dets=检测面(帧)
方框=数据段[0]
机密=详细信息[1]
面=[]
对于盒子,自信拉链(盒子,自信):
startX,startY,endX,endY=box
cv2.矩形(帧,(startX,startY),(endX,endY),(0,255,0),1)
面=帧[起点:终点,起点:终点]
面=cv2。调整大小(面,(224224)
面=np。展开尺寸(面,轴=0)#将(224224,3)转换为(1224224,3)
面。附加(面)
返回面、框架
模型=加载模型(“掩模检测器.模型”)
vs=cv2.视频捕获(0)
model.summary()
尽管如此:
ret,frame=vs.read()
如果不是ret:
打破
面,帧=检测面(帧)
如果透镜(面):
打印(f“{len(faces)}找到面”)

maskpredict=model.predict(faces)#在这种情况下,
model.predict()
函数的输入需要作为形状(N,224,224,3)的numpy数组给出,其中N是输入图像的数量

为了实现这一点,我们可以N大小为(1224224,3)的单个numpy数组堆叠成一个大小为(N,224224224,3)的数组,然后将其传递给
model.predict()
函数

maskPreds=model.predict(np.vstack(faces))

您的网络是否在批量大于1的输入上工作<代码>面[0]。形状
具有形状
(1224224,3)。形状不应该改为
(2242242243)
吗?你能把输入张量的形状贴出来吗?我不懂下一票。请告诉我如何改进这个问题。如果输入层的形状是
(None,224,224,3)
,为什么是
面[0]。形状是
(1224,224,3)
?它不应该是
(2242243)
,这样当三个这样的面被添加到一个列表中时-
[面,面,面]
,面的形状可以被解释为
(3222243)
?我已经编辑了整个问题,并包含了所有细节
ValueError: Error when checking input: expected input_1 to have 4 dimensions, but got array with shape (224, 224, 3)