简体   繁体   English

口罩识别。 错误 - “ValueError:层“model_1”需要 1 个输入,但它接收到 3 个输入张量”,因为帧中出现了多个面

[英]Mask Recognition. Error - "ValueError: Layer "model_1" expects 1 input(s), but it received 3 input tensors" as more than one face appears in frame

I am doing a real-time face mask recognition system and after two or more faces (this time 3, because it received 3 inputs) appear in the frame, this error stops the process.我正在做一个实时面罩识别系统,在两个或更多人脸(这次是 3 个,因为它收到 3 个输入)出现在框架中之后,这个错误会停止进程。

Error -错误 -

Traceback (most recent call last):
  File "C:\Users\___\Desktop\MD\test_mask_video.py", line 99, in <module>
    (locs, preds) = detect_and_predict_mask(frame, faceNet, maskNet)
  File "C:\Users\___\Desktop\MD\test_mask_video.py", line 68, in detect_and_predict_mask
    preds = maskNet.predict(faces)
  File "C:\Users\___\AppData\Local\Programs\Python\Python38\lib\site-packages\keras\utils\traceback_utils.py", line 67, in error_handler
    raise e.with_traceback(filtered_tb) from None
  File "C:\Users\___\AppData\Local\Programs\Python\Python38\lib\site-packages\tensorflow\python\framework\func_graph.py", line 1129, in autograph_handler
    raise e.ag_error_metadata.to_exception(e)
