VReason-Demo / cxas /models /__init__.py
EvidenceAIResearch's picture
Upload RadGenome demo Space
0d8d0b4 verified
Raw
History Blame Contribute Delete
3.33 kB
import gdown, os, torch
from ..label_mapper import id2label_dict
model_urls = {
'UNet_ResNet50_default': 'https://drive.google.com/file/d/1Y9zubvMzkYHoAqz-NvV6vniH5FKAF2iV/view?usp=drive_link'
}
def get_model(model_name, gpus=''):
"""
Function to load a model by name and optionally move it to specified GPUs.
Args:
model_name (str): Name of the model to load.
gpus (str): String containing GPU device IDs separated by commas.
If empty or 'cpu', the model will be loaded on CPU.
Returns:
torch.nn.Module: Loaded model.
"""
assert model_name.split('_')[0] in list(model_getter.keys())
model = model_getter[model_name.split('_')[0]](model_name)
download_weights(model_name)
model = load_weights(model, model_name, map_location='cpu' if 'cpu' in gpus else 'cuda')
if 'cpu' not in gpus:
gpus = [int(i) for i in gpus.split(',') if len(i) > 0]
if len(gpus) > 1:
assert torch.cuda.is_available()
model.to(gpus[0])
model = torch.nn.DataParallel(model, device_ids=gpus).cuda()
elif len(gpus) == 1:
assert torch.cuda.is_available()
model.to(gpus[0])
return model
def get_unet(model_name):
"""
Function to get a U-Net model.
Args:
model_name (str): Name of the U-Net model.
Returns:
torch.nn.Module: U-Net model.
"""
from .UNet.backbone_unet import BackboneUNet
return BackboneUNet(model_name, len(id2label_dict.keys()))
def download_weights(model_name: str) -> None:
"""
Function to download model weights.
Args:
model_name (str): Name of the model.
"""
if "CXAS_PATH" in os.environ:
store_path = os.path.join(os.environ['CXAS_PATH'], '.cxas')
else:
store_path = os.path.join(os.environ['HOME'], '.cxas')
os.makedirs(os.path.join(store_path, 'weights/'), exist_ok=True)
out_path = os.path.join(store_path, 'weights/{}'.format(model_name + '.pth'))
if os.path.isfile(out_path):
return
else:
gdown.download(model_urls[model_name], out_path, quiet=False, fuzzy=True)
return
def load_weights(model, model_name: str, map_location: str = 'cuda:0'):
"""
Function to load model weights.
Args:
model (torch.nn.Module): Model to load weights into.
model_name (str): Name of the model.
map_location (str): Location to map tensors to (default: 'cuda:0' if available, else 'cpu').
Returns:
torch.nn.Module: Model with loaded weights.
"""
if "CXAS_PATH" in os.environ:
store_path = os.path.join(os.environ['CXAS_PATH'], '.cxas')
else:
store_path = os.path.join(os.environ['HOME'], '.cxas')
out_path = os.path.join(store_path, 'weights/{}'.format(model_name + '.pth'))
assert os.path.isfile(out_path)
checkpoint = torch.load(out_path, weights_only=False, map_location=map_location)
if 'module' in list(checkpoint['model'].keys())[0]:
for i in list(checkpoint['model'].keys()):
checkpoint['model'][i[len('module.'):]] = checkpoint['model'].pop(i)
model.load_state_dict(checkpoint['model'], strict=False)
return model
# Dictionary containing model getter functions
model_getter = {
'UNet': get_unet,
}