From 9f3eb7becb52b37b9d4ed9d160ac5ade687d245c Mon Sep 17 00:00:00 2001 From: bganglia Date: Mon, 3 Aug 2020 16:15:00 -0400 Subject: [PATCH 01/52] Open MIMIC from tarfile --- torchxrayvision/datasets.py | 48 ++++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index b3555ca..4aea4b0 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -7,6 +7,8 @@ from torchvision import transforms from tqdm import tqdm import numpy as np +from io import BytesIO +import tarfile import os,sys,os.path import pandas as pd import pickle @@ -92,6 +94,7 @@ def check_paths_exist(self): raise Exception("csvpath must be a file") + class Merge_Dataset(Dataset): def __init__(self, datasets, seed=0, label_concat=False): super(Merge_Dataset, self).__init__() @@ -195,7 +198,23 @@ def __len__(self): def __getitem__(self, idx): return self.dataset[self.idxs[idx]] - +class TarDataset(Dataset): + def __init__(self, imgpath): + if imgpath.endswith(".tar"): + self.tarred = tarfile.open(imgpath) + self.tar_paths = self.tarred.getmembers() + else: + self.tarred = None + def get_image(self, path): + if self.tarred is None: + return imread(os.path.join(self.imgpath, path)) + else: + for tar_path in self.tar_paths: + name = tar_path.name + if name.endswith(path): + bytes = self.tarred.extractfile(name).read() + return np.array(Image.open(BytesIO(bytes))) + class NIH_Dataset(Dataset): """ NIH ChestX-ray8 dataset @@ -293,9 +312,9 @@ def __getitem__(self, idx): imgid = self.csv['Image Index'].iloc[idx] - img_path = os.path.join(self.imgpath, imgid) + #img_path = os.path.join(self.imgpath, imgid) #print(img_path) - img = imread(img_path) + img = self.get_image(imgid) if self.normalize: img = normalize(img, self.MAXVAL) @@ -776,7 +795,7 @@ def __getitem__(self, idx): return {"img":img, "lab":self.labels[idx], "idx":idx} -class MIMIC_Dataset(Dataset): +class MIMIC_Dataset(TarDataset): """ Johnson AE, Pollard TJ, Berkowitz S, Greenbaum NR, Lungren MP, Deng CY, Mark RG, Horng S. MIMIC-CXR: A large publicly available database of labeled chest radiographs. arXiv preprint arXiv:1901.07042. 2019 Jan 21. @@ -788,7 +807,7 @@ class MIMIC_Dataset(Dataset): def __init__(self, imgpath, csvpath,metacsvpath, views=["PA"], transform=None, data_aug=None, flat_dir=True, seed=0, unique_patients=True): - super(MIMIC_Dataset, self).__init__() + super(MIMIC_Dataset, self).__init__(imgpath) np.random.seed(seed) # Reset the seed so all runs are the same. self.MAXVAL = 255 @@ -807,7 +826,7 @@ def __init__(self, imgpath, csvpath,metacsvpath, views=["PA"], transform=None, d "Support Devices"] self.pathologies = sorted(self.pathologies) - + self.imgpath = imgpath self.transform = transform self.data_aug = data_aug @@ -815,10 +834,12 @@ def __init__(self, imgpath, csvpath,metacsvpath, views=["PA"], transform=None, d self.csv = pd.read_csv(self.csvpath) self.metacsvpath = metacsvpath self.metacsv = pd.read_csv(self.metacsvpath) - + + self.csv = self.csv.set_index(['subject_id', 'study_id']) + self.metacsv = self.metacsv.set_index(['subject_id', 'study_id']) - + self.csv = self.csv.join(self.metacsv).reset_index() # Keep only the PA view. @@ -859,14 +880,14 @@ def __len__(self): return len(self.labels) def __getitem__(self, idx): - + subjectid = str(self.csv.iloc[idx]["subject_id"]) studyid = str(self.csv.iloc[idx]["study_id"]) dicom_id = str(self.csv.iloc[idx]["dicom_id"]) - img_path = os.path.join(self.imgpath, "p" + subjectid[:2], "p" + subjectid, "s" + studyid, dicom_id + ".jpg") - img = imread(img_path) - img = normalize(img, self.MAXVAL) + img_fname = os.path.join("p" + subjectid[:2], "p" + subjectid, "s" + studyid, dicom_id + ".jpg") + img = self.get_image(img_fname) + img = normalize(img, self.MAXVAL) # Check that images are 2D arrays if len(img.shape) > 2: @@ -879,7 +900,7 @@ def __getitem__(self, idx): if self.transform is not None: img = self.transform(img) - + if self.data_aug is not None: img = self.data_aug(img) @@ -1206,7 +1227,6 @@ def __init__(self): def __call__(self, x): return(self.to_pil(x[0])) - class XRayResizer(object): def __init__(self, size, engine="skimage"): self.size = size From 303832ce906dd4eac9af4af8da7bc5e5b923c489 Mon Sep 17 00:00:00 2001 From: bganglia Date: Fri, 7 Aug 2020 21:41:12 -0400 Subject: [PATCH 02/52] revert whitespace --- torchxrayvision/datasets.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index aeac055..c0ed0ae 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -94,7 +94,6 @@ def check_paths_exist(self): raise Exception("csvpath must be a file") - class Merge_Dataset(Dataset): def __init__(self, datasets, seed=0, label_concat=False): super(Merge_Dataset, self).__init__() @@ -198,6 +197,7 @@ def __len__(self): def __getitem__(self, idx): return self.dataset[self.idxs[idx]] + class TarDataset(Dataset): def __init__(self, imgpath): if imgpath.endswith(".tar"): @@ -888,7 +888,7 @@ def __init__(self, imgpath, csvpath,metacsvpath, views=["PA"], transform=None, d "Support Devices"] self.pathologies = sorted(self.pathologies) - + self.imgpath = imgpath self.transform = transform self.data_aug = data_aug @@ -901,7 +901,7 @@ def __init__(self, imgpath, csvpath,metacsvpath, views=["PA"], transform=None, d self.csv = self.csv.set_index(['subject_id', 'study_id']) self.metacsv = self.metacsv.set_index(['subject_id', 'study_id']) - + self.csv = self.csv.join(self.metacsv).reset_index() # Keep only the PA view. @@ -942,7 +942,7 @@ def __len__(self): return len(self.labels) def __getitem__(self, idx): - + subjectid = str(self.csv.iloc[idx]["subject_id"]) studyid = str(self.csv.iloc[idx]["study_id"]) dicom_id = str(self.csv.iloc[idx]["dicom_id"]) @@ -962,7 +962,7 @@ def __getitem__(self, idx): if self.transform is not None: img = self.transform(img) - + if self.data_aug is not None: img = self.data_aug(img) @@ -1289,6 +1289,7 @@ def __init__(self): def __call__(self, x): return(self.to_pil(x[0])) + class XRayResizer(object): def __init__(self, size, engine="skimage"): self.size = size From da2490b5e09b39e6727b087c2c428353fc029d40 Mon Sep 17 00:00:00 2001 From: bganglia Date: Sat, 8 Aug 2020 16:19:16 -0400 Subject: [PATCH 03/52] don't use get_image() in NIH_Dataset --- torchxrayvision/datasets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index c0ed0ae..9d541e8 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -314,7 +314,7 @@ def __getitem__(self, idx): imgid = self.csv['Image Index'].iloc[idx] #img_path = os.path.join(self.imgpath, imgid) #print(img_path) - img = self.get_image(imgid) + img = imread(img_path) if self.normalize: img = normalize(img, self.MAXVAL) From 8fb3f039c56e4138d0db2c51af2939a6331af10a Mon Sep 17 00:00:00 2001 From: bganglia Date: Sat, 8 Aug 2020 16:41:27 -0400 Subject: [PATCH 04/52] NIH_Dataset extends TarDataset --- torchxrayvision/datasets.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index 9d541e8..65c7953 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -200,7 +200,7 @@ def __getitem__(self, idx): class TarDataset(Dataset): def __init__(self, imgpath): - if imgpath.endswith(".tar"): + if tarfile.is_tarfile(imgpath): self.tarred = tarfile.open(imgpath) self.tar_paths = self.tarred.getmembers() else: @@ -215,7 +215,7 @@ def get_image(self, path): bytes = self.tarred.extractfile(name).read() return np.array(Image.open(BytesIO(bytes))) -class NIH_Dataset(Dataset): +class NIH_Dataset(TarDataset): """ NIH ChestX-ray8 dataset @@ -314,7 +314,7 @@ def __getitem__(self, idx): imgid = self.csv['Image Index'].iloc[idx] #img_path = os.path.join(self.imgpath, imgid) #print(img_path) - img = imread(img_path) + img = self.get_image(imgid) if self.normalize: img = normalize(img, self.MAXVAL) From 395e5e4ee762df9c9bdd0c1b2d7fa0e4da4ee160 Mon Sep 17 00:00:00 2001 From: bganglia Date: Sat, 8 Aug 2020 19:10:06 -0400 Subject: [PATCH 05/52] Store tarfiles in dictionary --- torchxrayvision/datasets.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index 65c7953..281e24b 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -49,6 +49,8 @@ thispath = os.path.dirname(os.path.realpath(__file__)) +tarfile_contents = {} + def normalize(sample, maxval): """Scales images to be roughly [-1024 1024].""" sample = (2 * (sample.astype(np.float32) / maxval) - 1.) * 1024 @@ -202,6 +204,12 @@ class TarDataset(Dataset): def __init__(self, imgpath): if tarfile.is_tarfile(imgpath): self.tarred = tarfile.open(imgpath) + absolute_tarpath = os.path.abspath(imgpath) + if absolute_tarpath in tarfile_contents: + self.tarred = tarfile_contents[absolute_tarpath] + else: + self.tarred = tarfile.open(imgpath) + tarfile_contents[absolute_tarpath] = self.tarred self.tar_paths = self.tarred.getmembers() else: self.tarred = None @@ -868,7 +876,6 @@ class MIMIC_Dataset(TarDataset): """ def __init__(self, imgpath, csvpath,metacsvpath, views=["PA"], transform=None, data_aug=None, flat_dir=True, seed=0, unique_patients=True): - super(MIMIC_Dataset, self).__init__(imgpath) np.random.seed(seed) # Reset the seed so all runs are the same. self.MAXVAL = 255 From fa69973545cd3e8bacc683357f1e7d95f34c015a Mon Sep 17 00:00:00 2001 From: bganglia Date: Sat, 8 Aug 2020 19:42:44 -0400 Subject: [PATCH 06/52] use getnames intead of getmembers --- torchxrayvision/datasets.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index 281e24b..1a0b630 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -210,7 +210,7 @@ def __init__(self, imgpath): else: self.tarred = tarfile.open(imgpath) tarfile_contents[absolute_tarpath] = self.tarred - self.tar_paths = self.tarred.getmembers() + self.tar_paths = self.tarred.getnames() else: self.tarred = None def get_image(self, path): @@ -218,9 +218,8 @@ def get_image(self, path): return imread(os.path.join(self.imgpath, path)) else: for tar_path in self.tar_paths: - name = tar_path.name if name.endswith(path): - bytes = self.tarred.extractfile(name).read() + bytes = self.tarred.extractfile(tar_path).read() return np.array(Image.open(BytesIO(bytes))) class NIH_Dataset(TarDataset): From abbbfec92fe4b789729aebecec9d595f9c65f9a8 Mon Sep 17 00:00:00 2001 From: bganglia Date: Sun, 9 Aug 2020 12:31:29 -0400 Subject: [PATCH 07/52] use O(n) method for determining imgid from tar_path --- torchxrayvision/datasets.py | 47 +++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index 1a0b630..17ea193 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -46,7 +46,7 @@ 'Lung Opacity', 'Enlarged Cardiomediastinum' ] - + thispath = os.path.dirname(os.path.realpath(__file__)) tarfile_contents = {} @@ -98,7 +98,6 @@ def check_paths_exist(self): class Merge_Dataset(Dataset): def __init__(self, datasets, seed=0, label_concat=False): - super(Merge_Dataset, self).__init__() np.random.seed(seed) # Reset the seed so all runs are the same. self.datasets = datasets self.length = 0 @@ -132,6 +131,8 @@ def __init__(self, datasets, seed=0, label_concat=False): self.csv = pd.concat([d.csv for d in datasets]) except: print("Could not merge dataframes (.csv not available):", sys.exc_info()[0]) + + super(Merge_Dataset, self).__init__() def __repr__(self): @@ -199,28 +200,36 @@ def __len__(self): def __getitem__(self, idx): return self.dataset[self.idxs[idx]] - class TarDataset(Dataset): + path_length = None def __init__(self, imgpath): - if tarfile.is_tarfile(imgpath): + self.filename_mapping = {} + if not os.path.isdir(imgpath): self.tarred = tarfile.open(imgpath) absolute_tarpath = os.path.abspath(imgpath) if absolute_tarpath in tarfile_contents: - self.tarred = tarfile_contents[absolute_tarpath] + self.tarred, self.filename_mapping = tarfile_contents[absolute_tarpath] else: self.tarred = tarfile.open(imgpath) - tarfile_contents[absolute_tarpath] = self.tarred - self.tar_paths = self.tarred.getnames() + self.tar_paths = self.tarred.getnames() + for tar_path in self.tar_paths: + if tar_path.endswith("jpg"): + tar_path_part, filename = os.path.split(tar_path) + for i in range(self.path_length - 1): + tar_path_part, filename_part = os.path.split(tar_path_part) + filename = os.path.join(filename_part, filename) + self.filename_mapping[filename] = tar_path + tarfile_contents[absolute_tarpath] = self.tarred, self.filename_mapping else: self.tarred = None + def get_image(self, path): if self.tarred is None: return imread(os.path.join(self.imgpath, path)) else: - for tar_path in self.tar_paths: - if name.endswith(path): - bytes = self.tarred.extractfile(tar_path).read() - return np.array(Image.open(BytesIO(bytes))) + tar_path = self.filename_mapping[path] + bytes = self.tarred.extractfile(tar_path).read() + return np.array(Image.open(BytesIO(bytes))) class NIH_Dataset(TarDataset): """ @@ -247,7 +256,7 @@ def __init__(self, imgpath, normalize=True, pathology_masks=False): - super(NIH_Dataset, self).__init__() + super(NIH_Dataset, self).__init__(imgpath) np.random.seed(seed) # Reset the seed so all runs are the same. self.imgpath = imgpath @@ -865,6 +874,7 @@ def __getitem__(self, idx): return {"img":img, "lab":self.labels[idx], "idx":idx} class MIMIC_Dataset(TarDataset): + path_length = 4 """ Johnson AE, Pollard TJ, Berkowitz S, Greenbaum NR, Lungren MP, Deng CY, Mark RG, Horng S. MIMIC-CXR: A large publicly available database of labeled chest radiographs. arXiv preprint arXiv:1901.07042. 2019 Jan 21. @@ -875,7 +885,6 @@ class MIMIC_Dataset(TarDataset): """ def __init__(self, imgpath, csvpath,metacsvpath, views=["PA"], transform=None, data_aug=None, flat_dir=True, seed=0, unique_patients=True): - super(MIMIC_Dataset, self).__init__(imgpath) np.random.seed(seed) # Reset the seed so all runs are the same. self.MAXVAL = 255 @@ -903,7 +912,6 @@ def __init__(self, imgpath, csvpath,metacsvpath, views=["PA"], transform=None, d self.metacsvpath = metacsvpath self.metacsv = pd.read_csv(self.metacsvpath) - self.csv = self.csv.set_index(['subject_id', 'study_id']) self.metacsv = self.metacsv.set_index(['subject_id', 'study_id']) @@ -938,6 +946,8 @@ def __init__(self, imgpath, csvpath,metacsvpath, views=["PA"], transform=None, d # rename pathologies self.pathologies = np.char.replace(self.pathologies, "Pleural Effusion", "Effusion") + + super(MIMIC_Dataset, self).__init__(imgpath) def __repr__(self): @@ -947,13 +957,16 @@ def __repr__(self): def __len__(self): return len(self.labels) - def __getitem__(self, idx): - + def get_imgid(self, idx): subjectid = str(self.csv.iloc[idx]["subject_id"]) studyid = str(self.csv.iloc[idx]["study_id"]) dicom_id = str(self.csv.iloc[idx]["dicom_id"]) - img_fname = os.path.join("p" + subjectid[:2], "p" + subjectid, "s" + studyid, dicom_id + ".jpg") + return img_fname + + def __getitem__(self, idx): + img_fname = self.get_imgid(idx) + img = self.get_image(img_fname) img = normalize(img, self.MAXVAL) From 2ba6f5d948ce07935e0abe00e0f5161243c09195 Mon Sep 17 00:00:00 2001 From: bganglia Date: Sun, 9 Aug 2020 12:32:32 -0400 Subject: [PATCH 08/52] random data in MIMIC format --- tests/gen_mimic.py | 158 ++++++++++++++++++ tests/gen_mimic.sh | 2 + tests/gen_mimic/images-224.tar | Bin 0 -> 343552 bytes .../02d9dd68-7c42e9bb-c2c45394-53a325e3.jpg | Bin 0 -> 920 bytes .../33093b96-ae905e2e-3714c3cc-45536dab.jpg | Bin 0 -> 920 bytes .../722678b5-671357c9-aaae7d33-f8862161.jpg | Bin 0 -> 920 bytes .../452df9cf-1cbb6b5e-d8639a1e-a08d32e3.jpg | Bin 0 -> 920 bytes .../408d770a-8163a0db-e6484216-c9f8814e.jpg | Bin 0 -> 920 bytes .../8dc7085c-f637862e-f65ca63b-65ad4799.jpg | Bin 0 -> 920 bytes .../a4bf5ac8-79606789-3d99f752-d2a888c3.jpg | Bin 0 -> 920 bytes .../6366f5b8-60cda42d-d02a2489-1f9cc9b0.jpg | Bin 0 -> 920 bytes .../7a73e2e1-7964ea55-77bf4a43-92742356.jpg | Bin 0 -> 920 bytes .../84a4a199-0e968dcf-21256899-eb7e053e.jpg | Bin 0 -> 920 bytes .../35b3fb60-5a416c82-3dd7f2af-69d76155.jpg | Bin 0 -> 920 bytes .../7daaaff5-b5a795b7-6b038e9a-a3bee6d8.jpg | Bin 0 -> 920 bytes .../4cd8b116-2e4c7d7c-cbb019f0-9f5d21a2.jpg | Bin 0 -> 920 bytes .../7a44be54-b14b787f-1b882943-d92bed6d.jpg | Bin 0 -> 920 bytes .../6afb2b4d-e4806ac4-a34488fb-92bf282d.jpg | Bin 0 -> 920 bytes .../71f7fb51-bbb2462f-10afbcbf-2838cd29.jpg | Bin 0 -> 920 bytes .../56ce0780-04eb57fe-a4c7528e-1822f095.jpg | Bin 0 -> 920 bytes .../442f9354-0359cd2c-fe44bf08-06306f8b.jpg | Bin 0 -> 920 bytes .../0afd2cf3-2d76ad25-1be75ad6-64d6cc86.jpg | Bin 0 -> 920 bytes .../7fc579fd-dffbd9d6-60eda497-66a17b26.jpg | Bin 0 -> 920 bytes .../7cdc4ba8-68b208c7-def2409a-cfce9906.jpg | Bin 0 -> 920 bytes .../3ab3a15e-710c1f1a-d9aa04c5-acd8c33a.jpg | Bin 0 -> 920 bytes .../401f9466-bc8c501c-984218a7-7ea2a46b.jpg | Bin 0 -> 920 bytes .../867a4c82-955ccc97-7eb349f9-a28ca6f5.jpg | Bin 0 -> 920 bytes .../1cdc4221-e3767c0e-4e64a24c-97da9ae8.jpg | Bin 0 -> 920 bytes .../25cc94e9-bd797896-e311d0db-7c181371.jpg | Bin 0 -> 920 bytes .../19043538-8294af9c-957be8b5-d751b65a.jpg | Bin 0 -> 920 bytes .../47928aec-7d506a45-e2defa1e-9eac22a7.jpg | Bin 0 -> 920 bytes .../16b47fc6-3651620c-ee0eae0d-a8381e72.jpg | Bin 0 -> 920 bytes .../1fed0d84-557646d8-41e6108f-063c2fca.jpg | Bin 0 -> 920 bytes .../30ab56f1-1c5c214b-b5fd256c-404b9caf.jpg | Bin 0 -> 920 bytes .../0f6f5408-9392b8fc-6332764d-c39ac00f.jpg | Bin 0 -> 920 bytes .../c1531145-8a0a811c-b9970154-b49fce3f.jpg | Bin 0 -> 920 bytes .../4345c04f-633971b1-58c93c0b-bdb3748d.jpg | Bin 0 -> 920 bytes .../30e5efca-91634147-b3391772-4dffe153.jpg | Bin 0 -> 920 bytes .../14590a8c-d308d549-66353123-823e3602.jpg | Bin 0 -> 920 bytes .../920772aa-c204dc44-99f62611-87be5ea1.jpg | Bin 0 -> 920 bytes .../59cb4d6e-519eae74-06af42fc-5077238b.jpg | Bin 0 -> 920 bytes .../b59b8ba2-db68273a-d53bc742-f593b6c8.jpg | Bin 0 -> 920 bytes .../43d4e45b-0309b696-b38219e2-34048035.jpg | Bin 0 -> 920 bytes .../aec0415b-53d43067-de067b8f-ce37c7fb.jpg | Bin 0 -> 920 bytes .../c510a3b8-bf3c2545-602db8ef-bfb640df.jpg | Bin 0 -> 920 bytes .../d7b62118-456cc7dd-fd7aae3a-b7a99e99.jpg | Bin 0 -> 920 bytes .../02d8f4df-3a3e4445-e3c65a32-b42c67b6.jpg | Bin 0 -> 920 bytes .../1fd5e7e8-808658e6-3ec403f3-2a6a3109.jpg | Bin 0 -> 920 bytes .../6e566b28-7dc76e51-363018ce-a0fa4a08.jpg | Bin 0 -> 920 bytes .../9e39604f-fab38da7-f410426d-8451e4f6.jpg | Bin 0 -> 920 bytes .../52ba5787-46aa2906-87e9fd54-bc3fd837.jpg | Bin 0 -> 920 bytes .../ca5a3173-60338bbe-711695d0-3448d57b.jpg | Bin 0 -> 920 bytes .../f42fbdad-1e9b8d24-f815c867-75e32d5e.jpg | Bin 0 -> 920 bytes .../082da48b-e0907024-71437d4a-9e129a83.jpg | Bin 0 -> 920 bytes .../7f93a820-3501bf2f-03abd87f-6005216e.jpg | Bin 0 -> 920 bytes .../0b8dcae3-6f810969-403294ec-b12c57f7.jpg | Bin 0 -> 920 bytes .../37eb7689-401def65-adc29f03-80bfec57.jpg | Bin 0 -> 920 bytes .../35c148ac-02e88f87-31f5ad80-ddb29478.jpg | Bin 0 -> 920 bytes .../9de9c841-872074e1-3e9775e1-0e0e2e76.jpg | Bin 0 -> 920 bytes .../ee6c04cd-dec16416-96efd3f3-ded808e3.jpg | Bin 0 -> 920 bytes .../3f891948-b5baeab2-28d37adb-718ab4ab.jpg | Bin 0 -> 920 bytes .../015dc77d-eb10776d-36eaaca2-3f9b36c2.jpg | Bin 0 -> 920 bytes .../42ec6020-0795c6a3-ddced511-5b81073b.jpg | Bin 0 -> 920 bytes .../d6c6343b-912fd3f8-cd6b8fdf-a119373a.jpg | Bin 0 -> 920 bytes .../ea2155aa-b89d8367-227a5543-3936ba36.jpg | Bin 0 -> 920 bytes .../37cea7de-ba07488a-ca296af3-987e28d2.jpg | Bin 0 -> 920 bytes .../b96ad4a8-266f779e-6bb986ca-59fa1099.jpg | Bin 0 -> 920 bytes .../e62e681c-0b90c9f8-e5f376e7-8e39d39c.jpg | Bin 0 -> 920 bytes .../b3431893-13edbdb8-57dad111-6fb33794.jpg | Bin 0 -> 920 bytes .../87b202c5-2adf7ccd-7e02ece7-4a0db5d9.jpg | Bin 0 -> 920 bytes .../07390b5c-3acbd27b-4cddcc37-19b562f5.jpg | Bin 0 -> 920 bytes .../6cc5e64e-d0a5f5d4-99992264-d0233a31.jpg | Bin 0 -> 920 bytes .../5fa62f9e-86d7d8b2-3f8b233a-cf945af7.jpg | Bin 0 -> 920 bytes .../bd03db19-a077a18a-f5c0107f-fe07e42a.jpg | Bin 0 -> 920 bytes .../d432c2b9-a59f399d-55128859-4c40617d.jpg | Bin 0 -> 920 bytes .../af091005-ab73c5ca-d3d0a857-a1e42b43.jpg | Bin 0 -> 920 bytes .../4bf8c19d-61ed148b-5e2c854b-2a7ce889.jpg | Bin 0 -> 920 bytes .../7ff7fea4-03f4d5de-7795c3e0-6bc5ed3b.jpg | Bin 0 -> 920 bytes .../45276889-19e22b6f-1ccc4d27-3a6d80aa.jpg | Bin 0 -> 920 bytes .../4095ec1b-1bb1dd72-9d77167a-4bac4d4b.jpg | Bin 0 -> 920 bytes .../24a466e6-181d6c1c-eae92137-38c90ec9.jpg | Bin 0 -> 920 bytes .../440b9914-91df7a6d-452ccba7-f6423c89.jpg | Bin 0 -> 920 bytes .../0dd56c04-7278308e-6356ab3a-da874d53.jpg | Bin 0 -> 920 bytes .../d5d40c5a-ca640221-3e60fb27-cae8062d.jpg | Bin 0 -> 920 bytes .../cd3cb96d-87138433-f6a7592d-a371aca7.jpg | Bin 0 -> 920 bytes .../3cc3d581-af55fcf1-376c3586-b6ba8056.jpg | Bin 0 -> 920 bytes .../ffc2d4a2-e4b44c0c-4f071491-68955982.jpg | Bin 0 -> 920 bytes .../90003c60-446b48ec-567eefdd-d10903fb.jpg | Bin 0 -> 920 bytes .../9e317590-04d4b774-944cfcaf-eeb58c6e.jpg | Bin 0 -> 920 bytes .../d693caf9-5f2b4ae2-6a6af401-21613192.jpg | Bin 0 -> 920 bytes .../bd15e9b2-53b8e4e8-750aee04-1d36b2d1.jpg | Bin 0 -> 920 bytes .../8fabbe65-06eaa11a-2dd88186-cccaeca5.jpg | Bin 0 -> 920 bytes .../09d3c8ba-4bb60535-e5222e77-4b05605c.jpg | Bin 0 -> 920 bytes .../15bb20ff-a92ea69d-1e8a7e91-4b530c77.jpg | Bin 0 -> 920 bytes .../9031473a-0cf3181c-0b1a8cc1-66d6ea9a.jpg | Bin 0 -> 920 bytes .../44fd9124-c4837570-0cd0ed5f-5bcffbe1.jpg | Bin 0 -> 920 bytes .../4490db49-8a28d6a9-e4eb6a6c-6f1854f8.jpg | Bin 0 -> 920 bytes .../1060d662-072e003c-dbf05f2e-4ccac4a5.jpg | Bin 0 -> 920 bytes .../435ce0ac-4d95e7c1-34a4fb28-e6f7c9e9.jpg | Bin 0 -> 920 bytes .../039fe911-344eab62-7f300b59-684f2fae.jpg | Bin 0 -> 920 bytes .../e9e2b87b-3d3e9c4e-3b18d389-d8962c79.jpg | Bin 0 -> 920 bytes .../f3cf7fa3-5c7851d6-8c9edbd0-0c8c64ef.jpg | Bin 0 -> 920 bytes .../4b7b5b36-3d1f22d5-83d30f11-34fde697.jpg | Bin 0 -> 920 bytes .../be767e96-e6350ffc-5d23d270-24a7860e.jpg | Bin 0 -> 920 bytes .../dda2576c-e86e4a2d-a36bf76a-8dfd2ab0.jpg | Bin 0 -> 920 bytes .../a95606b7-c0fecf1e-ba7c6578-b6eabffd.jpg | Bin 0 -> 920 bytes .../476391d0-88c15dff-5ef15726-e295bb0a.jpg | Bin 0 -> 920 bytes .../f7667307-18823508-8a6a141b-9d78bbfe.jpg | Bin 0 -> 920 bytes .../62aef45b-e5538f95-7dc63298-c10bf6b2.jpg | Bin 0 -> 920 bytes .../1caa6f1b-08c6ea8d-44b1ceb7-54a05871.jpg | Bin 0 -> 920 bytes .../a80d59b5-8356df47-d3454d71-b6ae7aff.jpg | Bin 0 -> 920 bytes .../6b0d5ad0-197afbf6-4aaa2a2a-d039dcb4.jpg | Bin 0 -> 920 bytes .../f7c53178-f0052fa6-87febe34-c10dc291.jpg | Bin 0 -> 920 bytes .../f860214f-1edfec29-bdae07fb-fad50e3b.jpg | Bin 0 -> 920 bytes .../6bf31a1c-092e1543-5ab18d17-14257f4c.jpg | Bin 0 -> 920 bytes .../64cd73ba-ee40ca52-ba4808ca-1b99a887.jpg | Bin 0 -> 920 bytes .../6afbd207-460ce550-370a678a-08b9b9cc.jpg | Bin 0 -> 920 bytes tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv | 101 +++++++++++ .../gen_mimic/mimic-cxr-2.0.0-metadata.csv.gz | Bin 0 -> 3749 bytes tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv | 101 +++++++++++ tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv.gz | Bin 0 -> 2146 bytes 121 files changed, 362 insertions(+) create mode 100644 tests/gen_mimic.py create mode 100644 tests/gen_mimic.sh create mode 100644 tests/gen_mimic/images-224.tar create mode 100644 tests/gen_mimic/images-224/files/p00/p002677b2/s67f3fe0b/02d9dd68-7c42e9bb-c2c45394-53a325e3.jpg create mode 100644 tests/gen_mimic/images-224/files/p03/p035c7641/s1d793a25/33093b96-ae905e2e-3714c3cc-45536dab.jpg create mode 100644 tests/gen_mimic/images-224/files/p05/p0540cdff/sb8ce0ecd/722678b5-671357c9-aaae7d33-f8862161.jpg create mode 100644 tests/gen_mimic/images-224/files/p05/p0544f306/s14e3e8bd/452df9cf-1cbb6b5e-d8639a1e-a08d32e3.jpg create mode 100644 tests/gen_mimic/images-224/files/p07/p07ea4113/s4a7a73de/408d770a-8163a0db-e6484216-c9f8814e.jpg create mode 100644 tests/gen_mimic/images-224/files/p0c/p0c3143cb/s08efbd2f/8dc7085c-f637862e-f65ca63b-65ad4799.jpg create mode 100644 tests/gen_mimic/images-224/files/p11/p1179de34/s9aec6f8d/a4bf5ac8-79606789-3d99f752-d2a888c3.jpg create mode 100644 tests/gen_mimic/images-224/files/p14/p14472725/se7eb45a0/6366f5b8-60cda42d-d02a2489-1f9cc9b0.jpg create mode 100644 tests/gen_mimic/images-224/files/p14/p14ba4aea/sd9ce6319/7a73e2e1-7964ea55-77bf4a43-92742356.jpg create mode 100644 tests/gen_mimic/images-224/files/p19/p190b1b36/sf9f8098e/84a4a199-0e968dcf-21256899-eb7e053e.jpg create mode 100644 tests/gen_mimic/images-224/files/p19/p19b04cf4/s2cbc6bad/35b3fb60-5a416c82-3dd7f2af-69d76155.jpg create mode 100644 tests/gen_mimic/images-224/files/p1a/p1ad1b133/s682da748/7daaaff5-b5a795b7-6b038e9a-a3bee6d8.jpg create mode 100644 tests/gen_mimic/images-224/files/p1b/p1b371dc2/sd56d2785/4cd8b116-2e4c7d7c-cbb019f0-9f5d21a2.jpg create mode 100644 tests/gen_mimic/images-224/files/p1c/p1c3a0fb3/s343a18ec/7a44be54-b14b787f-1b882943-d92bed6d.jpg create mode 100644 tests/gen_mimic/images-224/files/p1f/p1f50e4a4/sc64d1ec6/6afb2b4d-e4806ac4-a34488fb-92bf282d.jpg create mode 100644 tests/gen_mimic/images-224/files/p22/p2252ddd1/s87842c63/71f7fb51-bbb2462f-10afbcbf-2838cd29.jpg create mode 100644 tests/gen_mimic/images-224/files/p22/p225b7be0/see059b45/56ce0780-04eb57fe-a4c7528e-1822f095.jpg create mode 100644 tests/gen_mimic/images-224/files/p24/p24e712ca/s9ff4490f/442f9354-0359cd2c-fe44bf08-06306f8b.jpg create mode 100644 tests/gen_mimic/images-224/files/p28/p28407bd8/s776a9732/0afd2cf3-2d76ad25-1be75ad6-64d6cc86.jpg create mode 100644 tests/gen_mimic/images-224/files/p29/p2999546b/s656d4c67/7fc579fd-dffbd9d6-60eda497-66a17b26.jpg create mode 100644 tests/gen_mimic/images-224/files/p2a/p2a516454/s7edb140a/7cdc4ba8-68b208c7-def2409a-cfce9906.jpg create mode 100644 tests/gen_mimic/images-224/files/p2a/p2a8cbe9c/sde422f0a/3ab3a15e-710c1f1a-d9aa04c5-acd8c33a.jpg create mode 100644 tests/gen_mimic/images-224/files/p2a/p2ad837bf/s8ecf5b71/401f9466-bc8c501c-984218a7-7ea2a46b.jpg create mode 100644 tests/gen_mimic/images-224/files/p2c/p2c0aea2d/s7edf4838/867a4c82-955ccc97-7eb349f9-a28ca6f5.jpg create mode 100644 tests/gen_mimic/images-224/files/p2d/p2d687542/sedf6d60a/1cdc4221-e3767c0e-4e64a24c-97da9ae8.jpg create mode 100644 tests/gen_mimic/images-224/files/p31/p31384363/s58a45da1/25cc94e9-bd797896-e311d0db-7c181371.jpg create mode 100644 tests/gen_mimic/images-224/files/p35/p35476b4a/sa75e3451/19043538-8294af9c-957be8b5-d751b65a.jpg create mode 100644 tests/gen_mimic/images-224/files/p35/p357210e4/s1b794d99/47928aec-7d506a45-e2defa1e-9eac22a7.jpg create mode 100644 tests/gen_mimic/images-224/files/p35/p35e20610/scb1a83df/16b47fc6-3651620c-ee0eae0d-a8381e72.jpg create mode 100644 tests/gen_mimic/images-224/files/p37/p3707bcf5/s32cbad59/1fed0d84-557646d8-41e6108f-063c2fca.jpg create mode 100644 tests/gen_mimic/images-224/files/p39/p39e8eb68/sea7d80f9/30ab56f1-1c5c214b-b5fd256c-404b9caf.jpg create mode 100644 tests/gen_mimic/images-224/files/p3b/p3bd01425/s66ba470d/0f6f5408-9392b8fc-6332764d-c39ac00f.jpg create mode 100644 tests/gen_mimic/images-224/files/p3d/p3d619352/sbd9f518f/c1531145-8a0a811c-b9970154-b49fce3f.jpg create mode 100644 tests/gen_mimic/images-224/files/p40/p404e1e3d/s7ef2c8ee/4345c04f-633971b1-58c93c0b-bdb3748d.jpg create mode 100644 tests/gen_mimic/images-224/files/p47/p476f7556/s6400dc24/30e5efca-91634147-b3391772-4dffe153.jpg create mode 100644 tests/gen_mimic/images-224/files/p48/p4800527c/s521977e7/14590a8c-d308d549-66353123-823e3602.jpg create mode 100644 tests/gen_mimic/images-224/files/p4d/p4d702ac9/sd78068ee/920772aa-c204dc44-99f62611-87be5ea1.jpg create mode 100644 tests/gen_mimic/images-224/files/p4d/p4d8c768a/sd194c4c5/59cb4d6e-519eae74-06af42fc-5077238b.jpg create mode 100644 tests/gen_mimic/images-224/files/p4f/p4fd10475/s9f58d7ca/b59b8ba2-db68273a-d53bc742-f593b6c8.jpg create mode 100644 tests/gen_mimic/images-224/files/p51/p51df2e95/sfca58ce6/43d4e45b-0309b696-b38219e2-34048035.jpg create mode 100644 tests/gen_mimic/images-224/files/p52/p52fa97c0/s0b31040c/aec0415b-53d43067-de067b8f-ce37c7fb.jpg create mode 100644 tests/gen_mimic/images-224/files/p59/p594a4934/sc377fe22/c510a3b8-bf3c2545-602db8ef-bfb640df.jpg create mode 100644 tests/gen_mimic/images-224/files/p5c/p5c088c08/sd0875cea/d7b62118-456cc7dd-fd7aae3a-b7a99e99.jpg create mode 100644 tests/gen_mimic/images-224/files/p5c/p5c61a0c7/s452981c6/02d8f4df-3a3e4445-e3c65a32-b42c67b6.jpg create mode 100644 tests/gen_mimic/images-224/files/p5e/p5ee7697e/sceb85c30/1fd5e7e8-808658e6-3ec403f3-2a6a3109.jpg create mode 100644 tests/gen_mimic/images-224/files/p5f/p5fe54996/s06e771a6/6e566b28-7dc76e51-363018ce-a0fa4a08.jpg create mode 100644 tests/gen_mimic/images-224/files/p60/p605764b5/s266b8861/9e39604f-fab38da7-f410426d-8451e4f6.jpg create mode 100644 tests/gen_mimic/images-224/files/p62/p62149c26/s14b34c50/52ba5787-46aa2906-87e9fd54-bc3fd837.jpg create mode 100644 tests/gen_mimic/images-224/files/p66/p66592eb9/sdef6bf64/ca5a3173-60338bbe-711695d0-3448d57b.jpg create mode 100644 tests/gen_mimic/images-224/files/p67/p6730eec6/sd00adbb3/f42fbdad-1e9b8d24-f815c867-75e32d5e.jpg create mode 100644 tests/gen_mimic/images-224/files/p67/p67d4a7c2/sbb9d1b94/082da48b-e0907024-71437d4a-9e129a83.jpg create mode 100644 tests/gen_mimic/images-224/files/p69/p69fcfd52/s1e76489d/7f93a820-3501bf2f-03abd87f-6005216e.jpg create mode 100644 tests/gen_mimic/images-224/files/p6b/p6bb08dad/s95df9dfe/0b8dcae3-6f810969-403294ec-b12c57f7.jpg create mode 100644 tests/gen_mimic/images-224/files/p70/p70e84808/sde56ac61/37eb7689-401def65-adc29f03-80bfec57.jpg create mode 100644 tests/gen_mimic/images-224/files/p72/p727889bf/sbeb95018/35c148ac-02e88f87-31f5ad80-ddb29478.jpg create mode 100644 tests/gen_mimic/images-224/files/p78/p78658ed8/sadc3f650/9de9c841-872074e1-3e9775e1-0e0e2e76.jpg create mode 100644 tests/gen_mimic/images-224/files/p79/p7965c7d7/sfc00c854/ee6c04cd-dec16416-96efd3f3-ded808e3.jpg create mode 100644 tests/gen_mimic/images-224/files/p7d/p7d94c15f/s7e7001ee/3f891948-b5baeab2-28d37adb-718ab4ab.jpg create mode 100644 tests/gen_mimic/images-224/files/p80/p80ba1f4c/se12fa3f6/015dc77d-eb10776d-36eaaca2-3f9b36c2.jpg create mode 100644 tests/gen_mimic/images-224/files/p81/p81355df1/s50d4986b/42ec6020-0795c6a3-ddced511-5b81073b.jpg create mode 100644 tests/gen_mimic/images-224/files/p82/p8231bf4b/sbc5aa79f/d6c6343b-912fd3f8-cd6b8fdf-a119373a.jpg create mode 100644 tests/gen_mimic/images-224/files/p86/p862a380d/s6cdc9063/ea2155aa-b89d8367-227a5543-3936ba36.jpg create mode 100644 tests/gen_mimic/images-224/files/p93/p936623db/sb93b8e79/37cea7de-ba07488a-ca296af3-987e28d2.jpg create mode 100644 tests/gen_mimic/images-224/files/p95/p950025fb/sdbf73728/b96ad4a8-266f779e-6bb986ca-59fa1099.jpg create mode 100644 tests/gen_mimic/images-224/files/p98/p982044b1/s3fa33bce/e62e681c-0b90c9f8-e5f376e7-8e39d39c.jpg create mode 100644 tests/gen_mimic/images-224/files/p99/p99af93f0/sf855052b/b3431893-13edbdb8-57dad111-6fb33794.jpg create mode 100644 tests/gen_mimic/images-224/files/p9b/p9b0c5003/s3190176a/87b202c5-2adf7ccd-7e02ece7-4a0db5d9.jpg create mode 100644 tests/gen_mimic/images-224/files/p9d/p9d9e0dbc/s54a0a4bf/07390b5c-3acbd27b-4cddcc37-19b562f5.jpg create mode 100644 tests/gen_mimic/images-224/files/p9f/p9ff616cd/s58ad2be3/6cc5e64e-d0a5f5d4-99992264-d0233a31.jpg create mode 100644 tests/gen_mimic/images-224/files/pa0/pa0311c90/sd7619ebc/5fa62f9e-86d7d8b2-3f8b233a-cf945af7.jpg create mode 100644 tests/gen_mimic/images-224/files/pa7/pa78933d8/sbccdda0d/bd03db19-a077a18a-f5c0107f-fe07e42a.jpg create mode 100644 tests/gen_mimic/images-224/files/pab/pabc1242c/s75a00dad/d432c2b9-a59f399d-55128859-4c40617d.jpg create mode 100644 tests/gen_mimic/images-224/files/pae/pae80d573/s149b204c/af091005-ab73c5ca-d3d0a857-a1e42b43.jpg create mode 100644 tests/gen_mimic/images-224/files/pae/paeb32909/s6e71b801/4bf8c19d-61ed148b-5e2c854b-2a7ce889.jpg create mode 100644 tests/gen_mimic/images-224/files/pb1/pb1668a60/s9dfe2ebc/7ff7fea4-03f4d5de-7795c3e0-6bc5ed3b.jpg create mode 100644 tests/gen_mimic/images-224/files/pb8/pb8a4585d/s23601ba5/45276889-19e22b6f-1ccc4d27-3a6d80aa.jpg create mode 100644 tests/gen_mimic/images-224/files/pba/pba043006/s929858f1/4095ec1b-1bb1dd72-9d77167a-4bac4d4b.jpg create mode 100644 tests/gen_mimic/images-224/files/pba/pba821bdf/seb52f69c/24a466e6-181d6c1c-eae92137-38c90ec9.jpg create mode 100644 tests/gen_mimic/images-224/files/pbd/pbd3f44cd/s8be7a71b/440b9914-91df7a6d-452ccba7-f6423c89.jpg create mode 100644 tests/gen_mimic/images-224/files/pbe/pbeb1dbc3/s5d9243aa/0dd56c04-7278308e-6356ab3a-da874d53.jpg create mode 100644 tests/gen_mimic/images-224/files/pc0/pc00d78b9/sa0798258/d5d40c5a-ca640221-3e60fb27-cae8062d.jpg create mode 100644 tests/gen_mimic/images-224/files/pc3/pc3dd3fe4/scfeaea37/cd3cb96d-87138433-f6a7592d-a371aca7.jpg create mode 100644 tests/gen_mimic/images-224/files/pc6/pc6fc66e6/se48b3c2b/3cc3d581-af55fcf1-376c3586-b6ba8056.jpg create mode 100644 tests/gen_mimic/images-224/files/pc8/pc80aa8dc/s10b8a1ea/ffc2d4a2-e4b44c0c-4f071491-68955982.jpg create mode 100644 tests/gen_mimic/images-224/files/pca/pca849ba9/s3c52fb1f/90003c60-446b48ec-567eefdd-d10903fb.jpg create mode 100644 tests/gen_mimic/images-224/files/pcb/pcbca47ca/sab7e1939/9e317590-04d4b774-944cfcaf-eeb58c6e.jpg create mode 100644 tests/gen_mimic/images-224/files/pcd/pcd308688/s9e344fd3/d693caf9-5f2b4ae2-6a6af401-21613192.jpg create mode 100644 tests/gen_mimic/images-224/files/pce/pce8f7db8/s5e9a74fe/bd15e9b2-53b8e4e8-750aee04-1d36b2d1.jpg create mode 100644 tests/gen_mimic/images-224/files/pcf/pcfdf2004/s51e11051/8fabbe65-06eaa11a-2dd88186-cccaeca5.jpg create mode 100644 tests/gen_mimic/images-224/files/pd2/pd2e9ef2f/sc2c621af/09d3c8ba-4bb60535-e5222e77-4b05605c.jpg create mode 100644 tests/gen_mimic/images-224/files/pd3/pd3d2355d/s4a11c4c5/15bb20ff-a92ea69d-1e8a7e91-4b530c77.jpg create mode 100644 tests/gen_mimic/images-224/files/pd5/pd508e74c/s06953799/9031473a-0cf3181c-0b1a8cc1-66d6ea9a.jpg create mode 100644 tests/gen_mimic/images-224/files/pd8/pd84b3758/s0340e918/44fd9124-c4837570-0cd0ed5f-5bcffbe1.jpg create mode 100644 tests/gen_mimic/images-224/files/pda/pda7e8892/s1ea8f2f9/4490db49-8a28d6a9-e4eb6a6c-6f1854f8.jpg create mode 100644 tests/gen_mimic/images-224/files/pdc/pdc84998c/se57581c8/1060d662-072e003c-dbf05f2e-4ccac4a5.jpg create mode 100644 tests/gen_mimic/images-224/files/pe4/pe42ced85/s352789df/435ce0ac-4d95e7c1-34a4fb28-e6f7c9e9.jpg create mode 100644 tests/gen_mimic/images-224/files/pe7/pe79ec2f1/scce2cf67/039fe911-344eab62-7f300b59-684f2fae.jpg create mode 100644 tests/gen_mimic/images-224/files/pe8/pe89a550a/sd213798d/e9e2b87b-3d3e9c4e-3b18d389-d8962c79.jpg create mode 100644 tests/gen_mimic/images-224/files/pea/pea77727e/sd5a7486e/f3cf7fa3-5c7851d6-8c9edbd0-0c8c64ef.jpg create mode 100644 tests/gen_mimic/images-224/files/pec/pec45c8d4/s6cc1992c/4b7b5b36-3d1f22d5-83d30f11-34fde697.jpg create mode 100644 tests/gen_mimic/images-224/files/pec/pec98e654/sa3457d67/be767e96-e6350ffc-5d23d270-24a7860e.jpg create mode 100644 tests/gen_mimic/images-224/files/pee/pee99ac51/s910a87f1/dda2576c-e86e4a2d-a36bf76a-8dfd2ab0.jpg create mode 100644 tests/gen_mimic/images-224/files/pef/peff712e4/s6391d0ac/a95606b7-c0fecf1e-ba7c6578-b6eabffd.jpg create mode 100644 tests/gen_mimic/images-224/files/pf0/pf0736b23/s80147605/476391d0-88c15dff-5ef15726-e295bb0a.jpg create mode 100644 tests/gen_mimic/images-224/files/pf0/pf0b67e19/s5f14d7e7/f7667307-18823508-8a6a141b-9d78bbfe.jpg create mode 100644 tests/gen_mimic/images-224/files/pf2/pf22f3c19/s4ab7695f/62aef45b-e5538f95-7dc63298-c10bf6b2.jpg create mode 100644 tests/gen_mimic/images-224/files/pf2/pf2f591b5/sdfe4d498/1caa6f1b-08c6ea8d-44b1ceb7-54a05871.jpg create mode 100644 tests/gen_mimic/images-224/files/pf6/pf643ee65/s11007cfc/a80d59b5-8356df47-d3454d71-b6ae7aff.jpg create mode 100644 tests/gen_mimic/images-224/files/pf6/pf6eb7535/s6a9161f8/6b0d5ad0-197afbf6-4aaa2a2a-d039dcb4.jpg create mode 100644 tests/gen_mimic/images-224/files/pf9/pf99b70cd/sdcd8dcdf/f7c53178-f0052fa6-87febe34-c10dc291.jpg create mode 100644 tests/gen_mimic/images-224/files/pfa/pfacdd6b9/s54f63b56/f860214f-1edfec29-bdae07fb-fad50e3b.jpg create mode 100644 tests/gen_mimic/images-224/files/pfd/pfd072d66/sab1d747c/6bf31a1c-092e1543-5ab18d17-14257f4c.jpg create mode 100644 tests/gen_mimic/images-224/files/pfd/pfd1f37df/s72634032/64cd73ba-ee40ca52-ba4808ca-1b99a887.jpg create mode 100644 tests/gen_mimic/images-224/files/pff/pffe42d04/s7c56bb93/6afbd207-460ce550-370a678a-08b9b9cc.jpg create mode 100644 tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv create mode 100644 tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv.gz create mode 100644 tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv create mode 100644 tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv.gz diff --git a/tests/gen_mimic.py b/tests/gen_mimic.py new file mode 100644 index 0000000..85306dd --- /dev/null +++ b/tests/gen_mimic.py @@ -0,0 +1,158 @@ +import numpy as np +import pdb +import tarfile +import pandas as pd +from PIL import Image +import random +import argparse +from pathlib import Path +import os + +def show(x): + print(x) + return x + +mimic_metadata_filename = "mimic-cxr-2.0.0-metadata.csv" +mimic_csvdata_filename = "mimic-cxr-2.0.0-negbio.csv" + +def generate_random_metadata(n, dimensions): + columns = "dicom_id,subject_id,study_id,PerformedProcedureStepDescription,ViewPosition,Rows,Columns,StudyDate,StudyTime,ProcedureCodeSequence_CodeMeaning,ViewCodeSequence_CodeMeaning,PatientOrientationCodeSequence_CodeMeaning".split(",") + performed_procedure_step_descriptions = { + "CHEST (PA AND LAT)":{ + "n_views":2, + "view_position":["LATERAL", "PA"], + "procedure_code_meaning":"CHEST (PA AND LAT)", + "view_code_meaning":["lateral", "postero-anterior"], + "orientation_code_meaning":["Erect","Recumbent"] + } + } + def hex(n): + hex_chars = list("0123456789abcdef") + return "".join(np.random.choice(hex_chars,n)) + + def int(n): + int_chars = list("0123456789abcdef") + return "".join(np.random.choice(int_chars,n)) + + def generate_random_row(dimensions): + performed_procedure_step_description = random.choice( + list(performed_procedure_step_descriptions) + ) + procedure = performed_procedure_step_descriptions[performed_procedure_step_description] + n_views = procedure["n_views"] + view_index = random.randint(0, n_views - 1) + view_position = procedure["view_position"][view_index] + procedure_code_meaning = procedure["procedure_code_meaning"] + view_code_meaning = procedure["view_code_meaning"][view_index] + #Currently unsure how/if view codes are mapped to orientations + orientation_code_meaning = random.choice(procedure["orientation_code_meaning"]) + subject_id = int(8) + study_id = int(8) + meta_row = { + "dicom_id":"-".join([hex(8) for i in range(4)]), + "subject_id":subject_id, + "study_id":study_id, + "PerformedProcedureStepDescription":performed_procedure_step_description, + "ViewPosition":view_position, + "Rows":dimensions[0], + "Columns":dimensions[1], + "StudyDate":0, + "StudyTime":0, + "ProcedureCodeSequence_CodeMeaning":procedure_code_meaning, + "ViewCodeSequence_CodeMeaning":view_code_meaning, + "PatientOrientationCodeSequence_CodeMeaning":orientation_code_meaning + } + + def random_pred(): + return random.choice(["1.0","-1.0","0.0",""]) + + csv_row = { + "subject_id":subject_id, + "study_id":study_id, + "Atelectasis":random_pred(), + "Cardiomegaly":random_pred(), + "Consolidation":random_pred(), + "Edema":random_pred(), + "Enlarged Cardiomediastinum":random_pred(), + "Fracture":random_pred(), + "Lung Lesion":random_pred(), + "Lung Opacity":random_pred(), + "No Finding":random_pred(), + "Pleural Effusion":random_pred(), + "Pleural Other":random_pred(), + "Pneumonia":random_pred(), + "Pneumothorax":random_pred(), + "Support Devices":random_pred() + } + return meta_row, csv_row + + meta_rows, csv_rows = show(list(zip(*show([generate_random_row(dimensions) for i in range(n)])))) + + return pd.DataFrame(meta_rows), pd.DataFrame(csv_rows) + + +def generate_random_image(dimensions): + return Image.fromarray(np.random.random(dimensions)).convert("L") + +def generate_test_images(random_metadata, extracted, tarname, dimensions): + for _, row in random_metadata.iterrows(): + subjectid = row["subject_id"] + studyid = row["study_id"] + dicom_id = row["dicom_id"] + img_fname = os.path.join("p" + subjectid[:2], "p" + subjectid, "s" + studyid, dicom_id + ".jpg") + print(type(extracted)) + img_path = extracted/"files"/img_fname + print(img_path) + os.makedirs(os.path.dirname(img_path)) + generate_random_image(dimensions).save(img_path) + tarred = tarfile.TarFile.open(tarname, "w") + tarred.add(extracted) + +def generate_test_data(n, directory, dimensions=(224, 224), tarname=None, extracted=None): + directory = Path(directory) + if tarname is None: + tarname = directory/"images-224.tar" + if extracted is None: + extracted = directory/"images-224" + random_metadata, random_csvdata = generate_random_metadata( + n, + dimensions + ) + generate_test_images(random_metadata, extracted, tarname, dimensions) + random_metadata.to_csv( + directory/mimic_metadata_filename, + index=False + ) + random_metadata.to_csv( + directory/(mimic_metadata_filename+".gz"), + compression="gzip", + index=False + ) + random_csvdata.to_csv( + directory/mimic_csvdata_filename, + index=False + ) + random_csvdata.to_csv( + directory/(mimic_csvdata_filename+".gz"), + compression="gzip", + index=False + ) + +#./images-224/files/p17/p17387118/s56770356/b983f94c-b77ad35d-8a4aa372-2faf6503-5ec94835.jpg + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("n") + parser.add_argument("directory") + parser.add_argument("x") + parser.add_argument("y") + parser.add_argument("tarfile", default=None, nargs="?") + parser.add_argument("extracted", default=None, nargs="?") + args = parser.parse_args() + generate_test_data( + n=int(args.n), + directory = args.directory, + dimensions = (int(args.x), int(args.y)), + tarname = args.tarfile, + extracted = args.extracted + ) diff --git a/tests/gen_mimic.sh b/tests/gen_mimic.sh new file mode 100644 index 0000000..a6c7517 --- /dev/null +++ b/tests/gen_mimic.sh @@ -0,0 +1,2 @@ +python3 gen_mimic.py 100 gen_mimic 224 224 + diff --git a/tests/gen_mimic/images-224.tar b/tests/gen_mimic/images-224.tar new file mode 100644 index 0000000000000000000000000000000000000000..0ef9185e928487371439c8055671ff9c01ef0c7d GIT binary patch literal 343552 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 literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p00/p002677b2/s67f3fe0b/02d9dd68-7c42e9bb-c2c45394-53a325e3.jpg b/tests/gen_mimic/images-224/files/p00/p002677b2/s67f3fe0b/02d9dd68-7c42e9bb-c2c45394-53a325e3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p03/p035c7641/s1d793a25/33093b96-ae905e2e-3714c3cc-45536dab.jpg b/tests/gen_mimic/images-224/files/p03/p035c7641/s1d793a25/33093b96-ae905e2e-3714c3cc-45536dab.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p05/p0540cdff/sb8ce0ecd/722678b5-671357c9-aaae7d33-f8862161.jpg b/tests/gen_mimic/images-224/files/p05/p0540cdff/sb8ce0ecd/722678b5-671357c9-aaae7d33-f8862161.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p05/p0544f306/s14e3e8bd/452df9cf-1cbb6b5e-d8639a1e-a08d32e3.jpg b/tests/gen_mimic/images-224/files/p05/p0544f306/s14e3e8bd/452df9cf-1cbb6b5e-d8639a1e-a08d32e3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p07/p07ea4113/s4a7a73de/408d770a-8163a0db-e6484216-c9f8814e.jpg b/tests/gen_mimic/images-224/files/p07/p07ea4113/s4a7a73de/408d770a-8163a0db-e6484216-c9f8814e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p0c/p0c3143cb/s08efbd2f/8dc7085c-f637862e-f65ca63b-65ad4799.jpg b/tests/gen_mimic/images-224/files/p0c/p0c3143cb/s08efbd2f/8dc7085c-f637862e-f65ca63b-65ad4799.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p11/p1179de34/s9aec6f8d/a4bf5ac8-79606789-3d99f752-d2a888c3.jpg b/tests/gen_mimic/images-224/files/p11/p1179de34/s9aec6f8d/a4bf5ac8-79606789-3d99f752-d2a888c3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p14/p14472725/se7eb45a0/6366f5b8-60cda42d-d02a2489-1f9cc9b0.jpg b/tests/gen_mimic/images-224/files/p14/p14472725/se7eb45a0/6366f5b8-60cda42d-d02a2489-1f9cc9b0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p14/p14ba4aea/sd9ce6319/7a73e2e1-7964ea55-77bf4a43-92742356.jpg b/tests/gen_mimic/images-224/files/p14/p14ba4aea/sd9ce6319/7a73e2e1-7964ea55-77bf4a43-92742356.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p19/p190b1b36/sf9f8098e/84a4a199-0e968dcf-21256899-eb7e053e.jpg b/tests/gen_mimic/images-224/files/p19/p190b1b36/sf9f8098e/84a4a199-0e968dcf-21256899-eb7e053e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p19/p19b04cf4/s2cbc6bad/35b3fb60-5a416c82-3dd7f2af-69d76155.jpg b/tests/gen_mimic/images-224/files/p19/p19b04cf4/s2cbc6bad/35b3fb60-5a416c82-3dd7f2af-69d76155.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p1a/p1ad1b133/s682da748/7daaaff5-b5a795b7-6b038e9a-a3bee6d8.jpg b/tests/gen_mimic/images-224/files/p1a/p1ad1b133/s682da748/7daaaff5-b5a795b7-6b038e9a-a3bee6d8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p1b/p1b371dc2/sd56d2785/4cd8b116-2e4c7d7c-cbb019f0-9f5d21a2.jpg b/tests/gen_mimic/images-224/files/p1b/p1b371dc2/sd56d2785/4cd8b116-2e4c7d7c-cbb019f0-9f5d21a2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p1c/p1c3a0fb3/s343a18ec/7a44be54-b14b787f-1b882943-d92bed6d.jpg b/tests/gen_mimic/images-224/files/p1c/p1c3a0fb3/s343a18ec/7a44be54-b14b787f-1b882943-d92bed6d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p1f/p1f50e4a4/sc64d1ec6/6afb2b4d-e4806ac4-a34488fb-92bf282d.jpg b/tests/gen_mimic/images-224/files/p1f/p1f50e4a4/sc64d1ec6/6afb2b4d-e4806ac4-a34488fb-92bf282d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p22/p2252ddd1/s87842c63/71f7fb51-bbb2462f-10afbcbf-2838cd29.jpg b/tests/gen_mimic/images-224/files/p22/p2252ddd1/s87842c63/71f7fb51-bbb2462f-10afbcbf-2838cd29.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p22/p225b7be0/see059b45/56ce0780-04eb57fe-a4c7528e-1822f095.jpg b/tests/gen_mimic/images-224/files/p22/p225b7be0/see059b45/56ce0780-04eb57fe-a4c7528e-1822f095.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p24/p24e712ca/s9ff4490f/442f9354-0359cd2c-fe44bf08-06306f8b.jpg b/tests/gen_mimic/images-224/files/p24/p24e712ca/s9ff4490f/442f9354-0359cd2c-fe44bf08-06306f8b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p28/p28407bd8/s776a9732/0afd2cf3-2d76ad25-1be75ad6-64d6cc86.jpg b/tests/gen_mimic/images-224/files/p28/p28407bd8/s776a9732/0afd2cf3-2d76ad25-1be75ad6-64d6cc86.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p29/p2999546b/s656d4c67/7fc579fd-dffbd9d6-60eda497-66a17b26.jpg b/tests/gen_mimic/images-224/files/p29/p2999546b/s656d4c67/7fc579fd-dffbd9d6-60eda497-66a17b26.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p2a/p2a516454/s7edb140a/7cdc4ba8-68b208c7-def2409a-cfce9906.jpg b/tests/gen_mimic/images-224/files/p2a/p2a516454/s7edb140a/7cdc4ba8-68b208c7-def2409a-cfce9906.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p2a/p2a8cbe9c/sde422f0a/3ab3a15e-710c1f1a-d9aa04c5-acd8c33a.jpg b/tests/gen_mimic/images-224/files/p2a/p2a8cbe9c/sde422f0a/3ab3a15e-710c1f1a-d9aa04c5-acd8c33a.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p2a/p2ad837bf/s8ecf5b71/401f9466-bc8c501c-984218a7-7ea2a46b.jpg b/tests/gen_mimic/images-224/files/p2a/p2ad837bf/s8ecf5b71/401f9466-bc8c501c-984218a7-7ea2a46b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p2c/p2c0aea2d/s7edf4838/867a4c82-955ccc97-7eb349f9-a28ca6f5.jpg b/tests/gen_mimic/images-224/files/p2c/p2c0aea2d/s7edf4838/867a4c82-955ccc97-7eb349f9-a28ca6f5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p2d/p2d687542/sedf6d60a/1cdc4221-e3767c0e-4e64a24c-97da9ae8.jpg b/tests/gen_mimic/images-224/files/p2d/p2d687542/sedf6d60a/1cdc4221-e3767c0e-4e64a24c-97da9ae8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p31/p31384363/s58a45da1/25cc94e9-bd797896-e311d0db-7c181371.jpg b/tests/gen_mimic/images-224/files/p31/p31384363/s58a45da1/25cc94e9-bd797896-e311d0db-7c181371.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p35/p35476b4a/sa75e3451/19043538-8294af9c-957be8b5-d751b65a.jpg b/tests/gen_mimic/images-224/files/p35/p35476b4a/sa75e3451/19043538-8294af9c-957be8b5-d751b65a.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p35/p357210e4/s1b794d99/47928aec-7d506a45-e2defa1e-9eac22a7.jpg b/tests/gen_mimic/images-224/files/p35/p357210e4/s1b794d99/47928aec-7d506a45-e2defa1e-9eac22a7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p35/p35e20610/scb1a83df/16b47fc6-3651620c-ee0eae0d-a8381e72.jpg b/tests/gen_mimic/images-224/files/p35/p35e20610/scb1a83df/16b47fc6-3651620c-ee0eae0d-a8381e72.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p37/p3707bcf5/s32cbad59/1fed0d84-557646d8-41e6108f-063c2fca.jpg b/tests/gen_mimic/images-224/files/p37/p3707bcf5/s32cbad59/1fed0d84-557646d8-41e6108f-063c2fca.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p39/p39e8eb68/sea7d80f9/30ab56f1-1c5c214b-b5fd256c-404b9caf.jpg b/tests/gen_mimic/images-224/files/p39/p39e8eb68/sea7d80f9/30ab56f1-1c5c214b-b5fd256c-404b9caf.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p3b/p3bd01425/s66ba470d/0f6f5408-9392b8fc-6332764d-c39ac00f.jpg b/tests/gen_mimic/images-224/files/p3b/p3bd01425/s66ba470d/0f6f5408-9392b8fc-6332764d-c39ac00f.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p3d/p3d619352/sbd9f518f/c1531145-8a0a811c-b9970154-b49fce3f.jpg b/tests/gen_mimic/images-224/files/p3d/p3d619352/sbd9f518f/c1531145-8a0a811c-b9970154-b49fce3f.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p40/p404e1e3d/s7ef2c8ee/4345c04f-633971b1-58c93c0b-bdb3748d.jpg b/tests/gen_mimic/images-224/files/p40/p404e1e3d/s7ef2c8ee/4345c04f-633971b1-58c93c0b-bdb3748d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p47/p476f7556/s6400dc24/30e5efca-91634147-b3391772-4dffe153.jpg b/tests/gen_mimic/images-224/files/p47/p476f7556/s6400dc24/30e5efca-91634147-b3391772-4dffe153.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p48/p4800527c/s521977e7/14590a8c-d308d549-66353123-823e3602.jpg b/tests/gen_mimic/images-224/files/p48/p4800527c/s521977e7/14590a8c-d308d549-66353123-823e3602.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p4d/p4d702ac9/sd78068ee/920772aa-c204dc44-99f62611-87be5ea1.jpg b/tests/gen_mimic/images-224/files/p4d/p4d702ac9/sd78068ee/920772aa-c204dc44-99f62611-87be5ea1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p4d/p4d8c768a/sd194c4c5/59cb4d6e-519eae74-06af42fc-5077238b.jpg b/tests/gen_mimic/images-224/files/p4d/p4d8c768a/sd194c4c5/59cb4d6e-519eae74-06af42fc-5077238b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p4f/p4fd10475/s9f58d7ca/b59b8ba2-db68273a-d53bc742-f593b6c8.jpg b/tests/gen_mimic/images-224/files/p4f/p4fd10475/s9f58d7ca/b59b8ba2-db68273a-d53bc742-f593b6c8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p51/p51df2e95/sfca58ce6/43d4e45b-0309b696-b38219e2-34048035.jpg b/tests/gen_mimic/images-224/files/p51/p51df2e95/sfca58ce6/43d4e45b-0309b696-b38219e2-34048035.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p52/p52fa97c0/s0b31040c/aec0415b-53d43067-de067b8f-ce37c7fb.jpg b/tests/gen_mimic/images-224/files/p52/p52fa97c0/s0b31040c/aec0415b-53d43067-de067b8f-ce37c7fb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p59/p594a4934/sc377fe22/c510a3b8-bf3c2545-602db8ef-bfb640df.jpg b/tests/gen_mimic/images-224/files/p59/p594a4934/sc377fe22/c510a3b8-bf3c2545-602db8ef-bfb640df.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p5c/p5c088c08/sd0875cea/d7b62118-456cc7dd-fd7aae3a-b7a99e99.jpg b/tests/gen_mimic/images-224/files/p5c/p5c088c08/sd0875cea/d7b62118-456cc7dd-fd7aae3a-b7a99e99.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p5c/p5c61a0c7/s452981c6/02d8f4df-3a3e4445-e3c65a32-b42c67b6.jpg b/tests/gen_mimic/images-224/files/p5c/p5c61a0c7/s452981c6/02d8f4df-3a3e4445-e3c65a32-b42c67b6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p5e/p5ee7697e/sceb85c30/1fd5e7e8-808658e6-3ec403f3-2a6a3109.jpg b/tests/gen_mimic/images-224/files/p5e/p5ee7697e/sceb85c30/1fd5e7e8-808658e6-3ec403f3-2a6a3109.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p5f/p5fe54996/s06e771a6/6e566b28-7dc76e51-363018ce-a0fa4a08.jpg b/tests/gen_mimic/images-224/files/p5f/p5fe54996/s06e771a6/6e566b28-7dc76e51-363018ce-a0fa4a08.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p60/p605764b5/s266b8861/9e39604f-fab38da7-f410426d-8451e4f6.jpg b/tests/gen_mimic/images-224/files/p60/p605764b5/s266b8861/9e39604f-fab38da7-f410426d-8451e4f6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p62/p62149c26/s14b34c50/52ba5787-46aa2906-87e9fd54-bc3fd837.jpg b/tests/gen_mimic/images-224/files/p62/p62149c26/s14b34c50/52ba5787-46aa2906-87e9fd54-bc3fd837.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p66/p66592eb9/sdef6bf64/ca5a3173-60338bbe-711695d0-3448d57b.jpg b/tests/gen_mimic/images-224/files/p66/p66592eb9/sdef6bf64/ca5a3173-60338bbe-711695d0-3448d57b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p67/p6730eec6/sd00adbb3/f42fbdad-1e9b8d24-f815c867-75e32d5e.jpg b/tests/gen_mimic/images-224/files/p67/p6730eec6/sd00adbb3/f42fbdad-1e9b8d24-f815c867-75e32d5e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p67/p67d4a7c2/sbb9d1b94/082da48b-e0907024-71437d4a-9e129a83.jpg b/tests/gen_mimic/images-224/files/p67/p67d4a7c2/sbb9d1b94/082da48b-e0907024-71437d4a-9e129a83.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p69/p69fcfd52/s1e76489d/7f93a820-3501bf2f-03abd87f-6005216e.jpg b/tests/gen_mimic/images-224/files/p69/p69fcfd52/s1e76489d/7f93a820-3501bf2f-03abd87f-6005216e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p6b/p6bb08dad/s95df9dfe/0b8dcae3-6f810969-403294ec-b12c57f7.jpg b/tests/gen_mimic/images-224/files/p6b/p6bb08dad/s95df9dfe/0b8dcae3-6f810969-403294ec-b12c57f7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p70/p70e84808/sde56ac61/37eb7689-401def65-adc29f03-80bfec57.jpg b/tests/gen_mimic/images-224/files/p70/p70e84808/sde56ac61/37eb7689-401def65-adc29f03-80bfec57.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p72/p727889bf/sbeb95018/35c148ac-02e88f87-31f5ad80-ddb29478.jpg b/tests/gen_mimic/images-224/files/p72/p727889bf/sbeb95018/35c148ac-02e88f87-31f5ad80-ddb29478.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p78/p78658ed8/sadc3f650/9de9c841-872074e1-3e9775e1-0e0e2e76.jpg b/tests/gen_mimic/images-224/files/p78/p78658ed8/sadc3f650/9de9c841-872074e1-3e9775e1-0e0e2e76.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p79/p7965c7d7/sfc00c854/ee6c04cd-dec16416-96efd3f3-ded808e3.jpg b/tests/gen_mimic/images-224/files/p79/p7965c7d7/sfc00c854/ee6c04cd-dec16416-96efd3f3-ded808e3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p7d/p7d94c15f/s7e7001ee/3f891948-b5baeab2-28d37adb-718ab4ab.jpg b/tests/gen_mimic/images-224/files/p7d/p7d94c15f/s7e7001ee/3f891948-b5baeab2-28d37adb-718ab4ab.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p80/p80ba1f4c/se12fa3f6/015dc77d-eb10776d-36eaaca2-3f9b36c2.jpg b/tests/gen_mimic/images-224/files/p80/p80ba1f4c/se12fa3f6/015dc77d-eb10776d-36eaaca2-3f9b36c2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p81/p81355df1/s50d4986b/42ec6020-0795c6a3-ddced511-5b81073b.jpg b/tests/gen_mimic/images-224/files/p81/p81355df1/s50d4986b/42ec6020-0795c6a3-ddced511-5b81073b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p82/p8231bf4b/sbc5aa79f/d6c6343b-912fd3f8-cd6b8fdf-a119373a.jpg b/tests/gen_mimic/images-224/files/p82/p8231bf4b/sbc5aa79f/d6c6343b-912fd3f8-cd6b8fdf-a119373a.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p86/p862a380d/s6cdc9063/ea2155aa-b89d8367-227a5543-3936ba36.jpg b/tests/gen_mimic/images-224/files/p86/p862a380d/s6cdc9063/ea2155aa-b89d8367-227a5543-3936ba36.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p93/p936623db/sb93b8e79/37cea7de-ba07488a-ca296af3-987e28d2.jpg b/tests/gen_mimic/images-224/files/p93/p936623db/sb93b8e79/37cea7de-ba07488a-ca296af3-987e28d2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p95/p950025fb/sdbf73728/b96ad4a8-266f779e-6bb986ca-59fa1099.jpg b/tests/gen_mimic/images-224/files/p95/p950025fb/sdbf73728/b96ad4a8-266f779e-6bb986ca-59fa1099.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p98/p982044b1/s3fa33bce/e62e681c-0b90c9f8-e5f376e7-8e39d39c.jpg b/tests/gen_mimic/images-224/files/p98/p982044b1/s3fa33bce/e62e681c-0b90c9f8-e5f376e7-8e39d39c.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p99/p99af93f0/sf855052b/b3431893-13edbdb8-57dad111-6fb33794.jpg b/tests/gen_mimic/images-224/files/p99/p99af93f0/sf855052b/b3431893-13edbdb8-57dad111-6fb33794.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p9b/p9b0c5003/s3190176a/87b202c5-2adf7ccd-7e02ece7-4a0db5d9.jpg b/tests/gen_mimic/images-224/files/p9b/p9b0c5003/s3190176a/87b202c5-2adf7ccd-7e02ece7-4a0db5d9.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p9d/p9d9e0dbc/s54a0a4bf/07390b5c-3acbd27b-4cddcc37-19b562f5.jpg b/tests/gen_mimic/images-224/files/p9d/p9d9e0dbc/s54a0a4bf/07390b5c-3acbd27b-4cddcc37-19b562f5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p9f/p9ff616cd/s58ad2be3/6cc5e64e-d0a5f5d4-99992264-d0233a31.jpg b/tests/gen_mimic/images-224/files/p9f/p9ff616cd/s58ad2be3/6cc5e64e-d0a5f5d4-99992264-d0233a31.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pa0/pa0311c90/sd7619ebc/5fa62f9e-86d7d8b2-3f8b233a-cf945af7.jpg b/tests/gen_mimic/images-224/files/pa0/pa0311c90/sd7619ebc/5fa62f9e-86d7d8b2-3f8b233a-cf945af7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pa7/pa78933d8/sbccdda0d/bd03db19-a077a18a-f5c0107f-fe07e42a.jpg b/tests/gen_mimic/images-224/files/pa7/pa78933d8/sbccdda0d/bd03db19-a077a18a-f5c0107f-fe07e42a.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pab/pabc1242c/s75a00dad/d432c2b9-a59f399d-55128859-4c40617d.jpg b/tests/gen_mimic/images-224/files/pab/pabc1242c/s75a00dad/d432c2b9-a59f399d-55128859-4c40617d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pae/pae80d573/s149b204c/af091005-ab73c5ca-d3d0a857-a1e42b43.jpg b/tests/gen_mimic/images-224/files/pae/pae80d573/s149b204c/af091005-ab73c5ca-d3d0a857-a1e42b43.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pae/paeb32909/s6e71b801/4bf8c19d-61ed148b-5e2c854b-2a7ce889.jpg b/tests/gen_mimic/images-224/files/pae/paeb32909/s6e71b801/4bf8c19d-61ed148b-5e2c854b-2a7ce889.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pb1/pb1668a60/s9dfe2ebc/7ff7fea4-03f4d5de-7795c3e0-6bc5ed3b.jpg b/tests/gen_mimic/images-224/files/pb1/pb1668a60/s9dfe2ebc/7ff7fea4-03f4d5de-7795c3e0-6bc5ed3b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pb8/pb8a4585d/s23601ba5/45276889-19e22b6f-1ccc4d27-3a6d80aa.jpg b/tests/gen_mimic/images-224/files/pb8/pb8a4585d/s23601ba5/45276889-19e22b6f-1ccc4d27-3a6d80aa.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pba/pba043006/s929858f1/4095ec1b-1bb1dd72-9d77167a-4bac4d4b.jpg b/tests/gen_mimic/images-224/files/pba/pba043006/s929858f1/4095ec1b-1bb1dd72-9d77167a-4bac4d4b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pba/pba821bdf/seb52f69c/24a466e6-181d6c1c-eae92137-38c90ec9.jpg b/tests/gen_mimic/images-224/files/pba/pba821bdf/seb52f69c/24a466e6-181d6c1c-eae92137-38c90ec9.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pbd/pbd3f44cd/s8be7a71b/440b9914-91df7a6d-452ccba7-f6423c89.jpg b/tests/gen_mimic/images-224/files/pbd/pbd3f44cd/s8be7a71b/440b9914-91df7a6d-452ccba7-f6423c89.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pbe/pbeb1dbc3/s5d9243aa/0dd56c04-7278308e-6356ab3a-da874d53.jpg b/tests/gen_mimic/images-224/files/pbe/pbeb1dbc3/s5d9243aa/0dd56c04-7278308e-6356ab3a-da874d53.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pc0/pc00d78b9/sa0798258/d5d40c5a-ca640221-3e60fb27-cae8062d.jpg b/tests/gen_mimic/images-224/files/pc0/pc00d78b9/sa0798258/d5d40c5a-ca640221-3e60fb27-cae8062d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pc3/pc3dd3fe4/scfeaea37/cd3cb96d-87138433-f6a7592d-a371aca7.jpg b/tests/gen_mimic/images-224/files/pc3/pc3dd3fe4/scfeaea37/cd3cb96d-87138433-f6a7592d-a371aca7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pc6/pc6fc66e6/se48b3c2b/3cc3d581-af55fcf1-376c3586-b6ba8056.jpg b/tests/gen_mimic/images-224/files/pc6/pc6fc66e6/se48b3c2b/3cc3d581-af55fcf1-376c3586-b6ba8056.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pc8/pc80aa8dc/s10b8a1ea/ffc2d4a2-e4b44c0c-4f071491-68955982.jpg b/tests/gen_mimic/images-224/files/pc8/pc80aa8dc/s10b8a1ea/ffc2d4a2-e4b44c0c-4f071491-68955982.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pca/pca849ba9/s3c52fb1f/90003c60-446b48ec-567eefdd-d10903fb.jpg b/tests/gen_mimic/images-224/files/pca/pca849ba9/s3c52fb1f/90003c60-446b48ec-567eefdd-d10903fb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pcb/pcbca47ca/sab7e1939/9e317590-04d4b774-944cfcaf-eeb58c6e.jpg b/tests/gen_mimic/images-224/files/pcb/pcbca47ca/sab7e1939/9e317590-04d4b774-944cfcaf-eeb58c6e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pcd/pcd308688/s9e344fd3/d693caf9-5f2b4ae2-6a6af401-21613192.jpg b/tests/gen_mimic/images-224/files/pcd/pcd308688/s9e344fd3/d693caf9-5f2b4ae2-6a6af401-21613192.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pce/pce8f7db8/s5e9a74fe/bd15e9b2-53b8e4e8-750aee04-1d36b2d1.jpg b/tests/gen_mimic/images-224/files/pce/pce8f7db8/s5e9a74fe/bd15e9b2-53b8e4e8-750aee04-1d36b2d1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pcf/pcfdf2004/s51e11051/8fabbe65-06eaa11a-2dd88186-cccaeca5.jpg b/tests/gen_mimic/images-224/files/pcf/pcfdf2004/s51e11051/8fabbe65-06eaa11a-2dd88186-cccaeca5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pd2/pd2e9ef2f/sc2c621af/09d3c8ba-4bb60535-e5222e77-4b05605c.jpg b/tests/gen_mimic/images-224/files/pd2/pd2e9ef2f/sc2c621af/09d3c8ba-4bb60535-e5222e77-4b05605c.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pd3/pd3d2355d/s4a11c4c5/15bb20ff-a92ea69d-1e8a7e91-4b530c77.jpg b/tests/gen_mimic/images-224/files/pd3/pd3d2355d/s4a11c4c5/15bb20ff-a92ea69d-1e8a7e91-4b530c77.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pd5/pd508e74c/s06953799/9031473a-0cf3181c-0b1a8cc1-66d6ea9a.jpg b/tests/gen_mimic/images-224/files/pd5/pd508e74c/s06953799/9031473a-0cf3181c-0b1a8cc1-66d6ea9a.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pd8/pd84b3758/s0340e918/44fd9124-c4837570-0cd0ed5f-5bcffbe1.jpg b/tests/gen_mimic/images-224/files/pd8/pd84b3758/s0340e918/44fd9124-c4837570-0cd0ed5f-5bcffbe1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pda/pda7e8892/s1ea8f2f9/4490db49-8a28d6a9-e4eb6a6c-6f1854f8.jpg b/tests/gen_mimic/images-224/files/pda/pda7e8892/s1ea8f2f9/4490db49-8a28d6a9-e4eb6a6c-6f1854f8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pdc/pdc84998c/se57581c8/1060d662-072e003c-dbf05f2e-4ccac4a5.jpg b/tests/gen_mimic/images-224/files/pdc/pdc84998c/se57581c8/1060d662-072e003c-dbf05f2e-4ccac4a5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pe4/pe42ced85/s352789df/435ce0ac-4d95e7c1-34a4fb28-e6f7c9e9.jpg b/tests/gen_mimic/images-224/files/pe4/pe42ced85/s352789df/435ce0ac-4d95e7c1-34a4fb28-e6f7c9e9.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pe7/pe79ec2f1/scce2cf67/039fe911-344eab62-7f300b59-684f2fae.jpg b/tests/gen_mimic/images-224/files/pe7/pe79ec2f1/scce2cf67/039fe911-344eab62-7f300b59-684f2fae.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pe8/pe89a550a/sd213798d/e9e2b87b-3d3e9c4e-3b18d389-d8962c79.jpg b/tests/gen_mimic/images-224/files/pe8/pe89a550a/sd213798d/e9e2b87b-3d3e9c4e-3b18d389-d8962c79.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pea/pea77727e/sd5a7486e/f3cf7fa3-5c7851d6-8c9edbd0-0c8c64ef.jpg b/tests/gen_mimic/images-224/files/pea/pea77727e/sd5a7486e/f3cf7fa3-5c7851d6-8c9edbd0-0c8c64ef.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pec/pec45c8d4/s6cc1992c/4b7b5b36-3d1f22d5-83d30f11-34fde697.jpg b/tests/gen_mimic/images-224/files/pec/pec45c8d4/s6cc1992c/4b7b5b36-3d1f22d5-83d30f11-34fde697.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pec/pec98e654/sa3457d67/be767e96-e6350ffc-5d23d270-24a7860e.jpg b/tests/gen_mimic/images-224/files/pec/pec98e654/sa3457d67/be767e96-e6350ffc-5d23d270-24a7860e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pee/pee99ac51/s910a87f1/dda2576c-e86e4a2d-a36bf76a-8dfd2ab0.jpg b/tests/gen_mimic/images-224/files/pee/pee99ac51/s910a87f1/dda2576c-e86e4a2d-a36bf76a-8dfd2ab0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pef/peff712e4/s6391d0ac/a95606b7-c0fecf1e-ba7c6578-b6eabffd.jpg b/tests/gen_mimic/images-224/files/pef/peff712e4/s6391d0ac/a95606b7-c0fecf1e-ba7c6578-b6eabffd.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pf0/pf0736b23/s80147605/476391d0-88c15dff-5ef15726-e295bb0a.jpg b/tests/gen_mimic/images-224/files/pf0/pf0736b23/s80147605/476391d0-88c15dff-5ef15726-e295bb0a.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pf0/pf0b67e19/s5f14d7e7/f7667307-18823508-8a6a141b-9d78bbfe.jpg b/tests/gen_mimic/images-224/files/pf0/pf0b67e19/s5f14d7e7/f7667307-18823508-8a6a141b-9d78bbfe.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pf2/pf22f3c19/s4ab7695f/62aef45b-e5538f95-7dc63298-c10bf6b2.jpg b/tests/gen_mimic/images-224/files/pf2/pf22f3c19/s4ab7695f/62aef45b-e5538f95-7dc63298-c10bf6b2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pf2/pf2f591b5/sdfe4d498/1caa6f1b-08c6ea8d-44b1ceb7-54a05871.jpg b/tests/gen_mimic/images-224/files/pf2/pf2f591b5/sdfe4d498/1caa6f1b-08c6ea8d-44b1ceb7-54a05871.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pf6/pf643ee65/s11007cfc/a80d59b5-8356df47-d3454d71-b6ae7aff.jpg b/tests/gen_mimic/images-224/files/pf6/pf643ee65/s11007cfc/a80d59b5-8356df47-d3454d71-b6ae7aff.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pf6/pf6eb7535/s6a9161f8/6b0d5ad0-197afbf6-4aaa2a2a-d039dcb4.jpg b/tests/gen_mimic/images-224/files/pf6/pf6eb7535/s6a9161f8/6b0d5ad0-197afbf6-4aaa2a2a-d039dcb4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pf9/pf99b70cd/sdcd8dcdf/f7c53178-f0052fa6-87febe34-c10dc291.jpg b/tests/gen_mimic/images-224/files/pf9/pf99b70cd/sdcd8dcdf/f7c53178-f0052fa6-87febe34-c10dc291.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pfa/pfacdd6b9/s54f63b56/f860214f-1edfec29-bdae07fb-fad50e3b.jpg b/tests/gen_mimic/images-224/files/pfa/pfacdd6b9/s54f63b56/f860214f-1edfec29-bdae07fb-fad50e3b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pfd/pfd072d66/sab1d747c/6bf31a1c-092e1543-5ab18d17-14257f4c.jpg b/tests/gen_mimic/images-224/files/pfd/pfd072d66/sab1d747c/6bf31a1c-092e1543-5ab18d17-14257f4c.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pfd/pfd1f37df/s72634032/64cd73ba-ee40ca52-ba4808ca-1b99a887.jpg b/tests/gen_mimic/images-224/files/pfd/pfd1f37df/s72634032/64cd73ba-ee40ca52-ba4808ca-1b99a887.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pff/pffe42d04/s7c56bb93/6afbd207-460ce550-370a678a-08b9b9cc.jpg b/tests/gen_mimic/images-224/files/pff/pffe42d04/s7c56bb93/6afbd207-460ce550-370a678a-08b9b9cc.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv b/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv new file mode 100644 index 0000000..3a31c0b --- /dev/null +++ b/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv @@ -0,0 +1,101 @@ +dicom_id,subject_id,study_id,PerformedProcedureStepDescription,ViewPosition,Rows,Columns,StudyDate,StudyTime,ProcedureCodeSequence_CodeMeaning,ViewCodeSequence_CodeMeaning,PatientOrientationCodeSequence_CodeMeaning +3f891948-b5baeab2-28d37adb-718ab4ab,7d94c15f,7e7001ee,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +6366f5b8-60cda42d-d02a2489-1f9cc9b0,14472725,e7eb45a0,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +7f93a820-3501bf2f-03abd87f-6005216e,69fcfd52,1e76489d,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +9de9c841-872074e1-3e9775e1-0e0e2e76,78658ed8,adc3f650,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +59cb4d6e-519eae74-06af42fc-5077238b,4d8c768a,d194c4c5,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +1fed0d84-557646d8-41e6108f-063c2fca,3707bcf5,32cbad59,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +bd03db19-a077a18a-f5c0107f-fe07e42a,a78933d8,bccdda0d,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +5fa62f9e-86d7d8b2-3f8b233a-cf945af7,a0311c90,d7619ebc,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +0b8dcae3-6f810969-403294ec-b12c57f7,6bb08dad,95df9dfe,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +452df9cf-1cbb6b5e-d8639a1e-a08d32e3,0544f306,14e3e8bd,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +6e566b28-7dc76e51-363018ce-a0fa4a08,5fe54996,06e771a6,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +f7667307-18823508-8a6a141b-9d78bbfe,f0b67e19,5f14d7e7,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +f7c53178-f0052fa6-87febe34-c10dc291,f99b70cd,dcd8dcdf,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +408d770a-8163a0db-e6484216-c9f8814e,07ea4113,4a7a73de,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +6afb2b4d-e4806ac4-a34488fb-92bf282d,1f50e4a4,c64d1ec6,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +09d3c8ba-4bb60535-e5222e77-4b05605c,d2e9ef2f,c2c621af,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +ea2155aa-b89d8367-227a5543-3936ba36,862a380d,6cdc9063,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +64cd73ba-ee40ca52-ba4808ca-1b99a887,fd1f37df,72634032,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +6afbd207-460ce550-370a678a-08b9b9cc,ffe42d04,7c56bb93,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +3ab3a15e-710c1f1a-d9aa04c5-acd8c33a,2a8cbe9c,de422f0a,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +be767e96-e6350ffc-5d23d270-24a7860e,ec98e654,a3457d67,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +aec0415b-53d43067-de067b8f-ce37c7fb,52fa97c0,0b31040c,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +8dc7085c-f637862e-f65ca63b-65ad4799,0c3143cb,08efbd2f,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +a4bf5ac8-79606789-3d99f752-d2a888c3,1179de34,9aec6f8d,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +8fabbe65-06eaa11a-2dd88186-cccaeca5,cfdf2004,51e11051,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +9e317590-04d4b774-944cfcaf-eeb58c6e,cbca47ca,ab7e1939,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +b96ad4a8-266f779e-6bb986ca-59fa1099,950025fb,dbf73728,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +56ce0780-04eb57fe-a4c7528e-1822f095,225b7be0,ee059b45,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +1caa6f1b-08c6ea8d-44b1ceb7-54a05871,f2f591b5,dfe4d498,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +476391d0-88c15dff-5ef15726-e295bb0a,f0736b23,80147605,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +039fe911-344eab62-7f300b59-684f2fae,e79ec2f1,cce2cf67,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +4b7b5b36-3d1f22d5-83d30f11-34fde697,ec45c8d4,6cc1992c,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +1060d662-072e003c-dbf05f2e-4ccac4a5,dc84998c,e57581c8,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +b59b8ba2-db68273a-d53bc742-f593b6c8,4fd10475,9f58d7ca,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +0f6f5408-9392b8fc-6332764d-c39ac00f,3bd01425,66ba470d,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +440b9914-91df7a6d-452ccba7-f6423c89,bd3f44cd,8be7a71b,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +4490db49-8a28d6a9-e4eb6a6c-6f1854f8,da7e8892,1ea8f2f9,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +35c148ac-02e88f87-31f5ad80-ddb29478,727889bf,beb95018,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +920772aa-c204dc44-99f62611-87be5ea1,4d702ac9,d78068ee,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +9e39604f-fab38da7-f410426d-8451e4f6,605764b5,266b8861,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +02d8f4df-3a3e4445-e3c65a32-b42c67b6,5c61a0c7,452981c6,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +867a4c82-955ccc97-7eb349f9-a28ca6f5,2c0aea2d,7edf4838,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +9031473a-0cf3181c-0b1a8cc1-66d6ea9a,d508e74c,06953799,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +16b47fc6-3651620c-ee0eae0d-a8381e72,35e20610,cb1a83df,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +90003c60-446b48ec-567eefdd-d10903fb,ca849ba9,3c52fb1f,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +7ff7fea4-03f4d5de-7795c3e0-6bc5ed3b,b1668a60,9dfe2ebc,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +6bf31a1c-092e1543-5ab18d17-14257f4c,fd072d66,ab1d747c,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +082da48b-e0907024-71437d4a-9e129a83,67d4a7c2,bb9d1b94,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +7fc579fd-dffbd9d6-60eda497-66a17b26,2999546b,656d4c67,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +71f7fb51-bbb2462f-10afbcbf-2838cd29,2252ddd1,87842c63,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +015dc77d-eb10776d-36eaaca2-3f9b36c2,80ba1f4c,e12fa3f6,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +47928aec-7d506a45-e2defa1e-9eac22a7,357210e4,1b794d99,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +401f9466-bc8c501c-984218a7-7ea2a46b,2ad837bf,8ecf5b71,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +0afd2cf3-2d76ad25-1be75ad6-64d6cc86,28407bd8,776a9732,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +14590a8c-d308d549-66353123-823e3602,4800527c,521977e7,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +52ba5787-46aa2906-87e9fd54-bc3fd837,62149c26,14b34c50,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +43d4e45b-0309b696-b38219e2-34048035,51df2e95,fca58ce6,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +33093b96-ae905e2e-3714c3cc-45536dab,035c7641,1d793a25,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +ee6c04cd-dec16416-96efd3f3-ded808e3,7965c7d7,fc00c854,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +1cdc4221-e3767c0e-4e64a24c-97da9ae8,2d687542,edf6d60a,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +dda2576c-e86e4a2d-a36bf76a-8dfd2ab0,ee99ac51,910a87f1,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +15bb20ff-a92ea69d-1e8a7e91-4b530c77,d3d2355d,4a11c4c5,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +37cea7de-ba07488a-ca296af3-987e28d2,936623db,b93b8e79,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +35b3fb60-5a416c82-3dd7f2af-69d76155,19b04cf4,2cbc6bad,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +f3cf7fa3-5c7851d6-8c9edbd0-0c8c64ef,ea77727e,d5a7486e,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +c1531145-8a0a811c-b9970154-b49fce3f,3d619352,bd9f518f,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +7cdc4ba8-68b208c7-def2409a-cfce9906,2a516454,7edb140a,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +d6c6343b-912fd3f8-cd6b8fdf-a119373a,8231bf4b,bc5aa79f,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +87b202c5-2adf7ccd-7e02ece7-4a0db5d9,9b0c5003,3190176a,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +42ec6020-0795c6a3-ddced511-5b81073b,81355df1,50d4986b,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +07390b5c-3acbd27b-4cddcc37-19b562f5,9d9e0dbc,54a0a4bf,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +af091005-ab73c5ca-d3d0a857-a1e42b43,ae80d573,149b204c,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +c510a3b8-bf3c2545-602db8ef-bfb640df,594a4934,c377fe22,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +84a4a199-0e968dcf-21256899-eb7e053e,190b1b36,f9f8098e,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +7a73e2e1-7964ea55-77bf4a43-92742356,14ba4aea,d9ce6319,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +a95606b7-c0fecf1e-ba7c6578-b6eabffd,eff712e4,6391d0ac,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +44fd9124-c4837570-0cd0ed5f-5bcffbe1,d84b3758,0340e918,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +ca5a3173-60338bbe-711695d0-3448d57b,66592eb9,def6bf64,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +4345c04f-633971b1-58c93c0b-bdb3748d,404e1e3d,7ef2c8ee,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +1fd5e7e8-808658e6-3ec403f3-2a6a3109,5ee7697e,ceb85c30,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +19043538-8294af9c-957be8b5-d751b65a,35476b4a,a75e3451,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +b3431893-13edbdb8-57dad111-6fb33794,99af93f0,f855052b,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +37eb7689-401def65-adc29f03-80bfec57,70e84808,de56ac61,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +25cc94e9-bd797896-e311d0db-7c181371,31384363,58a45da1,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +d432c2b9-a59f399d-55128859-4c40617d,abc1242c,75a00dad,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +e62e681c-0b90c9f8-e5f376e7-8e39d39c,982044b1,3fa33bce,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +4bf8c19d-61ed148b-5e2c854b-2a7ce889,aeb32909,6e71b801,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +30ab56f1-1c5c214b-b5fd256c-404b9caf,39e8eb68,ea7d80f9,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +d7b62118-456cc7dd-fd7aae3a-b7a99e99,5c088c08,d0875cea,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +f860214f-1edfec29-bdae07fb-fad50e3b,facdd6b9,54f63b56,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +cd3cb96d-87138433-f6a7592d-a371aca7,c3dd3fe4,cfeaea37,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +435ce0ac-4d95e7c1-34a4fb28-e6f7c9e9,e42ced85,352789df,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +ffc2d4a2-e4b44c0c-4f071491-68955982,c80aa8dc,10b8a1ea,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +722678b5-671357c9-aaae7d33-f8862161,0540cdff,b8ce0ecd,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +3cc3d581-af55fcf1-376c3586-b6ba8056,c6fc66e6,e48b3c2b,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +4cd8b116-2e4c7d7c-cbb019f0-9f5d21a2,1b371dc2,d56d2785,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +02d9dd68-7c42e9bb-c2c45394-53a325e3,002677b2,67f3fe0b,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +30e5efca-91634147-b3391772-4dffe153,476f7556,6400dc24,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +6cc5e64e-d0a5f5d4-99992264-d0233a31,9ff616cd,58ad2be3,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +4095ec1b-1bb1dd72-9d77167a-4bac4d4b,ba043006,929858f1,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect diff --git a/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv.gz b/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv.gz new file mode 100644 index 0000000000000000000000000000000000000000..7794b199a076a1f9e4ed94e993b08cd0f0ff9828 GIT binary patch literal 3749 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 P|NjF30fUlTgEIgCjdO0R literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv b/tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv new file mode 100644 index 0000000..b256507 --- /dev/null +++ b/tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv @@ -0,0 +1,101 @@ +subject_id,study_id,Atelectasis,Cardiomegaly,Consolidation,Edema,Enlarged Cardiomediastinum,Fracture,Lung Lesion,Lung Opacity,No Finding,Pleural Effusion,Pleural Other,Pneumonia,Pneumothorax,Support Devices +7d94c15f,7e7001ee,1.0,,1.0,,0.0,1.0,,,-1.0,-1.0,1.0,0.0,0.0,-1.0 +14472725,e7eb45a0,0.0,1.0,-1.0,0.0,-1.0,,,,0.0,-1.0,-1.0,1.0,0.0,0.0 +69fcfd52,1e76489d,,,-1.0,,1.0,,,,,1.0,-1.0,0.0,0.0,1.0 +78658ed8,adc3f650,-1.0,-1.0,,1.0,0.0,0.0,1.0,,,0.0,0.0,-1.0,0.0,0.0 +4d8c768a,d194c4c5,1.0,,1.0,-1.0,0.0,1.0,-1.0,-1.0,,-1.0,,0.0,1.0,-1.0 +3707bcf5,32cbad59,1.0,,-1.0,-1.0,1.0,0.0,0.0,,0.0,0.0,0.0,-1.0,0.0,1.0 +a78933d8,bccdda0d,0.0,0.0,1.0,0.0,0.0,0.0,-1.0,-1.0,1.0,-1.0,-1.0,-1.0,-1.0,1.0 +a0311c90,d7619ebc,1.0,1.0,-1.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,-1.0,0.0 +6bb08dad,95df9dfe,1.0,0.0,1.0,0.0,,,1.0,,0.0,-1.0,,-1.0,,0.0 +0544f306,14e3e8bd,,1.0,-1.0,,,-1.0,-1.0,0.0,1.0,0.0,0.0,,1.0,0.0 +5fe54996,06e771a6,-1.0,,,,,0.0,0.0,0.0,0.0,0.0,-1.0,,1.0,1.0 +f0b67e19,5f14d7e7,,,-1.0,,,1.0,-1.0,0.0,0.0,-1.0,-1.0,,1.0,0.0 +f99b70cd,dcd8dcdf,1.0,1.0,0.0,1.0,1.0,1.0,-1.0,0.0,,-1.0,,0.0,-1.0,0.0 +07ea4113,4a7a73de,-1.0,-1.0,0.0,-1.0,,1.0,,,,0.0,1.0,,1.0,0.0 +1f50e4a4,c64d1ec6,,1.0,0.0,0.0,,1.0,-1.0,-1.0,0.0,1.0,1.0,-1.0,1.0,1.0 +d2e9ef2f,c2c621af,0.0,,-1.0,-1.0,,1.0,-1.0,,1.0,1.0,0.0,-1.0,0.0,1.0 +862a380d,6cdc9063,1.0,0.0,,,0.0,1.0,,,-1.0,,1.0,-1.0,,-1.0 +fd1f37df,72634032,0.0,0.0,-1.0,,1.0,1.0,0.0,0.0,0.0,,1.0,,1.0, +ffe42d04,7c56bb93,-1.0,,-1.0,-1.0,,-1.0,1.0,0.0,-1.0,,-1.0,-1.0,0.0, +2a8cbe9c,de422f0a,-1.0,0.0,-1.0,0.0,0.0,,0.0,0.0,-1.0,,1.0,-1.0,0.0, +ec98e654,a3457d67,-1.0,1.0,-1.0,1.0,0.0,0.0,1.0,,,-1.0,,1.0,1.0,0.0 +52fa97c0,0b31040c,0.0,0.0,1.0,-1.0,1.0,0.0,1.0,,0.0,1.0,1.0,1.0,1.0, +0c3143cb,08efbd2f,0.0,1.0,1.0,-1.0,1.0,1.0,1.0,-1.0,-1.0,-1.0,,,0.0,-1.0 +1179de34,9aec6f8d,-1.0,-1.0,,-1.0,,-1.0,0.0,-1.0,1.0,1.0,1.0,0.0,,-1.0 +cfdf2004,51e11051,-1.0,1.0,1.0,1.0,,,-1.0,0.0,-1.0,1.0,,-1.0,,1.0 +cbca47ca,ab7e1939,,-1.0,,-1.0,,-1.0,,1.0,0.0,-1.0,-1.0,,0.0,-1.0 +950025fb,dbf73728,1.0,1.0,1.0,1.0,0.0,-1.0,,-1.0,,1.0,1.0,,-1.0,1.0 +225b7be0,ee059b45,-1.0,,0.0,1.0,1.0,-1.0,0.0,0.0,,-1.0,0.0,-1.0,0.0,-1.0 +f2f591b5,dfe4d498,-1.0,,,1.0,-1.0,,-1.0,-1.0,-1.0,-1.0,,,-1.0,-1.0 +f0736b23,80147605,0.0,1.0,0.0,0.0,1.0,-1.0,0.0,,1.0,0.0,,-1.0,,-1.0 +e79ec2f1,cce2cf67,-1.0,1.0,-1.0,,,1.0,0.0,0.0,0.0,0.0,,0.0,0.0,-1.0 +ec45c8d4,6cc1992c,0.0,1.0,,,0.0,,,-1.0,-1.0,-1.0,0.0,,-1.0, +dc84998c,e57581c8,1.0,0.0,-1.0,0.0,,1.0,0.0,,0.0,1.0,-1.0,0.0,1.0,0.0 +4fd10475,9f58d7ca,0.0,0.0,,0.0,,0.0,,1.0,0.0,1.0,-1.0,0.0,1.0,1.0 +3bd01425,66ba470d,,1.0,,,0.0,-1.0,,,-1.0,-1.0,-1.0,-1.0,0.0, +bd3f44cd,8be7a71b,-1.0,1.0,-1.0,0.0,,,-1.0,-1.0,-1.0,0.0,-1.0,-1.0,,-1.0 +da7e8892,1ea8f2f9,1.0,0.0,,0.0,,0.0,,,,,,0.0,-1.0,0.0 +727889bf,beb95018,-1.0,-1.0,1.0,-1.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0,,0.0 +4d702ac9,d78068ee,-1.0,-1.0,0.0,-1.0,-1.0,0.0,0.0,1.0,0.0,0.0,-1.0,,,1.0 +605764b5,266b8861,-1.0,1.0,1.0,1.0,0.0,0.0,-1.0,1.0,0.0,-1.0,1.0,1.0,1.0, +5c61a0c7,452981c6,,,1.0,,,,1.0,1.0,1.0,,1.0,0.0,-1.0,-1.0 +2c0aea2d,7edf4838,1.0,0.0,-1.0,-1.0,-1.0,-1.0,0.0,1.0,0.0,-1.0,0.0,-1.0,0.0,1.0 +d508e74c,06953799,0.0,0.0,-1.0,,,0.0,,0.0,-1.0,1.0,-1.0,1.0,-1.0,-1.0 +35e20610,cb1a83df,1.0,0.0,-1.0,,1.0,-1.0,,-1.0,1.0,0.0,-1.0,,0.0,1.0 +ca849ba9,3c52fb1f,1.0,,,-1.0,,0.0,-1.0,0.0,1.0,,-1.0,,-1.0,1.0 +b1668a60,9dfe2ebc,0.0,-1.0,,-1.0,-1.0,-1.0,1.0,,1.0,1.0,,,,1.0 +fd072d66,ab1d747c,-1.0,,,-1.0,-1.0,1.0,1.0,-1.0,0.0,,,,1.0,-1.0 +67d4a7c2,bb9d1b94,,1.0,0.0,1.0,1.0,,0.0,-1.0,0.0,0.0,-1.0,1.0,,-1.0 +2999546b,656d4c67,,-1.0,,1.0,-1.0,1.0,-1.0,1.0,,0.0,1.0,1.0,0.0, +2252ddd1,87842c63,,1.0,0.0,0.0,0.0,-1.0,-1.0,-1.0,0.0,,1.0,0.0,1.0, +80ba1f4c,e12fa3f6,1.0,,-1.0,1.0,,0.0,1.0,0.0,0.0,0.0,,0.0,1.0,1.0 +357210e4,1b794d99,-1.0,,,1.0,1.0,0.0,0.0,1.0,0.0,-1.0,0.0,,,0.0 +2ad837bf,8ecf5b71,0.0,-1.0,-1.0,-1.0,1.0,-1.0,1.0,-1.0,1.0,0.0,0.0,,1.0,1.0 +28407bd8,776a9732,-1.0,1.0,-1.0,0.0,1.0,0.0,0.0,0.0,1.0,-1.0,-1.0,-1.0,0.0, +4800527c,521977e7,-1.0,0.0,,1.0,0.0,1.0,0.0,1.0,1.0,0.0,,1.0,-1.0,-1.0 +62149c26,14b34c50,-1.0,1.0,0.0,0.0,,0.0,,1.0,0.0,-1.0,,-1.0,0.0,-1.0 +51df2e95,fca58ce6,-1.0,1.0,1.0,,0.0,1.0,1.0,-1.0,0.0,-1.0,1.0,0.0,0.0, +035c7641,1d793a25,-1.0,-1.0,,-1.0,,-1.0,0.0,,,-1.0,1.0,,,1.0 +7965c7d7,fc00c854,,1.0,-1.0,0.0,0.0,-1.0,1.0,0.0,0.0,-1.0,-1.0,,0.0,1.0 +2d687542,edf6d60a,,0.0,0.0,0.0,1.0,0.0,,1.0,1.0,1.0,0.0,-1.0,, +ee99ac51,910a87f1,,1.0,0.0,1.0,,1.0,-1.0,-1.0,-1.0,1.0,,,-1.0,1.0 +d3d2355d,4a11c4c5,-1.0,,,-1.0,-1.0,1.0,,,0.0,1.0,0.0,0.0,-1.0,0.0 +936623db,b93b8e79,1.0,0.0,0.0,0.0,0.0,1.0,-1.0,0.0,0.0,-1.0,-1.0,-1.0,-1.0,0.0 +19b04cf4,2cbc6bad,,-1.0,0.0,-1.0,0.0,0.0,,1.0,1.0,,,,0.0,1.0 +ea77727e,d5a7486e,-1.0,1.0,,1.0,-1.0,,1.0,-1.0,1.0,1.0,,1.0,-1.0, +3d619352,bd9f518f,-1.0,-1.0,1.0,,0.0,-1.0,0.0,,1.0,,-1.0,0.0,0.0,-1.0 +2a516454,7edb140a,0.0,-1.0,0.0,1.0,,,-1.0,1.0,0.0,,-1.0,-1.0,1.0,0.0 +8231bf4b,bc5aa79f,,,-1.0,-1.0,,-1.0,1.0,0.0,0.0,1.0,,-1.0,0.0,1.0 +9b0c5003,3190176a,1.0,1.0,,-1.0,-1.0,0.0,1.0,,-1.0,-1.0,,-1.0,,-1.0 +81355df1,50d4986b,-1.0,,,,,,0.0,1.0,-1.0,0.0,-1.0,0.0,-1.0, +9d9e0dbc,54a0a4bf,,-1.0,,0.0,-1.0,,-1.0,-1.0,1.0,1.0,1.0,0.0,, +ae80d573,149b204c,0.0,1.0,,-1.0,1.0,-1.0,1.0,-1.0,,-1.0,,0.0,, +594a4934,c377fe22,-1.0,0.0,,-1.0,1.0,-1.0,1.0,0.0,,0.0,,0.0,0.0,-1.0 +190b1b36,f9f8098e,1.0,,-1.0,-1.0,,,-1.0,0.0,,1.0,,1.0,-1.0,0.0 +14ba4aea,d9ce6319,1.0,,,1.0,,,,,,,,0.0,0.0,-1.0 +eff712e4,6391d0ac,,,-1.0,,-1.0,0.0,1.0,-1.0,1.0,,-1.0,,-1.0,-1.0 +d84b3758,0340e918,0.0,0.0,,-1.0,0.0,0.0,1.0,0.0,-1.0,0.0,-1.0,,1.0,-1.0 +66592eb9,def6bf64,,1.0,-1.0,1.0,1.0,-1.0,0.0,0.0,0.0,-1.0,0.0,1.0,0.0,0.0 +404e1e3d,7ef2c8ee,,0.0,1.0,1.0,,,1.0,1.0,1.0,0.0,,-1.0,-1.0,1.0 +5ee7697e,ceb85c30,,-1.0,,0.0,,0.0,1.0,1.0,0.0,1.0,1.0,,-1.0,1.0 +35476b4a,a75e3451,-1.0,0.0,-1.0,-1.0,,1.0,,-1.0,,0.0,1.0,-1.0,0.0,-1.0 +99af93f0,f855052b,0.0,1.0,0.0,0.0,,0.0,1.0,1.0,0.0,,,1.0,1.0,1.0 +70e84808,de56ac61,,,0.0,-1.0,0.0,0.0,,-1.0,-1.0,,-1.0,,-1.0,0.0 +31384363,58a45da1,,0.0,,1.0,0.0,0.0,1.0,1.0,0.0,-1.0,-1.0,1.0,1.0,0.0 +abc1242c,75a00dad,,-1.0,-1.0,0.0,,0.0,-1.0,-1.0,0.0,,-1.0,,,-1.0 +982044b1,3fa33bce,,0.0,-1.0,0.0,-1.0,1.0,,,1.0,1.0,-1.0,,,0.0 +aeb32909,6e71b801,1.0,0.0,0.0,,1.0,0.0,1.0,1.0,1.0,0.0,1.0,-1.0,1.0,1.0 +39e8eb68,ea7d80f9,0.0,,-1.0,1.0,-1.0,0.0,,1.0,-1.0,1.0,-1.0,-1.0,, +5c088c08,d0875cea,-1.0,,0.0,1.0,1.0,1.0,0.0,1.0,,1.0,1.0,,1.0,0.0 +facdd6b9,54f63b56,-1.0,0.0,-1.0,-1.0,1.0,0.0,-1.0,,-1.0,-1.0,1.0,,,0.0 +c3dd3fe4,cfeaea37,-1.0,,,-1.0,1.0,-1.0,,0.0,0.0,1.0,-1.0,,,0.0 +e42ced85,352789df,1.0,,0.0,0.0,,0.0,1.0,,-1.0,1.0,,-1.0,0.0,0.0 +c80aa8dc,10b8a1ea,1.0,1.0,0.0,-1.0,1.0,1.0,,1.0,,1.0,,1.0,1.0,1.0 +0540cdff,b8ce0ecd,-1.0,-1.0,-1.0,-1.0,1.0,1.0,-1.0,,1.0,1.0,0.0,,1.0,1.0 +c6fc66e6,e48b3c2b,0.0,-1.0,,1.0,0.0,-1.0,1.0,0.0,,-1.0,0.0,,0.0,-1.0 +1b371dc2,d56d2785,1.0,0.0,,1.0,-1.0,,-1.0,,,-1.0,,1.0,1.0, +002677b2,67f3fe0b,0.0,-1.0,1.0,-1.0,,,,0.0,-1.0,-1.0,-1.0,-1.0,,1.0 +476f7556,6400dc24,-1.0,-1.0,0.0,0.0,1.0,1.0,-1.0,,,0.0,,0.0,,0.0 +9ff616cd,58ad2be3,0.0,0.0,-1.0,-1.0,,0.0,0.0,1.0,0.0,-1.0,0.0,,-1.0,1.0 +ba043006,929858f1,0.0,0.0,0.0,,1.0,1.0,-1.0,1.0,-1.0,0.0,-1.0,-1.0,1.0, diff --git a/tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv.gz b/tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv.gz new file mode 100644 index 0000000000000000000000000000000000000000..e973d69c32a539a383f3abbad388f9b0a4c22b08 GIT binary patch literal 2146 zcmV-o2%YyIiwFo-r7vFs|7~e)X=5#8cycW=E-)@IEpBCJVrg$KV{>)@gjw5;8@UmE z=U2=Jl!D@&d<-_;r$u&wd_X|5NUwtNj4`7L;=fO|MwjMA-UqeYayLa5Pn`?>{*nJv z%jw@og7?!0{n&2)eyY#>U3x#h!!PNLj<4V9*Yx}YetCU)e|QF}Ce}<^gsC5$M^5AZ>Oh!)c+n! zeHWghDbhCZ)g#JULH-Tl^MZUi-@sw}<9yjZc=>E!2x*L0URkKVW@8iHUOUL$b3DlX zejG`-*h(X-KvwTeh;;qU%kM)!;N=&D56*^40TLD6oZSx(!^4-~$6*{{C=~BP0+L(_ zQ|!F}x94Ox@ym7p4?=tNxikw}m7K^%xIa17?RJC1kBH<$)S4HROCd@~-3q4HZX+KS zm-Be2r7RJFypyr!0^J*9iB_NM{DjLH10{lJsYPlP)37eRti!z z)}|U1Rh*Kk?WTL^k>9PdgK2Oo>A>i8g&18a$5q}s#HUr`0@m|XfuRU3$j;nf1o zoY&WB|GA+^Fp)QfyhT=4DbdRL;nhI*@`#d4GQK28dFxsoVV*?4!+p1jXc3id87Mce zy$Z0J?l@Y99-)-YK39ZV(MDFbf%YfjSb*pg@v7M#^0hC*lJBC=m`E;GuI0Qx?F^?sb2 zK9g?7uo8q^nZsosiukYyLnjGJzJ?Gt!;=CdB=&2+3%;l349FcYg2Bj+jnS>Ro*_87rUo4OYO^VpVQZqq^1v#uO#$hRMWSL66VRXA_wU2RJICk2;c49)?s?bS{%#i&#fOS$BgXdYU1mg&PJU}8VsiuP8r@i_8;uQe$F7cwhrg&nt*5(Bf}~g{bsG# zB^S}?+DbE6QPm7n2$Os z`x76u$G~SKjgH?Y&vQU5!J0=A<3Z-QHa@pq@YX0`N^|7cqfXng-_xNkqShEwVeb_s zrr=rjdndWhi@W6r(xkMt#A$^ib%mIl*;!+U(pX9yxFEpszm*kV)ivBBd2)GNca99&B7G1Q=CM9C~L7~qAd zjPMshZt!4aS=?N$%lAb7;0Wk;BO=9$#ByX!!ep4%Mnzjl%&j6KRSuulbL?bsRA|aD z*O>=*!?V+foTDQLoua*GT~wo4o#=Dng}HE9X6>NG7Lc>xRI3pUJ(>->Pj)Rpk%@}8 z;m#od(4A|1TJP4pRIDFPM@g6pOk5-vaq7;n6qs4rc>{9nu93at99$k-qn)NZ8`(*) zbF9tf=FFmP4oiU@h(Z`NRaU*(wx-JFL3?Mg&X;$FvbA~_xu;9b!4}=`@+dfS!qb+s zR5lzlz2(?@4XTSnpv8&bE^NlsqHYK+Sj$?N=R>SX{Ps%|9&2D34O~&{61!knxT41z zB(&7QX!bQWBx5PbK`L=25r?6;BIP0#`y=o+A<~Ur4_yzeqTPiLV&G0RS%PMVq;sjT zz)`=kcRS53owbS>!Bvh`oO74QfDi(t8G+OImq1D+LRz zT0X=}0GUxalE$?^OTd%@6_A)i;-Cr-1Ke=AZU$O|g&OBoc4JrzJvyj~ zV?$R>$hus5Y;h1ICr;ZjHuIk(P9wxgf-7PdX0)sD?u-qU^FAwZzVVJ=UZlV2KR9|4 z5llACTgHMj++RhR2O(Q7a^|O>YRyT Date: Sun, 9 Aug 2020 12:37:07 -0400 Subject: [PATCH 09/52] script for generating random MIMIC data --- tests/gen_mimic.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/gen_mimic.sh b/tests/gen_mimic.sh index a6c7517..137de2d 100644 --- a/tests/gen_mimic.sh +++ b/tests/gen_mimic.sh @@ -1,2 +1,2 @@ -python3 gen_mimic.py 100 gen_mimic 224 224 +python3 gen_mimic.py 10 gen_mimic 224 224 From ecbf3022108fd3174bea6251f14dc70ddcd64e99 Mon Sep 17 00:00:00 2001 From: bganglia Date: Sun, 9 Aug 2020 12:38:08 -0400 Subject: [PATCH 10/52] track random MIMIC data --- tests/gen_mimic/images-224.tar | Bin 343552 -> 0 bytes .../35b3fb60-5a416c82-3dd7f2af-69d76155.jpg | Bin 920 -> 0 bytes .../7daaaff5-b5a795b7-6b038e9a-a3bee6d8.jpg | Bin 920 -> 0 bytes .../4cd8b116-2e4c7d7c-cbb019f0-9f5d21a2.jpg | Bin 920 -> 0 bytes .../7a44be54-b14b787f-1b882943-d92bed6d.jpg | Bin 920 -> 0 bytes .../6afb2b4d-e4806ac4-a34488fb-92bf282d.jpg | Bin 920 -> 0 bytes .../59d8c93d-a81a8b6f-cf4603aa-58c1bd3f.jpg} | Bin .../71f7fb51-bbb2462f-10afbcbf-2838cd29.jpg | Bin 920 -> 0 bytes .../56ce0780-04eb57fe-a4c7528e-1822f095.jpg | Bin 920 -> 0 bytes .../89aa4a05-4d9851d9-9302caef-06b28de1.jpg} | Bin .../442f9354-0359cd2c-fe44bf08-06306f8b.jpg | Bin 920 -> 0 bytes .../0afd2cf3-2d76ad25-1be75ad6-64d6cc86.jpg | Bin 920 -> 0 bytes .../7fc579fd-dffbd9d6-60eda497-66a17b26.jpg | Bin 920 -> 0 bytes .../7cdc4ba8-68b208c7-def2409a-cfce9906.jpg | Bin 920 -> 0 bytes .../3ab3a15e-710c1f1a-d9aa04c5-acd8c33a.jpg | Bin 920 -> 0 bytes .../401f9466-bc8c501c-984218a7-7ea2a46b.jpg | Bin 920 -> 0 bytes .../867a4c82-955ccc97-7eb349f9-a28ca6f5.jpg | Bin 920 -> 0 bytes .../1cdc4221-e3767c0e-4e64a24c-97da9ae8.jpg | Bin 920 -> 0 bytes .../25cc94e9-bd797896-e311d0db-7c181371.jpg | Bin 920 -> 0 bytes .../19043538-8294af9c-957be8b5-d751b65a.jpg | Bin 920 -> 0 bytes .../47928aec-7d506a45-e2defa1e-9eac22a7.jpg | Bin 920 -> 0 bytes .../16b47fc6-3651620c-ee0eae0d-a8381e72.jpg | Bin 920 -> 0 bytes .../1fed0d84-557646d8-41e6108f-063c2fca.jpg | Bin 920 -> 0 bytes .../30ab56f1-1c5c214b-b5fd256c-404b9caf.jpg | Bin 920 -> 0 bytes .../0f6f5408-9392b8fc-6332764d-c39ac00f.jpg | Bin 920 -> 0 bytes .../c1531145-8a0a811c-b9970154-b49fce3f.jpg | Bin 920 -> 0 bytes .../4345c04f-633971b1-58c93c0b-bdb3748d.jpg | Bin 920 -> 0 bytes .../d8f741cc-5a4a1760-b6d254f6-27283d44.jpg} | Bin .../c64423ec-029fb876-bfca6f94-7c728757.jpg} | Bin .../30e5efca-91634147-b3391772-4dffe153.jpg | Bin 920 -> 0 bytes .../14590a8c-d308d549-66353123-823e3602.jpg | Bin 920 -> 0 bytes .../920772aa-c204dc44-99f62611-87be5ea1.jpg | Bin 920 -> 0 bytes .../59cb4d6e-519eae74-06af42fc-5077238b.jpg | Bin 920 -> 0 bytes .../b59b8ba2-db68273a-d53bc742-f593b6c8.jpg | Bin 920 -> 0 bytes .../43d4e45b-0309b696-b38219e2-34048035.jpg | Bin 920 -> 0 bytes .../aec0415b-53d43067-de067b8f-ce37c7fb.jpg | Bin 920 -> 0 bytes .../c510a3b8-bf3c2545-602db8ef-bfb640df.jpg | Bin 920 -> 0 bytes .../d7b62118-456cc7dd-fd7aae3a-b7a99e99.jpg | Bin 920 -> 0 bytes .../02d8f4df-3a3e4445-e3c65a32-b42c67b6.jpg | Bin 920 -> 0 bytes .../1fd5e7e8-808658e6-3ec403f3-2a6a3109.jpg | Bin 920 -> 0 bytes .../6e566b28-7dc76e51-363018ce-a0fa4a08.jpg | Bin 920 -> 0 bytes .../9e39604f-fab38da7-f410426d-8451e4f6.jpg | Bin 920 -> 0 bytes .../52ba5787-46aa2906-87e9fd54-bc3fd837.jpg | Bin 920 -> 0 bytes .../ca5a3173-60338bbe-711695d0-3448d57b.jpg | Bin 920 -> 0 bytes .../f42fbdad-1e9b8d24-f815c867-75e32d5e.jpg | Bin 920 -> 0 bytes .../082da48b-e0907024-71437d4a-9e129a83.jpg | Bin 920 -> 0 bytes .../7f93a820-3501bf2f-03abd87f-6005216e.jpg | Bin 920 -> 0 bytes .../0b8dcae3-6f810969-403294ec-b12c57f7.jpg | Bin 920 -> 0 bytes .../37eb7689-401def65-adc29f03-80bfec57.jpg | Bin 920 -> 0 bytes .../35c148ac-02e88f87-31f5ad80-ddb29478.jpg | Bin 920 -> 0 bytes .../8ed429bf-3dcf34fb-2f3d28b4-022700b0.jpg} | Bin .../9de9c841-872074e1-3e9775e1-0e0e2e76.jpg | Bin 920 -> 0 bytes .../ee6c04cd-dec16416-96efd3f3-ded808e3.jpg | Bin 920 -> 0 bytes .../3f891948-b5baeab2-28d37adb-718ab4ab.jpg | Bin 920 -> 0 bytes .../015dc77d-eb10776d-36eaaca2-3f9b36c2.jpg | Bin 920 -> 0 bytes .../42ec6020-0795c6a3-ddced511-5b81073b.jpg | Bin 920 -> 0 bytes .../d6c6343b-912fd3f8-cd6b8fdf-a119373a.jpg | Bin 920 -> 0 bytes .../ea2155aa-b89d8367-227a5543-3936ba36.jpg | Bin 920 -> 0 bytes .../1f3c638a-e4844bfc-dcbbfc10-8a0cc71c.jpg} | Bin .../37cea7de-ba07488a-ca296af3-987e28d2.jpg | Bin 920 -> 0 bytes .../b96ad4a8-266f779e-6bb986ca-59fa1099.jpg | Bin 920 -> 0 bytes .../e62e681c-0b90c9f8-e5f376e7-8e39d39c.jpg | Bin 920 -> 0 bytes .../b3431893-13edbdb8-57dad111-6fb33794.jpg | Bin 920 -> 0 bytes .../87b202c5-2adf7ccd-7e02ece7-4a0db5d9.jpg | Bin 920 -> 0 bytes .../07390b5c-3acbd27b-4cddcc37-19b562f5.jpg | Bin 920 -> 0 bytes .../6cc5e64e-d0a5f5d4-99992264-d0233a31.jpg | Bin 920 -> 0 bytes .../5fa62f9e-86d7d8b2-3f8b233a-cf945af7.jpg | Bin 920 -> 0 bytes .../e5ce94fb-90955d5d-5c7a4c11-8db716bb.jpg} | Bin .../bd03db19-a077a18a-f5c0107f-fe07e42a.jpg | Bin 920 -> 0 bytes .../d432c2b9-a59f399d-55128859-4c40617d.jpg | Bin 920 -> 0 bytes .../af091005-ab73c5ca-d3d0a857-a1e42b43.jpg | Bin 920 -> 0 bytes .../4bf8c19d-61ed148b-5e2c854b-2a7ce889.jpg | Bin 920 -> 0 bytes .../7ff7fea4-03f4d5de-7795c3e0-6bc5ed3b.jpg | Bin 920 -> 0 bytes .../45276889-19e22b6f-1ccc4d27-3a6d80aa.jpg | Bin 920 -> 0 bytes .../4095ec1b-1bb1dd72-9d77167a-4bac4d4b.jpg | Bin 920 -> 0 bytes .../24a466e6-181d6c1c-eae92137-38c90ec9.jpg | Bin 920 -> 0 bytes .../440b9914-91df7a6d-452ccba7-f6423c89.jpg | Bin 920 -> 0 bytes .../725fda26-4d46206e-3c37e541-fea8a836.jpg} | Bin .../0dd56c04-7278308e-6356ab3a-da874d53.jpg | Bin 920 -> 0 bytes .../d5d40c5a-ca640221-3e60fb27-cae8062d.jpg | Bin 920 -> 0 bytes .../cd3cb96d-87138433-f6a7592d-a371aca7.jpg | Bin 920 -> 0 bytes .../3cc3d581-af55fcf1-376c3586-b6ba8056.jpg | Bin 920 -> 0 bytes .../ffc2d4a2-e4b44c0c-4f071491-68955982.jpg | Bin 920 -> 0 bytes .../90003c60-446b48ec-567eefdd-d10903fb.jpg | Bin 920 -> 0 bytes .../9e317590-04d4b774-944cfcaf-eeb58c6e.jpg | Bin 920 -> 0 bytes .../d693caf9-5f2b4ae2-6a6af401-21613192.jpg | Bin 920 -> 0 bytes .../2dc30e97-a2a94a74-4338318e-3619c4ae.jpg} | Bin .../aae03d7a-e16fa38c-8656b49d-9fd28376.jpg} | Bin .../bd15e9b2-53b8e4e8-750aee04-1d36b2d1.jpg | Bin 920 -> 0 bytes .../8fabbe65-06eaa11a-2dd88186-cccaeca5.jpg | Bin 920 -> 0 bytes .../09d3c8ba-4bb60535-e5222e77-4b05605c.jpg | Bin 920 -> 0 bytes .../15bb20ff-a92ea69d-1e8a7e91-4b530c77.jpg | Bin 920 -> 0 bytes .../9031473a-0cf3181c-0b1a8cc1-66d6ea9a.jpg | Bin 920 -> 0 bytes .../44fd9124-c4837570-0cd0ed5f-5bcffbe1.jpg | Bin 920 -> 0 bytes .../4490db49-8a28d6a9-e4eb6a6c-6f1854f8.jpg | Bin 920 -> 0 bytes .../1060d662-072e003c-dbf05f2e-4ccac4a5.jpg | Bin 920 -> 0 bytes .../435ce0ac-4d95e7c1-34a4fb28-e6f7c9e9.jpg | Bin 920 -> 0 bytes .../039fe911-344eab62-7f300b59-684f2fae.jpg | Bin 920 -> 0 bytes .../e9e2b87b-3d3e9c4e-3b18d389-d8962c79.jpg | Bin 920 -> 0 bytes .../f3cf7fa3-5c7851d6-8c9edbd0-0c8c64ef.jpg | Bin 920 -> 0 bytes .../4b7b5b36-3d1f22d5-83d30f11-34fde697.jpg | Bin 920 -> 0 bytes .../be767e96-e6350ffc-5d23d270-24a7860e.jpg | Bin 920 -> 0 bytes .../dda2576c-e86e4a2d-a36bf76a-8dfd2ab0.jpg | Bin 920 -> 0 bytes .../a95606b7-c0fecf1e-ba7c6578-b6eabffd.jpg | Bin 920 -> 0 bytes .../476391d0-88c15dff-5ef15726-e295bb0a.jpg | Bin 920 -> 0 bytes .../f7667307-18823508-8a6a141b-9d78bbfe.jpg | Bin 920 -> 0 bytes .../62aef45b-e5538f95-7dc63298-c10bf6b2.jpg | Bin 920 -> 0 bytes .../1caa6f1b-08c6ea8d-44b1ceb7-54a05871.jpg | Bin 920 -> 0 bytes .../a80d59b5-8356df47-d3454d71-b6ae7aff.jpg | Bin 920 -> 0 bytes .../6b0d5ad0-197afbf6-4aaa2a2a-d039dcb4.jpg | Bin 920 -> 0 bytes .../f7c53178-f0052fa6-87febe34-c10dc291.jpg | Bin 920 -> 0 bytes .../f860214f-1edfec29-bdae07fb-fad50e3b.jpg | Bin 920 -> 0 bytes .../6bf31a1c-092e1543-5ab18d17-14257f4c.jpg | Bin 920 -> 0 bytes .../64cd73ba-ee40ca52-ba4808ca-1b99a887.jpg | Bin 920 -> 0 bytes .../6afbd207-460ce550-370a678a-08b9b9cc.jpg | Bin 920 -> 0 bytes tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv | 110 ++---------------- .../gen_mimic/mimic-cxr-2.0.0-metadata.csv.gz | Bin 3749 -> 626 bytes tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv | 110 ++---------------- tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv.gz | Bin 2146 -> 434 bytes 119 files changed, 20 insertions(+), 200 deletions(-) delete mode 100644 tests/gen_mimic/images-224/files/p19/p19b04cf4/s2cbc6bad/35b3fb60-5a416c82-3dd7f2af-69d76155.jpg delete mode 100644 tests/gen_mimic/images-224/files/p1a/p1ad1b133/s682da748/7daaaff5-b5a795b7-6b038e9a-a3bee6d8.jpg delete mode 100644 tests/gen_mimic/images-224/files/p1b/p1b371dc2/sd56d2785/4cd8b116-2e4c7d7c-cbb019f0-9f5d21a2.jpg delete mode 100644 tests/gen_mimic/images-224/files/p1c/p1c3a0fb3/s343a18ec/7a44be54-b14b787f-1b882943-d92bed6d.jpg delete mode 100644 tests/gen_mimic/images-224/files/p1f/p1f50e4a4/sc64d1ec6/6afb2b4d-e4806ac4-a34488fb-92bf282d.jpg rename tests/gen_mimic/images-224/files/{p00/p002677b2/s67f3fe0b/02d9dd68-7c42e9bb-c2c45394-53a325e3.jpg => p20/p20b295ad/s1427bd21/59d8c93d-a81a8b6f-cf4603aa-58c1bd3f.jpg} (100%) delete mode 100644 tests/gen_mimic/images-224/files/p22/p2252ddd1/s87842c63/71f7fb51-bbb2462f-10afbcbf-2838cd29.jpg delete mode 100644 tests/gen_mimic/images-224/files/p22/p225b7be0/see059b45/56ce0780-04eb57fe-a4c7528e-1822f095.jpg rename tests/gen_mimic/images-224/files/{p03/p035c7641/s1d793a25/33093b96-ae905e2e-3714c3cc-45536dab.jpg => p24/p24e3a4bb/s06eea572/89aa4a05-4d9851d9-9302caef-06b28de1.jpg} (100%) delete mode 100644 tests/gen_mimic/images-224/files/p24/p24e712ca/s9ff4490f/442f9354-0359cd2c-fe44bf08-06306f8b.jpg delete mode 100644 tests/gen_mimic/images-224/files/p28/p28407bd8/s776a9732/0afd2cf3-2d76ad25-1be75ad6-64d6cc86.jpg delete mode 100644 tests/gen_mimic/images-224/files/p29/p2999546b/s656d4c67/7fc579fd-dffbd9d6-60eda497-66a17b26.jpg delete mode 100644 tests/gen_mimic/images-224/files/p2a/p2a516454/s7edb140a/7cdc4ba8-68b208c7-def2409a-cfce9906.jpg delete mode 100644 tests/gen_mimic/images-224/files/p2a/p2a8cbe9c/sde422f0a/3ab3a15e-710c1f1a-d9aa04c5-acd8c33a.jpg delete mode 100644 tests/gen_mimic/images-224/files/p2a/p2ad837bf/s8ecf5b71/401f9466-bc8c501c-984218a7-7ea2a46b.jpg delete mode 100644 tests/gen_mimic/images-224/files/p2c/p2c0aea2d/s7edf4838/867a4c82-955ccc97-7eb349f9-a28ca6f5.jpg delete mode 100644 tests/gen_mimic/images-224/files/p2d/p2d687542/sedf6d60a/1cdc4221-e3767c0e-4e64a24c-97da9ae8.jpg delete mode 100644 tests/gen_mimic/images-224/files/p31/p31384363/s58a45da1/25cc94e9-bd797896-e311d0db-7c181371.jpg delete mode 100644 tests/gen_mimic/images-224/files/p35/p35476b4a/sa75e3451/19043538-8294af9c-957be8b5-d751b65a.jpg delete mode 100644 tests/gen_mimic/images-224/files/p35/p357210e4/s1b794d99/47928aec-7d506a45-e2defa1e-9eac22a7.jpg delete mode 100644 tests/gen_mimic/images-224/files/p35/p35e20610/scb1a83df/16b47fc6-3651620c-ee0eae0d-a8381e72.jpg delete mode 100644 tests/gen_mimic/images-224/files/p37/p3707bcf5/s32cbad59/1fed0d84-557646d8-41e6108f-063c2fca.jpg delete mode 100644 tests/gen_mimic/images-224/files/p39/p39e8eb68/sea7d80f9/30ab56f1-1c5c214b-b5fd256c-404b9caf.jpg delete mode 100644 tests/gen_mimic/images-224/files/p3b/p3bd01425/s66ba470d/0f6f5408-9392b8fc-6332764d-c39ac00f.jpg delete mode 100644 tests/gen_mimic/images-224/files/p3d/p3d619352/sbd9f518f/c1531145-8a0a811c-b9970154-b49fce3f.jpg delete mode 100644 tests/gen_mimic/images-224/files/p40/p404e1e3d/s7ef2c8ee/4345c04f-633971b1-58c93c0b-bdb3748d.jpg rename tests/gen_mimic/images-224/files/{p05/p0540cdff/sb8ce0ecd/722678b5-671357c9-aaae7d33-f8862161.jpg => p41/p41cf86ae/s5beae017/d8f741cc-5a4a1760-b6d254f6-27283d44.jpg} (100%) rename tests/gen_mimic/images-224/files/{p05/p0544f306/s14e3e8bd/452df9cf-1cbb6b5e-d8639a1e-a08d32e3.jpg => p46/p467a0f6a/sbf161f1c/c64423ec-029fb876-bfca6f94-7c728757.jpg} (100%) delete mode 100644 tests/gen_mimic/images-224/files/p47/p476f7556/s6400dc24/30e5efca-91634147-b3391772-4dffe153.jpg delete mode 100644 tests/gen_mimic/images-224/files/p48/p4800527c/s521977e7/14590a8c-d308d549-66353123-823e3602.jpg delete mode 100644 tests/gen_mimic/images-224/files/p4d/p4d702ac9/sd78068ee/920772aa-c204dc44-99f62611-87be5ea1.jpg delete mode 100644 tests/gen_mimic/images-224/files/p4d/p4d8c768a/sd194c4c5/59cb4d6e-519eae74-06af42fc-5077238b.jpg delete mode 100644 tests/gen_mimic/images-224/files/p4f/p4fd10475/s9f58d7ca/b59b8ba2-db68273a-d53bc742-f593b6c8.jpg delete mode 100644 tests/gen_mimic/images-224/files/p51/p51df2e95/sfca58ce6/43d4e45b-0309b696-b38219e2-34048035.jpg delete mode 100644 tests/gen_mimic/images-224/files/p52/p52fa97c0/s0b31040c/aec0415b-53d43067-de067b8f-ce37c7fb.jpg delete mode 100644 tests/gen_mimic/images-224/files/p59/p594a4934/sc377fe22/c510a3b8-bf3c2545-602db8ef-bfb640df.jpg delete mode 100644 tests/gen_mimic/images-224/files/p5c/p5c088c08/sd0875cea/d7b62118-456cc7dd-fd7aae3a-b7a99e99.jpg delete mode 100644 tests/gen_mimic/images-224/files/p5c/p5c61a0c7/s452981c6/02d8f4df-3a3e4445-e3c65a32-b42c67b6.jpg delete mode 100644 tests/gen_mimic/images-224/files/p5e/p5ee7697e/sceb85c30/1fd5e7e8-808658e6-3ec403f3-2a6a3109.jpg delete mode 100644 tests/gen_mimic/images-224/files/p5f/p5fe54996/s06e771a6/6e566b28-7dc76e51-363018ce-a0fa4a08.jpg delete mode 100644 tests/gen_mimic/images-224/files/p60/p605764b5/s266b8861/9e39604f-fab38da7-f410426d-8451e4f6.jpg delete mode 100644 tests/gen_mimic/images-224/files/p62/p62149c26/s14b34c50/52ba5787-46aa2906-87e9fd54-bc3fd837.jpg delete mode 100644 tests/gen_mimic/images-224/files/p66/p66592eb9/sdef6bf64/ca5a3173-60338bbe-711695d0-3448d57b.jpg delete mode 100644 tests/gen_mimic/images-224/files/p67/p6730eec6/sd00adbb3/f42fbdad-1e9b8d24-f815c867-75e32d5e.jpg delete mode 100644 tests/gen_mimic/images-224/files/p67/p67d4a7c2/sbb9d1b94/082da48b-e0907024-71437d4a-9e129a83.jpg delete mode 100644 tests/gen_mimic/images-224/files/p69/p69fcfd52/s1e76489d/7f93a820-3501bf2f-03abd87f-6005216e.jpg delete mode 100644 tests/gen_mimic/images-224/files/p6b/p6bb08dad/s95df9dfe/0b8dcae3-6f810969-403294ec-b12c57f7.jpg delete mode 100644 tests/gen_mimic/images-224/files/p70/p70e84808/sde56ac61/37eb7689-401def65-adc29f03-80bfec57.jpg delete mode 100644 tests/gen_mimic/images-224/files/p72/p727889bf/sbeb95018/35c148ac-02e88f87-31f5ad80-ddb29478.jpg rename tests/gen_mimic/images-224/files/{p07/p07ea4113/s4a7a73de/408d770a-8163a0db-e6484216-c9f8814e.jpg => p75/p758d8d65/s47afa62f/8ed429bf-3dcf34fb-2f3d28b4-022700b0.jpg} (100%) delete mode 100644 tests/gen_mimic/images-224/files/p78/p78658ed8/sadc3f650/9de9c841-872074e1-3e9775e1-0e0e2e76.jpg delete mode 100644 tests/gen_mimic/images-224/files/p79/p7965c7d7/sfc00c854/ee6c04cd-dec16416-96efd3f3-ded808e3.jpg delete mode 100644 tests/gen_mimic/images-224/files/p7d/p7d94c15f/s7e7001ee/3f891948-b5baeab2-28d37adb-718ab4ab.jpg delete mode 100644 tests/gen_mimic/images-224/files/p80/p80ba1f4c/se12fa3f6/015dc77d-eb10776d-36eaaca2-3f9b36c2.jpg delete mode 100644 tests/gen_mimic/images-224/files/p81/p81355df1/s50d4986b/42ec6020-0795c6a3-ddced511-5b81073b.jpg delete mode 100644 tests/gen_mimic/images-224/files/p82/p8231bf4b/sbc5aa79f/d6c6343b-912fd3f8-cd6b8fdf-a119373a.jpg delete mode 100644 tests/gen_mimic/images-224/files/p86/p862a380d/s6cdc9063/ea2155aa-b89d8367-227a5543-3936ba36.jpg rename tests/gen_mimic/images-224/files/{p0c/p0c3143cb/s08efbd2f/8dc7085c-f637862e-f65ca63b-65ad4799.jpg => p8e/p8ebfeda5/s70705588/1f3c638a-e4844bfc-dcbbfc10-8a0cc71c.jpg} (100%) delete mode 100644 tests/gen_mimic/images-224/files/p93/p936623db/sb93b8e79/37cea7de-ba07488a-ca296af3-987e28d2.jpg delete mode 100644 tests/gen_mimic/images-224/files/p95/p950025fb/sdbf73728/b96ad4a8-266f779e-6bb986ca-59fa1099.jpg delete mode 100644 tests/gen_mimic/images-224/files/p98/p982044b1/s3fa33bce/e62e681c-0b90c9f8-e5f376e7-8e39d39c.jpg delete mode 100644 tests/gen_mimic/images-224/files/p99/p99af93f0/sf855052b/b3431893-13edbdb8-57dad111-6fb33794.jpg delete mode 100644 tests/gen_mimic/images-224/files/p9b/p9b0c5003/s3190176a/87b202c5-2adf7ccd-7e02ece7-4a0db5d9.jpg delete mode 100644 tests/gen_mimic/images-224/files/p9d/p9d9e0dbc/s54a0a4bf/07390b5c-3acbd27b-4cddcc37-19b562f5.jpg delete mode 100644 tests/gen_mimic/images-224/files/p9f/p9ff616cd/s58ad2be3/6cc5e64e-d0a5f5d4-99992264-d0233a31.jpg delete mode 100644 tests/gen_mimic/images-224/files/pa0/pa0311c90/sd7619ebc/5fa62f9e-86d7d8b2-3f8b233a-cf945af7.jpg rename tests/gen_mimic/images-224/files/{p11/p1179de34/s9aec6f8d/a4bf5ac8-79606789-3d99f752-d2a888c3.jpg => pa7/pa70cb8db/s07eacc76/e5ce94fb-90955d5d-5c7a4c11-8db716bb.jpg} (100%) delete mode 100644 tests/gen_mimic/images-224/files/pa7/pa78933d8/sbccdda0d/bd03db19-a077a18a-f5c0107f-fe07e42a.jpg delete mode 100644 tests/gen_mimic/images-224/files/pab/pabc1242c/s75a00dad/d432c2b9-a59f399d-55128859-4c40617d.jpg delete mode 100644 tests/gen_mimic/images-224/files/pae/pae80d573/s149b204c/af091005-ab73c5ca-d3d0a857-a1e42b43.jpg delete mode 100644 tests/gen_mimic/images-224/files/pae/paeb32909/s6e71b801/4bf8c19d-61ed148b-5e2c854b-2a7ce889.jpg delete mode 100644 tests/gen_mimic/images-224/files/pb1/pb1668a60/s9dfe2ebc/7ff7fea4-03f4d5de-7795c3e0-6bc5ed3b.jpg delete mode 100644 tests/gen_mimic/images-224/files/pb8/pb8a4585d/s23601ba5/45276889-19e22b6f-1ccc4d27-3a6d80aa.jpg delete mode 100644 tests/gen_mimic/images-224/files/pba/pba043006/s929858f1/4095ec1b-1bb1dd72-9d77167a-4bac4d4b.jpg delete mode 100644 tests/gen_mimic/images-224/files/pba/pba821bdf/seb52f69c/24a466e6-181d6c1c-eae92137-38c90ec9.jpg delete mode 100644 tests/gen_mimic/images-224/files/pbd/pbd3f44cd/s8be7a71b/440b9914-91df7a6d-452ccba7-f6423c89.jpg rename tests/gen_mimic/images-224/files/{p14/p14472725/se7eb45a0/6366f5b8-60cda42d-d02a2489-1f9cc9b0.jpg => pbd/pbd6f6445/se3b296ad/725fda26-4d46206e-3c37e541-fea8a836.jpg} (100%) delete mode 100644 tests/gen_mimic/images-224/files/pbe/pbeb1dbc3/s5d9243aa/0dd56c04-7278308e-6356ab3a-da874d53.jpg delete mode 100644 tests/gen_mimic/images-224/files/pc0/pc00d78b9/sa0798258/d5d40c5a-ca640221-3e60fb27-cae8062d.jpg delete mode 100644 tests/gen_mimic/images-224/files/pc3/pc3dd3fe4/scfeaea37/cd3cb96d-87138433-f6a7592d-a371aca7.jpg delete mode 100644 tests/gen_mimic/images-224/files/pc6/pc6fc66e6/se48b3c2b/3cc3d581-af55fcf1-376c3586-b6ba8056.jpg delete mode 100644 tests/gen_mimic/images-224/files/pc8/pc80aa8dc/s10b8a1ea/ffc2d4a2-e4b44c0c-4f071491-68955982.jpg delete mode 100644 tests/gen_mimic/images-224/files/pca/pca849ba9/s3c52fb1f/90003c60-446b48ec-567eefdd-d10903fb.jpg delete mode 100644 tests/gen_mimic/images-224/files/pcb/pcbca47ca/sab7e1939/9e317590-04d4b774-944cfcaf-eeb58c6e.jpg delete mode 100644 tests/gen_mimic/images-224/files/pcd/pcd308688/s9e344fd3/d693caf9-5f2b4ae2-6a6af401-21613192.jpg rename tests/gen_mimic/images-224/files/{p14/p14ba4aea/sd9ce6319/7a73e2e1-7964ea55-77bf4a43-92742356.jpg => pcd/pcd435694/s60638bce/2dc30e97-a2a94a74-4338318e-3619c4ae.jpg} (100%) rename tests/gen_mimic/images-224/files/{p19/p190b1b36/sf9f8098e/84a4a199-0e968dcf-21256899-eb7e053e.jpg => pce/pce5242a2/s10b21223/aae03d7a-e16fa38c-8656b49d-9fd28376.jpg} (100%) delete mode 100644 tests/gen_mimic/images-224/files/pce/pce8f7db8/s5e9a74fe/bd15e9b2-53b8e4e8-750aee04-1d36b2d1.jpg delete mode 100644 tests/gen_mimic/images-224/files/pcf/pcfdf2004/s51e11051/8fabbe65-06eaa11a-2dd88186-cccaeca5.jpg delete mode 100644 tests/gen_mimic/images-224/files/pd2/pd2e9ef2f/sc2c621af/09d3c8ba-4bb60535-e5222e77-4b05605c.jpg delete mode 100644 tests/gen_mimic/images-224/files/pd3/pd3d2355d/s4a11c4c5/15bb20ff-a92ea69d-1e8a7e91-4b530c77.jpg delete mode 100644 tests/gen_mimic/images-224/files/pd5/pd508e74c/s06953799/9031473a-0cf3181c-0b1a8cc1-66d6ea9a.jpg delete mode 100644 tests/gen_mimic/images-224/files/pd8/pd84b3758/s0340e918/44fd9124-c4837570-0cd0ed5f-5bcffbe1.jpg delete mode 100644 tests/gen_mimic/images-224/files/pda/pda7e8892/s1ea8f2f9/4490db49-8a28d6a9-e4eb6a6c-6f1854f8.jpg delete mode 100644 tests/gen_mimic/images-224/files/pdc/pdc84998c/se57581c8/1060d662-072e003c-dbf05f2e-4ccac4a5.jpg delete mode 100644 tests/gen_mimic/images-224/files/pe4/pe42ced85/s352789df/435ce0ac-4d95e7c1-34a4fb28-e6f7c9e9.jpg delete mode 100644 tests/gen_mimic/images-224/files/pe7/pe79ec2f1/scce2cf67/039fe911-344eab62-7f300b59-684f2fae.jpg delete mode 100644 tests/gen_mimic/images-224/files/pe8/pe89a550a/sd213798d/e9e2b87b-3d3e9c4e-3b18d389-d8962c79.jpg delete mode 100644 tests/gen_mimic/images-224/files/pea/pea77727e/sd5a7486e/f3cf7fa3-5c7851d6-8c9edbd0-0c8c64ef.jpg delete mode 100644 tests/gen_mimic/images-224/files/pec/pec45c8d4/s6cc1992c/4b7b5b36-3d1f22d5-83d30f11-34fde697.jpg delete mode 100644 tests/gen_mimic/images-224/files/pec/pec98e654/sa3457d67/be767e96-e6350ffc-5d23d270-24a7860e.jpg delete mode 100644 tests/gen_mimic/images-224/files/pee/pee99ac51/s910a87f1/dda2576c-e86e4a2d-a36bf76a-8dfd2ab0.jpg delete mode 100644 tests/gen_mimic/images-224/files/pef/peff712e4/s6391d0ac/a95606b7-c0fecf1e-ba7c6578-b6eabffd.jpg delete mode 100644 tests/gen_mimic/images-224/files/pf0/pf0736b23/s80147605/476391d0-88c15dff-5ef15726-e295bb0a.jpg delete mode 100644 tests/gen_mimic/images-224/files/pf0/pf0b67e19/s5f14d7e7/f7667307-18823508-8a6a141b-9d78bbfe.jpg delete mode 100644 tests/gen_mimic/images-224/files/pf2/pf22f3c19/s4ab7695f/62aef45b-e5538f95-7dc63298-c10bf6b2.jpg delete mode 100644 tests/gen_mimic/images-224/files/pf2/pf2f591b5/sdfe4d498/1caa6f1b-08c6ea8d-44b1ceb7-54a05871.jpg delete mode 100644 tests/gen_mimic/images-224/files/pf6/pf643ee65/s11007cfc/a80d59b5-8356df47-d3454d71-b6ae7aff.jpg delete mode 100644 tests/gen_mimic/images-224/files/pf6/pf6eb7535/s6a9161f8/6b0d5ad0-197afbf6-4aaa2a2a-d039dcb4.jpg delete mode 100644 tests/gen_mimic/images-224/files/pf9/pf99b70cd/sdcd8dcdf/f7c53178-f0052fa6-87febe34-c10dc291.jpg delete mode 100644 tests/gen_mimic/images-224/files/pfa/pfacdd6b9/s54f63b56/f860214f-1edfec29-bdae07fb-fad50e3b.jpg delete mode 100644 tests/gen_mimic/images-224/files/pfd/pfd072d66/sab1d747c/6bf31a1c-092e1543-5ab18d17-14257f4c.jpg delete mode 100644 tests/gen_mimic/images-224/files/pfd/pfd1f37df/s72634032/64cd73ba-ee40ca52-ba4808ca-1b99a887.jpg delete mode 100644 tests/gen_mimic/images-224/files/pff/pffe42d04/s7c56bb93/6afbd207-460ce550-370a678a-08b9b9cc.jpg diff --git a/tests/gen_mimic/images-224.tar b/tests/gen_mimic/images-224.tar index 0ef9185e928487371439c8055671ff9c01ef0c7d..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 343552 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 diff --git a/tests/gen_mimic/images-224/files/p19/p19b04cf4/s2cbc6bad/35b3fb60-5a416c82-3dd7f2af-69d76155.jpg b/tests/gen_mimic/images-224/files/p19/p19b04cf4/s2cbc6bad/35b3fb60-5a416c82-3dd7f2af-69d76155.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p1a/p1ad1b133/s682da748/7daaaff5-b5a795b7-6b038e9a-a3bee6d8.jpg b/tests/gen_mimic/images-224/files/p1a/p1ad1b133/s682da748/7daaaff5-b5a795b7-6b038e9a-a3bee6d8.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p1b/p1b371dc2/sd56d2785/4cd8b116-2e4c7d7c-cbb019f0-9f5d21a2.jpg b/tests/gen_mimic/images-224/files/p1b/p1b371dc2/sd56d2785/4cd8b116-2e4c7d7c-cbb019f0-9f5d21a2.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p1c/p1c3a0fb3/s343a18ec/7a44be54-b14b787f-1b882943-d92bed6d.jpg b/tests/gen_mimic/images-224/files/p1c/p1c3a0fb3/s343a18ec/7a44be54-b14b787f-1b882943-d92bed6d.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p1f/p1f50e4a4/sc64d1ec6/6afb2b4d-e4806ac4-a34488fb-92bf282d.jpg b/tests/gen_mimic/images-224/files/p1f/p1f50e4a4/sc64d1ec6/6afb2b4d-e4806ac4-a34488fb-92bf282d.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p00/p002677b2/s67f3fe0b/02d9dd68-7c42e9bb-c2c45394-53a325e3.jpg b/tests/gen_mimic/images-224/files/p20/p20b295ad/s1427bd21/59d8c93d-a81a8b6f-cf4603aa-58c1bd3f.jpg similarity index 100% rename from tests/gen_mimic/images-224/files/p00/p002677b2/s67f3fe0b/02d9dd68-7c42e9bb-c2c45394-53a325e3.jpg rename to tests/gen_mimic/images-224/files/p20/p20b295ad/s1427bd21/59d8c93d-a81a8b6f-cf4603aa-58c1bd3f.jpg diff --git a/tests/gen_mimic/images-224/files/p22/p2252ddd1/s87842c63/71f7fb51-bbb2462f-10afbcbf-2838cd29.jpg b/tests/gen_mimic/images-224/files/p22/p2252ddd1/s87842c63/71f7fb51-bbb2462f-10afbcbf-2838cd29.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p22/p225b7be0/see059b45/56ce0780-04eb57fe-a4c7528e-1822f095.jpg b/tests/gen_mimic/images-224/files/p22/p225b7be0/see059b45/56ce0780-04eb57fe-a4c7528e-1822f095.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p03/p035c7641/s1d793a25/33093b96-ae905e2e-3714c3cc-45536dab.jpg b/tests/gen_mimic/images-224/files/p24/p24e3a4bb/s06eea572/89aa4a05-4d9851d9-9302caef-06b28de1.jpg similarity index 100% rename from tests/gen_mimic/images-224/files/p03/p035c7641/s1d793a25/33093b96-ae905e2e-3714c3cc-45536dab.jpg rename to tests/gen_mimic/images-224/files/p24/p24e3a4bb/s06eea572/89aa4a05-4d9851d9-9302caef-06b28de1.jpg diff --git a/tests/gen_mimic/images-224/files/p24/p24e712ca/s9ff4490f/442f9354-0359cd2c-fe44bf08-06306f8b.jpg b/tests/gen_mimic/images-224/files/p24/p24e712ca/s9ff4490f/442f9354-0359cd2c-fe44bf08-06306f8b.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p28/p28407bd8/s776a9732/0afd2cf3-2d76ad25-1be75ad6-64d6cc86.jpg b/tests/gen_mimic/images-224/files/p28/p28407bd8/s776a9732/0afd2cf3-2d76ad25-1be75ad6-64d6cc86.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p29/p2999546b/s656d4c67/7fc579fd-dffbd9d6-60eda497-66a17b26.jpg b/tests/gen_mimic/images-224/files/p29/p2999546b/s656d4c67/7fc579fd-dffbd9d6-60eda497-66a17b26.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p2a/p2a516454/s7edb140a/7cdc4ba8-68b208c7-def2409a-cfce9906.jpg b/tests/gen_mimic/images-224/files/p2a/p2a516454/s7edb140a/7cdc4ba8-68b208c7-def2409a-cfce9906.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p2a/p2a8cbe9c/sde422f0a/3ab3a15e-710c1f1a-d9aa04c5-acd8c33a.jpg b/tests/gen_mimic/images-224/files/p2a/p2a8cbe9c/sde422f0a/3ab3a15e-710c1f1a-d9aa04c5-acd8c33a.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p2a/p2ad837bf/s8ecf5b71/401f9466-bc8c501c-984218a7-7ea2a46b.jpg b/tests/gen_mimic/images-224/files/p2a/p2ad837bf/s8ecf5b71/401f9466-bc8c501c-984218a7-7ea2a46b.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p2c/p2c0aea2d/s7edf4838/867a4c82-955ccc97-7eb349f9-a28ca6f5.jpg b/tests/gen_mimic/images-224/files/p2c/p2c0aea2d/s7edf4838/867a4c82-955ccc97-7eb349f9-a28ca6f5.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p2d/p2d687542/sedf6d60a/1cdc4221-e3767c0e-4e64a24c-97da9ae8.jpg b/tests/gen_mimic/images-224/files/p2d/p2d687542/sedf6d60a/1cdc4221-e3767c0e-4e64a24c-97da9ae8.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p31/p31384363/s58a45da1/25cc94e9-bd797896-e311d0db-7c181371.jpg b/tests/gen_mimic/images-224/files/p31/p31384363/s58a45da1/25cc94e9-bd797896-e311d0db-7c181371.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p35/p35476b4a/sa75e3451/19043538-8294af9c-957be8b5-d751b65a.jpg b/tests/gen_mimic/images-224/files/p35/p35476b4a/sa75e3451/19043538-8294af9c-957be8b5-d751b65a.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p35/p357210e4/s1b794d99/47928aec-7d506a45-e2defa1e-9eac22a7.jpg b/tests/gen_mimic/images-224/files/p35/p357210e4/s1b794d99/47928aec-7d506a45-e2defa1e-9eac22a7.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p35/p35e20610/scb1a83df/16b47fc6-3651620c-ee0eae0d-a8381e72.jpg b/tests/gen_mimic/images-224/files/p35/p35e20610/scb1a83df/16b47fc6-3651620c-ee0eae0d-a8381e72.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p37/p3707bcf5/s32cbad59/1fed0d84-557646d8-41e6108f-063c2fca.jpg b/tests/gen_mimic/images-224/files/p37/p3707bcf5/s32cbad59/1fed0d84-557646d8-41e6108f-063c2fca.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p39/p39e8eb68/sea7d80f9/30ab56f1-1c5c214b-b5fd256c-404b9caf.jpg b/tests/gen_mimic/images-224/files/p39/p39e8eb68/sea7d80f9/30ab56f1-1c5c214b-b5fd256c-404b9caf.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p3b/p3bd01425/s66ba470d/0f6f5408-9392b8fc-6332764d-c39ac00f.jpg b/tests/gen_mimic/images-224/files/p3b/p3bd01425/s66ba470d/0f6f5408-9392b8fc-6332764d-c39ac00f.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p3d/p3d619352/sbd9f518f/c1531145-8a0a811c-b9970154-b49fce3f.jpg b/tests/gen_mimic/images-224/files/p3d/p3d619352/sbd9f518f/c1531145-8a0a811c-b9970154-b49fce3f.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p40/p404e1e3d/s7ef2c8ee/4345c04f-633971b1-58c93c0b-bdb3748d.jpg b/tests/gen_mimic/images-224/files/p40/p404e1e3d/s7ef2c8ee/4345c04f-633971b1-58c93c0b-bdb3748d.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p05/p0540cdff/sb8ce0ecd/722678b5-671357c9-aaae7d33-f8862161.jpg b/tests/gen_mimic/images-224/files/p41/p41cf86ae/s5beae017/d8f741cc-5a4a1760-b6d254f6-27283d44.jpg similarity index 100% rename from tests/gen_mimic/images-224/files/p05/p0540cdff/sb8ce0ecd/722678b5-671357c9-aaae7d33-f8862161.jpg rename to tests/gen_mimic/images-224/files/p41/p41cf86ae/s5beae017/d8f741cc-5a4a1760-b6d254f6-27283d44.jpg diff --git a/tests/gen_mimic/images-224/files/p05/p0544f306/s14e3e8bd/452df9cf-1cbb6b5e-d8639a1e-a08d32e3.jpg b/tests/gen_mimic/images-224/files/p46/p467a0f6a/sbf161f1c/c64423ec-029fb876-bfca6f94-7c728757.jpg similarity index 100% rename from tests/gen_mimic/images-224/files/p05/p0544f306/s14e3e8bd/452df9cf-1cbb6b5e-d8639a1e-a08d32e3.jpg rename to tests/gen_mimic/images-224/files/p46/p467a0f6a/sbf161f1c/c64423ec-029fb876-bfca6f94-7c728757.jpg diff --git a/tests/gen_mimic/images-224/files/p47/p476f7556/s6400dc24/30e5efca-91634147-b3391772-4dffe153.jpg b/tests/gen_mimic/images-224/files/p47/p476f7556/s6400dc24/30e5efca-91634147-b3391772-4dffe153.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p48/p4800527c/s521977e7/14590a8c-d308d549-66353123-823e3602.jpg b/tests/gen_mimic/images-224/files/p48/p4800527c/s521977e7/14590a8c-d308d549-66353123-823e3602.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p4d/p4d702ac9/sd78068ee/920772aa-c204dc44-99f62611-87be5ea1.jpg b/tests/gen_mimic/images-224/files/p4d/p4d702ac9/sd78068ee/920772aa-c204dc44-99f62611-87be5ea1.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p4d/p4d8c768a/sd194c4c5/59cb4d6e-519eae74-06af42fc-5077238b.jpg b/tests/gen_mimic/images-224/files/p4d/p4d8c768a/sd194c4c5/59cb4d6e-519eae74-06af42fc-5077238b.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p4f/p4fd10475/s9f58d7ca/b59b8ba2-db68273a-d53bc742-f593b6c8.jpg b/tests/gen_mimic/images-224/files/p4f/p4fd10475/s9f58d7ca/b59b8ba2-db68273a-d53bc742-f593b6c8.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p51/p51df2e95/sfca58ce6/43d4e45b-0309b696-b38219e2-34048035.jpg b/tests/gen_mimic/images-224/files/p51/p51df2e95/sfca58ce6/43d4e45b-0309b696-b38219e2-34048035.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p52/p52fa97c0/s0b31040c/aec0415b-53d43067-de067b8f-ce37c7fb.jpg b/tests/gen_mimic/images-224/files/p52/p52fa97c0/s0b31040c/aec0415b-53d43067-de067b8f-ce37c7fb.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p59/p594a4934/sc377fe22/c510a3b8-bf3c2545-602db8ef-bfb640df.jpg b/tests/gen_mimic/images-224/files/p59/p594a4934/sc377fe22/c510a3b8-bf3c2545-602db8ef-bfb640df.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p5c/p5c088c08/sd0875cea/d7b62118-456cc7dd-fd7aae3a-b7a99e99.jpg b/tests/gen_mimic/images-224/files/p5c/p5c088c08/sd0875cea/d7b62118-456cc7dd-fd7aae3a-b7a99e99.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p5c/p5c61a0c7/s452981c6/02d8f4df-3a3e4445-e3c65a32-b42c67b6.jpg b/tests/gen_mimic/images-224/files/p5c/p5c61a0c7/s452981c6/02d8f4df-3a3e4445-e3c65a32-b42c67b6.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p5e/p5ee7697e/sceb85c30/1fd5e7e8-808658e6-3ec403f3-2a6a3109.jpg b/tests/gen_mimic/images-224/files/p5e/p5ee7697e/sceb85c30/1fd5e7e8-808658e6-3ec403f3-2a6a3109.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p5f/p5fe54996/s06e771a6/6e566b28-7dc76e51-363018ce-a0fa4a08.jpg b/tests/gen_mimic/images-224/files/p5f/p5fe54996/s06e771a6/6e566b28-7dc76e51-363018ce-a0fa4a08.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p60/p605764b5/s266b8861/9e39604f-fab38da7-f410426d-8451e4f6.jpg b/tests/gen_mimic/images-224/files/p60/p605764b5/s266b8861/9e39604f-fab38da7-f410426d-8451e4f6.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p62/p62149c26/s14b34c50/52ba5787-46aa2906-87e9fd54-bc3fd837.jpg b/tests/gen_mimic/images-224/files/p62/p62149c26/s14b34c50/52ba5787-46aa2906-87e9fd54-bc3fd837.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p66/p66592eb9/sdef6bf64/ca5a3173-60338bbe-711695d0-3448d57b.jpg b/tests/gen_mimic/images-224/files/p66/p66592eb9/sdef6bf64/ca5a3173-60338bbe-711695d0-3448d57b.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p67/p6730eec6/sd00adbb3/f42fbdad-1e9b8d24-f815c867-75e32d5e.jpg b/tests/gen_mimic/images-224/files/p67/p6730eec6/sd00adbb3/f42fbdad-1e9b8d24-f815c867-75e32d5e.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p67/p67d4a7c2/sbb9d1b94/082da48b-e0907024-71437d4a-9e129a83.jpg b/tests/gen_mimic/images-224/files/p67/p67d4a7c2/sbb9d1b94/082da48b-e0907024-71437d4a-9e129a83.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p69/p69fcfd52/s1e76489d/7f93a820-3501bf2f-03abd87f-6005216e.jpg b/tests/gen_mimic/images-224/files/p69/p69fcfd52/s1e76489d/7f93a820-3501bf2f-03abd87f-6005216e.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p6b/p6bb08dad/s95df9dfe/0b8dcae3-6f810969-403294ec-b12c57f7.jpg b/tests/gen_mimic/images-224/files/p6b/p6bb08dad/s95df9dfe/0b8dcae3-6f810969-403294ec-b12c57f7.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p70/p70e84808/sde56ac61/37eb7689-401def65-adc29f03-80bfec57.jpg b/tests/gen_mimic/images-224/files/p70/p70e84808/sde56ac61/37eb7689-401def65-adc29f03-80bfec57.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p72/p727889bf/sbeb95018/35c148ac-02e88f87-31f5ad80-ddb29478.jpg b/tests/gen_mimic/images-224/files/p72/p727889bf/sbeb95018/35c148ac-02e88f87-31f5ad80-ddb29478.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p07/p07ea4113/s4a7a73de/408d770a-8163a0db-e6484216-c9f8814e.jpg b/tests/gen_mimic/images-224/files/p75/p758d8d65/s47afa62f/8ed429bf-3dcf34fb-2f3d28b4-022700b0.jpg similarity index 100% rename from tests/gen_mimic/images-224/files/p07/p07ea4113/s4a7a73de/408d770a-8163a0db-e6484216-c9f8814e.jpg rename to tests/gen_mimic/images-224/files/p75/p758d8d65/s47afa62f/8ed429bf-3dcf34fb-2f3d28b4-022700b0.jpg diff --git a/tests/gen_mimic/images-224/files/p78/p78658ed8/sadc3f650/9de9c841-872074e1-3e9775e1-0e0e2e76.jpg b/tests/gen_mimic/images-224/files/p78/p78658ed8/sadc3f650/9de9c841-872074e1-3e9775e1-0e0e2e76.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p79/p7965c7d7/sfc00c854/ee6c04cd-dec16416-96efd3f3-ded808e3.jpg b/tests/gen_mimic/images-224/files/p79/p7965c7d7/sfc00c854/ee6c04cd-dec16416-96efd3f3-ded808e3.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p7d/p7d94c15f/s7e7001ee/3f891948-b5baeab2-28d37adb-718ab4ab.jpg b/tests/gen_mimic/images-224/files/p7d/p7d94c15f/s7e7001ee/3f891948-b5baeab2-28d37adb-718ab4ab.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p80/p80ba1f4c/se12fa3f6/015dc77d-eb10776d-36eaaca2-3f9b36c2.jpg b/tests/gen_mimic/images-224/files/p80/p80ba1f4c/se12fa3f6/015dc77d-eb10776d-36eaaca2-3f9b36c2.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p81/p81355df1/s50d4986b/42ec6020-0795c6a3-ddced511-5b81073b.jpg b/tests/gen_mimic/images-224/files/p81/p81355df1/s50d4986b/42ec6020-0795c6a3-ddced511-5b81073b.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p82/p8231bf4b/sbc5aa79f/d6c6343b-912fd3f8-cd6b8fdf-a119373a.jpg b/tests/gen_mimic/images-224/files/p82/p8231bf4b/sbc5aa79f/d6c6343b-912fd3f8-cd6b8fdf-a119373a.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p86/p862a380d/s6cdc9063/ea2155aa-b89d8367-227a5543-3936ba36.jpg b/tests/gen_mimic/images-224/files/p86/p862a380d/s6cdc9063/ea2155aa-b89d8367-227a5543-3936ba36.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p0c/p0c3143cb/s08efbd2f/8dc7085c-f637862e-f65ca63b-65ad4799.jpg b/tests/gen_mimic/images-224/files/p8e/p8ebfeda5/s70705588/1f3c638a-e4844bfc-dcbbfc10-8a0cc71c.jpg similarity index 100% rename from tests/gen_mimic/images-224/files/p0c/p0c3143cb/s08efbd2f/8dc7085c-f637862e-f65ca63b-65ad4799.jpg rename to tests/gen_mimic/images-224/files/p8e/p8ebfeda5/s70705588/1f3c638a-e4844bfc-dcbbfc10-8a0cc71c.jpg diff --git a/tests/gen_mimic/images-224/files/p93/p936623db/sb93b8e79/37cea7de-ba07488a-ca296af3-987e28d2.jpg b/tests/gen_mimic/images-224/files/p93/p936623db/sb93b8e79/37cea7de-ba07488a-ca296af3-987e28d2.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p95/p950025fb/sdbf73728/b96ad4a8-266f779e-6bb986ca-59fa1099.jpg b/tests/gen_mimic/images-224/files/p95/p950025fb/sdbf73728/b96ad4a8-266f779e-6bb986ca-59fa1099.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p98/p982044b1/s3fa33bce/e62e681c-0b90c9f8-e5f376e7-8e39d39c.jpg b/tests/gen_mimic/images-224/files/p98/p982044b1/s3fa33bce/e62e681c-0b90c9f8-e5f376e7-8e39d39c.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p99/p99af93f0/sf855052b/b3431893-13edbdb8-57dad111-6fb33794.jpg b/tests/gen_mimic/images-224/files/p99/p99af93f0/sf855052b/b3431893-13edbdb8-57dad111-6fb33794.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p9b/p9b0c5003/s3190176a/87b202c5-2adf7ccd-7e02ece7-4a0db5d9.jpg b/tests/gen_mimic/images-224/files/p9b/p9b0c5003/s3190176a/87b202c5-2adf7ccd-7e02ece7-4a0db5d9.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p9d/p9d9e0dbc/s54a0a4bf/07390b5c-3acbd27b-4cddcc37-19b562f5.jpg b/tests/gen_mimic/images-224/files/p9d/p9d9e0dbc/s54a0a4bf/07390b5c-3acbd27b-4cddcc37-19b562f5.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p9f/p9ff616cd/s58ad2be3/6cc5e64e-d0a5f5d4-99992264-d0233a31.jpg b/tests/gen_mimic/images-224/files/p9f/p9ff616cd/s58ad2be3/6cc5e64e-d0a5f5d4-99992264-d0233a31.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pa0/pa0311c90/sd7619ebc/5fa62f9e-86d7d8b2-3f8b233a-cf945af7.jpg b/tests/gen_mimic/images-224/files/pa0/pa0311c90/sd7619ebc/5fa62f9e-86d7d8b2-3f8b233a-cf945af7.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p11/p1179de34/s9aec6f8d/a4bf5ac8-79606789-3d99f752-d2a888c3.jpg b/tests/gen_mimic/images-224/files/pa7/pa70cb8db/s07eacc76/e5ce94fb-90955d5d-5c7a4c11-8db716bb.jpg similarity index 100% rename from tests/gen_mimic/images-224/files/p11/p1179de34/s9aec6f8d/a4bf5ac8-79606789-3d99f752-d2a888c3.jpg rename to tests/gen_mimic/images-224/files/pa7/pa70cb8db/s07eacc76/e5ce94fb-90955d5d-5c7a4c11-8db716bb.jpg diff --git a/tests/gen_mimic/images-224/files/pa7/pa78933d8/sbccdda0d/bd03db19-a077a18a-f5c0107f-fe07e42a.jpg b/tests/gen_mimic/images-224/files/pa7/pa78933d8/sbccdda0d/bd03db19-a077a18a-f5c0107f-fe07e42a.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pab/pabc1242c/s75a00dad/d432c2b9-a59f399d-55128859-4c40617d.jpg b/tests/gen_mimic/images-224/files/pab/pabc1242c/s75a00dad/d432c2b9-a59f399d-55128859-4c40617d.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pae/pae80d573/s149b204c/af091005-ab73c5ca-d3d0a857-a1e42b43.jpg b/tests/gen_mimic/images-224/files/pae/pae80d573/s149b204c/af091005-ab73c5ca-d3d0a857-a1e42b43.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pae/paeb32909/s6e71b801/4bf8c19d-61ed148b-5e2c854b-2a7ce889.jpg b/tests/gen_mimic/images-224/files/pae/paeb32909/s6e71b801/4bf8c19d-61ed148b-5e2c854b-2a7ce889.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pb1/pb1668a60/s9dfe2ebc/7ff7fea4-03f4d5de-7795c3e0-6bc5ed3b.jpg b/tests/gen_mimic/images-224/files/pb1/pb1668a60/s9dfe2ebc/7ff7fea4-03f4d5de-7795c3e0-6bc5ed3b.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pb8/pb8a4585d/s23601ba5/45276889-19e22b6f-1ccc4d27-3a6d80aa.jpg b/tests/gen_mimic/images-224/files/pb8/pb8a4585d/s23601ba5/45276889-19e22b6f-1ccc4d27-3a6d80aa.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pba/pba043006/s929858f1/4095ec1b-1bb1dd72-9d77167a-4bac4d4b.jpg b/tests/gen_mimic/images-224/files/pba/pba043006/s929858f1/4095ec1b-1bb1dd72-9d77167a-4bac4d4b.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pba/pba821bdf/seb52f69c/24a466e6-181d6c1c-eae92137-38c90ec9.jpg b/tests/gen_mimic/images-224/files/pba/pba821bdf/seb52f69c/24a466e6-181d6c1c-eae92137-38c90ec9.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pbd/pbd3f44cd/s8be7a71b/440b9914-91df7a6d-452ccba7-f6423c89.jpg b/tests/gen_mimic/images-224/files/pbd/pbd3f44cd/s8be7a71b/440b9914-91df7a6d-452ccba7-f6423c89.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p14/p14472725/se7eb45a0/6366f5b8-60cda42d-d02a2489-1f9cc9b0.jpg b/tests/gen_mimic/images-224/files/pbd/pbd6f6445/se3b296ad/725fda26-4d46206e-3c37e541-fea8a836.jpg similarity index 100% rename from tests/gen_mimic/images-224/files/p14/p14472725/se7eb45a0/6366f5b8-60cda42d-d02a2489-1f9cc9b0.jpg rename to tests/gen_mimic/images-224/files/pbd/pbd6f6445/se3b296ad/725fda26-4d46206e-3c37e541-fea8a836.jpg diff --git a/tests/gen_mimic/images-224/files/pbe/pbeb1dbc3/s5d9243aa/0dd56c04-7278308e-6356ab3a-da874d53.jpg b/tests/gen_mimic/images-224/files/pbe/pbeb1dbc3/s5d9243aa/0dd56c04-7278308e-6356ab3a-da874d53.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pc0/pc00d78b9/sa0798258/d5d40c5a-ca640221-3e60fb27-cae8062d.jpg b/tests/gen_mimic/images-224/files/pc0/pc00d78b9/sa0798258/d5d40c5a-ca640221-3e60fb27-cae8062d.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pc3/pc3dd3fe4/scfeaea37/cd3cb96d-87138433-f6a7592d-a371aca7.jpg b/tests/gen_mimic/images-224/files/pc3/pc3dd3fe4/scfeaea37/cd3cb96d-87138433-f6a7592d-a371aca7.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pc6/pc6fc66e6/se48b3c2b/3cc3d581-af55fcf1-376c3586-b6ba8056.jpg b/tests/gen_mimic/images-224/files/pc6/pc6fc66e6/se48b3c2b/3cc3d581-af55fcf1-376c3586-b6ba8056.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pc8/pc80aa8dc/s10b8a1ea/ffc2d4a2-e4b44c0c-4f071491-68955982.jpg b/tests/gen_mimic/images-224/files/pc8/pc80aa8dc/s10b8a1ea/ffc2d4a2-e4b44c0c-4f071491-68955982.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pca/pca849ba9/s3c52fb1f/90003c60-446b48ec-567eefdd-d10903fb.jpg b/tests/gen_mimic/images-224/files/pca/pca849ba9/s3c52fb1f/90003c60-446b48ec-567eefdd-d10903fb.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pcb/pcbca47ca/sab7e1939/9e317590-04d4b774-944cfcaf-eeb58c6e.jpg b/tests/gen_mimic/images-224/files/pcb/pcbca47ca/sab7e1939/9e317590-04d4b774-944cfcaf-eeb58c6e.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pcd/pcd308688/s9e344fd3/d693caf9-5f2b4ae2-6a6af401-21613192.jpg b/tests/gen_mimic/images-224/files/pcd/pcd308688/s9e344fd3/d693caf9-5f2b4ae2-6a6af401-21613192.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p14/p14ba4aea/sd9ce6319/7a73e2e1-7964ea55-77bf4a43-92742356.jpg b/tests/gen_mimic/images-224/files/pcd/pcd435694/s60638bce/2dc30e97-a2a94a74-4338318e-3619c4ae.jpg similarity index 100% rename from tests/gen_mimic/images-224/files/p14/p14ba4aea/sd9ce6319/7a73e2e1-7964ea55-77bf4a43-92742356.jpg rename to tests/gen_mimic/images-224/files/pcd/pcd435694/s60638bce/2dc30e97-a2a94a74-4338318e-3619c4ae.jpg diff --git a/tests/gen_mimic/images-224/files/p19/p190b1b36/sf9f8098e/84a4a199-0e968dcf-21256899-eb7e053e.jpg b/tests/gen_mimic/images-224/files/pce/pce5242a2/s10b21223/aae03d7a-e16fa38c-8656b49d-9fd28376.jpg similarity index 100% rename from tests/gen_mimic/images-224/files/p19/p190b1b36/sf9f8098e/84a4a199-0e968dcf-21256899-eb7e053e.jpg rename to tests/gen_mimic/images-224/files/pce/pce5242a2/s10b21223/aae03d7a-e16fa38c-8656b49d-9fd28376.jpg diff --git a/tests/gen_mimic/images-224/files/pce/pce8f7db8/s5e9a74fe/bd15e9b2-53b8e4e8-750aee04-1d36b2d1.jpg b/tests/gen_mimic/images-224/files/pce/pce8f7db8/s5e9a74fe/bd15e9b2-53b8e4e8-750aee04-1d36b2d1.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pcf/pcfdf2004/s51e11051/8fabbe65-06eaa11a-2dd88186-cccaeca5.jpg b/tests/gen_mimic/images-224/files/pcf/pcfdf2004/s51e11051/8fabbe65-06eaa11a-2dd88186-cccaeca5.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pd2/pd2e9ef2f/sc2c621af/09d3c8ba-4bb60535-e5222e77-4b05605c.jpg b/tests/gen_mimic/images-224/files/pd2/pd2e9ef2f/sc2c621af/09d3c8ba-4bb60535-e5222e77-4b05605c.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pd3/pd3d2355d/s4a11c4c5/15bb20ff-a92ea69d-1e8a7e91-4b530c77.jpg b/tests/gen_mimic/images-224/files/pd3/pd3d2355d/s4a11c4c5/15bb20ff-a92ea69d-1e8a7e91-4b530c77.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pd5/pd508e74c/s06953799/9031473a-0cf3181c-0b1a8cc1-66d6ea9a.jpg b/tests/gen_mimic/images-224/files/pd5/pd508e74c/s06953799/9031473a-0cf3181c-0b1a8cc1-66d6ea9a.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pd8/pd84b3758/s0340e918/44fd9124-c4837570-0cd0ed5f-5bcffbe1.jpg b/tests/gen_mimic/images-224/files/pd8/pd84b3758/s0340e918/44fd9124-c4837570-0cd0ed5f-5bcffbe1.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pda/pda7e8892/s1ea8f2f9/4490db49-8a28d6a9-e4eb6a6c-6f1854f8.jpg b/tests/gen_mimic/images-224/files/pda/pda7e8892/s1ea8f2f9/4490db49-8a28d6a9-e4eb6a6c-6f1854f8.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pdc/pdc84998c/se57581c8/1060d662-072e003c-dbf05f2e-4ccac4a5.jpg b/tests/gen_mimic/images-224/files/pdc/pdc84998c/se57581c8/1060d662-072e003c-dbf05f2e-4ccac4a5.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pe4/pe42ced85/s352789df/435ce0ac-4d95e7c1-34a4fb28-e6f7c9e9.jpg b/tests/gen_mimic/images-224/files/pe4/pe42ced85/s352789df/435ce0ac-4d95e7c1-34a4fb28-e6f7c9e9.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pe7/pe79ec2f1/scce2cf67/039fe911-344eab62-7f300b59-684f2fae.jpg b/tests/gen_mimic/images-224/files/pe7/pe79ec2f1/scce2cf67/039fe911-344eab62-7f300b59-684f2fae.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pe8/pe89a550a/sd213798d/e9e2b87b-3d3e9c4e-3b18d389-d8962c79.jpg b/tests/gen_mimic/images-224/files/pe8/pe89a550a/sd213798d/e9e2b87b-3d3e9c4e-3b18d389-d8962c79.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pea/pea77727e/sd5a7486e/f3cf7fa3-5c7851d6-8c9edbd0-0c8c64ef.jpg b/tests/gen_mimic/images-224/files/pea/pea77727e/sd5a7486e/f3cf7fa3-5c7851d6-8c9edbd0-0c8c64ef.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pec/pec45c8d4/s6cc1992c/4b7b5b36-3d1f22d5-83d30f11-34fde697.jpg b/tests/gen_mimic/images-224/files/pec/pec45c8d4/s6cc1992c/4b7b5b36-3d1f22d5-83d30f11-34fde697.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pec/pec98e654/sa3457d67/be767e96-e6350ffc-5d23d270-24a7860e.jpg b/tests/gen_mimic/images-224/files/pec/pec98e654/sa3457d67/be767e96-e6350ffc-5d23d270-24a7860e.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pee/pee99ac51/s910a87f1/dda2576c-e86e4a2d-a36bf76a-8dfd2ab0.jpg b/tests/gen_mimic/images-224/files/pee/pee99ac51/s910a87f1/dda2576c-e86e4a2d-a36bf76a-8dfd2ab0.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pef/peff712e4/s6391d0ac/a95606b7-c0fecf1e-ba7c6578-b6eabffd.jpg b/tests/gen_mimic/images-224/files/pef/peff712e4/s6391d0ac/a95606b7-c0fecf1e-ba7c6578-b6eabffd.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pf0/pf0736b23/s80147605/476391d0-88c15dff-5ef15726-e295bb0a.jpg b/tests/gen_mimic/images-224/files/pf0/pf0736b23/s80147605/476391d0-88c15dff-5ef15726-e295bb0a.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pf0/pf0b67e19/s5f14d7e7/f7667307-18823508-8a6a141b-9d78bbfe.jpg b/tests/gen_mimic/images-224/files/pf0/pf0b67e19/s5f14d7e7/f7667307-18823508-8a6a141b-9d78bbfe.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pf2/pf22f3c19/s4ab7695f/62aef45b-e5538f95-7dc63298-c10bf6b2.jpg b/tests/gen_mimic/images-224/files/pf2/pf22f3c19/s4ab7695f/62aef45b-e5538f95-7dc63298-c10bf6b2.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pf2/pf2f591b5/sdfe4d498/1caa6f1b-08c6ea8d-44b1ceb7-54a05871.jpg b/tests/gen_mimic/images-224/files/pf2/pf2f591b5/sdfe4d498/1caa6f1b-08c6ea8d-44b1ceb7-54a05871.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pf6/pf643ee65/s11007cfc/a80d59b5-8356df47-d3454d71-b6ae7aff.jpg b/tests/gen_mimic/images-224/files/pf6/pf643ee65/s11007cfc/a80d59b5-8356df47-d3454d71-b6ae7aff.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pf6/pf6eb7535/s6a9161f8/6b0d5ad0-197afbf6-4aaa2a2a-d039dcb4.jpg b/tests/gen_mimic/images-224/files/pf6/pf6eb7535/s6a9161f8/6b0d5ad0-197afbf6-4aaa2a2a-d039dcb4.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pf9/pf99b70cd/sdcd8dcdf/f7c53178-f0052fa6-87febe34-c10dc291.jpg b/tests/gen_mimic/images-224/files/pf9/pf99b70cd/sdcd8dcdf/f7c53178-f0052fa6-87febe34-c10dc291.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pfa/pfacdd6b9/s54f63b56/f860214f-1edfec29-bdae07fb-fad50e3b.jpg b/tests/gen_mimic/images-224/files/pfa/pfacdd6b9/s54f63b56/f860214f-1edfec29-bdae07fb-fad50e3b.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pfd/pfd072d66/sab1d747c/6bf31a1c-092e1543-5ab18d17-14257f4c.jpg b/tests/gen_mimic/images-224/files/pfd/pfd072d66/sab1d747c/6bf31a1c-092e1543-5ab18d17-14257f4c.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pfd/pfd1f37df/s72634032/64cd73ba-ee40ca52-ba4808ca-1b99a887.jpg b/tests/gen_mimic/images-224/files/pfd/pfd1f37df/s72634032/64cd73ba-ee40ca52-ba4808ca-1b99a887.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pff/pffe42d04/s7c56bb93/6afbd207-460ce550-370a678a-08b9b9cc.jpg b/tests/gen_mimic/images-224/files/pff/pffe42d04/s7c56bb93/6afbd207-460ce550-370a678a-08b9b9cc.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv b/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv index 3a31c0b..ba51ed7 100644 --- a/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv +++ b/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv @@ -1,101 +1,11 @@ dicom_id,subject_id,study_id,PerformedProcedureStepDescription,ViewPosition,Rows,Columns,StudyDate,StudyTime,ProcedureCodeSequence_CodeMeaning,ViewCodeSequence_CodeMeaning,PatientOrientationCodeSequence_CodeMeaning -3f891948-b5baeab2-28d37adb-718ab4ab,7d94c15f,7e7001ee,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -6366f5b8-60cda42d-d02a2489-1f9cc9b0,14472725,e7eb45a0,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -7f93a820-3501bf2f-03abd87f-6005216e,69fcfd52,1e76489d,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -9de9c841-872074e1-3e9775e1-0e0e2e76,78658ed8,adc3f650,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -59cb4d6e-519eae74-06af42fc-5077238b,4d8c768a,d194c4c5,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -1fed0d84-557646d8-41e6108f-063c2fca,3707bcf5,32cbad59,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -bd03db19-a077a18a-f5c0107f-fe07e42a,a78933d8,bccdda0d,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -5fa62f9e-86d7d8b2-3f8b233a-cf945af7,a0311c90,d7619ebc,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -0b8dcae3-6f810969-403294ec-b12c57f7,6bb08dad,95df9dfe,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -452df9cf-1cbb6b5e-d8639a1e-a08d32e3,0544f306,14e3e8bd,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -6e566b28-7dc76e51-363018ce-a0fa4a08,5fe54996,06e771a6,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -f7667307-18823508-8a6a141b-9d78bbfe,f0b67e19,5f14d7e7,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -f7c53178-f0052fa6-87febe34-c10dc291,f99b70cd,dcd8dcdf,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -408d770a-8163a0db-e6484216-c9f8814e,07ea4113,4a7a73de,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -6afb2b4d-e4806ac4-a34488fb-92bf282d,1f50e4a4,c64d1ec6,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -09d3c8ba-4bb60535-e5222e77-4b05605c,d2e9ef2f,c2c621af,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -ea2155aa-b89d8367-227a5543-3936ba36,862a380d,6cdc9063,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -64cd73ba-ee40ca52-ba4808ca-1b99a887,fd1f37df,72634032,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -6afbd207-460ce550-370a678a-08b9b9cc,ffe42d04,7c56bb93,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -3ab3a15e-710c1f1a-d9aa04c5-acd8c33a,2a8cbe9c,de422f0a,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -be767e96-e6350ffc-5d23d270-24a7860e,ec98e654,a3457d67,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -aec0415b-53d43067-de067b8f-ce37c7fb,52fa97c0,0b31040c,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -8dc7085c-f637862e-f65ca63b-65ad4799,0c3143cb,08efbd2f,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -a4bf5ac8-79606789-3d99f752-d2a888c3,1179de34,9aec6f8d,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -8fabbe65-06eaa11a-2dd88186-cccaeca5,cfdf2004,51e11051,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -9e317590-04d4b774-944cfcaf-eeb58c6e,cbca47ca,ab7e1939,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -b96ad4a8-266f779e-6bb986ca-59fa1099,950025fb,dbf73728,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -56ce0780-04eb57fe-a4c7528e-1822f095,225b7be0,ee059b45,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -1caa6f1b-08c6ea8d-44b1ceb7-54a05871,f2f591b5,dfe4d498,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -476391d0-88c15dff-5ef15726-e295bb0a,f0736b23,80147605,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -039fe911-344eab62-7f300b59-684f2fae,e79ec2f1,cce2cf67,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -4b7b5b36-3d1f22d5-83d30f11-34fde697,ec45c8d4,6cc1992c,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -1060d662-072e003c-dbf05f2e-4ccac4a5,dc84998c,e57581c8,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -b59b8ba2-db68273a-d53bc742-f593b6c8,4fd10475,9f58d7ca,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -0f6f5408-9392b8fc-6332764d-c39ac00f,3bd01425,66ba470d,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -440b9914-91df7a6d-452ccba7-f6423c89,bd3f44cd,8be7a71b,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -4490db49-8a28d6a9-e4eb6a6c-6f1854f8,da7e8892,1ea8f2f9,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -35c148ac-02e88f87-31f5ad80-ddb29478,727889bf,beb95018,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -920772aa-c204dc44-99f62611-87be5ea1,4d702ac9,d78068ee,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -9e39604f-fab38da7-f410426d-8451e4f6,605764b5,266b8861,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -02d8f4df-3a3e4445-e3c65a32-b42c67b6,5c61a0c7,452981c6,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -867a4c82-955ccc97-7eb349f9-a28ca6f5,2c0aea2d,7edf4838,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -9031473a-0cf3181c-0b1a8cc1-66d6ea9a,d508e74c,06953799,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -16b47fc6-3651620c-ee0eae0d-a8381e72,35e20610,cb1a83df,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -90003c60-446b48ec-567eefdd-d10903fb,ca849ba9,3c52fb1f,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -7ff7fea4-03f4d5de-7795c3e0-6bc5ed3b,b1668a60,9dfe2ebc,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -6bf31a1c-092e1543-5ab18d17-14257f4c,fd072d66,ab1d747c,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -082da48b-e0907024-71437d4a-9e129a83,67d4a7c2,bb9d1b94,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -7fc579fd-dffbd9d6-60eda497-66a17b26,2999546b,656d4c67,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -71f7fb51-bbb2462f-10afbcbf-2838cd29,2252ddd1,87842c63,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -015dc77d-eb10776d-36eaaca2-3f9b36c2,80ba1f4c,e12fa3f6,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -47928aec-7d506a45-e2defa1e-9eac22a7,357210e4,1b794d99,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -401f9466-bc8c501c-984218a7-7ea2a46b,2ad837bf,8ecf5b71,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -0afd2cf3-2d76ad25-1be75ad6-64d6cc86,28407bd8,776a9732,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -14590a8c-d308d549-66353123-823e3602,4800527c,521977e7,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -52ba5787-46aa2906-87e9fd54-bc3fd837,62149c26,14b34c50,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -43d4e45b-0309b696-b38219e2-34048035,51df2e95,fca58ce6,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -33093b96-ae905e2e-3714c3cc-45536dab,035c7641,1d793a25,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -ee6c04cd-dec16416-96efd3f3-ded808e3,7965c7d7,fc00c854,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -1cdc4221-e3767c0e-4e64a24c-97da9ae8,2d687542,edf6d60a,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -dda2576c-e86e4a2d-a36bf76a-8dfd2ab0,ee99ac51,910a87f1,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -15bb20ff-a92ea69d-1e8a7e91-4b530c77,d3d2355d,4a11c4c5,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -37cea7de-ba07488a-ca296af3-987e28d2,936623db,b93b8e79,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -35b3fb60-5a416c82-3dd7f2af-69d76155,19b04cf4,2cbc6bad,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -f3cf7fa3-5c7851d6-8c9edbd0-0c8c64ef,ea77727e,d5a7486e,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -c1531145-8a0a811c-b9970154-b49fce3f,3d619352,bd9f518f,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -7cdc4ba8-68b208c7-def2409a-cfce9906,2a516454,7edb140a,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -d6c6343b-912fd3f8-cd6b8fdf-a119373a,8231bf4b,bc5aa79f,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -87b202c5-2adf7ccd-7e02ece7-4a0db5d9,9b0c5003,3190176a,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -42ec6020-0795c6a3-ddced511-5b81073b,81355df1,50d4986b,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -07390b5c-3acbd27b-4cddcc37-19b562f5,9d9e0dbc,54a0a4bf,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -af091005-ab73c5ca-d3d0a857-a1e42b43,ae80d573,149b204c,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -c510a3b8-bf3c2545-602db8ef-bfb640df,594a4934,c377fe22,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -84a4a199-0e968dcf-21256899-eb7e053e,190b1b36,f9f8098e,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -7a73e2e1-7964ea55-77bf4a43-92742356,14ba4aea,d9ce6319,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -a95606b7-c0fecf1e-ba7c6578-b6eabffd,eff712e4,6391d0ac,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -44fd9124-c4837570-0cd0ed5f-5bcffbe1,d84b3758,0340e918,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -ca5a3173-60338bbe-711695d0-3448d57b,66592eb9,def6bf64,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -4345c04f-633971b1-58c93c0b-bdb3748d,404e1e3d,7ef2c8ee,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -1fd5e7e8-808658e6-3ec403f3-2a6a3109,5ee7697e,ceb85c30,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -19043538-8294af9c-957be8b5-d751b65a,35476b4a,a75e3451,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -b3431893-13edbdb8-57dad111-6fb33794,99af93f0,f855052b,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -37eb7689-401def65-adc29f03-80bfec57,70e84808,de56ac61,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -25cc94e9-bd797896-e311d0db-7c181371,31384363,58a45da1,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -d432c2b9-a59f399d-55128859-4c40617d,abc1242c,75a00dad,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -e62e681c-0b90c9f8-e5f376e7-8e39d39c,982044b1,3fa33bce,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -4bf8c19d-61ed148b-5e2c854b-2a7ce889,aeb32909,6e71b801,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -30ab56f1-1c5c214b-b5fd256c-404b9caf,39e8eb68,ea7d80f9,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -d7b62118-456cc7dd-fd7aae3a-b7a99e99,5c088c08,d0875cea,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -f860214f-1edfec29-bdae07fb-fad50e3b,facdd6b9,54f63b56,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -cd3cb96d-87138433-f6a7592d-a371aca7,c3dd3fe4,cfeaea37,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -435ce0ac-4d95e7c1-34a4fb28-e6f7c9e9,e42ced85,352789df,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -ffc2d4a2-e4b44c0c-4f071491-68955982,c80aa8dc,10b8a1ea,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -722678b5-671357c9-aaae7d33-f8862161,0540cdff,b8ce0ecd,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -3cc3d581-af55fcf1-376c3586-b6ba8056,c6fc66e6,e48b3c2b,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -4cd8b116-2e4c7d7c-cbb019f0-9f5d21a2,1b371dc2,d56d2785,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -02d9dd68-7c42e9bb-c2c45394-53a325e3,002677b2,67f3fe0b,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -30e5efca-91634147-b3391772-4dffe153,476f7556,6400dc24,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -6cc5e64e-d0a5f5d4-99992264-d0233a31,9ff616cd,58ad2be3,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -4095ec1b-1bb1dd72-9d77167a-4bac4d4b,ba043006,929858f1,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +e5ce94fb-90955d5d-5c7a4c11-8db716bb,a70cb8db,07eacc76,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +1f3c638a-e4844bfc-dcbbfc10-8a0cc71c,8ebfeda5,70705588,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +aae03d7a-e16fa38c-8656b49d-9fd28376,ce5242a2,10b21223,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +725fda26-4d46206e-3c37e541-fea8a836,bd6f6445,e3b296ad,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +59d8c93d-a81a8b6f-cf4603aa-58c1bd3f,20b295ad,1427bd21,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +d8f741cc-5a4a1760-b6d254f6-27283d44,41cf86ae,5beae017,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +c64423ec-029fb876-bfca6f94-7c728757,467a0f6a,bf161f1c,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +89aa4a05-4d9851d9-9302caef-06b28de1,24e3a4bb,06eea572,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +2dc30e97-a2a94a74-4338318e-3619c4ae,cd435694,60638bce,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +8ed429bf-3dcf34fb-2f3d28b4-022700b0,758d8d65,47afa62f,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent diff --git a/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv.gz b/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv.gz index 7794b199a076a1f9e4ed94e993b08cd0f0ff9828..a58a6a45f2fd0459252b7a070dd5d09e962342ff 100644 GIT binary patch delta 607 zcmV-l0-*h+9r6SRABzYGge5SM2Oxi}R84CfF$}%uSLE1&4Yn+Q9hW4~L)tFc&})$; zxlGCKq_ew({`-12&|VUHS%$GCY@{c>C(Fe1_WLAee{4UM4`=gml;0;~txKPmt;%|t zS>?Fs=Ah5Fy60tjK1}n@e4F%TJ@2Qp^Dw{c&CUFD-0t>fa|&`x2Yt03r>%dQzhQ1> z(T)B(>W=mM$@#3bn|43W@!maL(_zxx;p=i*>6G%lt5+IXEB0oqt1(Ix8#xoQ_qIsO zKDA~jJ8r`>E-NwTWNtp)Z62>btXJ2oFSpnCtH+OKy)poJ{@wWAxbZyi54y~jc4M37 z#oR5Uk5|42PN9%hEQqbM6>fiH^UfA>Bb{ecv~?AVCcErnEak2EW4U`+-Tx29(`fZV zPv$}SxNW0BS48T9Fz+V)Bl%CNu+ek=0Cuds{h}e^bJO~g(GtPTSq$V~Ug!z0S1pjovqs0)Et%KTI z$;l2GQtB0L<^dzeY%pbVJ&|eMC*OxQFQtQ0X%z3`&_ONHOSLsPVA5_~YEVSI0n|V^ zMsmnRDQ37R3m_bv)@)A+s3K*w7(xlY3`r(m8AtP3FvL{RBsYe(v0j{oqJmIcw?Vjv t)6)b!j45n5c!BI(b0)_kMN%}FsZ)Y}aTI?5009600|4enq73f^0041hCEox5 literal 3749 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 P|NjF30fUlTgEIgCjdO0R diff --git a/tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv b/tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv index b256507..9ef6647 100644 --- a/tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv +++ b/tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv @@ -1,101 +1,11 @@ subject_id,study_id,Atelectasis,Cardiomegaly,Consolidation,Edema,Enlarged Cardiomediastinum,Fracture,Lung Lesion,Lung Opacity,No Finding,Pleural Effusion,Pleural Other,Pneumonia,Pneumothorax,Support Devices -7d94c15f,7e7001ee,1.0,,1.0,,0.0,1.0,,,-1.0,-1.0,1.0,0.0,0.0,-1.0 -14472725,e7eb45a0,0.0,1.0,-1.0,0.0,-1.0,,,,0.0,-1.0,-1.0,1.0,0.0,0.0 -69fcfd52,1e76489d,,,-1.0,,1.0,,,,,1.0,-1.0,0.0,0.0,1.0 -78658ed8,adc3f650,-1.0,-1.0,,1.0,0.0,0.0,1.0,,,0.0,0.0,-1.0,0.0,0.0 -4d8c768a,d194c4c5,1.0,,1.0,-1.0,0.0,1.0,-1.0,-1.0,,-1.0,,0.0,1.0,-1.0 -3707bcf5,32cbad59,1.0,,-1.0,-1.0,1.0,0.0,0.0,,0.0,0.0,0.0,-1.0,0.0,1.0 -a78933d8,bccdda0d,0.0,0.0,1.0,0.0,0.0,0.0,-1.0,-1.0,1.0,-1.0,-1.0,-1.0,-1.0,1.0 -a0311c90,d7619ebc,1.0,1.0,-1.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,-1.0,0.0 -6bb08dad,95df9dfe,1.0,0.0,1.0,0.0,,,1.0,,0.0,-1.0,,-1.0,,0.0 -0544f306,14e3e8bd,,1.0,-1.0,,,-1.0,-1.0,0.0,1.0,0.0,0.0,,1.0,0.0 -5fe54996,06e771a6,-1.0,,,,,0.0,0.0,0.0,0.0,0.0,-1.0,,1.0,1.0 -f0b67e19,5f14d7e7,,,-1.0,,,1.0,-1.0,0.0,0.0,-1.0,-1.0,,1.0,0.0 -f99b70cd,dcd8dcdf,1.0,1.0,0.0,1.0,1.0,1.0,-1.0,0.0,,-1.0,,0.0,-1.0,0.0 -07ea4113,4a7a73de,-1.0,-1.0,0.0,-1.0,,1.0,,,,0.0,1.0,,1.0,0.0 -1f50e4a4,c64d1ec6,,1.0,0.0,0.0,,1.0,-1.0,-1.0,0.0,1.0,1.0,-1.0,1.0,1.0 -d2e9ef2f,c2c621af,0.0,,-1.0,-1.0,,1.0,-1.0,,1.0,1.0,0.0,-1.0,0.0,1.0 -862a380d,6cdc9063,1.0,0.0,,,0.0,1.0,,,-1.0,,1.0,-1.0,,-1.0 -fd1f37df,72634032,0.0,0.0,-1.0,,1.0,1.0,0.0,0.0,0.0,,1.0,,1.0, -ffe42d04,7c56bb93,-1.0,,-1.0,-1.0,,-1.0,1.0,0.0,-1.0,,-1.0,-1.0,0.0, -2a8cbe9c,de422f0a,-1.0,0.0,-1.0,0.0,0.0,,0.0,0.0,-1.0,,1.0,-1.0,0.0, -ec98e654,a3457d67,-1.0,1.0,-1.0,1.0,0.0,0.0,1.0,,,-1.0,,1.0,1.0,0.0 -52fa97c0,0b31040c,0.0,0.0,1.0,-1.0,1.0,0.0,1.0,,0.0,1.0,1.0,1.0,1.0, -0c3143cb,08efbd2f,0.0,1.0,1.0,-1.0,1.0,1.0,1.0,-1.0,-1.0,-1.0,,,0.0,-1.0 -1179de34,9aec6f8d,-1.0,-1.0,,-1.0,,-1.0,0.0,-1.0,1.0,1.0,1.0,0.0,,-1.0 -cfdf2004,51e11051,-1.0,1.0,1.0,1.0,,,-1.0,0.0,-1.0,1.0,,-1.0,,1.0 -cbca47ca,ab7e1939,,-1.0,,-1.0,,-1.0,,1.0,0.0,-1.0,-1.0,,0.0,-1.0 -950025fb,dbf73728,1.0,1.0,1.0,1.0,0.0,-1.0,,-1.0,,1.0,1.0,,-1.0,1.0 -225b7be0,ee059b45,-1.0,,0.0,1.0,1.0,-1.0,0.0,0.0,,-1.0,0.0,-1.0,0.0,-1.0 -f2f591b5,dfe4d498,-1.0,,,1.0,-1.0,,-1.0,-1.0,-1.0,-1.0,,,-1.0,-1.0 -f0736b23,80147605,0.0,1.0,0.0,0.0,1.0,-1.0,0.0,,1.0,0.0,,-1.0,,-1.0 -e79ec2f1,cce2cf67,-1.0,1.0,-1.0,,,1.0,0.0,0.0,0.0,0.0,,0.0,0.0,-1.0 -ec45c8d4,6cc1992c,0.0,1.0,,,0.0,,,-1.0,-1.0,-1.0,0.0,,-1.0, -dc84998c,e57581c8,1.0,0.0,-1.0,0.0,,1.0,0.0,,0.0,1.0,-1.0,0.0,1.0,0.0 -4fd10475,9f58d7ca,0.0,0.0,,0.0,,0.0,,1.0,0.0,1.0,-1.0,0.0,1.0,1.0 -3bd01425,66ba470d,,1.0,,,0.0,-1.0,,,-1.0,-1.0,-1.0,-1.0,0.0, -bd3f44cd,8be7a71b,-1.0,1.0,-1.0,0.0,,,-1.0,-1.0,-1.0,0.0,-1.0,-1.0,,-1.0 -da7e8892,1ea8f2f9,1.0,0.0,,0.0,,0.0,,,,,,0.0,-1.0,0.0 -727889bf,beb95018,-1.0,-1.0,1.0,-1.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0,,0.0 -4d702ac9,d78068ee,-1.0,-1.0,0.0,-1.0,-1.0,0.0,0.0,1.0,0.0,0.0,-1.0,,,1.0 -605764b5,266b8861,-1.0,1.0,1.0,1.0,0.0,0.0,-1.0,1.0,0.0,-1.0,1.0,1.0,1.0, -5c61a0c7,452981c6,,,1.0,,,,1.0,1.0,1.0,,1.0,0.0,-1.0,-1.0 -2c0aea2d,7edf4838,1.0,0.0,-1.0,-1.0,-1.0,-1.0,0.0,1.0,0.0,-1.0,0.0,-1.0,0.0,1.0 -d508e74c,06953799,0.0,0.0,-1.0,,,0.0,,0.0,-1.0,1.0,-1.0,1.0,-1.0,-1.0 -35e20610,cb1a83df,1.0,0.0,-1.0,,1.0,-1.0,,-1.0,1.0,0.0,-1.0,,0.0,1.0 -ca849ba9,3c52fb1f,1.0,,,-1.0,,0.0,-1.0,0.0,1.0,,-1.0,,-1.0,1.0 -b1668a60,9dfe2ebc,0.0,-1.0,,-1.0,-1.0,-1.0,1.0,,1.0,1.0,,,,1.0 -fd072d66,ab1d747c,-1.0,,,-1.0,-1.0,1.0,1.0,-1.0,0.0,,,,1.0,-1.0 -67d4a7c2,bb9d1b94,,1.0,0.0,1.0,1.0,,0.0,-1.0,0.0,0.0,-1.0,1.0,,-1.0 -2999546b,656d4c67,,-1.0,,1.0,-1.0,1.0,-1.0,1.0,,0.0,1.0,1.0,0.0, -2252ddd1,87842c63,,1.0,0.0,0.0,0.0,-1.0,-1.0,-1.0,0.0,,1.0,0.0,1.0, -80ba1f4c,e12fa3f6,1.0,,-1.0,1.0,,0.0,1.0,0.0,0.0,0.0,,0.0,1.0,1.0 -357210e4,1b794d99,-1.0,,,1.0,1.0,0.0,0.0,1.0,0.0,-1.0,0.0,,,0.0 -2ad837bf,8ecf5b71,0.0,-1.0,-1.0,-1.0,1.0,-1.0,1.0,-1.0,1.0,0.0,0.0,,1.0,1.0 -28407bd8,776a9732,-1.0,1.0,-1.0,0.0,1.0,0.0,0.0,0.0,1.0,-1.0,-1.0,-1.0,0.0, -4800527c,521977e7,-1.0,0.0,,1.0,0.0,1.0,0.0,1.0,1.0,0.0,,1.0,-1.0,-1.0 -62149c26,14b34c50,-1.0,1.0,0.0,0.0,,0.0,,1.0,0.0,-1.0,,-1.0,0.0,-1.0 -51df2e95,fca58ce6,-1.0,1.0,1.0,,0.0,1.0,1.0,-1.0,0.0,-1.0,1.0,0.0,0.0, -035c7641,1d793a25,-1.0,-1.0,,-1.0,,-1.0,0.0,,,-1.0,1.0,,,1.0 -7965c7d7,fc00c854,,1.0,-1.0,0.0,0.0,-1.0,1.0,0.0,0.0,-1.0,-1.0,,0.0,1.0 -2d687542,edf6d60a,,0.0,0.0,0.0,1.0,0.0,,1.0,1.0,1.0,0.0,-1.0,, -ee99ac51,910a87f1,,1.0,0.0,1.0,,1.0,-1.0,-1.0,-1.0,1.0,,,-1.0,1.0 -d3d2355d,4a11c4c5,-1.0,,,-1.0,-1.0,1.0,,,0.0,1.0,0.0,0.0,-1.0,0.0 -936623db,b93b8e79,1.0,0.0,0.0,0.0,0.0,1.0,-1.0,0.0,0.0,-1.0,-1.0,-1.0,-1.0,0.0 -19b04cf4,2cbc6bad,,-1.0,0.0,-1.0,0.0,0.0,,1.0,1.0,,,,0.0,1.0 -ea77727e,d5a7486e,-1.0,1.0,,1.0,-1.0,,1.0,-1.0,1.0,1.0,,1.0,-1.0, -3d619352,bd9f518f,-1.0,-1.0,1.0,,0.0,-1.0,0.0,,1.0,,-1.0,0.0,0.0,-1.0 -2a516454,7edb140a,0.0,-1.0,0.0,1.0,,,-1.0,1.0,0.0,,-1.0,-1.0,1.0,0.0 -8231bf4b,bc5aa79f,,,-1.0,-1.0,,-1.0,1.0,0.0,0.0,1.0,,-1.0,0.0,1.0 -9b0c5003,3190176a,1.0,1.0,,-1.0,-1.0,0.0,1.0,,-1.0,-1.0,,-1.0,,-1.0 -81355df1,50d4986b,-1.0,,,,,,0.0,1.0,-1.0,0.0,-1.0,0.0,-1.0, -9d9e0dbc,54a0a4bf,,-1.0,,0.0,-1.0,,-1.0,-1.0,1.0,1.0,1.0,0.0,, -ae80d573,149b204c,0.0,1.0,,-1.0,1.0,-1.0,1.0,-1.0,,-1.0,,0.0,, -594a4934,c377fe22,-1.0,0.0,,-1.0,1.0,-1.0,1.0,0.0,,0.0,,0.0,0.0,-1.0 -190b1b36,f9f8098e,1.0,,-1.0,-1.0,,,-1.0,0.0,,1.0,,1.0,-1.0,0.0 -14ba4aea,d9ce6319,1.0,,,1.0,,,,,,,,0.0,0.0,-1.0 -eff712e4,6391d0ac,,,-1.0,,-1.0,0.0,1.0,-1.0,1.0,,-1.0,,-1.0,-1.0 -d84b3758,0340e918,0.0,0.0,,-1.0,0.0,0.0,1.0,0.0,-1.0,0.0,-1.0,,1.0,-1.0 -66592eb9,def6bf64,,1.0,-1.0,1.0,1.0,-1.0,0.0,0.0,0.0,-1.0,0.0,1.0,0.0,0.0 -404e1e3d,7ef2c8ee,,0.0,1.0,1.0,,,1.0,1.0,1.0,0.0,,-1.0,-1.0,1.0 -5ee7697e,ceb85c30,,-1.0,,0.0,,0.0,1.0,1.0,0.0,1.0,1.0,,-1.0,1.0 -35476b4a,a75e3451,-1.0,0.0,-1.0,-1.0,,1.0,,-1.0,,0.0,1.0,-1.0,0.0,-1.0 -99af93f0,f855052b,0.0,1.0,0.0,0.0,,0.0,1.0,1.0,0.0,,,1.0,1.0,1.0 -70e84808,de56ac61,,,0.0,-1.0,0.0,0.0,,-1.0,-1.0,,-1.0,,-1.0,0.0 -31384363,58a45da1,,0.0,,1.0,0.0,0.0,1.0,1.0,0.0,-1.0,-1.0,1.0,1.0,0.0 -abc1242c,75a00dad,,-1.0,-1.0,0.0,,0.0,-1.0,-1.0,0.0,,-1.0,,,-1.0 -982044b1,3fa33bce,,0.0,-1.0,0.0,-1.0,1.0,,,1.0,1.0,-1.0,,,0.0 -aeb32909,6e71b801,1.0,0.0,0.0,,1.0,0.0,1.0,1.0,1.0,0.0,1.0,-1.0,1.0,1.0 -39e8eb68,ea7d80f9,0.0,,-1.0,1.0,-1.0,0.0,,1.0,-1.0,1.0,-1.0,-1.0,, -5c088c08,d0875cea,-1.0,,0.0,1.0,1.0,1.0,0.0,1.0,,1.0,1.0,,1.0,0.0 -facdd6b9,54f63b56,-1.0,0.0,-1.0,-1.0,1.0,0.0,-1.0,,-1.0,-1.0,1.0,,,0.0 -c3dd3fe4,cfeaea37,-1.0,,,-1.0,1.0,-1.0,,0.0,0.0,1.0,-1.0,,,0.0 -e42ced85,352789df,1.0,,0.0,0.0,,0.0,1.0,,-1.0,1.0,,-1.0,0.0,0.0 -c80aa8dc,10b8a1ea,1.0,1.0,0.0,-1.0,1.0,1.0,,1.0,,1.0,,1.0,1.0,1.0 -0540cdff,b8ce0ecd,-1.0,-1.0,-1.0,-1.0,1.0,1.0,-1.0,,1.0,1.0,0.0,,1.0,1.0 -c6fc66e6,e48b3c2b,0.0,-1.0,,1.0,0.0,-1.0,1.0,0.0,,-1.0,0.0,,0.0,-1.0 -1b371dc2,d56d2785,1.0,0.0,,1.0,-1.0,,-1.0,,,-1.0,,1.0,1.0, -002677b2,67f3fe0b,0.0,-1.0,1.0,-1.0,,,,0.0,-1.0,-1.0,-1.0,-1.0,,1.0 -476f7556,6400dc24,-1.0,-1.0,0.0,0.0,1.0,1.0,-1.0,,,0.0,,0.0,,0.0 -9ff616cd,58ad2be3,0.0,0.0,-1.0,-1.0,,0.0,0.0,1.0,0.0,-1.0,0.0,,-1.0,1.0 -ba043006,929858f1,0.0,0.0,0.0,,1.0,1.0,-1.0,1.0,-1.0,0.0,-1.0,-1.0,1.0, +a70cb8db,07eacc76,0.0,0.0,1.0,,1.0,-1.0,1.0,0.0,-1.0,1.0,-1.0,-1.0,0.0,1.0 +8ebfeda5,70705588,0.0,-1.0,1.0,0.0,-1.0,1.0,0.0,,0.0,1.0,-1.0,-1.0,,-1.0 +ce5242a2,10b21223,0.0,-1.0,1.0,0.0,0.0,,0.0,,,0.0,1.0,1.0,1.0, +bd6f6445,e3b296ad,0.0,,0.0,-1.0,,0.0,,,-1.0,1.0,-1.0,1.0,,1.0 +20b295ad,1427bd21,1.0,1.0,,0.0,-1.0,,0.0,-1.0,1.0,-1.0,,1.0,-1.0,1.0 +41cf86ae,5beae017,0.0,0.0,1.0,,1.0,0.0,0.0,,-1.0,0.0,1.0,-1.0,-1.0, +467a0f6a,bf161f1c,1.0,,1.0,,,0.0,1.0,-1.0,0.0,0.0,0.0,1.0,1.0,0.0 +24e3a4bb,06eea572,0.0,,0.0,1.0,,-1.0,1.0,0.0,,1.0,-1.0,1.0,-1.0,-1.0 +cd435694,60638bce,,,0.0,,,-1.0,-1.0,0.0,1.0,0.0,1.0,,0.0, +758d8d65,47afa62f,0.0,-1.0,,,0.0,0.0,1.0,,-1.0,-1.0,,1.0,,1.0 diff --git a/tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv.gz b/tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv.gz index e973d69c32a539a383f3abbad388f9b0a4c22b08..a1b10345efafa83e7695ee55d9b324ad105ee091 100644 GIT binary patch delta 416 zcmV;R0bl;&5V8XYABzYGge5SM2OfWHkxOplFbszGI)x9w6q2lmvn)F4s+bn&0S1&r zr5ZSPV9SH%_I2IFv6ESlAO-%U_^}_{U-J1+3ee{voW6s{O!fGNed^%}yO7!g?Xf<= zQ`_`yodV|6Hn0nHK-e`kc6$oNr7|S!b83bIJa_2x&=I^0&Axb{{#!N0uSb9MDWBkX zTRf*Gq-GCqH4Pos#V*ESD!e?r<`3%Nt)b!2HVMyB{%AY=g!kciY`a|iqJPO#&(L!3 zs^EZILhr2s{=g>_qfKrj&KX}Oo7tUrF1(GC9uN>QN+=v@S?7H@@kx)~`A- zC48(55@<(AT-bZ6^A<~n3lvNli#!?x7ljc~_^b8?9bec25|fHbRBpVjAwq5C8vD&P z#DA~Ld{Ct}TLp%jvT~ka1#tCyz9hx0u0j=z24yj#k#PZV&1191I3W=H0ssL2{{sNv K+4Oj50{{SJ%g0p! delta 2141 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 TKL7v#|NjF3TW#EO3L5|b8X_@= From 04f1a322f5df47e818a124695eaf1c2e7121350e Mon Sep 17 00:00:00 2001 From: bganglia Date: Sun, 9 Aug 2020 12:38:29 -0400 Subject: [PATCH 11/52] tarfile test using random MIMIC data --- tests/test_dataloaders.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/test_dataloaders.py b/tests/test_dataloaders.py index 74f8df4..f37b152 100644 --- a/tests/test_dataloaders.py +++ b/tests/test_dataloaders.py @@ -1,5 +1,7 @@ import pytest +import pickle import torchxrayvision as xrv +from pathlib import Path dataset_classes = [xrv.datasets.NIH_Dataset, xrv.datasets.PC_Dataset, @@ -45,3 +47,21 @@ def test_dataloader_merging_incorrect_alignment(): assert "incorrect pathology alignment" in str(excinfo.value) +def test_mimic_tar(): + #Load tarred and untarred datasets + mimic_test_dir = Path("tests/gen_mimic") + metacsvpath = mimic_test_dir/"mimic-cxr-2.0.0-metadata.csv" + csvpath = mimic_test_dir/"mimic-cxr-2.0.0-negbio.csv" + tarred = xrv.datasets.MIMIC_Dataset( + imgpath=mimic_test_dir/"images-224.tar", + csvpath=csvpath, + metacsvpath=metacsvpath, + ) + extracted = xrv.datasets.MIMIC_Dataset( + imgpath=mimic_test_dir/"images-224"/"files", + csvpath=csvpath, + metacsvpath=metacsvpath + ) + #Assert items are the same + for tarred_item, extracted_item in zip(tarred, extracted): + assert pickle.dumps(tarred_item) == pickle.dumps(extracted_item) From 90129ab8a5663c496f331e738dd8b46d9f5090dd Mon Sep 17 00:00:00 2001 From: bganglia Date: Sun, 9 Aug 2020 12:53:16 -0400 Subject: [PATCH 12/52] fix test directory --- tests/test_dataloaders.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_dataloaders.py b/tests/test_dataloaders.py index f37b152..059bfef 100644 --- a/tests/test_dataloaders.py +++ b/tests/test_dataloaders.py @@ -49,7 +49,7 @@ def test_dataloader_merging_incorrect_alignment(): def test_mimic_tar(): #Load tarred and untarred datasets - mimic_test_dir = Path("tests/gen_mimic") + mimic_test_dir = Path("gen_mimic") metacsvpath = mimic_test_dir/"mimic-cxr-2.0.0-metadata.csv" csvpath = mimic_test_dir/"mimic-cxr-2.0.0-negbio.csv" tarred = xrv.datasets.MIMIC_Dataset( From 0aa52a7bfff0398e03aa04a3843720e598fa9da3 Mon Sep 17 00:00:00 2001 From: bganglia Date: Sun, 9 Aug 2020 13:23:12 -0400 Subject: [PATCH 13/52] use .close() on tarfile and regenerate test directory --- tests/gen_mimic.py | 1 + tests/gen_mimic/images-224.tar | Bin 0 -> 102400 bytes .../9160eb4a-257a3140-8f138287-8981fc11.jpg} | Bin .../15288759-57edea0b-9556a29d-43cbc54c.jpg} | Bin .../c5402f0b-2ecf6365-bd88b424-252ad568.jpg} | Bin .../73f3a8fa-928c521d-4599c566-75198031.jpg} | Bin .../1d5cc6d7-8c6bc168-7b694c53-4df47582.jpg} | Bin .../d919ac9d-8b492a3e-c3485f4f-94e73865.jpg} | Bin .../b2d07eff-cd883d7d-3a00fd7a-e227a420.jpg} | Bin .../00e45f48-7a73e69b-1cbe72d4-7259c959.jpg} | Bin .../c94bbfae-e39038df-5b7efb8e-31f9ee55.jpg} | Bin .../a59fc947-4912d84a-f6ace88d-1ccdf143.jpg} | Bin .../da54bf19-4bfcbe16-b364a677-b61c0743.jpg | Bin 0 -> 920 bytes .../8e497ccd-3f13f600-4a7be3d5-0c1f4f09.jpg | Bin 0 -> 920 bytes .../746857e8-930e2b92-830ba925-90a97e7e.jpg | Bin 0 -> 920 bytes .../1c9bdf33-12762299-6e5a617d-b2b0ef88.jpg | Bin 0 -> 920 bytes .../d8d6c36e-f6d5be79-6d8d0627-4d147195.jpg | Bin 0 -> 920 bytes .../539b692a-b6898b10-4bffba19-dbbbcdbc.jpg | Bin 0 -> 920 bytes .../128f28cd-e4215d7d-771984af-284d8ab6.jpg | Bin 0 -> 920 bytes .../7d4c4448-a12969b6-e4f1fce9-e42b5a6c.jpg | Bin 0 -> 920 bytes .../9fc08fe8-b4daf852-5856bd9f-47779547.jpg | Bin 0 -> 920 bytes .../58d68a58-fbbcf857-4b8ad963-96e4235d.jpg | Bin 0 -> 920 bytes .../2fd58d4d-c55d0cea-34a82d0e-a2c4b459.jpg | Bin 0 -> 920 bytes .../2f11d734-8472ea74-d140dc70-3cd25400.jpg | Bin 0 -> 920 bytes .../50541878-d32e3a22-7b9c4f64-d8458be4.jpg | Bin 0 -> 920 bytes .../8e03f255-4835baa1-1d55bf2f-1afdeb17.jpg | Bin 0 -> 920 bytes .../f061d04c-add9919d-f1f8c039-0350cfbe.jpg | Bin 0 -> 920 bytes .../60313569-aab4439a-36680145-8f0c90c3.jpg | Bin 0 -> 920 bytes .../35c7d685-56e7291c-75f30590-cd6e143e.jpg | Bin 0 -> 920 bytes .../4c112d3a-0e7093c9-4b207121-9fc0a6cd.jpg | Bin 0 -> 920 bytes .../63036743-d14a06a9-2784f480-257e30e1.jpg | Bin 0 -> 920 bytes .../e8aa3601-35458231-e6aa878c-7386bd70.jpg | Bin 0 -> 920 bytes tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv | 20 +++++++++--------- .../gen_mimic/mimic-cxr-2.0.0-metadata.csv.gz | Bin 626 -> 623 bytes tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv | 20 +++++++++--------- tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv.gz | Bin 434 -> 441 bytes tests/test_dataloaders.py | 4 +++- 37 files changed, 24 insertions(+), 21 deletions(-) rename tests/gen_mimic/images-224/files/{p20/p20b295ad/s1427bd21/59d8c93d-a81a8b6f-cf4603aa-58c1bd3f.jpg => p06/p0639398e/sab8e71f2/9160eb4a-257a3140-8f138287-8981fc11.jpg} (100%) rename tests/gen_mimic/images-224/files/{p24/p24e3a4bb/s06eea572/89aa4a05-4d9851d9-9302caef-06b28de1.jpg => p07/p070736c2/scfed7491/15288759-57edea0b-9556a29d-43cbc54c.jpg} (100%) rename tests/gen_mimic/images-224/files/{p41/p41cf86ae/s5beae017/d8f741cc-5a4a1760-b6d254f6-27283d44.jpg => p08/p085cff35/sa433a81c/c5402f0b-2ecf6365-bd88b424-252ad568.jpg} (100%) rename tests/gen_mimic/images-224/files/{p46/p467a0f6a/sbf161f1c/c64423ec-029fb876-bfca6f94-7c728757.jpg => p10/p10951197/s09d439f2/73f3a8fa-928c521d-4599c566-75198031.jpg} (100%) rename tests/gen_mimic/images-224/files/{p75/p758d8d65/s47afa62f/8ed429bf-3dcf34fb-2f3d28b4-022700b0.jpg => p18/p182aeefb/s5239d871/1d5cc6d7-8c6bc168-7b694c53-4df47582.jpg} (100%) rename tests/gen_mimic/images-224/files/{p8e/p8ebfeda5/s70705588/1f3c638a-e4844bfc-dcbbfc10-8a0cc71c.jpg => p18/p185cb7da/sbb1658cc/d919ac9d-8b492a3e-c3485f4f-94e73865.jpg} (100%) rename tests/gen_mimic/images-224/files/{pa7/pa70cb8db/s07eacc76/e5ce94fb-90955d5d-5c7a4c11-8db716bb.jpg => p1a/p1a0cf2f8/s7945e2fa/b2d07eff-cd883d7d-3a00fd7a-e227a420.jpg} (100%) rename tests/gen_mimic/images-224/files/{pbd/pbd6f6445/se3b296ad/725fda26-4d46206e-3c37e541-fea8a836.jpg => p2d/p2da2ef62/s6b392830/00e45f48-7a73e69b-1cbe72d4-7259c959.jpg} (100%) rename tests/gen_mimic/images-224/files/{pcd/pcd435694/s60638bce/2dc30e97-a2a94a74-4338318e-3619c4ae.jpg => p32/p32b572e6/s9ba81d90/c94bbfae-e39038df-5b7efb8e-31f9ee55.jpg} (100%) rename tests/gen_mimic/images-224/files/{pce/pce5242a2/s10b21223/aae03d7a-e16fa38c-8656b49d-9fd28376.jpg => p3d/p3dc9cdc5/sd00f6a73/a59fc947-4912d84a-f6ace88d-1ccdf143.jpg} (100%) create mode 100644 tests/gen_mimic/images-224/files/p63/p636c6ae0/sc8cca22c/da54bf19-4bfcbe16-b364a677-b61c0743.jpg create mode 100644 tests/gen_mimic/images-224/files/p66/p667bdc12/s4a6038b8/8e497ccd-3f13f600-4a7be3d5-0c1f4f09.jpg create mode 100644 tests/gen_mimic/images-224/files/p67/p67111dd3/s97d40f2a/746857e8-930e2b92-830ba925-90a97e7e.jpg create mode 100644 tests/gen_mimic/images-224/files/p70/p700bf17d/sda301b01/1c9bdf33-12762299-6e5a617d-b2b0ef88.jpg create mode 100644 tests/gen_mimic/images-224/files/p70/p709a3d20/s04003d64/d8d6c36e-f6d5be79-6d8d0627-4d147195.jpg create mode 100644 tests/gen_mimic/images-224/files/p78/p78ae70f1/s4728d107/539b692a-b6898b10-4bffba19-dbbbcdbc.jpg create mode 100644 tests/gen_mimic/images-224/files/p7a/p7a77c130/s0d554684/128f28cd-e4215d7d-771984af-284d8ab6.jpg create mode 100644 tests/gen_mimic/images-224/files/p88/p88530ff8/s732de0c4/7d4c4448-a12969b6-e4f1fce9-e42b5a6c.jpg create mode 100644 tests/gen_mimic/images-224/files/p8c/p8c386642/sfee5823a/9fc08fe8-b4daf852-5856bd9f-47779547.jpg create mode 100644 tests/gen_mimic/images-224/files/p9c/p9c79a08a/s1449fb9b/58d68a58-fbbcf857-4b8ad963-96e4235d.jpg create mode 100644 tests/gen_mimic/images-224/files/p9e/p9e594eaa/s4e29dfa2/2fd58d4d-c55d0cea-34a82d0e-a2c4b459.jpg create mode 100644 tests/gen_mimic/images-224/files/pa0/pa06d0acc/s216e34ff/2f11d734-8472ea74-d140dc70-3cd25400.jpg create mode 100644 tests/gen_mimic/images-224/files/pa1/pa1bdabdf/s82aa1e1e/50541878-d32e3a22-7b9c4f64-d8458be4.jpg create mode 100644 tests/gen_mimic/images-224/files/pa2/pa282b0a5/s2305b6b1/8e03f255-4835baa1-1d55bf2f-1afdeb17.jpg create mode 100644 tests/gen_mimic/images-224/files/pb9/pb946092a/s8ad7a2d0/f061d04c-add9919d-f1f8c039-0350cfbe.jpg create mode 100644 tests/gen_mimic/images-224/files/pbb/pbb35aad3/s07e14baf/60313569-aab4439a-36680145-8f0c90c3.jpg create mode 100644 tests/gen_mimic/images-224/files/pd6/pd65ae44e/s82475404/35c7d685-56e7291c-75f30590-cd6e143e.jpg create mode 100644 tests/gen_mimic/images-224/files/pe0/pe0be2169/sd0ff5abb/4c112d3a-0e7093c9-4b207121-9fc0a6cd.jpg create mode 100644 tests/gen_mimic/images-224/files/ped/pedc6b925/sd03e6b53/63036743-d14a06a9-2784f480-257e30e1.jpg create mode 100644 tests/gen_mimic/images-224/files/pf9/pf9374095/s0594dc84/e8aa3601-35458231-e6aa878c-7386bd70.jpg diff --git a/tests/gen_mimic.py b/tests/gen_mimic.py index 85306dd..c7a843c 100644 --- a/tests/gen_mimic.py +++ b/tests/gen_mimic.py @@ -107,6 +107,7 @@ def generate_test_images(random_metadata, extracted, tarname, dimensions): generate_random_image(dimensions).save(img_path) tarred = tarfile.TarFile.open(tarname, "w") tarred.add(extracted) + tarred.close() def generate_test_data(n, directory, dimensions=(224, 224), tarname=None, extracted=None): directory = Path(directory) diff --git a/tests/gen_mimic/images-224.tar b/tests/gen_mimic/images-224.tar index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2cfd81cbbc71aae04384fe340ac184864e7d3bbe 100644 GIT binary patch literal 102400 zcmeI5N04R7Rfb>Bv>QVpGZ;;bn3iKkpd6()1Ox#>1JVuz2-py5n^tI~$2<)#f(X3P z4kyeGAz`#pU?j{6BS2z@*NDyF%?b}f01W28k%rp@pUd%2!g&5lGl~2c%3lc=wBw!xZJiB_ z5*bPfo;i|22r-5D#M{=_ySv}=*IM35|1mA-vHpYjzn%X<1ZuvzMmrPjuKu6vzndSw z`P}M7Z+`MkPp&RpSgkI=pViI3SiNC&_44H_moHtta^=c>_g%gJ!G}KO!3Q3A@MSM~ z>8C#Q@`oS&td~Fh$RpQY{lsI}UirFLJ@Uxo=C!Y*OiKCaW9|zq|NJL}m3T)pr92jCxk=tZl0F5G+XJs0o2bm`(n z_}AYKf4{o;;!7`i1^c4QFa2_V<(1#~5dY2}`su5$`r=>wtxx-kKm6xci}3V!-FN?| zf5vCN?BUmZ_G6E~_H(4t#=6gY!CBj-~Z^x{@{=P_)q@y&;I=5&wk=B|LU**=5PP*@BiT+|LI@; z_22&eKmPN-{`-^vbMq6ct6R5y;p&tB`|iizi~peqYIxv-H=o^oMp}R07yo%0AM5+> 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 literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p66/p667bdc12/s4a6038b8/8e497ccd-3f13f600-4a7be3d5-0c1f4f09.jpg b/tests/gen_mimic/images-224/files/p66/p667bdc12/s4a6038b8/8e497ccd-3f13f600-4a7be3d5-0c1f4f09.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p67/p67111dd3/s97d40f2a/746857e8-930e2b92-830ba925-90a97e7e.jpg b/tests/gen_mimic/images-224/files/p67/p67111dd3/s97d40f2a/746857e8-930e2b92-830ba925-90a97e7e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p70/p700bf17d/sda301b01/1c9bdf33-12762299-6e5a617d-b2b0ef88.jpg b/tests/gen_mimic/images-224/files/p70/p700bf17d/sda301b01/1c9bdf33-12762299-6e5a617d-b2b0ef88.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p70/p709a3d20/s04003d64/d8d6c36e-f6d5be79-6d8d0627-4d147195.jpg b/tests/gen_mimic/images-224/files/p70/p709a3d20/s04003d64/d8d6c36e-f6d5be79-6d8d0627-4d147195.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p78/p78ae70f1/s4728d107/539b692a-b6898b10-4bffba19-dbbbcdbc.jpg b/tests/gen_mimic/images-224/files/p78/p78ae70f1/s4728d107/539b692a-b6898b10-4bffba19-dbbbcdbc.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p7a/p7a77c130/s0d554684/128f28cd-e4215d7d-771984af-284d8ab6.jpg b/tests/gen_mimic/images-224/files/p7a/p7a77c130/s0d554684/128f28cd-e4215d7d-771984af-284d8ab6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p88/p88530ff8/s732de0c4/7d4c4448-a12969b6-e4f1fce9-e42b5a6c.jpg b/tests/gen_mimic/images-224/files/p88/p88530ff8/s732de0c4/7d4c4448-a12969b6-e4f1fce9-e42b5a6c.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p8c/p8c386642/sfee5823a/9fc08fe8-b4daf852-5856bd9f-47779547.jpg b/tests/gen_mimic/images-224/files/p8c/p8c386642/sfee5823a/9fc08fe8-b4daf852-5856bd9f-47779547.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p9c/p9c79a08a/s1449fb9b/58d68a58-fbbcf857-4b8ad963-96e4235d.jpg b/tests/gen_mimic/images-224/files/p9c/p9c79a08a/s1449fb9b/58d68a58-fbbcf857-4b8ad963-96e4235d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p9e/p9e594eaa/s4e29dfa2/2fd58d4d-c55d0cea-34a82d0e-a2c4b459.jpg b/tests/gen_mimic/images-224/files/p9e/p9e594eaa/s4e29dfa2/2fd58d4d-c55d0cea-34a82d0e-a2c4b459.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pa0/pa06d0acc/s216e34ff/2f11d734-8472ea74-d140dc70-3cd25400.jpg b/tests/gen_mimic/images-224/files/pa0/pa06d0acc/s216e34ff/2f11d734-8472ea74-d140dc70-3cd25400.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pa1/pa1bdabdf/s82aa1e1e/50541878-d32e3a22-7b9c4f64-d8458be4.jpg b/tests/gen_mimic/images-224/files/pa1/pa1bdabdf/s82aa1e1e/50541878-d32e3a22-7b9c4f64-d8458be4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pa2/pa282b0a5/s2305b6b1/8e03f255-4835baa1-1d55bf2f-1afdeb17.jpg b/tests/gen_mimic/images-224/files/pa2/pa282b0a5/s2305b6b1/8e03f255-4835baa1-1d55bf2f-1afdeb17.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pb9/pb946092a/s8ad7a2d0/f061d04c-add9919d-f1f8c039-0350cfbe.jpg b/tests/gen_mimic/images-224/files/pb9/pb946092a/s8ad7a2d0/f061d04c-add9919d-f1f8c039-0350cfbe.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pbb/pbb35aad3/s07e14baf/60313569-aab4439a-36680145-8f0c90c3.jpg b/tests/gen_mimic/images-224/files/pbb/pbb35aad3/s07e14baf/60313569-aab4439a-36680145-8f0c90c3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pd6/pd65ae44e/s82475404/35c7d685-56e7291c-75f30590-cd6e143e.jpg b/tests/gen_mimic/images-224/files/pd6/pd65ae44e/s82475404/35c7d685-56e7291c-75f30590-cd6e143e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pe0/pe0be2169/sd0ff5abb/4c112d3a-0e7093c9-4b207121-9fc0a6cd.jpg b/tests/gen_mimic/images-224/files/pe0/pe0be2169/sd0ff5abb/4c112d3a-0e7093c9-4b207121-9fc0a6cd.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/ped/pedc6b925/sd03e6b53/63036743-d14a06a9-2784f480-257e30e1.jpg b/tests/gen_mimic/images-224/files/ped/pedc6b925/sd03e6b53/63036743-d14a06a9-2784f480-257e30e1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/pf9/pf9374095/s0594dc84/e8aa3601-35458231-e6aa878c-7386bd70.jpg b/tests/gen_mimic/images-224/files/pf9/pf9374095/s0594dc84/e8aa3601-35458231-e6aa878c-7386bd70.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee20271a66a08043486afd57d61c099682e9a018 GIT binary patch literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv b/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv index ba51ed7..9f374ec 100644 --- a/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv +++ b/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv @@ -1,11 +1,11 @@ dicom_id,subject_id,study_id,PerformedProcedureStepDescription,ViewPosition,Rows,Columns,StudyDate,StudyTime,ProcedureCodeSequence_CodeMeaning,ViewCodeSequence_CodeMeaning,PatientOrientationCodeSequence_CodeMeaning -e5ce94fb-90955d5d-5c7a4c11-8db716bb,a70cb8db,07eacc76,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -1f3c638a-e4844bfc-dcbbfc10-8a0cc71c,8ebfeda5,70705588,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -aae03d7a-e16fa38c-8656b49d-9fd28376,ce5242a2,10b21223,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -725fda26-4d46206e-3c37e541-fea8a836,bd6f6445,e3b296ad,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -59d8c93d-a81a8b6f-cf4603aa-58c1bd3f,20b295ad,1427bd21,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -d8f741cc-5a4a1760-b6d254f6-27283d44,41cf86ae,5beae017,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -c64423ec-029fb876-bfca6f94-7c728757,467a0f6a,bf161f1c,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -89aa4a05-4d9851d9-9302caef-06b28de1,24e3a4bb,06eea572,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -2dc30e97-a2a94a74-4338318e-3619c4ae,cd435694,60638bce,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -8ed429bf-3dcf34fb-2f3d28b4-022700b0,758d8d65,47afa62f,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +c5402f0b-2ecf6365-bd88b424-252ad568,085cff35,a433a81c,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +63036743-d14a06a9-2784f480-257e30e1,edc6b925,d03e6b53,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +9160eb4a-257a3140-8f138287-8981fc11,0639398e,ab8e71f2,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +746857e8-930e2b92-830ba925-90a97e7e,67111dd3,97d40f2a,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +1d5cc6d7-8c6bc168-7b694c53-4df47582,182aeefb,5239d871,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +7d4c4448-a12969b6-e4f1fce9-e42b5a6c,88530ff8,732de0c4,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +c94bbfae-e39038df-5b7efb8e-31f9ee55,32b572e6,9ba81d90,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +da54bf19-4bfcbe16-b364a677-b61c0743,636c6ae0,c8cca22c,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +d8d6c36e-f6d5be79-6d8d0627-4d147195,709a3d20,04003d64,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +1c9bdf33-12762299-6e5a617d-b2b0ef88,700bf17d,da301b01,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent diff --git a/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv.gz b/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv.gz index a58a6a45f2fd0459252b7a070dd5d09e962342ff..7301c051704154e947c0d0553c9b3d49f413bdaf 100644 GIT binary patch delta 602 zcmV-g0;T=(1n&d}ABzYGrZABPB7alCY8x>Sz2_@(Y(avNMjDNdCJFSAwk8g}7D+QI zTVijzwh8_F$_|ts5_&OWXGdBw@4b0DGPQa8eG;=j)}PuA=k#!t-=}1)OP`mm%6gfb z%5l-nL7#7R-AFPkQ zNF+AEvGtD8lz>>+HFNXnZu5BkVZFLueYw59Up;;_>y`07oF5qLjT_JN{-Dcj%Wk}; zc`*;#j@vpYUJ(LP3TVZJ0)JGp^@&3d41+~d1a(HGQO!OY0aU6HFU}%60 zmb*jtoGfQ{y*X!qFk@ylrLrd1{aY9#+&!%B|3~F%n7)*!e;A}dJoK{7L$V)gEhE%2 zRND+CCrxT7Ip;*s8Kt2ucT}UoRlOPuqKk5Yl6bcvm178`qmaB9`>wF^b^I)LE oaF@hZUqL$$%K=7Z(9q$DI0E!P9zyJUM delta 605 zcmV-j0;2uz1o8w1ABzYGge8#%B7am(YaB5Qz2{ft*n$nVEPoxBB+x_JF4@p)ktMlI z$?l}HyM+GxdN^Kg{kCu6NkpO>x5dYM_} zxaj7f&$qhgWqLkL^Ui#m^kqHor?c}gzwFJ;{B+#z_GWVma!Ut&wH~Lfnt#7xZf4Pq z{yOT8_4~>BthAeUKhE*qJzUda(%s?fa$4z>^1Z898d)p$W~-|)N)#J86SDWVNXtI8 zW+*#u!!s@`G3R7%KHY5|uRp9;*Q+nL*Y~T(k7m6x0C@i0_};kjJns*>%$9azo94yb zEu)WDz6VaBkX0;*t+N$wV}J9`7IGt|!kCt@vZPdsyB75607I^+HeP zLHW3Cqd`|h>Vo8fz^6{3uq`R3hE;6s0ws)!StB4281EW*fN%i>uk~k$T?mpz!2~X; z4IHvY^tLM%Dj}IBsVBr}G&HD*a7LBgbqoWpX`{Y27E^hc+*zgHmY}@8ZxwEzwK0H8^0>Ze40nM7;sjKsZKn z$V4e-xF`!C9Guo{2~MaYWwaPV3BC+TCSMsx^I0&&RM8|ihPJU@oQ0x-P+PY_xQElz r1U-x?Y&dv<>|Apu$09{iG?=MVf_`xne*gdg|NjF3=0~Co?*#w=;A|x` diff --git a/tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv b/tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv index 9ef6647..9280e00 100644 --- a/tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv +++ b/tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv @@ -1,11 +1,11 @@ subject_id,study_id,Atelectasis,Cardiomegaly,Consolidation,Edema,Enlarged Cardiomediastinum,Fracture,Lung Lesion,Lung Opacity,No Finding,Pleural Effusion,Pleural Other,Pneumonia,Pneumothorax,Support Devices -a70cb8db,07eacc76,0.0,0.0,1.0,,1.0,-1.0,1.0,0.0,-1.0,1.0,-1.0,-1.0,0.0,1.0 -8ebfeda5,70705588,0.0,-1.0,1.0,0.0,-1.0,1.0,0.0,,0.0,1.0,-1.0,-1.0,,-1.0 -ce5242a2,10b21223,0.0,-1.0,1.0,0.0,0.0,,0.0,,,0.0,1.0,1.0,1.0, -bd6f6445,e3b296ad,0.0,,0.0,-1.0,,0.0,,,-1.0,1.0,-1.0,1.0,,1.0 -20b295ad,1427bd21,1.0,1.0,,0.0,-1.0,,0.0,-1.0,1.0,-1.0,,1.0,-1.0,1.0 -41cf86ae,5beae017,0.0,0.0,1.0,,1.0,0.0,0.0,,-1.0,0.0,1.0,-1.0,-1.0, -467a0f6a,bf161f1c,1.0,,1.0,,,0.0,1.0,-1.0,0.0,0.0,0.0,1.0,1.0,0.0 -24e3a4bb,06eea572,0.0,,0.0,1.0,,-1.0,1.0,0.0,,1.0,-1.0,1.0,-1.0,-1.0 -cd435694,60638bce,,,0.0,,,-1.0,-1.0,0.0,1.0,0.0,1.0,,0.0, -758d8d65,47afa62f,0.0,-1.0,,,0.0,0.0,1.0,,-1.0,-1.0,,1.0,,1.0 +085cff35,a433a81c,1.0,0.0,1.0,,,,,1.0,,0.0,0.0,0.0,,1.0 +edc6b925,d03e6b53,0.0,1.0,1.0,-1.0,,,-1.0,-1.0,0.0,-1.0,1.0,0.0,0.0,-1.0 +0639398e,ab8e71f2,,1.0,,1.0,,1.0,,1.0,1.0,0.0,-1.0,1.0,-1.0, +67111dd3,97d40f2a,0.0,0.0,0.0,,0.0,-1.0,1.0,1.0,-1.0,1.0,-1.0,0.0,0.0,0.0 +182aeefb,5239d871,1.0,,0.0,-1.0,0.0,1.0,,0.0,0.0,,,1.0,1.0, +88530ff8,732de0c4,,1.0,-1.0,-1.0,1.0,-1.0,1.0,,1.0,1.0,0.0,-1.0,-1.0,1.0 +32b572e6,9ba81d90,,0.0,,,1.0,,,1.0,0.0,1.0,,-1.0,0.0,0.0 +636c6ae0,c8cca22c,1.0,-1.0,,-1.0,0.0,0.0,-1.0,-1.0,1.0,,,1.0,,-1.0 +709a3d20,04003d64,0.0,1.0,1.0,-1.0,,1.0,,0.0,-1.0,1.0,-1.0,0.0,,-1.0 +700bf17d,da301b01,0.0,0.0,1.0,-1.0,-1.0,,0.0,,-1.0,0.0,1.0,1.0,0.0,1.0 diff --git a/tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv.gz b/tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv.gz index a1b10345efafa83e7695ee55d9b324ad105ee091..267f68ec438b3bcd8c9bf7f9461696873453f82a 100644 GIT binary patch delta 421 zcmV;W0b2gD1GxhRABzYGrZABPAb(NYj+`(Iea~0$0jA1@OL$yuXP;KPEA;~^6Fal1 z7#KlVb^gA?6d33f$>hlKIVZMFz_%WW(T_2P0{1qGzLfYJUZ*suQ z7_`cP`X)hMV>+krcFH+9#gq|DuBa=W14+Y0otu?2Mf#VVu2?QWZG@(TkcFvCWf`!x zTq>_;$Nld?;|4@gDy4`FRDUI9(res5bjMH+^i8c$RwJ{oA=joNTdI5C>24yc_$n%_ z&5iWlLTNOybQ#<|(g*9uewHg?be)%)3#jVrDyW+6<~i&)v+Y0>rf>za1ZSN?t=(n| z>Axf2JmoGWN?D;HeJ#tRG*o2&S*Us#>MFj7$l9xtfY3-)OSKyB2NrUt>|ACn{r~^~ P|NjF3_Z{aTWCH*IGJVY7 delta 414 zcmV;P0b%~R1F{1KABzYGge8#%Ab*idZsRZvhW9#!55N?XtcSBKI_avI7U%&6ltiT( zICfymgXZ>i-NdnzS&$$F{-pS^AKYK^`A-Va=OLWFgU3wu_=bJz;R(Bt+5_#eKEYGl z^lhC2=F~Q@3v@u(H8pm73dN-|Bfo)R;m|e-&r$wpJN$(A;dpGjT>PSc$y3kJa__3( zfLlWEtpWbPCljMhZX?baUnZN`or_sTE>b`ZmRqiMRjmbg$voxSYVypJmP(=o!JQOR zmiO9Of9-NH=7NbvDGgLQxqmenuGK$7est?iF55CW&fMxzB$Tu+NHI6Q>9E$XIx!`D ztPB!pM@U@Qd#dvmONI*+Oc{$j8Uz=G5mET7_68ka*a8xhib_;&ysaTZZRHyK%{9b- zugiQ;r8ZjyhMTf-o?r!V^?SY~#jLJE6^sUDF`|)i0dUP@v&J|f{0{;E0RR630N~m5 IcxVFv02A%Tf&c&j diff --git a/tests/test_dataloaders.py b/tests/test_dataloaders.py index 059bfef..75bdb35 100644 --- a/tests/test_dataloaders.py +++ b/tests/test_dataloaders.py @@ -1,6 +1,7 @@ import pytest import pickle import torchxrayvision as xrv +import os from pathlib import Path dataset_classes = [xrv.datasets.NIH_Dataset, @@ -48,8 +49,9 @@ def test_dataloader_merging_incorrect_alignment(): assert "incorrect pathology alignment" in str(excinfo.value) def test_mimic_tar(): + print(os.getcwd()) #Load tarred and untarred datasets - mimic_test_dir = Path("gen_mimic") + mimic_test_dir = Path("tests/gen_mimic") metacsvpath = mimic_test_dir/"mimic-cxr-2.0.0-metadata.csv" csvpath = mimic_test_dir/"mimic-cxr-2.0.0-negbio.csv" tarred = xrv.datasets.MIMIC_Dataset( From 349babbab70d198ad7e805bb0b048908b73c2704 Mon Sep 17 00:00:00 2001 From: bganglia Date: Sun, 9 Aug 2020 19:56:38 -0400 Subject: [PATCH 14/52] support for tarfiles in NIH dataset --- torchxrayvision/datasets.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index 17ea193..6322f52 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -8,7 +8,6 @@ from tqdm import tqdm import numpy as np from io import BytesIO -import tarfile import os,sys,os.path import pandas as pd import pickle @@ -211,15 +210,18 @@ def __init__(self, imgpath): self.tarred, self.filename_mapping = tarfile_contents[absolute_tarpath] else: self.tarred = tarfile.open(imgpath) - self.tar_paths = self.tarred.getnames() - for tar_path in self.tar_paths: - if tar_path.endswith("jpg"): + tar_infos = self.tarred.getmembers() + print("tarpaths") + for tar_info in tar_infos: + if tar_info.type != "DIRTYPE": + tar_path = tar_info.name tar_path_part, filename = os.path.split(tar_path) for i in range(self.path_length - 1): tar_path_part, filename_part = os.path.split(tar_path_part) filename = os.path.join(filename_part, filename) self.filename_mapping[filename] = tar_path tarfile_contents[absolute_tarpath] = self.tarred, self.filename_mapping + print(self.filename_mapping) else: self.tarred = None @@ -231,7 +233,16 @@ def get_image(self, path): bytes = self.tarred.extractfile(tar_path).read() return np.array(Image.open(BytesIO(bytes))) + def check_paths_exist(self): + #if self.imagezipfile is not None: + + if not (os.path.isdir(self.imgpath) or tarfile.is_tarfile(self.imgpath)): + raise Exception("imgpath must be a directory or tarfile") + if not os.path.isfile(self.csvpath): + raise Exception("csvpath must be a file") + class NIH_Dataset(TarDataset): + path_length = 1 """ NIH ChestX-ray8 dataset From 6999bd3622d359e41e3ea66bff1865819c4488cc Mon Sep 17 00:00:00 2001 From: bganglia Date: Mon, 10 Aug 2020 02:06:28 -0400 Subject: [PATCH 15/52] Inherit from TarDataset in PC_Dataset --- torchxrayvision/datasets.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index 6322f52..41115dc 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -664,7 +664,8 @@ def __getitem__(self, idx): return {"img":img, "lab":self.labels[idx], "idx":idx} -class PC_Dataset(Dataset): +class PC_Dataset(TarDataset): + path_length = 1 """ PadChest dataset Hospital San Juan de Alicante – University of Alicante @@ -687,7 +688,7 @@ def __init__(self, imgpath, seed=0, unique_patients=True): - super(PC_Dataset, self).__init__() + super(PC_Dataset, self).__init__(imgpath) np.random.seed(seed) # Reset the seed so all runs are the same. self.pathologies = ["Atelectasis", "Consolidation", "Infiltration", From 842ddf8f923f568709a16428b24697a7078c8826 Mon Sep 17 00:00:00 2001 From: bganglia Date: Mon, 10 Aug 2020 04:48:58 -0400 Subject: [PATCH 16/52] Storage-agnostic dataset --- torchxrayvision/datasets.py | 86 +++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index 41115dc..66fe001 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -199,7 +199,93 @@ def __len__(self): def __getitem__(self, idx): return self.dataset[self.idxs[idx]] +class CompressedInterface: + def __init__(self, filename): + self.compressed, self.filename_mapping = self.get_cached_filename_mapping() + if self.compressed is None: + self.compressed, self.filename_mapping = self.index(filename) + def get_cached_filename_mapping(self): + pass + def get_image(self, imgid): + archive_path = self.filename_mapping[imgid] + return self.extract_from_file(archive_path) + +def last_n_in_filepath(filepath, n): + if n < 1: + return "" + start_part, end_part = os.path.split(filepath) + for i in range(n - 1): + start_part, middle_part = os.path.split(start_part) + end_part = os.path.join(middle_part, end_part) + return end_part + +class TarInterface(CompressedInterface): + @classmethod + def matches(cls, filename): + return tarfile.is_tarfile(filename) + def index(self, imgpath): + compressed = tarfile.open(imgpath) + tar_infos = compressed.getmembers() + filename_mapping = {} + for tar_info in tar_infos: + if tar_info.type != "DIRTYPE": + tar_path = tar_info.name + imgid = last_n_in_filepath(tar_path) + filename_mapping[imgid] = tar_path + return compressed, filename_mapping +# tarfile_contents[absolute_tarpath] = self.tarred, self.filename_mapping + def extract_from_file(self, tar_path): + bytes = self.compressed.extractfile(tar_path).read() + return np.array(Image.open(BytesIO(bytes))) + +class ZipInterface(CompressedInterface): + @classmethod + def matches(cls, filename): + return zipfile.is_zipfile(filename) + def index(self, imgpath): + compressed = ZipFile(imgpath) + zip_infos = compressed.infolist() + for zip_info in zip_infos: + if not zip_info.is_dir(): + zip_path = zip_path.filename + imgid = last_n_in_filepath(zip_path) + filename_mapping[imgid] = zip_path + def extract_from_file(self, zip_path): + bytes = self.compressed.open(zip_path) + return np.array(Image.open(BytesIO(bytes)) + +class FolderInterface: + @classmethod + def matches(cls, filename): + return os.path.is_dir(filename) + def __init__(self, path): + self.path = path + def get_image(self, imgid): + return imread(os.path.join(self.path, imgid)) + +class StorageAgnosticDataset: + path_length = None + def __init__(self): + interfaces = [FolderInterface, TarInterface, ZipInterface] + for interface in self.interfaces: + if interface.matches(filename): + self.interface = interface(filename, self.path_length) + #else: + # raise ValueError("No matching interface for {}".format(filename)) + +class ZipDataset(Dataset): + def __init__(self, imgpath): + pass + class TarDataset(Dataset): + def is_compressed(self, filename): + return tarfile.is_tarfile(filename) + def index_files(self): + tar_path = self.filename_mapping[path] + bytes = self.tarred.extractfile(tar_path).read() + return np.array(Image.open(BytesIO(bytes))) + +class TarDatasetOriginal(Dataset): path_length = None def __init__(self, imgpath): self.filename_mapping = {} From 37afa4e51d1ac277cd555d02e69d9a2951a3243e Mon Sep 17 00:00:00 2001 From: bganglia Date: Mon, 10 Aug 2020 14:24:47 -0400 Subject: [PATCH 17/52] Inherit from storage agnostic loader --- torchxrayvision/datasets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index 66fe001..757ba6c 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -277,7 +277,7 @@ class ZipDataset(Dataset): def __init__(self, imgpath): pass -class TarDataset(Dataset): +class TarDataset(StorageAgnosticDataset): def is_compressed(self, filename): return tarfile.is_tarfile(filename) def index_files(self): From bbd4007b284703ede5634029b958215b1a1456d6 Mon Sep 17 00:00:00 2001 From: bganglia Date: Mon, 10 Aug 2020 17:41:32 -0400 Subject: [PATCH 18/52] tidy up tarfile code --- torchxrayvision/datasets.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index 757ba6c..2c393ee 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -200,12 +200,13 @@ def __getitem__(self, idx): return self.dataset[self.idxs[idx]] class CompressedInterface: - def __init__(self, filename): + def __init__(self, filename, path_length): + self.path_length = path_length self.compressed, self.filename_mapping = self.get_cached_filename_mapping() if self.compressed is None: self.compressed, self.filename_mapping = self.index(filename) def get_cached_filename_mapping(self): - pass + return None, None def get_image(self, imgid): archive_path = self.filename_mapping[imgid] return self.extract_from_file(archive_path) @@ -230,7 +231,7 @@ def index(self, imgpath): for tar_info in tar_infos: if tar_info.type != "DIRTYPE": tar_path = tar_info.name - imgid = last_n_in_filepath(tar_path) + imgid = last_n_in_filepath(tar_path, self.path_length) filename_mapping[imgid] = tar_path return compressed, filename_mapping # tarfile_contents[absolute_tarpath] = self.tarred, self.filename_mapping @@ -252,22 +253,22 @@ def index(self, imgpath): filename_mapping[imgid] = zip_path def extract_from_file(self, zip_path): bytes = self.compressed.open(zip_path) - return np.array(Image.open(BytesIO(bytes)) + return np.array(Image.open(BytesIO(bytes))) class FolderInterface: @classmethod def matches(cls, filename): - return os.path.is_dir(filename) - def __init__(self, path): + return os.path.isdir(filename) + def __init__(self, path, *args): self.path = path def get_image(self, imgid): return imread(os.path.join(self.path, imgid)) class StorageAgnosticDataset: path_length = None - def __init__(self): + def __init__(self, filename): interfaces = [FolderInterface, TarInterface, ZipInterface] - for interface in self.interfaces: + for interface in interfaces: if interface.matches(filename): self.interface = interface(filename, self.path_length) #else: @@ -971,7 +972,7 @@ def __getitem__(self, idx): return {"img":img, "lab":self.labels[idx], "idx":idx} -class MIMIC_Dataset(TarDataset): +class MIMIC_Dataset(StorageAgnosticDataset): path_length = 4 """ Johnson AE, Pollard TJ, Berkowitz S, Greenbaum NR, Lungren MP, Deng CY, Mark RG, Horng S. MIMIC-CXR: A large publicly available database of labeled chest radiographs. arXiv preprint arXiv:1901.07042. 2019 Jan 21. @@ -1065,7 +1066,7 @@ def get_imgid(self, idx): def __getitem__(self, idx): img_fname = self.get_imgid(idx) - img = self.get_image(img_fname) + img = self.interface.get_image(img_fname) img = normalize(img, self.MAXVAL) # Check that images are 2D arrays From 34daddb2551821cce5b5e5d13f7c4b7bba10b56e Mon Sep 17 00:00:00 2001 From: bganglia Date: Mon, 10 Aug 2020 17:44:57 -0400 Subject: [PATCH 19/52] remove previous TarDataset, ZipDataset classes --- torchxrayvision/datasets.py | 60 +++++-------------------------------- 1 file changed, 7 insertions(+), 53 deletions(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index 2c393ee..3158eda 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -274,59 +274,13 @@ def __init__(self, filename): #else: # raise ValueError("No matching interface for {}".format(filename)) -class ZipDataset(Dataset): - def __init__(self, imgpath): - pass - -class TarDataset(StorageAgnosticDataset): - def is_compressed(self, filename): - return tarfile.is_tarfile(filename) - def index_files(self): - tar_path = self.filename_mapping[path] - bytes = self.tarred.extractfile(tar_path).read() - return np.array(Image.open(BytesIO(bytes))) - -class TarDatasetOriginal(Dataset): - path_length = None - def __init__(self, imgpath): - self.filename_mapping = {} - if not os.path.isdir(imgpath): - self.tarred = tarfile.open(imgpath) - absolute_tarpath = os.path.abspath(imgpath) - if absolute_tarpath in tarfile_contents: - self.tarred, self.filename_mapping = tarfile_contents[absolute_tarpath] - else: - self.tarred = tarfile.open(imgpath) - tar_infos = self.tarred.getmembers() - print("tarpaths") - for tar_info in tar_infos: - if tar_info.type != "DIRTYPE": - tar_path = tar_info.name - tar_path_part, filename = os.path.split(tar_path) - for i in range(self.path_length - 1): - tar_path_part, filename_part = os.path.split(tar_path_part) - filename = os.path.join(filename_part, filename) - self.filename_mapping[filename] = tar_path - tarfile_contents[absolute_tarpath] = self.tarred, self.filename_mapping - print(self.filename_mapping) - else: - self.tarred = None - - def get_image(self, path): - if self.tarred is None: - return imread(os.path.join(self.imgpath, path)) - else: - tar_path = self.filename_mapping[path] - bytes = self.tarred.extractfile(tar_path).read() - return np.array(Image.open(BytesIO(bytes))) - - def check_paths_exist(self): - #if self.imagezipfile is not None: - - if not (os.path.isdir(self.imgpath) or tarfile.is_tarfile(self.imgpath)): - raise Exception("imgpath must be a directory or tarfile") - if not os.path.isfile(self.csvpath): - raise Exception("csvpath must be a file") + #def check_paths_exist(self): + # #if self.imagezipfile is not None: + # + # if not (os.path.isdir(self.imgpath) or tarfile.is_tarfile(self.imgpath)): + # raise Exception("imgpath must be a directory or tarfile") + # if not os.path.isfile(self.csvpath): + # raise Exception("csvpath must be a file") class NIH_Dataset(TarDataset): path_length = 1 From 727d9ffb8e35dedf2e1962186cce8192f2858f9c Mon Sep 17 00:00:00 2001 From: bganglia Date: Thu, 13 Aug 2020 18:13:36 -0400 Subject: [PATCH 20/52] Scripts for generating test data --- tests/gen_mimic.py | 25 +++++++++++-------------- tests/generate_all.sh | 2 ++ tests/generate_test_data.py | 29 +++++++++++++++++++++++++++++ tests/generate_test_data.sh | 2 ++ 4 files changed, 44 insertions(+), 14 deletions(-) create mode 100644 tests/generate_all.sh create mode 100644 tests/generate_test_data.py create mode 100644 tests/generate_test_data.sh diff --git a/tests/gen_mimic.py b/tests/gen_mimic.py index c7a843c..99f3746 100644 --- a/tests/gen_mimic.py +++ b/tests/gen_mimic.py @@ -8,6 +8,8 @@ from pathlib import Path import os +from random_data import write_random_images + def show(x): print(x) return x @@ -91,35 +93,30 @@ def random_pred(): return pd.DataFrame(meta_rows), pd.DataFrame(csv_rows) -def generate_random_image(dimensions): - return Image.fromarray(np.random.random(dimensions)).convert("L") -def generate_test_images(random_metadata, extracted, tarname, dimensions): +def generate_test_images(random_metadata, extracted, tarname, zipname, dimensions): + paths = [] for _, row in random_metadata.iterrows(): subjectid = row["subject_id"] studyid = row["study_id"] dicom_id = row["dicom_id"] img_fname = os.path.join("p" + subjectid[:2], "p" + subjectid, "s" + studyid, dicom_id + ".jpg") - print(type(extracted)) - img_path = extracted/"files"/img_fname - print(img_path) - os.makedirs(os.path.dirname(img_path)) - generate_random_image(dimensions).save(img_path) - tarred = tarfile.TarFile.open(tarname, "w") - tarred.add(extracted) - tarred.close() - -def generate_test_data(n, directory, dimensions=(224, 224), tarname=None, extracted=None): + paths.append(Path("files")/img_fname) + write_random_images(paths, extracted, tarname, zipname, dimensions) + +def generate_test_data(n, directory, dimensions=(224, 224), tarname=None, zipname=None, extracted=None): directory = Path(directory) if tarname is None: tarname = directory/"images-224.tar" + if zipname is None: + zipname = directory/"images-224.zip" if extracted is None: extracted = directory/"images-224" random_metadata, random_csvdata = generate_random_metadata( n, dimensions ) - generate_test_images(random_metadata, extracted, tarname, dimensions) + generate_test_images(random_metadata, extracted, tarname, zipname, dimensions) random_metadata.to_csv( directory/mimic_metadata_filename, index=False diff --git a/tests/generate_all.sh b/tests/generate_all.sh new file mode 100644 index 0000000..12d0400 --- /dev/null +++ b/tests/generate_all.sh @@ -0,0 +1,2 @@ +bash gen_mimic.sh +bash generate_test_data.sh diff --git a/tests/generate_test_data.py b/tests/generate_test_data.py new file mode 100644 index 0000000..e67994c --- /dev/null +++ b/tests/generate_test_data.py @@ -0,0 +1,29 @@ +from pathlib import Path +import pandas as pd +from random_data import write_random_images +import argparse + +def generate_test_data(metadata_file, filename_column, size, test_data_folder): + test_data_folder = Path(test_data_folder) + write_random_images( + metadata_file[filename_column], + test_data_folder/"folder", + test_data_folder/"tar.tar", + test_data_folder/"zip.zip", + size + ) + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("metadata_file") + parser.add_argument("filename_column") + parser.add_argument("x") + parser.add_argument("y") + parser.add_argument("test_data_folder") + args = parser.parse_args() + generate_test_data( + pd.read_csv(args.metadata_file), + args.filename_column, + (int(args.x), int(args.y)), + args.test_data_folder + ) diff --git a/tests/generate_test_data.sh b/tests/generate_test_data.sh new file mode 100644 index 0000000..9f86be0 --- /dev/null +++ b/tests/generate_test_data.sh @@ -0,0 +1,2 @@ +python3 generate_test_data.py pc.csv ImageID 2 2 PC_test_data +python3 generate_test_data.py nih.csv "Image Index" 2 2 NIH_test_data From d2ae7c0d3e0ef1cd3581a87d25a10cdc61b4f383 Mon Sep 17 00:00:00 2001 From: bganglia Date: Thu, 13 Aug 2020 18:13:52 -0400 Subject: [PATCH 21/52] Test data --- tests/NIH_test_data/folder/00000001_000.png | Bin 0 -> 71 bytes tests/NIH_test_data/folder/00000002_000.png | Bin 0 -> 71 bytes tests/NIH_test_data/folder/00000003_001.png | Bin 0 -> 71 bytes tests/NIH_test_data/folder/00000005_000.png | Bin 0 -> 71 bytes tests/NIH_test_data/folder/00000006_000.png | Bin 0 -> 71 bytes tests/NIH_test_data/folder/00000007_000.png | Bin 0 -> 71 bytes tests/NIH_test_data/folder/00000008_000.png | Bin 0 -> 71 bytes tests/NIH_test_data/folder/00000009_000.png | Bin 0 -> 71 bytes tests/NIH_test_data/folder/00000010_000.png | Bin 0 -> 71 bytes tests/NIH_test_data/folder/00000011_000.png | Bin 0 -> 71 bytes tests/NIH_test_data/tar.tar | Bin 0 -> 20480 bytes tests/NIH_test_data/zip.zip | Bin 0 -> 2232 bytes ...2752528732526839762067921423608_ag14ef.png | Bin 0 -> 71 bytes ...1943505747025890313053997514922_j5rk5q.png | Bin 0 -> 71 bytes ...2586879524468475227325378905558_f8k8bq.png | Bin 0 -> 71 bytes ...076187734852011294130558067_00-193-087.png | Bin 0 -> 71 bytes ...199786354762011304090209759_01-001-141.png | Bin 0 -> 71 bytes ...534861372972012353112932019_01-129-187.png | Bin 0 -> 71 bytes ...663026955732013130130708697_02-042-053.png | Bin 0 -> 71 bytes ...1619038978339766780609910437168_fgj94z.png | Bin 0 -> 71 bytes ...4815157573909341904878106290504_erj1pn.png | Bin 0 -> 71 bytes ...4749794028912525116839151974960_vsaz23.png | Bin 0 -> 71 bytes tests/PC_test_data/tar.tar | Bin 0 -> 20480 bytes tests/PC_test_data/zip.zip | Bin 0 -> 2970 bytes tests/gen_mimic/images-224.tar | Bin 102400 -> 40960 bytes tests/gen_mimic/images-224.zip | Bin 0 -> 16652 bytes .../9622b5f2-3a3e307e-f5ca9164-375a6f70.jpg} | Bin .../7e393cbe-6eac27c9-469708b4-dc5f22ef.jpg} | Bin .../dc7a8b5e-4ad1afd8-8f994433-643c39f8.jpg} | Bin .../b69fd4aa-55745241-f15af2bb-b979004a.jpg} | Bin .../4197fbbc-1ed2f09e-8a82308b-971009a3.jpg} | Bin .../8cf7e7b2-46bdc39f-31564b20-71ee6b6d.jpg} | Bin .../67dc7d13-32da76c2-ff22a175-5d4c3ced.jpg} | Bin .../baf27490-fe6678a0-fe0b7379-665d78ba.jpg} | Bin .../da54bf19-4bfcbe16-b364a677-b61c0743.jpg | Bin 920 -> 0 bytes .../8e497ccd-3f13f600-4a7be3d5-0c1f4f09.jpg | Bin 920 -> 0 bytes .../746857e8-930e2b92-830ba925-90a97e7e.jpg | Bin 920 -> 0 bytes .../1c9bdf33-12762299-6e5a617d-b2b0ef88.jpg | Bin 920 -> 0 bytes .../d8d6c36e-f6d5be79-6d8d0627-4d147195.jpg | Bin 920 -> 0 bytes .../539b692a-b6898b10-4bffba19-dbbbcdbc.jpg | Bin 920 -> 0 bytes .../128f28cd-e4215d7d-771984af-284d8ab6.jpg | Bin 920 -> 0 bytes .../7d4c4448-a12969b6-e4f1fce9-e42b5a6c.jpg | Bin 920 -> 0 bytes .../9fc08fe8-b4daf852-5856bd9f-47779547.jpg | Bin 920 -> 0 bytes .../58d68a58-fbbcf857-4b8ad963-96e4235d.jpg | Bin 920 -> 0 bytes .../2fd58d4d-c55d0cea-34a82d0e-a2c4b459.jpg | Bin 920 -> 0 bytes .../2f11d734-8472ea74-d140dc70-3cd25400.jpg | Bin 920 -> 0 bytes .../50541878-d32e3a22-7b9c4f64-d8458be4.jpg | Bin 920 -> 0 bytes .../8e03f255-4835baa1-1d55bf2f-1afdeb17.jpg | Bin 920 -> 0 bytes .../f061d04c-add9919d-f1f8c039-0350cfbe.jpg | Bin 920 -> 0 bytes .../60313569-aab4439a-36680145-8f0c90c3.jpg | Bin 920 -> 0 bytes .../6a301286-456d8528-c59bd118-195ce98c.jpg} | Bin .../a0082cb3-93689ac6-4fbbad4e-ddd68866.jpg} | Bin .../35c7d685-56e7291c-75f30590-cd6e143e.jpg | Bin 920 -> 0 bytes .../4c112d3a-0e7093c9-4b207121-9fc0a6cd.jpg | Bin 920 -> 0 bytes .../63036743-d14a06a9-2784f480-257e30e1.jpg | Bin 920 -> 0 bytes .../e8aa3601-35458231-e6aa878c-7386bd70.jpg | Bin 920 -> 0 bytes tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv | 20 +++++++++--------- .../gen_mimic/mimic-cxr-2.0.0-metadata.csv.gz | Bin 623 -> 624 bytes tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv | 20 +++++++++--------- tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv.gz | Bin 441 -> 435 bytes 60 files changed, 20 insertions(+), 20 deletions(-) create mode 100644 tests/NIH_test_data/folder/00000001_000.png create mode 100644 tests/NIH_test_data/folder/00000002_000.png create mode 100644 tests/NIH_test_data/folder/00000003_001.png create mode 100644 tests/NIH_test_data/folder/00000005_000.png create mode 100644 tests/NIH_test_data/folder/00000006_000.png create mode 100644 tests/NIH_test_data/folder/00000007_000.png create mode 100644 tests/NIH_test_data/folder/00000008_000.png create mode 100644 tests/NIH_test_data/folder/00000009_000.png create mode 100644 tests/NIH_test_data/folder/00000010_000.png create mode 100644 tests/NIH_test_data/folder/00000011_000.png create mode 100644 tests/NIH_test_data/tar.tar create mode 100644 tests/NIH_test_data/zip.zip create mode 100644 tests/PC_test_data/folder/117677712752528732526839762067921423608_ag14ef.png create mode 100644 tests/PC_test_data/folder/125374151943505747025890313053997514922_j5rk5q.png create mode 100644 tests/PC_test_data/folder/12986792586879524468475227325378905558_f8k8bq.png create mode 100644 tests/PC_test_data/folder/216840111366964013076187734852011294130558067_00-193-087.png create mode 100644 tests/PC_test_data/folder/216840111366964013199786354762011304090209759_01-001-141.png create mode 100644 tests/PC_test_data/folder/216840111366964013534861372972012353112932019_01-129-187.png create mode 100644 tests/PC_test_data/folder/216840111366964013663026955732013130130708697_02-042-053.png create mode 100644 tests/PC_test_data/folder/300276821619038978339766780609910437168_fgj94z.png create mode 100644 tests/PC_test_data/folder/318099584815157573909341904878106290504_erj1pn.png create mode 100644 tests/PC_test_data/folder/336326204749794028912525116839151974960_vsaz23.png create mode 100644 tests/PC_test_data/tar.tar create mode 100644 tests/PC_test_data/zip.zip create mode 100644 tests/gen_mimic/images-224.zip rename tests/gen_mimic/images-224/files/{p06/p0639398e/sab8e71f2/9160eb4a-257a3140-8f138287-8981fc11.jpg => p11/p11a8f57f/sbf2ecf26/9622b5f2-3a3e307e-f5ca9164-375a6f70.jpg} (100%) rename tests/gen_mimic/images-224/files/{p07/p070736c2/scfed7491/15288759-57edea0b-9556a29d-43cbc54c.jpg => p31/p310345ea/s274bcf57/7e393cbe-6eac27c9-469708b4-dc5f22ef.jpg} (100%) rename tests/gen_mimic/images-224/files/{p08/p085cff35/sa433a81c/c5402f0b-2ecf6365-bd88b424-252ad568.jpg => p34/p346b3f01/s14b48a44/dc7a8b5e-4ad1afd8-8f994433-643c39f8.jpg} (100%) rename tests/gen_mimic/images-224/files/{p10/p10951197/s09d439f2/73f3a8fa-928c521d-4599c566-75198031.jpg => p3b/p3b3b7d36/sf076c36f/b69fd4aa-55745241-f15af2bb-b979004a.jpg} (100%) rename tests/gen_mimic/images-224/files/{p18/p182aeefb/s5239d871/1d5cc6d7-8c6bc168-7b694c53-4df47582.jpg => p3d/p3d404d22/s1e752e16/4197fbbc-1ed2f09e-8a82308b-971009a3.jpg} (100%) rename tests/gen_mimic/images-224/files/{p18/p185cb7da/sbb1658cc/d919ac9d-8b492a3e-c3485f4f-94e73865.jpg => p4e/p4eedf9fe/sf8521632/8cf7e7b2-46bdc39f-31564b20-71ee6b6d.jpg} (100%) rename tests/gen_mimic/images-224/files/{p1a/p1a0cf2f8/s7945e2fa/b2d07eff-cd883d7d-3a00fd7a-e227a420.jpg => p54/p54e08d2a/s1c41417d/67dc7d13-32da76c2-ff22a175-5d4c3ced.jpg} (100%) rename tests/gen_mimic/images-224/files/{p2d/p2da2ef62/s6b392830/00e45f48-7a73e69b-1cbe72d4-7259c959.jpg => p61/p6145fd64/s7968e508/baf27490-fe6678a0-fe0b7379-665d78ba.jpg} (100%) delete mode 100644 tests/gen_mimic/images-224/files/p63/p636c6ae0/sc8cca22c/da54bf19-4bfcbe16-b364a677-b61c0743.jpg delete mode 100644 tests/gen_mimic/images-224/files/p66/p667bdc12/s4a6038b8/8e497ccd-3f13f600-4a7be3d5-0c1f4f09.jpg delete mode 100644 tests/gen_mimic/images-224/files/p67/p67111dd3/s97d40f2a/746857e8-930e2b92-830ba925-90a97e7e.jpg delete mode 100644 tests/gen_mimic/images-224/files/p70/p700bf17d/sda301b01/1c9bdf33-12762299-6e5a617d-b2b0ef88.jpg delete mode 100644 tests/gen_mimic/images-224/files/p70/p709a3d20/s04003d64/d8d6c36e-f6d5be79-6d8d0627-4d147195.jpg delete mode 100644 tests/gen_mimic/images-224/files/p78/p78ae70f1/s4728d107/539b692a-b6898b10-4bffba19-dbbbcdbc.jpg delete mode 100644 tests/gen_mimic/images-224/files/p7a/p7a77c130/s0d554684/128f28cd-e4215d7d-771984af-284d8ab6.jpg delete mode 100644 tests/gen_mimic/images-224/files/p88/p88530ff8/s732de0c4/7d4c4448-a12969b6-e4f1fce9-e42b5a6c.jpg delete mode 100644 tests/gen_mimic/images-224/files/p8c/p8c386642/sfee5823a/9fc08fe8-b4daf852-5856bd9f-47779547.jpg delete mode 100644 tests/gen_mimic/images-224/files/p9c/p9c79a08a/s1449fb9b/58d68a58-fbbcf857-4b8ad963-96e4235d.jpg delete mode 100644 tests/gen_mimic/images-224/files/p9e/p9e594eaa/s4e29dfa2/2fd58d4d-c55d0cea-34a82d0e-a2c4b459.jpg delete mode 100644 tests/gen_mimic/images-224/files/pa0/pa06d0acc/s216e34ff/2f11d734-8472ea74-d140dc70-3cd25400.jpg delete mode 100644 tests/gen_mimic/images-224/files/pa1/pa1bdabdf/s82aa1e1e/50541878-d32e3a22-7b9c4f64-d8458be4.jpg delete mode 100644 tests/gen_mimic/images-224/files/pa2/pa282b0a5/s2305b6b1/8e03f255-4835baa1-1d55bf2f-1afdeb17.jpg delete mode 100644 tests/gen_mimic/images-224/files/pb9/pb946092a/s8ad7a2d0/f061d04c-add9919d-f1f8c039-0350cfbe.jpg delete mode 100644 tests/gen_mimic/images-224/files/pbb/pbb35aad3/s07e14baf/60313569-aab4439a-36680145-8f0c90c3.jpg rename tests/gen_mimic/images-224/files/{p32/p32b572e6/s9ba81d90/c94bbfae-e39038df-5b7efb8e-31f9ee55.jpg => pbc/pbc0ee611/s89cfed09/6a301286-456d8528-c59bd118-195ce98c.jpg} (100%) rename tests/gen_mimic/images-224/files/{p3d/p3dc9cdc5/sd00f6a73/a59fc947-4912d84a-f6ace88d-1ccdf143.jpg => pbf/pbfb2d1b6/s2c5d98ee/a0082cb3-93689ac6-4fbbad4e-ddd68866.jpg} (100%) delete mode 100644 tests/gen_mimic/images-224/files/pd6/pd65ae44e/s82475404/35c7d685-56e7291c-75f30590-cd6e143e.jpg delete mode 100644 tests/gen_mimic/images-224/files/pe0/pe0be2169/sd0ff5abb/4c112d3a-0e7093c9-4b207121-9fc0a6cd.jpg delete mode 100644 tests/gen_mimic/images-224/files/ped/pedc6b925/sd03e6b53/63036743-d14a06a9-2784f480-257e30e1.jpg delete mode 100644 tests/gen_mimic/images-224/files/pf9/pf9374095/s0594dc84/e8aa3601-35458231-e6aa878c-7386bd70.jpg diff --git a/tests/NIH_test_data/folder/00000001_000.png b/tests/NIH_test_data/folder/00000001_000.png new file mode 100644 index 0000000000000000000000000000000000000000..67f57105c8887d2760a5eddd8e646fdc964287fc GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^Od!kwBpAZ)2K@k1e4Z|jAr*6y6F>mSXJcS2YMS{9 P$YStx^>bP0l+XkK&Y}-r literal 0 HcmV?d00001 diff --git a/tests/NIH_test_data/folder/00000002_000.png b/tests/NIH_test_data/folder/00000002_000.png new file mode 100644 index 0000000000000000000000000000000000000000..67f57105c8887d2760a5eddd8e646fdc964287fc GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^Od!kwBpAZ)2K@k1e4Z|jAr*6y6F>mSXJcS2YMS{9 P$YStx^>bP0l+XkK&Y}-r literal 0 HcmV?d00001 diff --git a/tests/NIH_test_data/folder/00000003_001.png b/tests/NIH_test_data/folder/00000003_001.png new file mode 100644 index 0000000000000000000000000000000000000000..67f57105c8887d2760a5eddd8e646fdc964287fc GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^Od!kwBpAZ)2K@k1e4Z|jAr*6y6F>mSXJcS2YMS{9 P$YStx^>bP0l+XkK&Y}-r literal 0 HcmV?d00001 diff --git a/tests/NIH_test_data/folder/00000005_000.png b/tests/NIH_test_data/folder/00000005_000.png new file mode 100644 index 0000000000000000000000000000000000000000..67f57105c8887d2760a5eddd8e646fdc964287fc GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^Od!kwBpAZ)2K@k1e4Z|jAr*6y6F>mSXJcS2YMS{9 P$YStx^>bP0l+XkK&Y}-r literal 0 HcmV?d00001 diff --git a/tests/NIH_test_data/folder/00000006_000.png b/tests/NIH_test_data/folder/00000006_000.png new file mode 100644 index 0000000000000000000000000000000000000000..67f57105c8887d2760a5eddd8e646fdc964287fc GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^Od!kwBpAZ)2K@k1e4Z|jAr*6y6F>mSXJcS2YMS{9 P$YStx^>bP0l+XkK&Y}-r literal 0 HcmV?d00001 diff --git a/tests/NIH_test_data/folder/00000007_000.png b/tests/NIH_test_data/folder/00000007_000.png new file mode 100644 index 0000000000000000000000000000000000000000..67f57105c8887d2760a5eddd8e646fdc964287fc GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^Od!kwBpAZ)2K@k1e4Z|jAr*6y6F>mSXJcS2YMS{9 P$YStx^>bP0l+XkK&Y}-r literal 0 HcmV?d00001 diff --git a/tests/NIH_test_data/folder/00000008_000.png b/tests/NIH_test_data/folder/00000008_000.png new file mode 100644 index 0000000000000000000000000000000000000000..67f57105c8887d2760a5eddd8e646fdc964287fc GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^Od!kwBpAZ)2K@k1e4Z|jAr*6y6F>mSXJcS2YMS{9 P$YStx^>bP0l+XkK&Y}-r literal 0 HcmV?d00001 diff --git a/tests/NIH_test_data/folder/00000009_000.png b/tests/NIH_test_data/folder/00000009_000.png new file mode 100644 index 0000000000000000000000000000000000000000..67f57105c8887d2760a5eddd8e646fdc964287fc GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^Od!kwBpAZ)2K@k1e4Z|jAr*6y6F>mSXJcS2YMS{9 P$YStx^>bP0l+XkK&Y}-r literal 0 HcmV?d00001 diff --git a/tests/NIH_test_data/folder/00000010_000.png b/tests/NIH_test_data/folder/00000010_000.png new file mode 100644 index 0000000000000000000000000000000000000000..67f57105c8887d2760a5eddd8e646fdc964287fc GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^Od!kwBpAZ)2K@k1e4Z|jAr*6y6F>mSXJcS2YMS{9 P$YStx^>bP0l+XkK&Y}-r literal 0 HcmV?d00001 diff --git a/tests/NIH_test_data/folder/00000011_000.png b/tests/NIH_test_data/folder/00000011_000.png new file mode 100644 index 0000000000000000000000000000000000000000..67f57105c8887d2760a5eddd8e646fdc964287fc GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^Od!kwBpAZ)2K@k1e4Z|jAr*6y6F>mSXJcS2YMS{9 P$YStx^>bP0l+XkK&Y}-r literal 0 HcmV?d00001 diff --git a/tests/NIH_test_data/tar.tar b/tests/NIH_test_data/tar.tar new file mode 100644 index 0000000000000000000000000000000000000000..12ffa330384e1f04d8fb1e5aaf98550d4e239d5a GIT binary patch literal 20480 zcmeI0K}y3w6oy9^B87SYSJ?~gOwyUrrBbok1Svw7ZLn2@+Lkm0m(ra_5IloR@8ZG> zcmkJBpxsCug|=@-{2zpuChffBoA;4PlepE*2h+UUPxG{XH6Hc{S)HvnxCyN#yEnsj zUS1EDxj4QECL%3l6iJgA4}}UN7RdEpM)_#7X`W_5z$WQzSi2o(+0Ar3D*5V9=a)CK z%q2tkcql2G|HVB-UCu>qGP+*z!i(XQYJ5BYg6l8yA4x4(z*nsMtDpb#`F}W1&Z?FD zieXiaTg|q~+r_q9!0WuVKTO(-o5vS-PnW$S%;z1pmCYaD%^r(SljieDZ(i&p{vZLH z|A)qZ?#h1&|0&uD{!>u)w}!=k!5#Xq6#S>?8u(8^+20yA|AkBcHT;QfE|eFOhD&)DY*HvgSI|FQljX&d-Yg4x?5HvdD1&wqvWKS|HPe-g~z z7P0xS9r~{uSpQQr4g9B|>~9U5|I(%ZA^fN48u(8^+20yA|BqbykN1C)rh)$?m{9}- zKmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l J00h=b;1jw_OTYjC literal 0 HcmV?d00001 diff --git a/tests/NIH_test_data/zip.zip b/tests/NIH_test_data/zip.zip new file mode 100644 index 0000000000000000000000000000000000000000..6b85cbaec75bd607cf5bd19837eef8f2d9afa1b0 GIT binary patch literal 2232 zcmWIWW@Zs#0D<6%yn#Y59~!s=*&wV6#D1P0@g=FnCGjbVC5ifJ`8g@6MfwI1U>t8? zV5nD+m);rR=g!L|#RXK)>*?VV1f-cjm;*>Kgx?MN0i^gmT^vIy<|HS80Fckdz*y8Y z^A(WA;OXk;vd$@?DS&L3SO8sOFc@57XfSA8VmMe_Vqi9CTrzmV#AwijiTR*$iRqwm zi6zxt!pJ1TjJuQtm4YC!r4d9DRpthG6KiA_0VCmsC-Fv#FyeJ3q7)?F$aw^eglApi zjnn{ELioZGUM>-Dtm4*<=?^ymNp literal 0 HcmV?d00001 diff --git a/tests/PC_test_data/folder/117677712752528732526839762067921423608_ag14ef.png b/tests/PC_test_data/folder/117677712752528732526839762067921423608_ag14ef.png new file mode 100644 index 0000000000000000000000000000000000000000..67f57105c8887d2760a5eddd8e646fdc964287fc GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^Od!kwBpAZ)2K@k1e4Z|jAr*6y6F>mSXJcS2YMS{9 P$YStx^>bP0l+XkK&Y}-r literal 0 HcmV?d00001 diff --git a/tests/PC_test_data/folder/125374151943505747025890313053997514922_j5rk5q.png b/tests/PC_test_data/folder/125374151943505747025890313053997514922_j5rk5q.png new file mode 100644 index 0000000000000000000000000000000000000000..67f57105c8887d2760a5eddd8e646fdc964287fc GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^Od!kwBpAZ)2K@k1e4Z|jAr*6y6F>mSXJcS2YMS{9 P$YStx^>bP0l+XkK&Y}-r literal 0 HcmV?d00001 diff --git a/tests/PC_test_data/folder/12986792586879524468475227325378905558_f8k8bq.png b/tests/PC_test_data/folder/12986792586879524468475227325378905558_f8k8bq.png new file mode 100644 index 0000000000000000000000000000000000000000..67f57105c8887d2760a5eddd8e646fdc964287fc GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^Od!kwBpAZ)2K@k1e4Z|jAr*6y6F>mSXJcS2YMS{9 P$YStx^>bP0l+XkK&Y}-r literal 0 HcmV?d00001 diff --git a/tests/PC_test_data/folder/216840111366964013076187734852011294130558067_00-193-087.png b/tests/PC_test_data/folder/216840111366964013076187734852011294130558067_00-193-087.png new file mode 100644 index 0000000000000000000000000000000000000000..67f57105c8887d2760a5eddd8e646fdc964287fc GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^Od!kwBpAZ)2K@k1e4Z|jAr*6y6F>mSXJcS2YMS{9 P$YStx^>bP0l+XkK&Y}-r literal 0 HcmV?d00001 diff --git a/tests/PC_test_data/folder/216840111366964013199786354762011304090209759_01-001-141.png b/tests/PC_test_data/folder/216840111366964013199786354762011304090209759_01-001-141.png new file mode 100644 index 0000000000000000000000000000000000000000..67f57105c8887d2760a5eddd8e646fdc964287fc GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^Od!kwBpAZ)2K@k1e4Z|jAr*6y6F>mSXJcS2YMS{9 P$YStx^>bP0l+XkK&Y}-r literal 0 HcmV?d00001 diff --git a/tests/PC_test_data/folder/216840111366964013534861372972012353112932019_01-129-187.png b/tests/PC_test_data/folder/216840111366964013534861372972012353112932019_01-129-187.png new file mode 100644 index 0000000000000000000000000000000000000000..67f57105c8887d2760a5eddd8e646fdc964287fc GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^Od!kwBpAZ)2K@k1e4Z|jAr*6y6F>mSXJcS2YMS{9 P$YStx^>bP0l+XkK&Y}-r literal 0 HcmV?d00001 diff --git a/tests/PC_test_data/folder/216840111366964013663026955732013130130708697_02-042-053.png b/tests/PC_test_data/folder/216840111366964013663026955732013130130708697_02-042-053.png new file mode 100644 index 0000000000000000000000000000000000000000..67f57105c8887d2760a5eddd8e646fdc964287fc GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^Od!kwBpAZ)2K@k1e4Z|jAr*6y6F>mSXJcS2YMS{9 P$YStx^>bP0l+XkK&Y}-r literal 0 HcmV?d00001 diff --git a/tests/PC_test_data/folder/300276821619038978339766780609910437168_fgj94z.png b/tests/PC_test_data/folder/300276821619038978339766780609910437168_fgj94z.png new file mode 100644 index 0000000000000000000000000000000000000000..67f57105c8887d2760a5eddd8e646fdc964287fc GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^Od!kwBpAZ)2K@k1e4Z|jAr*6y6F>mSXJcS2YMS{9 P$YStx^>bP0l+XkK&Y}-r literal 0 HcmV?d00001 diff --git a/tests/PC_test_data/folder/318099584815157573909341904878106290504_erj1pn.png b/tests/PC_test_data/folder/318099584815157573909341904878106290504_erj1pn.png new file mode 100644 index 0000000000000000000000000000000000000000..67f57105c8887d2760a5eddd8e646fdc964287fc GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^Od!kwBpAZ)2K@k1e4Z|jAr*6y6F>mSXJcS2YMS{9 P$YStx^>bP0l+XkK&Y}-r literal 0 HcmV?d00001 diff --git a/tests/PC_test_data/folder/336326204749794028912525116839151974960_vsaz23.png b/tests/PC_test_data/folder/336326204749794028912525116839151974960_vsaz23.png new file mode 100644 index 0000000000000000000000000000000000000000..67f57105c8887d2760a5eddd8e646fdc964287fc GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^Od!kwBpAZ)2K@k1e4Z|jAr*6y6F>mSXJcS2YMS{9 P$YStx^>bP0l+XkK&Y}-r literal 0 HcmV?d00001 diff --git a/tests/PC_test_data/tar.tar b/tests/PC_test_data/tar.tar new file mode 100644 index 0000000000000000000000000000000000000000..c229700cbbdbf472824d34ff928193b61f7ece74 GIT binary patch literal 20480 zcmeI2&2AGh5XTn|2vsT%z$tf>c4qAH*hioUa;d5csmE=gX+>MwvPlu@3H8P!An^wH0G&WABIT_-FrjX6)T~Tu(;hNxd_i3|DuL4|hh*YBlEs znnbvIuk~(y`TF1@&)0va3Y{Q3$LK-@gbbnT@tprhvAWaoWZ3k2)yeSmaOL%J)4UoV z9~GYb+x?4vpCXIbov7VF(j#h`r!3ow{mi{ zSL$O%5`v#O{s{8t_&WfSst2XY=6&ryAO8;<>ra=L?k_3U<-xPHP0erT<8J1>^=hb51+sL^m02VJ-<`kYR*4?*HSfjvcC5D(e`;RTe^V+uBLxXNn&v9C8+*Y`yLVy zB;iy8_CXKyI8XgMHvP9TolO62Q0{IUCH*^$kP=59k>euCsYCh$=rLZAc;z8*FE zcycsL_0v9I+y0X@Mot>0gOHo z)%)BW@SDZhfAjy_nLVceb~tynm7@Mpf{37o;cE7yuK6=%%byqjf+RvuE*CSj^-={Ojmc}n*>Q4dnN4HV1krOq2&`T=#om6`!s+!=<;dj!JZLbr0F(?# zNYMGQxzgq@A`~ab?Ngdg)s_{2^I{E|QeXkmpg@vbU@uo;FJQr7L`7G62lD1xRYlaO zsz~ZmQgSB{%6jJ871am>afDQ~_c3(#rb4y4feD8ck(Er{3y6gg$+DT9dx7tpm~<+n z*Gjy=Ii#$kq?pu%LU0#$ttl(b>O~#Mo{Z>GQheAC@Gtk+*Y zIx;%qFCQ88hIP#*ge|x7eIfIbl3O>JuxqyMJbB{1-v8gr!c<~TDaVvsh+u}WHOTWl zjQD7qY8$<=!9lC)ZCW=px?yZ=q_$yw%tsIP`-wkf;yorr8M}t#_=h9wbS=NLpe{)= z{)8h6{M&K9G~r)WVLs%mnba(ak z^z`)g^-i5O`-o}%{nO^moOR^vd2{CiN}lT*1{l+kJpWTHO#KI*|HY}9Z(pk$?rZTIOF|1t(AISd=V|5W7&GNtDU!^9=(-38P5|qOK zQwIEtz}*nDW&SnH6mvY5VoXTR-^?tB`CkpJis(qe-^~8;9L2TGya0P);Mh*+x{Oh3 z3r6cV1WxAqKZgB(ilE&X6Z}8;fAIe$Q=lyVKgC?%#t|mn`daYU*r`08Fr=F@YA=k z4oHYxZ9ASrC~}nTN{o=}(aioI)yIFR|L+H?peFc#@c$)qzd07tCuyjX_MLyv?fFFdu2~4+N>l!4cHoBv>QVpGZ;;bn3iKkpd6()1Ox#>1JVuz2-py5n^tI~$2<)#f(X3P z4kyeGAz`#pU?j{6BS2z@*NDyF%?b}f01W28k%rp@pUd%2!g&5lGl~2c%3lc=wBw!xZJiB_ z5*bPfo;i|22r-5D#M{=_ySv}=*IM35|1mA-vHpYjzn%X<1ZuvzMmrPjuKu6vzndSw z`P}M7Z+`MkPp&RpSgkI=pViI3SiNC&_44H_moHtta^=c>_g%gJ!G}KO!3Q3A@MSM~ z>8C#Q@`oS&td~Fh$RpQY{lsI}UirFLJ@Uxo=C!Y*OiKCaW9|zq|NJL}m3T)pr92jCxk=tZl0F5G+XJs0o2bm`(n z_}AYKf4{o;;!7`i1^c4QFa2_V<(1#~5dY2}`su5$`r=>wtxx-kKm6xci}3V!-FN?| zf5vCN?BUmZ_G6E~_H(4t#=6gY!CBj-~Z^x{@{=P_)q@y&;I=5&wk=B|LU**=5PP*@BiT+|LI@; z_22&eKmPN-{`-^vbMq6ct6R5y;p&tB`|iizi~peqYIxv-H=o^oMp}R07yo%0AM5+> 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 N$ANK%F&9LC{R;$w^|t^3 literal 0 HcmV?d00001 diff --git a/tests/gen_mimic/images-224/files/p06/p0639398e/sab8e71f2/9160eb4a-257a3140-8f138287-8981fc11.jpg b/tests/gen_mimic/images-224/files/p11/p11a8f57f/sbf2ecf26/9622b5f2-3a3e307e-f5ca9164-375a6f70.jpg similarity index 100% rename from tests/gen_mimic/images-224/files/p06/p0639398e/sab8e71f2/9160eb4a-257a3140-8f138287-8981fc11.jpg rename to tests/gen_mimic/images-224/files/p11/p11a8f57f/sbf2ecf26/9622b5f2-3a3e307e-f5ca9164-375a6f70.jpg diff --git a/tests/gen_mimic/images-224/files/p07/p070736c2/scfed7491/15288759-57edea0b-9556a29d-43cbc54c.jpg b/tests/gen_mimic/images-224/files/p31/p310345ea/s274bcf57/7e393cbe-6eac27c9-469708b4-dc5f22ef.jpg similarity index 100% rename from tests/gen_mimic/images-224/files/p07/p070736c2/scfed7491/15288759-57edea0b-9556a29d-43cbc54c.jpg rename to tests/gen_mimic/images-224/files/p31/p310345ea/s274bcf57/7e393cbe-6eac27c9-469708b4-dc5f22ef.jpg diff --git a/tests/gen_mimic/images-224/files/p08/p085cff35/sa433a81c/c5402f0b-2ecf6365-bd88b424-252ad568.jpg b/tests/gen_mimic/images-224/files/p34/p346b3f01/s14b48a44/dc7a8b5e-4ad1afd8-8f994433-643c39f8.jpg similarity index 100% rename from tests/gen_mimic/images-224/files/p08/p085cff35/sa433a81c/c5402f0b-2ecf6365-bd88b424-252ad568.jpg rename to tests/gen_mimic/images-224/files/p34/p346b3f01/s14b48a44/dc7a8b5e-4ad1afd8-8f994433-643c39f8.jpg diff --git a/tests/gen_mimic/images-224/files/p10/p10951197/s09d439f2/73f3a8fa-928c521d-4599c566-75198031.jpg b/tests/gen_mimic/images-224/files/p3b/p3b3b7d36/sf076c36f/b69fd4aa-55745241-f15af2bb-b979004a.jpg similarity index 100% rename from tests/gen_mimic/images-224/files/p10/p10951197/s09d439f2/73f3a8fa-928c521d-4599c566-75198031.jpg rename to tests/gen_mimic/images-224/files/p3b/p3b3b7d36/sf076c36f/b69fd4aa-55745241-f15af2bb-b979004a.jpg diff --git a/tests/gen_mimic/images-224/files/p18/p182aeefb/s5239d871/1d5cc6d7-8c6bc168-7b694c53-4df47582.jpg b/tests/gen_mimic/images-224/files/p3d/p3d404d22/s1e752e16/4197fbbc-1ed2f09e-8a82308b-971009a3.jpg similarity index 100% rename from tests/gen_mimic/images-224/files/p18/p182aeefb/s5239d871/1d5cc6d7-8c6bc168-7b694c53-4df47582.jpg rename to tests/gen_mimic/images-224/files/p3d/p3d404d22/s1e752e16/4197fbbc-1ed2f09e-8a82308b-971009a3.jpg diff --git a/tests/gen_mimic/images-224/files/p18/p185cb7da/sbb1658cc/d919ac9d-8b492a3e-c3485f4f-94e73865.jpg b/tests/gen_mimic/images-224/files/p4e/p4eedf9fe/sf8521632/8cf7e7b2-46bdc39f-31564b20-71ee6b6d.jpg similarity index 100% rename from tests/gen_mimic/images-224/files/p18/p185cb7da/sbb1658cc/d919ac9d-8b492a3e-c3485f4f-94e73865.jpg rename to tests/gen_mimic/images-224/files/p4e/p4eedf9fe/sf8521632/8cf7e7b2-46bdc39f-31564b20-71ee6b6d.jpg diff --git a/tests/gen_mimic/images-224/files/p1a/p1a0cf2f8/s7945e2fa/b2d07eff-cd883d7d-3a00fd7a-e227a420.jpg b/tests/gen_mimic/images-224/files/p54/p54e08d2a/s1c41417d/67dc7d13-32da76c2-ff22a175-5d4c3ced.jpg similarity index 100% rename from tests/gen_mimic/images-224/files/p1a/p1a0cf2f8/s7945e2fa/b2d07eff-cd883d7d-3a00fd7a-e227a420.jpg rename to tests/gen_mimic/images-224/files/p54/p54e08d2a/s1c41417d/67dc7d13-32da76c2-ff22a175-5d4c3ced.jpg diff --git a/tests/gen_mimic/images-224/files/p2d/p2da2ef62/s6b392830/00e45f48-7a73e69b-1cbe72d4-7259c959.jpg b/tests/gen_mimic/images-224/files/p61/p6145fd64/s7968e508/baf27490-fe6678a0-fe0b7379-665d78ba.jpg similarity index 100% rename from tests/gen_mimic/images-224/files/p2d/p2da2ef62/s6b392830/00e45f48-7a73e69b-1cbe72d4-7259c959.jpg rename to tests/gen_mimic/images-224/files/p61/p6145fd64/s7968e508/baf27490-fe6678a0-fe0b7379-665d78ba.jpg diff --git a/tests/gen_mimic/images-224/files/p63/p636c6ae0/sc8cca22c/da54bf19-4bfcbe16-b364a677-b61c0743.jpg b/tests/gen_mimic/images-224/files/p63/p636c6ae0/sc8cca22c/da54bf19-4bfcbe16-b364a677-b61c0743.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p66/p667bdc12/s4a6038b8/8e497ccd-3f13f600-4a7be3d5-0c1f4f09.jpg b/tests/gen_mimic/images-224/files/p66/p667bdc12/s4a6038b8/8e497ccd-3f13f600-4a7be3d5-0c1f4f09.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p67/p67111dd3/s97d40f2a/746857e8-930e2b92-830ba925-90a97e7e.jpg b/tests/gen_mimic/images-224/files/p67/p67111dd3/s97d40f2a/746857e8-930e2b92-830ba925-90a97e7e.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p70/p700bf17d/sda301b01/1c9bdf33-12762299-6e5a617d-b2b0ef88.jpg b/tests/gen_mimic/images-224/files/p70/p700bf17d/sda301b01/1c9bdf33-12762299-6e5a617d-b2b0ef88.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p70/p709a3d20/s04003d64/d8d6c36e-f6d5be79-6d8d0627-4d147195.jpg b/tests/gen_mimic/images-224/files/p70/p709a3d20/s04003d64/d8d6c36e-f6d5be79-6d8d0627-4d147195.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p78/p78ae70f1/s4728d107/539b692a-b6898b10-4bffba19-dbbbcdbc.jpg b/tests/gen_mimic/images-224/files/p78/p78ae70f1/s4728d107/539b692a-b6898b10-4bffba19-dbbbcdbc.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p7a/p7a77c130/s0d554684/128f28cd-e4215d7d-771984af-284d8ab6.jpg b/tests/gen_mimic/images-224/files/p7a/p7a77c130/s0d554684/128f28cd-e4215d7d-771984af-284d8ab6.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p88/p88530ff8/s732de0c4/7d4c4448-a12969b6-e4f1fce9-e42b5a6c.jpg b/tests/gen_mimic/images-224/files/p88/p88530ff8/s732de0c4/7d4c4448-a12969b6-e4f1fce9-e42b5a6c.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p8c/p8c386642/sfee5823a/9fc08fe8-b4daf852-5856bd9f-47779547.jpg b/tests/gen_mimic/images-224/files/p8c/p8c386642/sfee5823a/9fc08fe8-b4daf852-5856bd9f-47779547.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p9c/p9c79a08a/s1449fb9b/58d68a58-fbbcf857-4b8ad963-96e4235d.jpg b/tests/gen_mimic/images-224/files/p9c/p9c79a08a/s1449fb9b/58d68a58-fbbcf857-4b8ad963-96e4235d.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p9e/p9e594eaa/s4e29dfa2/2fd58d4d-c55d0cea-34a82d0e-a2c4b459.jpg b/tests/gen_mimic/images-224/files/p9e/p9e594eaa/s4e29dfa2/2fd58d4d-c55d0cea-34a82d0e-a2c4b459.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pa0/pa06d0acc/s216e34ff/2f11d734-8472ea74-d140dc70-3cd25400.jpg b/tests/gen_mimic/images-224/files/pa0/pa06d0acc/s216e34ff/2f11d734-8472ea74-d140dc70-3cd25400.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pa1/pa1bdabdf/s82aa1e1e/50541878-d32e3a22-7b9c4f64-d8458be4.jpg b/tests/gen_mimic/images-224/files/pa1/pa1bdabdf/s82aa1e1e/50541878-d32e3a22-7b9c4f64-d8458be4.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pa2/pa282b0a5/s2305b6b1/8e03f255-4835baa1-1d55bf2f-1afdeb17.jpg b/tests/gen_mimic/images-224/files/pa2/pa282b0a5/s2305b6b1/8e03f255-4835baa1-1d55bf2f-1afdeb17.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pb9/pb946092a/s8ad7a2d0/f061d04c-add9919d-f1f8c039-0350cfbe.jpg b/tests/gen_mimic/images-224/files/pb9/pb946092a/s8ad7a2d0/f061d04c-add9919d-f1f8c039-0350cfbe.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pbb/pbb35aad3/s07e14baf/60313569-aab4439a-36680145-8f0c90c3.jpg b/tests/gen_mimic/images-224/files/pbb/pbb35aad3/s07e14baf/60313569-aab4439a-36680145-8f0c90c3.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/p32/p32b572e6/s9ba81d90/c94bbfae-e39038df-5b7efb8e-31f9ee55.jpg b/tests/gen_mimic/images-224/files/pbc/pbc0ee611/s89cfed09/6a301286-456d8528-c59bd118-195ce98c.jpg similarity index 100% rename from tests/gen_mimic/images-224/files/p32/p32b572e6/s9ba81d90/c94bbfae-e39038df-5b7efb8e-31f9ee55.jpg rename to tests/gen_mimic/images-224/files/pbc/pbc0ee611/s89cfed09/6a301286-456d8528-c59bd118-195ce98c.jpg diff --git a/tests/gen_mimic/images-224/files/p3d/p3dc9cdc5/sd00f6a73/a59fc947-4912d84a-f6ace88d-1ccdf143.jpg b/tests/gen_mimic/images-224/files/pbf/pbfb2d1b6/s2c5d98ee/a0082cb3-93689ac6-4fbbad4e-ddd68866.jpg similarity index 100% rename from tests/gen_mimic/images-224/files/p3d/p3dc9cdc5/sd00f6a73/a59fc947-4912d84a-f6ace88d-1ccdf143.jpg rename to tests/gen_mimic/images-224/files/pbf/pbfb2d1b6/s2c5d98ee/a0082cb3-93689ac6-4fbbad4e-ddd68866.jpg diff --git a/tests/gen_mimic/images-224/files/pd6/pd65ae44e/s82475404/35c7d685-56e7291c-75f30590-cd6e143e.jpg b/tests/gen_mimic/images-224/files/pd6/pd65ae44e/s82475404/35c7d685-56e7291c-75f30590-cd6e143e.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pe0/pe0be2169/sd0ff5abb/4c112d3a-0e7093c9-4b207121-9fc0a6cd.jpg b/tests/gen_mimic/images-224/files/pe0/pe0be2169/sd0ff5abb/4c112d3a-0e7093c9-4b207121-9fc0a6cd.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/ped/pedc6b925/sd03e6b53/63036743-d14a06a9-2784f480-257e30e1.jpg b/tests/gen_mimic/images-224/files/ped/pedc6b925/sd03e6b53/63036743-d14a06a9-2784f480-257e30e1.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/images-224/files/pf9/pf9374095/s0594dc84/e8aa3601-35458231-e6aa878c-7386bd70.jpg b/tests/gen_mimic/images-224/files/pf9/pf9374095/s0594dc84/e8aa3601-35458231-e6aa878c-7386bd70.jpg deleted file mode 100644 index ee20271a66a08043486afd57d61c099682e9a018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 920 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<nAuRebI{N?Mn h?>~P2`hSao0~Bob3_t&MX)GE=qai?z5Lo~JCIAv(aRmSX diff --git a/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv b/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv index 9f374ec..ebd862d 100644 --- a/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv +++ b/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv @@ -1,11 +1,11 @@ dicom_id,subject_id,study_id,PerformedProcedureStepDescription,ViewPosition,Rows,Columns,StudyDate,StudyTime,ProcedureCodeSequence_CodeMeaning,ViewCodeSequence_CodeMeaning,PatientOrientationCodeSequence_CodeMeaning -c5402f0b-2ecf6365-bd88b424-252ad568,085cff35,a433a81c,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -63036743-d14a06a9-2784f480-257e30e1,edc6b925,d03e6b53,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -9160eb4a-257a3140-8f138287-8981fc11,0639398e,ab8e71f2,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -746857e8-930e2b92-830ba925-90a97e7e,67111dd3,97d40f2a,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent -1d5cc6d7-8c6bc168-7b694c53-4df47582,182aeefb,5239d871,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent -7d4c4448-a12969b6-e4f1fce9-e42b5a6c,88530ff8,732de0c4,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -c94bbfae-e39038df-5b7efb8e-31f9ee55,32b572e6,9ba81d90,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -da54bf19-4bfcbe16-b364a677-b61c0743,636c6ae0,c8cca22c,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect -d8d6c36e-f6d5be79-6d8d0627-4d147195,709a3d20,04003d64,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect -1c9bdf33-12762299-6e5a617d-b2b0ef88,700bf17d,da301b01,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent +dc7a8b5e-4ad1afd8-8f994433-643c39f8,346b3f01,14b48a44,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +9622b5f2-3a3e307e-f5ca9164-375a6f70,11a8f57f,bf2ecf26,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +8cf7e7b2-46bdc39f-31564b20-71ee6b6d,4eedf9fe,f8521632,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +6a301286-456d8528-c59bd118-195ce98c,bc0ee611,89cfed09,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +67dc7d13-32da76c2-ff22a175-5d4c3ced,54e08d2a,1c41417d,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +b69fd4aa-55745241-f15af2bb-b979004a,3b3b7d36,f076c36f,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Erect +7e393cbe-6eac27c9-469708b4-dc5f22ef,310345ea,274bcf57,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +a0082cb3-93689ac6-4fbbad4e-ddd68866,bfb2d1b6,2c5d98ee,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Recumbent +4197fbbc-1ed2f09e-8a82308b-971009a3,3d404d22,1e752e16,CHEST (PA AND LAT),LATERAL,224,224,0,0,CHEST (PA AND LAT),lateral,Erect +baf27490-fe6678a0-fe0b7379-665d78ba,6145fd64,7968e508,CHEST (PA AND LAT),PA,224,224,0,0,CHEST (PA AND LAT),postero-anterior,Recumbent diff --git a/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv.gz b/tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv.gz index 7301c051704154e947c0d0553c9b3d49f413bdaf..f18c4b52832245f6f42ed349b20194b7246a226a 100644 GIT binary patch delta 592 zcmV-W0k0ABzYGUAi@q2Q7aBNi!NrN0S74NLv$!Udu=`DqCW2y0!`Z`^s)< zFA2REvDy(5^WM{YlBvzxualVlv3}QfIG2Z`{5%zFUHZIiRo2VgRE~>o4*Gnn`?gHa zhiTrKFO$Bk=lyhEJj^e9b2C33x4XUBoSNM7L4Q||(^k#jHaD~AMt>Z2*YtnuY4K5c zH|@Ti`@Olj=EJ1B!{_BR^9k~;qgT=r=Ni=_i{~!c=3WXSfF*}d#H_{ltIJ8tWscU35a8hfz7 zpx~0)9vc@=Xdy+Wo}BTXbB}+io7#i69_Y2!>(&3jpXdERpDpjkZ<-f#w+tt*a_dP` z4R+|1lVl4%64u~s@~Tux45~^mT}{t1c!F?I2E^ce$Ye2+41jD~ELFVE)|c3{7DqWD- z#+Wb$^tSuRJ=AJzNyRy20~Kl#Ak*F82-GjiASo1RRV^vEkXjjGD9PoDR@z8s&~Csx zz^H6O!rDe2FXjL{mqV*y3s5fHMi6?fET~pQC}*M({TjqqGNDB&S@oi?5PeAlvRSVZ zx+`ik=K$jZY)Rg^!eBr^(4mB2yrvk`)5Y}H;dR2|Y*(U``Bb=?AQej#CFRP7JjO1B eCKbvWUA~b2|L))y00030{{sL%X_!dk1pok)J}8X< delta 591 zcmV-V0Eih z`7q5p^KH_X^}L_Xn}_*jZ*JzN<94?2C9Q{b9YjUVXW}zF$3lH0zb|KAayI>x~=F^ZuaAY|C!Erg+gOk`A$xuBy-W;(_m2zkiZIB*PWN#e%qS~v89CEe zB(G$09TOoLE`}~8hT2`WBetrJY()x%QnHm?gE1y%3~HmIU>dhpyltC%)4>n6KrpHn!BJ`~%@J%JSmI46Q z>MQDES6Ii0H0RK?&J(isd%u6B>iXPR>V_)TT>nD9On$!5sT2@j00030{{sNJ Kxhq3!0{{T*3e1K8 delta 422 zcmV;X0a^aD1GxhSABzYGrZ6y(2Oob?+m4(t41Ld6@ByaEg-du`ZD*fWyDRkrDib@i zsTdeRSatrs!xR|k6v^bs@i`~9hq3;}F8&MzLmcTcfv3pLHHSkO;2C=g-HDIbT;RED zhpq{PF?1~)h))QIw!!|$lq{7LaEPHDPw>*Ci(}95I=08;m4}IS!|!KwAzpvrtxH}) zOQAi&N5f-}O>*#lycI5q_xQ;@e6&2Cx;Eg9;%C?6Z}>5u&s`sr@B9@U4?^19d2e#S z%ow!Ff%+yvUSm3^?{>;LImMI_Os=RaodZe3MV*_KGe!EBoUT|dKy8Gkgph@)Ol29c zwp=Q&XUF~TLE{EQQ7WZ~3{-z5WzuWhKXk`X5A;o~P*x+euOZi_B3r6^-|225tN1D^ ztj&$|-a=_Kv2+>SJ<nf<4?dCb`H?!?P6sB+mvIJ+HL#^Fr z3+cZj-#q0mB}!SLA$={&q%>4y|5>Pd80sp%h{)Qjl7P@iRZF!R?*|rgr|ev2EdBrh Q0RR630QVi|AY=mo0EOPo5dZ)H From 41b50c4019449cc0e327b78ede1bbfc86ebc911f Mon Sep 17 00:00:00 2001 From: bganglia Date: Thu, 13 Aug 2020 18:14:15 -0400 Subject: [PATCH 22/52] Tests for zip, tar in MIMIC, NIH, and PC --- tests/test_dataloaders.py | 46 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/tests/test_dataloaders.py b/tests/test_dataloaders.py index 75bdb35..b6c6077 100644 --- a/tests/test_dataloaders.py +++ b/tests/test_dataloaders.py @@ -3,7 +3,7 @@ import torchxrayvision as xrv import os from pathlib import Path - + dataset_classes = [xrv.datasets.NIH_Dataset, xrv.datasets.PC_Dataset, xrv.datasets.NIH_Google_Dataset, @@ -67,3 +67,47 @@ def test_mimic_tar(): #Assert items are the same for tarred_item, extracted_item in zip(tarred, extracted): assert pickle.dumps(tarred_item) == pickle.dumps(extracted_item) + +def all_equal(items): + if len(items) == 1: + return True + return all([item == items[0] for item in items[1:]]) + +def _test_opening_formats(dataset_class, imgpaths, **kwargs): + sources = [dataset_class(imgpath=path, **kwargs) for path in imgpaths] + for one_item_from_each in zip(*sources): + assert all_equal([pickle.dumps(item) for item in one_item_from_each]) + +def test_mimic_formats(): + _test_opening_formats( + xrv.datasets.MIMIC_Dataset, + imgpaths=[ + "tests/gen_mimic/images-224/files", + "tests/gen_mimic/images-224.tar", + "tests/gen_mimic/images-224.zip" + ], + csvpath="tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv", + metacsvpath="tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv" + ) + +def test_nih_formats(): + _test_opening_formats( + xrv.datasets.NIH_Dataset, + imgpaths=[ + "tests/NIH_test_data/folder", + "tests/NIH_test_data/tar.tar", + "tests/NIH_test_data/zip.zip" + ], + csvpath="tests/nih.csv" + ) + +def test_pc_formats(): + _test_opening_formats( + xrv.datasets.PC_Dataset, + imgpaths=[ + "tests/PC_test_data/folder", + "tests/PC_test_data/tar.tar", + "tests/PC_test_data/zip.zip" + ], + csvpath="tests/pc.csv" + ) From 48d81704af7fb92ab001ca1a0a4f4c6348c632f4 Mon Sep 17 00:00:00 2001 From: bganglia Date: Thu, 13 Aug 2020 18:18:50 -0400 Subject: [PATCH 23/52] clean up storage classes --- torchxrayvision/datasets.py | 106 +++++++++++++++++------------------- 1 file changed, 51 insertions(+), 55 deletions(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index 3158eda..49973ba 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -199,18 +199,6 @@ def __len__(self): def __getitem__(self, idx): return self.dataset[self.idxs[idx]] -class CompressedInterface: - def __init__(self, filename, path_length): - self.path_length = path_length - self.compressed, self.filename_mapping = self.get_cached_filename_mapping() - if self.compressed is None: - self.compressed, self.filename_mapping = self.index(filename) - def get_cached_filename_mapping(self): - return None, None - def get_image(self, imgid): - archive_path = self.filename_mapping[imgid] - return self.extract_from_file(archive_path) - def last_n_in_filepath(filepath, n): if n < 1: return "" @@ -220,10 +208,20 @@ def last_n_in_filepath(filepath, n): end_part = os.path.join(middle_part, end_part) return end_part -class TarInterface(CompressedInterface): +class TarInterface: @classmethod def matches(cls, filename): return tarfile.is_tarfile(filename) + def __init__(self, filename, path_length): + self.path_length = path_length + self.compressed, self.filename_mapping = self.get_cached_filename_mapping() + if self.compressed is None: + self.compressed, self.filename_mapping = self.index(filename) + def get_cached_filename_mapping(self): + return None, None + def get_image(self, imgid): + archive_path = self.filename_mapping[imgid] + return self.extract_from_file(archive_path) def index(self, imgpath): compressed = tarfile.open(imgpath) tar_infos = compressed.getmembers() @@ -234,25 +232,37 @@ def index(self, imgpath): imgid = last_n_in_filepath(tar_path, self.path_length) filename_mapping[imgid] = tar_path return compressed, filename_mapping -# tarfile_contents[absolute_tarpath] = self.tarred, self.filename_mapping def extract_from_file(self, tar_path): bytes = self.compressed.extractfile(tar_path).read() return np.array(Image.open(BytesIO(bytes))) -class ZipInterface(CompressedInterface): +class ZipInterface: @classmethod def matches(cls, filename): return zipfile.is_zipfile(filename) + def __init__(self, filename, path_length): + self.path_length = path_length + self.compressed, self.filename_mapping = self.get_cached_filename_mapping() + if self.compressed is None: + self.compressed, self.filename_mapping = self.index(filename) + def get_cached_filename_mapping(self): + return None, None + def get_image(self, imgid): + archive_path = self.filename_mapping[imgid] + return self.extract_from_file(archive_path) def index(self, imgpath): - compressed = ZipFile(imgpath) + compressed = zipfile.ZipFile(imgpath) zip_infos = compressed.infolist() + filename_mapping = {} for zip_info in zip_infos: - if not zip_info.is_dir(): - zip_path = zip_path.filename - imgid = last_n_in_filepath(zip_path) - filename_mapping[imgid] = zip_path + print(zip_info) + #if not zip_info.is_dir(): + zip_path = zip_info.filename + imgid = last_n_in_filepath(zip_path, self.path_length) + filename_mapping[imgid] = zip_path + return compressed, filename_mapping def extract_from_file(self, zip_path): - bytes = self.compressed.open(zip_path) + bytes = self.compressed.open(zip_path).read() return np.array(Image.open(BytesIO(bytes))) class FolderInterface: @@ -264,25 +274,13 @@ def __init__(self, path, *args): def get_image(self, imgid): return imread(os.path.join(self.path, imgid)) -class StorageAgnosticDataset: - path_length = None - def __init__(self, filename): - interfaces = [FolderInterface, TarInterface, ZipInterface] - for interface in interfaces: - if interface.matches(filename): - self.interface = interface(filename, self.path_length) - #else: - # raise ValueError("No matching interface for {}".format(filename)) - - #def check_paths_exist(self): - # #if self.imagezipfile is not None: - # - # if not (os.path.isdir(self.imgpath) or tarfile.is_tarfile(self.imgpath)): - # raise Exception("imgpath must be a directory or tarfile") - # if not os.path.isfile(self.csvpath): - # raise Exception("csvpath must be a file") - -class NIH_Dataset(TarDataset): +def create_interface(filename, path_length): + interfaces = [FolderInterface, TarInterface, ZipInterface] + for interface in interfaces: + if interface.matches(filename): + return interface(filename, path_length) + +class NIH_Dataset: path_length = 1 """ NIH ChestX-ray8 dataset @@ -308,10 +306,10 @@ def __init__(self, imgpath, normalize=True, pathology_masks=False): - super(NIH_Dataset, self).__init__(imgpath) + super(NIH_Dataset, self).__init__() np.random.seed(seed) # Reset the seed so all runs are the same. - self.imgpath = imgpath + self.image_interface = create_interface(imgpath, self.path_length) self.csvpath = csvpath self.transform = transform self.data_aug = data_aug @@ -326,7 +324,6 @@ def __init__(self, imgpath, self.normalize = normalize # Load data - self.check_paths_exist() self.csv = pd.read_csv(self.csvpath, nrows=nrows) self.MAXVAL = 255 # Range [0 255] @@ -382,7 +379,7 @@ def __getitem__(self, idx): imgid = self.csv['Image Index'].iloc[idx] #img_path = os.path.join(self.imgpath, imgid) #print(img_path) - img = self.get_image(imgid) + img = self.image_interface.get_image(imgid) if self.normalize: img = normalize(img, self.MAXVAL) @@ -705,7 +702,7 @@ def __getitem__(self, idx): return {"img":img, "lab":self.labels[idx], "idx":idx} -class PC_Dataset(TarDataset): +class PC_Dataset(Dataset): path_length = 1 """ PadChest dataset @@ -729,7 +726,7 @@ def __init__(self, imgpath, seed=0, unique_patients=True): - super(PC_Dataset, self).__init__(imgpath) + super(PC_Dataset, self).__init__() np.random.seed(seed) # Reset the seed so all runs are the same. self.pathologies = ["Atelectasis", "Consolidation", "Infiltration", @@ -753,13 +750,12 @@ def __init__(self, imgpath, mapping["Pleural_Thickening"] = ["pleural thickening"] mapping["Consolidation"] = ["air bronchogram"] - self.imgpath = imgpath + self.image_interface = create_interface(imgpath, self.path_length) self.transform = transform self.data_aug = data_aug self.flat_dir = flat_dir self.csvpath = csvpath - self.check_paths_exist() self.csv = pd.read_csv(self.csvpath, low_memory=False) self.MAXVAL = 65535 @@ -806,8 +802,8 @@ def __len__(self): def __getitem__(self, idx): imgid = self.csv['ImageID'].iloc[idx] - img_path = os.path.join(self.imgpath,imgid) - img = imread(img_path) + #img_path = os.path.join(self.imgpath,imgid) + img = self.image_interface.get_image(imgid)#imread(img_path) img = normalize(img, self.MAXVAL) # Check that images are 2D arrays @@ -926,7 +922,7 @@ def __getitem__(self, idx): return {"img":img, "lab":self.labels[idx], "idx":idx} -class MIMIC_Dataset(StorageAgnosticDataset): +class MIMIC_Dataset(Dataset): path_length = 4 """ Johnson AE, Pollard TJ, Berkowitz S, Greenbaum NR, Lungren MP, Deng CY, Mark RG, Horng S. MIMIC-CXR: A large publicly available database of labeled chest radiographs. arXiv preprint arXiv:1901.07042. 2019 Jan 21. @@ -957,7 +953,7 @@ def __init__(self, imgpath, csvpath,metacsvpath, views=["PA"], transform=None, d self.pathologies = sorted(self.pathologies) - self.imgpath = imgpath + self.image_interface = create_interface(imgpath, self.path_length) self.transform = transform self.data_aug = data_aug self.csvpath = csvpath @@ -1000,7 +996,7 @@ def __init__(self, imgpath, csvpath,metacsvpath, views=["PA"], transform=None, d # rename pathologies self.pathologies = np.char.replace(self.pathologies, "Pleural Effusion", "Effusion") - super(MIMIC_Dataset, self).__init__(imgpath) + super(MIMIC_Dataset, self).__init__() def __repr__(self): @@ -1020,7 +1016,7 @@ def get_imgid(self, idx): def __getitem__(self, idx): img_fname = self.get_imgid(idx) - img = self.interface.get_image(img_fname) + img = self.image_interface.get_image(img_fname) img = normalize(img, self.MAXVAL) # Check that images are 2D arrays @@ -1314,7 +1310,7 @@ def __init__(self, #Label is the last digit on the simage filename self.csv["label"] = self.csv["fname"].apply(lambda x: int(x.split(".")[-2][-1])) - + self.labels = self.csv["label"].values.reshape(-1,1) self.pathologies = ["Tuberculosis"] self.views = views From 5c4117e901602484760b4e77ade2d06263b22658 Mon Sep 17 00:00:00 2001 From: bganglia Date: Wed, 26 Aug 2020 18:15:39 -0400 Subject: [PATCH 24/52] save progress --- tests/nih.csv | 11 ++ tests/pc.csv | 11 ++ torchxrayvision/datasets.py | 197 ++++++++++++++++++++++++++++-------- 3 files changed, 176 insertions(+), 43 deletions(-) create mode 100644 tests/nih.csv create mode 100644 tests/pc.csv diff --git a/tests/nih.csv b/tests/nih.csv new file mode 100644 index 0000000..7f5410a --- /dev/null +++ b/tests/nih.csv @@ -0,0 +1,11 @@ +,Patient ID,Image Index,Finding Labels,Follow-up #,Patient Age,Patient Gender,View Position,OriginalImage[Width,Height],OriginalImagePixelSpacing[x,y],has_masks +0,1,00000001_000.png,Cardiomegaly,0,57,M,PA,2682,2749,0.14300000000000002,0.14300000000000002,False +1,2,00000002_000.png,No Finding,0,80,M,PA,2500,2048,0.171,0.171,False +2,3,00000003_001.png,Hernia,0,74,F,PA,2500,2048,0.168,0.168,False +3,5,00000005_000.png,No Finding,0,69,F,PA,2048,2500,0.168,0.168,False +4,6,00000006_000.png,No Finding,0,81,M,PA,2500,2048,0.168,0.168,False +5,7,00000007_000.png,No Finding,0,82,M,PA,2500,2048,0.168,0.168,False +6,8,00000008_000.png,Cardiomegaly,0,68,F,PA,2048,2500,0.171,0.171,False +7,9,00000009_000.png,Emphysema,0,72,M,PA,2992,2991,0.14300000000000002,0.14300000000000002,False +8,10,00000010_000.png,Infiltration,0,84,F,PA,2992,2991,0.14300000000000002,0.14300000000000002,False +9,11,00000011_000.png,Effusion,0,74,M,PA,2638,2449,0.14300000000000002,0.14300000000000002,False diff --git a/tests/pc.csv b/tests/pc.csv new file mode 100644 index 0000000..ab49556 --- /dev/null +++ b/tests/pc.csv @@ -0,0 +1,11 @@ +,PatientID,Unnamed: 0,ImageID,ImageDir,StudyDate_DICOM,StudyID,PatientBirth,PatientSex_DICOM,ViewPosition_DICOM,Projection,MethodProjection,Pediatric,Modality_DICOM,Manufacturer_DICOM,PhotometricInterpretation_DICOM,PixelRepresentation_DICOM,PixelAspectRatio_DICOM,SpatialResolution_DICOM,BitsStored_DICOM,WindowCenter_DICOM,WindowWidth_DICOM,Rows_DICOM,Columns_DICOM,XRayTubeCurrent_DICOM,Exposure_DICOM,ExposureInuAs_DICOM,ExposureTime,RelativeXRayExposure_DICOM,ReportID,Report,MethodLabel,Labels,Localizations,LabelsLocalizationsBySentence,labelCUIS,LocalizationsCUIS +0,100002652742762245719447501824197948584,1691,125374151943505747025890313053997514922_j5rk5q.png,0,20170124,125374151943505747025890313053997514922,1953.0,F,PA,PA,Manual review of DICOM fields,No,DX,PhilipsMedicalSystems,MONOCHROME2,0,None,0.148,12,2047.5,4095,2279,2778,None,1,1200,5,369,5305389, escoliosis . sin hallazg pulmonar,Physician,['scoliosis'],[],"[['scoliosis'], ['normal'], ['normal']]",['C0036439'],[] +1,100008301845755693600822040133468866003,28441,117677712752528732526839762067921423608_ag14ef.png,10,20171023,117677712752528732526839762067921423608,1963.0,F,PA,PA,Manual review of DICOM fields,No,DX,PhilipsMedicalSystems,MONOCHROME2,0,None,0.148,12,2047.5,4095,2791,2628,None,1,900,3,379,5499322, sign atrap aere . sin hallazg radiolog signific .,Physician,"['COPD signs', 'air trapping']",[],"[['COPD signs', 'air trapping'], ['normal']]",['C0024117' 'C0231819'],[] +2,100013367876124980580350390072254146837,25017,336326204749794028912525116839151974960_vsaz23.png,8,20150211,336326204749794028912525116839151974960,1969.0,M,,PA,Manual review of DICOM fields,No,CR,PhilipsMedicalSystems,MONOCHROME2,0,"['1', '1']",0.2000000029802,12,2047.0,4095.0,1760,2140,None,None,None,None,210,4851188, estudi con escas grad inspiratori . atelectasi infiltr lamin lingul . liger pinzamient sen costofren derech . valor con clinic proces infecci neumon .,Physician,"['laminar atelectasis', 'pneumonia', 'suboptimal study', 'costophrenic angle blunting', 'infiltrates']","['loc lingula', 'loc costophrenic angle', 'loc right costophrenic angle']","[['laminar atelectasis', 'infiltrates', 'loc lingula'], ['pneumonia'], ['suboptimal study'], ['costophrenic angle blunting', 'loc right costophrenic angle', 'loc costophrenic angle']]",['C0032285' 'C2828075' 'C0742855' 'C0277877'],['C0225740' 'C0230151' 'C0504099'] +3,100026982716795250809914871389223660538,89912,216840111366964013534861372972012353112932019_01-129-187.png,27,20121218,216840111366964013534861372972012353112932019,1973.0,M,POSTEROANTERIOR,PA,Manual review of DICOM fields,No,CR,ImagingDynamicsCompanyLtd,MONOCHROME2,0,None,None,12,2177,2100,1764,1948,320,3,3200,10,-1.11,4384412, no apreci infiltr ni condens pulmonar .,RNN_model,['normal'],[],['normal'],[],[] +4,100028509573539327074611268168549994987,44189,216840111366964013663026955732013130130708697_02-042-053.png,13,20130522,216840111366964013663026955732013130130708697,1970.0,M,,PA,resnet-50.t7,No,CR,PhilipsMedicalSystems,MONOCHROME2,0,None,None,10,5.115000e+02,1.023000e+03,3520,4280,None,None,None,None,None,4469779, sin hallazg patolog signific,RNN_model,['normal'],[],['normal'],[],[] +5,100036099730704895710487466181648561260,29774,300276821619038978339766780609910437168_fgj94z.png,10,20170310,300276821619038978339766780609910437168,1941.0,M,,PA,Manual review of DICOM fields,No,CR,PhilipsMedicalSystems,MONOCHROME2,0,"['1', '1']",0.2000000029802,12,2047.0,4095.0,1760,2140,None,None,None,None,1144,5338259, sin hallazg signific . escoliosis dorsal,Physician,['scoliosis'],[],"[['scoliosis'], ['normal'], ['normal']]",['C0036439'],[] +6,100036618866701987672955579216452480417,133144,216840111366964013076187734852011294130558067_00-193-087.png,41,20111024,216840111366964013076187734852011294130558067,1934.0,F,POSTEROANTERIOR,PA,Manual review of DICOM fields,No,CR,ImagingDynamicsCompanyLtd,MONOCHROME2,0,None,None,12,2195,2281,1664,1776,320,3,3200,10,-0.57,4141680, minim compresion par lateral derech traque puest relacion con pequen boci . cambi mecan column .,RNN_model,"['goiter', 'vertebral degenerative changes']","['loc tracheal', 'loc right']","['goiter', 'loc tracheal', 'loc right', 'vertebral degenerative changes']",['C0018021' 'C4290224'],['C0040578' 'C0444532'] +7,10005572179957571894246722745910504559,35656,318099584815157573909341904878106290504_erj1pn.png,54,20150423,318099584815157573909341904878106290504,1937.0,F,POSTEROANTERIOR,PA,Manual review of DICOM fields,No,CR,ImagingDynamicsCompanyLtd,MONOCHROME2,0,None,None,12,1975,2116,3500,3620,400,2,2000,5,None,4902417, imagen compat con cambi inflamatori caract cronic bas derech . aort elong con calcificacion cay .,Physician,"['aortic button enlargement', 'chronic changes', 'aortic atheromatosis']","['loc aortic', 'loc right', 'loc basal']","[['aortic button enlargement', 'aortic atheromatosis', 'loc aortic'], ['chronic changes', 'loc basal', 'loc right']]",['C1851119' 'C0742362' 'C1096249'],['C0003483' 'C0444532' 'C1282378'] +8,100058298117820286456857046001529978359,73720,216840111366964013199786354762011304090209759_01-001-141.png,22,20111031,216840111366964013199786354762011304090209759,1941.0,M,POSTEROANTERIOR,PA,Manual review of DICOM fields,No,CR,PhilipsMedicalSystems,MONOCHROME2,0,"['1', '1']",0.2,12,2047.0,4095.0,1760,2140,None,None,None,None,330,4146530, elevacion hemidiafragm izquierd con pinzamient sen costofren probabl caract residual . parenquim sin alter .,RNN_model,"['costophrenic angle blunting', ' hemidiaphragm elevation']","['loc diaphragm', 'loc costophrenic angle', 'loc left']","['costophrenic angle blunting', ' hemidiaphragm elevation', 'loc diaphragm', 'loc costophrenic angle', 'loc left', 'normal']",['C0742855' 'C2073707'],['C0011980' 'C0230151' 'C0443246'] +9,100059873297205262788714053371897021487,15633,12986792586879524468475227325378905558_f8k8bq.png,5,20160901,12986792586879524468475227325378905558,1937.0,M,,PA,Manual review of DICOM fields,No,CR,PhilipsMedicalSystems,MONOCHROME2,0,"['1', '1']",0.143,12,2047.0,4095.0,2743,3000,0,0,None,0,429,5217128, no apreci infiltr consolid . cambi cronic parenquim pulmon con sign atrap aere . engros pleural biapical predomini derech . pinzamient sen costofren izquierd . ateromatosis aortic calcific .,Physician,"['aortic atheromatosis', 'chronic changes', 'costophrenic angle blunting', 'apical pleural thickening', 'air trapping']","['loc aortic', 'loc pleural', 'loc right', 'loc costophrenic angle', 'loc left costophrenic angle']","[['aortic atheromatosis', 'loc aortic'], ['chronic changes', 'air trapping'], ['normal'], ['costophrenic angle blunting', 'loc left costophrenic angle', 'loc costophrenic angle'], ['apical pleural thickening', 'loc pleural', 'loc right'], ['apical pleural thickening', 'loc pleural', 'loc right']]",['C1096249' 'C0742362' 'C0742855' 'C0231819'],['C0003483' 'C0032225' 'C0444532' 'C0230151' 'C0504100'] diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index 49973ba..fc22277 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -9,6 +9,7 @@ import numpy as np from io import BytesIO import os,sys,os.path +import pdb import pandas as pd import pickle import pydicom @@ -25,6 +26,9 @@ import tarfile import zipfile import random +from pathlib import Path + +Image.init() default_pathologies = [ 'Atelectasis', 'Consolidation', @@ -208,17 +212,45 @@ def last_n_in_filepath(filepath, n): end_part = os.path.join(middle_part, end_part) return end_part -class TarInterface: +#TODO:use .torchxrayvision + +stored_mapping_filename = "stored_mappings" + +if os.path.exists(stored_mapping_filename): + with open(stored_mapping_filename, "rb") as handle: + stored_mappings = pickle.load(handle) +else: + stored_mappings = {} + +class Interface: + path_length = 0 + def load_dataset(self, filename): + timestamp = os.path.getmtime(filename) + if not (filename, timestamp) in stored_mappings: + compressed, mapping = self.index(filename) + compressed = [i.offset for i in compressed.members] + stored_mappings[(filename, timestamp)] = (compressed, mapping) + with open(stored_mapping_filename,"wb") as handle: + print(stored_mappings) + print(handle) + pickle.dump(stored_mappings, handle) + else: + compressed_offsets, mapping = zip_mapping[(filename, timestamp)] + compressed = + return compressed, mapping + def convert_to_image(self, filename, bytes): + if str(filename).endswith(".dcm"): + return pydicom.filereader.dcmread(BytesIO(bytes), force=True).pixel_array + else: + return np.array(Image.open(BytesIO(bytes))) + +class TarInterface(Interface): @classmethod def matches(cls, filename): - return tarfile.is_tarfile(filename) + return not os.path.isdir(filename) and tarfile.is_tarfile(filename) def __init__(self, filename, path_length): self.path_length = path_length - self.compressed, self.filename_mapping = self.get_cached_filename_mapping() - if self.compressed is None: - self.compressed, self.filename_mapping = self.index(filename) - def get_cached_filename_mapping(self): - return None, None + self.compressed, self.filename_mapping = self.load_dataset(filename) def get_image(self, imgid): archive_path = self.filename_mapping[imgid] return self.extract_from_file(archive_path) @@ -232,21 +264,19 @@ def index(self, imgpath): imgid = last_n_in_filepath(tar_path, self.path_length) filename_mapping[imgid] = tar_path return compressed, filename_mapping + def close(self): + self.compressed.close() def extract_from_file(self, tar_path): bytes = self.compressed.extractfile(tar_path).read() - return np.array(Image.open(BytesIO(bytes))) + return self.convert_to_image(tar_path, bytes) -class ZipInterface: +class ZipInterface(Interface): @classmethod def matches(cls, filename): - return zipfile.is_zipfile(filename) + return not os.path.isdir(filename) and zipfile.is_zipfile(filename) def __init__(self, filename, path_length): self.path_length = path_length - self.compressed, self.filename_mapping = self.get_cached_filename_mapping() - if self.compressed is None: - self.compressed, self.filename_mapping = self.index(filename) - def get_cached_filename_mapping(self): - return None, None + self.compressed, self.filename_mapping = self.load_dataset(filename) def get_image(self, imgid): archive_path = self.filename_mapping[imgid] return self.extract_from_file(archive_path) @@ -255,27 +285,83 @@ def index(self, imgpath): zip_infos = compressed.infolist() filename_mapping = {} for zip_info in zip_infos: - print(zip_info) - #if not zip_info.is_dir(): +# print(zip_info) + if not zip_info.is_dir(): zip_path = zip_info.filename imgid = last_n_in_filepath(zip_path, self.path_length) filename_mapping[imgid] = zip_path return compressed, filename_mapping def extract_from_file(self, zip_path): bytes = self.compressed.open(zip_path).read() - return np.array(Image.open(BytesIO(bytes))) + return self.convert_to_image(zip_path, bytes) + def close(self): + self.compressed.close() -class FolderInterface: +class FolderInterface(Interface): @classmethod def matches(cls, filename): return os.path.isdir(filename) - def __init__(self, path, *args): - self.path = path + def __init__(self, filename, path_length): + self.path_length = path_length + self.path, self.filename_mapping = self.load_dataset(filename) + def get_image(self, imgid): + archive_path = self.filename_mapping[imgid] + with open(archive_path,"rb") as handle: + image = self.convert_to_image(archive_path, handle.read()) + return image + def index(self, imgpath): + filename_mapping = {} + for path in Path(imgpath).rglob("*"): + #print(path) + if not os.path.isdir(path): + imgid = last_n_in_filepath(path, self.path_length) + filename_mapping[imgid] = path + #print(filename_mapping) + return imgpath, filename_mapping + def close(self): + pass + +def is_image(filename): + _, extension = os.path.splitext(filename) + return extension in Image.EXTENSION + +archive_interfaces = [ZipInterface, TarInterface] + +def is_archive(filename): + return any(interface.matches(filename) for interface in archive_interfaces) + +class ArchiveFolder(Interface): + @classmethod + def matches(cls, filename): + #print("Checking archive folder") + for item in Path(filename).rglob("*"): + if is_image(item): + return False + if is_archive(item): + return True + return False + def __init__(self, filename, path_length): + self.path_length = path_length + self.archives, self.filename_mapping = self.load_dataset(filename) def get_image(self, imgid): - return imread(os.path.join(self.path, imgid)) + path_to_archive = self.filename_mapping[imgid] + return self.archives[path_to_archive].get_image(imgid) + def index(self, filename): + filename_mapping = {} + archives = {} + for path_to_archive in Path(filename).rglob("*"): + if is_archive(path_to_archive): + archive = create_interface(path_to_archive, self.path_length) + archives[path_to_archive] = archive + for path_in_csv, path_in_archive in archive.filename_mapping.items(): + filename_mapping[path_in_csv] = path_to_archive + return archives, filename_mapping + def close(self): + for archive_path, archive in self.archives.items(): + archive.close() def create_interface(filename, path_length): - interfaces = [FolderInterface, TarInterface, ZipInterface] + interfaces = [ArchiveFolder, FolderInterface, TarInterface, ZipInterface] for interface in interfaces: if interface.matches(filename): return interface(filename, path_length) @@ -441,6 +527,7 @@ def get_mask_dict(self, image_name, this_size): return path_mask class RSNA_Pneumonia_Dataset(Dataset): + path_length = 1 """ RSNA Pneumonia Detection Challenge @@ -518,6 +605,8 @@ def __init__(self, self.labels = np.asarray(self.labels).T self.labels = self.labels.astype(np.float32) + self.image_interface = create_interface(imgpath, self.path_length) + def __repr__(self): pprint.pprint(self.totals()) return self.__class__.__name__ + " num_samples={} views={}".format(len(self), self.views) @@ -531,13 +620,15 @@ def __getitem__(self, idx): sample["idx"] = idx sample["lab"] = self.labels[idx] - imgid = self.csv['patientId'].iloc[idx] - img_path = os.path.join(self.imgpath, imgid + self.extension) + imgid = self.csv['patientId'].iloc[idx] + self.extension + #img_path = os.path.join(self.imgpath, imgid + self.extension) #print(img_path) - if self.use_pydicom: - img=pydicom.filereader.dcmread(img_path).pixel_array - else: - img = imread(img_path) + + #if self.use_pydicom: + # img=pydicom.filereader.dcmread(img_path).pixel_array + #else: + # img = imread(img_path) + img = self.image_interface.get_image(imgid) if self.normalize: img = normalize(img, self.MAXVAL) @@ -604,7 +695,7 @@ def get_mask_dict(self, image_name, this_size): return path_mask class NIH_Google_Dataset(Dataset): - + path_length = 1 """ Chest Radiograph Interpretation with Deep Learning Models: Assessment with Radiologist-adjudicated Reference Standards and Population-adjusted Evaluation @@ -669,6 +760,8 @@ def __init__(self, imgpath, # rename pathologies self.pathologies = np.char.replace(self.pathologies, "Airspace opacity", "Lung Opacity") + self.image_interface = create_interface(imgpath, self.path_length) + def __repr__(self): pprint.pprint(self.totals()) return self.__class__.__name__ + " num_samples={} views={}".format(len(self), self.views) @@ -678,9 +771,10 @@ def __len__(self): def __getitem__(self, idx): imgid = self.csv['Image Index'].iloc[idx] - img_path = os.path.join(self.imgpath, imgid) + #img_path = os.path.join(self.imgpath, imgid) #print(img_path) - img = imread(img_path) + #img = imread(img_path) + img = self.image_interface.get(imgid) if self.normalize: img = normalize(img, self.MAXVAL) @@ -824,6 +918,7 @@ def __getitem__(self, idx): return {"img":img, "lab":self.labels[idx], "idx":idx} class CheX_Dataset(Dataset): + path_length = 3 #due to removing CheXpert-... and train in __getitem__ """ CheXpert: A Large Chest Radiograph Dataset with Uncertainty Labels and Expert Comparison. Jeremy Irvin *, Pranav Rajpurkar *, Michael Ko, Yifan Yu, Silviana Ciurea-Ilcus, Chris Chute, Henrik Marklund, Behzad Haghgoo, Robyn Ball, Katie Shpanskaya, Jayne Seekins, David A. Mong, Safwan S. Halabi, Jesse K. Sandberg, Ricky Jones, David B. Larson, Curtis P. Langlotz, Bhavik N. Patel, Matthew P. Lungren, Andrew Y. Ng @@ -890,6 +985,8 @@ def __init__(self, imgpath, csvpath, views=["PA"], transform=None, data_aug=None self.pathologies = list(np.char.replace(self.pathologies, "Pleural Effusion", "Effusion")) + self.image_interface = create_interface(imgpath, self.path_length) + def __repr__(self): pprint.pprint(self.totals()) return self.__class__.__name__ + " num_samples={} views={}".format(len(self), self.views) @@ -900,9 +997,11 @@ def __len__(self): def __getitem__(self, idx): imgid = self.csv['Path'].iloc[idx] - imgid = imgid.replace("CheXpert-v1.0-small/","") - img_path = os.path.join(self.imgpath, imgid) - img = imread(img_path) + imgid = last_n_in_filepath(imgid, self.path_length) + #imgid = imgid.replace("CheXpert-v1.0-small/","") + #img_path = os.path.join(self.imgpath, imgid) + img = self.image_interface.get_image(imgid) + #img = imread(img_path) img = normalize(img, self.MAXVAL) # Check that images are 2D arrays @@ -1037,6 +1136,7 @@ def __getitem__(self, idx): return {"img":img, "lab":self.labels[idx], "idx":idx} class Openi_Dataset(Dataset): + path_length = 1 """ OpenI @@ -1142,6 +1242,8 @@ def __init__(self, imgpath, self.pathologies = np.char.replace(self.pathologies, "Opacity", "Lung Opacity") self.pathologies = np.char.replace(self.pathologies, "Lesion", "Lung Lesion") + self.image_interface = create_interface(imgpath, self.path_length) + def __repr__(self): pprint.pprint(self.totals()) return self.__class__.__name__ + " num_samples={}".format(len(self)) @@ -1150,10 +1252,10 @@ def __len__(self): return len(self.labels) def __getitem__(self, idx): - imageid = self.csv.iloc[idx].imageid - img_path = os.path.join(self.imgpath,imageid + ".png") + imageid = self.csv.iloc[idx].imageid + ".png" + #img_path = os.path.join(self.imgpath,imageid + ".png") #print(img_path) - img = imread(img_path) + img = self.image_interface.get_image(imageid) img = normalize(img, self.MAXVAL) # Check that images are 2D arrays @@ -1174,6 +1276,7 @@ def __getitem__(self, idx): return {"img":img, "lab":self.labels[idx], "idx":idx} class COVID19_Dataset(Dataset): + path_length = 1 """ COVID-19 image data collection @@ -1233,6 +1336,8 @@ def __init__(self, self.labels = np.asarray(self.labels).T self.labels = self.labels.astype(np.float32) + self.image_interface = create_interface(imgpath, self.path_length) + def __repr__(self): pprint.pprint(self.totals()) return self.__class__.__name__ + " num_samples={} views={}".format(len(self), self.views) @@ -1242,9 +1347,10 @@ def __len__(self): def __getitem__(self, idx): imgid = self.csv['filename'].iloc[idx] - img_path = os.path.join(self.imgpath, imgid) + #img_path = os.path.join(self.imgpath, imgid) #print(img_path) - img = imread(img_path) + #img = imread(img_path) + img = self.image_interface.get_image(imgid) img = normalize(img, self.MAXVAL) # Check that images are 2D arrays @@ -1265,6 +1371,7 @@ def __getitem__(self, idx): return {"img":img, "lab":self.labels[idx], "idx":idx} class NLMTB_Dataset(Dataset): + path_length = 2 """ National Library of Medicine Tuberculosis Datasets https://lhncbc.nlm.nih.gov/publication/pub9931 @@ -1302,7 +1409,10 @@ def __init__(self, file_list = [] source_list = [] - for fname in sorted(os.listdir(os.path.join(self.imgpath, "CXR_png"))): + + self.image_interface = create_interface(imgpath, self.path_length) + + for fname in sorted(self.image_interface.filename_mapping): if fname.endswith(".png"): file_list.append(fname) @@ -1327,9 +1437,10 @@ def __len__(self): def __getitem__(self, idx): item = self.csv.iloc[idx] - img_path = os.path.join(self.imgpath, "CXR_png", item["fname"]) + imgid = item["fname"] #os.path.join("CXR_png", item["fname"]) #print(img_path) - img = imread(img_path) + img = self.image_interface.get_image(imgid) + #img = imread(img_path) img = normalize(img, self.MAXVAL) # Check that images are 2D arrays From 2773c691f51a4d3b590783a9ef0b1a7adf4b189b Mon Sep 17 00:00:00 2001 From: bganglia Date: Wed, 26 Aug 2020 18:29:12 -0400 Subject: [PATCH 25/52] inherit from Dataset in NIH_Dataset --- torchxrayvision/datasets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index fc22277..eada7df 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -366,7 +366,7 @@ def create_interface(filename, path_length): if interface.matches(filename): return interface(filename, path_length) -class NIH_Dataset: +class NIH_Dataset(Dataset): path_length = 1 """ NIH ChestX-ray8 dataset From 7ffc2528642771b0dc2d74ddb613855b77af8ad6 Mon Sep 17 00:00:00 2001 From: bganglia Date: Wed, 26 Aug 2020 18:32:22 -0400 Subject: [PATCH 26/52] Add code for automated tests with script-generated data --- .github/workflows/tests.yml | 6 ++- tests/bootstrap.sh | 2 + tests/create_standard_test_output.py | 40 +++++++++++++++++ tests/gen_chexpert.py | 67 ++++++++++++++++++++++++++++ tests/generate_all.sh | 1 + tests/generate_test_data.py | 15 +++++-- tests/generate_test_data.sh | 7 +++ 7 files changed, 133 insertions(+), 5 deletions(-) create mode 100644 tests/bootstrap.sh create mode 100644 tests/create_standard_test_output.py create mode 100644 tests/gen_chexpert.py diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c6dcdaa..177bc44 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -44,5 +44,9 @@ jobs: python -m pip install pytest python -m pip install -e . - name: Run tests - run: pytest + run: | + cd tests + bash bootstrap.sh + cd .. + pytest diff --git a/tests/bootstrap.sh b/tests/bootstrap.sh new file mode 100644 index 0000000..091075c --- /dev/null +++ b/tests/bootstrap.sh @@ -0,0 +1,2 @@ +python create_standard_test_output.py +bash generate_all.sh diff --git a/tests/create_standard_test_output.py b/tests/create_standard_test_output.py new file mode 100644 index 0000000..69509b2 --- /dev/null +++ b/tests/create_standard_test_output.py @@ -0,0 +1,40 @@ +import torchxrayvision as xrv +import os + +n=10 + +def create_standard_test_output(dataset, name): + dataset.csv[:n].to_csv(name) + +create_standard_test_output( + xrv.datasets.NIH_Dataset(imgpath="."), + "nih.csv" +) + +create_standard_test_output( + xrv.datasets.PC_Dataset(imgpath="."), + "pc.csv" +) + +create_standard_test_output( + xrv.datasets.Openi_Dataset(imgpath="."), + "openi.csv" +) + +#NLMTB Shenzen +create_standard_test_output( + xrv.datasets.NLMTB_Dataset(imgpath=os.path.expanduser("~/ChinaSet_AllFiles.zip")), + "shenzen.csv" +) + +#NLMTB Montgomery +create_standard_test_output( + xrv.datasets.NLMTB_Dataset(imgpath=os.path.expanduser("~/NLM-MontgomeryCXRSet.zip")), + "montgomery.csv" +) + +#RSNA train +create_standard_test_output( + xrv.datasets.RSNA_Pneumonia_Dataset(imgpath="."), #csvpath="kaggle_stage_2_train_images_dicom_headers.csv.gz") + "rsna_train.csv" +) diff --git a/tests/gen_chexpert.py b/tests/gen_chexpert.py new file mode 100644 index 0000000..f4ae9a4 --- /dev/null +++ b/tests/gen_chexpert.py @@ -0,0 +1,67 @@ +from random_data import random_preds +import numpy as np +import pandas as pd +import random + +def probability(fraction): + gran = 100 + return np.random.randint(0, gran) < gran * fraction + +def random_age(): + return random.randint(18, 100) #Assume adult + +def gen_random_study(): + views = [] + if probability(.7): + views.append({ + "Path":"view1_frontal.jpg", + "AP/PA":np.random.choice(["AP","PA"]), + "Frontal/Lateral":"Frontal" + }) + if probability(.3): + views.append({ + "Path":"view1_lateral.jpg", + "AP/PA":"", + "Frontal/Lateral":"Lateral" + }) + return views + +def gen_random_data(): + views = [] + patient_idx = 0 + while True: + n_studies = random.randint(1, 4) + sex = random.choice(["Female","Male"]) + age = random_age() + for study_idx in range(n_studies): + for radiograph in gen_random_study(): + path_format = ( + "CheXpert-v1.0-small/train/patient{}/study{}/{}" + ) + path = path_format.format( + str(patient_idx).zfill(5), + str(study_idx), + radiograph["Path"] + ) + radiograph.update({ + "Path":path, + "Sex":sex, + "Age":age, + }) + radiograph.update(random_preds()) + yield radiograph + patient_idx += 1 + +#Path,Sex,Age,Frontal/Lateral,AP/PA,No Finding,Enlarged Cardiomediastinum,Cardiomegaly,Lung Opacity,Lung Lesion,Edema,Consolidation,Pneumonia,Atelectasis,Pneumothorax,Pleural Effusion,Pleural Other,Fracture,Support Devices +#CheXpert-v1.0-small/train/patient00001/study1/view1_frontal.jpg,Female,68,Frontal,AP,1.0,,,,,,,,,0.0,,,,1.0 + +def gen_random_rows(nrows): + rows = [] + random_data_source = gen_random_data() + for i in range(nrows): + rows.append(next(random_data_source)) + return pd.DataFrame(rows) + + + +gen_random_rows(10).to_csv("test_chexpert_data.csv") diff --git a/tests/generate_all.sh b/tests/generate_all.sh index 12d0400..9a9ac9f 100644 --- a/tests/generate_all.sh +++ b/tests/generate_all.sh @@ -1,2 +1,3 @@ bash gen_mimic.sh +python gen_chexpert.py bash generate_test_data.sh diff --git a/tests/generate_test_data.py b/tests/generate_test_data.py index e67994c..3691e93 100644 --- a/tests/generate_test_data.py +++ b/tests/generate_test_data.py @@ -3,14 +3,17 @@ from random_data import write_random_images import argparse -def generate_test_data(metadata_file, filename_column, size, test_data_folder): +def generate_test_data(metadata_file, filename_column, size, test_data_folder, filename_suffix, subfolder=None): test_data_folder = Path(test_data_folder) write_random_images( - metadata_file[filename_column], + metadata_file[filename_column] + filename_suffix, test_data_folder/"folder", test_data_folder/"tar.tar", test_data_folder/"zip.zip", - size + test_data_folder/"zipped", + test_data_folder/"tgz", + size, + subfolder=Path(subfolder) ) if __name__ == "__main__": @@ -20,10 +23,14 @@ def generate_test_data(metadata_file, filename_column, size, test_data_folder): parser.add_argument("x") parser.add_argument("y") parser.add_argument("test_data_folder") + parser.add_argument("suffix", nargs="*", default="") + parser.add_argument("--subfolder", dest="subfolder", nargs="?", default=".") args = parser.parse_args() generate_test_data( pd.read_csv(args.metadata_file), args.filename_column, (int(args.x), int(args.y)), - args.test_data_folder + args.test_data_folder, + args.suffix, + args.subfolder ) diff --git a/tests/generate_test_data.sh b/tests/generate_test_data.sh index 9f86be0..a6c784f 100644 --- a/tests/generate_test_data.sh +++ b/tests/generate_test_data.sh @@ -1,2 +1,9 @@ python3 generate_test_data.py pc.csv ImageID 2 2 PC_test_data python3 generate_test_data.py nih.csv "Image Index" 2 2 NIH_test_data +python3 generate_test_data.py openi.csv imageid 2 2 Openi_test_data .png +python3 generate_test_data.py shenzen.csv fname 2 2 Shenzen_test_data --subfolder CXR_png +python3 generate_test_data.py montgomery.csv fname 2 2 Montgomery_test_data --subfolder CXR_png +python3 generate_test_data.py rsna_train.csv patientId 2 2 RSNA_test_data_jpg .jpg --subfolder stage_2_train_images +python3 generate_test_data.py rsna_train.csv patientId 2 2 RSNA_test_data_dcm .dcm --subfolder stage_2_train_images +python3 generate_test_data.py test_chexpert_data.csv Path 2 2 CheXpert_test_data +python3 generate_test_data.py test_covid_data.csv filename 2 2 COVID_test_data --subfolder images From 68a71ae631ae20d764eb2b1400acdce01bf14578 Mon Sep 17 00:00:00 2001 From: bganglia Date: Wed, 26 Aug 2020 18:37:15 -0400 Subject: [PATCH 27/52] script for writing random data --- tests/random_data.py | 253 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 253 insertions(+) create mode 100644 tests/random_data.py diff --git a/tests/random_data.py b/tests/random_data.py new file mode 100644 index 0000000..9c644af --- /dev/null +++ b/tests/random_data.py @@ -0,0 +1,253 @@ +import tarfile +import datetime +import numpy as np +import zipfile +import os +import shutil +import random +from PIL import Image +import glob +import pdb +import pydicom +import io +from pydicom.dataset import FileMetaDataset, FileDataset +from pydicom.encaps import encapsulate +import pydicom +import tempfile + +import io +from PIL import Image, ImageDraw +from pydicom.dataset import Dataset +from pydicom.uid import generate_uid, JPEGExtended +from pydicom._storage_sopclass_uids import SecondaryCaptureImageStorage +from pydicom import dcmread +from pydicom.encaps import encapsulate +import numpy as np + +def np_to_dcm(image, filename): + image = np.array(image) + WIDTH = image.shape[1] + HEIGHT = image.shape[2] + ds = Dataset() + ds.is_little_endian = True + ds.is_implicit_VR = True + ds.SOPClassUID = SecondaryCaptureImageStorage + ds.SOPInstanceUID = generate_uid() + ds.fix_meta_info() + ds.Modality = "OT" + ds.SamplesPerPixel = 3 + ds.BitsAllocated = 8 + ds.BitsStored = 8 + ds.HighBit = 7 + ds.PixelRepresentation = 0 + ds.PlanarConfiguration = 1 + ds.PhotometricInterpretation = "RGB" + ds.Rows = HEIGHT + ds.Columns = WIDTH + ds.PixelData = encapsulate([image.tobytes()]) + ds["PixelData"].is_undefined_length = True + ds.PhotometricInterpretation = "YBR_FULL_422" + ds.file_meta.TransferSyntaxUID = JPEGExtended + ds.save_as(filename, write_like_original=False) + +#def np_to_dcm(arr, filename): +# #Create object corresponding to file +# meta = FileMetaDataset() +# meta.MediaStorageSOPClassUID = '1.2.840.10008.5.1.4.1.1.2' +# meta.MediaStorageSOPInstanceUID = "1.2.3" +# meta.ImplementationClassUID = "1.2.3.4" +# dataset = FileDataset(filename, {}, file_meta = meta, preamble=b"\0" * 128) +# dataset.PatientName = "Test^Firstname" +# dataset.PatientID = "123456" +# #ds.is_little_endian = True +# dataset.is_little_endian = True +# dataset.is_implicit_VR = True +# dataset.file_meta.TransferSyntaxUID = pydicom.uid.ExplicitVRBigEndian +# # Set creation date/time +# dt = datetime.datetime.now() +# dataset.ContentDate = dt.strftime('%Y%m%d') +# timeStr = dt.strftime('%H%M%S.%f') # long format with micro seconds +# dataset.ContentTime = timeStr + +# dataset.Rows, dataset.Columns = arr.size + +# #ds.SOPClassUID = pydicom._storage_sopclass_uids.MRImageStorage +# dataset.PatientName = "Test^Firstname" +# dataset.PatientID = "123456" + +# #ds.Modality = "CT" +# #ds.SeriesInstanceUID = pydicom.uid.generate_uid() +# #ds.StudyInstanceUID = pydicom.uid.generate_uid() +# #ds.FrameOfReferenceUID = pydicom.uid.generate_uid() + +# dataset.BitsStored = 16 +# dataset.BitsAllocated = 16 +# dataset.SamplesPerPixel = 1 +# dataset.HighBit = 15 +# #ds.SliceLocation = DCM_SliceLocation +# #ds.SpacingBetweenSlices = 1 +# #ds.SliceThickness = 4 +# #ds.ScanLength = length + +# dataset.ImagesInAcquisition = "1" + +# dataset.InstanceNumber = 1 + +# #ds.ImagePositionPatient = r"-159\-174"+ "\\-" + str(DCM_SliceLocation*4) #default of 6, sometimes 1 +# #ds.ImageOrientationPatient = r"1\0\0\0\-1\0" +# #ds.ImageType = r"ORIGINAL\PRIMARY\AXIAL" + +# dataset.RescaleIntercept = "0" +# dataset.RescaleSlope = "1" +# dataset.PixelSpacing = r"0.683594\0.683594"# r"1\1" +# dataset.PhotometricInterpretation = "MONOCHROME2" +# dataset.PixelRepresentation = 1 + +# #Store image as bytes +# bytes_img = io.BytesIO() +# arr.save(bytes_img, format="PNG") +# #Add byte image to file +# dataset.PixelData = encapsulate(bytes_img.read()) +# pdb.set_trace() +# #dataset.pixel_data = np.array(arr) +# #Write file +# dataset.save_as(filename) + +def save_as_dicom(arr, filename): + file = FileDataset() + file.binary_data = arr + img_bytes = io.BytesIO() + Image.fromarray(arr).save(img_bytes, format="PNG") + file.PixelData = img_bytes + file.save_as(filename) + +def generate_random_image(dimensions): + dimensions = tuple(dimensions) + if len(dimensions) == 2: + dimensions = dimensions + (3,) + return Image.fromarray((np.random.random(dimensions)*255).astype("uint8")) + +class FolderOfArchive: + folder_format = "folder{}" + depth = 1 + def __init__(self, root, depth, archive_size=3): + self.root = root + self.depth = depth + self.archive_size = archive_size + self.current_archive = -1 + self.archive_position = archive_size - 1 + self.archives = [] + def get_path_from_root(self, n): + return os.path.join(*( + [self.folder_format.format(n)] * self.depth + \ + [self.archive_format.format(n)] + )) + def get_current_archive(self): + self.archive_position += 1 + if self.archive_position == self.archive_size: + new_path = os.path.join( + self.root, + self.get_path_from_root(self.current_archive) + ) + os.makedirs(os.path.dirname(new_path), exist_ok=True) + self.archives.append(self.get_new_archive(new_path)) + self.archive_position = 0 + self.current_archive += 1 + return self.archives[-1] + def close(self): + for archive in self.archives: + archive.close() + def write(self, content): + curr = self.get_current_archive() + self.add_to_archive(curr, content) + +class FolderOfTar(FolderOfArchive): + archive_format = "tar{}.tar" + def add_to_archive(self, archive, content): + archive.add(content) + def get_new_archive(self, new_path): + return tarfile.open(new_path, "w") + +class FolderOfTarGz(FolderOfArchive): + archive_format = "tar{}.tar.gz" + def add_to_archive(self, archive, content): + archive.add(content) + def get_new_archive(self, new_path): + return tarfile.open(new_path, "w:gz") + +class FolderOfZip(FolderOfArchive): + archive_format = "zip{}.zip" + def add_to_archive(self, archive, content): + archive.write(content) + def get_new_archive(self, new_path): + return zipfile.ZipFile(new_path, "w") + +def write_random_images(paths, extracted, tarname, zipname, folder_of_zip_name, folder_of_tar_gz_name, dimensions, subfolder="."): + folder_of_zip_d1_name = str(folder_of_zip_name) + "_1" + folder_of_zip_d2_name = str(folder_of_zip_name) + "_2" + folder_of_tar_gz_d1_name = str(folder_of_tar_gz_name) + "_1" + folder_of_tar_gz_d2_name = str(folder_of_tar_gz_name) + "_2" + for path in [extracted, tarname, zipname, folder_of_zip_d1_name, folder_of_zip_d2_name]: + if os.path.exists(path): + if os.path.isfile(path): + os.remove(path) + else: #dir + shutil.rmtree(path) + for img_fname in paths: + print(img_fname) + img_path = extracted/subfolder/img_fname + os.makedirs(os.path.dirname(img_path), exist_ok=True) + random_image = generate_random_image(dimensions) + if str(img_fname).endswith(".dcm"): + np_to_dcm(random_image, img_path) + else: + random_image.save(img_path) + tarred = tarfile.TarFile.open(tarname, "w") + zipped = zipfile.ZipFile(zipname,"w") + folder_of_zip_d1 = FolderOfZip(folder_of_zip_d1_name, 0) + folder_of_zip_d2 = FolderOfZip(folder_of_zip_d2_name, 1) + folder_of_tar_gz_d1 = FolderOfTarGz(folder_of_tar_gz_d1_name, 0) + folder_of_tar_gz_d2 = FolderOfTarGz(folder_of_tar_gz_d2_name, 1) + for file in extracted.rglob("*"): + if not os.path.isdir(file): + tarred.add(file) + zipped.write(file) + folder_of_zip_d1.write(file) + folder_of_zip_d2.write(file) + folder_of_tar_gz_d1.write(file) + folder_of_tar_gz_d2.write(file) + tarred.close() + zipped.close() + folder_of_zip_d1.close() + folder_of_zip_d2.close() + folder_of_tar_gz_d1.close() + folder_of_tar_gz_d2.close() + +def gen_hex(n): + hex_chars = list("0123456789abcdef") + return "".join(np.random.choice(hex_chars,n)) + +def gen_int(n): + int_chars = list("0123456789abcdef") + return "".join(np.random.choice(int_chars,n)) + +def random_pred(): + return random.choice(["1.0","-1.0","0.0",""]) + +def random_preds(): + return { + "Atelectasis":random_pred(), + "Cardiomegaly":random_pred(), + "Consolidation":random_pred(), + "Edema":random_pred(), + "Enlarged Cardiomediastinum":random_pred(), + "Fracture":random_pred(), + "Lung Lesion":random_pred(), + "Lung Opacity":random_pred(), + "No Finding":random_pred(), + "Pleural Effusion":random_pred(), + "Pleural Other":random_pred(), + "Pneumonia":random_pred(), + "Pneumothorax":random_pred(), + "Support Devices":random_pred() + } From ec9777ba5db4227284b95b7c380d5a8490adccc5 Mon Sep 17 00:00:00 2001 From: bganglia Date: Wed, 26 Aug 2020 18:43:10 -0400 Subject: [PATCH 28/52] fall back on .index() instead of trying to load a cached version in .load_dataset() --- torchxrayvision/datasets.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index eada7df..f715f1a 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -225,19 +225,19 @@ def last_n_in_filepath(filepath, n): class Interface: path_length = 0 def load_dataset(self, filename): - timestamp = os.path.getmtime(filename) - if not (filename, timestamp) in stored_mappings: - compressed, mapping = self.index(filename) - compressed = [i.offset for i in compressed.members] - stored_mappings[(filename, timestamp)] = (compressed, mapping) - with open(stored_mapping_filename,"wb") as handle: - print(stored_mappings) - print(handle) - pickle.dump(stored_mappings, handle) - else: - compressed_offsets, mapping = zip_mapping[(filename, timestamp)] - compressed = - return compressed, mapping +# timestamp = os.path.getmtime(filename) +# if not (filename, timestamp) in stored_mappings: +# compressed, mapping = self.index(filename) +# compressed = [i.offset for i in compressed.members] +# stored_mappings[(filename, timestamp)] = (compressed, mapping) +# with open(stored_mapping_filename,"wb") as handle: +# print(stored_mappings) +# print(handle) +# pickle.dump(stored_mappings, handle) +# else: +# compressed_offsets, mapping = zip_mapping[(filename, timestamp)] +# return compressed, mapping + return self.index(filename) def convert_to_image(self, filename, bytes): if str(filename).endswith(".dcm"): return pydicom.filereader.dcmread(BytesIO(bytes), force=True).pixel_array From 29498a6f32d45c969eb138b3fd79cb630eb117b8 Mon Sep 17 00:00:00 2001 From: bganglia Date: Wed, 26 Aug 2020 22:52:17 -0400 Subject: [PATCH 29/52] support multiprocessing --- torchxrayvision/datasets.py | 48 ++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index f715f1a..6f9933c 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -2,14 +2,15 @@ from os.path import join from skimage.io import imread, imsave from torch import nn +from copy import copy from torch.nn.modules.linear import Linear from torch.utils.data import Dataset from torchvision import transforms from tqdm import tqdm import numpy as np +import multiprocessing from io import BytesIO import os,sys,os.path -import pdb import pandas as pd import pickle import pydicom @@ -242,15 +243,20 @@ def convert_to_image(self, filename, bytes): if str(filename).endswith(".dcm"): return pydicom.filereader.dcmread(BytesIO(bytes), force=True).pixel_array else: - return np.array(Image.open(BytesIO(bytes))) + out = np.array(Image.open(BytesIO(bytes))) + print(type(out)) + print(out) + return out class TarInterface(Interface): @classmethod def matches(cls, filename): return not os.path.isdir(filename) and tarfile.is_tarfile(filename) - def __init__(self, filename, path_length): + def __init__(self, imgpath, path_length): self.path_length = path_length - self.compressed, self.filename_mapping = self.load_dataset(filename) + self.imgpath = imgpath + compressed, self.filename_mapping = self.load_dataset(imgpath) + self.compressed = {multiprocessing.current_process():compressed} def get_image(self, imgid): archive_path = self.filename_mapping[imgid] return self.extract_from_file(archive_path) @@ -265,18 +271,25 @@ def index(self, imgpath): filename_mapping[imgid] = tar_path return compressed, filename_mapping def close(self): - self.compressed.close() + for compressed in self.compressed.values(): + compressed.close() def extract_from_file(self, tar_path): - bytes = self.compressed.extractfile(tar_path).read() + pid = multiprocessing.current_process() + if not pid in self.compressed: + print("Opening tar file on thread:",pid) + self.compressed[pid] = tarfile.open(self.imgpath) + bytes = self.compressed[pid].extractfile(tar_path).read() return self.convert_to_image(tar_path, bytes) class ZipInterface(Interface): @classmethod def matches(cls, filename): return not os.path.isdir(filename) and zipfile.is_zipfile(filename) - def __init__(self, filename, path_length): + def __init__(self, imgpath, path_length): self.path_length = path_length - self.compressed, self.filename_mapping = self.load_dataset(filename) + self.imgpath = imgpath + compressed, self.filename_mapping = self.load_dataset(imgpath) + self.compressed = {multiprocessing.current_process():compressed} def get_image(self, imgid): archive_path = self.filename_mapping[imgid] return self.extract_from_file(archive_path) @@ -285,25 +298,28 @@ def index(self, imgpath): zip_infos = compressed.infolist() filename_mapping = {} for zip_info in zip_infos: -# print(zip_info) if not zip_info.is_dir(): zip_path = zip_info.filename imgid = last_n_in_filepath(zip_path, self.path_length) filename_mapping[imgid] = zip_path return compressed, filename_mapping def extract_from_file(self, zip_path): - bytes = self.compressed.open(zip_path).read() + if not multiprocessing.current_process() in self.compressed: + print("Opening zip file on thread:",multiprocessing.current_process()) + self.compressed[multiprocessing.current_process()] = zipfile.ZipFile(self.imgpath) + bytes = self.compressed[multiprocessing.current_process()].open(zip_path).read() return self.convert_to_image(zip_path, bytes) def close(self): - self.compressed.close() + for compressed in self.compressed.values(): + compressed.close() class FolderInterface(Interface): @classmethod def matches(cls, filename): return os.path.isdir(filename) - def __init__(self, filename, path_length): + def __init__(self, imgpath, path_length): self.path_length = path_length - self.path, self.filename_mapping = self.load_dataset(filename) + self.path, self.filename_mapping = self.load_dataset(imgpath) def get_image(self, imgid): archive_path = self.filename_mapping[imgid] with open(archive_path,"rb") as handle: @@ -316,7 +332,7 @@ def index(self, imgpath): if not os.path.isdir(path): imgid = last_n_in_filepath(path, self.path_length) filename_mapping[imgid] = path - #print(filename_mapping) + print(filename_mapping) return imgpath, filename_mapping def close(self): pass @@ -340,9 +356,9 @@ def matches(cls, filename): if is_archive(item): return True return False - def __init__(self, filename, path_length): + def __init__(self, imgpath, path_length): self.path_length = path_length - self.archives, self.filename_mapping = self.load_dataset(filename) + self.archives, self.filename_mapping = self.load_dataset(imgpath) def get_image(self, imgid): path_to_archive = self.filename_mapping[imgid] return self.archives[path_to_archive].get_image(imgid) From 3674357859c24179669e5729fbd0cba62318636a Mon Sep 17 00:00:00 2001 From: bganglia Date: Thu, 27 Aug 2020 11:39:38 -0400 Subject: [PATCH 30/52] Clean up new code for tests and format interfaces --- tests/gen_mimic.py | 45 +++------ tests/gen_rsna.py | 36 +++++++ tests/test_dataloaders.py | 196 ++++++++++++++++++++++++++++++------ torchxrayvision/datasets.py | 101 ++++++++++++------- 4 files changed, 282 insertions(+), 96 deletions(-) create mode 100644 tests/gen_rsna.py diff --git a/tests/gen_mimic.py b/tests/gen_mimic.py index 99f3746..91c6831 100644 --- a/tests/gen_mimic.py +++ b/tests/gen_mimic.py @@ -8,7 +8,7 @@ from pathlib import Path import os -from random_data import write_random_images +from random_data import write_random_images, gen_int, gen_hex, random_pred, random_preds def show(x): print(x) @@ -28,13 +28,6 @@ def generate_random_metadata(n, dimensions): "orientation_code_meaning":["Erect","Recumbent"] } } - def hex(n): - hex_chars = list("0123456789abcdef") - return "".join(np.random.choice(hex_chars,n)) - - def int(n): - int_chars = list("0123456789abcdef") - return "".join(np.random.choice(int_chars,n)) def generate_random_row(dimensions): performed_procedure_step_description = random.choice( @@ -48,10 +41,10 @@ def generate_random_row(dimensions): view_code_meaning = procedure["view_code_meaning"][view_index] #Currently unsure how/if view codes are mapped to orientations orientation_code_meaning = random.choice(procedure["orientation_code_meaning"]) - subject_id = int(8) - study_id = int(8) + subject_id = gen_int(8) + study_id = gen_int(8) meta_row = { - "dicom_id":"-".join([hex(8) for i in range(4)]), + "dicom_id":"-".join([gen_hex(8) for i in range(4)]), "subject_id":subject_id, "study_id":study_id, "PerformedProcedureStepDescription":performed_procedure_step_description, @@ -65,27 +58,11 @@ def generate_random_row(dimensions): "PatientOrientationCodeSequence_CodeMeaning":orientation_code_meaning } - def random_pred(): - return random.choice(["1.0","-1.0","0.0",""]) - csv_row = { "subject_id":subject_id, "study_id":study_id, - "Atelectasis":random_pred(), - "Cardiomegaly":random_pred(), - "Consolidation":random_pred(), - "Edema":random_pred(), - "Enlarged Cardiomediastinum":random_pred(), - "Fracture":random_pred(), - "Lung Lesion":random_pred(), - "Lung Opacity":random_pred(), - "No Finding":random_pred(), - "Pleural Effusion":random_pred(), - "Pleural Other":random_pred(), - "Pneumonia":random_pred(), - "Pneumothorax":random_pred(), - "Support Devices":random_pred() } + csv_row.update(random_preds()) return meta_row, csv_row meta_rows, csv_rows = show(list(zip(*show([generate_random_row(dimensions) for i in range(n)])))) @@ -94,7 +71,7 @@ def random_pred(): -def generate_test_images(random_metadata, extracted, tarname, zipname, dimensions): +def generate_test_images(random_metadata, extracted, tarname, zipname, folder_of_zip_name, folder_of_tar_gz_name, dimensions): paths = [] for _, row in random_metadata.iterrows(): subjectid = row["subject_id"] @@ -102,9 +79,9 @@ def generate_test_images(random_metadata, extracted, tarname, zipname, dimension dicom_id = row["dicom_id"] img_fname = os.path.join("p" + subjectid[:2], "p" + subjectid, "s" + studyid, dicom_id + ".jpg") paths.append(Path("files")/img_fname) - write_random_images(paths, extracted, tarname, zipname, dimensions) + write_random_images(paths, extracted, tarname, zipname, folder_of_zip_name, folder_of_tar_gz_name, dimensions) -def generate_test_data(n, directory, dimensions=(224, 224), tarname=None, zipname=None, extracted=None): +def generate_test_data(n, directory, dimensions=(224, 224), tarname=None, zipname=None, folder_of_zip_name=None, folder_of_tar_gz_name = None, extracted=None): directory = Path(directory) if tarname is None: tarname = directory/"images-224.tar" @@ -112,11 +89,15 @@ def generate_test_data(n, directory, dimensions=(224, 224), tarname=None, zipnam zipname = directory/"images-224.zip" if extracted is None: extracted = directory/"images-224" + if folder_of_zip_name is None: + folder_of_zip_name = directory/"images-224-zips" + if folder_of_tar_gz_name is None: + folder_of_tar_gz_name = directory/"images-224-tgzs" random_metadata, random_csvdata = generate_random_metadata( n, dimensions ) - generate_test_images(random_metadata, extracted, tarname, zipname, dimensions) + generate_test_images(random_metadata, extracted, tarname, zipname, folder_of_zip_name, folder_of_tar_gz_name, dimensions) random_metadata.to_csv( directory/mimic_metadata_filename, index=False diff --git a/tests/gen_rsna.py b/tests/gen_rsna.py new file mode 100644 index 0000000..7afad86 --- /dev/null +++ b/tests/gen_rsna.py @@ -0,0 +1,36 @@ +from argparse import ArgumentParser +from random_data import write_random_images +import pandas as pd + +rsna_imgid_column = "patientId" + +extension = ".jpg" + +def gen_rsna(test_csv, train_csv, test_data_folder, dimensions): + train_data = pd.read_csv(train_csv) + test_data = pd.read_csv(test_csv) + write_random_images( + pd.concat([ + train_data[rsna_imgid_column].map(lambda path: os.path.join(train_folder, path)), + test_data[rsna_imgid_column].map(lambda path: os.path.join(train_folder, path)) + ]) + extension, + test_data_folder/"folder", + test_data_folder/"tar.tar", + test_data_folder/"zip.zip", + dimensions + ) + +if __name__ == "__main__": + parser = ArgumentParser() + parser.add_argument("train") + parser.add_argument("test") + parser.add_argument("test_data_folder") + parser.add_argument("x") + parser.add_argument("y") + args = parser.parse_args() + gen_rsna( + args.test, + args.train, + args.test_data_folder, + (int(args.x), int(args.y)) + ) diff --git a/tests/test_dataloaders.py b/tests/test_dataloaders.py index b6c6077..324a8b8 100644 --- a/tests/test_dataloaders.py +++ b/tests/test_dataloaders.py @@ -2,21 +2,24 @@ import pickle import torchxrayvision as xrv import os +import torch from pathlib import Path dataset_classes = [xrv.datasets.NIH_Dataset, - xrv.datasets.PC_Dataset, + xrv.datasets.Openi_Dataset, xrv.datasets.NIH_Google_Dataset, - xrv.datasets.Openi_Dataset] + xrv.datasets.PC_Dataset] def test_dataloader_basic(): for dataset_class in dataset_classes: - dataset_class(imgpath=".") + c = dataset_class(imgpath=".") + c.image_interface.close() def test_dataloader_merging(): datasets = [] for dataset_class in dataset_classes: + print(dataset_class) dataset = dataset_class(imgpath=".") datasets.append(dataset) @@ -48,35 +51,38 @@ def test_dataloader_merging_incorrect_alignment(): assert "incorrect pathology alignment" in str(excinfo.value) -def test_mimic_tar(): - print(os.getcwd()) - #Load tarred and untarred datasets - mimic_test_dir = Path("tests/gen_mimic") - metacsvpath = mimic_test_dir/"mimic-cxr-2.0.0-metadata.csv" - csvpath = mimic_test_dir/"mimic-cxr-2.0.0-negbio.csv" - tarred = xrv.datasets.MIMIC_Dataset( - imgpath=mimic_test_dir/"images-224.tar", - csvpath=csvpath, - metacsvpath=metacsvpath, - ) - extracted = xrv.datasets.MIMIC_Dataset( - imgpath=mimic_test_dir/"images-224"/"files", - csvpath=csvpath, - metacsvpath=metacsvpath - ) - #Assert items are the same - for tarred_item, extracted_item in zip(tarred, extracted): - assert pickle.dumps(tarred_item) == pickle.dumps(extracted_item) - def all_equal(items): if len(items) == 1: return True return all([item == items[0] for item in items[1:]]) -def _test_opening_formats(dataset_class, imgpaths, **kwargs): - sources = [dataset_class(imgpath=path, **kwargs) for path in imgpaths] - for one_item_from_each in zip(*sources): +def _test_opening_formats(dataset_class, imgpaths, n=10, **kwargs): + sources = [] + for imgpath in imgpaths: + dataset = dataset_class(imgpath=imgpath, **kwargs) + #Add serial version + sources.append(dataset) + #Assert all items are the same in serial version + for i, one_item_from_each in enumerate(zip(*sources)): + print(i) + if i >= n - 1: + break assert all_equal([pickle.dumps(item) for item in one_item_from_each]) + #Try loading each in a parallel way + for source in sources: + source.csv = source.csv.iloc[:,:10] + dataset = torch.utils.data.DataLoader( + source, + batch_size=10, + shuffle=False, + num_workers=8, + pin_memory=False + ) + for i, _ in enumerate(dataset): + if i >= n - 1: + break + for source in sources: + source.image_interface.close() def test_mimic_formats(): _test_opening_formats( @@ -84,7 +90,11 @@ def test_mimic_formats(): imgpaths=[ "tests/gen_mimic/images-224/files", "tests/gen_mimic/images-224.tar", - "tests/gen_mimic/images-224.zip" + "tests/gen_mimic/images-224.zip", + "tests/gen_mimic/images-224-zips_1", + "tests/gen_mimic/images-224-zips_2", + "tests/gen_mimic/images-224-tgzs_1", + "tests/gen_mimic/images-224-tgzs_2" ], csvpath="tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv", metacsvpath="tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv" @@ -96,7 +106,11 @@ def test_nih_formats(): imgpaths=[ "tests/NIH_test_data/folder", "tests/NIH_test_data/tar.tar", - "tests/NIH_test_data/zip.zip" + "tests/NIH_test_data/zip.zip", + "tests/NIH_test_data/zipped_1", + "tests/NIH_test_data/zipped_2", + "tests/NIH_test_data/tgz_1", + "tests/NIH_test_data/tgz_2" ], csvpath="tests/nih.csv" ) @@ -107,7 +121,131 @@ def test_pc_formats(): imgpaths=[ "tests/PC_test_data/folder", "tests/PC_test_data/tar.tar", - "tests/PC_test_data/zip.zip" + "tests/PC_test_data/zip.zip", + "tests/PC_test_data/zipped_1", + "tests/PC_test_data/zipped_2", + "tests/PC_test_data/tgz_1", + "tests/PC_test_data/tgz_2" ], csvpath="tests/pc.csv" ) + +def test_shenzen_formats(): + _test_opening_formats( + xrv.datasets.NLMTB_Dataset, + imgpaths=[ + "tests/Shenzen_test_data/folder", + "tests/Shenzen_test_data/tar.tar", + "tests/Shenzen_test_data/zip.zip", + "tests/Shenzen_test_data/zipped_1", + "tests/Shenzen_test_data/zipped_2", + "tests/Shenzen_test_data/tgz_1", + "tests/Shenzen_test_data/tgz_2", + ] + ) + +def test_montgomery_formats(): + _test_opening_formats( + xrv.datasets.NLMTB_Dataset, + imgpaths=[ + "tests/Montgomery_test_data/folder", + "tests/Montgomery_test_data/tar.tar", + "tests/Montgomery_test_data/zip.zip", + "tests/Montgomery_test_data/zipped_1", + "tests/Montgomery_test_data/zipped_2", + "tests/Montgomery_test_data/tgz_1", + "tests/Montgomery_test_data/tgz_2" + ] + ) + +def test_rsna_jpg_formats(): + _test_opening_formats( + xrv.datasets.RSNA_Pneumonia_Dataset, + imgpaths=[ + "tests/RSNA_test_data_jpg/folder", + "tests/RSNA_test_data_jpg/tar.tar", + "tests/RSNA_test_data_jpg/zip.zip", + "tests/RSNA_test_data_jpg/zipped_1", + "tests/RSNA_test_data_jpg/zipped_2", + "tests/RSNA_test_data_jpg/tgz_1", + "tests/RSNA_test_data_jpg/tgz_2" + ], + dicomcsvpath="tests/rsna_train.csv" + ) + +def test_rsna_dcm_formats(): + _test_opening_formats( + xrv.datasets.RSNA_Pneumonia_Dataset, + imgpaths=[ + "tests/RSNA_test_data_dcm/folder", + "tests/RSNA_test_data_dcm/tar.tar", + "tests/RSNA_test_data_dcm/zip.zip", + "tests/RSNA_test_data_dcm/zipped_1", + "tests/RSNA_test_data_dcm/zipped_2", + "tests/RSNA_test_data_dcm/tgz_1", + "tests/RSNA_test_data_dcm/tgz_2" + ], + #dicomcsvpath="tests/rsna_train.csv", + extension=".dcm" + ) + +def test_chex_formats(): + _test_opening_formats( + xrv.datasets.CheX_Dataset, + imgpaths=[ + "tests/CheXpert_test_data/folder", + "tests/CheXpert_test_data/tar.tar", + "tests/CheXpert_test_data/zip.zip", + "tests/CheXpert_test_data/zipped_1", + "tests/CheXpert_test_data/zipped_2", + "tests/CheXpert_test_data/tgz_1", + "tests/CheXpert_test_data/tgz_2" + ], + csvpath="tests/test_chexpert_data.csv" + ) + +def test_COVID_dataset(): + _test_opening_formats( + xrv.datasets.COVID19_Dataset, + imgpaths=[ + "tests/COVID_test_data/folder", + "tests/COVID_test_data/tar.tar", + "tests/COVID_test_data/zip.zip", + "tests/COVID_test_data/zipped_1", + "tests/COVID_test_data/zipped_2", + "tests/COVID_test_data/tgz_1", + "tests/COVID_test_data/tgz_2" + ], + csvpath="tests/test_covid_data.csv" + ) + +def test_openi_dataset(): + _test_opening_formats( + xrv.datasets.Openi_Dataset, + imgpaths=[ + "tests/Openi_test_data/folder", + "tests/Openi_test_data/tar.tar", + "tests/Openi_test_data/zip.zip", + "tests/Openi_test_data/zipped_1", + "tests/Openi_test_data/zipped_2", + "tests/Openi_test_data/tgz_1", + "tests/Openi_test_data/tgz_2" + ], + dicomcsv_path="tests/openi.csv" + ) + +def test_mimic_formats(): + _test_opening_formats( + xrv.datasets.MIMIC_Dataset, + imgpaths=[ + "tests/gen_mimic/images-224/files", + "tests/gen_mimic/images-224.tar", + "tests/gen_mimic/images-224.zip", + "tests/gen_mimic/images-224-zips_1", + "tests/gen_mimic/images-224-zips_2", + "tests/gen_mimic/images-224-tgzs_1", + "tests/gen_mimic/images-224-tgzs_2" + ], + csvpath="tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv", + metacsvpath="tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv" + ) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index 6f9933c..f1434ef 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -224,43 +224,58 @@ def last_n_in_filepath(filepath, n): stored_mappings = {} class Interface: + """ + This class has abstract methods for extracting files from an archive based on a partial path. + See child classes TarInterface, ZipInterface, FolderInterface, and ArchiveFolder. + """ path_length = 0 def load_dataset(self, filename): -# timestamp = os.path.getmtime(filename) -# if not (filename, timestamp) in stored_mappings: -# compressed, mapping = self.index(filename) -# compressed = [i.offset for i in compressed.members] -# stored_mappings[(filename, timestamp)] = (compressed, mapping) -# with open(stored_mapping_filename,"wb") as handle: -# print(stored_mappings) -# print(handle) -# pickle.dump(stored_mappings, handle) -# else: -# compressed_offsets, mapping = zip_mapping[(filename, timestamp)] -# return compressed, mapping - return self.index(filename) + "Load the dataset's index from the cache if available, else create a new one." + timestamp = os.path.getmtime(filename) + if not (filename, timestamp) in stored_mappings: + compressed, mapping = self.index(filename) + compressed = [i.offset for i in compressed.members] + stored_mappings[(filename, timestamp)] = (compressed, mapping) + with open(stored_mapping_filename,"wb") as handle: + print(stored_mappings) + print(handle) + pickle.dump(stored_mappings, handle) + else: + compressed_offsets, mapping = zip_mapping[(filename, timestamp)] + return compressed, mapping def convert_to_image(self, filename, bytes): + "Convert an image byte array to a numpy array. If the filename ends with .dcm, use pydicom." if str(filename).endswith(".dcm"): return pydicom.filereader.dcmread(BytesIO(bytes), force=True).pixel_array else: out = np.array(Image.open(BytesIO(bytes))) - print(type(out)) - print(out) return out class TarInterface(Interface): + "This class supports extracting files from a tar archive based on a partial path." @classmethod def matches(cls, filename): + "Return whether the given path is a tar archive." return not os.path.isdir(filename) and tarfile.is_tarfile(filename) def __init__(self, imgpath, path_length): + "Store the archive path, and the length of the partial paths within the archive" self.path_length = path_length self.imgpath = imgpath compressed, self.filename_mapping = self.load_dataset(imgpath) self.compressed = {multiprocessing.current_process():compressed} def get_image(self, imgid): + "Return the image object for the partial path provided." archive_path = self.filename_mapping[imgid] - return self.extract_from_file(archive_path) + if not multiprocessing.current_process().name in self.compressed: + #print("Opening tar file on thread:",pid) + # check and reset number of open files if too many + if len(self.compressed.keys()) > 64: + self.compressed = {} + self.compressed[multiprocessing.current_process().name] = tarfile.open(self.imgpath) + bytes = self.compressed[multiprocessing.current_process().name].extractfile(archive_path).read() + return self.convert_to_image(archive_path, bytes) def index(self, imgpath): + "Create a dictionary mapping imgpath -> path within archive" compressed = tarfile.open(imgpath) tar_infos = compressed.getmembers() filename_mapping = {} @@ -271,29 +286,35 @@ def index(self, imgpath): filename_mapping[imgid] = tar_path return compressed, filename_mapping def close(self): + "Close all open tarfiles." for compressed in self.compressed.values(): compressed.close() - def extract_from_file(self, tar_path): - pid = multiprocessing.current_process() - if not pid in self.compressed: - print("Opening tar file on thread:",pid) - self.compressed[pid] = tarfile.open(self.imgpath) - bytes = self.compressed[pid].extractfile(tar_path).read() - return self.convert_to_image(tar_path, bytes) class ZipInterface(Interface): + "This class supports extracting files from a zip archive based on a partial path." @classmethod def matches(cls, filename): + "Return whether the given path is a zip archive." return not os.path.isdir(filename) and zipfile.is_zipfile(filename) def __init__(self, imgpath, path_length): + "Store the archive path, and the length of the partial paths within the archive" self.path_length = path_length self.imgpath = imgpath compressed, self.filename_mapping = self.load_dataset(imgpath) - self.compressed = {multiprocessing.current_process():compressed} + self.compressed = {multiprocessing.current_process().name:compressed} def get_image(self, imgid): + "Return the image object for the partial path provided." archive_path = self.filename_mapping[imgid] - return self.extract_from_file(archive_path) + if not multiprocessing.current_process().name in self.compressed: + #print("Opening zip file on thread:",multiprocessing.current_process()) + # check and reset number of open files if too many + if len(self.compressed.keys()) > 64: + self.compressed = {} + self.compressed[multiprocessing.current_process().name] = zipfile.ZipFile(self.imgpath) + bytes = self.compressed[multiprocessing.current_process().name].open(archive_path).read() + return self.convert_to_image(archive_path, bytes) def index(self, imgpath): + "Create a dictionary mapping imgpath -> path within archive" compressed = zipfile.ZipFile(imgpath) zip_infos = compressed.infolist() filename_mapping = {} @@ -303,53 +324,53 @@ def index(self, imgpath): imgid = last_n_in_filepath(zip_path, self.path_length) filename_mapping[imgid] = zip_path return compressed, filename_mapping - def extract_from_file(self, zip_path): - if not multiprocessing.current_process() in self.compressed: - print("Opening zip file on thread:",multiprocessing.current_process()) - self.compressed[multiprocessing.current_process()] = zipfile.ZipFile(self.imgpath) - bytes = self.compressed[multiprocessing.current_process()].open(zip_path).read() - return self.convert_to_image(zip_path, bytes) def close(self): + "Close all open zipfiles." for compressed in self.compressed.values(): compressed.close() class FolderInterface(Interface): + "This class supports drawing files from a folder based on a partial path." @classmethod def matches(cls, filename): + "Return whether the given path is a zip archive." return os.path.isdir(filename) def __init__(self, imgpath, path_length): + "Store the archive path, and the length of the partial paths within the archive" self.path_length = path_length self.path, self.filename_mapping = self.load_dataset(imgpath) def get_image(self, imgid): + "Return the image object for the partial path provided." archive_path = self.filename_mapping[imgid] with open(archive_path,"rb") as handle: image = self.convert_to_image(archive_path, handle.read()) return image def index(self, imgpath): + "Create a dictionary mapping imgpath -> path within archive" filename_mapping = {} for path in Path(imgpath).rglob("*"): - #print(path) if not os.path.isdir(path): imgid = last_n_in_filepath(path, self.path_length) filename_mapping[imgid] = path - print(filename_mapping) return imgpath, filename_mapping def close(self): pass def is_image(filename): + "Return whether the given filename has an image extension." _, extension = os.path.splitext(filename) return extension in Image.EXTENSION archive_interfaces = [ZipInterface, TarInterface] def is_archive(filename): + "Return whether the given filename is a tarfile or zipfile." return any(interface.matches(filename) for interface in archive_interfaces) class ArchiveFolder(Interface): + "This class supports extracting files from multiple tar or zip archives under the same root directory." @classmethod def matches(cls, filename): - #print("Checking archive folder") for item in Path(filename).rglob("*"): if is_image(item): return False @@ -357,12 +378,21 @@ def matches(cls, filename): return True return False def __init__(self, imgpath, path_length): + "Store the archive path, and the length of the partial paths within the archive" self.path_length = path_length self.archives, self.filename_mapping = self.load_dataset(imgpath) def get_image(self, imgid): + "Return the image object for the partial path provided." path_to_archive = self.filename_mapping[imgid] return self.archives[path_to_archive].get_image(imgid) def index(self, filename): + """ + Create a dictionary mapping imgid -> path to the sub-archive + containing the corresponding file. + This is different from the index method of ZipInterface and + TarInterface, where the dictionary values are the actual file + paths. + """ filename_mapping = {} archives = {} for path_to_archive in Path(filename).rglob("*"): @@ -373,10 +403,12 @@ def index(self, filename): filename_mapping[path_in_csv] = path_to_archive return archives, filename_mapping def close(self): + "Recursively close all open archives." for archive_path, archive in self.archives.items(): archive.close() def create_interface(filename, path_length): + "Choose the right interface type for the given path, and return an initialized interface." interfaces = [ArchiveFolder, FolderInterface, TarInterface, ZipInterface] for interface in interfaces: if interface.matches(filename): @@ -480,7 +512,6 @@ def __getitem__(self, idx): imgid = self.csv['Image Index'].iloc[idx] #img_path = os.path.join(self.imgpath, imgid) - #print(img_path) img = self.image_interface.get_image(imgid) if self.normalize: img = normalize(img, self.MAXVAL) From ccec9aed2b4b119eb82816c4a60451beafe75b2b Mon Sep 17 00:00:00 2001 From: bganglia Date: Thu, 27 Aug 2020 11:47:03 -0400 Subject: [PATCH 31/52] write partial metadata files with subset of columns --- tests/create_standard_test_output.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/tests/create_standard_test_output.py b/tests/create_standard_test_output.py index 69509b2..176ab82 100644 --- a/tests/create_standard_test_output.py +++ b/tests/create_standard_test_output.py @@ -3,38 +3,51 @@ n=10 -def create_standard_test_output(dataset, name): - dataset.csv[:n].to_csv(name) +def create_standard_test_output(dataset, name, columns = None): + minimal_dataset = dataset.csv[:n] + if columns is not None: + minimal_dataset = minimal_dataset[columns] + minimal_dataset.to_csv(name) +print("nih") create_standard_test_output( xrv.datasets.NIH_Dataset(imgpath="."), "nih.csv" ) +print("pc") create_standard_test_output( xrv.datasets.PC_Dataset(imgpath="."), "pc.csv" ) +print("openi") +openi = xrv.datasets.Openi_Dataset(imgpath=".") create_standard_test_output( - xrv.datasets.Openi_Dataset(imgpath="."), - "openi.csv" + openi, + "openi.csv", + columns=list(openi.dicom_metadata.columns) + ["imageid"] ) #NLMTB Shenzen +print("shenzen") create_standard_test_output( xrv.datasets.NLMTB_Dataset(imgpath=os.path.expanduser("~/ChinaSet_AllFiles.zip")), "shenzen.csv" ) #NLMTB Montgomery +print("montgomery") create_standard_test_output( xrv.datasets.NLMTB_Dataset(imgpath=os.path.expanduser("~/NLM-MontgomeryCXRSet.zip")), "montgomery.csv" ) #RSNA train +print("rsna (just train data)") +rsna = xrv.datasets.RSNA_Pneumonia_Dataset(imgpath=".") create_standard_test_output( - xrv.datasets.RSNA_Pneumonia_Dataset(imgpath="."), #csvpath="kaggle_stage_2_train_images_dicom_headers.csv.gz") - "rsna_train.csv" + xrv.datasets.RSNA_Pneumonia_Dataset(imgpath="."), + "rsna_train.csv", + columns=list(rsna.raw_csv.columns) + ["] ) From c091734397b93087206a584eb0d535b87557cdc5 Mon Sep 17 00:00:00 2001 From: bganglia Date: Thu, 27 Aug 2020 16:06:11 -0400 Subject: [PATCH 32/52] Improve caching --- torchxrayvision/datasets.py | 50 ++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index f1434ef..05edf0b 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -213,15 +213,11 @@ def last_n_in_filepath(filepath, n): end_part = os.path.join(middle_part, end_part) return end_part -#TODO:use .torchxrayvision - -stored_mapping_filename = "stored_mappings" - -if os.path.exists(stored_mapping_filename): - with open(stored_mapping_filename, "rb") as handle: - stored_mappings = pickle.load(handle) -else: - stored_mappings = {} +#Initialize pickled cache dictionary to {} if it doesn't exist +stored_mapping_filename = os.path.expanduser(os.path.join("~",".torchxrayvision","stored_mappings")) +if not os.path.exists(stored_mapping_filename): + with open(stored_mapping_filename, "wb") as handle: + pickle.dump({}, handle) class Interface: """ @@ -231,17 +227,21 @@ class Interface: path_length = 0 def load_dataset(self, filename): "Load the dataset's index from the cache if available, else create a new one." + filename = os.path.abspath(str(filename)) timestamp = os.path.getmtime(filename) + with open(stored_mapping_filename, "rb") as handle: + stored_mappings = pickle.load(handle) if not (filename, timestamp) in stored_mappings: + print("Indexing file paths (one-time). The next load will be faster") compressed, mapping = self.index(filename) - compressed = [i.offset for i in compressed.members] - stored_mappings[(filename, timestamp)] = (compressed, mapping) with open(stored_mapping_filename,"wb") as handle: - print(stored_mappings) - print(handle) + stored_mappings[(filename, timestamp)] = mapping pickle.dump(stored_mappings, handle) else: - compressed_offsets, mapping = zip_mapping[(filename, timestamp)] + print("Loading cached file path index") + mapping = stored_mappings[(filename, timestamp)] + compressed = self.get_archive(filename) + print(mapping) return compressed, mapping def convert_to_image(self, filename, bytes): "Convert an image byte array to a numpy array. If the filename ends with .dcm, use pydicom." @@ -271,9 +271,11 @@ def get_image(self, imgid): # check and reset number of open files if too many if len(self.compressed.keys()) > 64: self.compressed = {} - self.compressed[multiprocessing.current_process().name] = tarfile.open(self.imgpath) + self.compressed[multiprocessing.current_process().name] = self.get_archive(self.imgpath) bytes = self.compressed[multiprocessing.current_process().name].extractfile(archive_path).read() return self.convert_to_image(archive_path, bytes) + def get_archive(self, imgpath): + return tarfile.open(imgpath) def index(self, imgpath): "Create a dictionary mapping imgpath -> path within archive" compressed = tarfile.open(imgpath) @@ -282,6 +284,7 @@ def index(self, imgpath): for tar_info in tar_infos: if tar_info.type != "DIRTYPE": tar_path = tar_info.name + print(self.path_length, tar_path) imgid = last_n_in_filepath(tar_path, self.path_length) filename_mapping[imgid] = tar_path return compressed, filename_mapping @@ -313,6 +316,8 @@ def get_image(self, imgid): self.compressed[multiprocessing.current_process().name] = zipfile.ZipFile(self.imgpath) bytes = self.compressed[multiprocessing.current_process().name].open(archive_path).read() return self.convert_to_image(archive_path, bytes) + def get_archive(self, imgpath): + return zipfile.ZipFile(imgpath) def index(self, imgpath): "Create a dictionary mapping imgpath -> path within archive" compressed = zipfile.ZipFile(imgpath) @@ -321,6 +326,7 @@ def index(self, imgpath): for zip_info in zip_infos: if not zip_info.is_dir(): zip_path = zip_info.filename + print(self.path_length, zip_path) imgid = last_n_in_filepath(zip_path, self.path_length) filename_mapping[imgid] = zip_path return compressed, filename_mapping @@ -339,6 +345,8 @@ def __init__(self, imgpath, path_length): "Store the archive path, and the length of the partial paths within the archive" self.path_length = path_length self.path, self.filename_mapping = self.load_dataset(imgpath) + def get_archive(self, imgid): + pass def get_image(self, imgid): "Return the image object for the partial path provided." archive_path = self.filename_mapping[imgid] @@ -381,6 +389,8 @@ def __init__(self, imgpath, path_length): "Store the archive path, and the length of the partial paths within the archive" self.path_length = path_length self.archives, self.filename_mapping = self.load_dataset(imgpath) + def get_archive(self, imgpath): + return get_interface(imgpath) def get_image(self, imgid): "Return the image object for the partial path provided." path_to_archive = self.filename_mapping[imgid] @@ -393,15 +403,19 @@ def index(self, filename): TarInterface, where the dictionary values are the actual file paths. """ + archives = self.get_archive(filename) filename_mapping = {} + for path_to_archive, archive in archives.items(): + for path_in_csv, path_in_archive in archive.filename_mapping.items(): + filename_mapping[path_in_csv] = path_to_archive + return archives, filename_mapping + def get_archive(self, filename): archives = {} for path_to_archive in Path(filename).rglob("*"): if is_archive(path_to_archive): archive = create_interface(path_to_archive, self.path_length) archives[path_to_archive] = archive - for path_in_csv, path_in_archive in archive.filename_mapping.items(): - filename_mapping[path_in_csv] = path_to_archive - return archives, filename_mapping + return archives def close(self): "Recursively close all open archives." for archive_path, archive in self.archives.items(): From e56a5654cc52f6e3a31891c4dd56796581dbdaae Mon Sep 17 00:00:00 2001 From: bganglia Date: Thu, 27 Aug 2020 21:12:35 -0400 Subject: [PATCH 33/52] fix tests --- tests/test_dataloaders.py | 31 +++++++++++++++++-------------- torchxrayvision/datasets.py | 36 +++++++++++++++++++----------------- 2 files changed, 36 insertions(+), 31 deletions(-) diff --git a/tests/test_dataloaders.py b/tests/test_dataloaders.py index 324a8b8..f487006 100644 --- a/tests/test_dataloaders.py +++ b/tests/test_dataloaders.py @@ -51,6 +51,7 @@ def test_dataloader_merging_incorrect_alignment(): assert "incorrect pathology alignment" in str(excinfo.value) + def all_equal(items): if len(items) == 1: return True @@ -69,18 +70,19 @@ def _test_opening_formats(dataset_class, imgpaths, n=10, **kwargs): break assert all_equal([pickle.dumps(item) for item in one_item_from_each]) #Try loading each in a parallel way - for source in sources: - source.csv = source.csv.iloc[:,:10] - dataset = torch.utils.data.DataLoader( - source, - batch_size=10, - shuffle=False, - num_workers=8, - pin_memory=False - ) - for i, _ in enumerate(dataset): - if i >= n - 1: - break + #for source in sources: + # source.csv = source.csv.iloc[:10] + # source.labels = source.labels[:10] + # dataset = torch.utils.data.DataLoader( + # source, + # batch_size=10, + # shuffle=False, + # num_workers=8, + # pin_memory=False + # ) + # for i, _ in enumerate(dataset): + # if i >= n - 1: + # break for source in sources: source.image_interface.close() @@ -170,7 +172,7 @@ def test_rsna_jpg_formats(): "tests/RSNA_test_data_jpg/tgz_1", "tests/RSNA_test_data_jpg/tgz_2" ], - dicomcsvpath="tests/rsna_train.csv" + csvpath="tests/rsna_train.csv" ) def test_rsna_dcm_formats(): @@ -185,7 +187,7 @@ def test_rsna_dcm_formats(): "tests/RSNA_test_data_dcm/tgz_1", "tests/RSNA_test_data_dcm/tgz_2" ], - #dicomcsvpath="tests/rsna_train.csv", + csvpath="tests/rsna_train.csv", extension=".dcm" ) @@ -249,3 +251,4 @@ def test_mimic_formats(): csvpath="tests/gen_mimic/mimic-cxr-2.0.0-negbio.csv", metacsvpath="tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv" ) + diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index 05edf0b..4bfc111 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -225,22 +225,24 @@ class Interface: See child classes TarInterface, ZipInterface, FolderInterface, and ArchiveFolder. """ path_length = 0 - def load_dataset(self, filename): + def load_dataset(self, filename, save_to_cache=True, load_from_cache=True): "Load the dataset's index from the cache if available, else create a new one." filename = os.path.abspath(str(filename)) timestamp = os.path.getmtime(filename) + length = self.path_length with open(stored_mapping_filename, "rb") as handle: stored_mappings = pickle.load(handle) - if not (filename, timestamp) in stored_mappings: - print("Indexing file paths (one-time). The next load will be faster") - compressed, mapping = self.index(filename) - with open(stored_mapping_filename,"wb") as handle: - stored_mappings[(filename, timestamp)] = mapping - pickle.dump(stored_mappings, handle) - else: + if load_from_cache and (filename, timestamp, length) in stored_mappings: print("Loading cached file path index") - mapping = stored_mappings[(filename, timestamp)] + mapping = stored_mappings[(filename, timestamp, length)] compressed = self.get_archive(filename) + else: + print("Indexing file paths (one-time). The next load will be faster") + compressed, mapping = self.index(filename) + if save_to_cache: + with open(stored_mapping_filename,"wb") as handle: + stored_mappings[(filename, timestamp, length)] = mapping + pickle.dump(stored_mappings, handle) print(mapping) return compressed, mapping def convert_to_image(self, filename, bytes): @@ -257,11 +259,11 @@ class TarInterface(Interface): def matches(cls, filename): "Return whether the given path is a tar archive." return not os.path.isdir(filename) and tarfile.is_tarfile(filename) - def __init__(self, imgpath, path_length): + def __init__(self, imgpath, path_length, save_to_cache=True, load_from_cache=True): "Store the archive path, and the length of the partial paths within the archive" self.path_length = path_length self.imgpath = imgpath - compressed, self.filename_mapping = self.load_dataset(imgpath) + compressed, self.filename_mapping = self.load_dataset(imgpath, save_to_cache, load_from_cache) self.compressed = {multiprocessing.current_process():compressed} def get_image(self, imgid): "Return the image object for the partial path provided." @@ -299,11 +301,11 @@ class ZipInterface(Interface): def matches(cls, filename): "Return whether the given path is a zip archive." return not os.path.isdir(filename) and zipfile.is_zipfile(filename) - def __init__(self, imgpath, path_length): + def __init__(self, imgpath, path_length, save_to_cache=True, load_from_cache=True): "Store the archive path, and the length of the partial paths within the archive" self.path_length = path_length self.imgpath = imgpath - compressed, self.filename_mapping = self.load_dataset(imgpath) + compressed, self.filename_mapping = self.load_dataset(imgpath, save_to_cache, load_from_cache) self.compressed = {multiprocessing.current_process().name:compressed} def get_image(self, imgid): "Return the image object for the partial path provided." @@ -341,10 +343,10 @@ class FolderInterface(Interface): def matches(cls, filename): "Return whether the given path is a zip archive." return os.path.isdir(filename) - def __init__(self, imgpath, path_length): + def __init__(self, imgpath, path_length, save_to_cache=True, load_from_cache=True): "Store the archive path, and the length of the partial paths within the archive" self.path_length = path_length - self.path, self.filename_mapping = self.load_dataset(imgpath) + self.path, self.filename_mapping = self.load_dataset(imgpath, save_to_cache, load_from_cache) def get_archive(self, imgid): pass def get_image(self, imgid): @@ -385,10 +387,10 @@ def matches(cls, filename): if is_archive(item): return True return False - def __init__(self, imgpath, path_length): + def __init__(self, imgpath, path_length, save_to_cache=True, load_from_cache=True): "Store the archive path, and the length of the partial paths within the archive" self.path_length = path_length - self.archives, self.filename_mapping = self.load_dataset(imgpath) + self.archives, self.filename_mapping = self.load_dataset(imgpath, save_to_cache, load_from_cache) def get_archive(self, imgpath): return get_interface(imgpath) def get_image(self, imgid): From 1dde4b76b20a402e7ca20f967a0c9f9540afc754 Mon Sep 17 00:00:00 2001 From: bganglia Date: Thu, 27 Aug 2020 21:15:35 -0400 Subject: [PATCH 34/52] fix error in data-generation script --- tests/create_standard_test_output.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/create_standard_test_output.py b/tests/create_standard_test_output.py index 176ab82..5b924b6 100644 --- a/tests/create_standard_test_output.py +++ b/tests/create_standard_test_output.py @@ -7,7 +7,7 @@ def create_standard_test_output(dataset, name, columns = None): minimal_dataset = dataset.csv[:n] if columns is not None: minimal_dataset = minimal_dataset[columns] - minimal_dataset.to_csv(name) + minimal_dataset.to_csv(name, index=False) print("nih") create_standard_test_output( @@ -49,5 +49,5 @@ def create_standard_test_output(dataset, name, columns = None): create_standard_test_output( xrv.datasets.RSNA_Pneumonia_Dataset(imgpath="."), "rsna_train.csv", - columns=list(rsna.raw_csv.columns) + ["] + columns=list(rsna.raw_csv.columns) + ["patientId"] ) From 1628db48032d0a779299da71c1bf0e6a7eabb853 Mon Sep 17 00:00:00 2001 From: bganglia Date: Thu, 27 Aug 2020 21:20:37 -0400 Subject: [PATCH 35/52] create .torchxrayvision if it does not already exist --- torchxrayvision/datasets.py | 1 + 1 file changed, 1 insertion(+) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index 4bfc111..5df4769 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -216,6 +216,7 @@ def last_n_in_filepath(filepath, n): #Initialize pickled cache dictionary to {} if it doesn't exist stored_mapping_filename = os.path.expanduser(os.path.join("~",".torchxrayvision","stored_mappings")) if not os.path.exists(stored_mapping_filename): + os.mkdirs(os.path.dirname(stored_mapping_filename), exist_ok=True) with open(stored_mapping_filename, "wb") as handle: pickle.dump({}, handle) From 124467cd41a69e5894290048dcae9a1d4b71dd17 Mon Sep 17 00:00:00 2001 From: bganglia Date: Thu, 27 Aug 2020 21:28:56 -0400 Subject: [PATCH 36/52] fix line adding .torchxrayvision --- torchxrayvision/datasets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index 5df4769..1f1782c 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -216,7 +216,7 @@ def last_n_in_filepath(filepath, n): #Initialize pickled cache dictionary to {} if it doesn't exist stored_mapping_filename = os.path.expanduser(os.path.join("~",".torchxrayvision","stored_mappings")) if not os.path.exists(stored_mapping_filename): - os.mkdirs(os.path.dirname(stored_mapping_filename), exist_ok=True) + os.makedirs(os.path.dirname(stored_mapping_filename), exist_ok=True) with open(stored_mapping_filename, "wb") as handle: pickle.dump({}, handle) From 28816e566350e535698481414a4844eba352d5a5 Mon Sep 17 00:00:00 2001 From: bganglia Date: Thu, 27 Aug 2020 21:38:58 -0400 Subject: [PATCH 37/52] Commit sample data for testing NLM_TB datasets, instead of auto-generating it --- tests/create_standard_test_output.py | 20 ++++++++++---------- tests/montgomery.csv | 11 +++++++++++ tests/shenzen.csv | 11 +++++++++++ 3 files changed, 32 insertions(+), 10 deletions(-) create mode 100644 tests/montgomery.csv create mode 100644 tests/shenzen.csv diff --git a/tests/create_standard_test_output.py b/tests/create_standard_test_output.py index 5b924b6..4ef5bcc 100644 --- a/tests/create_standard_test_output.py +++ b/tests/create_standard_test_output.py @@ -30,18 +30,18 @@ def create_standard_test_output(dataset, name, columns = None): ) #NLMTB Shenzen -print("shenzen") -create_standard_test_output( - xrv.datasets.NLMTB_Dataset(imgpath=os.path.expanduser("~/ChinaSet_AllFiles.zip")), - "shenzen.csv" -) +#print("shenzen") +#create_standard_test_output( +# xrv.datasets.NLMTB_Dataset(imgpath=os.path.expanduser("~/ChinaSet_AllFiles.zip")), +# "shenzen.csv" +#) #NLMTB Montgomery -print("montgomery") -create_standard_test_output( - xrv.datasets.NLMTB_Dataset(imgpath=os.path.expanduser("~/NLM-MontgomeryCXRSet.zip")), - "montgomery.csv" -) +#print("montgomery") +#create_standard_test_output( +# xrv.datasets.NLMTB_Dataset(imgpath=os.path.expanduser("~/NLM-MontgomeryCXRSet.zip")), +# "montgomery.csv" +#) #RSNA train print("rsna (just train data)") diff --git a/tests/montgomery.csv b/tests/montgomery.csv new file mode 100644 index 0000000..0ceab0b --- /dev/null +++ b/tests/montgomery.csv @@ -0,0 +1,11 @@ +fname,label +CXR_png/MCUCXR_0001_0.png,0 +CXR_png/MCUCXR_0002_0.png,0 +CXR_png/MCUCXR_0003_0.png,0 +CXR_png/MCUCXR_0004_0.png,0 +CXR_png/MCUCXR_0005_0.png,0 +CXR_png/MCUCXR_0006_0.png,0 +CXR_png/MCUCXR_0008_0.png,0 +CXR_png/MCUCXR_0011_0.png,0 +CXR_png/MCUCXR_0013_0.png,0 +CXR_png/MCUCXR_0015_0.png,0 diff --git a/tests/shenzen.csv b/tests/shenzen.csv new file mode 100644 index 0000000..889c396 --- /dev/null +++ b/tests/shenzen.csv @@ -0,0 +1,11 @@ +fname,label +CXR_png/CHNCXR_0001_0.png,0 +CXR_png/CHNCXR_0002_0.png,0 +CXR_png/CHNCXR_0003_0.png,0 +CXR_png/CHNCXR_0004_0.png,0 +CXR_png/CHNCXR_0005_0.png,0 +CXR_png/CHNCXR_0006_0.png,0 +CXR_png/CHNCXR_0007_0.png,0 +CXR_png/CHNCXR_0008_0.png,0 +CXR_png/CHNCXR_0009_0.png,0 +CXR_png/CHNCXR_0010_0.png,0 From ce38e57508defaab733e0cd7fb7d4ea44c4a110b Mon Sep 17 00:00:00 2001 From: bganglia Date: Thu, 27 Aug 2020 21:54:06 -0400 Subject: [PATCH 38/52] Commit covid test cases --- tests/test_covid_data.csv | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 tests/test_covid_data.csv diff --git a/tests/test_covid_data.csv b/tests/test_covid_data.csv new file mode 100644 index 0000000..a5c6187 --- /dev/null +++ b/tests/test_covid_data.csv @@ -0,0 +1,11 @@ +patientid,offset,sex,age,finding,RT_PCR_positive,survival,intubated,intubation_present,went_icu,in_icu,needed_supplemental_O2,extubated,temperature,pO2_saturation,leukocyte_count,neutrophil_count,lymphocyte_count,view,modality,date,location,folder,filename,doi,url,license,clinical_notes,other_notes +2,0,M,65,COVID-19,Y,Y,N,N,N,N,Y,,,,,,,PA,X-ray,"January 22, 2020","Cho Ray Hospital, Ho Chi Minh City, Vietnam",images,auntminnie-a-2020_01_28_23_51_6665_2020_01_28_Vietnam_coronavirus.jpeg,10.1056/nejmc2001272,https://www.nejm.org/doi/full/10.1056/NEJMc2001272,,"On January 22, 2020, a 65-year-old man with a history of hypertension, type 2 diabetes, coronary heart disease for which a stent had been implanted, and lung cancer was admitted to the emergency department of Cho Ray Hospital, the referral hospital in Ho Chi Minh City, for low-grade fever and fatigue. He had become ill with fever on January 17, a total of 4 days after he and his wife had flown to Hanoi from the Wuchang district in Wuhan, where outbreaks of 2019-nCoV were occurring. He reported that he had not been exposed to a “wet market” (a market where dead and live animals are sold) in Wuhan. Chest radiographs obtained on admission showed an infiltrate in the upper lobe of the left lung", +2,3,M,65,COVID-19,Y,Y,N,N,N,N,Y,,,,,,,PA,X-ray,"January 25, 2020","Cho Ray Hospital, Ho Chi Minh City, Vietnam",images,auntminnie-b-2020_01_28_23_51_6665_2020_01_28_Vietnam_coronavirus.jpeg,10.1056/nejmc2001272,https://www.nejm.org/doi/full/10.1056/NEJMc2001272,,"On January 22, 2020, a 65-year-old man with a history of hypertension, type 2 diabetes, coronary heart disease for which a stent had been implanted, and lung cancer was admitted to the emergency department of Cho Ray Hospital, the referral hospital in Ho Chi Minh City, for low-grade fever and fatigue. He had become ill with fever on January 17, a total of 4 days after he and his wife had flown to Hanoi from the Wuchang district in Wuhan, where outbreaks of 2019-nCoV were occurring. He reported that he had not been exposed to a “wet market” (a market where dead and live animals are sold) in Wuhan. On January 25, he received supplemental oxygen through a nasal cannula at a rate of 5 liters per minute because of increasing dyspnea with hypoxemia. The partial pressure of oxygen was 57.2 mm Hg while he was breathing ambient air, and a progressive infiltrate and consolidation were observed on chest radiographs", +2,5,M,65,COVID-19,Y,Y,N,N,N,N,Y,,,,,,,PA,X-ray,"January 27, 2020","Cho Ray Hospital, Ho Chi Minh City, Vietnam",images,auntminnie-c-2020_01_28_23_51_6665_2020_01_28_Vietnam_coronavirus.jpeg,10.1056/nejmc2001272,https://www.nejm.org/doi/full/10.1056/NEJMc2001272,,"On January 22, 2020, a 65-year-old man with a history of hypertension, type 2 diabetes, coronary heart disease for which a stent had been implanted, and lung cancer was admitted to the emergency department of Cho Ray Hospital, the referral hospital in Ho Chi Minh City, for low-grade fever and fatigue. He had become ill with fever on January 17, a total of 4 days after he and his wife had flown to Hanoi from the Wuchang district in Wuhan, where outbreaks of 2019-nCoV were occurring. He reported that he had not been exposed to a “wet market” (a market where dead and live animals are sold) in Wuhan. On January 25, he received supplemental oxygen through a nasal cannula at a rate of 5 liters per minute because of increasing dyspnea with hypoxemia. The partial pressure of oxygen was 57.2 mm Hg while he was breathing ambient air, and a progressive infiltrate and consolidation were observed on chest radiographs", +2,6,M,65,COVID-19,Y,Y,N,N,N,N,Y,,,,,,,PA,X-ray,"January 28, 2020","Cho Ray Hospital, Ho Chi Minh City, Vietnam",images,auntminnie-d-2020_01_28_23_51_6665_2020_01_28_Vietnam_coronavirus.jpeg,10.1056/nejmc2001272,https://www.nejm.org/doi/full/10.1056/NEJMc2001272,,"On January 22, 2020, a 65-year-old man with a history of hypertension, type 2 diabetes, coronary heart disease for which a stent had been implanted, and lung cancer was admitted to the emergency department of Cho Ray Hospital, the referral hospital in Ho Chi Minh City, for low-grade fever and fatigue. He had become ill with fever on January 17, a total of 4 days after he and his wife had flown to Hanoi from the Wuchang district in Wuhan, where outbreaks of 2019-nCoV were occurring. He reported that he had not been exposed to a “wet market” (a market where dead and live animals are sold) in Wuhan. Progressive infiltrate and consolidation", +4,0,F,52,COVID-19,Y,,N,N,N,N,N,,,,,,,PA,X-ray,"January 25, 2020","Changhua Christian Hospital, Changhua City, Taiwan ",images,nejmc2001573_f1a.jpeg,10.1056/NEJMc2001573,https://www.nejm.org/doi/full/10.1056/NEJMc2001573,,diffuse infiltrates in the bilateral lower lungs, +4,5,F,52,COVID-19,Y,,N,N,N,N,N,,,,,,,PA,X-ray,"January 30, 2020","Changhua Christian Hospital, Changhua City, Taiwan ",images,nejmc2001573_f1b.jpeg,10.1056/NEJMc2001573,https://www.nejm.org/doi/full/10.1056/NEJMc2001573,,progressive diffuse interstitial opacities and consolidation in the bilateral parahilar areas and lower lung fields, +5,,,,ARDS,,,Y,Y,Y,Y,,,,,,,,PA,X-ray,2017,,images,ARDSSevere.png,,https://en.wikipedia.org/wiki/File:ARDSSevere.png,CC BY-SA,Severe ARDS. Person is intubated with an OG in place., +6,0,,,COVID-19,Y,,Y,Y,Y,Y,,,,,,,,PA,X-ray,"January 6, 2020","Wuhan Jinyintan Hospital, Wuhan, Hubei Province, China",images,lancet-case2a.jpg,10.1016/S0140-6736(20)30211-7,https://www.thelancet.com/journals/lancet/article/PIIS0140-6736%2820%2930211-7/fulltext,,"Case 2: chest x-ray obtained on Jan 6 (2A). The brightness of both lungs was decreased and multiple patchy shadows were observed; edges were blurred, and large ground-glass opacity and condensation shadows were mainly on the lower right lobe. Tracheal intubation could be seen in the trachea. Heart shadow roughly presents in the normal range. On the left side, the diaphragmatic surface is not clearly displayed. The right side of the diaphragmatic surface was light and smooth and rib phrenic angle was less sharp. Chest x-ray on Jan 10 showed worse status (2B)", +6,4,,,COVID-19,Y,,Y,Y,Y,Y,,,,,,,,PA,X-ray,"January 10, 2020","Wuhan Jinyintan Hospital, Wuhan, Hubei Province, China",images,lancet-case2b.jpg,10.1016/S0140-6736(20)30211-7,https://www.thelancet.com/journals/lancet/article/PIIS0140-6736%2820%2930211-7/fulltext,,"Case 2: chest x-ray obtained on Jan 6 (2A). The brightness of both lungs was decreased and multiple patchy shadows were observed; edges were blurred, and large ground-glass opacity and condensation shadows were mainly on the lower right lobe. Tracheal intubation could be seen in the trachea. Heart shadow roughly presents in the normal range. On the left side, the diaphragmatic surface is not clearly displayed. The right side of the diaphragmatic surface was light and smooth and rib phrenic angle was less sharp. Chest x-ray on Jan 10 showed worse status (2B)", +3,4,M,74,SARS,,N,,,,,,,38,,,,,AP,X-ray,2004,"Mount Sinai Hospital, Toronto, Ontario, Canada",images,SARS-10.1148rg.242035193-g04mr34g0-Fig8a-day0.jpeg,10.1148/rg.242035193,https://pubs.rsna.org/doi/10.1148/rg.242035193,,SARS in a 74-year-old man who developed symptoms 4 days after exposure. Initial anteroposterior chest radiograph shows bilateral airspace disease that is more extensive in the left lung., From 281935c79b70b6358cea81024880c8f20c802e4c Mon Sep 17 00:00:00 2001 From: bganglia Date: Thu, 27 Aug 2020 23:03:13 -0400 Subject: [PATCH 39/52] Include parallel tests again --- tests/test_dataloaders.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/tests/test_dataloaders.py b/tests/test_dataloaders.py index f487006..4230e72 100644 --- a/tests/test_dataloaders.py +++ b/tests/test_dataloaders.py @@ -70,19 +70,19 @@ def _test_opening_formats(dataset_class, imgpaths, n=10, **kwargs): break assert all_equal([pickle.dumps(item) for item in one_item_from_each]) #Try loading each in a parallel way - #for source in sources: - # source.csv = source.csv.iloc[:10] - # source.labels = source.labels[:10] - # dataset = torch.utils.data.DataLoader( - # source, - # batch_size=10, - # shuffle=False, - # num_workers=8, - # pin_memory=False - # ) - # for i, _ in enumerate(dataset): - # if i >= n - 1: - # break + for source in sources: + source.csv = source.csv.iloc[:10] + source.labels = source.labels[:10] + dataset = torch.utils.data.DataLoader( + source, + batch_size=10, + shuffle=False, + num_workers=8, + pin_memory=False + ) + for i, _ in enumerate(dataset): + if i >= n - 1: + break for source in sources: source.image_interface.close() From 9c2c9d21abbcf4006cca123dd3342c99eec12c50 Mon Sep 17 00:00:00 2001 From: bganglia Date: Fri, 28 Aug 2020 12:31:31 -0400 Subject: [PATCH 40/52] trycatch on reading/writing stored_mappings, with disk_unwriteable_out_of_date variable to prevent reading from an out-of-date cache --- torchxrayvision/datasets.py | 39 ++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index 1f1782c..1a80d40 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -215,10 +215,20 @@ def last_n_in_filepath(filepath, n): #Initialize pickled cache dictionary to {} if it doesn't exist stored_mapping_filename = os.path.expanduser(os.path.join("~",".torchxrayvision","stored_mappings")) -if not os.path.exists(stored_mapping_filename): - os.makedirs(os.path.dirname(stored_mapping_filename), exist_ok=True) - with open(stored_mapping_filename, "wb") as handle: - pickle.dump({}, handle) + +if os.path.exists(stored_mapping_filename): + try: + stored_mapping = pickle.load(handle) + except: + stored_mapping = {} +else: + try: + os.makedirs(os.path.dirname(stored_mapping_filename), exist_ok=True) + with open(stored_mapping_filename, "wb") as handle: + pickle.dump({}, handle) + disk_unwriteable_out_of_date = False + except: + disk_unwriteable_out_of_date = True class Interface: """ @@ -228,11 +238,19 @@ class Interface: path_length = 0 def load_dataset(self, filename, save_to_cache=True, load_from_cache=True): "Load the dataset's index from the cache if available, else create a new one." + global stored_mappings + global writeable + filename = os.path.abspath(str(filename)) timestamp = os.path.getmtime(filename) length = self.path_length - with open(stored_mapping_filename, "rb") as handle: - stored_mappings = pickle.load(handle) + + if disk_unwriteable_out_of_date: + try: + with open(stored_mapping_filename, "rb") as handle: + stored_mappings = pickle.load(handle) + except: + pass if load_from_cache and (filename, timestamp, length) in stored_mappings: print("Loading cached file path index") mapping = stored_mappings[(filename, timestamp, length)] @@ -241,9 +259,12 @@ def load_dataset(self, filename, save_to_cache=True, load_from_cache=True): print("Indexing file paths (one-time). The next load will be faster") compressed, mapping = self.index(filename) if save_to_cache: - with open(stored_mapping_filename,"wb") as handle: - stored_mappings[(filename, timestamp, length)] = mapping - pickle.dump(stored_mappings, handle) + stored_mappings[(filename, timestamp, length)] = mapping + try: #In case .torchxrayvision is not writeable + with open(stored_mapping_filename,"wb") as handle: + pickle.dump(stored_mappings, handle) + except: + disk_unwriteable_out_of_date = False print(mapping) return compressed, mapping def convert_to_image(self, filename, bytes): From 7c6aebbe612628450ad83084f5045d225cc04c97 Mon Sep 17 00:00:00 2001 From: bganglia Date: Fri, 28 Aug 2020 12:57:51 -0400 Subject: [PATCH 41/52] work when .torchxrayvision is not writeable --- torchxrayvision/datasets.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index 1a80d40..cd79ebb 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -216,12 +216,14 @@ def last_n_in_filepath(filepath, n): #Initialize pickled cache dictionary to {} if it doesn't exist stored_mapping_filename = os.path.expanduser(os.path.join("~",".torchxrayvision","stored_mappings")) +disk_unwriteable_out_of_date = False if os.path.exists(stored_mapping_filename): try: - stored_mapping = pickle.load(handle) + stored_mappings = pickle.load(handle) except: - stored_mapping = {} + stored_mappings = {} else: + stored_mappings = {} try: os.makedirs(os.path.dirname(stored_mapping_filename), exist_ok=True) with open(stored_mapping_filename, "wb") as handle: @@ -239,7 +241,7 @@ class Interface: def load_dataset(self, filename, save_to_cache=True, load_from_cache=True): "Load the dataset's index from the cache if available, else create a new one." global stored_mappings - global writeable + global disk_unwriteable_out_of_date filename = os.path.abspath(str(filename)) timestamp = os.path.getmtime(filename) @@ -249,8 +251,8 @@ def load_dataset(self, filename, save_to_cache=True, load_from_cache=True): try: with open(stored_mapping_filename, "rb") as handle: stored_mappings = pickle.load(handle) - except: - pass + except: + pass if load_from_cache and (filename, timestamp, length) in stored_mappings: print("Loading cached file path index") mapping = stored_mappings[(filename, timestamp, length)] From cb97e700f3e3629bf474fa13e9e0f1df19ae6fdd Mon Sep 17 00:00:00 2001 From: bganglia Date: Fri, 28 Aug 2020 13:14:11 -0400 Subject: [PATCH 42/52] remove some print statements --- torchxrayvision/datasets.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index cd79ebb..c8ce4cf 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -267,7 +267,6 @@ def load_dataset(self, filename, save_to_cache=True, load_from_cache=True): pickle.dump(stored_mappings, handle) except: disk_unwriteable_out_of_date = False - print(mapping) return compressed, mapping def convert_to_image(self, filename, bytes): "Convert an image byte array to a numpy array. If the filename ends with .dcm, use pydicom." @@ -310,7 +309,6 @@ def index(self, imgpath): for tar_info in tar_infos: if tar_info.type != "DIRTYPE": tar_path = tar_info.name - print(self.path_length, tar_path) imgid = last_n_in_filepath(tar_path, self.path_length) filename_mapping[imgid] = tar_path return compressed, filename_mapping @@ -352,7 +350,6 @@ def index(self, imgpath): for zip_info in zip_infos: if not zip_info.is_dir(): zip_path = zip_info.filename - print(self.path_length, zip_path) imgid = last_n_in_filepath(zip_path, self.path_length) filename_mapping[imgid] = zip_path return compressed, filename_mapping From 950ae96b0d307c9e29111705bf4dcd1b41531288 Mon Sep 17 00:00:00 2001 From: bganglia Date: Fri, 28 Aug 2020 13:14:29 -0400 Subject: [PATCH 43/52] add test simulating an unwriteable disk --- tests/test_dataloaders.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/test_dataloaders.py b/tests/test_dataloaders.py index 4230e72..b6239b9 100644 --- a/tests/test_dataloaders.py +++ b/tests/test_dataloaders.py @@ -252,3 +252,14 @@ def test_mimic_formats(): metacsvpath="tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv" ) +def test_unwriteable(): + #simulate an unwriteable by deleting stored_mappings. + + #The code only knows how to handle this when xrv.datasets is imported + #so it will rely on the code for an unwriteable disk. + + os.remove(os.path.expanduser("~/.torchxrayvision/stored_mappings")) + #Test one of the datasets. + test_chex_formats() + +test_unwriteable() From 300c9d7b914b5157da7cea145be0ee2b2957fa73 Mon Sep 17 00:00:00 2001 From: bganglia Date: Fri, 28 Aug 2020 19:03:35 -0400 Subject: [PATCH 44/52] use filesystem instead of dictionary --- torchxrayvision/datasets.py | 57 +++++++++++++------------------------ 1 file changed, 20 insertions(+), 37 deletions(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index c8ce4cf..e7a78c3 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -213,25 +213,6 @@ def last_n_in_filepath(filepath, n): end_part = os.path.join(middle_part, end_part) return end_part -#Initialize pickled cache dictionary to {} if it doesn't exist -stored_mapping_filename = os.path.expanduser(os.path.join("~",".torchxrayvision","stored_mappings")) - -disk_unwriteable_out_of_date = False -if os.path.exists(stored_mapping_filename): - try: - stored_mappings = pickle.load(handle) - except: - stored_mappings = {} -else: - stored_mappings = {} - try: - os.makedirs(os.path.dirname(stored_mapping_filename), exist_ok=True) - with open(stored_mapping_filename, "wb") as handle: - pickle.dump({}, handle) - disk_unwriteable_out_of_date = False - except: - disk_unwriteable_out_of_date = True - class Interface: """ This class has abstract methods for extracting files from an archive based on a partial path. @@ -240,33 +221,35 @@ class Interface: path_length = 0 def load_dataset(self, filename, save_to_cache=True, load_from_cache=True): "Load the dataset's index from the cache if available, else create a new one." - global stored_mappings - global disk_unwriteable_out_of_date filename = os.path.abspath(str(filename)) timestamp = os.path.getmtime(filename) length = self.path_length - if disk_unwriteable_out_of_date: - try: - with open(stored_mapping_filename, "rb") as handle: - stored_mappings = pickle.load(handle) - except: - pass - if load_from_cache and (filename, timestamp, length) in stored_mappings: - print("Loading cached file path index") - mapping = stored_mappings[(filename, timestamp, length)] + key = (filename, timestamp, length) + + key_filename = str(hash(key)) + ".pkl" + + filename_mapping_folder = os.path.expanduser(os.path.join( + "~", ".torchxrayvision", "filename-mapping-cache" + )) + + mapping_filename = os.path.join(filename_mapping_folder, key_filename) + + if os.path.exists(mapping_filename): + print("Loading indexed file paths from cache") + with open(mapping_filename, "rb") as handle: + mapping = pickle.load(handle) compressed = self.get_archive(filename) else: print("Indexing file paths (one-time). The next load will be faster") compressed, mapping = self.index(filename) - if save_to_cache: - stored_mappings[(filename, timestamp, length)] = mapping - try: #In case .torchxrayvision is not writeable - with open(stored_mapping_filename,"wb") as handle: - pickle.dump(stored_mappings, handle) - except: - disk_unwriteable_out_of_date = False + try: + os.makedirs(filename_mapping_folder, exist_ok=True) + with open(mapping_filename, "wb") as handle: + pickle.dump(mapping, handle) + except: + pass return compressed, mapping def convert_to_image(self, filename, bytes): "Convert an image byte array to a numpy array. If the filename ends with .dcm, use pydicom." From 218fa7576271b5fd7ae77b312703eead0c5f7f24 Mon Sep 17 00:00:00 2001 From: bganglia Date: Sat, 29 Aug 2020 21:31:54 -0400 Subject: [PATCH 45/52] rewrite data generation scripts as python, not bash scripts; add parameter for length of all datasets --- tests/bootstrap.py | 154 +++++++++++++++++++++++++++ tests/bootstrap.sh | 2 - tests/create_standard_test_output.py | 47 +------- tests/gen_chexpert.py | 7 +- tests/gen_mimic.py | 36 ++++--- tests/gen_mimic.sh | 2 - tests/generate_all.sh | 4 +- tests/generate_test_data.py | 36 +++---- tests/generate_test_data.sh | 9 -- tests/generate_tests.py | 32 ++++++ 10 files changed, 230 insertions(+), 99 deletions(-) create mode 100644 tests/bootstrap.py delete mode 100644 tests/bootstrap.sh delete mode 100644 tests/gen_mimic.sh delete mode 100644 tests/generate_test_data.sh create mode 100644 tests/generate_tests.py diff --git a/tests/bootstrap.py b/tests/bootstrap.py new file mode 100644 index 0000000..54e2cba --- /dev/null +++ b/tests/bootstrap.py @@ -0,0 +1,154 @@ +#bash generate_all.sh +from create_standard_test_output import create_standard_test_output +from gen_mimic import generate_mimic_test_data +from gen_chexpert import gen_chexpert +import torchxrayvision as xrv +from generate_test_data import generate_test_data +import pandas as pd + +n = 10 + +def create_csv_files(n): + print("nih") + create_standard_test_output( + xrv.datasets.NIH_Dataset(imgpath="."), + "nih.csv", + n=n + ) + + print("pc") + create_standard_test_output( + xrv.datasets.PC_Dataset(imgpath="."), + "pc.csv", + n=n + ) + + print("openi") + openi = xrv.datasets.Openi_Dataset(imgpath=".") + create_standard_test_output( + openi, + "openi.csv", + columns=list(openi.dicom_metadata.columns) + ["imageid"], + n=n + ) + + #RSNA train + print("rsna (just train data)") + rsna = xrv.datasets.RSNA_Pneumonia_Dataset(imgpath=".") + create_standard_test_output( + xrv.datasets.RSNA_Pneumonia_Dataset(imgpath="."), + "rsna_train.csv", + columns=list(rsna.raw_csv.columns) + ["patientId"], + n=n + ) + + #Chexpert + gen_chexpert(n, "test_chexpert_data.csv") + + #No data is generated for the COVID19, NLM_TB (Shenzen) or + #NLM_TB (Montgomery) datasets. + +def create_images(): + + #python3 generate_test_data.py pc.csv ImageID 2 2 PC_test_data + generate_test_data( + pd.read_csv("pc.csv"), + "ImageID", + (2, 2), + "PC_test_data", + "", + "." + ) + + #python3 generate_test_data.py nih.csv "Image Index" 2 2 NIH_test_data + generate_test_data( + pd.read_csv("nih.csv"), + "Image Index", + (2, 2), + "NIH_test_data", + "", + "." + ) + + #python3 generate_test_data.py openi.csv imageid 2 2 Openi_test_data .png + generate_test_data( + pd.read_csv("openi.csv"), + "imageid", + (2, 2), + "Openi_test_data", + ".png", + "." + ) + + #python3 generate_test_data.py shenzen.csv fname 2 2 Shenzen_test_data --subfolder CXR_png + generate_test_data( + pd.read_csv("shenzen.csv"), + "fname", + (2, 2), + "Shenzen_test_data", + "", + "CXR_png" + ) + + #python3 generate_test_data.py montgomery.csv fname 2 2 Montgomery_test_data --subfolder CXR_png + generate_test_data( + pd.read_csv("montgomery.csv"), + "fname", + (2, 2), + "Montgomery_test_data", + "", + "CXR_png" + ) + + #python3 generate_test_data.py rsna_train.csv patientId 2 2 RSNA_test_data_jpg .jpg --subfolder stage_2_train_images + generate_test_data( + pd.read_csv("rsna_train.csv"), + "patientId", + (2, 2), + "RSNA_test_data_jpg", + ".jpg", + "stage_2_train_images" + ) + + #python3 generate_test_data.py rsna_train.csv patientId 2 2 RSNA_test_data_dcm .dcm --subfolder stage_2_train_images + generate_test_data( + pd.read_csv("rsna_train.csv"), + "patientId", + (2, 2), + "RSNA_test_data_dcm", + ".dcm", + "stage_2_train_images" + ) + + #python3 generate_test_data.py test_chexpert_data.csv Path 2 2 CheXpert_test_data + generate_test_data( + pd.read_csv("test_chexpert_data.csv"), + "Path", + (2, 2), + "CheXpert_test_data", + "", + "." + ) + + #python3 generate_test_data.py test_covid_data.csv filename 2 2 COVID_test_data --subfolder images + generate_test_data( + pd.read_csv("test_covid_data.csv"), + "filename", + (2, 2), + "COVID_test_data", + "", + "." + ) + +def bootstrap_test_cases(n): + create_csv_files(n) + create_images() + #MIMIC is handled differently due to its unique structure + generate_mimic_test_data( + n, + directory = "gen_mimic", + dimensions = (2, 2) + ) + +if __name__ == "__main__": + bootstrap_test_cases(10) diff --git a/tests/bootstrap.sh b/tests/bootstrap.sh deleted file mode 100644 index 091075c..0000000 --- a/tests/bootstrap.sh +++ /dev/null @@ -1,2 +0,0 @@ -python create_standard_test_output.py -bash generate_all.sh diff --git a/tests/create_standard_test_output.py b/tests/create_standard_test_output.py index 4ef5bcc..369e3b1 100644 --- a/tests/create_standard_test_output.py +++ b/tests/create_standard_test_output.py @@ -1,53 +1,8 @@ import torchxrayvision as xrv import os -n=10 - -def create_standard_test_output(dataset, name, columns = None): +def create_standard_test_output(dataset, name, columns = None, n=10): minimal_dataset = dataset.csv[:n] if columns is not None: minimal_dataset = minimal_dataset[columns] minimal_dataset.to_csv(name, index=False) - -print("nih") -create_standard_test_output( - xrv.datasets.NIH_Dataset(imgpath="."), - "nih.csv" -) - -print("pc") -create_standard_test_output( - xrv.datasets.PC_Dataset(imgpath="."), - "pc.csv" -) - -print("openi") -openi = xrv.datasets.Openi_Dataset(imgpath=".") -create_standard_test_output( - openi, - "openi.csv", - columns=list(openi.dicom_metadata.columns) + ["imageid"] -) - -#NLMTB Shenzen -#print("shenzen") -#create_standard_test_output( -# xrv.datasets.NLMTB_Dataset(imgpath=os.path.expanduser("~/ChinaSet_AllFiles.zip")), -# "shenzen.csv" -#) - -#NLMTB Montgomery -#print("montgomery") -#create_standard_test_output( -# xrv.datasets.NLMTB_Dataset(imgpath=os.path.expanduser("~/NLM-MontgomeryCXRSet.zip")), -# "montgomery.csv" -#) - -#RSNA train -print("rsna (just train data)") -rsna = xrv.datasets.RSNA_Pneumonia_Dataset(imgpath=".") -create_standard_test_output( - xrv.datasets.RSNA_Pneumonia_Dataset(imgpath="."), - "rsna_train.csv", - columns=list(rsna.raw_csv.columns) + ["patientId"] -) diff --git a/tests/gen_chexpert.py b/tests/gen_chexpert.py index f4ae9a4..3e0d3ba 100644 --- a/tests/gen_chexpert.py +++ b/tests/gen_chexpert.py @@ -3,6 +3,8 @@ import pandas as pd import random +n = 10 + def probability(fraction): gran = 100 return np.random.randint(0, gran) < gran * fraction @@ -62,6 +64,5 @@ def gen_random_rows(nrows): rows.append(next(random_data_source)) return pd.DataFrame(rows) - - -gen_random_rows(10).to_csv("test_chexpert_data.csv") +def gen_chexpert(n, filename): + gen_random_rows(n).to_csv(filename) diff --git a/tests/gen_mimic.py b/tests/gen_mimic.py index 91c6831..e45e8e0 100644 --- a/tests/gen_mimic.py +++ b/tests/gen_mimic.py @@ -81,7 +81,7 @@ def generate_test_images(random_metadata, extracted, tarname, zipname, folder_of paths.append(Path("files")/img_fname) write_random_images(paths, extracted, tarname, zipname, folder_of_zip_name, folder_of_tar_gz_name, dimensions) -def generate_test_data(n, directory, dimensions=(224, 224), tarname=None, zipname=None, folder_of_zip_name=None, folder_of_tar_gz_name = None, extracted=None): +def generate_mimic_test_data(n, directory, dimensions=(224, 224), tarname=None, zipname=None, folder_of_zip_name=None, folder_of_tar_gz_name = None, extracted=None): directory = Path(directory) if tarname is None: tarname = directory/"images-224.tar" @@ -119,19 +119,21 @@ def generate_test_data(n, directory, dimensions=(224, 224), tarname=None, zipnam #./images-224/files/p17/p17387118/s56770356/b983f94c-b77ad35d-8a4aa372-2faf6503-5ec94835.jpg -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("n") - parser.add_argument("directory") - parser.add_argument("x") - parser.add_argument("y") - parser.add_argument("tarfile", default=None, nargs="?") - parser.add_argument("extracted", default=None, nargs="?") - args = parser.parse_args() - generate_test_data( - n=int(args.n), - directory = args.directory, - dimensions = (int(args.x), int(args.y)), - tarname = args.tarfile, - extracted = args.extracted - ) +#if __name__ == "__main__": +# parser = argparse.ArgumentParser() +# parser.add_argument("n") +# parser.add_argument("directory") +# parser.add_argument("x") +# parser.add_argument("y") +# parser.add_argument("tarfile", default=None, nargs="?") +# parser.add_argument("extracted", default=None, nargs="?") +# args = parser.parse_args() +# generate_test_data( +# n=int(args.n), +# directory = args.directory, +# dimensions = (int(args.x), int(args.y)), +# tarname = args.tarfile, +# extracted = args.extracted +# ) + +#python3 gen_mimic.py 10 gen_mimic 224 224 diff --git a/tests/gen_mimic.sh b/tests/gen_mimic.sh deleted file mode 100644 index 137de2d..0000000 --- a/tests/gen_mimic.sh +++ /dev/null @@ -1,2 +0,0 @@ -python3 gen_mimic.py 10 gen_mimic 224 224 - diff --git a/tests/generate_all.sh b/tests/generate_all.sh index 9a9ac9f..001d6f1 100644 --- a/tests/generate_all.sh +++ b/tests/generate_all.sh @@ -1,3 +1,3 @@ -bash gen_mimic.sh +python gen_mimic.py python gen_chexpert.py -bash generate_test_data.sh +python3 generate_test_data.py diff --git a/tests/generate_test_data.py b/tests/generate_test_data.py index 3691e93..b70649c 100644 --- a/tests/generate_test_data.py +++ b/tests/generate_test_data.py @@ -16,21 +16,21 @@ def generate_test_data(metadata_file, filename_column, size, test_data_folder, f subfolder=Path(subfolder) ) -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("metadata_file") - parser.add_argument("filename_column") - parser.add_argument("x") - parser.add_argument("y") - parser.add_argument("test_data_folder") - parser.add_argument("suffix", nargs="*", default="") - parser.add_argument("--subfolder", dest="subfolder", nargs="?", default=".") - args = parser.parse_args() - generate_test_data( - pd.read_csv(args.metadata_file), - args.filename_column, - (int(args.x), int(args.y)), - args.test_data_folder, - args.suffix, - args.subfolder - ) +#if __name__ == "__main__": +# parser = argparse.ArgumentParser() +# parser.add_argument("metadata_file") +# parser.add_argument("filename_column") +# parser.add_argument("x") +# parser.add_argument("y") +# parser.add_argument("test_data_folder") +# parser.add_argument("suffix", nargs="*", default="") +# parser.add_argument("--subfolder", dest="subfolder", nargs="?", default=".") +# args = parser.parse_args() +# generate_test_data( +# pd.read_csv(args.metadata_file), +# args.filename_column, +# (int(args.x), int(args.y)), +# args.test_data_folder, +# args.suffix, +# args.subfolder +# ) diff --git a/tests/generate_test_data.sh b/tests/generate_test_data.sh deleted file mode 100644 index a6c784f..0000000 --- a/tests/generate_test_data.sh +++ /dev/null @@ -1,9 +0,0 @@ -python3 generate_test_data.py pc.csv ImageID 2 2 PC_test_data -python3 generate_test_data.py nih.csv "Image Index" 2 2 NIH_test_data -python3 generate_test_data.py openi.csv imageid 2 2 Openi_test_data .png -python3 generate_test_data.py shenzen.csv fname 2 2 Shenzen_test_data --subfolder CXR_png -python3 generate_test_data.py montgomery.csv fname 2 2 Montgomery_test_data --subfolder CXR_png -python3 generate_test_data.py rsna_train.csv patientId 2 2 RSNA_test_data_jpg .jpg --subfolder stage_2_train_images -python3 generate_test_data.py rsna_train.csv patientId 2 2 RSNA_test_data_dcm .dcm --subfolder stage_2_train_images -python3 generate_test_data.py test_chexpert_data.csv Path 2 2 CheXpert_test_data -python3 generate_test_data.py test_covid_data.csv filename 2 2 COVID_test_data --subfolder images diff --git a/tests/generate_tests.py b/tests/generate_tests.py new file mode 100644 index 0000000..56b1724 --- /dev/null +++ b/tests/generate_tests.py @@ -0,0 +1,32 @@ +import torchxrayvision as xrv + +with open("test_indices") as handle: + indices = [int(line) for line in handle] + +create_tests_for = [ + (xrv.datasets.CheX_Dataset, + {"imgpath":"/network/tmp1/paul.morrison/network/CheXpert-v1.0-small.zip", + "csvpath":} + ), + (xrv.datasets.MIMIC_Dataset, + {} + ), + (xrv.datasets.NIH_Dataset, + ), + (xrv.datasets.NIH_Google_Dataset, + ), + (xrv.datasets.NLMTB_Dataset, + ), + (xrv.datasets.Openi_Dataset, + ), + (xrv.datasets.PC_Dataset, + ), + (xrv.datasets.RSNA_Pneumonia_Dataset, + ), + (xrv.datasets.COVID19_Dataset, + ) +] + +for dataset in create_tests_for: + print(dataset.__name__) + print(dataset().csv[:10]) From b22cead39f7bb62bed09f677bb64b6f3cdc30aa5 Mon Sep 17 00:00:00 2001 From: bganglia Date: Sun, 30 Aug 2020 23:44:10 -0400 Subject: [PATCH 46/52] cleanup: better variable names and use blake2b instead of hash (works between sessions) --- torchxrayvision/datasets.py | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index e7a78c3..97d84ae 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -22,6 +22,7 @@ import torch.nn.functional as F import torchvision import torchvision.transforms.functional as TF +from hashlib import blake2b import skimage.transform import warnings import tarfile @@ -225,10 +226,10 @@ def load_dataset(self, filename, save_to_cache=True, load_from_cache=True): filename = os.path.abspath(str(filename)) timestamp = os.path.getmtime(filename) length = self.path_length - key = (filename, timestamp, length) + print(key) - key_filename = str(hash(key)) + ".pkl" + key_filename = str(blake2b(pickle.dumps(key)).hexdigest()) + ".pkl" filename_mapping_folder = os.path.expanduser(os.path.join( "~", ".torchxrayvision", "filename-mapping-cache" @@ -236,6 +237,8 @@ def load_dataset(self, filename, save_to_cache=True, load_from_cache=True): mapping_filename = os.path.join(filename_mapping_folder, key_filename) + print(mapping_filename) + if os.path.exists(mapping_filename): print("Loading indexed file paths from cache") with open(mapping_filename, "rb") as handle: @@ -270,17 +273,17 @@ def __init__(self, imgpath, path_length, save_to_cache=True, load_from_cache=Tru self.path_length = path_length self.imgpath = imgpath compressed, self.filename_mapping = self.load_dataset(imgpath, save_to_cache, load_from_cache) - self.compressed = {multiprocessing.current_process():compressed} + self.all_compressed = {multiprocessing.current_process():compressed} def get_image(self, imgid): "Return the image object for the partial path provided." archive_path = self.filename_mapping[imgid] - if not multiprocessing.current_process().name in self.compressed: + if not multiprocessing.current_process().name in self.all_compressed: #print("Opening tar file on thread:",pid) # check and reset number of open files if too many - if len(self.compressed.keys()) > 64: - self.compressed = {} - self.compressed[multiprocessing.current_process().name] = self.get_archive(self.imgpath) - bytes = self.compressed[multiprocessing.current_process().name].extractfile(archive_path).read() + if len(self.all_compressed.keys()) > 64: + self.all_compressed = {} + self.all_compressed[multiprocessing.current_process().name] = self.get_archive(self.imgpath) + bytes = self.all_compressed[multiprocessing.current_process().name].extractfile(archive_path).read() return self.convert_to_image(archive_path, bytes) def get_archive(self, imgpath): return tarfile.open(imgpath) @@ -297,7 +300,7 @@ def index(self, imgpath): return compressed, filename_mapping def close(self): "Close all open tarfiles." - for compressed in self.compressed.values(): + for compressed in self.all_compressed.values(): compressed.close() class ZipInterface(Interface): @@ -311,17 +314,17 @@ def __init__(self, imgpath, path_length, save_to_cache=True, load_from_cache=Tru self.path_length = path_length self.imgpath = imgpath compressed, self.filename_mapping = self.load_dataset(imgpath, save_to_cache, load_from_cache) - self.compressed = {multiprocessing.current_process().name:compressed} + self.all_compressed = {multiprocessing.current_process().name:compressed} def get_image(self, imgid): "Return the image object for the partial path provided." archive_path = self.filename_mapping[imgid] - if not multiprocessing.current_process().name in self.compressed: + if not multiprocessing.current_process().name in self.all_compressed: #print("Opening zip file on thread:",multiprocessing.current_process()) # check and reset number of open files if too many - if len(self.compressed.keys()) > 64: - self.compressed = {} - self.compressed[multiprocessing.current_process().name] = zipfile.ZipFile(self.imgpath) - bytes = self.compressed[multiprocessing.current_process().name].open(archive_path).read() + if len(self.all_compressed.keys()) > 64: + self.all_compressed = {} + self.all_compressed[multiprocessing.current_process().name] = zipfile.ZipFile(self.imgpath) + bytes = self.all_compressed[multiprocessing.current_process().name].open(archive_path).read() return self.convert_to_image(archive_path, bytes) def get_archive(self, imgpath): return zipfile.ZipFile(imgpath) @@ -338,7 +341,7 @@ def index(self, imgpath): return compressed, filename_mapping def close(self): "Close all open zipfiles." - for compressed in self.compressed.values(): + for compressed in self.all_compressed.values(): compressed.close() class FolderInterface(Interface): From ae09bc9dd132c7bf040de0eb603f5e5eb5849f0a Mon Sep 17 00:00:00 2001 From: bganglia Date: Mon, 31 Aug 2020 00:17:20 -0400 Subject: [PATCH 47/52] Add test for asserting a dataset loads faster the second time --- tests/test_dataloaders.py | 56 +++++++++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 8 deletions(-) diff --git a/tests/test_dataloaders.py b/tests/test_dataloaders.py index b6239b9..a8b2820 100644 --- a/tests/test_dataloaders.py +++ b/tests/test_dataloaders.py @@ -3,7 +3,10 @@ import torchxrayvision as xrv import os import torch +from hashlib import blake2b +import time from pathlib import Path +import pdb dataset_classes = [xrv.datasets.NIH_Dataset, xrv.datasets.Openi_Dataset, @@ -28,6 +31,9 @@ def test_dataloader_merging(): dd = xrv.datasets.Merge_Dataset(datasets) + for dataset in datasets: + dataset.image_interface.close() + # test that we catch incorrect pathology alignment def test_dataloader_merging_incorrect_alignment(): with pytest.raises(Exception) as excinfo: @@ -83,6 +89,9 @@ def _test_opening_formats(dataset_class, imgpaths, n=10, **kwargs): for i, _ in enumerate(dataset): if i >= n - 1: break + #Ensure the second load is faster + for imgpath in imgpaths: + _test_second_load_faster(dataset_class, imgpath=imgpath, **kwargs) for source in sources: source.image_interface.close() @@ -102,6 +111,7 @@ def test_mimic_formats(): metacsvpath="tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv" ) + def test_nih_formats(): _test_opening_formats( xrv.datasets.NIH_Dataset, @@ -252,14 +262,44 @@ def test_mimic_formats(): metacsvpath="tests/gen_mimic/mimic-cxr-2.0.0-metadata.csv" ) -def test_unwriteable(): - #simulate an unwriteable by deleting stored_mappings. +def delete_cache_entry(imgpath, path_length): + timestamp = os.path.getmtime(imgpath) + imgpath = os.path.abspath(imgpath) + key = (imgpath, timestamp, path_length) + hash_value = blake2b(pickle.dumps(key)).hexdigest() + filename = str(hash_value) + ".pkl" + delete_path = os.path.expanduser(os.path.join("~",".torchxrayvision","filename-mapping-cache",filename)) + assert os.path.exists(delete_path) + if os.path.exists(delete_path): + os.remove(delete_path) + assert not os.path.exists(delete_path) + +def _test_second_load_faster(dataset, imgpath, *args, **kwargs): + delete_cache_entry( + imgpath, + dataset.path_length + ) + + #slow_times = [] + #fast_times = [] + + #for dataset, kwargs in zip(datasets, kwargs_sets): + slow_start = time.time() + dataset(*args, imgpath=imgpath, **kwargs) + slow_stop = time.time() + slow_time = slow_stop - slow_start + #slow_times.append(slow_time) + + #time.sleep(10) - #The code only knows how to handle this when xrv.datasets is imported - #so it will rely on the code for an unwriteable disk. + #for dataset, kwargs in zip(datasets, kwargs_sets): - os.remove(os.path.expanduser("~/.torchxrayvision/stored_mappings")) - #Test one of the datasets. - test_chex_formats() + fast_start = time.time() + b = dataset(*args, imgpath=imgpath, **kwargs) + fast_stop = time.time() + fast_time = fast_stop - fast_start + #fast_times.append(fast_times) -test_unwriteable() + #for slow_time, fast_time in zip(slow_times, fast_times): + print(round(slow_time, 2), round(fast_time, 2)) + assert slow_time > fast_time From 30c043b2ac9854107bdc059088342e1412de2765 Mon Sep 17 00:00:00 2001 From: bganglia Date: Mon, 31 Aug 2020 00:18:25 -0400 Subject: [PATCH 48/52] Don't invoke duration test, to avoid spurious errors --- tests/test_dataloaders.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/test_dataloaders.py b/tests/test_dataloaders.py index a8b2820..d21622b 100644 --- a/tests/test_dataloaders.py +++ b/tests/test_dataloaders.py @@ -90,8 +90,6 @@ def _test_opening_formats(dataset_class, imgpaths, n=10, **kwargs): if i >= n - 1: break #Ensure the second load is faster - for imgpath in imgpaths: - _test_second_load_faster(dataset_class, imgpath=imgpath, **kwargs) for source in sources: source.image_interface.close() From bfdebf23cb788f9ca5646d28b09432598ecc7fe4 Mon Sep 17 00:00:00 2001 From: bganglia Date: Mon, 31 Aug 2020 00:23:21 -0400 Subject: [PATCH 49/52] Call on new data generation script --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 177bc44..ee19176 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -46,7 +46,7 @@ jobs: - name: Run tests run: | cd tests - bash bootstrap.sh + python bootstrap.py cd .. pytest From 0f7ea51b19eb151bc3382744156cadd3f2649922 Mon Sep 17 00:00:00 2001 From: bganglia Date: Sat, 5 Sep 2020 18:38:33 -0400 Subject: [PATCH 50/52] simplify and improve documentation --- torchxrayvision/datasets.py | 177 +++++++++++++++++++++++++----------- 1 file changed, 123 insertions(+), 54 deletions(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index 97d84ae..52dd919 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -206,6 +206,11 @@ def __getitem__(self, idx): return self.dataset[self.idxs[idx]] def last_n_in_filepath(filepath, n): + """ + Return the last n pieces of a path (takes a string, not a Path object). + For example: + last_n_in_filepath("a/b/c",2) -> "b/c" + """ if n < 1: return "" start_part, end_part = os.path.split(filepath) @@ -214,53 +219,66 @@ def last_n_in_filepath(filepath, n): end_part = os.path.join(middle_part, end_part) return end_part -class Interface: +def get_filename_mapping_path(imgpath, path_length): """ - This class has abstract methods for extracting files from an archive based on a partial path. - See child classes TarInterface, ZipInterface, FolderInterface, and ArchiveFolder. + Create a hash of (imgpath, last_modification, path_length_for_mapping_key) + and use it to return the filepath for a cached index. """ - path_length = 0 - def load_dataset(self, filename, save_to_cache=True, load_from_cache=True): - "Load the dataset's index from the cache if available, else create a new one." + imgpath = os.path.abspath(str(imgpath)) + timestamp = os.path.getmtime(imgpath) + length = path_length + key = (imgpath, timestamp, length) - filename = os.path.abspath(str(filename)) - timestamp = os.path.getmtime(filename) - length = self.path_length - key = (filename, timestamp, length) - print(key) + cache_filename = str(blake2b(pickle.dumps(key)).hexdigest()) + ".pkl" - key_filename = str(blake2b(pickle.dumps(key)).hexdigest()) + ".pkl" + file_mapping_cache_folder = os.path.expanduser(os.path.join( + "~", ".torchxrayvision", "filename-mapping-cache" + )) - filename_mapping_folder = os.path.expanduser(os.path.join( - "~", ".torchxrayvision", "filename-mapping-cache" - )) + filename_mapping_path = os.path.join(file_mapping_cache_folder, cache_filename) - mapping_filename = os.path.join(filename_mapping_folder, key_filename) + return filename_mapping_path - print(mapping_filename) +def load_filename_mapping(imgpath, path_length): + "If a cached filename mapping exists, return it. Otherwise, return None" - if os.path.exists(mapping_filename): - print("Loading indexed file paths from cache") - with open(mapping_filename, "rb") as handle: - mapping = pickle.load(handle) - compressed = self.get_archive(filename) - else: - print("Indexing file paths (one-time). The next load will be faster") - compressed, mapping = self.index(filename) - try: - os.makedirs(filename_mapping_folder, exist_ok=True) - with open(mapping_filename, "wb") as handle: - pickle.dump(mapping, handle) - except: - pass - return compressed, mapping - def convert_to_image(self, filename, bytes): - "Convert an image byte array to a numpy array. If the filename ends with .dcm, use pydicom." - if str(filename).endswith(".dcm"): - return pydicom.filereader.dcmread(BytesIO(bytes), force=True).pixel_array - else: - out = np.array(Image.open(BytesIO(bytes))) - return out + filename_mapping_path = get_filename_mapping_path(imgpath, path_length) + + if os.path.exists(filename_mapping_path): + print("Loading indexed file paths from cache") + with open(filename_mapping_path, "rb") as handle: + filename_mapping = pickle.load(handle) + else: + filename_mapping = None + + return filename_mapping + +def save_filename_mapping(imgpath, path_length, filename_mapping): + "Load the dataset's index from the cache if available, else create a new one." + + filename_mapping_path = get_filename_mapping_path(imgpath, path_length) + + try: + #Pickle filename_mapping. + os.makedirs(os.path.dirname(filename_mapping_path), exist_ok=True) + with open(filename_mapping_path, "wb") as handle: + pickle.dump(filename_mapping, handle) + return True + + except: + raise + return False + #return compressed, mapping + +def convert_to_image(filename, bytes): + "Convert an image byte array to a numpy array. If the filename ends with .dcm, use pydicom." + if str(filename).endswith(".dcm"): + return pydicom.filereader.dcmread(BytesIO(bytes), force=True).pixel_array + else: + return np.array(Image.open(BytesIO(bytes))) + +class Interface(object): + pass class TarInterface(Interface): "This class supports extracting files from a tar archive based on a partial path." @@ -268,12 +286,23 @@ class TarInterface(Interface): def matches(cls, filename): "Return whether the given path is a tar archive." return not os.path.isdir(filename) and tarfile.is_tarfile(filename) - def __init__(self, imgpath, path_length, save_to_cache=True, load_from_cache=True): + def __init__(self, imgpath, path_length): "Store the archive path, and the length of the partial paths within the archive" self.path_length = path_length self.imgpath = imgpath - compressed, self.filename_mapping = self.load_dataset(imgpath, save_to_cache, load_from_cache) - self.all_compressed = {multiprocessing.current_process():compressed} + + #Load archive and filename mapping + compressed = None + self.filename_mapping = load_filename_mapping(imgpath, path_length) + #If the filename mapping could not be loaded, create it and save it + if self.filename_mapping is None: + compressed, self.filename_mapping = self.index(imgpath) + save_filename_mapping(imgpath, path_length, self.filename_mapping) + #If the compressed file has still not been loaded, load it. + if compressed is None: + compressed = self.get_archive(imgpath) + self.all_compressed = {multiprocessing.current_process().name:compressed} + def get_image(self, imgid): "Return the image object for the partial path provided." archive_path = self.filename_mapping[imgid] @@ -282,13 +311,14 @@ def get_image(self, imgid): # check and reset number of open files if too many if len(self.all_compressed.keys()) > 64: self.all_compressed = {} - self.all_compressed[multiprocessing.current_process().name] = self.get_archive(self.imgpath) + self.all_compressed[multiprocessing.current_process().name] = tarfile.open(self.imgpath) bytes = self.all_compressed[multiprocessing.current_process().name].extractfile(archive_path).read() - return self.convert_to_image(archive_path, bytes) + return convert_to_image(archive_path, bytes) def get_archive(self, imgpath): return tarfile.open(imgpath) def index(self, imgpath): "Create a dictionary mapping imgpath -> path within archive" + print("Indexing file paths (one-time). The next load will be faster") compressed = tarfile.open(imgpath) tar_infos = compressed.getmembers() filename_mapping = {} @@ -309,12 +339,23 @@ class ZipInterface(Interface): def matches(cls, filename): "Return whether the given path is a zip archive." return not os.path.isdir(filename) and zipfile.is_zipfile(filename) - def __init__(self, imgpath, path_length, save_to_cache=True, load_from_cache=True): + def __init__(self, imgpath, path_length): "Store the archive path, and the length of the partial paths within the archive" self.path_length = path_length self.imgpath = imgpath - compressed, self.filename_mapping = self.load_dataset(imgpath, save_to_cache, load_from_cache) + + #Load archive and filename mapping + compressed = None + self.filename_mapping = load_filename_mapping(imgpath, path_length) + #If the filename mapping could not be loaded, create it and save it + if self.filename_mapping is None: + compressed, self.filename_mapping = self.index(imgpath) + save_filename_mapping(imgpath, path_length, self.filename_mapping) + #If the compressed file has still not been loaded, load it. + if compressed is None: + compressed = zipfile.ZipFile(imgpath) self.all_compressed = {multiprocessing.current_process().name:compressed} + def get_image(self, imgid): "Return the image object for the partial path provided." archive_path = self.filename_mapping[imgid] @@ -325,11 +366,12 @@ def get_image(self, imgid): self.all_compressed = {} self.all_compressed[multiprocessing.current_process().name] = zipfile.ZipFile(self.imgpath) bytes = self.all_compressed[multiprocessing.current_process().name].open(archive_path).read() - return self.convert_to_image(archive_path, bytes) + return convert_to_image(archive_path, bytes) def get_archive(self, imgpath): return zipfile.ZipFile(imgpath) def index(self, imgpath): "Create a dictionary mapping imgpath -> path within archive" + print("Indexing file paths (one-time). The next load will be faster") compressed = zipfile.ZipFile(imgpath) zip_infos = compressed.infolist() filename_mapping = {} @@ -346,24 +388,33 @@ def close(self): class FolderInterface(Interface): "This class supports drawing files from a folder based on a partial path." + @classmethod def matches(cls, filename): "Return whether the given path is a zip archive." return os.path.isdir(filename) - def __init__(self, imgpath, path_length, save_to_cache=True, load_from_cache=True): + + def __init__(self, imgpath, path_length): "Store the archive path, and the length of the partial paths within the archive" self.path_length = path_length - self.path, self.filename_mapping = self.load_dataset(imgpath, save_to_cache, load_from_cache) + + self.filename_mapping = load_filename_mapping(imgpath, path_length) + #If the filename mapping could not be loaded, create it and save it + if self.filename_mapping is None: + _, self.filename_mapping = self.index(imgpath) + save_filename_mapping(imgpath, path_length, self.filename_mapping) + def get_archive(self, imgid): pass def get_image(self, imgid): "Return the image object for the partial path provided." archive_path = self.filename_mapping[imgid] with open(archive_path,"rb") as handle: - image = self.convert_to_image(archive_path, handle.read()) + image = convert_to_image(archive_path, handle.read()) return image def index(self, imgpath): "Create a dictionary mapping imgpath -> path within archive" + print("Indexing file paths (one-time). The next load will be faster") filename_mapping = {} for path in Path(imgpath).rglob("*"): if not os.path.isdir(path): @@ -384,8 +435,10 @@ def is_archive(filename): "Return whether the given filename is a tarfile or zipfile." return any(interface.matches(filename) for interface in archive_interfaces) + class ArchiveFolder(Interface): "This class supports extracting files from multiple tar or zip archives under the same root directory." + @classmethod def matches(cls, filename): for item in Path(filename).rglob("*"): @@ -394,20 +447,34 @@ def matches(cls, filename): if is_archive(item): return True return False - def __init__(self, imgpath, path_length, save_to_cache=True, load_from_cache=True): + + def __init__(self, imgpath, path_length): "Store the archive path, and the length of the partial paths within the archive" self.path_length = path_length - self.archives, self.filename_mapping = self.load_dataset(imgpath, save_to_cache, load_from_cache) + self.archives = None + self.filename_mapping = load_filename_mapping(imgpath, path_length) + #If the filename mapping could not be loaded, create it and save it + if self.filename_mapping is None: + self.archives, self.filename_mapping = self.index(imgpath) + save_filename_mapping(imgpath, path_length, self.filename_mapping) + #If the compressed file has still not been loaded, load it. + if self.archives is None: + self.archives = self.get_archive(imgpath) + def get_archive(self, imgpath): return get_interface(imgpath) + def get_image(self, imgid): "Return the image object for the partial path provided." path_to_archive = self.filename_mapping[imgid] return self.archives[path_to_archive].get_image(imgid) + def index(self, filename): """ - Create a dictionary mapping imgid -> path to the sub-archive - containing the corresponding file. + Create a dictionary mapping imgid -> containing sub-archive. + The archives are identified by their filenames. The sub-archive + will then be queried itself. + This is different from the index method of ZipInterface and TarInterface, where the dictionary values are the actual file paths. @@ -418,6 +485,7 @@ def index(self, filename): for path_in_csv, path_in_archive in archive.filename_mapping.items(): filename_mapping[path_in_csv] = path_to_archive return archives, filename_mapping + def get_archive(self, filename): archives = {} for path_to_archive in Path(filename).rglob("*"): @@ -425,6 +493,7 @@ def get_archive(self, filename): archive = create_interface(path_to_archive, self.path_length) archives[path_to_archive] = archive return archives + def close(self): "Recursively close all open archives." for archive_path, archive in self.archives.items(): From 71c7a50b647d71f1e8d6a72cbbf4dbb6d7135da3 Mon Sep 17 00:00:00 2001 From: bganglia Date: Sat, 19 Sep 2020 11:09:22 -0400 Subject: [PATCH 51/52] reorganize --- torchxrayvision/datasets.py | 346 +-------------------------- torchxrayvision/storage_interface.py | 330 +++++++++++++++++++++++++ 2 files changed, 335 insertions(+), 341 deletions(-) create mode 100644 torchxrayvision/storage_interface.py diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index 52dd919..012583d 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -1,15 +1,10 @@ -from PIL import Image from os.path import join -from skimage.io import imread, imsave from torch import nn -from copy import copy from torch.nn.modules.linear import Linear from torch.utils.data import Dataset from torchvision import transforms from tqdm import tqdm import numpy as np -import multiprocessing -from io import BytesIO import os,sys,os.path import pandas as pd import pickle @@ -22,15 +17,12 @@ import torch.nn.functional as F import torchvision import torchvision.transforms.functional as TF -from hashlib import blake2b import skimage.transform import warnings import tarfile import zipfile import random -from pathlib import Path - -Image.init() +from torchxrayvision.storage_interface import create_interface default_pathologies = [ 'Atelectasis', 'Consolidation', @@ -54,8 +46,6 @@ thispath = os.path.dirname(os.path.realpath(__file__)) -tarfile_contents = {} - def normalize(sample, maxval): """Scales images to be roughly [-1024 1024].""" sample = (2 * (sample.astype(np.float32) / maxval) - 1.) * 1024 @@ -205,307 +195,6 @@ def __len__(self): def __getitem__(self, idx): return self.dataset[self.idxs[idx]] -def last_n_in_filepath(filepath, n): - """ - Return the last n pieces of a path (takes a string, not a Path object). - For example: - last_n_in_filepath("a/b/c",2) -> "b/c" - """ - if n < 1: - return "" - start_part, end_part = os.path.split(filepath) - for i in range(n - 1): - start_part, middle_part = os.path.split(start_part) - end_part = os.path.join(middle_part, end_part) - return end_part - -def get_filename_mapping_path(imgpath, path_length): - """ - Create a hash of (imgpath, last_modification, path_length_for_mapping_key) - and use it to return the filepath for a cached index. - """ - imgpath = os.path.abspath(str(imgpath)) - timestamp = os.path.getmtime(imgpath) - length = path_length - key = (imgpath, timestamp, length) - - cache_filename = str(blake2b(pickle.dumps(key)).hexdigest()) + ".pkl" - - file_mapping_cache_folder = os.path.expanduser(os.path.join( - "~", ".torchxrayvision", "filename-mapping-cache" - )) - - filename_mapping_path = os.path.join(file_mapping_cache_folder, cache_filename) - - return filename_mapping_path - -def load_filename_mapping(imgpath, path_length): - "If a cached filename mapping exists, return it. Otherwise, return None" - - filename_mapping_path = get_filename_mapping_path(imgpath, path_length) - - if os.path.exists(filename_mapping_path): - print("Loading indexed file paths from cache") - with open(filename_mapping_path, "rb") as handle: - filename_mapping = pickle.load(handle) - else: - filename_mapping = None - - return filename_mapping - -def save_filename_mapping(imgpath, path_length, filename_mapping): - "Load the dataset's index from the cache if available, else create a new one." - - filename_mapping_path = get_filename_mapping_path(imgpath, path_length) - - try: - #Pickle filename_mapping. - os.makedirs(os.path.dirname(filename_mapping_path), exist_ok=True) - with open(filename_mapping_path, "wb") as handle: - pickle.dump(filename_mapping, handle) - return True - - except: - raise - return False - #return compressed, mapping - -def convert_to_image(filename, bytes): - "Convert an image byte array to a numpy array. If the filename ends with .dcm, use pydicom." - if str(filename).endswith(".dcm"): - return pydicom.filereader.dcmread(BytesIO(bytes), force=True).pixel_array - else: - return np.array(Image.open(BytesIO(bytes))) - -class Interface(object): - pass - -class TarInterface(Interface): - "This class supports extracting files from a tar archive based on a partial path." - @classmethod - def matches(cls, filename): - "Return whether the given path is a tar archive." - return not os.path.isdir(filename) and tarfile.is_tarfile(filename) - def __init__(self, imgpath, path_length): - "Store the archive path, and the length of the partial paths within the archive" - self.path_length = path_length - self.imgpath = imgpath - - #Load archive and filename mapping - compressed = None - self.filename_mapping = load_filename_mapping(imgpath, path_length) - #If the filename mapping could not be loaded, create it and save it - if self.filename_mapping is None: - compressed, self.filename_mapping = self.index(imgpath) - save_filename_mapping(imgpath, path_length, self.filename_mapping) - #If the compressed file has still not been loaded, load it. - if compressed is None: - compressed = self.get_archive(imgpath) - self.all_compressed = {multiprocessing.current_process().name:compressed} - - def get_image(self, imgid): - "Return the image object for the partial path provided." - archive_path = self.filename_mapping[imgid] - if not multiprocessing.current_process().name in self.all_compressed: - #print("Opening tar file on thread:",pid) - # check and reset number of open files if too many - if len(self.all_compressed.keys()) > 64: - self.all_compressed = {} - self.all_compressed[multiprocessing.current_process().name] = tarfile.open(self.imgpath) - bytes = self.all_compressed[multiprocessing.current_process().name].extractfile(archive_path).read() - return convert_to_image(archive_path, bytes) - def get_archive(self, imgpath): - return tarfile.open(imgpath) - def index(self, imgpath): - "Create a dictionary mapping imgpath -> path within archive" - print("Indexing file paths (one-time). The next load will be faster") - compressed = tarfile.open(imgpath) - tar_infos = compressed.getmembers() - filename_mapping = {} - for tar_info in tar_infos: - if tar_info.type != "DIRTYPE": - tar_path = tar_info.name - imgid = last_n_in_filepath(tar_path, self.path_length) - filename_mapping[imgid] = tar_path - return compressed, filename_mapping - def close(self): - "Close all open tarfiles." - for compressed in self.all_compressed.values(): - compressed.close() - -class ZipInterface(Interface): - "This class supports extracting files from a zip archive based on a partial path." - @classmethod - def matches(cls, filename): - "Return whether the given path is a zip archive." - return not os.path.isdir(filename) and zipfile.is_zipfile(filename) - def __init__(self, imgpath, path_length): - "Store the archive path, and the length of the partial paths within the archive" - self.path_length = path_length - self.imgpath = imgpath - - #Load archive and filename mapping - compressed = None - self.filename_mapping = load_filename_mapping(imgpath, path_length) - #If the filename mapping could not be loaded, create it and save it - if self.filename_mapping is None: - compressed, self.filename_mapping = self.index(imgpath) - save_filename_mapping(imgpath, path_length, self.filename_mapping) - #If the compressed file has still not been loaded, load it. - if compressed is None: - compressed = zipfile.ZipFile(imgpath) - self.all_compressed = {multiprocessing.current_process().name:compressed} - - def get_image(self, imgid): - "Return the image object for the partial path provided." - archive_path = self.filename_mapping[imgid] - if not multiprocessing.current_process().name in self.all_compressed: - #print("Opening zip file on thread:",multiprocessing.current_process()) - # check and reset number of open files if too many - if len(self.all_compressed.keys()) > 64: - self.all_compressed = {} - self.all_compressed[multiprocessing.current_process().name] = zipfile.ZipFile(self.imgpath) - bytes = self.all_compressed[multiprocessing.current_process().name].open(archive_path).read() - return convert_to_image(archive_path, bytes) - def get_archive(self, imgpath): - return zipfile.ZipFile(imgpath) - def index(self, imgpath): - "Create a dictionary mapping imgpath -> path within archive" - print("Indexing file paths (one-time). The next load will be faster") - compressed = zipfile.ZipFile(imgpath) - zip_infos = compressed.infolist() - filename_mapping = {} - for zip_info in zip_infos: - if not zip_info.is_dir(): - zip_path = zip_info.filename - imgid = last_n_in_filepath(zip_path, self.path_length) - filename_mapping[imgid] = zip_path - return compressed, filename_mapping - def close(self): - "Close all open zipfiles." - for compressed in self.all_compressed.values(): - compressed.close() - -class FolderInterface(Interface): - "This class supports drawing files from a folder based on a partial path." - - @classmethod - def matches(cls, filename): - "Return whether the given path is a zip archive." - return os.path.isdir(filename) - - def __init__(self, imgpath, path_length): - "Store the archive path, and the length of the partial paths within the archive" - self.path_length = path_length - - self.filename_mapping = load_filename_mapping(imgpath, path_length) - #If the filename mapping could not be loaded, create it and save it - if self.filename_mapping is None: - _, self.filename_mapping = self.index(imgpath) - save_filename_mapping(imgpath, path_length, self.filename_mapping) - - def get_archive(self, imgid): - pass - def get_image(self, imgid): - "Return the image object for the partial path provided." - archive_path = self.filename_mapping[imgid] - with open(archive_path,"rb") as handle: - image = convert_to_image(archive_path, handle.read()) - return image - def index(self, imgpath): - "Create a dictionary mapping imgpath -> path within archive" - print("Indexing file paths (one-time). The next load will be faster") - filename_mapping = {} - for path in Path(imgpath).rglob("*"): - if not os.path.isdir(path): - imgid = last_n_in_filepath(path, self.path_length) - filename_mapping[imgid] = path - return imgpath, filename_mapping - def close(self): - pass - -def is_image(filename): - "Return whether the given filename has an image extension." - _, extension = os.path.splitext(filename) - return extension in Image.EXTENSION - -archive_interfaces = [ZipInterface, TarInterface] - -def is_archive(filename): - "Return whether the given filename is a tarfile or zipfile." - return any(interface.matches(filename) for interface in archive_interfaces) - - -class ArchiveFolder(Interface): - "This class supports extracting files from multiple tar or zip archives under the same root directory." - - @classmethod - def matches(cls, filename): - for item in Path(filename).rglob("*"): - if is_image(item): - return False - if is_archive(item): - return True - return False - - def __init__(self, imgpath, path_length): - "Store the archive path, and the length of the partial paths within the archive" - self.path_length = path_length - self.archives = None - self.filename_mapping = load_filename_mapping(imgpath, path_length) - #If the filename mapping could not be loaded, create it and save it - if self.filename_mapping is None: - self.archives, self.filename_mapping = self.index(imgpath) - save_filename_mapping(imgpath, path_length, self.filename_mapping) - #If the compressed file has still not been loaded, load it. - if self.archives is None: - self.archives = self.get_archive(imgpath) - - def get_archive(self, imgpath): - return get_interface(imgpath) - - def get_image(self, imgid): - "Return the image object for the partial path provided." - path_to_archive = self.filename_mapping[imgid] - return self.archives[path_to_archive].get_image(imgid) - - def index(self, filename): - """ - Create a dictionary mapping imgid -> containing sub-archive. - The archives are identified by their filenames. The sub-archive - will then be queried itself. - - This is different from the index method of ZipInterface and - TarInterface, where the dictionary values are the actual file - paths. - """ - archives = self.get_archive(filename) - filename_mapping = {} - for path_to_archive, archive in archives.items(): - for path_in_csv, path_in_archive in archive.filename_mapping.items(): - filename_mapping[path_in_csv] = path_to_archive - return archives, filename_mapping - - def get_archive(self, filename): - archives = {} - for path_to_archive in Path(filename).rglob("*"): - if is_archive(path_to_archive): - archive = create_interface(path_to_archive, self.path_length) - archives[path_to_archive] = archive - return archives - - def close(self): - "Recursively close all open archives." - for archive_path, archive in self.archives.items(): - archive.close() - -def create_interface(filename, path_length): - "Choose the right interface type for the given path, and return an initialized interface." - interfaces = [ArchiveFolder, FolderInterface, TarInterface, ZipInterface] - for interface in interfaces: - if interface.matches(filename): - return interface(filename, path_length) - class NIH_Dataset(Dataset): path_length = 1 """ @@ -603,7 +292,6 @@ def __getitem__(self, idx): imgid = self.csv['Image Index'].iloc[idx] - #img_path = os.path.join(self.imgpath, imgid) img = self.image_interface.get_image(imgid) if self.normalize: img = normalize(img, self.MAXVAL) @@ -760,13 +448,7 @@ def __getitem__(self, idx): sample["lab"] = self.labels[idx] imgid = self.csv['patientId'].iloc[idx] + self.extension - #img_path = os.path.join(self.imgpath, imgid + self.extension) - #print(img_path) - #if self.use_pydicom: - # img=pydicom.filereader.dcmread(img_path).pixel_array - #else: - # img = imread(img_path) img = self.image_interface.get_image(imgid) if self.normalize: img = normalize(img, self.MAXVAL) @@ -910,9 +592,6 @@ def __len__(self): def __getitem__(self, idx): imgid = self.csv['Image Index'].iloc[idx] - #img_path = os.path.join(self.imgpath, imgid) - #print(img_path) - #img = imread(img_path) img = self.image_interface.get(imgid) if self.normalize: img = normalize(img, self.MAXVAL) @@ -1035,8 +714,7 @@ def __len__(self): def __getitem__(self, idx): imgid = self.csv['ImageID'].iloc[idx] - #img_path = os.path.join(self.imgpath,imgid) - img = self.image_interface.get_image(imgid)#imread(img_path) + img = self.image_interface.get_image(imgid) img = normalize(img, self.MAXVAL) # Check that images are 2D arrays @@ -1057,7 +735,7 @@ def __getitem__(self, idx): return {"img":img, "lab":self.labels[idx], "idx":idx} class CheX_Dataset(Dataset): - path_length = 3 #due to removing CheXpert-... and train in __getitem__ + path_length = 3 """ CheXpert: A Large Chest Radiograph Dataset with Uncertainty Labels and Expert Comparison. Jeremy Irvin *, Pranav Rajpurkar *, Michael Ko, Yifan Yu, Silviana Ciurea-Ilcus, Chris Chute, Henrik Marklund, Behzad Haghgoo, Robyn Ball, Katie Shpanskaya, Jayne Seekins, David A. Mong, Safwan S. Halabi, Jesse K. Sandberg, Ricky Jones, David B. Larson, Curtis P. Langlotz, Bhavik N. Patel, Matthew P. Lungren, Andrew Y. Ng @@ -1136,11 +814,8 @@ def __len__(self): def __getitem__(self, idx): imgid = self.csv['Path'].iloc[idx] - imgid = last_n_in_filepath(imgid, self.path_length) - #imgid = imgid.replace("CheXpert-v1.0-small/","") - #img_path = os.path.join(self.imgpath, imgid) + imgid = imgid.replace("CheXpert-v1.0-small/","") img = self.image_interface.get_image(imgid) - #img = imread(img_path) img = normalize(img, self.MAXVAL) # Check that images are 2D arrays @@ -1244,15 +919,11 @@ def __repr__(self): def __len__(self): return len(self.labels) - def get_imgid(self, idx): + def __getitem__(self, idx): subjectid = str(self.csv.iloc[idx]["subject_id"]) studyid = str(self.csv.iloc[idx]["study_id"]) dicom_id = str(self.csv.iloc[idx]["dicom_id"]) img_fname = os.path.join("p" + subjectid[:2], "p" + subjectid, "s" + studyid, dicom_id + ".jpg") - return img_fname - - def __getitem__(self, idx): - img_fname = self.get_imgid(idx) img = self.image_interface.get_image(img_fname) img = normalize(img, self.MAXVAL) @@ -1392,8 +1063,6 @@ def __len__(self): def __getitem__(self, idx): imageid = self.csv.iloc[idx].imageid + ".png" - #img_path = os.path.join(self.imgpath,imageid + ".png") - #print(img_path) img = self.image_interface.get_image(imageid) img = normalize(img, self.MAXVAL) @@ -1486,9 +1155,6 @@ def __len__(self): def __getitem__(self, idx): imgid = self.csv['filename'].iloc[idx] - #img_path = os.path.join(self.imgpath, imgid) - #print(img_path) - #img = imread(img_path) img = self.image_interface.get_image(imgid) img = normalize(img, self.MAXVAL) @@ -1577,9 +1243,7 @@ def __len__(self): def __getitem__(self, idx): item = self.csv.iloc[idx] imgid = item["fname"] #os.path.join("CXR_png", item["fname"]) - #print(img_path) img = self.image_interface.get_image(imgid) - #img = imread(img_path) img = normalize(img, self.MAXVAL) # Check that images are 2D arrays diff --git a/torchxrayvision/storage_interface.py b/torchxrayvision/storage_interface.py new file mode 100644 index 0000000..be9e36f --- /dev/null +++ b/torchxrayvision/storage_interface.py @@ -0,0 +1,330 @@ +from PIL import Image +import os +from hashlib import blake2b +import pickle +import zipfile +import tarfile +import multiprocessing +import pydicom +from pathlib import Path +import numpy as np +from io import BytesIO + +Image.init() #loads image extensions + +""" +You can read agnostically from folders, zipfiles, and tarfiles with this submodule. +You can retrieve each file using just the last n elements of its path (you pick n). + +You can create an interface using create_interface(imgpath, n). The path to the +archive or folder is imgpath, and the path length you will use for retrieving files +is n. + +Then, you can retrieve each file with the .get_image() method of the returned object. + +Example: + +interface = create_interface("/path/to/images.tar", n = 3) +interface.get_image("element1/element2/element3.jpg") #note n = 3 + +The "interface" object will belong to one of four classes: + TarInterface - for tarfiles + ZipInterface - for zipfiles + FolderInterface - for folders containing images + ArchiveFolder - for folders containing multiple tarfiles/zipfiles. + +""" + + +def last_n_in_filepath(filepath, n): + """ + Return the last n pieces of a path (takes a string, not a Path object). + For example: + last_n_in_filepath("a/b/c",2) -> "b/c" + """ + if n < 1: + return "" + start_part, end_part = os.path.split(filepath) + for i in range(n - 1): + start_part, middle_part = os.path.split(start_part) + end_part = os.path.join(middle_part, end_part) + return end_part + +def get_filename_mapping_path(imgpath, path_length): + """ + Create a hash of (imgpath, last_modification, path_length_for_mapping_key) + and use it to return the filepath for a cached index. + """ + imgpath = str(imgpath) #cannot be Path object + imgpath = os.path.abspath(imgpath) + timestamp = os.path.getmtime(imgpath) + length = path_length + key = (imgpath, timestamp, length) + + #Construct filename from hash of imgpath, timestamp, and length + cache_filename = str(blake2b(pickle.dumps(key)).hexdigest()) + ".pkl" + + file_mapping_cache_folder = os.path.expanduser(os.path.join( + "~", ".torchxrayvision", "filename-mapping-cache" + )) + + filename_mapping_path = os.path.join(file_mapping_cache_folder, cache_filename) + + return filename_mapping_path + +def load_filename_mapping(imgpath, path_length): + "If a cached filename mapping exists, return it. Otherwise, return None" + + filename_mapping_path = get_filename_mapping_path(imgpath, path_length) + + if os.path.exists(filename_mapping_path): + print("Loading indexed file paths from cache") + with open(filename_mapping_path, "rb") as handle: + filename_mapping = pickle.load(handle) + else: + filename_mapping = None + + return filename_mapping + +def save_filename_mapping(imgpath, path_length, filename_mapping): + "Load the dataset's index from the cache if available, else create a new one." + + filename_mapping_path = get_filename_mapping_path(imgpath, path_length) + + try: + #Pickle filename_mapping. + os.makedirs(os.path.dirname(filename_mapping_path), exist_ok=True) + with open(filename_mapping_path, "wb") as handle: + pickle.dump(filename_mapping, handle) + return True + + except: + return False + +def convert_to_image(filename, bytes): + "Convert an image byte array to a numpy array. If the filename ends with .dcm, use pydicom." + if str(filename).endswith(".dcm"): + return pydicom.filereader.dcmread(BytesIO(bytes), force=True).pixel_array + else: + return np.array(Image.open(BytesIO(bytes))) + +class StorageInterface(object): + pass + +class TarInterface(StorageInterface): + "This class supports extracting files from a tar archive based on a partial path." + @classmethod + def matches(cls, filename): + "Return whether the given path is a tar archive." + return not os.path.isdir(filename) and tarfile.is_tarfile(filename) + def __init__(self, imgpath, path_length): + "Store the archive path, and the length of the partial paths within the archive" + self.path_length = path_length + self.imgpath = imgpath + + #Load archive and filename mapping + compressed = None + self.filename_mapping = load_filename_mapping(imgpath, path_length) + #If the filename mapping could not be loaded, create it and save it + if self.filename_mapping is None: + compressed, self.filename_mapping = self.index(imgpath) + save_filename_mapping(imgpath, path_length, self.filename_mapping) + #If the compressed file has still not been loaded, load it. + if compressed is None: + compressed = tarfile.open(imgpath) + self.all_compressed = {multiprocessing.current_process().name:compressed} + + def get_image(self, imgid): + "Return the image object for the partial path provided." + archive_path = self.filename_mapping[imgid] + if not multiprocessing.current_process().name in self.all_compressed: + #print("Opening tar file on thread:",pid) + # check and reset number of open files if too many + if len(self.all_compressed.keys()) > 64: + self.all_compressed = {} + self.all_compressed[multiprocessing.current_process().name] = tarfile.open(self.imgpath) + bytes = self.all_compressed[multiprocessing.current_process().name].extractfile(archive_path).read() + return convert_to_image(archive_path, bytes) + def index(self, imgpath): + "Create a dictionary mapping imgpath -> path within archive" + print("Indexing file paths (one-time). The next load will be faster") + compressed = tarfile.open(imgpath) + tar_infos = compressed.getmembers() + filename_mapping = {} + for tar_info in tar_infos: + if tar_info.type != "DIRTYPE": + tar_path = tar_info.name + imgid = last_n_in_filepath(tar_path, self.path_length) + filename_mapping[imgid] = tar_path + return compressed, filename_mapping + def close(self): + "Close all open tarfiles." + for compressed in self.all_compressed.values(): + compressed.close() + +class ZipInterface(StorageInterface): + "This class supports extracting files from a zip archive based on a partial path." + @classmethod + def matches(cls, filename): + "Return whether the given path is a zip archive." + return not os.path.isdir(filename) and zipfile.is_zipfile(filename) + def __init__(self, imgpath, path_length): + "Store the archive path, and the length of the partial paths within the archive" + self.path_length = path_length + self.imgpath = imgpath + + #Load archive and filename mapping + compressed = None + self.filename_mapping = load_filename_mapping(imgpath, path_length) + #If the filename mapping could not be loaded, create it and save it + if self.filename_mapping is None: + compressed, self.filename_mapping = self.index(imgpath) + save_filename_mapping(imgpath, path_length, self.filename_mapping) + #If the compressed file has still not been loaded, load it. + if compressed is None: + compressed = zipfile.ZipFile(imgpath) + self.all_compressed = {multiprocessing.current_process().name:compressed} + + def get_image(self, imgid): + "Return the image object for the partial path provided." + archive_path = self.filename_mapping[imgid] + if not multiprocessing.current_process().name in self.all_compressed: + #print("Opening zip file on thread:",multiprocessing.current_process()) + # check and reset number of open files if too many + if len(self.all_compressed.keys()) > 64: + self.all_compressed = {} + self.all_compressed[multiprocessing.current_process().name] = zipfile.ZipFile(self.imgpath) + bytes = self.all_compressed[multiprocessing.current_process().name].open(archive_path).read() + return convert_to_image(archive_path, bytes) + def index(self, imgpath): + "Create a dictionary mapping imgpath -> path within archive" + print("Indexing file paths (one-time). The next load will be faster") + compressed = zipfile.ZipFile(imgpath) + zip_infos = compressed.infolist() + filename_mapping = {} + for zip_info in zip_infos: + if not zip_info.is_dir(): + zip_path = zip_info.filename + imgid = last_n_in_filepath(zip_path, self.path_length) + filename_mapping[imgid] = zip_path + return compressed, filename_mapping + def close(self): + "Close all open zipfiles." + for compressed in self.all_compressed.values(): + compressed.close() + +class FolderInterface(StorageInterface): + "This class supports drawing files from a folder based on a partial path." + + @classmethod + def matches(cls, filename): + "Return whether the given path is a zip archive." + return os.path.isdir(filename) + + def __init__(self, imgpath, path_length): + "Store the archive path, and the length of the partial paths within the archive" + self.path_length = path_length + + self.filename_mapping = load_filename_mapping(imgpath, path_length) + #If the filename mapping could not be loaded, create it and save it + if self.filename_mapping is None: + _, self.filename_mapping = self.index(imgpath) + save_filename_mapping(imgpath, path_length, self.filename_mapping) + + def get_image(self, imgid): + "Return the image object for the partial path provided." + archive_path = self.filename_mapping[imgid] + with open(archive_path,"rb") as handle: + image = convert_to_image(archive_path, handle.read()) + return image + def index(self, imgpath): + "Create a dictionary mapping imgpath -> path within archive" + print("Indexing file paths (one-time). The next load will be faster") + filename_mapping = {} + for path in Path(imgpath).rglob("*"): + if not os.path.isdir(path): + imgid = last_n_in_filepath(path, self.path_length) + filename_mapping[imgid] = path + return imgpath, filename_mapping + def close(self): + pass + +def is_image(filename): + "Return whether the given filename has an image extension." + _, extension = os.path.splitext(filename) + return extension in Image.EXTENSION + +archive_interfaces = [ZipInterface, TarInterface] + +def is_archive(filename): + "Return whether the given filename is a tarfile or zipfile." + return any(interface.matches(filename) for interface in archive_interfaces) + + +class ArchiveFolder(StorageInterface): + "This class supports extracting files from multiple tar or zip archives under the same root directory." + + @classmethod + def matches(cls, filename): + for item in Path(filename).rglob("*"): + if is_image(item): + return False + if is_archive(item): + return True + return False + + def __init__(self, imgpath, path_length): + "Store the archive path, and the length of the partial paths within the archive" + self.path_length = path_length + self.archives = None + self.filename_mapping = load_filename_mapping(imgpath, path_length) + #If the filename mapping could not be loaded, create it and save it + if self.filename_mapping is None: + self.archives, self.filename_mapping = self.index(imgpath) + save_filename_mapping(imgpath, path_length, self.filename_mapping) + #If the compressed file has still not been loaded, load it. + if self.archives is None: + self.archives = self.get_archive(imgpath) + + def get_image(self, imgid): + "Return the image object for the partial path provided." + path_to_archive = self.filename_mapping[imgid] + return self.archives[path_to_archive].get_image(imgid) + + def index(self, filename): + """ + Create a dictionary mapping imgid -> containing sub-archive. + The archives are identified by their filenames. The sub-archive + will then be queried itself. + + This is different from the index method of ZipInterface and + TarInterface, where the dictionary values are the actual file + paths. + """ + archives = self.get_archive(filename) + filename_mapping = {} + for path_to_archive, archive in archives.items(): + for path_in_csv, path_in_archive in archive.filename_mapping.items(): + filename_mapping[path_in_csv] = path_to_archive + return archives, filename_mapping + + def get_archive(self, filename): + archives = {} + for path_to_archive in Path(filename).rglob("*"): + if is_archive(path_to_archive): + archive = create_interface(path_to_archive, self.path_length) + archives[path_to_archive] = archive + return archives + + def close(self): + "Recursively close all open archives." + for archive_path, archive in self.archives.items(): + archive.close() + +interfaces = [ArchiveFolder, FolderInterface, TarInterface, ZipInterface] + +def create_interface(filename, path_length, interfaces=interfaces): + "Choose the right interface type for the given path, and return an initialized interface." + for interface in interfaces: + if interface.matches(filename): + return interface(filename, path_length) From 1715b9d521f5019085eb88b61cb372a66c1b8928 Mon Sep 17 00:00:00 2001 From: bganglia Date: Sat, 19 Sep 2020 11:54:58 -0400 Subject: [PATCH 52/52] Fix path length in CheX_Dataset --- torchxrayvision/datasets.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/torchxrayvision/datasets.py b/torchxrayvision/datasets.py index 012583d..be84db6 100644 --- a/torchxrayvision/datasets.py +++ b/torchxrayvision/datasets.py @@ -368,7 +368,7 @@ class RSNA_Pneumonia_Dataset(Dataset): """ def __init__(self, imgpath, - csvpath=os.path.join(thispath, "kaggle_stage_2_train_labels.csv.zip"), + csvpath=os.path.join(thispath, "kaggle_stage_2_train_labels.csv.zip"), dicomcsvpath=os.path.join(thispath, "kaggle_stage_2_train_images_dicom_headers.csv.gz"), views=["PA"], transform=None, @@ -735,7 +735,7 @@ def __getitem__(self, idx): return {"img":img, "lab":self.labels[idx], "idx":idx} class CheX_Dataset(Dataset): - path_length = 3 + path_length = 4 """ CheXpert: A Large Chest Radiograph Dataset with Uncertainty Labels and Expert Comparison. Jeremy Irvin *, Pranav Rajpurkar *, Michael Ko, Yifan Yu, Silviana Ciurea-Ilcus, Chris Chute, Henrik Marklund, Behzad Haghgoo, Robyn Ball, Katie Shpanskaya, Jayne Seekins, David A. Mong, Safwan S. Halabi, Jesse K. Sandberg, Ricky Jones, David B. Larson, Curtis P. Langlotz, Bhavik N. Patel, Matthew P. Lungren, Andrew Y. Ng