| | """ |
| | Code copied from AGXNet: |
| | https://github.com/batmanlab/AGXNet |
| | """ |
| |
|
| | """Create adjacency matrix for representing the relations between anatomical landmarks and observations.""" |
| |
|
| | import argparse |
| | import pandas as pd |
| | import numpy as np |
| | import pickle |
| |
|
| | from tqdm import tqdm, trange |
| | from torch.utils.data import Dataset, DataLoader |
| |
|
| |
|
| | parser = argparse.ArgumentParser(description="Create Adjacency matrix Matrix.") |
| |
|
| | parser.add_argument( |
| | "--input-path", |
| | default="/PROJECT DIR/preprocessing/mimic-cxr-radgraph-sentence-parsed.csv", |
| | help="Itemized input data path.", |
| | ) |
| |
|
| | |
| | NORM_OBS = [ |
| | "normal", |
| | "clear", |
| | "sharp", |
| | "sharply", |
| | "unremarkable", |
| | "intact", |
| | "stable", |
| | "free", |
| | ] |
| |
|
| | |
| | EXCLUDED_OBS = [ |
| | "none", |
| | "unchanged", |
| | "change", |
| | "great", |
| | "similar", |
| | "large", |
| | "small", |
| | "moderate", |
| | "mild", |
| | "median", |
| | "decrease", |
| | "bad", |
| | "more", |
| | "constant", |
| | "worsen", |
| | "new", |
| | "improve", |
| | "status", |
| | "position", |
| | "sternotomy", |
| | "cabg", |
| | "replacement", |
| | "postoperative", |
| | "assessment", |
| | "patient", |
| | ] |
| |
|
| | |
| | ABNORM_OBS = [ |
| | "effusion", |
| | "opacity", |
| | "pneumothorax", |
| | "edema", |
| | "atelectasis", |
| | "tube", |
| | "consolidation", |
| | "process", |
| | "abnormality", |
| | "enlarge", |
| | "tip", |
| | "low", |
| | "pneumonia", |
| | "line", |
| | "congestion", |
| | "catheter", |
| | "cardiomegaly", |
| | "fracture", |
| | "air", |
| | "tortuous", |
| | "lead", |
| | "disease", |
| | "calcification", |
| | "prominence", |
| | "device", |
| | "engorgement", |
| | "picc", |
| | "clip", |
| | "elevation", |
| | "expand", |
| | "nodule", |
| | "wire", |
| | "fluid", |
| | "degenerative", |
| | "pacemaker", |
| | "thicken", |
| | "marking", |
| | "scar", |
| | "hyperinflate", |
| | "blunt", |
| | "loss", |
| | "widen", |
| | "collapse", |
| | "density", |
| | "emphysema", |
| | "aerate", |
| | "mass", |
| | "crowd", |
| | "infiltrate", |
| | "obscure", |
| | "deformity", |
| | "hernia", |
| | "drainage", |
| | "distention", |
| | "shift", |
| | "stent", |
| | "pressure", |
| | "lesion", |
| | "finding", |
| | "borderline", |
| | "hardware", |
| | "dilation", |
| | "chf", |
| | "redistribution", |
| | "aspiration", |
| | ] |
| |
|
| | |
| | LANDMARK_NAME = [ |
| | "trachea", |
| | "left_hilar", |
| | "right_hilar", |
| | "hilar_unspec", |
| | "left_pleural", |
| | "right_pleural", |
| | "pleural_unspec", |
| | "heart_size", |
| | "heart_border", |
| | "left_diaphragm", |
| | "right_diaphragm", |
| | "diaphragm_unspec", |
| | "retrocardiac", |
| | "lower_left_lobe", |
| | "upper_left_lobe", |
| | "lower_right_lobe", |
| | "middle_right_lobe", |
| | "upper_right_lobe", |
| | "left_lower_lung", |
| | "left_mid_lung", |
| | "left_upper_lung", |
| | "left_apical_lung", |
| | "left_lung_unspec", |
| | "right_lower_lung", |
| | "right_mid_lung", |
| | "right_upper_lung", |
| | "right_apical_lung", |
| | "right_lung_unspec", |
| | "lung_apices", |
| | "lung_bases", |
| | "left_costophrenic", |
| | "right_costophrenic", |
| | "costophrenic_unspec", |
| | "cardiophrenic_sulcus", |
| | "mediastinal", |
| | "spine", |
| | "clavicle", |
| | "rib", |
| | "stomach", |
| | "right_atrium", |
| | "right_ventricle", |
| | "aorta", |
| | "svc", |
| | "interstitium", |
| | "parenchymal", |
| | "cavoatrial_junction", |
| | "cardiopulmonary", |
| | "pulmonary", |
| | "lung_volumes", |
| | "unspecified", |
| | "other", |
| | ] |
| |
|
| | OBSERVATION_CLASS = [ |
| | "normal", |
| | "clear", |
| | "sharp", |
| | "sharply", |
| | "unremarkable", |
| | "intact", |
| | "stable", |
| | "free", |
| | "effusion", |
| | "opacity", |
| | "pneumothorax", |
| | "edema", |
| | "atelectasis", |
| | "tube", |
| | "consolidation", |
| | "process", |
| | "abnormality", |
| | "enlarge", |
| | "tip", |
| | "low", |
| | "pneumonia", |
| | "line", |
| | "congestion", |
| | "catheter", |
| | "cardiomegaly", |
| | "fracture", |
| | "air", |
| | "tortuous", |
| | "lead", |
| | "disease", |
| | "calcification", |
| | "prominence", |
| | "device", |
| | "engorgement", |
| | "picc", |
| | "clip", |
| | "elevation", |
| | "expand", |
| | "nodule", |
| | "wire", |
| | "fluid", |
| | "degenerative", |
| | "pacemaker", |
| | "thicken", |
| | "marking", |
| | "scar", |
| | "hyperinflate", |
| | "blunt", |
| | "loss", |
| | "widen", |
| | "collapse", |
| | "density", |
| | "emphysema", |
| | "aerate", |
| | "mass", |
| | "crowd", |
| | "infiltrate", |
| | "obscure", |
| | "deformity", |
| | "hernia", |
| | "drainage", |
| | "distention", |
| | "shift", |
| | "stent", |
| | "pressure", |
| | "lesion", |
| | "finding", |
| | "borderline", |
| | "hardware", |
| | "dilation", |
| | "chf", |
| | "redistribution", |
| | "aspiration", |
| | "tail_abnorm_obs", |
| | "excluded_obs", |
| | ] |
| |
|
| | DICT_ANATOMICAL_LANDMARKS = { |
| | "trachea": {"a": ["trachea", "tracheal"], "m1": [], "m2": [], "sc": [], "t": "m0"}, |
| | "left_hilar": { |
| | "a": ["hilar", "hilum", "perihilar", "infrahilar"], |
| | "m1": ["left"], |
| | "m2": ["right"], |
| | "sc": [], |
| | "t": "m1+m2-", |
| | }, |
| | "right_hilar": { |
| | "a": ["hilar", "hilum", "perihilar", "infrahilar"], |
| | "m1": ["right"], |
| | "m2": ["left"], |
| | "sc": [], |
| | "t": "m1+m2-", |
| | }, |
| | "hilar_unspec": { |
| | "a": ["hilar", "hilum", "perihilar", "infrahilar"], |
| | "m1": ["left", "right"], |
| | "m2": [], |
| | "sc": ["hila", "perihilar|right|left", "perihilar|left|right"], |
| | "t": "m1-", |
| | }, |
| | "left_pleural": { |
| | "a": ["pleural"], |
| | "m1": ["left"], |
| | "m2": ["right"], |
| | "sc": [], |
| | "t": "m1+m2-", |
| | }, |
| | "right_pleural": { |
| | "a": ["pleural"], |
| | "m1": ["right"], |
| | "m2": ["left"], |
| | "sc": [], |
| | "t": "m1+m2-", |
| | }, |
| | "pleural_unspec": { |
| | "a": ["pleural"], |
| | "m1": ["left", "right"], |
| | "m2": [], |
| | "sc": [ |
| | "pleural|left|right", |
| | "pleural|right|left", |
| | "pleural|bilateral|right|left", |
| | "pleural|bilateral|left|right", |
| | ], |
| | "t": "m1-", |
| | }, |
| | "heart_size": { |
| | "a": ["heart", "cardiac"], |
| | "m1": ["border", "borders"], |
| | "m2": [], |
| | "sc": [], |
| | "t": "m1-", |
| | }, |
| | "heart_border": { |
| | "a": ["heart", "cardiac"], |
| | "m1": ["border", "borders"], |
| | "m2": [], |
| | "sc": [], |
| | "t": "m1+", |
| | }, |
| | "left_diaphragm": { |
| | "a": ["diaphragm", "hemidiaphragm"], |
| | "m1": ["left"], |
| | "m2": ["right"], |
| | "sc": [], |
| | "t": "m1+m2-", |
| | }, |
| | "right_diaphragm": { |
| | "a": ["diaphragm", "hemidiaphragm"], |
| | "m1": ["right"], |
| | "m2": ["left"], |
| | "sc": [], |
| | "t": "m1+m2-", |
| | }, |
| | "diaphragm_unspec": { |
| | "a": ["diaphragm", "diaphragms", "hemidiaphragms", "hemidiaphragm"], |
| | "m1": ["left", "right"], |
| | "m2": [], |
| | "sc": ["hemidiaphragm|left|right", "hemidiaphragm|right|left"], |
| | "t": "m1-", |
| | }, |
| | "retrocardiac": {"a": ["retrocardiac"], "m1": [], "m2": [], "sc": [], "t": "m0"}, |
| | "lower_left_lobe": { |
| | "a": ["lobe"], |
| | "m1": ["left"], |
| | "m2": ["lower"], |
| | "sc": [], |
| | "t": "m1+m2+", |
| | }, |
| | "upper_left_lobe": { |
| | "a": ["lobe"], |
| | "m1": ["left"], |
| | "m2": ["upper"], |
| | "sc": ["lingula", "lingular"], |
| | "t": "m1+m2+", |
| | }, |
| | "lower_right_lobe": { |
| | "a": ["lobe"], |
| | "m1": ["right"], |
| | "m2": ["lower"], |
| | "sc": [], |
| | "t": "m1+m2+", |
| | }, |
| | "middle_right_lobe": { |
| | "a": ["lobe"], |
| | "m1": ["right"], |
| | "m2": ["middle"], |
| | "sc": [], |
| | "t": "m1+m2+", |
| | }, |
| | "upper_right_lobe": { |
| | "a": ["lobe"], |
| | "m1": ["right"], |
| | "m2": ["upper"], |
| | "sc": [], |
| | "t": "m1+m2+", |
| | }, |
| | "left_lower_lung": { |
| | "a": ["lung"], |
| | "m1": ["left"], |
| | "m2": ["lower", "base", "basilar", "basal", "basis"], |
| | "sc": ["base|left", "basilar|left", "basal|left", "lung|left|bases"], |
| | "t": "m1+m2+", |
| | }, |
| | "left_mid_lung": { |
| | "a": ["lung"], |
| | "m1": ["left"], |
| | "m2": ["middle", "mid"], |
| | "sc": ["midlung|left"], |
| | "t": "m1+m2+", |
| | }, |
| | "left_upper_lung": { |
| | "a": ["lung"], |
| | "m1": ["left"], |
| | "m2": ["upper"], |
| | "sc": [], |
| | "t": "m1+m2+", |
| | }, |
| | "left_apical_lung": { |
| | "a": ["apex", "apical", "apical", "apicolateral"], |
| | "m1": ["left"], |
| | "m2": ["right"], |
| | "sc": [], |
| | "t": "m1+m2-", |
| | }, |
| | "left_lung_unspec": { |
| | "a": ["lung", "hemithorax"], |
| | "m1": ["left", "left-sided"], |
| | "m2": [ |
| | "volume", |
| | "volumes", |
| | "right", |
| | "lower", |
| | "base", |
| | "bases", |
| | "basilar", |
| | "basilar", |
| | "basal", |
| | "basis", |
| | "middle", |
| | "mid", |
| | "upper", |
| | "apex", |
| | "apical", |
| | "perihilar", |
| | ], |
| | "sc": ["left", "left side", "thorax|left|hemi"], |
| | "t": "m1+m2-", |
| | }, |
| | "right_lower_lung": { |
| | "a": ["lung"], |
| | "m1": ["right"], |
| | "m2": ["lower", "base", "basilar", "basal", "basis"], |
| | "sc": ["base|right", "basilar|right", "basal|right", "lung|right|bases"], |
| | "t": "m1+m2+", |
| | }, |
| | "right_mid_lung": { |
| | "a": ["lung"], |
| | "m1": ["right"], |
| | "m2": ["middle", "mid"], |
| | "sc": [], |
| | "t": "m1+m2+", |
| | }, |
| | "right_upper_lung": { |
| | "a": ["lung"], |
| | "m1": ["right"], |
| | "m2": ["upper"], |
| | "sc": [], |
| | "t": "m1+m2+", |
| | }, |
| | "right_apical_lung": { |
| | "a": ["apex", "apical", "apical", "apicolateral"], |
| | "m1": ["right"], |
| | "m2": ["left"], |
| | "sc": [], |
| | "t": "m1+m2-", |
| | }, |
| | "right_lung_unspec": { |
| | "a": ["lung", "hemithorax"], |
| | "m1": ["right", "right-sided"], |
| | "m2": [ |
| | "volume", |
| | "volumes", |
| | "left", |
| | "lower", |
| | "base", |
| | "bases", |
| | "basilar", |
| | "basilar", |
| | "basal", |
| | "basis", |
| | "middle", |
| | "mid", |
| | "upper", |
| | "apex", |
| | "apical", |
| | "perihilar", |
| | ], |
| | "sc": ["right", "right side", "thorax|right|hemi"], |
| | "t": "m1+m2-", |
| | }, |
| | "lung_apices": { |
| | "a": ["apices", "apical"], |
| | "m1": ["left", "right"], |
| | "m2": [], |
| | "sc": ["biapical", "lungs|upper"], |
| | "t": "m1-", |
| | }, |
| | "lung_bases": { |
| | "a": ["lung", "lungs"], |
| | "m1": ["left", "right"], |
| | "m2": ["bibasilar", "basilar", "base", "bases", "bibasal", "basal"], |
| | "sc": [ |
| | "lung|lower", |
| | "lungs|lower", |
| | "bibasilar", |
| | "basilar", |
| | "bases", |
| | "bibasal", |
| | "basal", |
| | "basal|bilateral", |
| | "lobe|lower", |
| | "lobes|lower", |
| | "lobe|bilateral|lower", |
| | "bases|both", |
| | "bibasilar|left|right", |
| | "bibasilar|right|left", |
| | ], |
| | "t": "m1-m2+", |
| | }, |
| | "left_costophrenic": { |
| | "a": ["costophrenic"], |
| | "m1": ["left"], |
| | "m2": ["right"], |
| | "sc": [], |
| | "t": "m1+m2-", |
| | }, |
| | "right_costophrenic": { |
| | "a": ["costophrenic"], |
| | "m1": ["right"], |
| | "m2": ["left"], |
| | "sc": [], |
| | "t": "m1+m2-", |
| | }, |
| | "costophrenic_unspec": { |
| | "a": ["costophrenic"], |
| | "m1": ["left", "right"], |
| | "m2": [], |
| | "sc": [], |
| | "t": "m1-", |
| | }, |
| | "cardiophrenic_sulcus": { |
| | "a": ["cardiophrenic"], |
| | "m1": [], |
| | "m2": [], |
| | "sc": [], |
| | "t": "m0", |
| | }, |
| | "mediastinal": { |
| | "a": ["mediastinal", "cardiomediastinal", "mediastinum", "cardiomediastinum"], |
| | "m1": [], |
| | "m2": [], |
| | "sc": [], |
| | "t": "m0", |
| | }, |
| | "spine": {"a": ["spine", "spinal"], "m1": [], "m2": [], "sc": [], "t": "m0"}, |
| | "clavicle": { |
| | "a": ["clavicle", "clavicles"], |
| | "m1": [], |
| | "m2": [], |
| | "sc": [], |
| | "t": "m0", |
| | }, |
| | "rib": {"a": ["rib", "ribs"], "m1": [], "m2": [], "sc": [], "t": "m0"}, |
| | "stomach": { |
| | "a": ["stomach", "abdomen", "abdominal"], |
| | "m1": [], |
| | "m2": [], |
| | "sc": [], |
| | "t": "m0", |
| | }, |
| | "right_atrium": { |
| | "a": ["atrium", "atrial"], |
| | "m1": ["right"], |
| | "m2": ["left"], |
| | "sc": [], |
| | "t": "m1+m2-", |
| | }, |
| | "right_ventricle": { |
| | "a": ["ventricle", "ventricular"], |
| | "m1": ["right"], |
| | "m2": ["left"], |
| | "sc": [], |
| | "t": "m1+m2-", |
| | }, |
| | "aorta": {"a": ["aorta", "aortic"], "m1": [], "m2": [], "sc": [], "t": "m0"}, |
| | "svc": {"a": ["svc"], "m1": [], "m2": [], "sc": [], "t": "m0"}, |
| | "interstitium": { |
| | "a": ["interstitium", "interstitial"], |
| | "m1": [], |
| | "m2": [], |
| | "sc": [], |
| | "t": "m0", |
| | }, |
| | "parenchymal": {"a": ["parenchymal"], "m1": [], "m2": [], "sc": [], "t": "m0"}, |
| | "cavoatrial_junction": { |
| | "a": ["cavoatrial junction"], |
| | "m1": [], |
| | "m2": [], |
| | "sc": [], |
| | "t": "m0", |
| | }, |
| | "cardiopulmonary": { |
| | "a": ["cardiopulmonary"], |
| | "m1": [], |
| | "m2": [], |
| | "sc": [], |
| | "t": "m0", |
| | }, |
| | "pulmonary": {"a": ["pulmonary"], "m1": [], "m2": [], "sc": [], "t": "m0"}, |
| | "lung_volumes": { |
| | "a": ["lungs", "lung", "volume", "volumes"], |
| | "m1": [ |
| | "left", |
| | "right", |
| | "lower", |
| | "base", |
| | "bases", |
| | "basilar", |
| | "basal", |
| | "basis", |
| | "middle", |
| | "mid", |
| | "upper", |
| | "apex", |
| | "apical", |
| | "apical", |
| | ], |
| | "m2": [], |
| | "sc": [], |
| | "t": "m1-", |
| | }, |
| | } |
| |
|
| |
|
| | class LandmarkObservationAdjacentMatrix(Dataset): |
| | def __init__(self, LANDMARK_NAME, OBSERVATION_CLASS, df_anatomy_label): |
| | self.LANDMARK_NAME = LANDMARK_NAME |
| | self.OBSERVATION_CLASS = OBSERVATION_CLASS |
| | self.df_anatomy_label = df_anatomy_label |
| |
|
| | |
| | self.sids = list(self.df_anatomy_label["study_id"].unique()) |
| |
|
| | def __getitem__(self, idx): |
| | sid = self.sids[idx] |
| | df_sid = self.df_anatomy_label[self.df_anatomy_label["study_id"] == sid] |
| | landmark_observation_adj_mtx = ( |
| | np.zeros((len(LANDMARK_NAME), len(OBSERVATION_CLASS))) - 1.0 |
| | ) |
| | for index, row in df_sid.iterrows(): |
| | try: |
| | observation_idx = self.OBSERVATION_CLASS.index( |
| | row.obs_lemma_grp |
| | ) |
| | landmark_idx = self.LANDMARK_NAME.index(row.landmark_name) |
| |
|
| | curr_val = landmark_observation_adj_mtx[landmark_idx, observation_idx] |
| |
|
| | |
| | |
| | if row.label == "OBS-DP": |
| | landmark_observation_adj_mtx[landmark_idx, observation_idx] = 1.0 |
| | elif row.label == "OBS-DA": |
| | landmark_observation_adj_mtx[ |
| | landmark_idx, observation_idx |
| | ] = np.maximum(curr_val, 0.0) |
| | except: |
| | pass |
| | return sid, landmark_observation_adj_mtx |
| |
|
| | def __len__(self): |
| | return len(self.sids) |
| |
|
| |
|
| | def anatomy_to_landmark(x, a, m1=[], m2=[], sc=[], t="m0"): |
| | """ |
| | Args: |
| | x: input anatomy, e.g., "lobe|left|lower" |
| | a: base anatomy set, e.g., ["hilar", "hilum", "perihilar"] |
| | m1: level 1 modifier, e.g., ["left", "right"] |
| | m2: level 2 modifier, e.g., ["upper", "middle", "lower"] |
| | s: special cases, e.g., ["chest"] |
| | t: type, ["m2+", "m1+m2-"] |
| | Return: |
| | flag: boolean, matched or not matched |
| | """ |
| | s = set(x.split("|")) |
| | if t == "m1+m2+": |
| | flag = (len(s & set(a)) > 0) & (len(s & set(m1)) > 0) & (len(s & set(m2)) > 0) |
| | elif t == "m1+m2-": |
| | flag = (len(s & set(a)) > 0) & (len(s & set(m1)) > 0) & (len(s & set(m2)) == 0) |
| | elif t == "m1-m2+": |
| | flag = (len(s & set(a)) > 0) & (len(s & set(m1)) == 0) & (len(s & set(m2)) > 0) |
| | elif t == "m1-m2-": |
| | flag = (len(s & set(a)) > 0) & (len(s & set(m1)) == 0) & (len(s & set(m2)) == 0) |
| | elif t == "m1+": |
| | flag = (len(s & set(a)) > 0) & (len(s & set(m1)) > 0) |
| | elif t == "m2+": |
| | flag = (len(s & set(a)) > 0) & (len(s & set(m2)) > 0) |
| | elif t == "m1-": |
| | flag = (len(s & set(a)) > 0) & (len(s & set(m1)) == 0) |
| | elif t == "m2-": |
| | flag = (len(s & set(a)) > 0) & (len(s & set(m2)) == 0) |
| | elif t == "m0": |
| | flag = len(s & set(a)) > 0 |
| |
|
| | if sc: |
| | flag = flag | (x in sc) |
| | return flag |
| |
|
| |
|
| | def create_adj_matrix(args): |
| | |
| | print("Loading parsed RadGraph data...") |
| | df_anatomy_label = pd.read_csv(args.input_path, dtype=str) |
| |
|
| | |
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["enlargement", "increase"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "enlarge" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["engorge"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "engorgement" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["opacification", "opacity-"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "opacity" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["calcify"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "calcification" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["effusion ;"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "effusion" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin( |
| | ["atelectatic", "atelectasis ;", "atelectase"] |
| | ) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "atelectasis" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["aeration"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "aerate" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["distend", "distension"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "distention" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["wide"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "widen" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["prominent"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "prominence" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["haze"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "haziness" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["masse"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "mass" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["kyphotic"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "kyphosis" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["degenerate"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "degenerative" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["obscuration"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "obscure" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["fibrotic"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "fibrosis" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["nodular", "nodularity"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "nodule" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["ventilate"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "ventilation" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["tortuosity"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "tortuous" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["elongate"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "elongation" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["elevate"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "elevation" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["drain"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "drainage" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["deviate"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "deviation" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["consolidative", "consolidate"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "consolidation" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["dilate", "dilatation"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "dilation" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin( |
| | ["hydropneumothorax", "pneumothoraces", "pneumothorace"] |
| | ) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "pneumothorax" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin(["improvement", "improved"]) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "improve" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin( |
| | [ |
| | "can not be assess", |
| | "can not be evaluate", |
| | "not well see", |
| | "not well assess", |
| | "can not be accurately assess", |
| | "not well evaluate", |
| | "not well visualize", |
| | "difficult to evaluate", |
| | "poorly see", |
| | ] |
| | ) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "difficult to assess" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"] == "pacer" |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "pacemaker" |
| |
|
| | idx_replace = df_anatomy_label["obs_lemma"].isin( |
| | ["infection", "infectious", "infectious process"] |
| | ) |
| | df_anatomy_label.loc[idx_replace, "obs_lemma"] = "pneumonia" |
| |
|
| | df_anatomy_label.loc[df_anatomy_label["label"].isna(), "label"] = "OBS-NA" |
| |
|
| | |
| | landmark_name = [] |
| | for index, row in tqdm( |
| | df_anatomy_label.iterrows(), total=df_anatomy_label.shape[0] |
| | ): |
| | x = row.anatomy |
| | flag = False |
| | for k, v in DICT_ANATOMICAL_LANDMARKS.items(): |
| | flag = anatomy_to_landmark(x, v["a"], v["m1"], v["m2"], v["sc"], v["t"]) |
| | if flag: |
| | landmark_name.append(k) |
| | break |
| | if (not flag) & (row.anatomy == "unspecified"): |
| | landmark_name.append("unspecified") |
| | elif (not flag) & (row.anatomy != "unspecified"): |
| | landmark_name.append("other") |
| |
|
| | df_anatomy_label["landmark_name"] = landmark_name |
| |
|
| | |
| | df_anatomy_label["obs_lemma_grp"] = df_anatomy_label["obs_lemma"] |
| |
|
| | idx1 = df_anatomy_label["obs_lemma"].isin(NORM_OBS) |
| | idx2 = df_anatomy_label["obs_lemma"].isin(ABNORM_OBS) |
| | idx3 = df_anatomy_label["obs_lemma"].isin(EXCLUDED_OBS) |
| |
|
| | df_anatomy_label.loc[idx3, "obs_lemma_grp"] = "excluded_obs" |
| |
|
| | idx = (~idx1) & (~idx2) & (~idx3) |
| | df_anatomy_label.loc[idx, "obs_lemma_grp"] = "tail_abnorm_obs" |
| |
|
| | |
| | dataset = LandmarkObservationAdjacentMatrix( |
| | LANDMARK_NAME, OBSERVATION_CLASS, df_anatomy_label |
| | ) |
| | loader = DataLoader( |
| | dataset, batch_size=32, shuffle=False, num_workers=8, drop_last=False |
| | ) |
| |
|
| | sid_lst = [] |
| | adj_mtx_lst = [] |
| | for index, data in tqdm(enumerate(loader), total=len(loader)): |
| | sid, landmark_observation_adj_mtx = data |
| | sid_lst.append(sid) |
| | adj_mtx_lst.append(landmark_observation_adj_mtx) |
| |
|
| | |
| | full_sids = np.concatenate(sid_lst, axis=0) |
| | full_adj_mtx = np.concatenate(adj_mtx_lst, axis=0) |
| | dict_adj_mtx = {} |
| | for i in trange(len(full_sids)): |
| | sid = full_sids[i] |
| | dict_adj_mtx[sid] = full_adj_mtx[i] |
| |
|
| | np.save("landmark_observation_sids.npy", full_sids) |
| | print("landmark_observation_sids.npy has been saved!") |
| | np.save("landmark_observation_adj_mtx.npy", full_adj_mtx) |
| | print("landmark_observation_sids.npy has been saved!") |
| |
|
| |
|
| | if __name__ == "__main__": |
| | args = parser.parse_args() |
| | create_adj_matrix(args) |
| |
|