Spaces:
Sleeping
Sleeping
| """ | |
| Evaluation helper for trained models. | |
| Prefer passing evaluation config explicitly through CLI args. | |
| Legacy checkpoint-name inference is kept as a fallback for old runs. | |
| """ | |
| import argparse | |
| import itertools | |
| import warnings | |
| import numpy as np | |
| import torch | |
| from DQNModel import DQN | |
| from DQN import get_player | |
| from logger import Logger | |
| from evaluator import Evaluator | |
| FRAME_HISTORY = 4 | |
| if __name__ == "__main__": | |
| parser = argparse.ArgumentParser( | |
| formatter_class=argparse.ArgumentDefaultsHelpFormatter) | |
| parser.add_argument( | |
| '--model_files', type=str, nargs='+', required=True, | |
| help="Filepath to the models that must be evaluated") | |
| parser.add_argument( | |
| '--files', type=argparse.FileType('r'), nargs='+', | |
| help="""Filepath to the text file that contains list of images. | |
| Each line of this file is a full path to an image scan. | |
| For (task == train or eval) there should be two input files | |
| ['images', 'landmarks']""") | |
| parser.add_argument( | |
| '--model_name', choices=['CommNet', 'Network3D'], | |
| help='Model architecture to evaluate') | |
| parser.add_argument( | |
| '--agents', type=int, choices=[3, 5, 10], | |
| help='Number of agents used by the model') | |
| parser.add_argument( | |
| '--file_type', choices=['brain', 'cardiac', 'fetal'], | |
| help='Dataset type used for evaluation') | |
| parser.add_argument( | |
| '--collective_rewards', action='store_true', | |
| help='Use attention-based collective rewards') | |
| args = parser.parse_args() | |
| explicit_args = [args.model_name, args.agents, args.file_type] | |
| if any(value is not None for value in explicit_args) and not all( | |
| value is not None for value in explicit_args): | |
| raise ValueError( | |
| "Please provide --model_name, --agents and --file_type together, " | |
| "or omit all three to use legacy name-based inference." | |
| ) | |
| logger = Logger(None, False, None) | |
| x = [0.5,0.25,0.75] | |
| y = [0.5,0.25,0.75] | |
| z = [0.5,0.25,0.75] | |
| fixed_spawn = list(np.array(list(itertools.product(x, y, z))).flatten()) | |
| for model_path in args.model_files: | |
| # mypath = os.path.normpath(model_path) | |
| # python DQN.py --task eval --load runs/Mar01_04-16-35_monal03.doc.ic.ac.ukbrain10DefaultNetwork3d/best_dqn.pt --files /vol/biomedic2/aa16914/shared/RL_Guy/rl-medical/examples/LandmarkDetection/DQN/data/filenames/brain_test_files.txt /vol/biomedic2/aa16914/shared/RL_Guy/rl-medical/examples/LandmarkDetection/DQN/data/filenames/brain_test_landmarks.txt --file_type brain --landmarks 13 14 0 1 2 3 4 5 6 7 --model_name Network3d --viz 0 | |
| if args.model_name and args.agents and args.file_type: | |
| fullName = model_path.split("/")[-2] | |
| model_name = args.model_name | |
| agents = args.agents | |
| file_type = args.file_type | |
| collective_rewards = "attention" if args.collective_rewards else False | |
| else: | |
| warnings.warn( | |
| "Inferring evaluation config from checkpoint name is deprecated and fragile. " | |
| "Please pass --model_name, --agents and --file_type explicitly.", | |
| RuntimeWarning, | |
| ) | |
| fullName = model_path.split("/")[-2] | |
| name = fullName.split("doc.ic.ac.uk")[-1] | |
| if "CommNet" in name: | |
| model_name = "CommNet" | |
| elif "Network3d" in name or "Network3D" in name: | |
| model_name = "Network3D" | |
| else: | |
| raise ValueError("Could not infer model name from checkpoint path: {}".format(model_path)) | |
| if "10" in name: | |
| agents = 10 | |
| elif "5" in name: | |
| agents = 5 | |
| elif "3" in name: | |
| agents = 3 | |
| else: | |
| raise ValueError("Could not infer number of agents from checkpoint path: {}".format(model_path)) | |
| if "brain" in name: | |
| file_type = "brain" | |
| landmarks = [13, 14, 0, 1, 2, 3, 4, 5, 6, 7] | |
| elif "cardiac" in name: | |
| file_type = "cardiac" | |
| landmarks = [4, 5, 0, 1, 2, 3, 4, 5, 6, 7] | |
| elif "fetal" in name: | |
| file_type = "fetal" | |
| landmarks = [10, 11, 12, 1, 2, 3, 4, 5, 6, 7] | |
| else: | |
| raise ValueError("Could not infer file type from checkpoint path: {}".format(model_path)) | |
| collective_rewards = "attention" if "team" in name else False | |
| if args.model_name and args.agents and args.file_type: | |
| if file_type == "brain": | |
| landmarks = [13, 14, 0, 1, 2, 3, 4, 5, 6, 7] | |
| elif file_type == "cardiac": | |
| landmarks = [4, 5, 0, 1, 2, 3, 4, 5, 6, 7] | |
| elif file_type == "fetal": | |
| landmarks = [10, 11, 12, 1, 2, 3, 4, 5, 6, 7] | |
| landmarks = landmarks[:agents] | |
| files = args.files | |
| dqn = DQN(agents, frame_history=FRAME_HISTORY, logger=logger, | |
| type=model_name, collective_rewards=collective_rewards) | |
| model = dqn.q_network | |
| model.load_state_dict(torch.load(model_path, map_location=model.device)) | |
| model.eval() | |
| environment = get_player(files_list=files, | |
| file_type=file_type, | |
| landmark_ids=landmarks, | |
| saveGif=False, | |
| saveVideo=False, | |
| task="eval", | |
| agents=agents, | |
| viz=0, | |
| logger=logger) | |
| evaluator = Evaluator(environment, model, logger, | |
| agents, 200) | |
| mean, std = evaluator.play_n_episodes(fixed_spawn=fixed_spawn, silent=True) | |
| logger.log(f"{fullName}: mean {mean}, std {std}") | |