Skip to content

EfficientNet-B3 API

The inference endpoint is a POST endpoint that accepts multiple content-type for different image types and other query options.

Content-type: image/png and image/jpeg

The simplest content-type supported are image/jpeg and image/png images.

The image have to be added to the request body in binary format. The response will be the top-k predictions for the given image.

Using the boto3 python library:

Python
import boto3

client = boto3.client("sagemaker-runtime")
endpoint_name = "efficientnet-b3"

content_type = "image/jpeg"

with open("validation/horses.jpg", "rb") as f:
    payload = f.read()
    payload = bytearray(payload)

response = client.invoke_endpoint(
    EndpointName=endpoint_name, ContentType=content_type, Body=payload
)

print(response["Body"].read())
Text Only
["sorrel","cowboy hat, ten-gallon hat","hartebeest","worm fence, snake fence, snake-rail fence, Virginia fence","horse cart, horse-cart"]

Using the AWS CLI.

Text Only
aws sagemaker-runtime invoke-endpoint \
    --endpoint-name efficientnet-b3 \
    --content-type image/jpeg \
    --body fileb://./horses.jpg >(cat)

In cURL it will be like doing doing:

Text Only
curl -X POST "https://runtime.sagemaker.us-east-1.amazonaws.com/endpoints/efficientnet-b3/invocations" \
  -H  "Content-Type: image/jpeg" \
  --data-binary "@horses.jpg"
Text Only
["sorrel","cowboy hat, ten-gallon hat","hartebeest","worm fence, snake fence, snake-rail fence, Virginia fence","horse cart, horse-cart"]

Note that this command requires modification to authenticate the request with AWS Signature Version 4

Content-type: multipart/form-data

The enpoint also allows for the content-type: multipart/form-data.

This allows users to send multiple images and get labels for each image in one single request.

We use requests to easily construct the body of a multipart/form-data request.

Python
import boto3
import requests

r = requests.Request(
    "POST",
    "http://localhost:8080/invocations",
    files={
        "image1": open("validation/horses.jpg", "rb"),
        "image2": open("validation/koala.jpg", "rb"),
        "image3": open("validation/panda.jpg", "rb"),
    },
)
r = r.prepare()

content_type = r.headers["Content-Type"]
payload = r.body

# Make query

client = boto3.client("sagemaker-runtime")
endpoint_name = "efficientnet-b3"

response = client.invoke_endpoint(
    EndpointName=endpoint_name, ContentType=content_type, Body=payload
)

print(response["Body"].read())
Text Only
{
  "image1": ["sorrel","cowboy hat, ten-gallon hat","hartebeest","worm fence, snake fence, snake-rail fence, Virginia fence","horse cart, horse-cart"],
  "image2": ["koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus","wombat","indri, indris, Indri indri, Indri brevicaudatus","teddy, teddy bear","Madagascar cat, ring-tailed lemur, Lemur catta"],
  "image3": ["giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca","Arctic fox, white fox, Alopex lagopus","ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus","lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens","white wolf, Arctic wolf, Canis lupus tundrarum"]
}

Using cURL it will be like doing doing:

Text Only
curl -X POST "https://runtime.sagemaker.us-east-1.amazonaws.com/endpoints/efficientnet-b3/invocations" \
  -H  "Content-Type: multipart/form-data" \
  -F "[email protected];type=image/jpeg" \
  -F "[email protected];type=image/jpeg" \
  -F "[email protected];type=image/jpeg"
Text Only
{
  "image1": ["sorrel","cowboy hat, ten-gallon hat","hartebeest","worm fence, snake fence, snake-rail fence, Virginia fence","horse cart, horse-cart"],
  "image2": ["koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus","wombat","indri, indris, Indri indri, Indri brevicaudatus","teddy, teddy bear","Madagascar cat, ring-tailed lemur, Lemur catta"],
  "image3": ["giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca","Arctic fox, white fox, Alopex lagopus","ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus","lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens","white wolf, Arctic wolf, Canis lupus tundrarum"]
}

Note that this command requires modification to authenticate the request with AWS Signature Version 4.

Custom Attributes

The API accepts the AWS Custom-Attributes header from SageMaker to control the different attributes of the model.

This header should be JSON formated string with the different values for the parameters.

Param Default Description
top_k 5 Top number of label to return

For example a to get the top-1 reply instead of the default of 5:

Text Only
X-Amzn-SageMaker-Custom-Attributes: {"top_k": 1}

For example to just get one reply:

Using the boto3 python library:

Python
import boto3

client = boto3.client("sagemaker-runtime")
endpoint_name = "efficientnet-b3"

content_type = "image/jpeg"
custom_attributes = '{"top_k": 1}'

with open("validation/horses.jpg", "rb") as f:
    payload = f.read()
    payload = bytearray(payload)

response = client.invoke_endpoint(
    EndpointName=endpoint_name,
    ContentType=content_type,
    CustomAttributes=custom_attributes
    Body=payload,
)

print(response["Body"].read())
Text Only
["sorrel"]