From e30253af9f454a40453a26cd2acec8382833f4df Mon Sep 17 00:00:00 2001 From: Jenkins Date: Sun, 21 Dec 2025 09:14:59 -0500 Subject: [PATCH] add resnet50_st_wzc_epoch20 to models --- .../resnet50_st_wzc_epoch20/__init__.py | 5 + .../models/resnet50_st_wzc_epoch20/model.py | 100 ++++++++++++++++++ .../resnet50_st_wzc_epoch20.json | 6 ++ .../resnet50_st_wzc_epoch20/requirements.txt | 2 + .../models/resnet50_st_wzc_epoch20/test.py | 8 ++ 5 files changed, 121 insertions(+) create mode 100644 brainscore_vision/models/resnet50_st_wzc_epoch20/__init__.py create mode 100644 brainscore_vision/models/resnet50_st_wzc_epoch20/model.py create mode 100644 brainscore_vision/models/resnet50_st_wzc_epoch20/region_layer_map/resnet50_st_wzc_epoch20.json create mode 100644 brainscore_vision/models/resnet50_st_wzc_epoch20/requirements.txt create mode 100644 brainscore_vision/models/resnet50_st_wzc_epoch20/test.py diff --git a/brainscore_vision/models/resnet50_st_wzc_epoch20/__init__.py b/brainscore_vision/models/resnet50_st_wzc_epoch20/__init__.py new file mode 100644 index 000000000..c0a7046b4 --- /dev/null +++ b/brainscore_vision/models/resnet50_st_wzc_epoch20/__init__.py @@ -0,0 +1,5 @@ +from brainscore_vision import model_registry +from brainscore_vision.model_helpers.brain_transformation import ModelCommitment +from .model import get_model, get_layers + +model_registry['resnet50_st_wzc_epoch20'] = lambda: ModelCommitment(identifier='resnet50_st_wzc_epoch20', activations_model=get_model('resnet50_st_wzc_epoch20'), layers=get_layers('resnet50_st_wzc_epoch20')) diff --git a/brainscore_vision/models/resnet50_st_wzc_epoch20/model.py b/brainscore_vision/models/resnet50_st_wzc_epoch20/model.py new file mode 100644 index 000000000..4e566bd50 --- /dev/null +++ b/brainscore_vision/models/resnet50_st_wzc_epoch20/model.py @@ -0,0 +1,100 @@ +from brainscore_vision.model_helpers.check_submission import check_models +import functools +import numpy as np +from PIL import Image +import torch +import torchvision.transforms as transforms +import torchvision.models +from brainscore_vision.model_helpers.activations.pytorch import PytorchWrapper +from brainscore_vision.model_helpers.activations.pytorch import load_preprocess_images + +# This is an example implementation for submitting resnet-50 as a pytorch model + +# Attention: It is important, that the wrapper identifier is unique per model! +# The results will otherwise be the same due to brain-scores internal result caching mechanism. +# Please load your pytorch model for usage in CPU. There won't be GPUs available for scoring your model. +# If the model requires a GPU, contact the brain-score team directly. + +# from brainscore_vision.model_helpers.s3 import load_file +device = torch.device("cpu") + +def get_model_list(): + return ['resnet50_st_wzc_epoch20'] + +def get_model(name): + assert name == 'resnet50_st_wzc_epoch20' + + from brainscore_core.supported_data_standards.brainio.s3 import load_file + file_path = load_file(bucket="brainscore-storage", folder_name="brainscore-vision/models/user_755/", + relative_path="checkpoint_19.pth", + version_id="_dVzIkEMGvyQenvnivTq5f6ZI407AAu0", + ), + + checkpoint = torch.load(str(file_path[0]), map_location=lambda storage, loc: storage) + new_state_dict = {} + for key, value in checkpoint["state_dict"].items(): + new_key = key.replace('module.', '', 1) + new_state_dict[new_key] = value + + model = torchvision.models.__dict__["resnet50"]() + model.load_state_dict(new_state_dict, strict=True) + model.to(device) + model.eval() + # model = torchvision.models.resnet50(pretrained=True) + preprocessing = functools.partial(load_preprocess_images_change, image_size=224) + wrapper = PytorchWrapper(identifier='resnet50_st_wzc_epoch20', model=model, preprocessing=preprocessing) + wrapper.image_size = 224 + return wrapper + +# def get_layers(name): +# assert name == 'resnet50_st_wzc' + #return ['conv1','layer1', 'layer2', 'layer3', 'layer4', 'fc'] +def get_layers(name): + assert name == 'resnet50_st_wzc_epoch20' + layer_names = (['conv1'] + [f'layer1.{i}' for i in range(3)] + + [f'layer2.{i}' for i in range(4)] + + [f'layer3.{i}' for i in range(6)] + + [f'layer4.{i}' for i in range(3)] + ['avgpool']) + # layer_names = (['conv1'] + [f'layer1.{0}'] + + # [f'layer2.{0}'] + + # [f'layer3.{0}'] + + # [f'layer4.{0}'] + [f'layer4.{2}'] + ['avgpool']) + return layer_names + + +def get_bibtex(model_identifier): + return """""" + +#-------------------------------------------------------------------- + + +def load_preprocess_images_change(image_filepaths, image_size, **kwargs): + images = [load_image(image_filepath) for image_filepath in image_filepaths] #load_images(image_filepaths) + images = preprocess_images_change(images, image_size=image_size, **kwargs) + return images + +def load_image(image_filepath): + with Image.open(image_filepath) as pil_image: + if 'L' not in pil_image.mode.upper() and 'A' not in pil_image.mode.upper() \ + and 'P' not in pil_image.mode.upper(): # not binary and not alpha and not palletized + # work around to https://github.com/python-pillow/Pillow/issues/1144, + # see https://stackoverflow.com/a/30376272/2225200 + return pil_image.copy() + else: # make sure potential binary images are in RGB + rgb_image = Image.new("RGB", pil_image.size) + rgb_image.paste(pil_image) + return rgb_image + +def preprocess_images_change(images, image_size, **kwargs): + preprocess = transforms.Compose([ + transforms.Resize((image_size, image_size)), + transforms.ToTensor(), + lambda img: img.unsqueeze(0) + ]) + images = [preprocess(image) for image in images] + images = np.concatenate(images) + return images + + +if __name__ == '__main__': + check_models.check_base_models(__name__) diff --git a/brainscore_vision/models/resnet50_st_wzc_epoch20/region_layer_map/resnet50_st_wzc_epoch20.json b/brainscore_vision/models/resnet50_st_wzc_epoch20/region_layer_map/resnet50_st_wzc_epoch20.json new file mode 100644 index 000000000..5ce61e1e2 --- /dev/null +++ b/brainscore_vision/models/resnet50_st_wzc_epoch20/region_layer_map/resnet50_st_wzc_epoch20.json @@ -0,0 +1,6 @@ +{ + "V1": "layer1.0", + "V2": "layer3.0", + "V4": "layer3.0", + "IT": "layer4.0" +} diff --git a/brainscore_vision/models/resnet50_st_wzc_epoch20/requirements.txt b/brainscore_vision/models/resnet50_st_wzc_epoch20/requirements.txt new file mode 100644 index 000000000..fc38174e5 --- /dev/null +++ b/brainscore_vision/models/resnet50_st_wzc_epoch20/requirements.txt @@ -0,0 +1,2 @@ +torchvision +torch \ No newline at end of file diff --git a/brainscore_vision/models/resnet50_st_wzc_epoch20/test.py b/brainscore_vision/models/resnet50_st_wzc_epoch20/test.py new file mode 100644 index 000000000..b7cbfd43e --- /dev/null +++ b/brainscore_vision/models/resnet50_st_wzc_epoch20/test.py @@ -0,0 +1,8 @@ +import pytest +import brainscore_vision + + +@pytest.mark.travis_slow +def test_has_identifier(): + model = brainscore_vision.load_model('resnet50_st_wzc_epoch20') + assert model.identifier == 'resnet50_st_wzc_epoch20'