From 7658b1b89188a34a0f569f784516377447644649 Mon Sep 17 00:00:00 2001 From: Sam Winebrake <85908068+samwinebrake@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:50:13 -0500 Subject: [PATCH 1/6] Add custom mobilenet wrapper (#1762) * add wrapper to 0_5_192 * Update 0_5_224 w/ MobilenetPytorchWrapper * Update 0_75_160 w/ MobilenetPytorchWrapper * Update 0_75_192 w/ MobilenetPytorchWrapper * fix weights only error * fix weights only error * fix 0_75_160 weights only * fix 0_75__192 weights only * change neuroid slicing to only last layer * fix copy paste error * clean and concise custom wrapper * fix base model to model --- .../models/mobilenet_v2_0_5_192/model.py | 16 +++++++++++++--- .../models/mobilenet_v2_0_5_224/model.py | 15 +++------------ .../models/mobilenet_v2_0_75_160/model.py | 8 ++++---- .../models/mobilenet_v2_0_75_192/model.py | 9 +++++---- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/brainscore_vision/models/mobilenet_v2_0_5_192/model.py b/brainscore_vision/models/mobilenet_v2_0_5_192/model.py index 5a7d9bf8b..6b27751dd 100644 --- a/brainscore_vision/models/mobilenet_v2_0_5_192/model.py +++ b/brainscore_vision/models/mobilenet_v2_0_5_192/model.py @@ -15,7 +15,16 @@ version_id="null", sha1="e5aa083caa4833fccd48af0c578a45064824dd7f") MainModel = imp.load_source('MainModel',model_path.as_posix()) -model = torch.load(model_weight_path.as_posix()) + + +# This custom wrapper handles background class removal, and is used in related mobilenets +class MobilenetPytorchWrapper(PytorchWrapper): + def __call__(self, *args, **kwargs): + result = super().__call__(*args, **kwargs) # retrieve original output + if 'logits' in kwargs.get('layers', []): + result = result.isel(neuroid=slice(1, None)) # remove background class in last layer + return result + def get_model(name): """ @@ -27,8 +36,9 @@ def get_model(name): :return: the model instance """ assert name == 'mobilenet_v2_0_5_192' + model = torch.load(model_weight_path.as_posix(), weights_only=False) preprocessing = functools.partial(load_preprocess_images, image_size=192, preprocess_type='inception') - wrapper = PytorchWrapper(identifier=name, model=model, preprocessing=preprocessing) + wrapper = MobilenetPytorchWrapper(identifier=name, model=model, preprocessing=preprocessing) wrapper.image_size = 192 return wrapper @@ -70,4 +80,4 @@ def get_bibtex(name): 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__) \ No newline at end of file + check_models.check_base_models(__name__) diff --git a/brainscore_vision/models/mobilenet_v2_0_5_224/model.py b/brainscore_vision/models/mobilenet_v2_0_5_224/model.py index 90a2748c1..d3884d245 100644 --- a/brainscore_vision/models/mobilenet_v2_0_5_224/model.py +++ b/brainscore_vision/models/mobilenet_v2_0_5_224/model.py @@ -1,8 +1,8 @@ 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 from brainscore_vision.model_helpers.s3 import load_weight_file +from brainscore_vision.models.mobilenet_v2_0_5_192.model import MobilenetPytorchWrapper import torch import imp @@ -15,7 +15,6 @@ version_id="null", sha1="649501eadcf01f871bdb2265aa7dcac80594160a") MainModel = imp.load_source('MainModel',model_path.as_posix()) -model = torch.load(model_weight_path.as_posix()) def get_model(name): """ @@ -27,17 +26,9 @@ def get_model(name): :return: the model instance """ assert name == 'mobilenet_v2_0_5_224' - last_layer = model - while last_layer._modules: - last_layer = last_layer._modules[next(reversed(last_layer._modules))] - last_layer.register_forward_hook(lambda _layer, _input, logits: logits[:, 1:]) - + model = torch.load(model_weight_path.as_posix(), weights_only=False) preprocessing = functools.partial(load_preprocess_images, image_size=224, preprocess_type='inception') - wrapper = PytorchWrapper(identifier=name, model=model, preprocessing=preprocessing) - wrapper.image_size = 224 - return wrapper - preprocessing = functools.partial(load_preprocess_images, image_size=224, preprocess_type='inception') - wrapper = PytorchWrapper(identifier=name, model=model, preprocessing=preprocessing) + wrapper = MobilenetPytorchWrapper(identifier=name, model=model, preprocessing=preprocessing) wrapper.image_size = 224 return wrapper diff --git a/brainscore_vision/models/mobilenet_v2_0_75_160/model.py b/brainscore_vision/models/mobilenet_v2_0_75_160/model.py index c32a1db01..f027d5a81 100644 --- a/brainscore_vision/models/mobilenet_v2_0_75_160/model.py +++ b/brainscore_vision/models/mobilenet_v2_0_75_160/model.py @@ -1,8 +1,8 @@ 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 from brainscore_vision.model_helpers.s3 import load_weight_file +from brainscore_vision.models.mobilenet_v2_0_5_192.model import MobilenetPytorchWrapper import torch import imp @@ -15,7 +15,6 @@ version_id="null", sha1="9fc6f5e9864d524760c6e1dc8aa5702415457df4") MainModel = imp.load_source('MainModel',model_path.as_posix()) -model = torch.load(model_weight_path.as_posix()) def get_model(name): @@ -28,8 +27,9 @@ def get_model(name): :return: the model instance """ assert name == 'mobilenet_v2_0_75_160' + model = torch.load(model_weight_path.as_posix(), weights_only=False) preprocessing = functools.partial(load_preprocess_images, image_size=160, preprocess_type='inception') - wrapper = PytorchWrapper(identifier=name, model=model, preprocessing=preprocessing) + wrapper = MobilenetPytorchWrapper(identifier=name, model=model, preprocessing=preprocessing) wrapper.image_size = 160 return wrapper @@ -71,4 +71,4 @@ def get_bibtex(name): 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__) \ No newline at end of file + check_models.check_base_models(__name__) diff --git a/brainscore_vision/models/mobilenet_v2_0_75_192/model.py b/brainscore_vision/models/mobilenet_v2_0_75_192/model.py index feaf28762..ba6c9dac8 100644 --- a/brainscore_vision/models/mobilenet_v2_0_75_192/model.py +++ b/brainscore_vision/models/mobilenet_v2_0_75_192/model.py @@ -1,8 +1,8 @@ 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 from brainscore_vision.model_helpers.s3 import load_weight_file +from brainscore_vision.models.mobilenet_v2_0_5_192.model import MobilenetPytorchWrapper import torch import imp @@ -15,7 +15,7 @@ version_id="null", sha1="af063236e83cb92fd78ed3eb7d9d2d4a65d794ab") MainModel = imp.load_source('MainModel', model_path.as_posix()) -model = torch.load(model_weight_path.as_posix()) + def get_model(name): """ @@ -28,7 +28,8 @@ def get_model(name): """ assert name == 'mobilenet_v2_0_75_192' preprocessing = functools.partial(load_preprocess_images, image_size=192, preprocess_type='inception') - wrapper = PytorchWrapper(identifier=name, model=model, preprocessing=preprocessing) + model = torch.load(model_weight_path.as_posix(), weights_only=False) + wrapper = MobilenetPytorchWrapper(identifier=name, model=model, preprocessing=preprocessing) wrapper.image_size = 192 return wrapper @@ -68,4 +69,4 @@ def get_bibtex(name): 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__) \ No newline at end of file + check_models.check_base_models(__name__) From ee45d8c85f606b0f278e400b80e2223d8e9122e0 Mon Sep 17 00:00:00 2001 From: Sam Winebrake <85908068+samwinebrake@users.noreply.github.com> Date: Fri, 31 Jan 2025 12:01:06 -0500 Subject: [PATCH 2/6] add mobilenet_v2_0_75_224 (#1744) * add mobilenet_v2_0_75_224 * Add mobilenet_v2_0_75_224.json to region_layer_map for model mobilenet_v2_0_75_224 * add mobilenet wrapper * fix weights only error --------- Co-authored-by: KartikP --- .../models/mobilenet_v2_0_75_224/__init__.py | 7 ++ .../models/mobilenet_v2_0_75_224/model.py | 73 +++++++++++++++++++ .../mobilenet_v2_0_75_224.json | 6 ++ .../mobilenet_v2_0_75_224/requirements.txt | 2 + .../models/mobilenet_v2_0_75_224/test.py | 8 ++ 5 files changed, 96 insertions(+) create mode 100644 brainscore_vision/models/mobilenet_v2_0_75_224/__init__.py create mode 100644 brainscore_vision/models/mobilenet_v2_0_75_224/model.py create mode 100644 brainscore_vision/models/mobilenet_v2_0_75_224/region_layer_map/mobilenet_v2_0_75_224.json create mode 100644 brainscore_vision/models/mobilenet_v2_0_75_224/requirements.txt create mode 100644 brainscore_vision/models/mobilenet_v2_0_75_224/test.py diff --git a/brainscore_vision/models/mobilenet_v2_0_75_224/__init__.py b/brainscore_vision/models/mobilenet_v2_0_75_224/__init__.py new file mode 100644 index 000000000..615953710 --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_0_75_224/__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['mobilenet_v2_0_75_224'] = \ + lambda: ModelCommitment(identifier='mobilenet_v2_0_75_224', activations_model=get_model('mobilenet_v2_0_75_224'), layers=get_layers('mobilenet_v2_0_75_224')) \ No newline at end of file diff --git a/brainscore_vision/models/mobilenet_v2_0_75_224/model.py b/brainscore_vision/models/mobilenet_v2_0_75_224/model.py new file mode 100644 index 000000000..232a892f6 --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_0_75_224/model.py @@ -0,0 +1,73 @@ +import functools +from brainscore_vision.model_helpers.activations.pytorch import load_preprocess_images +from brainscore_vision.model_helpers.check_submission import check_models +from brainscore_vision.model_helpers.s3 import load_weight_file +from brainscore_vision.models.mobilenet_v2_0_5_192.model import MobilenetPytorchWrapper +import torch +import imp + +model_path = load_weight_file(bucket="brainscore-storage", folder_name="brainscore-vision/models", + relative_path="mobilenet_v2_0.75_224/mobilenet.py", + version_id="null", + sha1="e2dc4cd2fc8f922755b45e1e6149c3d8cc19622e") +model_weight_path = load_weight_file(bucket="brainscore-storage", folder_name="brainscore-vision/models", + relative_path="mobilenet_v2_0.75_224/mobilenet.pth", + version_id="null", + sha1="df37e28722d56b91d2151c2d06b5b4bc1aef2390") +MainModel = imp.load_source('MainModel', model_path.as_posix()) + +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 == 'mobilenet_v2_0_75_224' + preprocessing = functools.partial(load_preprocess_images, image_size=224, preprocess_type='inception') + model = torch.load(model_weight_path.as_posix(), weights_only=False) + wrapper = MobilenetPytorchWrapper(identifier=name, model=model, preprocessing=preprocessing) + wrapper.image_size = 224 + return wrapper + + +def get_layers(name): + assert name == 'mobilenet_v2_0_75_224' + layer_names = (['MobilenetV2_Conv_Conv2D'] + + [f'MobilenetV2_expanded_conv_{i}_expand_Conv2D' for i in range(1, 17)] + + ['MobilenetV2_Conv_1_Conv2D']) + return layer_names + + +def get_bibtex(name): + """ + A method returning the bibtex reference of the requested model as a string. + """ + return ''' +@article{DBLP:journals/corr/abs-1801-04381, + author = {Mark Sandler and + Andrew G. Howard and + Menglong Zhu and + Andrey Zhmoginov and + Liang{-}Chieh Chen}, + title = {Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification, + Detection and Segmentation}, + journal = {CoRR}, + volume = {abs/1801.04381}, + year = {2018}, + url = {http://arxiv.org/abs/1801.04381}, + eprinttype = {arXiv}, + eprint = {1801.04381}, + timestamp = {Tue, 12 Jan 2021 15:30:06 +0100}, + biburl = {https://dblp.org/rec/journals/corr/abs-1801-04381.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/mobilenet_v2_0_75_224/region_layer_map/mobilenet_v2_0_75_224.json b/brainscore_vision/models/mobilenet_v2_0_75_224/region_layer_map/mobilenet_v2_0_75_224.json new file mode 100644 index 000000000..c39b4dbd8 --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_0_75_224/region_layer_map/mobilenet_v2_0_75_224.json @@ -0,0 +1,6 @@ +{ + "V1": "MobilenetV2_expanded_conv_9_expand_Conv2D", + "V2": "MobilenetV2_expanded_conv_7_expand_Conv2D", + "V4": "MobilenetV2_expanded_conv_7_expand_Conv2D", + "IT": "MobilenetV2_expanded_conv_14_expand_Conv2D" +} \ No newline at end of file diff --git a/brainscore_vision/models/mobilenet_v2_0_75_224/requirements.txt b/brainscore_vision/models/mobilenet_v2_0_75_224/requirements.txt new file mode 100644 index 000000000..dcdb28bcf --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_0_75_224/requirements.txt @@ -0,0 +1,2 @@ +imp +torch \ No newline at end of file diff --git a/brainscore_vision/models/mobilenet_v2_0_75_224/test.py b/brainscore_vision/models/mobilenet_v2_0_75_224/test.py new file mode 100644 index 000000000..b4e06b999 --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_0_75_224/test.py @@ -0,0 +1,8 @@ +import brainscore_vision +import pytest + + +@pytest.mark.travis_slow +def test_has_identifier(): + model = brainscore_vision.load_model('mobilenet_v2_0_75_224') + assert model.identifier == 'mobilenet_v2_0_75_224' From d3b3ea71f261f01495d5154c2acc184038cd4e73 Mon Sep 17 00:00:00 2001 From: Sam Winebrake <85908068+samwinebrake@users.noreply.github.com> Date: Fri, 31 Jan 2025 12:01:25 -0500 Subject: [PATCH 3/6] add mobilenet_v2_1_0_128 (#1745) * add mobilenet_v2_1_0_128 * Add mobilenet_v2_1_0_128.json to region_layer_map for model mobilenet_v2_1_0_128 * add mobilenet wrapper * fix weights only error --------- Co-authored-by: KartikP --- .../models/mobilenet_v2_1_0_128/__init__.py | 7 ++ .../models/mobilenet_v2_1_0_128/model.py | 73 +++++++++++++++++++ .../mobilenet_v2_1_0_128.json | 6 ++ .../mobilenet_v2_1_0_128/requirements.txt | 2 + .../models/mobilenet_v2_1_0_128/test.py | 8 ++ 5 files changed, 96 insertions(+) create mode 100644 brainscore_vision/models/mobilenet_v2_1_0_128/__init__.py create mode 100644 brainscore_vision/models/mobilenet_v2_1_0_128/model.py create mode 100644 brainscore_vision/models/mobilenet_v2_1_0_128/region_layer_map/mobilenet_v2_1_0_128.json create mode 100644 brainscore_vision/models/mobilenet_v2_1_0_128/requirements.txt create mode 100644 brainscore_vision/models/mobilenet_v2_1_0_128/test.py diff --git a/brainscore_vision/models/mobilenet_v2_1_0_128/__init__.py b/brainscore_vision/models/mobilenet_v2_1_0_128/__init__.py new file mode 100644 index 000000000..7e03f9f1a --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_0_128/__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['mobilenet_v2_1_0_128'] = \ + lambda: ModelCommitment(identifier='mobilenet_v2_1_0_128', activations_model=get_model('mobilenet_v2_1_0_128'), layers=get_layers('mobilenet_v2_1_0_128')) \ No newline at end of file diff --git a/brainscore_vision/models/mobilenet_v2_1_0_128/model.py b/brainscore_vision/models/mobilenet_v2_1_0_128/model.py new file mode 100644 index 000000000..cf277f678 --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_0_128/model.py @@ -0,0 +1,73 @@ +import functools +from brainscore_vision.model_helpers.activations.pytorch import load_preprocess_images +from brainscore_vision.model_helpers.check_submission import check_models +from brainscore_vision.model_helpers.s3 import load_weight_file +from brainscore_vision.models.mobilenet_v2_0_5_192.model import MobilenetPytorchWrapper +import torch +import imp + +model_path = load_weight_file(bucket="brainscore-storage", folder_name="brainscore-vision/models", + relative_path="mobilenet_v2_1.0_128/mobilenet_v2_1.py", + version_id="null", + sha1="c5f5fe31e92fc8fee3580f1703fcd3db74f6a753") +model_weight_path = load_weight_file(bucket="brainscore-storage", folder_name="brainscore-vision/models", + relative_path="mobilenet_v2_1.0_128/mobilenet_v2_1.0_128_frozen.pth", + version_id="null", + sha1="5f7f2f0117fc74d16e839bddf63036e6ef6b3e42") +MainModel = imp.load_source('MainModel',model_path.as_posix()) + +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 == 'mobilenet_v2_1_0_128' + preprocessing = functools.partial(load_preprocess_images, image_size=128, preprocess_type='inception') + model = torch.load(model_weight_path.as_posix(), weights_only=False) + wrapper = MobilenetPytorchWrapper(identifier=name, model=model, preprocessing=preprocessing) + wrapper.image_size = 128 + return wrapper + + +def get_layers(name): + assert name == 'mobilenet_v2_1_0_128' + layer_names = (['MobilenetV2_Conv_Conv2D'] + + [f'MobilenetV2_expanded_conv_{i}_expand_Conv2D' for i in range(1, 17)] + + ['MobilenetV2_Conv_1_Conv2D']) + return layer_names + + +def get_bibtex(name): + """ + A method returning the bibtex reference of the requested model as a string. + """ + return ''' +@article{DBLP:journals/corr/abs-1801-04381, + author = {Mark Sandler and + Andrew G. Howard and + Menglong Zhu and + Andrey Zhmoginov and + Liang{-}Chieh Chen}, + title = {Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification, + Detection and Segmentation}, + journal = {CoRR}, + volume = {abs/1801.04381}, + year = {2018}, + url = {http://arxiv.org/abs/1801.04381}, + eprinttype = {arXiv}, + eprint = {1801.04381}, + timestamp = {Tue, 12 Jan 2021 15:30:06 +0100}, + biburl = {https://dblp.org/rec/journals/corr/abs-1801-04381.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/mobilenet_v2_1_0_128/region_layer_map/mobilenet_v2_1_0_128.json b/brainscore_vision/models/mobilenet_v2_1_0_128/region_layer_map/mobilenet_v2_1_0_128.json new file mode 100644 index 000000000..d9f981d8c --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_0_128/region_layer_map/mobilenet_v2_1_0_128.json @@ -0,0 +1,6 @@ +{ + "V1": "MobilenetV2_expanded_conv_4_expand_Conv2D", + "V2": "MobilenetV2_expanded_conv_7_expand_Conv2D", + "V4": "MobilenetV2_expanded_conv_5_expand_Conv2D", + "IT": "MobilenetV2_expanded_conv_14_expand_Conv2D" +} \ No newline at end of file diff --git a/brainscore_vision/models/mobilenet_v2_1_0_128/requirements.txt b/brainscore_vision/models/mobilenet_v2_1_0_128/requirements.txt new file mode 100644 index 000000000..dcdb28bcf --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_0_128/requirements.txt @@ -0,0 +1,2 @@ +imp +torch \ No newline at end of file diff --git a/brainscore_vision/models/mobilenet_v2_1_0_128/test.py b/brainscore_vision/models/mobilenet_v2_1_0_128/test.py new file mode 100644 index 000000000..801661dc2 --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_0_128/test.py @@ -0,0 +1,8 @@ +import brainscore_vision +import pytest + + +@pytest.mark.travis_slow +def test_has_identifier(): + model = brainscore_vision.load_model('mobilenet_v2_1_0_128') + assert model.identifier == 'mobilenet_v2_1_0_128' \ No newline at end of file From 31514da818dc0dd067367db0ad4d6e8c92b5a74c Mon Sep 17 00:00:00 2001 From: Sam Winebrake <85908068+samwinebrake@users.noreply.github.com> Date: Fri, 31 Jan 2025 12:01:46 -0500 Subject: [PATCH 4/6] add mobilenet_v2_1_0_160 (#1746) * add mobilenet_v2_1_0_160 * Add mobilenet_v2_1_0_160.json to region_layer_map for model mobilenet_v2_1_0_160 * add mobilenet wrapper * Update model.py --------- Co-authored-by: KartikP --- .../models/mobilenet_v2_1_0_160/__init__.py | 7 ++ .../models/mobilenet_v2_1_0_160/model.py | 73 +++++++++++++++++++ .../mobilenet_v2_1_0_160.json | 6 ++ .../mobilenet_v2_1_0_160/requirements.txt | 2 + .../models/mobilenet_v2_1_0_160/test.py | 8 ++ 5 files changed, 96 insertions(+) create mode 100644 brainscore_vision/models/mobilenet_v2_1_0_160/__init__.py create mode 100644 brainscore_vision/models/mobilenet_v2_1_0_160/model.py create mode 100644 brainscore_vision/models/mobilenet_v2_1_0_160/region_layer_map/mobilenet_v2_1_0_160.json create mode 100644 brainscore_vision/models/mobilenet_v2_1_0_160/requirements.txt create mode 100644 brainscore_vision/models/mobilenet_v2_1_0_160/test.py diff --git a/brainscore_vision/models/mobilenet_v2_1_0_160/__init__.py b/brainscore_vision/models/mobilenet_v2_1_0_160/__init__.py new file mode 100644 index 000000000..63c697c63 --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_0_160/__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['mobilenet_v2_1_0_160'] = \ + lambda: ModelCommitment(identifier='mobilenet_v2_1_0_160', activations_model=get_model('mobilenet_v2_1_0_160'), layers=get_layers('mobilenet_v2_1_0_160')) \ No newline at end of file diff --git a/brainscore_vision/models/mobilenet_v2_1_0_160/model.py b/brainscore_vision/models/mobilenet_v2_1_0_160/model.py new file mode 100644 index 000000000..59d64175d --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_0_160/model.py @@ -0,0 +1,73 @@ +import functools +from brainscore_vision.model_helpers.activations.pytorch import load_preprocess_images +from brainscore_vision.model_helpers.check_submission import check_models +from brainscore_vision.model_helpers.s3 import load_weight_file +from brainscore_vision.models.mobilenet_v2_0_5_192.model import MobilenetPytorchWrapper +import torch +import imp + +model_path = load_weight_file(bucket="brainscore-storage", folder_name="brainscore-vision/models", + relative_path="mobilenet_v2_1.0_160/mobilenet_v2_1.py", + version_id="null", + sha1="cbf3a3e34652f2eb4836929eba848b9dcad26a5c") +model_weight_path = load_weight_file(bucket="brainscore-storage", folder_name="brainscore-vision/models", + relative_path="mobilenet_v2_1.0_160/mobilenet_v2_1.0_160_frozen.pth", + version_id="null", + sha1="c588bc1589f49c62dd4e6de014c02f34b358fe04") +MainModel = imp.load_source('MainModel',model_path.as_posix()) + +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 == 'mobilenet_v2_1_0_160' + preprocessing = functools.partial(load_preprocess_images, image_size=160, preprocess_type='inception') + model = torch.load(model_weight_path.as_posix(), weights_only=False) + wrapper = MobilenetPytorchWrapper(identifier=name, model=model, preprocessing=preprocessing) + wrapper.image_size = 160 + return wrapper + + +def get_layers(name): + assert name == 'mobilenet_v2_1_0_160' + layer_names = (['MobilenetV2_Conv_Conv2D'] + + [f'MobilenetV2_expanded_conv_{i}_expand_Conv2D' for i in range(1, 17)] + + ['MobilenetV2_Conv_1_Conv2D']) + return layer_names + + +def get_bibtex(name): + """ + A method returning the bibtex reference of the requested model as a string. + """ + return ''' +@article{DBLP:journals/corr/abs-1801-04381, + author = {Mark Sandler and + Andrew G. Howard and + Menglong Zhu and + Andrey Zhmoginov and + Liang{-}Chieh Chen}, + title = {Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification, + Detection and Segmentation}, + journal = {CoRR}, + volume = {abs/1801.04381}, + year = {2018}, + url = {http://arxiv.org/abs/1801.04381}, + eprinttype = {arXiv}, + eprint = {1801.04381}, + timestamp = {Tue, 12 Jan 2021 15:30:06 +0100}, + biburl = {https://dblp.org/rec/journals/corr/abs-1801-04381.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/mobilenet_v2_1_0_160/region_layer_map/mobilenet_v2_1_0_160.json b/brainscore_vision/models/mobilenet_v2_1_0_160/region_layer_map/mobilenet_v2_1_0_160.json new file mode 100644 index 000000000..24f8ae441 --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_0_160/region_layer_map/mobilenet_v2_1_0_160.json @@ -0,0 +1,6 @@ +{ + "V1": "MobilenetV2_expanded_conv_6_expand_Conv2D", + "V2": "MobilenetV2_expanded_conv_8_expand_Conv2D", + "V4": "MobilenetV2_expanded_conv_7_expand_Conv2D", + "IT": "MobilenetV2_expanded_conv_14_expand_Conv2D" +} \ No newline at end of file diff --git a/brainscore_vision/models/mobilenet_v2_1_0_160/requirements.txt b/brainscore_vision/models/mobilenet_v2_1_0_160/requirements.txt new file mode 100644 index 000000000..dcdb28bcf --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_0_160/requirements.txt @@ -0,0 +1,2 @@ +imp +torch \ No newline at end of file diff --git a/brainscore_vision/models/mobilenet_v2_1_0_160/test.py b/brainscore_vision/models/mobilenet_v2_1_0_160/test.py new file mode 100644 index 000000000..3bb2774a4 --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_0_160/test.py @@ -0,0 +1,8 @@ +import brainscore_vision +import pytest + + +@pytest.mark.travis_slow +def test_has_identifier(): + model = brainscore_vision.load_model('mobilenet_v2_1_0_160') + assert model.identifier == 'mobilenet_v2_1_0_160' \ No newline at end of file From a4051b5d031558fa1a807c82f943bda3ccc020a9 Mon Sep 17 00:00:00 2001 From: Sam Winebrake <85908068+samwinebrake@users.noreply.github.com> Date: Fri, 31 Jan 2025 12:02:03 -0500 Subject: [PATCH 5/6] add mobilenet_v2_1_0_192 (#1747) * add mobilenet_v2_1_0_192 * Add mobilenet_v2_1_0_192.json to region_layer_map for model mobilenet_v2_1_0_192 * add mobilenet wrapper * fix weights only error --------- Co-authored-by: KartikP --- .../models/mobilenet_v2_1_0_192/__init__.py | 7 ++ .../models/mobilenet_v2_1_0_192/model.py | 73 +++++++++++++++++++ .../mobilenet_v2_1_0_192.json | 6 ++ .../mobilenet_v2_1_0_192/requirements.txt | 2 + .../models/mobilenet_v2_1_0_192/test.py | 8 ++ 5 files changed, 96 insertions(+) create mode 100644 brainscore_vision/models/mobilenet_v2_1_0_192/__init__.py create mode 100644 brainscore_vision/models/mobilenet_v2_1_0_192/model.py create mode 100644 brainscore_vision/models/mobilenet_v2_1_0_192/region_layer_map/mobilenet_v2_1_0_192.json create mode 100644 brainscore_vision/models/mobilenet_v2_1_0_192/requirements.txt create mode 100644 brainscore_vision/models/mobilenet_v2_1_0_192/test.py diff --git a/brainscore_vision/models/mobilenet_v2_1_0_192/__init__.py b/brainscore_vision/models/mobilenet_v2_1_0_192/__init__.py new file mode 100644 index 000000000..088491807 --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_0_192/__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['mobilenet_v2_1_0_192'] = \ + lambda: ModelCommitment(identifier='mobilenet_v2_1_0_192', activations_model=get_model('mobilenet_v2_1_0_192'), layers=get_layers('mobilenet_v2_1_0_192')) diff --git a/brainscore_vision/models/mobilenet_v2_1_0_192/model.py b/brainscore_vision/models/mobilenet_v2_1_0_192/model.py new file mode 100644 index 000000000..f6539f0ee --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_0_192/model.py @@ -0,0 +1,73 @@ +import functools +from brainscore_vision.model_helpers.activations.pytorch import load_preprocess_images +from brainscore_vision.model_helpers.check_submission import check_models +from brainscore_vision.model_helpers.s3 import load_weight_file +from brainscore_vision.models.mobilenet_v2_0_5_192.model import MobilenetPytorchWrapper +import torch +import imp + +model_path = load_weight_file(bucket="brainscore-storage", folder_name="brainscore-vision/models", + relative_path="mobilenet_v2_1.0_192/mobilenet_v2_1.py", + version_id="null", + sha1="b2126dc4767dc454fe94e5c18f86c61466159292") +model_weight_path = load_weight_file(bucket="brainscore-storage", folder_name="brainscore-vision/models", + relative_path="mobilenet_v2_1.0_192/mobilenet_v2_1.0_192_frozen.pth", + version_id="null", + sha1="6b1964a2d6d39559a21e49adc8e6616826f556b5") +MainModel = imp.load_source('MainModel',model_path.as_posix()) + +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 == 'mobilenet_v2_1_0_192' + preprocessing = functools.partial(load_preprocess_images, image_size=192, preprocess_type='inception') + model = torch.load(model_weight_path.as_posix(), weights_only=False) + wrapper = MobilenetPytorchWrapper(identifier=name, model=model, preprocessing=preprocessing) + wrapper.image_size = 192 + return wrapper + + +def get_layers(name): + assert name == 'mobilenet_v2_1_0_192' + layer_names = (['MobilenetV2_Conv_Conv2D'] + + [f'MobilenetV2_expanded_conv_{i}_expand_Conv2D' for i in range(1, 17)] + + ['MobilenetV2_Conv_1_Conv2D']) + return layer_names + + +def get_bibtex(name): + """ + A method returning the bibtex reference of the requested model as a string. + """ + return ''' +@article{DBLP:journals/corr/abs-1801-04381, + author = {Mark Sandler and + Andrew G. Howard and + Menglong Zhu and + Andrey Zhmoginov and + Liang{-}Chieh Chen}, + title = {Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification, + Detection and Segmentation}, + journal = {CoRR}, + volume = {abs/1801.04381}, + year = {2018}, + url = {http://arxiv.org/abs/1801.04381}, + eprinttype = {arXiv}, + eprint = {1801.04381}, + timestamp = {Tue, 12 Jan 2021 15:30:06 +0100}, + biburl = {https://dblp.org/rec/journals/corr/abs-1801-04381.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/mobilenet_v2_1_0_192/region_layer_map/mobilenet_v2_1_0_192.json b/brainscore_vision/models/mobilenet_v2_1_0_192/region_layer_map/mobilenet_v2_1_0_192.json new file mode 100644 index 000000000..be8bd8ea2 --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_0_192/region_layer_map/mobilenet_v2_1_0_192.json @@ -0,0 +1,6 @@ +{ + "V1": "MobilenetV2_expanded_conv_5_expand_Conv2D", + "V2": "MobilenetV2_expanded_conv_8_expand_Conv2D", + "V4": "MobilenetV2_expanded_conv_8_expand_Conv2D", + "IT": "MobilenetV2_expanded_conv_14_expand_Conv2D" +} \ No newline at end of file diff --git a/brainscore_vision/models/mobilenet_v2_1_0_192/requirements.txt b/brainscore_vision/models/mobilenet_v2_1_0_192/requirements.txt new file mode 100644 index 000000000..dcdb28bcf --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_0_192/requirements.txt @@ -0,0 +1,2 @@ +imp +torch \ No newline at end of file diff --git a/brainscore_vision/models/mobilenet_v2_1_0_192/test.py b/brainscore_vision/models/mobilenet_v2_1_0_192/test.py new file mode 100644 index 000000000..1c83aac4e --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_0_192/test.py @@ -0,0 +1,8 @@ +import brainscore_vision +import pytest + + +@pytest.mark.travis_slow +def test_has_identifier(): + model = brainscore_vision.load_model('mobilenet_v2_1_0_192') + assert model.identifier == 'mobilenet_v2_1_0_192' From 3ada646905cce718c6377e334a8b8a7a7130500c Mon Sep 17 00:00:00 2001 From: Sam Winebrake <85908068+samwinebrake@users.noreply.github.com> Date: Fri, 31 Jan 2025 23:49:04 -0500 Subject: [PATCH 6/6] add two mobilenets, update a third (#1766) * add two mobilenets, update a third * Add mobilenet_v2_1_3_224.json to region_layer_map for model mobilenet_v2_1_3_224 * Add mobilenet_v2_1_0_224.json to region_layer_map for model mobilenet_v2_1_0_224 * Add mobilenet_v2_1_4_224.json to region_layer_map for model mobilenet_v2_1_4_224 --------- Co-authored-by: KartikP --- .../__init__.py | 6 +- .../models/mobilenet_v2_1_0_224/model.py | 60 +++++++++++++++ .../mobilenet_v2_1_0_224.json | 6 ++ .../requirements.txt | 0 .../models/mobilenet_v2_1_0_224/test.py | 8 ++ .../models/mobilenet_v2_1_3_224/__init__.py | 7 ++ .../models/mobilenet_v2_1_3_224/model.py | 73 +++++++++++++++++++ .../mobilenet_v2_1_3_224.json | 6 ++ .../mobilenet_v2_1_3_224/requirements.txt | 2 + .../models/mobilenet_v2_1_3_224/test.py | 8 ++ .../models/mobilenet_v2_1_4_224/__init__.py | 7 ++ .../model.py | 6 +- .../mobilenet_v2_1_4_224.json | 6 ++ .../mobilenet_v2_1_4_224/requirements.txt | 3 + .../models/mobilenet_v2_1_4_224/test.py | 8 ++ .../mobilenet_v2_1_4_224_pytorch/test.py | 8 -- 16 files changed, 200 insertions(+), 14 deletions(-) rename brainscore_vision/models/{mobilenet_v2_1_4_224_pytorch => mobilenet_v2_1_0_224}/__init__.py (56%) create mode 100644 brainscore_vision/models/mobilenet_v2_1_0_224/model.py create mode 100644 brainscore_vision/models/mobilenet_v2_1_0_224/region_layer_map/mobilenet_v2_1_0_224.json rename brainscore_vision/models/{mobilenet_v2_1_4_224_pytorch => mobilenet_v2_1_0_224}/requirements.txt (100%) create mode 100644 brainscore_vision/models/mobilenet_v2_1_0_224/test.py create mode 100644 brainscore_vision/models/mobilenet_v2_1_3_224/__init__.py create mode 100644 brainscore_vision/models/mobilenet_v2_1_3_224/model.py create mode 100644 brainscore_vision/models/mobilenet_v2_1_3_224/region_layer_map/mobilenet_v2_1_3_224.json create mode 100644 brainscore_vision/models/mobilenet_v2_1_3_224/requirements.txt create mode 100644 brainscore_vision/models/mobilenet_v2_1_3_224/test.py create mode 100644 brainscore_vision/models/mobilenet_v2_1_4_224/__init__.py rename brainscore_vision/models/{mobilenet_v2_1_4_224_pytorch => mobilenet_v2_1_4_224}/model.py (92%) create mode 100644 brainscore_vision/models/mobilenet_v2_1_4_224/region_layer_map/mobilenet_v2_1_4_224.json create mode 100644 brainscore_vision/models/mobilenet_v2_1_4_224/requirements.txt create mode 100644 brainscore_vision/models/mobilenet_v2_1_4_224/test.py delete mode 100644 brainscore_vision/models/mobilenet_v2_1_4_224_pytorch/test.py diff --git a/brainscore_vision/models/mobilenet_v2_1_4_224_pytorch/__init__.py b/brainscore_vision/models/mobilenet_v2_1_0_224/__init__.py similarity index 56% rename from brainscore_vision/models/mobilenet_v2_1_4_224_pytorch/__init__.py rename to brainscore_vision/models/mobilenet_v2_1_0_224/__init__.py index 4d4eed4b6..4bdb5077c 100644 --- a/brainscore_vision/models/mobilenet_v2_1_4_224_pytorch/__init__.py +++ b/brainscore_vision/models/mobilenet_v2_1_0_224/__init__.py @@ -2,6 +2,6 @@ from brainscore_vision.model_helpers.brain_transformation import ModelCommitment from .model import get_model, get_layers -model_registry['mobilenet_v2_1-4_224_pytorch'] = lambda: ModelCommitment(identifier='mobilenet_v2_1-4_224_pytorch', - activations_model=get_model('mobilenet_v2_1-4_224_pytorch'), - layers=get_layers('mobilenet_v2_1-4_224_pytorch')) \ No newline at end of file +model_registry['mobilenet_v2_1_0_224'] = lambda: ModelCommitment(identifier='mobilenet_v2_1_0_224', + activations_model=get_model('mobilenet_v2_1_0_224'), + layers=get_layers('mobilenet_v2_1_0_224')) diff --git a/brainscore_vision/models/mobilenet_v2_1_0_224/model.py b/brainscore_vision/models/mobilenet_v2_1_0_224/model.py new file mode 100644 index 000000000..f621225ec --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_0_224/model.py @@ -0,0 +1,60 @@ +from brainscore_vision.model_helpers.activations.pytorch import PytorchWrapper +from brainscore_vision.model_helpers.activations.pytorch import load_images, load_preprocess_images +from brainscore_vision.model_helpers.check_submission import check_models +import ssl +from transformers import MobileNetV2ForImageClassification +import functools + +ssl._create_default_https_context = ssl._create_unverified_context + +''' +This is a Pytorch implementation of mobilenet_v2_1.0_224. + +Previously on Brain-Score, this model existed as a Tensorflow model, and was converted via: + https://huggingface.co/Matthijs/mobilenet_v2_1.0_224 + +Disclaimer: This (pytorch) implementation's Brain-Score scores might not align identically with Tensorflow +implementation. +''' + + +def get_model(name): + assert name == 'mobilenet_v2_1_0_224' + model = MobileNetV2ForImageClassification.from_pretrained("Matthijs/mobilenet_v2_1.0_224") + + # this mobilenet was trained with 1001 classes where index 0 is the background class + # (https://huggingface.co/docs/transformers/en/model_doc/mobilenet_v2) + classifier_layer = model.classifier + classifier_layer.register_forward_hook(lambda _layer, _input, logits: logits[:, 1:]) + + preprocessing = functools.partial(load_preprocess_images, image_size=224, preprocess_type='inception') + wrapper = PytorchWrapper(identifier='mobilenet_v2_1_0_224', model=model, + preprocessing=preprocessing, + batch_size=4) # doesn't fit into 12 GB GPU memory otherwise + wrapper.image_size = 224 + return wrapper + + +def get_layers(name): + assert name == 'mobilenet_v2_1_0_224' + layer_names = (['mobilenet_v2.conv_stem'] + + [f'mobilenet_v2.layer.{i}' for i in range(16)] + + ['mobilenet_v2.pooler', 'classifier']) + return layer_names + + +def get_bibtex(model_identifier): + """ + A method returning the bibtex reference of the requested model as a string. + """ + return """@inproceedings{mobilenetv22018, + title={MobileNetV2: Inverted Residuals and Linear Bottlenecks}, + author={Mark Sandler and Andrew Howard and Menglong Zhu and Andrey Zhmoginov and Liang-Chieh Chen}, + booktitle={CVPR}, + year={2018} + } + """ + + +if __name__ == '__main__': + check_models.check_base_models(__name__) diff --git a/brainscore_vision/models/mobilenet_v2_1_0_224/region_layer_map/mobilenet_v2_1_0_224.json b/brainscore_vision/models/mobilenet_v2_1_0_224/region_layer_map/mobilenet_v2_1_0_224.json new file mode 100644 index 000000000..3e761d776 --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_0_224/region_layer_map/mobilenet_v2_1_0_224.json @@ -0,0 +1,6 @@ +{ + "V1": "mobilenet_v2.layer.7", + "V2": "mobilenet_v2.layer.6", + "V4": "mobilenet_v2.layer.6", + "IT": "mobilenet_v2.layer.12" +} \ No newline at end of file diff --git a/brainscore_vision/models/mobilenet_v2_1_4_224_pytorch/requirements.txt b/brainscore_vision/models/mobilenet_v2_1_0_224/requirements.txt similarity index 100% rename from brainscore_vision/models/mobilenet_v2_1_4_224_pytorch/requirements.txt rename to brainscore_vision/models/mobilenet_v2_1_0_224/requirements.txt diff --git a/brainscore_vision/models/mobilenet_v2_1_0_224/test.py b/brainscore_vision/models/mobilenet_v2_1_0_224/test.py new file mode 100644 index 000000000..122304abd --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_0_224/test.py @@ -0,0 +1,8 @@ +import pytest +import brainscore_vision + + +@pytest.mark.travis_slow +def test_has_identifier(): + model = brainscore_vision.load_model('mobilenet_v2_1_0_224') + assert model.identifier == 'mobilenet_v2_1_0_224' \ No newline at end of file diff --git a/brainscore_vision/models/mobilenet_v2_1_3_224/__init__.py b/brainscore_vision/models/mobilenet_v2_1_3_224/__init__.py new file mode 100644 index 000000000..2a91e4a4b --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_3_224/__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['mobilenet_v2_1_3_224'] = \ + lambda: ModelCommitment(identifier='mobilenet_v2_1_3_224', activations_model=get_model('mobilenet_v2_1_3_224'), layers=get_layers('mobilenet_v2_1_3_224')) diff --git a/brainscore_vision/models/mobilenet_v2_1_3_224/model.py b/brainscore_vision/models/mobilenet_v2_1_3_224/model.py new file mode 100644 index 000000000..15004b27c --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_3_224/model.py @@ -0,0 +1,73 @@ +import functools +from brainscore_vision.model_helpers.activations.pytorch import load_preprocess_images +from brainscore_vision.model_helpers.check_submission import check_models +from brainscore_vision.model_helpers.s3 import load_weight_file +from brainscore_vision.models.mobilenet_v2_0_5_192.model import MobilenetPytorchWrapper +import torch +import imp + +model_path = load_weight_file(bucket="brainscore-storage", folder_name="brainscore-vision/models", + relative_path="mobilenet_v2_1.3_224/mobilenet_v2_1.py", + version_id="null", + sha1="9ad5d1f7a44053db0fa61a0c02a0faf76c110a5d") +model_weight_path = load_weight_file(bucket="brainscore-storage", folder_name="brainscore-vision/models", + relative_path="mobilenet_v2_1.3_224/mobilenet_v2_1.3_224_frozen.pth", + version_id="null", + sha1="70b67fed9290691e41e5dde42cfa2edf4dabcfe1") +MainModel = imp.load_source('MainModel', model_path.as_posix()) + +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 == 'mobilenet_v2_1_3_224' + preprocessing = functools.partial(load_preprocess_images, image_size=224, preprocess_type='inception') + model = torch.load(model_weight_path.as_posix(), weights_only=False) + wrapper = MobilenetPytorchWrapper(identifier=name, model=model, preprocessing=preprocessing) + wrapper.image_size = 224 + return wrapper + + +def get_layers(name): + assert name == 'mobilenet_v2_1_3_224' + layer_names = (['MobilenetV2_Conv_Conv2D'] + + [f'MobilenetV2_expanded_conv_{i}_expand_Conv2D' for i in range(1, 17)] + + ['MobilenetV2_Conv_1_Conv2D']) + return layer_names + + +def get_bibtex(name): + """ + A method returning the bibtex reference of the requested model as a string. + """ + return ''' +@article{DBLP:journals/corr/abs-1801-04381, + author = {Mark Sandler and + Andrew G. Howard and + Menglong Zhu and + Andrey Zhmoginov and + Liang{-}Chieh Chen}, + title = {Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification, + Detection and Segmentation}, + journal = {CoRR}, + volume = {abs/1801.04381}, + year = {2018}, + url = {http://arxiv.org/abs/1801.04381}, + eprinttype = {arXiv}, + eprint = {1801.04381}, + timestamp = {Tue, 12 Jan 2021 15:30:06 +0100}, + biburl = {https://dblp.org/rec/journals/corr/abs-1801-04381.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__) \ No newline at end of file diff --git a/brainscore_vision/models/mobilenet_v2_1_3_224/region_layer_map/mobilenet_v2_1_3_224.json b/brainscore_vision/models/mobilenet_v2_1_3_224/region_layer_map/mobilenet_v2_1_3_224.json new file mode 100644 index 000000000..cab4365bf --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_3_224/region_layer_map/mobilenet_v2_1_3_224.json @@ -0,0 +1,6 @@ +{ + "V1": "MobilenetV2_expanded_conv_8_expand_Conv2D", + "V2": "MobilenetV2_expanded_conv_8_expand_Conv2D", + "V4": "MobilenetV2_expanded_conv_8_expand_Conv2D", + "IT": "MobilenetV2_expanded_conv_14_expand_Conv2D" +} \ No newline at end of file diff --git a/brainscore_vision/models/mobilenet_v2_1_3_224/requirements.txt b/brainscore_vision/models/mobilenet_v2_1_3_224/requirements.txt new file mode 100644 index 000000000..dcdb28bcf --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_3_224/requirements.txt @@ -0,0 +1,2 @@ +imp +torch \ No newline at end of file diff --git a/brainscore_vision/models/mobilenet_v2_1_3_224/test.py b/brainscore_vision/models/mobilenet_v2_1_3_224/test.py new file mode 100644 index 000000000..1eb9a0a34 --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_3_224/test.py @@ -0,0 +1,8 @@ +import brainscore_vision +import pytest + + +@pytest.mark.travis_slow +def test_has_identifier(): + model = brainscore_vision.load_model('mobilenet_v2_1_3_224') + assert model.identifier == 'mobilenet_v2_1_3_224' \ No newline at end of file diff --git a/brainscore_vision/models/mobilenet_v2_1_4_224/__init__.py b/brainscore_vision/models/mobilenet_v2_1_4_224/__init__.py new file mode 100644 index 000000000..9e341bbbd --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_4_224/__init__.py @@ -0,0 +1,7 @@ +from brainscore_vision import model_registry +from brainscore_vision.model_helpers.brain_transformation import ModelCommitment +from .model import get_model, get_layers + +model_registry['mobilenet_v2_1_4_224'] = lambda: ModelCommitment(identifier='mobilenet_v2_1_4_224', + activations_model=get_model('mobilenet_v2_1_4_224'), + layers=get_layers('mobilenet_v2_1_4_224')) \ No newline at end of file diff --git a/brainscore_vision/models/mobilenet_v2_1_4_224_pytorch/model.py b/brainscore_vision/models/mobilenet_v2_1_4_224/model.py similarity index 92% rename from brainscore_vision/models/mobilenet_v2_1_4_224_pytorch/model.py rename to brainscore_vision/models/mobilenet_v2_1_4_224/model.py index cf70c9a85..3d25ff3ec 100644 --- a/brainscore_vision/models/mobilenet_v2_1_4_224_pytorch/model.py +++ b/brainscore_vision/models/mobilenet_v2_1_4_224/model.py @@ -19,7 +19,7 @@ def get_model(name): - assert name == 'mobilenet_v2_1-4_224_pytorch' + assert name == 'mobilenet_v2_1_4_224' model = MobileNetV2ForImageClassification.from_pretrained("Matthijs/mobilenet_v2_1.4_224") # this mobilenet was trained with 1001 classes where index 0 is the background class @@ -28,7 +28,7 @@ def get_model(name): classifier_layer.register_forward_hook(lambda _layer, _input, logits: logits[:, 1:]) preprocessing = functools.partial(load_preprocess_images, image_size=224) - wrapper = PytorchWrapper(identifier='mobilenet_v2_1-4_224_pytorch', model=model, + wrapper = PytorchWrapper(identifier='mobilenet_v2_1_4_224', model=model, preprocessing=preprocessing, batch_size=4) # doesn't fit into 12 GB GPU memory otherwise wrapper.image_size = 224 @@ -36,7 +36,7 @@ def get_model(name): def get_layers(name): - assert name == 'mobilenet_v2_1-4_224_pytorch' + assert name == 'mobilenet_v2_1_4_224' layer_names = (['mobilenet_v2.conv_stem'] + [f'mobilenet_v2.layer.{i}' for i in range(16)] + ['mobilenet_v2.pooler', 'classifier']) diff --git a/brainscore_vision/models/mobilenet_v2_1_4_224/region_layer_map/mobilenet_v2_1_4_224.json b/brainscore_vision/models/mobilenet_v2_1_4_224/region_layer_map/mobilenet_v2_1_4_224.json new file mode 100644 index 000000000..d199ed8ea --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_4_224/region_layer_map/mobilenet_v2_1_4_224.json @@ -0,0 +1,6 @@ +{ + "V1": "mobilenet_v2.layer.3", + "V2": "mobilenet_v2.layer.6", + "V4": "mobilenet_v2.layer.6", + "IT": "mobilenet_v2.layer.12" +} \ No newline at end of file diff --git a/brainscore_vision/models/mobilenet_v2_1_4_224/requirements.txt b/brainscore_vision/models/mobilenet_v2_1_4_224/requirements.txt new file mode 100644 index 000000000..1d28db41f --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_4_224/requirements.txt @@ -0,0 +1,3 @@ +torchvision +torch +transformers \ No newline at end of file diff --git a/brainscore_vision/models/mobilenet_v2_1_4_224/test.py b/brainscore_vision/models/mobilenet_v2_1_4_224/test.py new file mode 100644 index 000000000..5e3a83423 --- /dev/null +++ b/brainscore_vision/models/mobilenet_v2_1_4_224/test.py @@ -0,0 +1,8 @@ +import pytest +import brainscore_vision + + +@pytest.mark.travis_slow +def test_has_identifier(): + model = brainscore_vision.load_model('mobilenet_v2_1_4_224') + assert model.identifier == 'mobilenet_v2_1_4_224' \ No newline at end of file diff --git a/brainscore_vision/models/mobilenet_v2_1_4_224_pytorch/test.py b/brainscore_vision/models/mobilenet_v2_1_4_224_pytorch/test.py deleted file mode 100644 index 7d289e20c..000000000 --- a/brainscore_vision/models/mobilenet_v2_1_4_224_pytorch/test.py +++ /dev/null @@ -1,8 +0,0 @@ -import pytest -import brainscore_vision - - -@pytest.mark.travis_slow -def test_has_identifier(): - model = brainscore_vision.load_model('mobilenet_v2_1-4_224_pytorch') - assert model.identifier == 'mobilenet_v2_1-4_224_pytorch' \ No newline at end of file