Керас, распознавание лиц только с одним изображением - PullRequest
0 голосов
/ 26 сентября 2019

Я новичок в обнаружении объектов.И я не могу понять, как обучить модель распознавать лицо на картинке.Существует много обучающих программ по 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. Но он не может найти лицо.

Я ценюлюбая помощь!Спасибо!

1 Ответ

3 голосов
/ 26 сентября 2019

Перед тем, как начать свои вопросы, позвольте мне кое-что прояснить.Насколько я понимаю, ваша цель - достичь как classification, так и localization.Обе эти модели нуждаются в обучении различным моделям, и начинать с нуля гораздо сложнее.Предполагая, что вам нужна только классификация, позвольте мне ответить на ваши вопросы.

1) метки y должны быть двоичными для вашего случая face или background, и это должен быть массив столбцов 1D.

2) Да, вы правы, переворачивание или поворот изображения - это хорошая стратегия для обогащения вашего набора данных.

3) Эта ошибка возникает из-за второго аргумента model.fit(data, maskage), то есть maskage ,Так как ваша метка должна быть столбцом, а не массивом 128x128x1, возникает эта ошибка.

4) Этот метод не будет работать, как я объяснил перед вопросами.Вы ищете localization и classification

Насколько я понимаю, вы проверили учебные пособия по MNIST, чтобы изменить свою проблему, но прежде всего вы должны изменить метки y.Кроме того, поскольку у меня недостаточно знаний для правильной локализации объектов, я не смогу дать много информации о том, как вы преуспели в части вашего проекта по локализации.

Удачи с этим,

Сайгилар.

...