Skip to content
imaged

2D facial landmarks

InsightFace 2D landmarks (106)

Dense 106-point face landmarks from an aligned crop.

MIT
Explore model

About this model

InsightFace's 2d106det model from the buffalo_l pack. Around 4.8 MB on disk. The output is 106 (x, y) points covering eyes, brows, nose, mouth, and jawline contour.

Use the points to drive AR overlays, beauty filters, or stable face tracking. Project them back to original-image coords by inverting the 5-point alignment affine.

What you can build

  • Place AR makeup or stickers on the right facial features in real time.
  • Drive a face-mesh animation rig from a phone camera.
  • Track lip and brow movement for an expression-driven avatar.
  • Stabilize a face crop across video frames using consistent points.

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 106 yellow landmark dots drawn over the face.

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.landmarks2d.model", "weights/2d106det.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_2d") {
        auto& dr = std::get<imaged::SDK::DetectionResult>(sub);
        auto& points = dr.detections[0].keypoints;  // 106 points
    }
}