Я генерирую некоторые изображения лица, используя Conv2DTranspose
, за которым следует 1x1 Conv2D
.Мне нужен пользовательский слой Keras для обнаружения лиц, который позже будет использоваться для генерации ориентиров лица для моей функции потери.
Я использовал dlib.cnn_face_detection_model_v1
для обнаружения лиц, но проблема в том, что он принимает только списки или массивы, а не тензоры.Кроме того, на этапе определения графа тензоры еще не получают никаких значений.Итак, он продолжает выдавать мне эту ошибку:
TypeError: __call__(): incompatible function arguments. The following argument types are supported:
1. (self: dlib.cnn_face_detection_model_v1, imgs: list, upsample_num_times: int=0, batch_size: int=128) -> std::vector<std::vector<dlib::mmod_rect,std::allocator<dlib::mmod_rect> >,std::allocator<std::vector<dlib::mmod_rect,std::allocator<dlib::mmod_rect> > > >
2. (self: dlib.cnn_face_detection_model_v1, img: array, upsample_num_times: int=0) -> std::vector<dlib::mmod_rect,std::allocator<dlib::mmod_rect> >
Invoked with: <dlib.cnn_face_detection_model_v1 object at 0x0000013474884D50>, <tf.Tensor 'conv2d/BiasAdd:0' shape=(?, 160, 160, 3) dtype=float32>, 1
Did you forget to `#include <pybind11/stl.h>`? Or <pybind11/complex.h>,
<pybind11/functional.h>, <pybind11/chrono.h>, etc. Some automatic
conversions are optional and require extra headers to be included
when compiling your pybind11 module.
Вот как я определил свой слой детектора ориентиров:
class landmarks_layer(Layer):
def __init__(self, num_outputs):
super(landmarks_layer, self).__init__()
self.num_outputs = num_outputs
def call(self, input_):
landmarks = find_landmarks68(input_)
return landmarks
и вот моя функция для обнаружения ориентиров:
def find_landmarks68(img):
cnn_face_detector =
dlib.cnn_face_detection_model_v1('mmod_human_face_detector.dat')
dets = cnn_face_detector(img, 1)
rects = dlib.rectangles()
rects.extend([d.rect for d in dets])
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
shape = predictor(img, rects[0])
(img_y,img_x,img_z) = img.shape
landmarks = []
for i in shape.parts():
landmarks.append([i.y, i.x])
return landmarks
Я ожидал, что слой вернет (None, 68, 2) тензор на этапе определения графа, но он выполняет код, и когда он сталкивается с тензором без значения, он выдает мне ошибку.Итак, я застрял в стадии обнаружения лица прямо сейчас, и он не переходит к обнаружению ориентиров.Я подумал, что должен был использовать tf.cond
для проверки того, является ли номер партии None или нет, и если это так, я не знаю, он просто возвращает (None, 68, 2) тензор, но если это не так, тогда ондолжен был выполнить определение ориентиров на этапе выполнения графа, но он выполняет код даже на этапе определения графа.