【问题标题】:Keras, Face Detection with only one imageKeras,只有一张图像的人脸检测
【发布时间】:2020-01-26 02:59:54
【问题描述】:

我是对象检测的新手。而且我不知道如何训练模型来识别图片中的人脸。 mnist 教程和预训练模型教程有很多,但没有这样的案例。

我将为我的问题分配数字。

folderpath = "G:/Datasets/FACE/"
face = "face.JPG"
people = "people.JPG"

maskdict = {}
nfaces = 0

image= Image.open(folderpath+face)
image = image.convert('L')
image= np.array(image)
print(image.shape) # (239, 162)

我把人脸变成了灰度,这样操作起来会更容易。

def create_mask(image, plotimg=False):
    height, width = image.shape
    mask = np.empty((height, width))
    topcroph = int(height*0.9)
    botcroph = height-topcroph
    rightcropw = int(width*0.9)
    leftcropw = width - rightcropw

    mask[botcroph:topcroph, leftcropw:rightcropw] = 1
    img = image.copy()
    if plotimg:
        img[botcroph:topcroph, leftcropw:rightcropw] = 1
        plt.imshow(img, cmap='gray')
    return mask.astype(np.uint8)

创建蒙版

假设输入总是一张特写脸,create_mask 函数会在脸部所在的位置非常粗略地创建一个遮罩,因此我可以将该遮罩用作“y”(标签)

1- 这是为检测创建“y”(标签)的正确方法吗?

def resizer(img, msk, size):
    img = np.array(Image.fromarray(img).resize((size,size)))
    msk = np.array(Image.fromarray(msk).resize((size,size)))
    return img, msk

调整图像和它的遮罩的大小。

mask = create_mask(image, plotimg=True)
img, msk = resizer(image, mask, 128) # img & mask.shape would be (128,128)

img = np.expand_dims(img, axis=2) # add one more dimension
msk = np.expand_dims(msk, axis=2) # (128, 128, 1)

增强

在下面的代码中,我想将图像相乘,所以我可以有一个数据集。

2- 从技术上讲,你不能用一张图像进行训练,对吧?

datasize=120
data = np.empty((datasize, 128, 128, 1))
maskage = np.empty((datasize, 128, 128, 1))
for i in range(0, 40):
    np.random.seed(i)
    img_r = keras.preprocessing.image.random_rotation(img, 30)
    msk_r = keras.preprocessing.image.random_rotation(msk, 30)
    maskage[i,:,:] = msk_r
    data[i,:,:] = img_r
for i in range(40,80):
    np.random.seed(i)
    img_b = keras.preprocessing.image.random_brightness(img, (.5, 1.5))
    maskage[i,:,:] = msk
    data[i,:,:] = img_b
for i in range(80,120):
    np.random.seed(i)
    img_z = keras.preprocessing.image.random_zoom(img, (.7, 1))
    msk_r = keras.preprocessing.image.random_zoom(msk, (.7, 1))
    data[i,:,:] = img_z
    maskage[i,:,:] = msk_r

型号

Keras 模型抛出 ValueError。我不知道如何配置图层,这是如何工作的?

from keras import layers
from keras import models
from keras import optimizers

model = models.Sequential()
model.add(layers.Conv2D(16, (3,3), padding="same", input_shape=(128,128,1)))
model.add(layers.Activation('relu'))

model.add(layers.Conv2D(16, (3,3), padding="same"))
model.add(layers.Activation("sigmoid"))

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
model.summary()

    _________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 128, 128, 16)      160       
_________________________________________________________________
activation_1 (Activation)    (None, 128, 128, 16)      0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 128, 128, 16)      2320      
_________________________________________________________________
activation_2 (Activation)    (None, 128, 128, 16)      0         
=================================================================
Total params: 2,480
Trainable params: 2,480
Non-trainable params: 0

# Input shapes are:
data.shape  # (120, 128, 128, 1) 
maskage.shape  # (120, 128, 128, 1)

#Run the model
model.fit(data, maskage)

ValueError:检查目标时出错:预期activation_6 有 形状 (128, 128, 16) 但得到了形状为 (128, 128, 1) 的数组

3.此时我该怎么办?

4.即使模型设法训练,“people.JPG”上的 model.predict 会起作用吗? 如何在人脸预测输出上绘制一个矩形?这种方法行得通吗?

编辑:在我将第二个 conv2d 层变量从 16 更改为 1 后,模型开始训练。但它找不到人脸。

【问题讨论】:

    标签: python keras object-detection


    【解决方案1】:

    在开始你的问题之前,让我更清楚一些重要的事情。据我了解,您的目标是同时实现classificationlocalization。这两者都需要不同的模型进行训练,从头开始更先进。假设您只需要分类,让我尝试回答您的问题。

    1) y 标签应该是您的情况的二进制 facebackground 并且这些应该是一维列数组。

    2) 是的,您是对的,翻转或旋转图像是丰富数据集的好策略。

    3) 这个错误是因为model.fit(data, maskage) 的第二个参数,即ma​​skage。由于您的标签需要是一列,而不是 128x128x1 数组,因此会出现此错误。

    4) 正如我在问题之前解释的那样,这种方法不起作用。您正在寻找localizationclassification

    据我了解,您已经检查了 MNIST 教程来修改您的问题,但首先也是最重要的事情是您应该更改 y 标签。此外,由于我没有足够的知识来正确定位对象,因此我无法提供有关您如何成功完成项目的本地化部分的太多信息。

    编辑:对于不熟悉localization 的人,link 中有一个有用的 Keras 指南

    【讨论】:

    • 感谢您提供有用的见解,1-) 为什么需要 1D?我知道密集层需要 1D 但 conv2d 需要 2d,对吗? 3-) 在我将第二个 conv2d 层的变量从 16 更改为 1 后,模型开始工作。我会尝试你的方式来理解这个问题。 Teşekkürler,
    • 例如,假设我们在 MNIST [link]keras.io/examples/mnist_cnn 中。如果您可以删除模型和拟合部分并添加print(y_label.shape),您将遇到 y_label 形状为 (60000, 10) 即图像存在 10 类。用不用conv2d没关系,就是简单的矩阵乘法,原理是一样的。这意味着您应该始终枚举您的类名。
    猜你喜欢
    • 1970-01-01
    • 2020-10-24
    • 2019-12-01
    • 2010-11-10
    • 2019-12-03
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 2013-11-14
    相关资源
    最近更新 更多