Мне нужно извлечь губы из двух входных изображений, сделать смешивание двух изображений, а затем сделать среднеквадратическую ошибку первого входного изображения в смешанном изображении. Я написал код для извлечения губ, используя 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]
Моя функция потерь должна выполнять смешение реального и созданного изображения, а затем сравнивать с созданным изображением. Ошибка - моя потеря. Как мне этого добиться?