<!-- # hard line break macro for HTML -->

<a id="running-inference-keypoints"></a>

# Inference for Keypoints

Pose and landmark models label each sample with a [`Keypoints`](../../api/fiftyone.core.labels.md#fiftyone.core.labels.Keypoints) field, which
you generate by passing a model to
[`apply_model()`](../../api/fiftyone.core.collections.md#fiftyone.core.collections.SampleCollection.apply_model).

The [Ultralytics integration](../../integrations/ultralytics.md#ultralytics-integration) shows this in
practice: a YOLO pose model can be passed directly to `apply_model()` with no
wrapping required, producing keypoints that render with FiftyOne’s built-in
skeleton support.

<div style="margin:0; display:inline-block;">
    <a href="../../integrations/ultralytics.html#ultralytics-keypoints" class="sd-btn sd-btn-primary book-a-demo" rel="noopener noreferrer" data-cta-dynamic="true">
        <div class="arrow">
            <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="size-3">
            <path stroke="currentColor" stroke-width="1.5"
                    d="M1.458 11.995h20.125M11.52 22.063 21.584 12 11.521 1.937"
                    vector-effect="non-scaling-stroke"></path>
            </svg>  
        </div>
        <div class="text">See Ultralytics keypoint inference</div>
    </a>
</div>

For a fully custom model, configure a
[`TorchImageModel`](../../api/fiftyone.utils.torch.md#fiftyone.utils.torch.TorchImageModel) with a
[`KeypointDetectorOutputProcessor`](../../api/fiftyone.utils.torch.md#fiftyone.utils.torch.KeypointDetectorOutputProcessor)
so it works with `apply_model()` directly, as described in
[Inference with custom models](index.md#running-inference-custom).
