VIRGO (Video Recognition Gateway) is a daemon system which runs on a POSIX compatible system. It receives video feeds from one or more cameras and recognizes and tracks faces in those video streams in realtime. It generates tracking events and sends those events to an event server. The VIRGO daemon can be controlled either by the command line tool or through the VIRGA command & control server.
A single VIRGO installation consists of the following components:
This diagram shows how those components fit together:
virgod:
virgofeedd:
virgoupdaterd:
virgo:
VIRGO ships as a bundle which supports multiple versions of the VIRGO daemon. The VIRGO bundle directory contains a “versions” directory which in turn contains one sub-directory per installed VIRGO version. The name of a version sub-directory is the semantic version number of the VIRGO installation. The “versions” directory also contains a symlink named “current”. This symlink points to the version sub-directory which is currently active.
The version sub-directory stores all necessary executable, library, and data files for the VIRGO version.
VIRGO bundle layout:
virgo/
versions/
1.0.0/
virgo
virgod
virgofeedd
virgoupdaterd
lib/
<shared libraries>
model/
<tensor flow model files>
virgo-factory.config
current -> ./1.0.0
virgo -> ./versions/current/virgo
A single virgod instance manages a set of feeds. Each feed represents a video stream from a camera, a file, or some other video source. Each feed is associated with a set of configuration information which is stored persistently by VIRGO. The configuration information for the feeds is either provided by the VIRGO server through the COP-HTTP protocol or through the VIRGO command line tool and the COP-DTP protocol.
Each feed has a name which is unique among the set of feeds of a single virgod instance. These names are used as a simple and convenient way to refer to a feed and its configuration. Each feed is managed by a separate virgofeedd instance which is started and monitored by virgod. Virgod will automatically restart a virgofeedd instance if it dies for some unexpected reason.
A feed may be enabled or disabled. Only enabled feeds are associated with a virgofeedd instance. The enabled state of a feed may be changed through the VIRGO command line tool by issuing a feed start or a feed stop command. A feed may also be enabled or disabled through the COP-HTTP protocol by changing the enabled setting in the feed configuration dictionary. This allows the system to reclaim resources like memory and network bandwidth if a feed is temporarily not needed. Feeds which are no longer needed at all should be removed altogether.
A feed has an input which connects the feed to a video stream. The only type of input currently supported is “stream”. A stream input is specified by a URL which may point to a publicly accessible RTSP, HTTP, or FILE video stream. Each video frame from the input is first sent through a video post-processing pipeline before it is fed into the object detector and recognizer sub-systems:
First a lens correction algorithm is applied to an incoming video frame. This step removes distortions that may be introduced by the optical system of a camera. After that the image will be rotated to compensate for any undesired rotation that may have been introduced by the physical orientation of the camera. Finally the image may be mirrored to ensure that a camera that is facing a user will produce an image that aligns with what a user expects to see.