Как сопоставить губы в двух гранях (динамическое положение) в теноре Кераса, чтобы создать функцию потерь? - PullRequest
0 голосов
/ 01 октября 2019

Мне нужно извлечь губы из двух входных изображений, сделать смешивание двух изображений, а затем сделать среднеквадратическую ошибку первого входного изображения в смешанном изображении. Я написал код для извлечения губ, используя dlib, чтобы получить 68 баллов, и у меня есть код для сопоставления гистограммы, однако мой подход к вычислению потерь кажется неправильным.

Моя пользовательская функция потерь принимает y_pred и y_actual. Он извлекает губы из y_actual и y_pred. Метод терпит неудачу, потому что dlib говорит, что вход является тензором, и он ожидает изображение.

Точная ошибка:

Invoked with: <dlib.fhog_object_detector object at 0x7f9b6dad1880>, <tf.Tensor 'model_1_target_6:0' shape=(?, ?, ?, ?) dtype=float32>

Я предполагаю, что функция потерь заключается в том, что я могу передавать изображения для сравнения, а ошибка говорит, что она дает тензор. Либо мне нужен механизм для преобразования тензора в изображение, либо вызов этого метода во время выполнения. Я не уверен в правильном решении, и у меня нет решения.

часть метода составной модели:

    model = Model([input_A, input_B_makeup], [out1_A_makeup, out1_B])
    opt = Adam(lr=0.0002, beta_1=0.5)
    model.compile(loss=[makeup_lipstick_loss, makeup_lipstick_loss], loss_weights=[1, 1], optimizer=opt)

Часть метода поезда:

        g_loss, _, _  = c_model.train_on_batch([X_real_A, X_real_B_makeup], [X_real_B_makeup, X_real_A])

метод потерь:

def makeup_lipstick_loss(y_true, y_pred):
    makeup_y_true = get_lips_for_face(y_true)
    makeup_y_pred = get_lips_for_face(y_pred)
    mixed_image = mix_image(makeup_y_pred, makeup_y_true)
    return mean_squared_error (makeup_y_pred, mixed_image)

get_lips_for_face метод:

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('./shape_predictor_68_face_landmarks.dat')
def get_lips_for_face (anImage):
    rects = detector(anImage)
    shape = predictor(anImage, rects[0])
    points = face_utils.shape_to_np(shape)
    both_lips_index = np.array([49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 49])
    both_lips_coordinates = points[both_lips_index-1]
    x,y,w,h = cv2.boundingRect(both_lips_coordinates)
    return img[y:y+h, x:x+w]

Моя функция потерь должна выполнять смешение реального и созданного изображения, а затем сравнивать с созданным изображением. Ошибка - моя потеря. Как мне этого добиться?

...