Я новичок в обнаружении объектов.И я не могу понять, как обучить модель распознавать лицо на картинке.Существует много обучающих программ по 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
Модель
Керасмодель выдает 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.Даже если модели удастся потренироваться, будет ли model.predict на people.JPG работать?Как нарисовать прямоугольник на выходе с предсказанием лица?Будет ли этот метод работать?
Редактировать: модель начала тренироваться после того, как я изменил вторую переменную conv2d слоя с 16 на 1. Но он не может найти лицо.
Я ценюлюбая помощь!Спасибо!