Skip to content
imaged

3D facial landmarks

InsightFace 3D landmarks (68)

68 face landmarks with a depth axis, from an aligned crop.

MIT
Explore model

About this model

InsightFace's 1k3d68 model from the buffalo_l pack. Around 137 MB on disk, the largest of the three face_attributes heads. Output is 68 (x, y, z) points; the z component supports head-pose estimation.

The 88 ms warm budget for the combined attributes pass is dominated by this head. Skip it if 2D landmarks are enough; the family loads only the heads you configure.

What you can build

  • Estimate head pose for a 3D avatar that follows the user's gaze.
  • Build a head-tilt control for an accessibility input scheme.
  • Mesh-fit a 3D face for AR try-on of glasses or hats.
  • Drive a parallax effect from real head movement on a webcam.

Variants & downloads

Choose the build for your app

Model files are being prepared.

Explore the model’s examples, source links, and integration notes while download variants are added.

Example inference

Input
A frontal portrait of Albert Einstein from Wikimedia Commons.
Output
The portrait with green 3D landmark dots projected to 2D.

Performance

Results depend on the device, runtime, and test conditions. Each measurement keeps its own context.

M1 Max, macOS 15, ONNX Runtime 1.17 (combined attributes pass)

See original catalog hardware notes · CPU

88.5 ms

Warm inference

Catalog reference · variant unspecifiedCold start (ms): 91.93

Reference result from the existing catalog; conversion variant and measurement date were not recorded.

Integration examples

Vision SDK integration

cpp

#include "imaged/sdk.hpp"
#include "imaged/families/face_attributes/face_attributes_family.hpp"

imaged::SDK::AI ai;
auto& config = ai.getOptions();
config.set("face_attributes.landmarks3d.model", "weights/1k3d68.onnx");

imaged::SDK::FaceAttributesFamily family;
family.load(config);

imaged::SDK::Image alignedFace;
alignedFace.load("aligned_112x112.jpg");

auto result = std::get<imaged::SDK::MultiTaskResult>(family.run({&alignedFace}));
for (const auto& [name, sub] : result.tasks) {
    if (name == "landmarks_3d") {
        auto& dr = std::get<imaged::SDK::DetectionResult>(sub);
        auto& points = dr.detections[0].keypoints;  // 68 points with z
    }
}