【问题标题】:Tensorflow - Batch predict on multiple imagesTensorflow - 对多个图像进行批量预测
【发布时间】:2020-05-18 13:10:47
【问题描述】:

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

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

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

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]]

但是maskPreds 对于 3 张图片应该是这样的:

[[0.9421933  0.05780665], 
 [0.01584494 0.98415506], 
 [0.09914105 0.9008589 ]] 

完整代码:

from tensorflow.keras.models import load_model
from cvlib import detect_face
import cv2
import numpy as np

def detectAllFaces(frame):
    dets = detect_face(frame)
    boxes = dets[0]
    confidences = dets[1]
    faces = []

    for box, confidence in zip(boxes, confidences):
        startX, startY, endX, endY = box
        cv2.rectangle(frame, (startX, startY), (endX, endY), (0, 255, 0), 1)
        face = frame[startY:endY, startX:endX]
        face = cv2.resize(face, (224, 224))
        face = np.expand_dims(face, axis=0) # convert (224,224,3) to (1,224,224,3)
        faces.append(face)

    return faces, frame

model = load_model("mask_detector.model")
vs = cv2.VideoCapture(0)
model.summary()

while True:
    ret, frame = vs.read()
    if not ret:
        break            
    faces, frame = detectAllFaces(frame)

    if len(faces):
        print(f"{len(faces)} faces found")
        maskPreds = model.predict(faces) # <==========
        print(maskPreds) 

    cv2.imshow("Window", frame)
    if cv2.waitKey(1) == ord('q'):
        break

cv2.destroyWindow("Window")
vs.release()

注意:如果我不将每个图像从 (224, 224, 3) 转换为 (1, 224, 224, 3),则 tensorflow 会抛出错误,指出输入尺寸不匹配。

ValueError: Error when checking input: expected input_1 to have 4 dimensions, but got array with shape (224, 224, 3)

如何实现批量预测?

【问题讨论】:

  • 您的网络是否适用于批量大小 > 1 的输入? faces[0].shape 的形状为 (1, 224, 224, 3)。形状不应该是(224, 224, 3)吗?
  • 能否请您发布输入张量的形状?
  • 我不明白反对票。请告诉我如何改进这个问题。
  • 如果你的输入层的形状是(None, 224, 224, 3),为什么是faces[0].shape(1, 224, 224, 3)?不应该是(224, 224, 3),这样当三个这样的面被添加到一个列表中时——[face, face, face]faces 的形状可以被解释为(3, 224,224, 3)
  • 我已经编辑了整个问题并包含了所有细节。 :)

标签: python tensorflow keras


【解决方案1】:

在这种情况下,model.predict() 函数的输入需要以 (N, 224, 224, 3) 形状的 numpy 数组形式给出,其中 N 是输入图像的数量。

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

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

【讨论】:

    猜你喜欢
    • 2021-01-15
    • 2022-11-11
    • 1970-01-01
    • 2018-11-23
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    相关资源
    最近更新 更多