【发布时间】: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