Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GaussianMixtureInitiator not working with MFAHypothesiser #896

Open
Carlson-J opened this issue Nov 21, 2023 · 3 comments
Open

GaussianMixtureInitiator not working with MFAHypothesiser #896

Carlson-J opened this issue Nov 21, 2023 · 3 comments

Comments

@Carlson-J
Copy link
Contributor

I am trying to use the MHT with the new initializer added in #873. However, when I try to do so I get the following error

Traceback (most recent call last):
  File "MHT_testing.py", line 109, in <module>
    for time, ctracks in tracker:
  File "~/Stone-Soup/stonesoup/tracker/simple.py", line 323, in __next__
    self._tracks |= self.initiator.initiate(
  File "~/Stone-Soup/stonesoup/initiator/simple.py", line 368, in initiate
    tracks = self.initiator.initiate(detections, timestamp, **kwargs)
  File "~/Stone-Soup/stonesoup/initiator/simple.py", line 211, in initiate
    associations = self.data_associator.associate(
  File "~/Stone-Soup/stonesoup/dataassociator/mfa/__init__.py", line 38, in associate
    self.generate_hypotheses(tracks, detections, timestamp,
  File "~Stone-Soup/stone/soup/dataassociator/base.py", line 26, in generate_hypotheses
    return {track: self.hypothesiser.hypothesise(
  File "~/Stone-Soup/stonesoup/dataassociator/base.py", line 26, in <dictcomp>
    return {track: self.hypothesiser.hypothesise(
  File "~/Stone-Soup/stonesoup/hypothesiser/mfa.py", line 53, in hypothesise
    for component in track.state.components:
AttributeError: 'GaussianStateUpdate' object has no attribute 'components'

Here is the relevant part of the code. Assume I have created some measurements and timestamps beforehand (I use real data which I cannot post here).


    from stonesoup.predictor.kalman import ExtendedKalmanPredictor
    predictor = ExtendedKalmanPredictor(transition_model)

    from stonesoup.updater.kalman import ExtendedKalmanUpdater
    updater = ExtendedKalmanUpdater(measurement_model)

    from stonesoup.dataassociator.mfa import MFADataAssociator
    from stonesoup.hypothesiser.mfa import MFAHypothesiser
    from stonesoup.hypothesiser.probability import PDAHypothesiser

    hypothesiser = PDAHypothesiser(predictor, updater, lambda_, prob_gate=prob_gate, prob_detect=prob_detect)
    hypothesiser = MFAHypothesiser(hypothesiser)
    data_associator = MFADataAssociator(hypothesiser, slide_window=slide_window)

    from stonesoup.deleter.error import CovarianceBasedDeleter
    covariance_limit_for_delete = 2
    deleter = CovarianceBasedDeleter(covar_trace_thresh=covariance_limit_for_delete)

    from stonesoup.types.mixture import GaussianMixture
    from stonesoup.types.state import WeightedGaussianState, TaggedWeightedGaussianState
    s_prior_state = GaussianMixture([WeightedGaussianState([[0], [0], [0], [0], [0], [0]], np.diag([0.5, 0, 0.5, 0, 0.5, 0]))])
    s_prior_state = GaussianMixture([TaggedWeightedGaussianState([[0], [1], [0], [1], [0], [1]],
                                                 np.diag([1.5, 0.5, 1.5, 0.5, 1.5, 0.5]),
                                                 weight=Probability(1), tag=[])])
    min_detections = 3
    from stonesoup.initiator.simple import GaussianMixtureInitiator
    from stonesoup.initiator.simple import MultiMeasurementInitiator

    initiator = GaussianMixtureInitiator(
        MultiMeasurementInitiator(
        prior_state=s_prior_state,
        measurement_model=measurement_model,
        deleter=deleter,
        data_associator=data_associator,
        updater=updater,
        min_points=min_detections
    ))

    from stonesoup.tracker.simple import MultiTargetMixtureTracker

    tracker = MultiTargetMixtureTracker(
        initiator=initiator,
        deleter=deleter,
        detector=zip(timestamps, measurements),
        data_associator=data_associator,
        updater=updater,
    )
    tracks = set()

    for time, ctracks in tracker:
        tracks.update(ctracks)
@Carlson-J
Copy link
Contributor Author

It seems that the MultiMeasurementInitiator does not work with the MultiTargetMixtureTracker.

I used this instead and it seems to be running without the error.

initiator = GaussianMixtureInitiator(
        SimpleMeasurementInitiator(
        prior_state=s_prior_state,
        measurement_model=measurement_model,
    ))

Is this expected/desired behavior?

@sdhiscocks
Copy link
Member

Yeah, this is unfortunately expected behaviour, but not desirable. There is an issue with the multi-measurement initiator which doesn't work well with different mixture types, due to logic based on hard-assignment. A work around is in the initiator, use a hard-assignment data associator with non-MFA hypothesiser (e.g. GNNWith2DAssignment).

A fix would be add mixture/MFA compatible versions of a multi-measurement initiator.

Another more general option would be to make a multi-measurement initiator, which can use any "Tracker" style class, which would offer some flexibility, to then use mixture trackers in it. There is a few complications in implementing this however (possibly blocking iteration call for example, so a thread may be required).

Also, you wont want to use the MultiTargetMixtureTracker with MFA, as you need to use tracking loop similar to that found in the Estimate section of MFA example.

@A-acuto
Copy link
Contributor

A-acuto commented Feb 1, 2024

Hi both, I saw this open issue because I am, as well, in the middle of creating an example for MHT using MFA components and Stone soup trackers I got stuck in the same problems.

Wrapping up: MFA data associator, as it is now, it can't be used using in the MultiTargetMixtureTracker because of GaussianMixtureUpdates are created, right?
Also the MultiMeasurementInitiator cannot be wrapped in GaussianMixtureInitiator, which should be used instantiating tracks for MFA/MHT. I am getting these right?

So the only option available is to loop over the MFA data associations as shown in the example and instantiate the tracks by hand. Is this correct?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants