|
""" |
|
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) |
|
|