diff --git a/brainscore_vision/models/resnet_50_pytorch/__init__.py b/brainscore_vision/models/resnet_50_pytorch/__init__.py new file mode 100644 index 000000000..0953620e8 --- /dev/null +++ b/brainscore_vision/models/resnet_50_pytorch/__init__.py @@ -0,0 +1,7 @@ +from brainscore_vision.model_helpers.brain_transformation import ModelCommitment +from brainscore_vision import model_registry +from .model import get_layers,get_model + + +model_registry['resnet-50-pytorch'] = \ + lambda: ModelCommitment(identifier='resnet-50-pytorch', activations_model=get_model('resnet-50-pytorch'), layers=get_layers('resnet-50-pytorch')) \ No newline at end of file diff --git a/brainscore_vision/models/resnet_50_pytorch/model.py b/brainscore_vision/models/resnet_50_pytorch/model.py new file mode 100644 index 000000000..0a84b29ce --- /dev/null +++ b/brainscore_vision/models/resnet_50_pytorch/model.py @@ -0,0 +1,66 @@ +import functools +from brainscore_vision.model_helpers.activations.pytorch import load_preprocess_images +from brainscore_vision.model_helpers.activations.pytorch import PytorchWrapper +from brainscore_vision.model_helpers.check_submission import check_models +import torchvision +from importlib import import_module + +model = torchvision.models.resnet50(weights='DEFAULT') + + +def get_model(name): + """ + This method fetches an instance of a base model. The instance has to be callable and return a xarray object, + containing activations. There exist standard wrapper implementations for common libraries, like pytorch and + keras. Checkout the examples folder, to see more. For custom implementations check out the implementation of the + wrappers. + :param name: the name of the model to fetch + :return: the model instance + """ + assert name == 'resnet-50-pytorch' + module = import_module(f'torchvision.models') + model_ctr = getattr(module, "resnet50") + preprocessing = functools.partial(load_preprocess_images, image_size=224) + wrapper = PytorchWrapper(identifier=name, model=model_ctr(pretrained=True), preprocessing=preprocessing) + wrapper.image_size = 224 + return wrapper + + +def get_layers(name): + assert name == 'resnet-50-pytorch' + layers = ['conv1', 'layer1.0.conv3', 'layer1.1.conv3', 'layer1.2.conv3', + 'layer2.0.downsample.0', 'layer2.1.conv3', 'layer2.2.conv3', 'layer2.3.conv3', + 'layer3.0.downsample.0', 'layer3.1.conv3', 'layer3.2.conv3', 'layer3.3.conv3', + 'layer3.4.conv3', 'layer3.5.conv3', + 'layer4.0.downsample.0', 'layer4.1.conv3', 'layer4.2.conv3', 'avgpool'] + return layers + + +def get_bibtex(model_identifier): + """ + A method returning the bibtex reference of the requested model as a string. + """ + return ''' +@article{DBLP:journals/corr/HeZRS15, + author = {Kaiming He and + Xiangyu Zhang and + Shaoqing Ren and + Jian Sun}, + title = {Deep Residual Learning for Image Recognition}, + journal = {CoRR}, + volume = {abs/1512.03385}, + year = {2015}, + url = {http://arxiv.org/abs/1512.03385}, + eprinttype = {arXiv}, + eprint = {1512.03385}, + timestamp = {Wed, 25 Jan 2023 11:01:16 +0100}, + biburl = {https://dblp.org/rec/journals/corr/HeZRS15.bib}, + bibsource = {dblp computer science bibliography, https://dblp.org} +} +''' + + +if __name__ == '__main__': + # Use this method to ensure the correctness of the BaseModel implementations. + # It executes a mock run of brain-score benchmarks. + check_models.check_base_models(__name__) diff --git a/brainscore_vision/models/resnet_50_pytorch/region_layer_map/resnet-50-pytorch.json b/brainscore_vision/models/resnet_50_pytorch/region_layer_map/resnet-50-pytorch.json new file mode 100644 index 000000000..073cc7a88 --- /dev/null +++ b/brainscore_vision/models/resnet_50_pytorch/region_layer_map/resnet-50-pytorch.json @@ -0,0 +1,6 @@ +{ + "V1": "layer3.0.downsample.0", + "V2": "layer3.0.downsample.0", + "V4": "layer3.0.downsample.0", + "IT": "layer4.0.downsample.0" +} \ No newline at end of file diff --git a/brainscore_vision/models/resnet_50_pytorch/requirements.txt b/brainscore_vision/models/resnet_50_pytorch/requirements.txt new file mode 100644 index 000000000..abf50367e --- /dev/null +++ b/brainscore_vision/models/resnet_50_pytorch/requirements.txt @@ -0,0 +1 @@ +torchvision \ No newline at end of file diff --git a/brainscore_vision/models/resnet_50_pytorch/test.py b/brainscore_vision/models/resnet_50_pytorch/test.py new file mode 100644 index 000000000..a80fb3d1e --- /dev/null +++ b/brainscore_vision/models/resnet_50_pytorch/test.py @@ -0,0 +1,9 @@ +import brainscore_vision +import pytest + + + +@pytest.mark.travis_slow +def test_has_identifier(): + model = brainscore_vision.load_model('resnet-50-pytorch') + assert model.identifier == 'resnet-50-pytorch' \ No newline at end of file