ValueError: in user code:

    File "C:\Users\___\AppData\Local\Programs\Python\Python38\lib\site-packages\keras\engine\training.py", line 1621, in predict_function  *
        return step_function(self, iterator)
    File "C:\Users\___\AppData\Local\Programs\Python\Python38\lib\site-packages\keras\engine\training.py", line 1611, in step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    File "C:\Users\___\AppData\Local\Programs\Python\Python38\lib\site-packages\keras\engine\training.py", line 1604, in run_step  **
        outputs = model.predict_step(data)
    File "C:\Users\___\AppData\Local\Programs\Python\Python38\lib\site-packages\keras\engine\training.py", line 1572, in predict_step
        return self(x, training=False)
    File "C:\Users\___\AppData\Local\Programs\Python\Python38\lib\site-packages\keras\utils\traceback_utils.py", line 67, in error_handler
        raise e.with_traceback(filtered_tb) from None
    File "C:\Users\___\AppData\Local\Programs\Python\Python38\lib\site-packages\keras\engine\input_spec.py", line 199, in assert_input_compatibility
        raise ValueError(f'Layer "{layer_name}" expects {len(input_spec)} input(s),'

    ValueError: Layer "model_1" expects 1 input(s), but it received 3 input tensors. Inputs received: [<tf.Tensor 'IteratorGetNext:0' shape=(None, 224, 224, 3) dtype=float32>, <tf.Tensor 'IteratorGetNext:1' shape=(None, 224, 224, 3) dtype=float32>, <tf.Tensor 'IteratorGetNext:2' shape=(None, 224, 224, 3) dtype=float32>]

My code -我的代码 -

confidence_arg = 0.5

def detect_and_predict_mask(frame, faceNet, maskNet):
    (h, w) = frame.shape[:2]
    blob = cv2.dnn.blobFromImage(frame, 1.0, (300, 300),
        (104.0, 177.0, 123.0))

    faceNet.setInput(blob)
    detections = faceNet.forward()

    faces = []
    locs = []
    preds = []

    for i in range(0, detections.shape[2]):
        confidence = detections[0, 0, i, 2]

        if confidence > confidence_arg:
            box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
            (startX, startY, endX, endY) = box.astype("int")

            (startX, startY) = (max(0, startX), max(0, startY))
            (endX, endY) = (min(w - 1, endX), min(h - 1, endY))

            face = frame[startY:endY, startX:endX]
            face = cv2.cvtColor(face, cv2.COLOR_BGR2RGB)
            face = cv2.resize(face, (224, 224))
            face = img_to_array(face)
            face = preprocess_input(face)
            face = np.expand_dims(face, axis=0)

            faces.append(face)
            locs.append((startX, startY, endX, endY))

    if len(faces) > 0:
        #for x in faces:
        preds = maskNet.predict(faces)

    return (locs, preds)

print("Loading face detector model...")
prototxtPath = 'face_detector/deploy.prototxt'
weightsPath = 'face_detector/res10_300x300_ssd_iter_140000.caffemodel'
faceNet = cv2.dnn.readNet(prototxtPath, weightsPath)

maskNet = load_model('model')


print("Starting video stream...")
vs = VideoStream(src=0).start()

while True:
    frame = vs.read()
    frame = imutils.resize(frame, width=800, height=320)

    (locs, preds) = detect_and_predict_mask(frame, faceNet, maskNet)
    print(locs, preds)

    for (box, pred) in zip(locs, preds):
        (startX, startY, endX, endY) = box

        (noproperMask, mask, withoutMask) = pred

        if (mask>withoutMask and mask>noproperMask):
            label = "Mask"
            color = (0, 255, 0)
        elif (withoutMask>mask and withoutMask>noproperMask):
            label = "No Mask"
            color = (0, 0, 255)

        cv2.putText(frame, label, (startX, startY - 10),
            cv2.FONT_HERSHEY_SIMPLEX, 0.45, color, 2)
        cv2.rectangle(frame, (startX, startY), (endX, endY), color, 2)

    cv2.imshow("Mask Detection System", frame)
    key = cv2.waitKey(1) & 0xFF

    if key == ord("q"):
        break

vs.stop()
cv2.destroyAllWindows()

I've tried to make a mask recognition as a for loop, but then it recognizes only one face at a time and doesn't want to recognize another second or more than this faces.我试图将面具识别作为一个for循环,但是它一次只能识别一张脸,并且不想再识别一秒钟或更多的脸。

Code of what I tried (line 36) -我尝试过的代码(第 36 行)-

for x in faces:
    preds = maskNet.predict(x)

Any help would be very appreciated!任何帮助将不胜感激!

try using尝试使用

preds = []
for x in faces:
    preds.append(maskNet.predict(x))
return locs,preds

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 ValueError:model 层需要 21 个输入,但它接收到 1 个输入张量 - ValueError: Layer model expects 21 input(s), but it received 1 input tensors ValueError:层顺序需要 1 个输入,但它收到 239 个输入张量 - ValueError: Layer sequential expects 1 input(s), but it received 239 input tensors ValueError:“顺序”层需要 1 个输入,但它收到了 10 个输入张量 - ValueError: Layer "sequential" expects 1 input(s), but it received 10 input tensors ValueError:层鉴别器需要 1 个输入,但它收到 2 个输入张量 - ValueError: Layer Discriminator expects 1 input(s), but it received 2 input tensors 尝试在 Tensorflow 中组合数字和文本特征:ValueError:层模型需要 2 个输入,但它接收到 1 个输入张量 - Attempting to Combine Numeric and Text Features in Tensorflow: ValueError: Layer model expects 2 input(s), but it received 1 input tensors 为什么在我拟合模型时代码会生成错误”ValueError:层“sequential_3”需要 1 个输入,但它接收到 2 个输入张量 - why may code generates the error while i fit the model" ValueError: Layer "sequential_3" expects 1 input(s), but it received 2 input tensors Python Keras Model -- ValueError: Layer sequential expects 1 input(s), but it received 16 input tensors - Python Keras Model -- ValueError: Layer sequential expects 1 input(s), but it received 16 input tensors 我的输入层需要是什么形状? 我不断收到 ValueError:层“模型”需要 1 个输入,但它收到了 2 个输入张量 - What shape does my Input layer need to be? I keep getting ValueError: Layer "model" expects 1 input(s), but it received 2 input tensors ValueError:“vq_vae”层需要 1 个输入,但它在 VQVAE 上接收到 2 个输入张量 - ValueError: Layer "vq_vae" expects 1 input(s), but it received 2 input tensors on a VQVAE ValueError:层顺序_16 需要 1 个输入,但它收到 8 个输入张量 - ValueError: Layer sequential_16 expects 1 input(s), but it received 8 input tensors
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM