> ## Documentation Index
>
> Fetch the complete documentation index at: https://lithi.ai/llms.txt
>
> Use this file to discover all available pages before exploring further.

---
title: Run vision observations across an image set
description: >-
  Run declared vision observations across an image set and keep the region
  evidence with every result. Confidence is reported, and a face region is never
  an identity.
route: /docs/compute/examples/vision-batch
page_id: docs-compute-examples-vision-batch
page_type: tutorial
content_layer: guided documentation
surface_profile: guided_docs
audience: Teams describing, sorting or indexing a large image set
voice: D
reader_question: What can a vision batch observe in my images, and what evidence comes back?
primary_action: Run a twenty-image vision test
source_locale: en-US
source_status: APPROVED
source_version: docs-compute-examples-vision-batch-en-us-2026-09-05-v1
last_updated: '2026-09-05'
robots: index
claim_registry_pinned: true
claim_registry_resync: "npm run governed:tsx -- scripts/build-compute-public-claim-registry.ts --write"
---

## What you get

Observations, each tied to the part of the image it came from.

- One row per image per observation in `data/part-*`, with the region in `lithi_evidence` and a score in `lithi_confidence`.
- Artifact outputs where the observation produces one: a cropped region, a segmentation mask or a set of keypoints.
- Images the run declined to judge in `abstentions/part-*`, and images it could not read in `failures/part-*`.
- `metrics.json`, so you can see how many images produced no observation at all.

An observation with no region is not checkable. Region evidence is what lets a person confirm a label in a second instead of squinting at a thumbnail.

## What you need

Twenty images, a manifest, and a decision about which observations you actually want.

```text
image_id,path,width,height,source
IMG-0001,catalog/chair-front.jpg,2400,1600,studio
IMG-0002,catalog/chair-detail.jpg,2400,1600,studio
IMG-0003,catalog/label-barcode.jpg,1200,900,studio
IMG-0004,field/warehouse-dim.jpg,1600,1200,phone
IMG-0005,field/blurred.jpg,800,600,phone
```

Declare `image_id` as your `item_id_field`. Image four is badly lit and image five is out of focus. Together they show what low confidence and abstention look like before you scale up.

Declare the observations you want rather than asking for everything. A workflow descriptor states which it supports. Those typically include labels, detected objects with regions, captions, barcodes, saliency, segmentation masks, pose keypoints and image similarity.

## Run it

1. Inspect locally: `lithi media inspect ./vision-fixture`. It reports formats, dimensions, color profiles and files that are not really images.
2. Read the workflow: `lithi workflow explain <workflow-id>`, and read exactly which observations and artifact outputs it declares.
3. Pin the output schema you want, with types, so a caption and a label never share an untyped column: [how output schemas are declared](/docs/compute/workflows/output-schemas).
4. Quote it: `lithi quote --workflow <workflow-id> --input ./vision-fixture/manifest.csv`. The quote gives a maximum charge and an expiry, and authorizes nothing.
5. Approve the quote separately, then submit with `lithi batch submit` and track with `lithi status <job-id>`.

## Read the result

Open `result-manifest.json` first, then check the image evidence before anything else.

Take five detections and open the cited region against the original image. If the region does not contain what the label claims, the observation is wrong however high the score is. Do the same for one mask and one keypoint set, because those fail in ways a bounding box does not.

Read the two hard images deliberately. Lower confidence on a blurred photo is correct behavior, and an abstention there is better than a confident guess. Look at how many images produced no observation, and decide whether that is the set or the thresholds.

Treat confidence as a comparison within one run, not as a probability you can quote. Set your own threshold against images you have labeled yourself.

## Where it stops

You get observations and artifacts. Nothing is published, filed, tagged in your own library or written back anywhere.

Detecting a face region is not recognizing a person. The run reports where a face appears in the frame. It does not name anyone, match anyone across images, or infer who they are. Do not build an identity on top of a region.

Send only images you are permitted to send, and choose the profile that matches that permission: [match your data profile to what you may send](/docs/compute/security/data-profiles).

No accuracy is promised. An observation is a measurement under your parameters, and a person decides what it means before it reaches anyone.
