dlib 68 cara hito puntos son inexactos cuando la cabeza del rollo de ángulo NO es entre -30 a 30 grados

Estoy tratando de detectar caras y extraer facial monumentos de la cámara del iphone(BGRA-formato) utilizando dlib.

Hasta el momento, lo hice para detectar la cara rects de AVMetaData y dibujar 68 dlib puntos de referencia dentro de los límites de la imagen. Cuando se detecta en la cabeza del rollo de ángulo (roll-ángulo de datos se extraen de AVMetadata así) es approxiamtely entre -30 a 30 grados, todo funciona bien. Sin embargo, si la detecta cabeza rollos de más de 30 grados, el facial monumentos no se alinean correctamente en todos. Los 68 puntos dejaría de girar a lo largo de la cabeza, diciendo que me voy a celebrar mi iphone en orientación horizontal en el modo con el botón de inicio en la izquierda y la cámara frontal, el 68-dibujado-puntos de cara estancias frontal.

He probado con openGL(fuera de la pantalla de presentación) y openCV para la representación de imágenes de vídeo, todos ellos generan los mismos resultados. La representación de enfoque parece irrelavant a mi problema.

Mis preguntas son

  1. ¿Cómo puedo alinear correctamente los dlib generado 68 puntos, a pesar de la cabeza rollo de ángulo?
  2. O, si es posible para dlib para detectar con precisión ninguna de las caras que los rollos de más de 30 grados?

- (NSMutableArray <NSMutableArray <NSValue *> *>*)detecitonOnSampleBuffer:(CMSampleBufferRef)sampleBuffer inRects:(NSArray<NSValue *> *)rects {

    dlib::array2d<dlib::bgr_pixel> img;
    dlib::array2d<dlib::bgr_pixel> img_gray;
    // MARK: magic
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    CVPixelBufferLockBaseAddress(imageBuffer, kCVPixelBufferLock_ReadOnly);

    size_t width = CVPixelBufferGetWidth(imageBuffer);
    size_t height = CVPixelBufferGetHeight(imageBuffer);
    char *baseBuffer = (char *)CVPixelBufferGetBaseAddress(imageBuffer);

    // set_size expects rows, cols format
    img.set_size(height, width);

    // copy samplebuffer image data into dlib image format
    img.reset();


    long position = 0;
    while (img.move_next()) {
        dlib::bgr_pixel& pixel = img.element();

        // assuming bgra format here
        long bufferLocation = position * 4; //(row * width + column) * 4;
        char b = baseBuffer[bufferLocation];
        char g = baseBuffer[bufferLocation + 1];
        char r = baseBuffer[bufferLocation + 2];
        dlib::bgr_pixel newpixel(b, g, r);
        pixel = newpixel;

        position++;
    }

    // unlock buffer again until we need it again
    CVPixelBufferUnlockBaseAddress(imageBuffer, kCVPixelBufferLock_ReadOnly);



    // convert the face bounds list to dlib format
    std::vector<dlib::rectangle> convertedRectangles = [self convertCGRectValueArray:rects bound:CGSizeMake(height, width)];
    dlib::assign_image(img_gray, img);

    NSMutableArray *facesLandmarks = [NSMutableArray arrayWithCapacity:0];
    for (unsigned long j = 0; j < convertedRectangles.size(); ++j) {
        /* original codes start from here */
        dlib::rectangle oneFaceRect = convertedRectangles[j];

        // detect all landmarks
        dlib::full_object_detection shape = predictor(img, oneFaceRect);
        NSMutableArray *eachFaceLandmarks = [NSMutableArray arrayWithCapacity:0];
        for (int i = 0; i < shape.num_parts(); i++) {
            dlib::point p = shape.part(i);
            [eachFaceLandmarks addObject:[NSValue valueWithCGPoint:CGPointMake(p.x(), p.y())]];
        }

        //
        [facesLandmarks addObject:eachFaceLandmarks];
    }

    return facesLandmarks;
}