我正在构建一个人脸检测器,但我在调整捕获帧的大小以匹配模型的大小时遇到​​了挑战,因此出现以下错误

问题描述

这是产生错误代码

这是我模型基础的结构。我导入了 MobileNetV2,但我忽略了顶层。

baseModel = MobileNetV2(weights="imagenet",include_top=False,input_tensor=Input(shape=(224,224,3)))

然后我现在正在用 opencv 创建一个人脸检测器。人脸检测器捕获人脸,模型预测人脸是否戴着口罩。

下面的这一行产生了错误,因为我没有将捕获的图像帧调整为模型输入的适当大小。

for (x,y,w,h) in faces:
    
        face_img = grayscale_img[y:y+w,x:x+w]
        resized_img = cv2.resize(face_img,(56,56))
        normalized_img = resized_img/255.0
        reshaped_img = np.reshape(normalized_img,(224,3))
        result=model.predict(reshaped_img)

产生的错误如下

ValueError: 无法将大小为 3136 的数组重塑为形状 (224,3)

重塑这个 img 的正确方法是什么?谢谢

解决方法

该错误看起来像是数组可能只有一维,而不管没有足够的像素来组成 224x224x3 的图像。

如果面部图像是灰度的,那么您将无法将其重塑为 3 个通道,您必须将其复制到其他 3 个通道:

grayscale_img = grayscale_img[y:y+w,x:x+w]
face_img = np.stack([grayscale_img,grayscale_img,grayscale_img],axis= -1)## three channels

或者在创建模型时使用以下方法将模型的顶部转换为单个通道(我不确定):

input_tensor=Input(shape=(224,224,1)

然后您可以使用 opencv 或 np 来调整图像的宽度和高度:

resized_img = cv2.resize(face_img,(224,224)) ## opencv

MobileNetv2 需要在 (-1,1) 之间进行归一化,因此:

normalized_img = resized_img/128 -1

你可能想看看:

https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet_example.ipynb

如果您的灰度图像非常小,您可能需要尝试调整模型以接受较小的图像而不是放大它们

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...