Optimize picture classification on AWS IoT Greengrass utilizing ONNX Runtime


Performing machine studying inference on edge units utilizing fashions skilled within the cloud has grow to be a well-liked use case in Web of Issues (IoT) because it brings the advantages of low latency, scalability, and price financial savings. When deploying fashions to edge units with restricted compute and reminiscence, builders have the problem to manually tune the mannequin to realize the specified efficiency. On this weblog submit, I’ll talk about an instance on the best way to use the ONNX Runtime on AWS IoT Greengrass to optimize picture classification on the edge.

ONNX is an open format constructed to symbolize any sort of machine studying or deep studying mannequin whereas making it simpler to entry {hardware} optimizations. It supplies a regular format for interoperability between totally different machine studying frameworks. You’ll be able to prepare a picture classification mannequin utilizing certainly one of your most popular frameworks (TensorFlow, PyTorch, MxNet, and extra) after which export it to ONNX format. To maximise efficiency, you should use your ONNX fashions with an optimized inference framework, like ONNX Runtime. ONNX Runtime is an open supply challenge designed to speed up machine studying inference throughout quite a lot of frameworks, working programs, and {hardware} platforms with a single set of APIs. Whereas this weblog submit focuses on an instance for picture classification, you should use ONNX for a variety of use circumstances, like object detection, picture segmentation, speech and audio processing, machine comprehension and translation, and extra.

AWS IoT Greengrass is an open supply Web of Issues (IoT) edge runtime and cloud service that helps you construct, deploy, and handle IoT purposes in your units. You need to use AWS IoT Greengrass to construct edge purposes utilizing software program modules, known as parts, that may join your edge units to AWS or third-party providers. There are a number of AWS-provided machine studying parts that can be utilized to carry out inference on distant units, with regionally generated knowledge, utilizing fashions skilled within the cloud. It’s also possible to construct your customized machine studying parts which could be divided in two classes: parts for deploying and updating your machine studying fashions and runtimes on the edge in addition to parts that comprise the mandatory utility logic for performing machine studying inference.

Resolution Overview

On this instance, you’ll learn to construct and deploy a customized part for picture classification on AWS IoT Greengrass. The beneath structure and steps symbolize a attainable implementation for this resolution.

Solution Architecture Diagram

1. Practice a mannequin utilizing your most popular framework and export it to ONNX format, or use a pre-trained ONNX mannequin. You need to use Amazon SageMaker Studio and Amazon SageMaker Pipelines to automate this course of.

On this weblog submit, you can be utilizing a pre-trained ResNet-50 mannequin in ONNX format for picture classification obtainable from the ONNX Mannequin Zoo. ResNet-50 is a convolutional neural community with 50 layers and the pre-trained model of the mannequin can classify photographs right into a thousand object classes, comparable to keyboard, mouse, pencil, and plenty of animals.

2. Construct and publish the mandatory AWS IoT Greengrass parts:

  • An ONNX Runtime part that incorporates the mandatory libraries to run the ONNX mannequin.
  • A part for inference that incorporates the mandatory code, the ResNet-50 mannequin in ONNX format in addition to some labels and pattern photographs that will probably be used for classification. This part can have a dependency on the ONNX Runtime part.

3. Deploy the part on the goal system. As soon as the part is working, it is going to classify the pattern photographs and publish the outcomes again to AWS IoT Core to the subject demo/onnx. AWS IoT Core is a managed AWS service that allow’s you join billions of IoT units and route trillions of messages to AWS providers with out managing infrastructure.


To have the ability to run by the steps on this weblog submit, you’ll need:

Implementation walkthrough

Preliminary setup

