You can use multi-sensor, multi-target trackers, trackerGNN
,
trackerJPDA
, and trackerTOMHT
, to track multiple targets. These trackers implement the
multi-object tracking problem using the measurement-to-track association approach.
Tracks are initiated and updated using sensor detections of targets. Trackers take
several steps when new detections are made:
The tracker tries to assign a detection to an existing track.
The tracker creates a track for each detection it cannot assign. When starting the tracker, all detections are used to create tracks.
The tracker evaluates the status of each track. For new tracks, the status is tentative until enough detections are made to confirm the track. For existing tracks, newly assigned detections are used by the tracking filter to update the track state. When a track has no new added detections, the track is coasted (predicted) until new detections are assigned to it. If no new detections are added after a specified number of updates, the track is deleted.
When tracking multiple objects using these trackers, there are several things to consider:
Decide which tracker to use.
trackerGNN
uses a global nearest-neighbor
assignment algorithm, which maintains a single hypothesis about
the tracked object. The tracker offers low computation cost but
is not robust during ambiguous association events.
trackerTOMHT
assigns detections based on a
track-oriented, multi-hypothesis approach, which maintains
multiple hypotheses about the tracked object. The tracker is
robust during ambiguous data association events but is
computationally more expensive.
trackerJPDA
uses a joint probabilistic data
association approach, which applies a soft assignment where
multiple detections can contribute to each track. The tracker
balances the robustness and computation cost between
trackerGNN
and
trackerTOMHT
.
See the Tracking Closely Spaced Targets Under Ambiguity example for a comparison between these three trackers.
Decide which type of tracking filter to use.
The choice of tracking filter depends on the expected dynamics of the
object you want to track. The toolbox provides multiple Kalman filters
including the Linear Kalman filter, trackingKF
, the Extended Kalman
filter, trackingEKF
, the Unscented
Kalman filter, trackingUKF
, and the Cubature
Kalman filter, trackingCKF
. The linear Kalman filter is used when the
dynamics of the object follow a linear model and the measurements are linear
functions of the state vector. The extended, unscented, and cubature Kalman
filters are used when the dynamics are nonlinear, the measurement model is
nonlinear, or both. The toolbox also provides non-Gaussian filters such as
the particle filter, trackingPF
, Gaussian-sum filter, trackingGSF
, and the Interacting Multiple Model (IMM) filter,
trackingIMM
. See the Tracking with Range-Only Measurements
and Tracking Maneuvering Targets
examples for more information about these filters.
You can set the type of filter by specifying the
FilterInitializationFcn
property of a tracker. For
example, if you set the FilterInitializationFcn
property
to @initcaekf
, then the tracker uses the initcaekf
function to
create a constant-acceleration extended Kalman filter for a new track
generated from detections.
Decide which track logic to use.
You can specify the conditions under which a track is confirmed or deleted
by setting the TrackLogic
property. Three algorithms
are supported:
'History'
— Track confirmation and deletion are
based on the number of times the track has been assigned to a
detection in the last several tracker updates. You can use this
logic with trackerGNN
and
trackerJPDA
.
'Score'
— Track confirmation and deletion are
based on a log-likelihood computation. A high score means that the
track is more likely to be valid. A low score means that the track
is more likely to be false. You can use this logic with
trackerGNN
and
trackerTOMHT
.
'Integrated'
— Track confirmation and deletion
are based on the probability of track existence. You can use this
logic with trackerJPDA
.
For more details, see the Introduction to Track Logic example.
You can also use a multi-sensor, multi-target tracker, trackerPHD
,
to track multiple targets simultaneously. trackerPHD
approaches the
multi-object tracking problem using the random finite set (RFS) method and tracks the
probability hypothesis density (PHD) of a scenario. trackerPHD
extracts
peaks from the PHD-intensity to represent potential targets and maintain identities of
targets by assigning a label to each component. The toolbox offers one realization of
PHD, ggiwphd
, which represents the
PHD of extended targets using a Gamma Gaussian Inverse-Wishart (GGIW) target-state
model. You can represent the configurations of sensors for trackerPHD
using trackingSensorConfiguration
.
The trackerGNN
object is a multi-sensor, multi-object tracker that uses
global nearest neighbor association. Each detection can be assigned to only one
track (single-hypothesis tracker) which can also be a new track that the detection
initiates. At each step of the simulation, the tracker updates the track state. You
can specify the behavior of the tracker by setting the following properties.
trackerGNN Properties
FilterInitializationFcn | A handle to a function that initializes a tracking filter
based on a single detection. This function is called when a
detection cannot be assigned to an existing track. For example,
|
Assignment | The name of the assignment algorithm. The tracker provides
three built-in algorithms: |
CustomAssignmentFcn | The name of the custom assignment algorithm function. This
property is available on when the
|
AssignmentThreshold | Specify the threshold that controls the assignment of a detection to a track. Detections can only be assigned to a track if their normalized distance from the track is less than the assignment threshold. Each tracking filter has a different method of computing the normalized distance. Increase the threshold if there are detections that can be assigned to tracks but are not. Decrease the threshold if there are detections that are erroneously assigned to tracks. |
TrackLogic | Specify the track confirmation logic
–- help trackHistoryLogic help trackScoreLogic |
ConfirmationThreshold | Specify the threshold for track confirmation. The threshold
depends on the setting for
. |
DeletionThreshold | Specify the threshold for track deletion. The threshold
depends on the setting of
. |
DetectionProbability | Specify the probability of detection as a number in the
range (0,1). The probability of detection is
used to calculate the track score when initializing and updating
a track. This property is used only when
|
FalseAlarmRate | Specify the rate of false detection as a number in the
range (0,1). The false alarm rate is used to
calculate the track score when initializing and updating a
track. This property is used only when
|
Beta | Specify the rate of new tracks per unit volume as a
positive number. This property is used only when
|
Volume | Specify the volume of the sensor measurement bin as a
positive scalar. For example, a radar sensor that produces a 4-D
measurement of azimuth, elevation, range, and range-rate creates
a 4-D volume. The volume is a product of the radar angular
beamwidth, the range bin width, and the range-rate bin width.
The volume is used in calculating the track score when
initializing and updating a track. This property is used only
when |
| Specify the maximum number of tracks the tracker can maintain. |
MaxNumSensors | Specify the maximum number of sensors sending detections to
the tracker as a positive integer. This number must be greater
than or equal to the largest |
HasDetectableTrackIDsInput | Set this property to |
HasCostMatrixInput | Set this property to |
The input to the trackerGNN
consists of a list of detections, the update time, cost
matrix, and other data. Detections are specified as a cell array of objectDetection
objects (see Detections). The input
arguments are listed here.
trackerGNN Input
tracker | A |
detections | Cell array of |
time | Time to which all the tracks are to be updated and predicted. The time at this execution step must be greater than the value in the previous call. |
costmatrix | Cost matrix for assigning detections to tracks. A real
T-by-D matrix, where
T is the number of tracks listed in the
allTracks argument returned from the
previous call to step . D is the
number of detections that are input in the current call. A larger
cost matrix entry means a lower likelihood of assignment. |
detectableTrackIDs | IDs of tracks that the sensors expect to detect, specified
as an M-by-1 or M-by-2
matrix. The first column consists of track IDs, as reported in
the |
The output of the tracker can consist of up to three struct
arrays with track state information. You can retrieve just the confirmed tracks, the
confirmed and tentative tracks, or these tracks plus a combined list of all
tracks.
confirmedTracks = step(...)
[confirmedTracks, tentativeTracks] = step(...)
[confirmedTracks, tentativeTracks, allTracks] = step(...)
struct
are:trackerGNN Output struct
TrackID | Unique integer that identifies the track. |
UpdateTime | Time to which the track is updated. |
Age | Number of updates since track initialization. |
State | State vector at update time. |
StateCovariance | State covariance matrix at update time. |
IsConfirmed | True if the track is confirmed. |
TrackLogic | The track logic used in confirming the track –
'History' or
'Score' . |
TrackLogicState | The current state of the track logic.
|
IsCoasted | True if the track has been updated without a detection. In this case, tracks are predicted to the current time. |
ObjectClassID | An integer value representing the target classification. Zero is reserved for an "unknown" class. |
ObjectAttributes | A cell array of cells. Each cell captures the object attributes reported by the corresponding sensor. |