Rekognition's Pretrained Vision Model Surface
Amazon Rekognition is not one model. It is two different products wearing the same SDK client.
Search across all documentation pages
Amazon Rekognition is not one model. It is two different products wearing the same SDK client.
The first is a set of pretrained computer vision models AWS built, trained, and maintains for you. You call an operation, send an image or video, and get labels, faces, or moderation flags back. No training step, no dataset of your own, no model to manage.
The second is Custom Labels: a managed pipeline for training a model on images you provide, for things the general models were never trained to recognize - your product packaging, a specific machine part, a company logo.
Knowing which surface a task belongs to is the first decision every Rekognition integration makes.
The pretrained surface is what most integrations use. It is a family of Detect*, Compare*, and Recognize* operations, each backed by a model AWS trained on datasets far larger than any single customer could assemble.
DetectLabels finds objects, scenes, and concepts in an image - "Dog", "Beach", "Vehicle". DetectFaces locates faces and returns attributes like age range, emotions, and landmarks. CompareFaces measures similarity between two face images. DetectModerationLabels flags unsafe or inappropriate content. There are others - DetectText, RecognizeCelebrities, DetectProtectiveEquipment - but they follow the same pattern: send an image, get structured results, pay per image.
None of this requires you to provide training examples. AWS already trained the model; you are only calling it.
Custom Labels is a different animal. It exists for the gap pretrained models leave: things that are specific to your business rather than general categories of the visual world. A defect on your manufacturing line, your company's logo on a photo, a specific retail product on a shelf - these are not concepts a general model was ever taught, no matter how large its training set.
To use Custom Labels you supply your own labeled images, and Rekognition trains a model version scoped to your project. It is a managed pipeline, not an instant API call.
The pretrained operations are synchronous for images: you call DetectLabels (or DetectFaces, CompareFaces, DetectModerationLabels) with image bytes or a reference to an S3 object, and the response comes back in the same request.
# --- Python (boto3) ---
import boto3
rekognition = boto3.client("rekognition")
response = rekognition.detect_labels(
Image={"S3Object": {"Bucket": "my-bucket", "Name": "photo.jpg"}},
MaxLabels=10,
MinConfidence=75,
)
for label in response["Labels"]:
print(label["Name"], label["Confidence"])// --- TypeScript (AWS SDK v3) ---
import { RekognitionClient, DetectLabelsCommand } from "@aws-sdk/client-rekognition";
const rekognition = new RekognitionClient({});
const response = await rekognition.send(new DetectLabelsCommand({
Image: { S3Object: { Bucket: "my-bucket", Name: "photo.jpg" } },
MaxLabels: 10,
MinConfidence: 75,
}));
for (const label of response.Labels ?? []) console.log(label.Name, label.Confidence);Video is a separate story on both surfaces. There is no synchronous "analyze this video" call - video files can run for hours, so every video operation is asynchronous. You call StartLabelDetection (or StartFaceDetection, StartContentModeration, StartPersonTracking) with a video already sitting in S3, get back a JobId, and poll GetLabelDetection (or the matching Get* operation) until JobStatus reaches SUCCEEDED.
Custom Labels layers a full lifecycle on top of the same client. CreateProject establishes a container for your work. CreateProjectVersion trains a model version against your labeled images - this can take from tens of minutes to hours and is billed as training time. StartProjectVersion brings a trained version online for inference, and only while it is running can you call DetectCustomLabels against it. StopProjectVersion takes it back offline, which matters because inference capacity bills by the hour whether or not you are sending requests.
Nothing about pretrained detection ever "starts" or "stops" - it is stateless, always available, and billed per image or per minute of video processed.
The decision of which surface to use comes down to one question: is the thing you need to detect a category a general vision model would already know, or is it specific to your data?
| Surface | Setup | Billing | Fits |
|---|---|---|---|
| Pretrained (Detect*/Compare*) | None - call the operation | Per image or per minute of video | General objects, scenes, faces, text, moderation |
| Custom Labels | Label images, train a project version | Training hours + inference hours while the version is running | Your logo, product, defect, or domain-specific object |
A common pattern combines both: run DetectLabels first for cheap, general triage, and only escalate to a Custom Labels model for the narrower, business-specific classification the general model cannot make.
Because Custom Labels inference bills while a version is running, production systems typically start the version at the beginning of a batch job or behind a scaling policy tied to demand, then stop it when idle - leaving it running 24/7 for occasional requests is a common cost mistake.
Responsible use matters on both surfaces, but especially anywhere face analysis or comparison feeds a decision about a person. Attribute predictions (age range, emotions) and similarity scores are probabilistic and carry documented accuracy variance across demographics. Treat a CompareFaces or DetectFaces result as one signal among several for anything consequential, apply a deliberately chosen confidence threshold, and keep a human in the loop for high-stakes outcomes rather than auto-actioning on a raw score.
DetectLabels or DetectFaces for anything general, and reserve Custom Labels for domain-specific gaps.StartProjectVersion before inference, and it bills while running whether or not you call it.No. These are pretrained operations - AWS trained the underlying model. You call the operation directly with an image and get results back in the same request.
When the thing you need to recognize is specific to your business - a logo, a proprietary part, a defect type - rather than a general object, scene, or concept a broad vision model would already know.
Training (CreateProjectVersion) is a long-running job you poll for completion. Once a version is started with StartProjectVersion, inference via DetectCustomLabels is synchronous per image, same as the pretrained operations.
A trained model version must be deployed to inference capacity before it can serve requests. That capacity bills by the hour, so Rekognition keeps it explicitly on/off rather than always-on.
Both surfaces have video equivalents, but all of them - StartLabelDetection, StartFaceDetection, StartContentModeration, and Custom Labels video analysis - are asynchronous jobs, never a single synchronous call.
No. The pretrained operations are fixed models you cannot retrain or adjust beyond input parameters like MinConfidence. To teach the service something new, you build a Custom Labels project.
AWS recommends a minimum of a few dozen images per label to start, with more improving accuracy - the exact number depends on how visually distinct your categories are.
Treat it as one input to a human-reviewed decision, not an automatic gate, particularly for high-stakes outcomes. Similarity and attribute scores carry documented accuracy variance and should be paired with a deliberate confidence threshold.
Yes. Both boto3's rekognition client and the RekognitionClient from @aws-sdk/client-rekognition expose operations from both surfaces - the split is conceptual, not a different SDK.
DetectLabels call.Stack versions: This page was written for boto3 1.43.x (Python 3.10+) and the AWS SDK for JavaScript v3 (Node.js 18+).
Reviewed by Chris St. John·Last updated Jul 24, 2026