As a part of the preliminary setup for the surroundings, there are a number of sources that you’ll want to provision. All of the sources have to be provisioned in the identical area. This information is utilizing the eu-central-1 area. Comply with the steps beneath to get began:
1. The part’s artifacts are going to be saved in an Amazon Easy Storage Service (Amazon S3) bucket. To create an Amazon S3 bucket, observe the directions from the consumer information.
2. To emulate a tool the place we are going to deploy the part, you’ll use an AWS Cloud9 surroundings after which set up AWS IoT Greengrass consumer software program. To carry out these steps, observe the directions from the AWS IoT Greengrass v2 workshop, sections 2 and 3.1.
3. On the AWS Cloud9 surroundings, be sure to have python 3.6.9 in addition to pip 23.0 or larger put in.

Construct and publish the ONNX Runtime and inference parts

Within the subsequent part, you’ll construct and publish the customized parts through the use of AWS CLI, both from a terminal on the native machine or in an AWS Cloud9 surroundings.

To add the artifacts to the Amazon S3 bucket created as a part of the preliminary setup, observe the subsequent steps:
1. Clone the git repository that incorporates the part’s artifacts and recipe:

git clone https://github.com/aws-samples/aws-iot-gg-onnx-runtime.git

2. Navigate to the artifacts folder and zip the information:

cd aws-iot-gg-onnx-runtime/artifacts/com.demo.onnx-imageclassification/1.0.0 
zip -r greengrass-onnx.zip .

3. Add the zip file to the Amazon S3 bucket that you simply created within the preliminary setup:

aws s3 cp greengrass-onnx.zip s3://{YOUR-S3-BUCKET}/greengrass-onnx.zip

To publish the parts, carry out the next steps:
1. Open the recipe file aws-iot-gg-onnx-runtime/recipes/com.demo.onnx-imageclassification-1.0.0.json in a textual content editor. Under you may have the command to navigate to the recipes listing:

cd aws-iot-gg-onnx-runtime/recipes/

2. Change the Amazon S3 bucket title in artifacts URI with your personal bucket title outlined above:

