Introduction

Capsules are defined by the data they take as input and the information they give as output. Applications use this information to connect capsules to each other and schedule their execution. These inputs and outputs are defined by NodeDescription objects and realized by DetectionNode objects.

DetectionNode

Capsules use DetectionNode objects to communicate results to other capsules and the application itself. A DetectionNode contains information on a detection in the current frame. Capsules that detect objects in a frame create new DetectionNodes. Capsules that discover attributes about detections add data to existing DetectionNodes.

A DetectionNode object contains the following fields:

class_name

class_name: str

The detection class name. This describes what the detection is. A detection of a person would have a name="person".

coords

coords: List[List[int]]

A list of coordinates defining the detection as a polygon in-frame. Comes in the format [[x,y], [x,y]...].

attributes

attributes: Dict[str, str]

A key-value store where the key is the type of attribute being described and the value is the attribute's value. For instance, a capsule that detects gender might add a "gender" key to this dict, with a value of either "masculine" or "feminine".

encoding

encoding: Optional[numpy.ndarray]

An array of float values that represent an encoding of the detection. This can be used to recognize specific instances of a class. For instance, given a picture of person’s face, the encoding of that face and the encodings of future faces can be compared to find that person in the future.

track_id

track_id: Optional[UUID]

If this object is tracked, this is the unique identifier for this detection node that ties it to other detection nodes in future and past frames (within the same stream).

extra_data

extra_data: Dict[str, object]

A dict of miscellaneous data. This data is provided directly to clients without modification, so it’s a good way to pass extra information from a capsule to other applications.

children

children: List[DetectionNode]

A list of DetectionNode objects that are child detections of this detection. For example, a face DetectionNode might be a child of a person DetectionNode.

NodeDescription

Capsules use NodeDescriptions to describe the kinds of DetectionNodes they take in as input and produce as output.

A capsule may take a DetectionNode as input and produce zero or more DetectionNodes as output. Capsules define what information inputted DetectionNodes must have and what information outputted detection nodes will have using NodeDescriptions.

A NodeDescription has the following fields:

size

size: NodeDescription.Size

Specifies how many DetectionNodes the capsule takes as input at once.

  • NodeDescription.Size.NONE: The capsule does not take any input. This is common for capsules that detect objects in frame. These algorithms usually only need the video frame.
  • NodeDescription.Size.SINGLE: The capsule takes a single DetectionNode object. This is common for capsules that find attributes for objects that have been detected by other capsules.
  • NodeDescription.Size.ALL: The capsule takes all available DetectionNodes that fit the capsule's input requirements. This is common for capsules that track objects between video frames.

detections

detections: List[str]

A list of detection class names. This field is used to describe a DetectionNodes that have been detected as one of these class names.

For example, a capsule that can encode cars or trucks would use a NodeDescription like this as its input_type:

NodeDescription(detections=["car", "truck"])

A capsule that can detect people and dogs would use a NodeDescription like this as its output_type:

NodeDescription(detections=["person", "dog"])

attributes

attributes: Dict[str, List[str]]

A dict whose key is an attribute name and whose value is all possible values for that attribute. This field is used to describe DetectionNodes that has a value for every specified attribute.

For example, a capsule that operates on detections that have been classified for gender use a NodeDescription like this as its input_type:

NodeDescription(
    attributes={
        "gender": ["male", "female"],
        "color": ["red", "blue", "green"]
    })

A capsule that can classify people’s gender as either male or female would have the following NodeDescription as its output_type:

NodeDescription(
    detections=["person"],
    attributes={
        "gender": ["male", "female"]
    })

encoded

encoded: bool

True if a DetectionNode described by this NodeDescription is encoded.

For example, a capsule that operates on detections of cars that have been encoded use a NodeDescription like this as its input_type:

NodeDescription(
    detections=["car"],
    encoded=True)

A capsule that encodes people would use a NodeDescription like this as its output_type:

NodeDescription(
    detections=["person"],
    encoded=True)

tracked

True if a DetectionNode described by this NodeDescription is encoded.

For example, a capsule that operates on person detections that have been tracked would use a NodeDescription like this as its input_type.

NodeDescription(
    detections=["person"],
    tracked=True)

A capsule that tracks people would use a NodeDescription like this as its output_type:

NodeDescription(
    detections=["person"],
    tracked=True)

extra_data

extra_data: List[str]

A list of keys in a DetectionNode’s extra_data field. This field is used to describe DetectionNodes that have a value for every specified extra_data key.

For example, a capsule that operates on people detections with a "process_extra_fast" extra_data field would use a NodeDescription like this as its input_type:

NodeDescription(
    detections=["person"],
    extra_data=["process_extra_fast"])

A capsule that adds an "is_special" extra_data field to its person-detected output would use a NodeDescription like this as its output_type:

NodeDescription(
    detections=["person"],
    extra_data=["is_special"])