Keras TypeError: несовместимые аргументы функции (модель dlib) - PullRequest
1 голос
/ 19 сентября 2019

Я генерирую некоторые изображения лица, используя 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) тензор, но если это не так, тогда ондолжен был выполнить определение ориентиров на этапе выполнения графа, но он выполняет код даже на этапе определения графа.

...