"Artifacts": [
      "URI": "s3://{YOUR-S3-BUCKET}/greengrass-onnx.zip",
      "Unarchive": "ZIP"

3. Earlier than publishing the part, just be sure you are utilizing the identical area the place you created the sources within the preliminary setup. You’ll be able to set your default area through the use of the next command:

aws configure set default.area eu-central-1

4. Publish the ONNX Runtime part:

aws greengrassv2 create-component-version --inline-recipe fileb://com.demo.onnxruntime-1.0.0.json

5. Publish the part that may carry out the picture classification and that has a dependency on the ONNX Runtime:

aws greengrassv2 create-component-version --inline-recipe fileb://com.demo.onnx-imageclassification-1.0.0.json

6. To confirm that the parts had been printed efficiently, navigate to the AWS IoT Console, go to Greengrass Gadgets >> Parts. Within the My Parts tab, you must see the 2 parts that you simply simply printed:
Screenshot - My Components tab

Deploy the part to a goal system

1. To deploy the part to a goal system, just be sure you have provisioned an AWS Cloud9 surroundings with AWS IoT Greengrass consumer software program put in.
2. To setup the mandatory permissions for the Greengrass system, guarantee that the service function related to the Greengrass system has permissions to retrieve objects from the Amazon S3 bucket you beforehand created in addition to permissions to publish to the AWS IoT matter demo/onnx.
3. To deploy the part to the goal system, go to the AWS IoT Console, navigate to Greengrass Gadgets >> Deployments and select Create.
4. Fill within the deployment title in addition to the title of the core system you need to deploy to.
Screenshot - Deployment Information
5. Within the Choose Parts part, choose the part com.demo.onnx-imageclassification.
6. Go away all different choices as default and select Subsequent till you attain the Evaluation part of your deployment after which select Deploy.
7. To observe the logs and progress of the parts’ deployment, you possibly can open the log file of Greengrass core system on the AWS Cloud9 surroundings with the next command:

sudo tail -f /greengrass/v2/logs/greengrass.log

8. Please be aware that the ONNX Runtime part, com.demo.onnxruntime, is robotically put in because the picture classification part that we chosen for deployment has a dependency on it.

Check the ONNX picture classification part deployment

When the picture classification part is within the working state, it is going to loop by the information within the photographs folder and it’ll classify them. The outcomes are printed to AWS IoT Core to the subject demo/onnx.

To grasp this course of, let’s take a look at some code snippets from the picture classification part:
1. To test the pattern photographs as a way to later examine them with the expected labels, please open the pictures positioned in aws-iot-gg-onnx-runtime/artifacts/com.demo.onnx-imageclassification/1.0.0/photographs folder.
2. The predict perform proven beneath begins an inference session utilizing the ONNX Runtime and the pre-trained ResNet-50 neural community in ONNX format.

def predict(modelPath, labelsPath, picture):
    labels = load_labels(labelsPath)
    # Run the mannequin on the backend
    session = onnxruntime.InferenceSession(modelPath, None)

3. The picture is initially preprocessed after which handed as an enter parameter to the inference session. Please be aware that ResNet-50 mannequin makes use of photographs of 224 x 224 pixels.

image_data = np.array(picture).transpose(2, 0, 1)
input_data = preprocess(image_data)
begin = time.time()
raw_result = session.run([], {input_name: input_data})
finish = time.time()

4.  From the inference end result, you extract the label of the picture, and also you additionally calculate the inference time in milliseconds.

inference_time = np.spherical((finish - begin) * 1000, 2)
idx = np.argmax(postprocess(raw_result))
inferenceResult = {
	"label": labels[idx],
	"inference_time": inference_time

5. The picture classification part loops by the information current within the photographs folder and invokes the predict perform. The outcomes are printed to AWS IoT Core to the demo/onnx matter each 5 seconds.

for img in os.listdir(imagesPath):
        request = PublishToIoTCoreRequest()
        request.topic_name = matter
        picture = Picture.open(imagesPath + "/" + img)
        pred = predict(modelPath, labelsPath, picture)
        request.payload = pred.encode()
        request.qos = qos
        operation = ipc_client.new_publish_to_iot_core()
        future_response = operation.get_response().end result(timeout=5)
        print("efficiently printed message: ", future_response)

To check that the outcomes have been printed efficiently to the subject, go to AWS IoT Console, navigate to MQTT Shopper part and subscribe to the subject demo/onnx. It’s best to see the inference outcomes like within the screenshot beneath:Screenshot - Inference results from the MQTT Client

Cleansing up

It’s a greatest observe to delete sources you now not need to use. To keep away from incurring further prices in your AWS account, carry out the next steps:
1. Delete the AWS Cloud9 surroundings the place the AWS IoT Greengrass software program was put in:

aws cloud9 delete-environment --environment-id <your surroundings id>

2. Delete the Greengrass core system:

aws greengrassv2 delete-core-device --core-device-thing-name <thing-name>

3. Delete the Amazon S3 bucket the place the artifacts are saved:

aws s3 rb s3://{YOUR-S3-BUCKET} --force


On this weblog submit, I confirmed you how one can construct and deploy a customized part on AWS IoT Greengrass that makes use of the ONNX Runtime to categorise photographs. You’ll be able to customise this part by including further photographs, or through the use of a distinct mannequin in ONNX format to make predictions.

To take a deeper dive into AWS IoT Greengrass, together with the best way to construct customized parts, please test the AWS IoT Greengrass Workshop v2. It’s also possible to learn the developer information to get extra data on the best way to customise machine studying parts.

Concerning the writer

Costin Badici.jpg

Costin Bădici is a Options Architect at Amazon Internet Providers (AWS) based mostly in Bucharest, Romania, serving to enterprise prospects optimize their AWS deployments, adhere to greatest practices, and innovate sooner with AWS providers. He’s obsessed with Web of Issues and machine studying and has designed and carried out extremely scalable IoT and predictive analytics options for purchasers throughout a number of industries.

Related Articles


Please enter your comment!
Please enter your name here

Latest Articles