brain-score / model-tools

Helper functions to extract model activations and translate from Machine Learning to Neuroscience
MIT License
8 stars 27 forks source link

Add microsaccades to Brain-Score core #75

Open benlonnqvist opened 9 months ago

benlonnqvist commented 9 months ago

In this PR we add microsaccades to Brain-Score core.

Conceptual Problem: We need variance in model responses to static stimuli.

Conceptual Solution: Microsaccades are a prevalent phenomenon in vision and visual experiments. They are involuntary movements of the eye at very small scales. Microsaccades are not (and often can not due to their small extent) be controlled for in experiments, and are thus implicitly baked into the variance in primate responses. As such, microsaccades are a phenomenon that is either explicitly or implicitly believed to be unimportant for behavioral/neural outcomes, and thus a good candidate for getting variance in responses to static stimuli. (e.g. Rolfs 2009, Vis. Res.; Haddad & Steinmann 1973, Vis. Res.)

Technical problem: The current BrainScore interface does not support microsaccades.

Technical solution: the ActivationsExtractorHelper will be changed. The from_paths method now takes a path, loads the image from the path, does pixel position jittering to the image, and saves the jittered image into a temporary new path. The new path is passed to the downstream functions to get the model activations.

To accomplish this, the from_paths method will now receive a dictionary of tags. This dictionary of tags comes from a call to the look_at method, where number_of_trials is replaced with a new dictionary. This new dictionary then traverses the following path:

  1. run_activations
  2. A call to activations_model
  3. In practice, this calls a TensorFlowWrapper/PytorchWrapper/etc.’s self._extractor class’s __call__() method in its __call__() method. (I.e., PytorchWrapper.__call__() => self.extractor.__call_\() )
  4. This extractor’s call method is ActivationsExtractorHelper.__call__()
  5. Thus we pass the new dictionary to ActivationsExtractorHelper.__call__() where it will be parsed.

TODO list:

Other Brain-Score benchmark PRs depend on this PR (Malania2007).

Huge thanks to Hannes Mehrer (@hanme) who implemented microsaccades, which I've only adapted for the generalized case here.