#***************************************************** # * # Copyright 2018 Amazon.com, Inc. or its affiliates. * # All Rights Reserved. * # * #***************************************************** import os import json import time import numpy as np import awscam import cv2 import mo import greengrasssdk from utils import LocalDisplay def lambda_handler(event, context): """Empty entry point to the Lambda function invoked from the edge.""" return # Create an IoT client for sending to messages to the cloud. client = greengrasssdk.client('iot-data') iot_topic = '$aws/things/{}/infer'.format(os.environ['AWS_IOT_THING_NAME']) INPUT_WIDTH = 224 INPUT_HEIGHT = 224 def infinite_infer_run(): """ Run the DeepLens inference loop frame by frame""" try: # Number of top classes to output num_top_k = 2 model_type = 'classification' model_name = 'image-classification' with open('labels.txt', 'r') as f: output_map = [l for l in f] # Create a local display instance that will dump the image bytes to a FIFO # file that the image can be rendered locally. local_display = LocalDisplay('480p') local_display.start() # Optimize the model error, model_path = mo.optimize(model_name,INPUT_WIDTH,INPUT_HEIGHT) # Load the model onto the GPU. client.publish(topic=iot_topic, payload='Loading model') model = awscam.Model(model_path, {'GPU': 1}) client.publish(topic=iot_topic, payload='Model loaded') while True: # Get a frame from the video stream ret, frame = awscam.getLastFrame() if not ret: raise Exception('Failed to get frame from the stream') # Resize frame to the same size as the training set. frame_resize = cv2.resize(frame, (INPUT_HEIGHT, INPUT_WIDTH)) # Run the images through the inference engine and parse the results using # the parser API, note it is possible to get the output of doInference # and do the parsing manually, but since it is a classification model, # a simple API is provided. parsed_inference_results = model.parseResult(model_type, model.doInference(frame_resize)) # Get top k results with highest probabilities top_k = parsed_inference_results[model_type][0:num_top_k] # Add the label of the top result to the frame used by local display. # See https://docs.opencv.org/3.4.1/d6/d6e/group__imgproc__draw.html # for more information about the cv2.putText method. # Method signature: image, text, origin, font face, font scale, color, and thickness output_text = '{} : {:.2f}'.format(output_map[top_k[0]['label']], top_k[0]['prob']) cv2.putText(frame, output_text, (10, 70), cv2.FONT_HERSHEY_SIMPLEX, 3, (255, 165, 20), 8) # Set the next frame in the local display stream. local_display.set_frame_data(frame) # Send the top k results to the IoT console via MQTT cloud_output = {} for obj in top_k: cloud_output[output_map[obj['label']]] = obj['prob'] client.publish(topic=iot_topic, payload=json.dumps(cloud_output)) except Exception as ex: print('Error in lambda {}'.format(ex)) client.publish(topic=iot_topic, payload='Error in lambda: {}'.format(ex)) infinite_infer_run()