Application nodes
Nodes are models, code, camera streams, output, and parameters. A node has an interface, which defines its inputs and outputs. The interface can be defined in a package in your account, a package provided by AWS Panorama, or a built-in type.
In the following example, code_node
and model_node
refer to the sample code and model
packages included with the sample application. camera_node
uses a package provided by AWS Panorama to create a
placeholder for a camera stream that you specify during deployment.
Example graph.json – Nodes
"nodes": [
{
"name": "code_node",
"interface": "123456789012::SAMPLE_CODE.interface"
},
{
"name": "model_node",
"interface": "123456789012::SQUEEZENET_PYTORCH_V1.interface"
},
{
"name": "camera_node",
"interface": "panorama::abstract_rtsp_media_source.rtsp_v1_interface",
"overridable": true,
"overrideMandatory": true,
"decorator": {
"title": "IP camera",
"description": "Choose a camera stream."
}
}
]
Edges
Edges map the output from one node to the input of another. In the following example, the first edge maps the
output from a camera stream node to the input of an application code node. The names video_in
and
video_out
are defined in the node packages' interfaces.
Example graph.json – edges
"edges": [
{
"producer": "camera_node.video_out",
"consumer": "code_node.video_in"
},
{
"producer": "code_node.video_out",
"consumer": "output_node.video_in"
},
In your application code, you use the inputs
and outputs
attributes to get images
from the input stream, and send images to the output stream.
Example application.py – Video input and output
def process_streams(self):
"""Processes one frame of video from one or more video streams."""
frame_start = time.time()
self.frame_num += 1
logger.debug(self.frame_num)
# Loop through attached video streams
streams = self.inputs.video_in.get()
for stream in streams:
self.process_media(stream)
...
self.outputs.video_out.put(streams)
Abstract nodes
In an application manifest, an abstract node refers to a package defined by AWS Panorama, which you can use as a placeholder in your application manifest. AWS Panorama provides two types of abstract node.
-
Camera stream – Choose the camera stream that the application uses during deployment.
Package name –
panorama::abstract_rtsp_media_source
Interface name –
rtsp_v1_interface
-
HDMI output – Indicates that the application outputs video.
Package name –
panorama::hdmi_data_sink
Interface name –
hdmi0
The following example shows a basic set of packages, nodes, and edges for an application that processes camera
streams and outputs video to a display. The camera node, which uses the interface from the
abstract_rtsp_media_source
package in AWS Panorama, can accept multiple camera streams as input. The
output node, which references hdmi_data_sink
, gives application code access to a video buffer that is
output from the appliance's HDMI port.
Example graph.json – Abstract nodes
{
"nodeGraph": {
"envelopeVersion": "2021-01-01",
"packages": [
{
"name": "123456789012::SAMPLE_CODE",
"version": "1.0"
},
{
"name": "123456789012::SQUEEZENET_PYTORCH_V1",
"version": "1.0"
},
{
"name": "panorama::abstract_rtsp_media_source",
"version": "1.0"
},
{
"name": "panorama::hdmi_data_sink",
"version": "1.0"
}
],
"nodes": [
{
"name": "camera_node",
"interface": "panorama::abstract_rtsp_media_source.rtsp_v1_interface",
"overridable": true,
"decorator": {
"title": "IP camera",
"description": "Choose a camera stream."
}
},
{
"name": "output_node",
"interface": "panorama::hdmi_data_sink.hdmi0"
}
],
"edges": [
{
"producer": "camera_node.video_out",
"consumer": "code_node.video_in"
},
{
"producer": "code_node.video_out",
"consumer": "output_node.video_in"
}
]
}
}