duynhm commited on
Commit
be2715b
1 Parent(s): da5380e

Initial commit

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +3 -0
  2. .gitignore +4 -0
  3. Makefile +10 -0
  4. README.md +323 -3
  5. assets/__init__.py +0 -0
  6. assets/body_lvm_med.jpg +0 -0
  7. assets/lvm_med_compare.jpg +0 -0
  8. assets/lvm_med_teaser.gif +3 -0
  9. classification_R50/__init__.py +0 -0
  10. classification_R50/train_R50_classification.py +349 -0
  11. dataloader/__init__.py +3 -0
  12. dataloader/dataloader.py +55 -0
  13. dataloader/dataset.py +434 -0
  14. dataloader/dataset_ete.py +267 -0
  15. dataloader/sam_transforms.py +102 -0
  16. dataloader/yaml_data/brain_endtoend_R50_frozen_1_fcn.yml +24 -0
  17. dataloader/yaml_data/brain_endtoend_R50_frozen_fcns.yml +24 -0
  18. dataloader/yaml_data/brain_endtoend_R50_non_frozen_1_fcn.yml +24 -0
  19. dataloader/yaml_data/brain_endtoend_R50_non_frozen_fcns.yml +24 -0
  20. dataloader/yaml_data/buid_endtoend_R50.yml +32 -0
  21. dataloader/yaml_data/buid_lvm_med_sam.yml +28 -0
  22. dataloader/yaml_data/buid_sam.yml +28 -0
  23. dataloader/yaml_data/fgadr_endtoend_R50_frozen_1_fcn.yml +24 -0
  24. dataloader/yaml_data/fgadr_endtoend_R50_frozen_fcns.yml +24 -0
  25. dataloader/yaml_data/fgadr_endtoend_R50_non_frozen_1_fcn.yml +24 -0
  26. dataloader/yaml_data/fgadr_endtoend_R50_non_frozen_fcns.yml +24 -0
  27. dataloader/yaml_data/kvasir_endtoend_R50.yml +32 -0
  28. dataloader/yaml_data/kvasir_sam.yml +28 -0
  29. dataloader/yaml_data/mmwhs_ct_endtoend_R50.yml +32 -0
  30. dataloader/yaml_data/mmwhs_ct_sam.yml +28 -0
  31. dataloader/yaml_data/mmwhs_mr_endtoend_R50.yml +32 -0
  32. dataloader/yaml_data/mmwhs_mri_sam.yml +28 -0
  33. dataset_demo/__init__.py +1 -0
  34. datasets_split/BUID_split.py +73 -0
  35. datasets_split/FGADR_split.py +38 -0
  36. datasets_split/Kvasir_split.py +19 -0
  37. datasets_split/MMWHS_CT_Heart_split.py +127 -0
  38. datasets_split/MMWHS_MR_Heart_split.py +128 -0
  39. datasets_split/__init__.py +0 -0
  40. evaluate.py +136 -0
  41. files_split/BUID.json +1 -0
  42. files_split/Kvasir.json +1 -0
  43. files_split/MMWHS_CT_Heart.json +0 -0
  44. files_split/MMWHS_MR_Heart.json +0 -0
  45. files_split/__init__.py +0 -0
  46. files_split/fgadr_pkl_file.pkl +3 -0
  47. further_training_lvm_med/README.md +20 -0
  48. further_training_lvm_med/__init__.py +0 -0
  49. lvm-med-training-data/0_SSL_BraTS2018_Brain/file_list.txt +3 -0
  50. lvm-med-training-data/0_SSL_HNSCC_Mixed_HeadNeck/file_list.txt +3 -0
.gitattributes CHANGED
@@ -33,3 +33,6 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ *.gif filter=lfs diff=lfs merge=lfs -text
37
+ *.txt filter=lfs diff=lfs merge=lfs -text
38
+ *.png filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ __pycache__
2
+ *.ipynb_checkpoints
3
+ .DS_Store
4
+ work_dir
Makefile ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ default_target: main
2
+ .PHONY : default_target
3
+
4
+ $(VERBOSE).SILENT:
5
+
6
+ SHELL = /bin/sh
7
+
8
+ sam_2D_example:
9
+ python3 medsam.py -c dataloader/yaml_data/buid_sam.yml -2D
10
+ .PHONY: sam_2D_example
README.md CHANGED
@@ -1,3 +1,323 @@
1
- ---
2
- license: apache-2.0
3
- ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## LVM-Med: Learning Large-Scale Self-Supervised Vision Models for Medical Imaging via Second-order Graph Matching (Neurips 2023).
2
+ We release [LVM-Med](https://arxiv.org/abs/2306.11925)'s pre-trained models and demonstrate downstream tasks on 2D-3D segmentations, linear/fully finetuning image classification, and object detection.
3
+
4
+ LVM-Med was trained with ~ 1.3 million medical images collected from 55 datasets using a second-order graph matching formulation unifying
5
+ current contrastive and instance-based SSL.
6
+
7
+ <p align="center">
8
+ <img src="assets/body_lvm_med.jpg" alt="drawing" width="698.5" heigh="461"/>
9
+ </p>
10
+
11
+ <p align="center">
12
+ <img src="assets/lvm_med_teaser.gif" alt="drawing" width="471.6" heigh="520"/>
13
+ </p>
14
+
15
+ ## Table of contents
16
+ * [News](#news)
17
+ * [LVM-Med Pretrained Models](#lvm-med-pretrained-models)
18
+ * [Further Training LVM-Med on Large Dataset](#further-training-lvm-med-on-large-dataset)
19
+ * [Prerequisites](#prerequisites)
20
+ * [Preparing Dataset](#preparing-datasets)
21
+ * [Downstream Tasks](#downstream-tasks)
22
+ * [Segmentation](#segmentation)
23
+ * [Image Classification](#image-classification)
24
+ * [Object Detection](#object-detection)
25
+ * [Citation](#citation)
26
+ * [Related Work](#related-work)
27
+ * [License](#license)
28
+
29
+ ## News
30
+ - :mega: **14/12/2023**: The LVM-Med training algorithm is ready to be released! Please send us an email to request!
31
+ - :pencil2: If you want to have other architecture, send us a request by email or create an Issue. If the requests are enough, we will train them.
32
+ - :construction: Coming soon: [ConvNext](https://arxiv.org/abs/2201.03545) architecture trained by LVM-Med.
33
+ - :construction: Coming soon: ViT architectures for end-to-end segmentation with better performance reported in the paper.
34
+ - **31/07/2023**: Release ONNX support for LVM-Med ResNet50 and LVM-Med ViT as backbones in [`onnx_model`](/onnx_model/) folder.
35
+ - **26/07/2023**: We release ViT architectures (**ViT-B** and **ViT-H**) initialized from LVM-Med and further training on the LIVECell dataset with 1.6 million high-quality cells. See at this [table](#further-training-lvm-med-on-large-dataset).
36
+ - **25/06/2023**: We release two pre-trained models of LVM-Med: ResNet-50 and ViT-B. Providing scripts for downstream tasks.
37
+
38
+ ## LVM-Med Pretrained Models
39
+ <table>
40
+ <tr>
41
+ <th>Arch</th>
42
+ <th>Params (M)</th>
43
+ <th> 2D Segmentation (Dice) </th>
44
+ <th> 3D Segmentation (3D IoU) </th>
45
+ <th>Weights</th>
46
+ </tr>
47
+ <tr>
48
+ <td>ResNet-50</td>
49
+ <td>25.5M</td>
50
+ <td>83.05</td>
51
+ <td>79.02</td>
52
+ <td> <a href="https://drive.google.com/file/d/11Uamq4bT_AbTf8sigIctIAnQJN4EethW/view?usp=sharing">backbone</a> </td>
53
+ </tr>
54
+ <tr>
55
+ <td>ViT-B</td>
56
+ <td>86.0M</td>
57
+ <td>85.80</td>
58
+ <td>80.90</td>
59
+ <td> <a href="https://drive.google.com/file/d/17WnE34S0ylYiA3tMXobH8uUrK_mCVPT4/view?usp=sharing">backbone</a> </td>
60
+ </tr>
61
+ </table>
62
+
63
+ After downloading the pre-trained models, please place them in [`lvm_med_weights`](/lvm_med_weights/) folder to use.
64
+
65
+ - For **Resnet-50**, we demo **end-to-end** segmentation/classification/object detection.
66
+ - For **ViT-B**, we demo **prompt-based** segmentation using bounding-boxes.
67
+
68
+ **Important Note:** please check[```dataset.md```](https://github.com/duyhominhnguyen/LVM-Med/blob/main/lvm-med-training-data/README.md) to avoid potential leaking testing data when using our model.
69
+
70
+ **Segment Anything Model-related Experiments**
71
+ - For all experiments using [SAM](https://github.com/facebookresearch/segment-anything) model, we use the base architecture of SAM which is `sam_vit_b`. You could browse the [`original repo`](https://github.com/facebookresearch/segment-anything) for this pre-trained weight and put it in [`./working_dir/sam_vit_b_01ec64.pth`](./working_dir/) folder to use yaml properly.
72
+
73
+ ## Further Training LVM-Med on Large Dataset
74
+ We release some further pre-trained weight on other large datasets as mentioned in the Table below.
75
+ <table>
76
+ <tr>
77
+ <th>Arch</th>
78
+ <th>Params (M)</th>
79
+ <th>Dataset Name </th>
80
+ <th>Weights</th>
81
+ <th>Descriptions</th>
82
+ </tr>
83
+ <tr>
84
+ <td>ViT-B</td>
85
+ <td>86.0M</td>
86
+ <td> <a href="https://www.nature.com/articles/s41592-021-01249-6">LIVECell</a> </td>
87
+ <td> <a href="https://drive.google.com/file/d/1SxaGXQ4FMbG8pS2zzwTIXXgxF4GdwyEU/view?usp=sharing">backbone</a> </td>
88
+ <td> <a href="https://github.com/duyhominhnguyen/LVM-Med/blob/main/further_training_lvm_med/README.md">Link</a></td>
89
+ </tr>
90
+ <tr>
91
+ <td>ViT-H</td>
92
+ <td>632M</td>
93
+ <td> <a href="https://www.nature.com/articles/s41592-021-01249-6">LIVECell</a> </td>
94
+ <td> <a href="https://drive.google.com/file/d/14IhoyBXI9eP9V2xeOV2-6LlNICKjzBaJ/view?usp=sharing">backbone</a> </td>
95
+ <td> <a href="https://github.com/duyhominhnguyen/LVM-Med/blob/main/further_training_lvm_med/README.md">Link</a></td>
96
+ </tr>
97
+ </table>
98
+
99
+
100
+
101
+ ## Prerequisites
102
+
103
+ The code requires `python>=3.8`, as well as `pytorch>=1.7` and `torchvision>=0.8`. Please follow the instructions [here](https://pytorch.org/get-started/locally/) to install both PyTorch and TorchVision dependencies. Installing both PyTorch and TorchVision with CUDA support is strongly recommended.
104
+
105
+ To set up our project, run the following command:
106
+
107
+ ```bash
108
+ git clone https://github.com/duyhominhnguyen/LVM-Med
109
+ cd LVM-Med
110
+ conda env create -f lvm_med.yml
111
+ conda activate lvm_med
112
+ ```
113
+
114
+ To **fine-tune for [Segmentation](#segmentation) using ResNet-50**, we utilize U-Net from `segmentation-models-pytorch` package. To install this library, you can do the following ones:
115
+
116
+ ```bash
117
+ git clone https://github.com/qubvel/segmentation_models.pytorch.git
118
+ cd segmentation_models.pytorch
119
+ pip install -e
120
+ cd ..
121
+ mv segmentation_models_pytorch_example/encoders/__init__.py segmentation_models.pytorch/segmentation_models_pytorch/__init__.py
122
+ mv segmentation_models_pytorch_example/encoders/resnet.py segmentation_models.pytorch/segmentation_models_pytorch/resnet.py
123
+ ```
124
+
125
+ <!--
126
+ 1. `git clone https://github.com/qubvel/segmentation_models.pytorch.git`
127
+ 2. `cd segmentation_models.pytorch; pip install -e .`
128
+ 4. Copy file [`__init__.py`](segmentation_models_pytorch_example/encoders/__init__.py) and [`resnet.py`](segmentation_models_pytorch_example/encoders/resnet.py) in [`segmentation_models_pytorch_example`](segmentation_models_pytorch_example) folder
129
+ 5. Paste [`__init__.py`](segmentation_models_pytorch_example/encoders/__init__.py) and [`resnet.py`](segmentation_models_pytorch_example/encoders/resnet.py) in the folder `encoders` of clone `segmentation_models.pytorch/segmentation_models_pytorch/` package to configure new pre-trained models
130
+ -->
131
+
132
+ ## Preparing datasets
133
+ ### For the Brain Tumor Dataset
134
+ You could download the `Brain` dataset via Kaggle's [`Brain Tumor Classification (MRI)`](https://www.kaggle.com/datasets/sartajbhuvaji/brain-tumor-classification-mri) and change the name into ```BRAIN```.
135
+
136
+ ### For VinDr
137
+ You can download the dataset from this link [`VinDr`](https://www.kaggle.com/datasets/awsaf49/vinbigdata-512-image-dataset) and put the folder ```vinbigdata``` into the folder ```object_detection```. To build the dataset, after downloading the dataset, you can run script ```convert_to_coco.py``` inside the folder object_detection.
138
+ ```bash
139
+ python convert_to_coco.py # Note, please check links inside the code in lines 146 and 158 to build dataset correctly
140
+ ```
141
+ More information can be found in [```object_detection```](./object_detection).
142
+
143
+ ### Others
144
+ First you should download the respective dataset that you need to run to the [`dataset_demo`](/dataset_demo/) folder. To get as close results as your work as possible, you could prepare some of our specific dataset (which are not pre-distributed) the same way as we do:
145
+ ```bash
146
+ python prepare_dataset.py -ds [dataset_name]
147
+ ```
148
+ such that: `dataset_name` is the name of dataset that you would like to prepare. After that, you should change paths to your loaded dataset on our pre-defined yaml file in [`dataloader/yaml_data`](/dataloader/yaml_data/).
149
+
150
+ Currently support for `Kvasir`, `BUID`, `FGADR`, `MMWHS_MR_Heart` and `MMWHS_CT_Heart`.
151
+
152
+ **Note:** You should change your dataset name into the correct format (i.e., Kvasir, BUID) as our current support dataset name. Or else it won't work as expected.
153
+
154
+ ## Downstream Tasks
155
+ ### Segmentation
156
+ ### 1. End-to-End Segmentation
157
+ **a) Training Phase:**
158
+
159
+ **Fine-tune for downstream tasks using ResNet-50**
160
+
161
+ ```bash
162
+ python train_segmentation.py -c ./dataloader/yaml_data/buid_endtoend_R50.yml
163
+ ```
164
+ Changing name of dataset in ``.yml`` configs in [```./dataloader/yaml_data/```](./dataloader/yaml_data/) for other experiments.
165
+
166
+ **Note**: to apply segmentation models (2D or 3D) using ResNet-50, we suggest normalizing gradient for stable training phases by set:
167
+
168
+ ```bash
169
+ clip_value = 1
170
+ torch.nn.utils.clip_grad_norm_(net.parameters(), clip_value)
171
+ ```
172
+ See examples in file [```/segmentation_2d/train_R50_seg_adam_optimizer_2d.py```](./segmentation_2d/train_R50_seg_adam_optimizer_2d.py) lines 129-130.
173
+
174
+ [//]: # (#### Fine-tune for downstream tasks using SAM's VIT)
175
+
176
+ [//]: # (```bash)
177
+
178
+ [//]: # (python train_segmentation.py -c ./dataloader/yaml_data/buid_endtoend_SAM_VIT.yml)
179
+
180
+ [//]: # (```)
181
+ **b) Inference:**
182
+ #### ResNet-50 version
183
+
184
+ ```bash
185
+ python train_segmentation.py -c ./dataloader/yaml_data/buid_endtoend_R50.yml -test
186
+ ```
187
+ For the end-to-end version using SAM's ViT, we will soon release a better version than the reported results in the paper.
188
+
189
+ [//]: # (#### SAM's ViT version)
190
+
191
+ [//]: # (```bash)
192
+
193
+ [//]: # (python train_segmentation.py -c ./dataloader/yaml_data/buid_endtoend_SAM_VIT.yml -test)
194
+
195
+ [//]: # (```)
196
+
197
+ ### 2. Prompt-based Segmentation with ViT-B
198
+ **a. Prompt-based segmentation with fine-tuned decoder of SAM ([MedSAM](https://github.com/bowang-lab/MedSAM)).**
199
+
200
+ We run the MedSAM baseline to compare performance by:
201
+ #### Train
202
+ ```bash
203
+ python3 medsam.py -c dataloader/yaml_data/buid_sam.yml
204
+ ```
205
+ #### Inference
206
+ ```bash
207
+ python3 medsam.py -c dataloader/yaml_data/buid_sam.yml -test
208
+ ```
209
+
210
+ **b. Prompt-based segmentation as [MedSAM](https://github.com/bowang-lab/MedSAM) but using LVM-Med's Encoder.**
211
+
212
+ The training script is similar as MedSAM case but specify the weight model by ```-lvm_encoder```.
213
+ #### Train
214
+ ```bash
215
+ python3 medsam.py -c dataloader/yaml_data/buid_lvm_med_sam.yml -lvm_encoder ./lvm_med_weights/lvmmed_vit.pth
216
+ ```
217
+
218
+ #### Test
219
+ ```bash
220
+ python3 medsam.py -c dataloader/yaml_data/buid_lvm_med_sam.yml -lvm_encoder ./lvm_med_weights/lvmmed_vit.pth -test
221
+ ```
222
+
223
+ You could also check our example notebook [`Prompt_Demo.ipynb`](/notebook/Prompt_Demo.ipynb) for results visualization using prompt-based MedSAM and prompt-based SAM with LVM-Med's encoder. The pre-trained weights for each SAM decoder model in the demo are [here](https://drive.google.com/drive/u/0/folders/1tjrkyEozE-98HAGEtyHboCT2YHBSW15U). Please download trained models of LVM-Med and MedSAM and put them into [`working_dir/checkpoints`](./working_dir/checkpoints/) folder for running the aforementioned notebook file.
224
+
225
+ **c. Zero-shot prompt-based segmentation with Segment Anything Model (SAM) for downstream tasks**
226
+
227
+ The SAM model without any finetuning using bounding box-based prompts can be done by:
228
+ ```bash
229
+ python3 zero_shot_segmentation.py -c dataloader/yaml_data/buid_sam.yml
230
+ ```
231
+ ### Image Classification
232
+ We provide training and testing scripts using LVM-Med's ResNet-50 models for Brain Tumor Classification and Diabetic Retinopathy Grading in FGADR dataset (Table 5 in main paper and Table 12 in Appendix). The version with ViT models will be updated soon.
233
+
234
+ **a. Training with FGADR**
235
+ ```bash
236
+ # Fully fine-tuned with 1 FCN
237
+ python train_classification.py -c ./dataloader/yaml_data/fgadr_endtoend_R50_non_frozen_1_fcn.yml
238
+
239
+ # Fully fine-tuned with multiple FCNs
240
+ python train_classification.py -c ./dataloader/yaml_data/fgadr_endtoend_R50_non_frozen_fcns.yml
241
+
242
+ # Freeze all and fine-tune 1-layer FCN only
243
+ python train_classification.py -c ./dataloader/yaml_data/fgadr_endtoend_R50_frozen_1_fcn.yml
244
+
245
+ # Freeze all and fine-tune multi-layer FCN only
246
+ python train_classification.py -c ./dataloader/yaml_data/fgadr_endtoend_R50_frozen_fcns.yml
247
+ ```
248
+ To run for ```Brain dataset```, choose other config files ```brain_xyz.yml```in folder [`./dataloader/yaml_data/`](/dataloader/yaml_data).
249
+
250
+ **b. Inference with FGADR**
251
+ ```bash
252
+ # Fully fine-tuned with 1 FCN
253
+ python train_classification.py -c ./dataloader/yaml_data/fgadr_endtoend_R50_non_frozen_1_fcn.yml -test
254
+
255
+ # Fully fine-tuned with multiple FCNs
256
+ python train_classification.py -c ./dataloader/yaml_data/fgadr_endtoend_R50_non_frozen_fcns.yml -test
257
+
258
+ # Freeze all and fine-tune 1-layer FCN only
259
+ python train_classification.py -c ./dataloader/yaml_data/fgadr_endtoend_R50_frozen_1_fcn.yml -test
260
+
261
+ # Freeze all and fine-tune multi-layer FCN only
262
+ python train_classification.py -c ./dataloader/yaml_data/fgadr_endtoend_R50_frozen_fcns.yml -test
263
+ ```
264
+ ### Object Detection
265
+ We demonstrate using LVM-Med ResNet-50 for object detection with Vin-Dr dataset. We use Faster-RCNN for the network backbone.
266
+ You can access [`object_detection`](./object_detection) folder for more details.
267
+
268
+ ## Citation
269
+ Please cite this paper if it helps your research:
270
+ ```bibtex
271
+ @article{nguyen2023lvm,
272
+ title={LVM-Med: Learning Large-Scale Self-Supervised Vision Models for Medical Imaging via Second-order Graph Matching},
273
+ author={Nguyen, Duy MH and Nguyen, Hoang and Diep, Nghiem T and Pham, Tan N and Cao, Tri and Nguyen, Binh T and Swoboda, Paul and Ho, Nhat and Albarqouni, Shadi and Xie, Pengtao and others},
274
+ journal={arXiv preprint arXiv:2306.11925},
275
+ year={2023}
276
+ }
277
+ ```
278
+
279
+ ## Related Work
280
+ We use and modify codes from [SAM](https://github.com/facebookresearch/segment-anything) and [MedSAM](https://github.com/bowang-lab/MedSAM) for prompt-based segmentation settings. A part of LVM-Med algorithm adopt data transformations from [Vicregl](https://github.com/facebookresearch/VICRegL), [Deepcluster-v2](https://github.com/facebookresearch/swav?utm_source=catalyzex.com). We also utilize [vissl](https://github.com/facebookresearch/vissl) framework to train 2D self-supervised methods in our collected data. Thank the authors for their great work!
281
+
282
+ ## License
283
+ Licensed under the [CC BY-NC-ND 2.0](https://creativecommons.org/licenses/by-nc-nd/2.0/) (**Attribution-NonCommercial-NoDerivs 2.0 Generic**). The code is released for academic research use only. For commercial use, please contact [Ho_Minh_Duy.Nguyen@dfki.de](Ho_Minh_Duy.Nguyen@dfki.de)
284
+
285
+ [//]: # (### f. LVM-Med )
286
+
287
+ [//]: # (#### Training Phase)
288
+
289
+ [//]: # (#### Fine-tune for downstream tasks using ResNet-50)
290
+
291
+ [//]: # ()
292
+ [//]: # (```bash)
293
+
294
+ [//]: # (python train_segmentation.py -c ./dataloader/yaml_data/buid_endtoend_R50.yml)
295
+
296
+ [//]: # (```)
297
+
298
+ [//]: # (#### Fine-tune for downstream tasks using SAM's VIT)
299
+
300
+ [//]: # (```bash)
301
+
302
+ [//]: # (python train_segmentation.py -c ./dataloader/yaml_data/buid_endtoend_SAM_VIT.yml)
303
+
304
+ [//]: # (```)
305
+
306
+ [//]: # (#### Inference)
307
+
308
+ [//]: # (#### Downstream tasks using ResNet-50)
309
+
310
+ [//]: # ()
311
+ [//]: # (```bash)
312
+
313
+ [//]: # (python train_segmentation.py -c ./dataloader/yaml_data/buid_endtoend_R50.yml -test)
314
+
315
+ [//]: # (```)
316
+
317
+ [//]: # (#### Downstream tasks using SAM's VIT)
318
+
319
+ [//]: # (```bash)
320
+
321
+ [//]: # (python train_segmentation.py -c ./dataloader/yaml_data/buid_endtoend_SAM_VIT.yml -test)
322
+
323
+ [//]: # (```)
assets/__init__.py ADDED
File without changes
assets/body_lvm_med.jpg ADDED
assets/lvm_med_compare.jpg ADDED
assets/lvm_med_teaser.gif ADDED

Git LFS Details

  • SHA256: bc91c309ae76648d8c2c8725ae1e95d9d9ef90bcf3cc754e3f24fc1c65c4057d
  • Pointer size: 133 Bytes
  • Size of remote file: 12.5 MB
classification_R50/__init__.py ADDED
File without changes
classification_R50/train_R50_classification.py ADDED
@@ -0,0 +1,349 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Linear and non-linear image classification tasks with and w/o frozen image encoders
3
+ """
4
+ import torch
5
+ import torch.nn as nn
6
+ import torchvision
7
+ from torchvision import transforms
8
+ from torch.utils.data import DataLoader, Dataset
9
+ from PIL import Image
10
+ import numpy as np
11
+ from sklearn.model_selection import train_test_split
12
+ import torchvision.datasets as datasets
13
+ import argparse
14
+ from tqdm import tqdm
15
+ import os
16
+ import random
17
+ import torch.nn.functional as F
18
+ seed = 42
19
+ torch.manual_seed(seed)
20
+ np.random.seed(seed)
21
+ random.seed(seed)
22
+
23
+
24
+
25
+ weight_collections = {
26
+ "resnet50": {
27
+ "lvm-med-resnet": "./lvm_med_weights/lvmmed_resnet.torch",
28
+ }
29
+ }
30
+
31
+ def eval(net, dataloader, device, criterion, num_samples):
32
+ # Evaluate the model on the validation set
33
+ val_loss = 0.0
34
+ val_acc = 0.0
35
+
36
+ net.eval()
37
+ with tqdm(total=len(dataloader), desc='Validation round', unit=' img') as pbar:
38
+ for inputs, labels in dataloader:
39
+ inputs = inputs.to(device)
40
+ labels = labels.to(device)
41
+ with torch.no_grad():
42
+ outputs = net(inputs)
43
+ loss = criterion(outputs, labels)
44
+ val_loss += loss.item() * inputs.size(0)
45
+ _, preds = torch.max(outputs, 1)
46
+ val_acc += torch.sum(preds == labels.data)
47
+ pbar.update(inputs.shape[0])
48
+ val_loss /= num_samples
49
+ val_acc /= num_samples
50
+ net.train()
51
+ return val_loss, val_acc
52
+
53
+ def TrainingTesting(cfg, numtry, pretrained_weight_name, data_path, num_classes, data_tranform, device, solver, name_weights,
54
+ frozen_encoder, architecture_type, number_epoch=50, learning_rate=0.001, batch_size=32, test_mode='best_valid',
55
+ valid_rate=0.2):
56
+ # Load the datasets
57
+ train_dir = data_path + "/Training"
58
+ test_dir = data_path + "/Testing"
59
+ if frozen_encoder:
60
+ checkpoint_dir = cfg.base.best_valid_model_checkpoint + cfg.base.dataset_name + "_" + architecture_type + "_" + name_weights + "_frozen/"
61
+ else:
62
+ checkpoint_dir = cfg.base.best_valid_model_checkpoint + cfg.base.dataset_name + "_" + architecture_type + "_" + name_weights + "_non_frozen/"
63
+
64
+ CHECK_FOLDER = os.path.isdir(checkpoint_dir)
65
+
66
+ if not CHECK_FOLDER:
67
+ os.makedirs(checkpoint_dir)
68
+ print("created folder: ", checkpoint_dir)
69
+
70
+ train_dataset = datasets.ImageFolder(root=train_dir, transform=data_tranform)
71
+ test_dataset = datasets.ImageFolder(root=test_dir, transform=data_tranform)
72
+
73
+ print ("valid size is {}".format(valid_rate))
74
+ # Split the training dataset into training and validation sets
75
+ train_indices, val_indices = train_test_split(list(range(len(train_dataset))), test_size=valid_rate, random_state=42)
76
+ train_sampler = torch.utils.data.sampler.SubsetRandomSampler(train_indices)
77
+ val_sampler = torch.utils.data.sampler.SubsetRandomSampler(val_indices)
78
+
79
+ loader_args = dict(num_workers=10, pin_memory=True)
80
+ train_loader = DataLoader(train_dataset, batch_size=batch_size, sampler=train_sampler, **loader_args)
81
+ val_loader = DataLoader(train_dataset, batch_size=batch_size, sampler=val_sampler, **loader_args)
82
+ test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=True, **loader_args)
83
+
84
+ n_train = len(train_indices)
85
+
86
+ # Define the ResNet50 model
87
+ model = torchvision.models.resnet50(pretrained=True)
88
+
89
+ # Freeze the layers of the ResNet50 model
90
+ if frozen_encoder:
91
+ print ("Frozen encoder")
92
+ for param in model.parameters():
93
+ param.requires_grad = False
94
+
95
+ num_ftrs = model.fc.in_features
96
+
97
+ # define linear or non-linear architecture
98
+ if architecture_type == '1-fcn':
99
+ print ("Using single fully-connected layer")
100
+ model.fc = nn.Linear(num_ftrs, num_classes)
101
+ elif architecture_type == "fcns":
102
+ print("Using several fully-connected layers")
103
+ if cfg.base.dataset_name == 'brain':
104
+ model.fc = nn.Sequential(
105
+ nn.Linear(num_ftrs, 512),
106
+ nn.ReLU(),
107
+ nn.Linear(512, 256),
108
+ nn.ReLU(),
109
+ nn.Linear(256, num_classes))
110
+ elif cfg.base.dataset_name == 'fgadr':
111
+ model.fc = nn.Sequential(
112
+ nn.Linear(num_ftrs, 512),
113
+ nn.ReLU(),
114
+ nn.Linear(512, 128),
115
+ nn.ReLU(),
116
+ nn.Linear(128, num_classes))
117
+ else:
118
+ print(">>> Not implemented for selected datasets")
119
+ exit()
120
+ else:
121
+ print (">>> No available option for achitecture. Please check 'help' with --linear option")
122
+ exit()
123
+
124
+ pretrained_weight = torch.load(weight_collections["resnet50"][pretrained_weight_name], map_location=device)
125
+ model.load_state_dict(pretrained_weight, strict=False)
126
+ print("Loaded pretrained-weight of ", pretrained_weight_name)
127
+
128
+ model = model.to(device)
129
+
130
+ criterion = nn.CrossEntropyLoss()
131
+
132
+ if solver == "sgd":
133
+ optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate, momentum=0.9)
134
+ elif solver == "adam":
135
+ optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate, betas=(0.9, 0.999), eps=1e-08,
136
+ weight_decay=0.)
137
+ if cfg.base.dataset_name == 'fgadr':
138
+ optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate, betas=(0.9, 0.999), eps=1e-08,
139
+ weight_decay=0.005)
140
+ else:
141
+ print ("Non-available solver")
142
+ exit()
143
+
144
+ ## ------------ Train the model ------------
145
+ print(" ------------ Training ------------ ")
146
+ num_epochs = number_epoch
147
+ best_acc_val = 0.
148
+
149
+ for epoch in range(num_epochs):
150
+ print(f"Epoch {epoch + 1}:")
151
+ train_loss = 0.0
152
+ train_acc = 0.0
153
+
154
+ # Train the model on the training set
155
+ model.train()
156
+ with tqdm(total=n_train, desc=f'Epoch {epoch + 1}/{num_epochs}', unit='img') as pbar:
157
+ for inputs, labels in train_loader:
158
+ inputs = inputs.to(device)
159
+ labels = labels.to(device)
160
+ optimizer.zero_grad()
161
+ outputs = model(inputs)
162
+ loss = criterion(outputs, labels)
163
+ loss.backward()
164
+ optimizer.step()
165
+ train_loss += loss.item() * inputs.size(0)
166
+ _, preds = torch.max(outputs, 1)
167
+ train_acc += torch.sum(preds == labels.data)
168
+
169
+ # updating progressing bar
170
+ pbar.update(inputs.shape[0])
171
+ pbar.set_postfix(**{'loss (batch)': loss.item()})
172
+
173
+ # Print the results for this epoch
174
+ train_loss /= len(train_indices)
175
+ train_acc /= len(train_indices)
176
+ num_samples = len(val_indices)
177
+ num_samples_test = len(test_dataset)
178
+
179
+ print(" \n >>> Evaluation ")
180
+ val_loss, val_acc = eval(model, val_loader, device, criterion, num_samples)
181
+
182
+ if val_acc >= best_acc_val:
183
+ checkpoint = {
184
+ 'epoch': epoch + 1,
185
+ 'state_dict': model.state_dict(),
186
+ 'optimizer': optimizer.state_dict()
187
+ }
188
+ torch.save(checkpoint, checkpoint_dir
189
+ + name_weights + "_" + pretrained_weight_name + "_" + str(numtry) + ".pth")
190
+ print("Saved checkpoint at epoch ", epoch + 1)
191
+ best_acc_val = val_acc
192
+
193
+ print(f"Training Loss: {train_loss:.4f}\t Training Accuracy: {train_acc:.4f}")
194
+ print(f"Val Loss: {val_loss:.4f}\tVal Accuracy: {val_acc:.5f}")
195
+
196
+ # print model at last epochs
197
+ checkpoint = {
198
+ 'epoch': epoch + 1,
199
+ 'state_dict': model.state_dict(),
200
+ 'optimizer': optimizer.state_dict()
201
+ }
202
+ torch.save(checkpoint, checkpoint_dir
203
+ + name_weights + "_" + pretrained_weight_name + "_last_" + str(numtry) + ".pth")
204
+ print("Saved checkpoint at last epoch ", epoch + 1)
205
+
206
+ ## ------------ Test the model ------------
207
+ print("------ Testing ------")
208
+ if test_mode == "best_valid":
209
+ print("Loading best models at {}".format(checkpoint_dir))
210
+ ckp = torch.load(checkpoint_dir
211
+ + name_weights + "_" + pretrained_weight_name + "_" + str(numtry) + ".pth")
212
+ else:
213
+ print("Loading models at last epochs {}".format(checkpoint_dir))
214
+ ckp = torch.load(checkpoint_dir
215
+ + name_weights + "_" + pretrained_weight_name + "_last_" + str(numtry) + ".pth")
216
+ model.load_state_dict(ckp['state_dict'])
217
+ num_samples_test = len(test_dataset)
218
+ test_loss, test_acc = eval(model, test_loader, device, criterion, num_samples_test)
219
+ print(f"Test Loss: {test_loss:.4f}\tTest Accuracy: {test_acc:.5f}")
220
+ return test_acc
221
+
222
+ def inference(numtry, device, cfg, data_path, data_tranform, name_weights, pretrained_weight_name,
223
+ frozen_encoder, architecture_type, num_classes):
224
+ if frozen_encoder:
225
+ checkpoint_dir = cfg.base.best_valid_model_checkpoint + cfg.base.dataset_name + "_" + architecture_type + "_" + name_weights + "_frozen/"
226
+ else:
227
+ checkpoint_dir = cfg.base.best_valid_model_checkpoint + cfg.base.dataset_name + "_" + architecture_type + "_" + name_weights + "_non_frozen/"
228
+ loader_args = dict(num_workers=10, pin_memory=True)
229
+ test_dir = data_path + "/Testing"
230
+ test_dataset = datasets.ImageFolder(root=test_dir, transform=data_tranform)
231
+ test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False, **loader_args)
232
+
233
+ model = torchvision.models.resnet50(pretrained=True)
234
+ # Freeze the layers of the ResNet50 model
235
+ if frozen_encoder:
236
+ print ("Frozen encoder")
237
+ for param in model.parameters():
238
+ param.requires_grad = False
239
+
240
+ num_ftrs = model.fc.in_features
241
+ if architecture_type == '1-fcn':
242
+ print ("Using single fully-connected layer")
243
+ model.fc = nn.Linear(num_ftrs, num_classes)
244
+ elif architecture_type == "fcns":
245
+ print("Using several fully-connected layers")
246
+ if cfg.base.dataset_name == 'brain':
247
+ model.fc = nn.Sequential(
248
+ nn.Linear(num_ftrs, 512),
249
+ nn.ReLU(),
250
+ nn.Linear(512, 256),
251
+ nn.ReLU(),
252
+ nn.Linear(256, num_classes))
253
+ elif cfg.base.dataset_name == 'fgadr':
254
+ model.fc = nn.Sequential(
255
+ nn.Linear(num_ftrs, 512),
256
+ nn.ReLU(),
257
+ nn.Linear(512, 128),
258
+ nn.ReLU(),
259
+ nn.Linear(128, num_classes))
260
+ else:
261
+ print(">>> Not implemented for selected datasets")
262
+ exit()
263
+ else:
264
+ print (">>> No available option for achitecture. Please check 'help' with --linear option")
265
+ exit()
266
+
267
+ model = model.to(device)
268
+ print("Loading best models at {}".format(checkpoint_dir))
269
+ ckp = torch.load(checkpoint_dir
270
+ + name_weights + "_" + pretrained_weight_name + "_" + str(numtry) + ".pth")
271
+ model.load_state_dict(ckp['state_dict'])
272
+ num_samples_test = len(test_dataset)
273
+ criterion = nn.CrossEntropyLoss()
274
+ test_loss, test_acc = eval(model, test_loader, device, criterion, num_samples_test)
275
+ print(f"Test Loss: {test_loss:.4f}\tTest Accuracy: {test_acc:.5f}")
276
+ return test_acc
277
+
278
+ def str2bool(v):
279
+ if isinstance(v, bool):
280
+ return v
281
+ if v.lower() in ('yes', 'true', 't', 'y', '1'):
282
+ return True
283
+ elif v.lower() in ('no', 'false', 'f', 'n', '0'):
284
+ return False
285
+ else:
286
+ raise argparse.ArgumentTypeError('Boolean value expected.')
287
+
288
+
289
+ def train_R50(yml_args, cfg):
290
+
291
+ if cfg.base.dataset_name == 'brain':
292
+ data_path = cfg.dataloader.data_path
293
+ num_classes = 4
294
+ data_transforms = transforms.Compose([
295
+ transforms.Resize((224, 224)),
296
+ transforms.ToTensor(),
297
+ transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
298
+ ])
299
+ elif cfg.base.dataset_name == 'fgadr':
300
+ data_path = cfg.dataloader.data_path
301
+ num_classes = 5
302
+ data_transforms = transforms.Compose([
303
+ transforms.RandomCrop(size=(480, 480)),
304
+ transforms.RandomHorizontalFlip(p=0.5),
305
+ transforms.RandomAutocontrast(p=0.2),
306
+ transforms.ToTensor(),
307
+ transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
308
+ ])
309
+ else:
310
+ print (">>> No available datasets")
311
+ exit()
312
+
313
+ print ("Using dataset {}".format(cfg.base.dataset_name))
314
+ list_acc = []
315
+
316
+ name_weight = cfg.base.original_checkpoint + "_output"
317
+ cuda_string = 'cuda:' + cfg.base.gpu_id
318
+ devices = torch.device(cuda_string if torch.cuda.is_available() else 'cpu')
319
+
320
+ if not yml_args.use_test_mode:
321
+ # Training model with three trial times
322
+ for numtry in range(3):
323
+ print ("*****"*3 + "\n" + "Trial", numtry)
324
+ test_acc = TrainingTesting(cfg = cfg, numtry=numtry, pretrained_weight_name=cfg.base.original_checkpoint, data_path = data_path,
325
+ num_classes = num_classes,
326
+ data_tranform = data_transforms,
327
+ device=devices,
328
+ solver=cfg.train.solver,
329
+ name_weights=name_weight, frozen_encoder=cfg.base.frozen_eval,
330
+ number_epoch=cfg.train.num_epochs, architecture_type=cfg.base.model,
331
+ learning_rate=cfg.train.learning_rate, batch_size=cfg.train.train_batch_size,
332
+ test_mode=cfg.base.test_mode,
333
+ valid_rate = cfg.base.valid_rate)
334
+ list_acc.append(test_acc.to('cpu'))
335
+ print("==============================================================================")
336
+ print ("*****"*3 + "\n")
337
+ print("Mean Accuracy: ", np.mean(list_acc))
338
+ print("Standard Deviation: ", np.std(list_acc))
339
+ else:
340
+ # Evaluate model with three weights
341
+ for numtry in range(3):
342
+ print ("*****"*3 + "\n" + "weight", numtry+1)
343
+ test_acc = inference(numtry = numtry, device = devices, cfg = cfg, data_path = data_path, data_tranform=data_transforms,
344
+ name_weights=name_weight, pretrained_weight_name=cfg.base.original_checkpoint,
345
+ frozen_encoder=cfg.base.frozen_eval, architecture_type=cfg.base.model, num_classes=num_classes)
346
+ list_acc.append(test_acc.to('cpu'))
347
+ print ("*****"*3 + "\n")
348
+ print("Mean Accuracy: ", np.mean(list_acc))
349
+ print("Standard Deviation: ", np.std(list_acc))
dataloader/__init__.py ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ from .sam_transforms import (
2
+ ResizeLongestSide
3
+ )
dataloader/dataloader.py ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from torch.utils.data import (
2
+ DataLoader
3
+ )
4
+ from dataloader.dataset import (
5
+ SegmentationDataset,
6
+ AugmentedSegmentationDataset
7
+ )
8
+
9
+ def sam_dataloader(cfg):
10
+ loader_args = dict(num_workers=cfg.base.num_workers,
11
+ pin_memory=cfg.base.pin_memory)
12
+ """
13
+ Since the output of SAM's mask decoder is 256 by default (without using a postprocessing step),
14
+ hence, we chose to resize the mask ground truth into 256x256 for a better output (prediction without postprocessing).
15
+ """
16
+ if cfg.base.dataset_name in ["buidnewprocess", "kvasir", "isiconlytrain", "drive"]:
17
+ train_dataset = SegmentationDataset(cfg.base.dataset_name,
18
+ cfg.dataloader.train_dir_img,
19
+ cfg.dataloader.train_dir_mask,
20
+ scale=(1024, 256))
21
+ elif cfg.base.dataset_name in ["bts", "las_mri", "las_ct"]:
22
+ train_dataset = AugmentedSegmentationDataset(cfg.base.dataset_name,
23
+ cfg.dataloader.train_dir_img,
24
+ cfg.dataloader.train_dir_mask,
25
+ scale=(1024, 256))
26
+ else:
27
+ raise NameError(f"[Error] Dataset {cfg.base.dataset_name} is either in wrong format or not yet implemented!")
28
+
29
+ val_dataset = SegmentationDataset(cfg.base.dataset_name,
30
+ cfg.dataloader.valid_dir_img,
31
+ cfg.dataloader.valid_dir_mask,
32
+ scale=(1024, 256))
33
+ test_dataset = SegmentationDataset(cfg.base.dataset_name,
34
+ cfg.dataloader.test_dir_img,
35
+ cfg.dataloader.test_dir_mask,
36
+ scale=(1024, 256))
37
+ train_loader = DataLoader(train_dataset,
38
+ shuffle=True,
39
+ batch_size=cfg.train.train_batch_size,
40
+ multiprocessing_context="fork",
41
+ **loader_args)
42
+ val_loader = DataLoader(val_dataset,
43
+ shuffle=False,
44
+ drop_last=True,
45
+ batch_size=cfg.train.valid_batch_size,
46
+ multiprocessing_context="fork",
47
+ **loader_args)
48
+ test_loader = DataLoader(test_dataset,
49
+ shuffle=False,
50
+ batch_size=cfg.train.test_batch_size,
51
+ drop_last=True,
52
+ multiprocessing_context="fork",
53
+ **loader_args)
54
+
55
+ return train_loader, val_loader, test_loader, val_dataset, test_dataset
dataloader/dataset.py ADDED
@@ -0,0 +1,434 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ import os
3
+ import numpy as np
4
+ import torch
5
+ import cv2
6
+ from skimage.transform import resize
7
+ from torch.utils.data import Dataset
8
+
9
+ def get_bbox_from_mask(mask):
10
+ '''Returns a bounding box from a mask'''
11
+ bbox = []
12
+
13
+ if len(mask.shape) == 2: #(H, W)
14
+ if np.all(mask == 0):
15
+ y_indices, x_indices = np.random.normal(0, 1024, 2)
16
+ x_min, x_max = np.min(x_indices), np.max(x_indices)
17
+ y_min, y_max = np.min(y_indices), np.max(y_indices)
18
+ x_min = max(0, x_min - np.random.randint(0, 20))
19
+ x_max = min(1024, x_max + np.random.randint(0, 20))
20
+ y_min = max(0, y_min - np.random.randint(0, 20))
21
+ y_max = min(1024, y_max + np.random.randint(0, 20))
22
+ else:
23
+ y_indices, x_indices = np.where(mask > 0)
24
+ x_min, x_max = np.min(x_indices), np.max(x_indices)
25
+ y_min, y_max = np.min(y_indices), np.max(y_indices)
26
+ H, W = mask.shape
27
+ x_min = max(0, x_min - np.random.randint(0, 20))
28
+ x_max = min(W, x_max + np.random.randint(0, 20))
29
+ y_min = max(0, y_min - np.random.randint(0, 20))
30
+ y_max = min(H, y_max + np.random.randint(0, 20))
31
+ return np.array([x_min, y_min, x_max, y_max])
32
+
33
+ for i in range(mask.shape[0]):
34
+ if np.all(mask[i] == 0):
35
+ y_indices, x_indices = np.random.normal(0, 1024, 2)
36
+ x_min, x_max = np.min(x_indices), np.max(x_indices)
37
+ y_min, y_max = np.min(y_indices), np.max(y_indices)
38
+ x_min = max(0, x_min - np.random.randint(0, 20))
39
+ x_max = min(1024, x_max + np.random.randint(0, 20))
40
+ y_min = max(0, y_min - np.random.randint(0, 20))
41
+ y_max = min(1024, y_max + np.random.randint(0, 20))
42
+ else:
43
+ y_indices, x_indices = np.where(mask[i] > 0)
44
+ x_min, x_max = np.min(x_indices), np.max(x_indices)
45
+ y_min, y_max = np.min(y_indices), np.max(y_indices)
46
+ H, W = mask[i].shape
47
+ x_min = max(0, x_min - np.random.randint(0, 20))
48
+ x_max = min(W, x_max + np.random.randint(0, 20))
49
+ y_min = max(0, y_min - np.random.randint(0, 20))
50
+ y_max = min(H, y_max + np.random.randint(0, 20))
51
+ bbox.append([x_min, y_min, x_max, y_max])
52
+ return np.array(bbox)
53
+
54
+ class SegmentationDataset_train(Dataset):
55
+ def __init__(self, nonlabel_path: str, havelabel_path: str, dataset: str, scale = (224, 224)):
56
+ self.nonlabel_path = nonlabel_path
57
+ self.havelabel_path = havelabel_path
58
+ self.name_dataset = dataset
59
+ self.scale = scale
60
+
61
+ with open(self.nonlabel_path, 'r') as nlf:
62
+ lines = nlf.readlines()
63
+ non_label_lines = [line.strip().split(' ')[:2] for line in lines]
64
+
65
+ with open(self.havelabel_path, 'r') as hlf:
66
+ lines = hlf.readlines()
67
+ have_label_lines = [line.strip().split(' ')[:2] for line in lines]
68
+
69
+ if len(non_label_lines) == 0:
70
+ self.ids = np.array(have_label_lines, dtype= object)
71
+ else:
72
+ choose_non_lable_lines = np.random.choice(len(non_label_lines), size = len(have_label_lines))
73
+ non_label_lines = np.array(non_label_lines, dtype= object)
74
+ have_label_lines = np.array(have_label_lines, dtype= object)
75
+ self.ids = np.concatenate([non_label_lines[choose_non_lable_lines], have_label_lines], axis= 0)
76
+ # self.ids = os.listdir(images_dir) #[splitext(file)[0] for file in listdir(images_dir) if not file.startswith('.') and image_type in file]
77
+ # print(len(self.ids))
78
+ # if datasetname == "las_mri":
79
+ # self.ids = [f for f in self.ids if image_type in f]
80
+ if len(self.ids) == 0:
81
+ raise RuntimeError(f'No input file found in {self.images_dir}, make sure you put your images there')
82
+ logging.info(f'Creating dataset with {len(self.ids)} examples')
83
+ self.cache = {}
84
+
85
+ def __len__(self):
86
+ return len(self.ids)
87
+
88
+ @classmethod
89
+ def preprocess(self, img, scale, is_mask):
90
+ img = resize(img,
91
+ (scale[0], scale[0]),
92
+ order=0,
93
+ preserve_range=True,
94
+ anti_aliasing=False).astype('uint8')
95
+ img = np.asarray(img)
96
+ if not is_mask:
97
+ img = ((img - img.min()) * (1/(0.01 + img.max() - img.min()) * 255)).astype('uint8')
98
+ if is_mask:
99
+ img = resize(img,
100
+ (scale[1], scale[1]),
101
+ order=0,
102
+ preserve_range=True,
103
+ anti_aliasing=False).astype('uint8')
104
+ return img
105
+
106
+ @classmethod
107
+ def load(self, filename, is_mask=False):
108
+ if is_mask:
109
+ return cv2.imread(filename, 0)
110
+ else:
111
+ return cv2.imread(filename)
112
+
113
+ def __getitem__(self, idx):
114
+ if idx in self.cache:
115
+ return self.cache[idx]
116
+
117
+ img_file = self.ids[idx][0]
118
+ mask_file = self.ids[idx][1]
119
+ # print(img_file)
120
+ #start = time.time()
121
+ mask = self.load(mask_file, is_mask=True)
122
+ img = self.load(img_file, is_mask=False)
123
+
124
+ assert mask is not None, mask_file
125
+ assert img is not None, img_file
126
+
127
+ img = self.preprocess(img, self.scale, is_mask=False)
128
+ mask = self.preprocess(mask, self.scale, is_mask=True)
129
+
130
+ if self.name_dataset in ["kvasir", "buidnewprocess"]:
131
+ mask[mask < 50] = 0
132
+ mask[mask > 200] = 1
133
+ elif self.name_dataset == "isiconlytrain":
134
+ mask[mask > 1] = 1
135
+ elif self.name_dataset.startswith("las"):
136
+ mask[mask == 30] = 1
137
+ mask[mask == 60] = 2 # main predict
138
+ mask[mask == 90] = 3
139
+ mask[mask == 120] = 4
140
+ mask[mask == 150] = 5
141
+ mask[mask == 180] = 6
142
+ mask[mask == 210] = 7
143
+ mask[mask > 7] = 0
144
+ else:
145
+ mask[mask>0] = 1
146
+
147
+ bboxes = get_bbox_from_mask(mask)
148
+
149
+ data = {
150
+ 'image': torch.as_tensor(img.copy()).permute(2, 0, 1).float().contiguous(),
151
+ 'mask': torch.tensor(mask[None, :, :]).long(),
152
+ 'mask_ete': torch.as_tensor(mask.copy().astype(int)).long().contiguous(),
153
+ 'bboxes' : torch.tensor(bboxes).float(),
154
+ 'mask_file' : mask_file,
155
+ 'img_file' : img_file
156
+ }
157
+ self.cache[idx] = data
158
+ return data
159
+
160
+ def get_3d_iter(self):
161
+ from itertools import groupby
162
+ keyf = lambda idx : self.ids[idx].split("_frame_")[0]
163
+ sorted_ids = sorted(range(len(self.ids)), key=lambda i : self.ids[i])
164
+ for _, items in groupby(sorted_ids, key=keyf):
165
+ images = []
166
+ masks = []
167
+ masks_ete = []
168
+ bboxes = []
169
+ for idx in items:
170
+ d = self.__getitem__(idx)
171
+ images.append(d['image'])
172
+ masks.append(d['mask'])
173
+ masks_ete.append(d['mask_ete'])
174
+ bboxes.append(d['bboxes'])
175
+ # store third dimension in image channels
176
+ images = torch.stack(images, dim=0)
177
+ masks = torch.stack(masks, dim=0)
178
+ masks_ete = torch.stack(masks_ete, dim=0)
179
+ bboxes = torch.stack(bboxes, dim=0)
180
+ _3d_data = {'image': images, 'mask': masks, 'mask_ete': masks_ete, 'bboxes': bboxes}
181
+ yield _3d_data
182
+
183
+
184
+ class SegmentationDataset(Dataset):
185
+ def __init__(self, name_dataset: str, images_dir: str, masks_dir: str, scale = (1024, 256)):
186
+ self.images_dir = images_dir
187
+ self.masks_dir = masks_dir
188
+ self.scale = scale
189
+ self.name_dataset = name_dataset
190
+ self.ids = os.listdir(images_dir)
191
+ if len(self.ids) == 0:
192
+ raise RuntimeError(f'No input file found in {self.images_dir}, make sure you put your images there')
193
+ logging.info(f'Creating dataset with {len(self.ids)} examples')
194
+ self.cache = {}
195
+
196
+ def __len__(self):
197
+ return len(self.ids)
198
+
199
+ @classmethod
200
+ def preprocess(self, img, scale, is_mask):
201
+ img = resize(img,
202
+ (scale[0], scale[0]),
203
+ order=0,
204
+ preserve_range=True,
205
+ anti_aliasing=False).astype('uint8')
206
+ img = np.asarray(img)
207
+ if not is_mask:
208
+ img = ((img - img.min()) * (1/(0.01 + img.max() - img.min()) * 255)).astype('uint8')
209
+ if is_mask:
210
+ img = resize(img,
211
+ (scale[1], scale[1]),
212
+ order=0,
213
+ preserve_range=True,
214
+ anti_aliasing=False).astype('uint8')
215
+ return img
216
+
217
+ @classmethod
218
+ def load(self, filename, is_mask=False):
219
+ if is_mask:
220
+ return cv2.imread(filename, 0)
221
+ else:
222
+ return cv2.imread(filename)
223
+
224
+ def __getitem__(self, idx):
225
+ if idx in self.cache:
226
+ return self.cache[idx]
227
+
228
+ name = self.ids[idx]
229
+
230
+ if self.name_dataset == "isiconlytrain":
231
+ mask_file = os.path.join(self.masks_dir, name).split(".jpg")[0]
232
+ mask_file = mask_file + "_segmentation.png"
233
+ elif self.name_dataset == "buidnewprocess":
234
+ mask_file = os.path.join(self.masks_dir, name)
235
+ elif self.name_dataset == "kvasir":
236
+ mask_file = os.path.join(self.masks_dir, name)
237
+ elif self.name_dataset == "drive":
238
+ mask_file = os.path.join(self.masks_dir, name).replace("training", "manual1")
239
+ elif self.name_dataset == "bts":
240
+ mask_file = os.path.join(self.masks_dir, name).replace(self.image_type, "_seg_")
241
+ elif self.name_dataset in ["las_mri", "las_ct"]:
242
+ mask_file = os.path.join(self.masks_dir, name).replace("image", "label")
243
+ else:
244
+ mask_file = os.path.join(self.masks_dir, name)
245
+
246
+ img_file = os.path.join(self.images_dir, name)
247
+
248
+ mask = self.load(mask_file, is_mask=True)
249
+ img = self.load(img_file, is_mask=False)
250
+
251
+ assert mask is not None, mask_file
252
+ assert img is not None, img_file
253
+
254
+ img = self.preprocess(img, self.scale, is_mask=False)
255
+ mask = self.preprocess(mask, self.scale, is_mask=True)
256
+
257
+ if self.name_dataset in ["kvasir", "buidnewprocess"]:
258
+ mask[mask < 50] = 0
259
+ mask[mask > 200] = 1
260
+ elif self.name_dataset == "isiconlytrain":
261
+ mask[mask > 1] = 1
262
+ elif self.name_dataset.startswith("las"):
263
+ mask[mask == 30] = 1
264
+ mask[mask == 60] = 2 # main predict
265
+ mask[mask == 90] = 3
266
+ mask[mask == 120] = 4
267
+ mask[mask == 150] = 5
268
+ mask[mask == 180] = 6
269
+ mask[mask == 210] = 7
270
+ mask[mask > 7] = 0
271
+ else:
272
+ mask[mask>0] = 1
273
+
274
+ bboxes = get_bbox_from_mask(mask)
275
+
276
+ data = {
277
+ 'image': torch.as_tensor(img.copy()).permute(2, 0, 1).float().contiguous(),
278
+ 'mask': torch.tensor(mask[None, :, :]).long(),
279
+ 'mask_ete': torch.as_tensor(mask.copy().astype(int)).long().contiguous(),
280
+ 'bboxes' : torch.tensor(bboxes).float(),
281
+ 'mask_file' : mask_file,
282
+ 'img_file' : img_file
283
+ }
284
+ self.cache[idx] = data
285
+ return data
286
+
287
+ def get_3d_iter(self):
288
+ from itertools import groupby
289
+ keyf = lambda idx : self.ids[idx].split("_frame_")[0]
290
+ sorted_ids = sorted(range(len(self.ids)), key=lambda i : self.ids[i])
291
+ for _, items in groupby(sorted_ids, key=keyf):
292
+ images = []
293
+ masks = []
294
+ masks_ete = []
295
+ bboxes = []
296
+ for idx in items:
297
+ d = self.__getitem__(idx)
298
+ images.append(d['image'])
299
+ masks.append(d['mask'])
300
+ masks_ete.append(d['mask_ete'])
301
+ bboxes.append(d['bboxes'])
302
+ # store third dimension in image channels
303
+ images = torch.stack(images, dim=0)
304
+ masks = torch.stack(masks, dim=0)
305
+ masks_ete = torch.stack(masks_ete, dim=0)
306
+ bboxes = torch.stack(bboxes, dim=0)
307
+ _3d_data = {'image': images, 'mask': masks, 'mask_ete': masks_ete, 'bboxes': bboxes}
308
+ yield _3d_data
309
+
310
+ class AugmentedSegmentationDataset(Dataset):
311
+ def __init__(self, name_dataset: str, images_dir: str, masks_dir: str, scale = (1024, 256), transform=True):
312
+
313
+ self.images_dir = images_dir
314
+ self.masks_dir = masks_dir
315
+ self.scale = scale
316
+ self.transform = transform
317
+ self.name_dataset = name_dataset
318
+ self.ids = os.listdir(images_dir)
319
+ if len(self.ids) == 0:
320
+ raise RuntimeError(f'No input file found in {self.images_dir}, make sure you put your images there')
321
+ logging.info(f'Creating dataset with {len(self.ids)} examples')
322
+ self.cache = {}
323
+
324
+ def __len__(self):
325
+ return len(self.ids)
326
+
327
+ @classmethod
328
+ def preprocess(self, img, scale, is_mask, transform):
329
+ img = resize(img,
330
+ (scale[0], scale[0]),
331
+ order=0,
332
+ preserve_range=True,
333
+ anti_aliasing=False).astype('uint8')
334
+ img = np.asarray(img)
335
+ if (not is_mask) and transform:
336
+ img = ((img - img.min()) * (1/(0.01 + img.max() - img.min()) * 255)).astype('uint8')
337
+ if is_mask:
338
+ img = resize(img,
339
+ (scale[1], scale[1]),
340
+ order=0,
341
+ preserve_range=True,
342
+ anti_aliasing=False).astype('uint8')
343
+ return img
344
+
345
+ @classmethod
346
+ def preprocess_non_expand(self, img, scale, is_mask, transform):
347
+ img = resize(img,
348
+ (scale[0], scale[0]),
349
+ order=0,
350
+ preserve_range=True,
351
+ anti_aliasing=False).astype('uint8')
352
+ img = np.asarray(img)
353
+ if (not is_mask) and transform:
354
+ img = ((img - img.min()) * (1/(0.01 + img.max() - img.min()) * 255)).astype('uint8')
355
+ if is_mask:
356
+ img = resize(img,
357
+ (scale[1], scale[1]),
358
+ order=0,
359
+ preserve_range=True,
360
+ anti_aliasing=False).astype('uint8')
361
+ return img
362
+
363
+ @classmethod
364
+ def load(self, filename, is_mask=False):
365
+ if is_mask:
366
+ return cv2.imread(filename, 0)
367
+ else:
368
+ return cv2.imread(filename)
369
+
370
+ def __getitem__(self, idx):
371
+ if idx in self.cache:
372
+ return self.cache[idx]
373
+
374
+ name = self.ids[idx]
375
+
376
+ if self.name_dataset == "bts":
377
+ mask_file = os.path.join(self.masks_dir, name).replace(self.image_type, "_seg_")
378
+ elif self.name_dataset in ["las_mri", "las_ct"]:
379
+ mask_file = os.path.join(self.masks_dir, name).replace("image", "label")
380
+
381
+ img_file = os.path.join(self.images_dir, name)
382
+
383
+ mask = self.load(mask_file, is_mask=True)
384
+ img = self.load(img_file, is_mask=False)
385
+
386
+ assert mask is not None, mask_file
387
+ assert img is not None, img_file
388
+
389
+ img = self.preprocess_non_expand(img, self.scale, False, self.transform)
390
+ mask = self.preprocess(mask, self.scale, True, self.transform)
391
+
392
+ if self.name_dataset.startswith("las"):
393
+ mask[mask == 30] = 1
394
+ mask[mask == 60] = 2 # main predict
395
+ mask[mask == 90] = 3
396
+ mask[mask == 120] = 4
397
+ mask[mask == 150] = 5
398
+ mask[mask == 180] = 6
399
+ mask[mask == 210] = 7
400
+ mask[mask > 7] = 0
401
+ else:
402
+ mask[mask>0]=1
403
+
404
+ bboxes = get_bbox_from_mask(mask)
405
+
406
+ data = {
407
+ 'image': torch.as_tensor(img.copy()).permute(2, 0, 1).float().contiguous(),
408
+ 'mask': torch.tensor(mask[None, :, :]).long(),
409
+ 'bboxes' : torch.tensor(bboxes).float(),
410
+ 'mask_file' : mask_file,
411
+ 'img_file' : img_file
412
+ }
413
+ self.cache[idx] = data
414
+ return data
415
+
416
+ def get_3d_iter(self):
417
+ from itertools import groupby
418
+ keyf = lambda idx : self.ids[idx].split("_frame_")[0]
419
+ sorted_ids = sorted(range(len(self.ids)), key=lambda i : self.ids[i])
420
+ for _, items in groupby(sorted_ids, key=keyf):
421
+ images = []
422
+ masks = []
423
+ bboxes = []
424
+ for idx in items:
425
+ d = self.__getitem__(idx)
426
+ images.append(d['image'])
427
+ masks.append(d['mask'])
428
+ bboxes.append(d['bboxes'])
429
+ # store third dimension in image channels
430
+ images = torch.stack(images, dim=0)
431
+ masks = torch.stack(masks, dim=0)
432
+ bboxes = torch.stack(bboxes, dim=0)
433
+ _3d_data = {'image': images, 'mask': masks, 'bboxes': bboxes}
434
+ yield _3d_data
dataloader/dataset_ete.py ADDED
@@ -0,0 +1,267 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ import os
3
+ import numpy as np
4
+ import torch
5
+ import cv2
6
+ from skimage.transform import resize
7
+ from torch.utils.data import Dataset
8
+
9
+
10
+
11
+ class SegmentationDataset_train(Dataset):
12
+ def __init__(self, nonlabel_path: str, havelabel_path: str, dataset: str, scale = (224, 224)):
13
+ self.nonlabel_path = nonlabel_path
14
+ self.havelabel_path = havelabel_path
15
+ self.name_dataset = dataset
16
+ self.scale = scale
17
+
18
+ with open(self.nonlabel_path, 'r') as nlf:
19
+ lines = nlf.readlines()
20
+ non_label_lines = [line.strip().split(' ')[:2] for line in lines]
21
+
22
+ with open(self.havelabel_path, 'r') as hlf:
23
+ lines = hlf.readlines()
24
+ have_label_lines = [line.strip().split(' ')[:2] for line in lines]
25
+
26
+ if len(non_label_lines) == 0:
27
+ self.ids = np.array(have_label_lines, dtype= object)
28
+ else:
29
+ choose_non_lable_lines = np.random.choice(len(non_label_lines), size = len(have_label_lines))
30
+ non_label_lines = np.array(non_label_lines, dtype= object)
31
+ have_label_lines = np.array(have_label_lines, dtype= object)
32
+ self.ids = np.concatenate([non_label_lines[choose_non_lable_lines], have_label_lines], axis= 0)
33
+ # self.ids = os.listdir(images_dir) #[splitext(file)[0] for file in listdir(images_dir) if not file.startswith('.') and image_type in file]
34
+ # print(len(self.ids))
35
+ # if datasetname == "las_mri":
36
+ # self.ids = [f for f in self.ids if image_type in f]
37
+ if len(self.ids) == 0:
38
+ raise RuntimeError(f'No input file found in {self.images_dir}, make sure you put your images there')
39
+ logging.info(f'Creating dataset with {len(self.ids)} examples')
40
+ self.cache = {}
41
+
42
+ def __len__(self):
43
+ return len(self.ids)
44
+
45
+ @classmethod
46
+ def preprocess(self, img, scale, is_mask):
47
+ img = resize(img,
48
+ (scale[0], scale[0]),
49
+ order=0,
50
+ preserve_range=True,
51
+ anti_aliasing=False).astype('uint8')
52
+ img = np.asarray(img)
53
+ if not is_mask:
54
+ img = ((img - img.min()) * (1/(0.01 + img.max() - img.min()) * 255)).astype('uint8')
55
+ if len(img.shape) != 3:
56
+ img = np.expand_dims(img, axis=2) #(1, 224, 224)
57
+ if is_mask:
58
+ img = resize(img,
59
+ (scale[1], scale[1]),
60
+ order=0,
61
+ preserve_range=True,
62
+ anti_aliasing=False).astype('uint8')
63
+ return img
64
+
65
+ @classmethod
66
+ def load(self, filename, name_dataset, is_mask=False):
67
+ if name_dataset.startswith("las"):
68
+ if is_mask:
69
+ return cv2.imread(filename, cv2.IMREAD_UNCHANGED)
70
+ else:
71
+ img = cv2.imread(filename, 0)
72
+ return img
73
+ else:
74
+ if is_mask:
75
+ return cv2.imread(filename, 0)
76
+ else:
77
+ return cv2.imread(filename)
78
+
79
+ def __getitem__(self, idx):
80
+ if idx in self.cache:
81
+ return self.cache[idx]
82
+
83
+ img_file = self.ids[idx][0]
84
+ mask_file = self.ids[idx][1]
85
+ # print(img_file)
86
+ #start = time.time()
87
+ mask = self.load(mask_file, self.name_dataset, is_mask=True)
88
+ img = self.load(img_file, self.name_dataset, is_mask=False)
89
+
90
+ assert mask is not None, mask_file
91
+ assert img is not None, img_file
92
+
93
+
94
+ if self.name_dataset in ["kvasir", "buidnewprocess"]:
95
+ mask[mask < 50] = 0
96
+ mask[mask > 200] = 1
97
+ elif self.name_dataset == "isiconlytrain":
98
+ mask[mask > 1] = 1
99
+ elif self.name_dataset.startswith("las"):
100
+ mask[mask == 30] = 1
101
+ mask[mask == 60] = 2 # main predict
102
+ mask[mask == 90] = 3
103
+ mask[mask == 120] = 4
104
+ mask[mask == 150] = 5
105
+ mask[mask == 180] = 6
106
+ mask[mask == 210] = 7
107
+ mask[mask > 7] = 0
108
+ else:
109
+ mask[mask>0] = 1
110
+
111
+ img = self.preprocess(img, self.scale, is_mask=False)
112
+ mask = self.preprocess(mask, self.scale, is_mask=True)
113
+
114
+ data = {
115
+ 'image': torch.as_tensor(img.copy()).permute(2, 0, 1).float().contiguous(),
116
+ 'mask_ete': torch.as_tensor(mask.copy().astype(int)).long().contiguous(),
117
+ 'mask_file' : mask_file,
118
+ 'img_file' : img_file
119
+ }
120
+ self.cache[idx] = data
121
+ return data
122
+
123
+ def get_3d_iter(self):
124
+ from itertools import groupby
125
+ keyf = lambda idx : self.ids[idx].split("_frame_")[0]
126
+ sorted_ids = sorted(range(len(self.ids)), key=lambda i : self.ids[i])
127
+ for _, items in groupby(sorted_ids, key=keyf):
128
+ images = []
129
+ masks_ete = []
130
+ for idx in items:
131
+ d = self.__getitem__(idx)
132
+ images.append(d['image'])
133
+ masks_ete.append(d['mask_ete'])
134
+ # store third dimension in image channels
135
+ images = torch.stack(images, dim=0)
136
+ masks_ete = torch.stack(masks_ete, dim=0)
137
+ _3d_data = {'image': images, 'mask_ete': masks_ete}
138
+ yield _3d_data
139
+
140
+
141
+ class SegmentationDataset(Dataset):
142
+ def __init__(self, name_dataset: str, images_dir: str, masks_dir: str, scale = (1024, 256)):
143
+ self.images_dir = images_dir
144
+ self.masks_dir = masks_dir
145
+ self.scale = scale
146
+ self.name_dataset = name_dataset
147
+ self.ids = os.listdir(images_dir)
148
+ if len(self.ids) == 0:
149
+ raise RuntimeError(f'No input file found in {self.images_dir}, make sure you put your images there')
150
+ logging.info(f'Creating dataset with {len(self.ids)} examples')
151
+ self.cache = {}
152
+
153
+ def __len__(self):
154
+ return len(self.ids)
155
+
156
+ @classmethod
157
+ def preprocess(self, img, scale, is_mask):
158
+ img = resize(img,
159
+ (scale[0], scale[0]),
160
+ order=0,
161
+ preserve_range=True,
162
+ anti_aliasing=False).astype('uint8')
163
+ img = np.asarray(img)
164
+ if not is_mask:
165
+ img = ((img - img.min()) * (1/(img.max() - img.min()) * 255)).astype('uint8')
166
+ if len(img.shape) != 3:
167
+ img = np.expand_dims(img, axis=2) #(1, 224, 224)
168
+ if is_mask:
169
+ img = resize(img,
170
+ (scale[1], scale[1]),
171
+ order=0,
172
+ preserve_range=True,
173
+ anti_aliasing=False).astype('uint8')
174
+ return img
175
+
176
+ @classmethod
177
+ def load(self, filename, name_dataset, is_mask=False):
178
+ if name_dataset.startswith("las"):
179
+ if is_mask:
180
+ return cv2.imread(filename, cv2.IMREAD_UNCHANGED)
181
+ else:
182
+ img = cv2.imread(filename, 0)
183
+ return img
184
+ else:
185
+ if is_mask:
186
+ return cv2.imread(filename, 0)
187
+ else:
188
+ return cv2.imread(filename)
189
+
190
+ def __getitem__(self, idx):
191
+ if idx in self.cache:
192
+ return self.cache[idx]
193
+
194
+ name = self.ids[idx]
195
+
196
+ if self.name_dataset == "isiconlytrain":
197
+ mask_file = os.path.join(self.masks_dir, name).split(".jpg")[0]
198
+ mask_file = mask_file + "_segmentation.png"
199
+ elif self.name_dataset == "buidnewprocess":
200
+ mask_file = os.path.join(self.masks_dir, name)
201
+ elif self.name_dataset == "kvasir":
202
+ mask_file = os.path.join(self.masks_dir, name)
203
+ elif self.name_dataset == "drive":
204
+ mask_file = os.path.join(self.masks_dir, name).replace("training", "manual1")
205
+ elif self.name_dataset == "bts":
206
+ mask_file = os.path.join(self.masks_dir, name).replace(self.image_type, "_seg_")
207
+ elif self.name_dataset in ["las_mri", "las_ct"]:
208
+ mask_file = os.path.join(self.masks_dir, name).replace("image", "label")
209
+ else:
210
+ mask_file = os.path.join(self.masks_dir, name)
211
+
212
+ img_file = os.path.join(self.images_dir, name)
213
+
214
+ mask = self.load(mask_file, self.name_dataset, is_mask=True)
215
+ img = self.load(img_file, self.name_dataset, is_mask=False)
216
+
217
+ assert mask is not None, mask_file
218
+ assert img is not None, img_file
219
+
220
+
221
+
222
+ if self.name_dataset in ["kvasir", "buidnewprocess"]:
223
+ mask[mask < 50] = 0
224
+ mask[mask > 200] = 1
225
+ elif self.name_dataset == "isiconlytrain":
226
+ mask[mask > 1] = 1
227
+ elif self.name_dataset.startswith("las"):
228
+ mask[mask == 30] = 1
229
+ mask[mask == 60] = 2 # main predict
230
+ mask[mask == 90] = 3
231
+ mask[mask == 120] = 4
232
+ mask[mask == 150] = 5
233
+ mask[mask == 180] = 6
234
+ mask[mask == 210] = 7
235
+ mask[mask > 7] = 0
236
+ else:
237
+ mask[mask>0] = 1
238
+
239
+ img = self.preprocess(img, self.scale, is_mask=False)
240
+ mask = self.preprocess(mask, self.scale, is_mask=True)
241
+
242
+ data = {
243
+ 'image': torch.as_tensor(img.copy()).permute(2, 0, 1).float().contiguous(),
244
+ 'mask_ete': torch.as_tensor(mask.copy().astype(int)).long().contiguous(),
245
+ 'mask_file' : mask_file,
246
+ 'img_file' : img_file
247
+ }
248
+ self.cache[idx] = data
249
+ return data
250
+
251
+ def get_3d_iter(self):
252
+ from itertools import groupby
253
+ keyf = lambda idx : self.ids[idx].split("_frame_")[0]
254
+ sorted_ids = sorted(range(len(self.ids)), key=lambda i : self.ids[i])
255
+ for _, items in groupby(sorted_ids, key=keyf):
256
+ images = []
257
+ masks_ete = []
258
+ for idx in items:
259
+ d = self.__getitem__(idx)
260
+ images.append(d['image'])
261
+ masks_ete.append(d['mask_ete'])
262
+ # store third dimension in image channels
263
+ images = torch.stack(images, dim=0)
264
+ masks_ete = torch.stack(masks_ete, dim=0)
265
+ _3d_data = {'image': images, 'mask_ete': masks_ete}
266
+ yield _3d_data
267
+
dataloader/sam_transforms.py ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ # All rights reserved.
3
+
4
+ # This source code is licensed under the license found in the
5
+ # LICENSE file in the root directory of this source tree.
6
+
7
+ import numpy as np
8
+ import torch
9
+ from torch.nn import functional as F
10
+ from torchvision.transforms.functional import resize, to_pil_image # type: ignore
11
+
12
+ from copy import deepcopy
13
+ from typing import Tuple
14
+
15
+
16
+ class ResizeLongestSide:
17
+ """
18
+ Resizes images to the longest side 'target_length', as well as provides
19
+ methods for resizing coordinates and boxes. Provides methods for
20
+ transforming both numpy array and batched torch tensors.
21
+ """
22
+
23
+ def __init__(self, target_length: int) -> None:
24
+ self.target_length = target_length
25
+
26
+ def apply_image(self, image: np.ndarray) -> np.ndarray:
27
+ """
28
+ Expects a numpy array with shape HxWxC in uint8 format.
29
+ """
30
+ target_size = self.get_preprocess_shape(image.shape[0], image.shape[1], self.target_length)
31
+ return np.array(resize(to_pil_image(image), target_size))
32
+
33
+ def apply_coords(self, coords: np.ndarray, original_size: Tuple[int, ...]) -> np.ndarray:
34
+ """
35
+ Expects a numpy array of length 2 in the final dimension. Requires the
36
+ original image size in (H, W) format.
37
+ """
38
+ old_h, old_w = original_size
39
+ new_h, new_w = self.get_preprocess_shape(
40
+ original_size[0], original_size[1], self.target_length
41
+ )
42
+ coords = deepcopy(coords).astype(float)
43
+ coords[..., 0] = coords[..., 0] * (new_w / old_w)
44
+ coords[..., 1] = coords[..., 1] * (new_h / old_h)
45
+ return coords
46
+
47
+ def apply_boxes(self, boxes: np.ndarray, original_size: Tuple[int, ...]) -> np.ndarray:
48
+ """
49
+ Expects a numpy array shape Bx4. Requires the original image size
50
+ in (H, W) format.
51
+ """
52
+ boxes = self.apply_coords(boxes.reshape(-1, 2, 2), original_size)
53
+ return boxes.reshape(-1, 4)
54
+
55
+ def apply_image_torch(self, image: torch.Tensor) -> torch.Tensor:
56
+ """
57
+ Expects batched images with shape BxCxHxW and float format. This
58
+ transformation may not exactly match apply_image. apply_image is
59
+ the transformation expected by the model.
60
+ """
61
+ # Expects an image in BCHW format. May not exactly match apply_image.
62
+ target_size = self.get_preprocess_shape(image.shape[2], image.shape[3], self.target_length)
63
+ return F.interpolate(
64
+ image, target_size, mode="bilinear", align_corners=False, antialias=True
65
+ )
66
+
67
+ def apply_coords_torch(
68
+ self, coords: torch.Tensor, original_size: Tuple[int, ...]
69
+ ) -> torch.Tensor:
70
+ """
71
+ Expects a torch tensor with length 2 in the last dimension. Requires the
72
+ original image size in (H, W) format.
73
+ """
74
+ old_h, old_w = original_size
75
+ new_h, new_w = self.get_preprocess_shape(
76
+ original_size[0], original_size[1], self.target_length
77
+ )
78
+ coords = deepcopy(coords).to(torch.float)
79
+ coords[..., 0] = coords[..., 0] * (new_w / old_w)
80
+ coords[..., 1] = coords[..., 1] * (new_h / old_h)
81
+ return coords
82
+
83
+ def apply_boxes_torch(
84
+ self, boxes: torch.Tensor, original_size: Tuple[int, ...]
85
+ ) -> torch.Tensor:
86
+ """
87
+ Expects a torch tensor with shape Bx4. Requires the original image
88
+ size in (H, W) format.
89
+ """
90
+ boxes = self.apply_coords_torch(boxes.reshape(-1, 2, 2), original_size)
91
+ return boxes.reshape(-1, 4)
92
+
93
+ @staticmethod
94
+ def get_preprocess_shape(oldh: int, oldw: int, long_side_length: int) -> Tuple[int, int]:
95
+ """
96
+ Compute the output size given input size and target long side length.
97
+ """
98
+ scale = long_side_length * 1.0 / max(oldh, oldw)
99
+ newh, neww = oldh * scale, oldw * scale
100
+ neww = int(neww + 0.5)
101
+ newh = int(newh + 0.5)
102
+ return (newh, neww)
dataloader/yaml_data/brain_endtoend_R50_frozen_1_fcn.yml ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ base:
2
+ is_R50: 1
3
+ is_SAMVIT: 0
4
+ dataset_name: brain
5
+ gpu_id: '3'
6
+ original_checkpoint: 'lvm-med-resnet'
7
+ best_valid_model_checkpoint: './working_dir/checkpoint/'
8
+ frozen_eval: 1
9
+ model: '1-fcn'
10
+ test_mode: 'best_valid'
11
+ valid_rate: 0.3
12
+
13
+ train:
14
+ train_batch_size: 64
15
+ valid_batch_size: 1
16
+ test_batch_size: 1
17
+ learning_rate: 0.0005
18
+ num_epochs: 20
19
+ linear_eval: 0
20
+ solver: 'adam'
21
+
22
+ dataloader:
23
+ data_path: './dataset_demo/BRAIN'
24
+
dataloader/yaml_data/brain_endtoend_R50_frozen_fcns.yml ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ base:
2
+ is_R50: 1
3
+ is_SAMVIT: 0
4
+ dataset_name: brain
5
+ gpu_id: '3'
6
+ original_checkpoint: 'lvm-med-resnet'
7
+ best_valid_model_checkpoint: './working_dir/checkpoint/'
8
+ frozen_eval: 1
9
+ model: 'fcns'
10
+ test_mode: 'best_valid'
11
+ valid_rate: 0.3
12
+
13
+ train:
14
+ train_batch_size: 64
15
+ valid_batch_size: 1
16
+ test_batch_size: 1
17
+ learning_rate: 0.0005
18
+ num_epochs: 20
19
+ linear_eval: 0
20
+ solver: 'adam'
21
+
22
+ dataloader:
23
+ data_path: './dataset_demo/BRAIN'
24
+
dataloader/yaml_data/brain_endtoend_R50_non_frozen_1_fcn.yml ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ base:
2
+ is_R50: 1
3
+ is_SAMVIT: 0
4
+ dataset_name: brain
5
+ gpu_id: '3'
6
+ original_checkpoint: 'lvm-med-resnet'
7
+ best_valid_model_checkpoint: './working_dir/checkpoint/'
8
+ frozen_eval: 0
9
+ model: '1-fcn'
10
+ test_mode: 'best_valid'
11
+ valid_rate: 0.3
12
+
13
+ train:
14
+ train_batch_size: 64
15
+ valid_batch_size: 1
16
+ test_batch_size: 1
17
+ learning_rate: 0.0005
18
+ num_epochs: 30
19
+ linear_eval: 0
20
+ solver: 'adam'
21
+
22
+ dataloader:
23
+ data_path: './dataset_demo/BRAIN'
24
+
dataloader/yaml_data/brain_endtoend_R50_non_frozen_fcns.yml ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ base:
2
+ is_R50: 1
3
+ is_SAMVIT: 0
4
+ dataset_name: brain
5
+ gpu_id: '3'
6
+ original_checkpoint: 'lvm-med-resnet'
7
+ best_valid_model_checkpoint: './working_dir/checkpoint/'
8
+ frozen_eval: 0
9
+ model: 'fcns'
10
+ test_mode: 'best_valid'
11
+ valid_rate: 0.3
12
+
13
+ train:
14
+ train_batch_size: 64
15
+ valid_batch_size: 1
16
+ test_batch_size: 1
17
+ learning_rate: 0.0005
18
+ num_epochs: 30
19
+ linear_eval: 0
20
+ solver: 'adam'
21
+
22
+ dataloader:
23
+ data_path: './dataset_demo/BRAIN'
24
+
dataloader/yaml_data/buid_endtoend_R50.yml ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ base:
2
+ is_2D: 1
3
+ is_3D: 0
4
+ is_R50: 1
5
+ is_SAMVIT: 0
6
+ dataset_name: buidnewprocess
7
+ gpu_id: '5'
8
+ original_checkpoint: 'lvm-med-resnet' # change checkpoints here
9
+ best_valid_model_checkpoint: './working_dir/checkpoint/BUID_R50'
10
+ image_shape: 256
11
+
12
+ train:
13
+ train_batch_size: 8
14
+ valid_batch_size: 1
15
+ test_batch_size: 1
16
+ optimizer: 'adam'
17
+ learning_rate: 0.0001
18
+ num_epochs: 50
19
+ beta1: 0.9
20
+ beta2: 0.999
21
+ weight_decay: 0
22
+ scheduler: 0
23
+
24
+ dataloader:
25
+ train_dir_img: './dataset_demo/BUID/train'
26
+ train_dir_mask: './dataset_demo/BUID/train_labels'
27
+ valid_dir_img: './dataset_demo/BUID/valid'
28
+ valid_dir_mask: './dataset_demo/BUID/valid_labels'
29
+ test_dir_img: './dataset_demo/BUID/test'
30
+ test_dir_mask: './dataset_demo/BUID/test_labels'
31
+ have_label: './dataset_demo/BUID/have_label.txt'
32
+ non_label: './dataset_demo/BUID/non_label.txt'
dataloader/yaml_data/buid_lvm_med_sam.yml ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ base:
2
+ is_2D: True
3
+ is_3D: False
4
+ dataset_name: buidnewprocess
5
+ random_seed: 100
6
+ gpu_id: 3
7
+ num_workers: 40
8
+ pin_memory: True
9
+ original_checkpoint: './working_dir/sam_vit_b_01ec64.pth' # Original checkpoint from segment-anything project
10
+ best_valid_model_checkpoint: 'lvm_med_sam_model_best_dice_original_buidnewprocess_seed' # I just change the path to save model here
11
+ image_shape: (3, 1024)
12
+
13
+ train:
14
+ task: sam
15
+ train_batch_size: 20
16
+ valid_batch_size: 1
17
+ test_batch_size: 1
18
+ optimizer: 'adam'
19
+ learning_rate: 1e-4
20
+ num_epochs: 20
21
+
22
+ dataloader:
23
+ train_dir_img: './dataset_demo/BUID/train'
24
+ train_dir_mask: './dataset_demo/BUID/train_labels'
25
+ valid_dir_img: './dataset_demo/BUID/valid'
26
+ valid_dir_mask: './dataset_demo/BUID/valid_labels'
27
+ test_dir_img: './dataset_demo/BUID/test'
28
+ test_dir_mask: './dataset_demo/BUID/test_labels'
dataloader/yaml_data/buid_sam.yml ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ base:
2
+ is_2D: True
3
+ is_3D: False
4
+ dataset_name: buidnewprocess
5
+ random_seed: 100
6
+ gpu_id: 3
7
+ num_workers: 40
8
+ pin_memory: True
9
+ original_checkpoint: './working_dir/sam_vit_b_01ec64.pth' # Original checkpoint from segment-anything project
10
+ best_valid_model_checkpoint: 'sam_model_best_dice_original_buidnewprocess_seed'
11
+ image_shape: (3, 1024)
12
+
13
+ train:
14
+ task: sam
15
+ train_batch_size: 20
16
+ valid_batch_size: 1
17
+ test_batch_size: 1
18
+ optimizer: 'adam'
19
+ learning_rate: 1e-4
20
+ num_epochs: 20
21
+
22
+ dataloader:
23
+ train_dir_img: './dataset_demo/BUID/train'
24
+ train_dir_mask: './dataset_demo/BUID/train_labels'
25
+ valid_dir_img: './dataset_demo/BUID/valid'
26
+ valid_dir_mask: './dataset_demo/BUID/valid_labels'
27
+ test_dir_img: './dataset_demo/BUID/test'
28
+ test_dir_mask: './dataset_demo/BUID/test_labels'
dataloader/yaml_data/fgadr_endtoend_R50_frozen_1_fcn.yml ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ base:
2
+ is_R50: 1
3
+ is_SAMVIT: 0
4
+ dataset_name: fgadr
5
+ gpu_id: '3'
6
+ original_checkpoint: 'lvm-med-resnet'
7
+ best_valid_model_checkpoint: './working_dir/checkpoint/'
8
+ frozen_eval: 1
9
+ model: '1-fcn'
10
+ test_mode: 'best_valid'
11
+ valid_rate: 0.2
12
+
13
+ train:
14
+ train_batch_size: 32
15
+ valid_batch_size: 1
16
+ test_batch_size: 1
17
+ learning_rate: 0.0005
18
+ num_epochs: 20
19
+ linear_eval: 0
20
+ solver: 'adam'
21
+
22
+ dataloader:
23
+ data_path: './dataset_demo/FGADR'
24
+
dataloader/yaml_data/fgadr_endtoend_R50_frozen_fcns.yml ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ base:
2
+ is_R50: 1
3
+ is_SAMVIT: 0
4
+ dataset_name: fgadr
5
+ gpu_id: '3'
6
+ original_checkpoint: 'lvm-med-resnet'
7
+ best_valid_model_checkpoint: './working_dir/checkpoint/'
8
+ frozen_eval: 1
9
+ model: 'fcns'
10
+ test_mode: 'best_valid'
11
+ valid_rate: 0.2
12
+
13
+ train:
14
+ train_batch_size: 32
15
+ valid_batch_size: 1
16
+ test_batch_size: 1
17
+ learning_rate: 0.0005
18
+ num_epochs: 20
19
+ linear_eval: 0
20
+ solver: 'adam'
21
+
22
+ dataloader:
23
+ data_path: './dataset_demo/FGADR'
24
+
dataloader/yaml_data/fgadr_endtoend_R50_non_frozen_1_fcn.yml ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ base:
2
+ is_R50: 1
3
+ is_SAMVIT: 0
4
+ dataset_name: fgadr
5
+ gpu_id: '3'
6
+ original_checkpoint: 'lvm-med-resnet'
7
+ best_valid_model_checkpoint: './working_dir/checkpoint/'
8
+ frozen_eval: 0
9
+ model: '1-fcn'
10
+ test_mode: 'best_valid'
11
+ valid_rate: 0.2
12
+
13
+ train:
14
+ train_batch_size: 32
15
+ valid_batch_size: 1
16
+ test_batch_size: 1
17
+ learning_rate: 0.0001
18
+ num_epochs: 30
19
+ linear_eval: 0
20
+ solver: 'adam'
21
+
22
+ dataloader:
23
+ data_path: './dataset_demo/FGADR'
24
+
dataloader/yaml_data/fgadr_endtoend_R50_non_frozen_fcns.yml ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ base:
2
+ is_R50: 1
3
+ is_SAMVIT: 0
4
+ dataset_name: fgadr
5
+ gpu_id: '3'
6
+ original_checkpoint: 'lvm-med-resnet'
7
+ best_valid_model_checkpoint: './working_dir/checkpoint/'
8
+ frozen_eval: 0
9
+ model: 'fcns'
10
+ test_mode: 'best_valid'
11
+ valid_rate: 0.2
12
+
13
+ train:
14
+ train_batch_size: 32
15
+ valid_batch_size: 1
16
+ test_batch_size: 1
17
+ learning_rate: 0.0001
18
+ num_epochs: 30
19
+ linear_eval: 0
20
+ solver: 'adam'
21
+
22
+ dataloader:
23
+ data_path: './dataset_demo/FGADR'
24
+
dataloader/yaml_data/kvasir_endtoend_R50.yml ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ base:
2
+ is_2D: 1
3
+ is_3D: 0
4
+ is_R50: 1
5
+ is_SAMVIT: 0
6
+ dataset_name: kvasir
7
+ gpu_id: '1'
8
+ original_checkpoint: 'lvm-med-resnet' # Original checkpoint from segment-anything project
9
+ best_valid_model_checkpoint: './working_dir/checkpoint/Kvasir_R50'
10
+ image_shape: 224
11
+
12
+ train:
13
+ train_batch_size: 64
14
+ valid_batch_size: 1
15
+ test_batch_size: 1
16
+ optimizer: 'adam'
17
+ learning_rate: 0.001
18
+ num_epochs: 35
19
+ beta1: 0.9
20
+ beta2: 0.999
21
+ weight_decay: 0
22
+ scheduler: 0
23
+
24
+ dataloader:
25
+ train_dir_img: './dataset_demo/Kvasir/train'
26
+ train_dir_mask: './dataset_demo/Kvasir/train_labels'
27
+ valid_dir_img: './dataset_demo/Kvasir/valid'
28
+ valid_dir_mask: './dataset_demo/Kvasir/valid_labels'
29
+ test_dir_img: './dataset_demo/Kvasir/test'
30
+ test_dir_mask: './dataset_demo/Kvasir/test_labels'
31
+ have_label: './dataset_demo/Kvasir/have_label.txt'
32
+ non_label: './dataset_demo/Kvasir/non_label.txt'
dataloader/yaml_data/kvasir_sam.yml ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ base:
2
+ is_2D: True
3
+ is_3D: False
4
+ dataset_name: kvasir
5
+ random_seed: 100
6
+ gpu_id: 3
7
+ num_workers: 40
8
+ pin_memory: True
9
+ original_checkpoint: ./working_dir/sam_vit_b_01ec64.pth' # Original checkpoint from segment-anything project
10
+ best_valid_model_checkpoint: 'sam_model_best_dice_original_kvasir_seed'
11
+ image_shape: (3, 1024)
12
+
13
+ train:
14
+ task: sam
15
+ train_batch_size: 20
16
+ valid_batch_size: 1
17
+ test_batch_size: 1
18
+ optimizer: 'adam'
19
+ learning_rate: 3e-4
20
+ num_epochs: 20
21
+
22
+ dataloader:
23
+ train_dir_img: './dataset_demo/Kvasir/train'
24
+ train_dir_mask: './dataset_demo/Kvasir/train_labels'
25
+ valid_dir_img: './dataset_demo/Kvasir/valid'
26
+ valid_dir_mask: './dataset_demo/Kvasir/valid_labels'
27
+ test_dir_img: './dataset_demo/Kvasir/test'
28
+ test_dir_mask: './dataset_demo/Kvasir/test_labels'
dataloader/yaml_data/mmwhs_ct_endtoend_R50.yml ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ base:
2
+ is_2D: 0
3
+ is_3D: 1
4
+ is_R50: 1
5
+ is_SAMVIT: 0
6
+ dataset_name: las_ct
7
+ gpu_id: '2'
8
+ original_checkpoint: 'lvm-med-resnet' # Original checkpoint from segment-anything project
9
+ best_valid_model_checkpoint: './working_dir/checkpoint/MMWHS_CT_R50'
10
+ image_shape: 224
11
+
12
+ train:
13
+ train_batch_size: 64
14
+ valid_batch_size: 1
15
+ test_batch_size: 1
16
+ optimizer: 'adam'
17
+ learning_rate: 0.001
18
+ num_epochs: 20
19
+ beta1: 0.9
20
+ beta2: 0.999
21
+ weight_decay: 0
22
+ scheduler: 1
23
+
24
+ dataloader:
25
+ train_dir_img: './dataset_demo/MMWHS_CT_Heart/train'
26
+ train_dir_mask: './dataset_demo/MMWHS_CT_Heart/train_labels'
27
+ valid_dir_img: './dataset_demo/MMWHS_CT_Heart/valid'
28
+ valid_dir_mask: './dataset_demo/MMWHS_CT_Heart/valid_labels'
29
+ test_dir_img: './dataset_demo/MMWHS_CT_Heart/test'
30
+ test_dir_mask: './dataset_demo/MMWHS_CT_Heart/test_labels'
31
+ have_label: './dataset_demo/MMWHS_CT_Heart/have_label.txt'
32
+ non_label: './dataset_demo/MMWHS_CT_Heart/non_label.txt'
dataloader/yaml_data/mmwhs_ct_sam.yml ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ base:
2
+ is_2D: False
3
+ is_3D: True
4
+ dataset_name: las_ct
5
+ random_seed: 100
6
+ gpu_id: 3
7
+ num_workers: 40
8
+ pin_memory: True
9
+ original_checkpoint: './working_dir/sam_vit_b_01ec64.pth' # Original checkpoint from segment-anything project
10
+ best_valid_model_checkpoint: 'sam_model_best_original_las_ct_seed'
11
+ image_shape: (3, 1024)
12
+
13
+ train:
14
+ task: sam
15
+ train_batch_size: 20
16
+ valid_batch_size: 1
17
+ test_batch_size: 1
18
+ optimizer: 'adam'
19
+ learning_rate: 3e-5
20
+ num_epochs: 30
21
+
22
+ dataloader:
23
+ train_dir_img: './dataset_demo/MMWHS_CT_Heart/train'
24
+ train_dir_mask: './dataset_demo/MMWHS_CT_Heart/train_labels'
25
+ valid_dir_img: './dataset_demo/MMWHS_CT_Heart/valid'
26
+ valid_dir_mask: './dataset_demo/MMWHS_CT_Heart/valid_labels'
27
+ test_dir_img: './dataset_demo/MMWHS_CT_Heart/test'
28
+ test_dir_mask: './dataset_demo/MMWHS_CT_Heart/test_labels'
dataloader/yaml_data/mmwhs_mr_endtoend_R50.yml ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ base:
2
+ is_2D: 0
3
+ is_3D: 1
4
+ is_R50: 1
5
+ is_SAMVIT: 0
6
+ dataset_name: las_mri
7
+ gpu_id: '4'
8
+ original_checkpoint: 'lvm-med-resnet' # Original checkpoint from segment-anything project
9
+ best_valid_model_checkpoint: './working_dir/checkpoint/MMWHS_MR_R50'
10
+ image_shape: 224
11
+
12
+ train:
13
+ train_batch_size: 64
14
+ valid_batch_size: 32
15
+ test_batch_size: 1
16
+ optimizer: 'adam'
17
+ learning_rate: 0.0015
18
+ num_epochs: 30
19
+ beta1: 0.9
20
+ beta2: 0.999
21
+ weight_decay: 0
22
+ scheduler: 1
23
+
24
+ dataloader:
25
+ train_dir_img: './dataset_demo/MMWHS_MR_Heart/train'
26
+ train_dir_mask: './dataset_demo/MMWHS_MR_Heart/train_labels'
27
+ valid_dir_img: './dataset_demo/MMWHS_MR_Heart/valid'
28
+ valid_dir_mask: './dataset_demo/MMWHS_MR_Heart/valid_labels'
29
+ test_dir_img: './dataset_demo/MMWHS_MR_Heart/test'
30
+ test_dir_mask: './dataset_demo/MMWHS_MR_Heart/test_labels'
31
+ have_label: './dataset_demo/MMWHS_MR_Heart/have_label.txt'
32
+ non_label: './dataset_demo/MMWHS_MR_Heart/non_label.txt'
dataloader/yaml_data/mmwhs_mri_sam.yml ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ base:
2
+ is_2D: False
3
+ is_3D: True
4
+ dataset_name: las_mri
5
+ random_seed: 100
6
+ gpu_id: 3
7
+ num_workers: 40
8
+ pin_memory: True
9
+ original_checkpoint: './working_dir/sam_vit_b_01ec64.pth' # Original checkpoint from segment-anything project
10
+ best_valid_model_checkpoint: 'sam_model_best_original_las_mri_seed'
11
+ image_shape: (3, 1024)
12
+
13
+ train:
14
+ task: sam
15
+ train_batch_size: 20
16
+ valid_batch_size: 1
17
+ test_batch_size: 1
18
+ optimizer: 'adam'
19
+ learning_rate: 5e-5
20
+ num_epochs: 30
21
+
22
+ dataloader:
23
+ train_dir_img: './dataset_demo/MMWHS_MR_Heart/train'
24
+ train_dir_mask: './dataset_demo/MMWHS_MR_Heart/train_labels'
25
+ valid_dir_img: './dataset_demo/MMWHS_MR_Heart/valid'
26
+ valid_dir_mask: './dataset_demo/MMWHS_MR_Heart/valid_labels'
27
+ test_dir_img: './dataset_demo/MMWHS_MR_Heart/test'
28
+ test_dir_mask: './dataset_demo/MMWHS_MR_Heart/test_labels'
dataset_demo/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+
datasets_split/BUID_split.py ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import torch
3
+ import shutil
4
+ import os
5
+ import matplotlib.pyplot as plt
6
+ import cv2
7
+ import json
8
+ from PIL import Image
9
+ import pickle
10
+ from skimage.transform import resize
11
+ from utils.dataset_prepare import split_data, save_fileLabel
12
+
13
+ def BUID_split():
14
+ dataset_name = "BUID"
15
+ file = "./dataset_demo/BUID"
16
+ if os.path.exists(os.path.join(file, "normal")):
17
+ shutil.rmtree(os.path.join(file, "normal"))
18
+
19
+ dir_data = "./dataset_demo/BUID/images"
20
+ dir_label = "./dataset_demo/BUID/labels"
21
+
22
+ if os.path.exists(dir_data):
23
+ shutil.rmtree(dir_data)
24
+ os.mkdir(dir_data)
25
+
26
+ if os.path.exists(dir_label):
27
+ shutil.rmtree(dir_label)
28
+ os.mkdir(dir_label)
29
+
30
+ for i in os.listdir(file):
31
+ if i == "labels" or i == "images" or "label" in i:
32
+ continue
33
+ file_label = os.path.join(file, i)
34
+ for img in os.listdir(file_label):
35
+ img_file = os.path.join(file_label, img)
36
+ if "mask" in img:
37
+ shutil.copy(img_file, os.path.join(dir_label, img))
38
+ else:
39
+ shutil.copy(img_file, os.path.join(dir_data, img))
40
+
41
+ file = os.listdir(dir_label)
42
+ label_uni = -1
43
+ check = False
44
+ b = 0
45
+ for i in os.listdir(dir_data):
46
+ for k in range(10):
47
+ if k == 0:
48
+ mask = "_mask"
49
+ else:
50
+ mask = "_mask_" + str(k)
51
+ a = i.replace(".png", mask+".png")
52
+
53
+ if a in file:
54
+ b = k
55
+ if not check:
56
+ label_uni = cv2.imread(os.path.join(dir_label, a))
57
+ check = True
58
+ else:
59
+ img = cv2.imread(os.path.join(dir_label, a))
60
+ label_uni = label_uni + img
61
+ os.remove(os.path.join(dir_label, a))
62
+ else:
63
+ check = False
64
+ break
65
+
66
+ #print(i)
67
+ cv2.imwrite(os.path.join(dir_label, i), label_uni)
68
+ label_uni = -1
69
+ check = False
70
+ b = 0
71
+
72
+ split_data(dataset_name)
73
+ save_fileLabel(dataset_name)
datasets_split/FGADR_split.py ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import torch
3
+ import shutil
4
+ import os
5
+ import matplotlib.pyplot as plt
6
+ import cv2
7
+ import json
8
+ from PIL import Image
9
+ import pickle
10
+ from skimage.transform import resize
11
+ from utils.dataset_prepare import split_data, save_fileLabel
12
+
13
+ def FGADR_split():
14
+ pkl_path = './files_split/fgadr_pkl_file.pkl' # change your path here
15
+ path = "./dataset_demo/FGADR"
16
+ f = open(pkl_path, 'rb')
17
+ a = pickle.load(f)
18
+ a_key = a.keys()
19
+ B = ["train", "test"]
20
+ C = ["Training", "Testing"]
21
+ for index, i in enumerate(B):
22
+ print(i)
23
+ print(len(a[i]))
24
+ folder_type = os.path.join(path, i)
25
+ if os.path.exists(folder_type.replace(i, C[index])):
26
+ shutil.rmtree(os.path.join(path, C[index]))
27
+ os.mkdir(os.path.join(path, C[index]))
28
+ for j in a[i]:
29
+ folder_class = os.path.join(folder_type, str(j[1]))
30
+ if not os.path.exists(folder_class.replace(i, C[index])):
31
+ os.mkdir(folder_class.replace(i, C[index]))
32
+ file = j[0].replace("/mnt/sda/haal02-data/FGADR-Seg-Set", "./dataset_demo/FGADR")
33
+ img = cv2.imread(file)
34
+ img = resize(img, (512, 512), order=0, preserve_range=True, anti_aliasing=False).astype('uint8')
35
+ #/home/caduser/Foundmed_Experiment/Classification/FGADR/Seg-set/Original_Images/0001_2.png
36
+ name_img = file.split("/")[-1]
37
+ #print(os.path.join(folder_class.replace(i, C[index])))
38
+ cv2.imwrite(os.path.join(folder_class.replace(i, C[index]), name_img), img)
datasets_split/Kvasir_split.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import torch
3
+ import shutil
4
+ import os
5
+ import matplotlib.pyplot as plt
6
+ import cv2
7
+ import json
8
+ from PIL import Image
9
+ import pickle
10
+ from skimage.transform import resize
11
+ from utils.dataset_prepare import split_data, save_fileLabel
12
+
13
+ def Kvasir_split():
14
+ dataset_name = "Kvasir"
15
+ file = "./dataset_demo/Kvasir"
16
+ if os.path.exists(os.path.join(file, "masks")):
17
+ os.rename(os.path.join(file, "masks"), os.path.join(file, "labels"))
18
+ split_data(dataset_name)
19
+ save_fileLabel(dataset_name)
datasets_split/MMWHS_CT_Heart_split.py ADDED
@@ -0,0 +1,127 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import math
2
+ import os
3
+ import random
4
+ import numpy as np
5
+ from torch.utils.data import Dataset
6
+ import nibabel
7
+ from scipy import ndimage
8
+ import glob
9
+ from skimage.io import imsave
10
+ from utils.dataset_prepare import split_data, save_fileLabel_3D
11
+
12
+ # input image is the volume
13
+ def __itensity_normalize_one_volume__(image):
14
+ # normalization following Med3D
15
+ top_per = np.percentile(image, 99.5)
16
+ bot_per = np.percentile(image, 0.5)
17
+ image[image > top_per] = top_per
18
+ image[image < bot_per] = bot_per
19
+ image = (image - np.mean(image)) / np.std(image)
20
+ image = image / 10.0
21
+ image[image < 0] = 0.0
22
+ image[image > 1] = 1.0
23
+ return image
24
+
25
+
26
+ def __training_data_process__(data, label):
27
+ # crop data according net input size
28
+ data = data.get_fdata()
29
+ label = label.get_fdata()
30
+
31
+ # normalization datas
32
+ data = __itensity_normalize_one_volume__(data)
33
+
34
+ # changing label values
35
+ label[label == 205] = 30
36
+ label[label == 420] = 60
37
+ label[label == 500] = 90
38
+ label[label == 550] = 120
39
+ label[label == 600] = 150
40
+ label[label == 820] = 180
41
+ label[label == 850] = 210
42
+
43
+ return data, label
44
+
45
+
46
+ def preprocess_vol(img_name, label_name):
47
+
48
+ assert os.path.isfile(img_name)
49
+ assert os.path.isfile(label_name)
50
+
51
+ img = nibabel.load(img_name) # We have transposed the data from WHD format to DHW
52
+ assert img is not None
53
+ mask = nibabel.load(label_name)
54
+ assert mask is not None
55
+
56
+ img_array, mask_array = __training_data_process__(img, mask)
57
+ assert img_array.shape == mask_array.shape, "img shape:{} is not equal to mask shape:{}".format(img_array.shape, mask_array.shape)
58
+
59
+ return (img_array*255).astype('uint8'), mask_array.astype('uint8')
60
+
61
+ #if __name__ == '__main__':
62
+ def MMWHS_CT_Heart_split():
63
+ dataset_name = "MMWHS_CT_Heart"
64
+ ### Training set
65
+ data_dir = './dataset_demo/MMWHS_CT_Heart/Raw/train/'
66
+ img_fold_list = os.listdir(data_dir)
67
+ dest_dir = './dataset_demo/MMWHS_CT_Heart/train/' # dir for saving train images
68
+ dest_dir_label = './dataset_demo/MMWHS_CT_Heart/train_labels/'
69
+ if not os.path.exists(dest_dir):
70
+ os.makedirs(dest_dir)
71
+ if not os.path.exists(dest_dir_label):
72
+ os.makedirs(dest_dir_label)
73
+
74
+ for vol_name in img_fold_list:
75
+ if 'label' in vol_name:
76
+ continue
77
+ mask_name = os.path.join(data_dir, vol_name).replace('image','label')
78
+ img_flair, mask = preprocess_vol(os.path.join(data_dir, vol_name), mask_name)
79
+ print(img_flair.shape, mask.shape)
80
+ # img_array.shape[2] is the length of depth dimension
81
+ for depth in range(0, img_flair.shape[2]):
82
+ imsave(os.path.join(dest_dir, vol_name.split('.')[0] + '_frame_' + str(depth).zfill(3) + '.png'), img_flair[:, :, depth], check_contrast=False)
83
+ imsave(os.path.join(dest_dir_label, vol_name.replace('image','label').split('.')[0] + '_frame_' + str(depth).zfill(3) + '.png'), mask[:, :, depth], check_contrast=False)
84
+
85
+ ### Validation set
86
+ data_dir = './dataset_demo/MMWHS_CT_Heart/Raw/valid/'
87
+ img_fold_list = os.listdir(data_dir)
88
+ dest_dir = './dataset_demo/MMWHS_CT_Heart/valid/'
89
+ dest_dir_label = './dataset_demo/MMWHS_CT_Heart/valid_labels/'
90
+ if not os.path.exists(dest_dir):
91
+ os.makedirs(dest_dir)
92
+ if not os.path.exists(dest_dir_label):
93
+ os.makedirs(dest_dir_label)
94
+
95
+ for vol_name in img_fold_list:
96
+ if 'label' in vol_name:
97
+ continue
98
+ mask_name = os.path.join(data_dir, vol_name).replace('image','label')
99
+ img_flair, mask = preprocess_vol(os.path.join(data_dir, vol_name), mask_name)
100
+ print(img_flair.shape, mask.shape)
101
+ # img_array.shape[2] is the length of depth dimension
102
+ for depth in range(0, img_flair.shape[2]):
103
+ imsave(os.path.join(dest_dir, vol_name.split('.')[0] + '_frame_' + str(depth).zfill(3) + '.png'), img_flair[:, :, depth], check_contrast=False)
104
+ imsave(os.path.join(dest_dir_label, vol_name.replace('image','label').split('.')[0] + '_frame_' + str(depth).zfill(3) + '.png'), mask[:, :, depth], check_contrast=False)
105
+
106
+ ### Testing set
107
+ data_dir = './dataset_demo/MMWHS_CT_Heart/Raw/test/'
108
+ img_fold_list = os.listdir(data_dir)
109
+ dest_dir = './dataset_demo/MMWHS_CT_Heart/test/'
110
+ dest_dir_label = './dataset_demo/MMWHS_CT_Heart/test_labels/'
111
+ if not os.path.exists(dest_dir):
112
+ os.makedirs(dest_dir)
113
+ if not os.path.exists(dest_dir_label):
114
+ os.makedirs(dest_dir_label)
115
+
116
+ for vol_name in img_fold_list:
117
+ if 'label' in vol_name:
118
+ continue
119
+ mask_name = os.path.join(data_dir, vol_name).replace('image','label')
120
+ img_flair, mask = preprocess_vol(os.path.join(data_dir, vol_name), mask_name)
121
+ print(img_flair.shape, mask.shape)
122
+ # img_array.shape[2] is the length of depth dimension
123
+ for depth in range(0, img_flair.shape[2]):
124
+ imsave(os.path.join(dest_dir, vol_name.split('.')[0] + '_frame_' + str(depth).zfill(3) + '.png'), img_flair[:, :, depth], check_contrast=False)
125
+ imsave(os.path.join(dest_dir_label, vol_name.replace('image','label').split('.')[0] + '_frame_' + str(depth).zfill(3) + '.png'), mask[:, :, depth], check_contrast=False)
126
+
127
+ save_fileLabel_3D(dataset_name)
datasets_split/MMWHS_MR_Heart_split.py ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import math
2
+ import os
3
+ import random
4
+ import numpy as np
5
+ from torch.utils.data import Dataset
6
+ import nibabel
7
+ from scipy import ndimage
8
+ import glob
9
+ from skimage.io import imsave
10
+ from utils.dataset_prepare import split_data, save_fileLabel_3D
11
+
12
+ # input image is the volume
13
+ def __itensity_normalize_one_volume__(image):
14
+ # normalization following Med3D
15
+ top_per = np.percentile(image, 99.5)
16
+ bot_per = np.percentile(image, 0.5)
17
+ image[image > top_per] = top_per
18
+ image[image < bot_per] = bot_per
19
+ image = (image - np.mean(image)) / np.std(image)
20
+ image = image / 10.0
21
+ image[image < 0] = 0.0
22
+ image[image > 1] = 1.0
23
+ return image
24
+
25
+
26
+ def __training_data_process__(data, label):
27
+ # crop data according net input size
28
+ data = data.get_fdata()
29
+ label = label.get_fdata()
30
+
31
+ # normalization datas
32
+ data = __itensity_normalize_one_volume__(data)
33
+
34
+ # changing label values
35
+ label[label == 205] = 30
36
+ label[label == 420] = 60
37
+ label[label == 500] = 90
38
+ label[label == 550] = 120
39
+ label[label == 600] = 150
40
+ label[label == 820] = 180
41
+ label[label == 850] = 210
42
+
43
+ return data, label
44
+
45
+
46
+ def preprocess_vol(img_name, label_name):
47
+
48
+ assert os.path.isfile(img_name)
49
+ assert os.path.isfile(label_name)
50
+
51
+ img = nibabel.load(img_name) # We have transposed the data from WHD format to DHW
52
+ assert img is not None
53
+ mask = nibabel.load(label_name)
54
+ assert mask is not None
55
+
56
+ img_array, mask_array = __training_data_process__(img, mask)
57
+ assert img_array.shape == mask_array.shape, "img shape:{} is not equal to mask shape:{}".format(img_array.shape, mask_array.shape)
58
+
59
+ return (img_array*255).astype('uint8'), mask_array.astype('uint8')
60
+
61
+ #if __name__ == '__main__':
62
+ def MMWHS_MR_Heart_split():
63
+ dataset_name = "MMWHS_MR_Heart"
64
+ ### Training set
65
+ data_dir = './dataset_demo/MMWHS_MR_Heart/Raw/train/'
66
+ img_fold_list = os.listdir(data_dir)
67
+ dest_dir = './dataset_demo/MMWHS_MR_Heart/train/' # dir for saving train images
68
+ dest_dir_label = './dataset_demo/MMWHS_MR_Heart/train_labels/'
69
+ if not os.path.exists(dest_dir):
70
+ os.makedirs(dest_dir)
71
+ if not os.path.exists(dest_dir_label):
72
+ os.makedirs(dest_dir_label)
73
+
74
+ for vol_name in img_fold_list:
75
+ if 'label' in vol_name:
76
+ continue
77
+ mask_name = os.path.join(data_dir, vol_name).replace('image','label')
78
+ img_flair, mask = preprocess_vol(os.path.join(data_dir, vol_name), mask_name)
79
+ print(img_flair.shape, mask.shape)
80
+ # img_array.shape[2] is the length of depth dimension
81
+ for depth in range(0, img_flair.shape[2]):
82
+ imsave(os.path.join(dest_dir, vol_name.split('.')[0] + '_frame_' + str(depth).zfill(3) + '.png'), img_flair[:, :, depth], check_contrast=False)
83
+ imsave(os.path.join(dest_dir_label, vol_name.replace('image','label').split('.')[0] + '_frame_' + str(depth).zfill(3) + '.png'), mask[:, :, depth], check_contrast=False)
84
+
85
+ ### Validation set
86
+ data_dir = './dataset_demo/MMWHS_MR_Heart/Raw/valid/'
87
+ img_fold_list = os.listdir(data_dir)
88
+ dest_dir = './dataset_demo/MMWHS_MR_Heart/valid/'
89
+ dest_dir_label = './dataset_demo/MMWHS_MR_Heart/valid_labels/'
90
+ if not os.path.exists(dest_dir):
91
+ os.makedirs(dest_dir)
92
+ if not os.path.exists(dest_dir_label):
93
+ os.makedirs(dest_dir_label)
94
+
95
+ for vol_name in img_fold_list:
96
+ if 'label' in vol_name:
97
+ continue
98
+ mask_name = os.path.join(data_dir, vol_name).replace('image','label')
99
+ img_flair, mask = preprocess_vol(os.path.join(data_dir, vol_name), mask_name)
100
+ print(img_flair.shape, mask.shape)
101
+ # img_array.shape[2] is the length of depth dimension
102
+ for depth in range(0, img_flair.shape[2]):
103
+ imsave(os.path.join(dest_dir, vol_name.split('.')[0] + '_frame_' + str(depth).zfill(3) + '.png'), img_flair[:, :, depth], check_contrast=False)
104
+ imsave(os.path.join(dest_dir_label, vol_name.replace('image','label').split('.')[0] + '_frame_' + str(depth).zfill(3) + '.png'), mask[:, :, depth], check_contrast=False)
105
+
106
+ ### Testing set
107
+ data_dir = './dataset_demo/MMWHS_MR_Heart/Raw/test/'
108
+ img_fold_list = os.listdir(data_dir)
109
+ dest_dir = './dataset_demo/MMWHS_MR_Heart/test/'
110
+ dest_dir_label = './dataset_demo/MMWHS_MR_Heart/test_labels/'
111
+ if not os.path.exists(dest_dir):
112
+ os.makedirs(dest_dir)
113
+ if not os.path.exists(dest_dir_label):
114
+ os.makedirs(dest_dir_label)
115
+
116
+ for vol_name in img_fold_list:
117
+ if 'label' in vol_name:
118
+ continue
119
+ mask_name = os.path.join(data_dir, vol_name).replace('image','label')
120
+ img_flair, mask = preprocess_vol(os.path.join(data_dir, vol_name), mask_name)
121
+ print(img_flair.shape, mask.shape)
122
+ # img_array.shape[2] is the length of depth dimension
123
+ for depth in range(0, img_flair.shape[2]):
124
+ imsave(os.path.join(dest_dir, vol_name.split('.')[0] + '_frame_' + str(depth).zfill(3) + '.png'), img_flair[:, :, depth], check_contrast=False)
125
+ imsave(os.path.join(dest_dir_label, vol_name.replace('image','label').split('.')[0] + '_frame_' + str(depth).zfill(3) + '.png'), mask[:, :, depth], check_contrast=False)
126
+
127
+
128
+ save_fileLabel_3D(dataset_name)
datasets_split/__init__.py ADDED
File without changes
evaluate.py ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import torch.nn.functional as F
3
+ from tqdm import tqdm
4
+
5
+ from utils.endtoend import multiclass_dice_coeff, multiclass_iou
6
+ num_classes = 8
7
+
8
+ def evaluate(net, dataloader, device, eval_class):
9
+ net.eval()
10
+ num_val_batches = len(dataloader)
11
+ dice_score = 0
12
+ iou_score = 0
13
+ # iterate over the validation set
14
+ for batch in tqdm(dataloader, desc='Validation round', unit='batch', leave=False):
15
+ image, mask_true = batch['image'], batch['mask_ete']
16
+ # move images and labels to correct device and type
17
+ image = image.to(device=device, dtype=torch.float32)
18
+ mask_true = mask_true.to(device=device, dtype=torch.long)
19
+ #mask_true[mask_true == 4] = 3
20
+ #mask_true[mask_true > 4] = 0
21
+ mask_true_vector = F.one_hot(mask_true, num_classes).permute(0, 3 , 1, 2).float()
22
+ with torch.no_grad():
23
+ # predict the mask
24
+ mask_pred = net(image)
25
+ mask_pred = mask_pred.argmax(dim=1)
26
+ mask_pred_vector = F.one_hot(mask_pred, num_classes).permute(0, 3 , 1, 2).float()
27
+ # compute the Dice score, ignoring background
28
+ dice_score += multiclass_dice_coeff(mask_pred_vector[:, eval_class, ...], mask_true_vector[:, eval_class, ...],
29
+ reduce_batch_first=False)
30
+ iou_score += multiclass_iou(mask_pred_vector[:,eval_class, ...], mask_true_vector[:, eval_class, ...])
31
+
32
+ net.train()
33
+ return dice_score / num_val_batches, iou_score/ num_val_batches
34
+
35
+
36
+ def evaluate_3d_iou(net, dataset, device, eval_class):
37
+ net.eval()
38
+ iou_score = 0
39
+ # iterate over the validation set
40
+ num_items = 0
41
+ for image_3d in tqdm(dataset.get_3d_iter(), desc='3D Evaluation', unit='image(s)', leave=False):
42
+ image, mask_true = image_3d['image'], image_3d['mask_ete']
43
+ num_items += 1
44
+ # move images and labels to correct device and type
45
+
46
+ image = image.to(device=device, dtype=torch.float32)
47
+ mask_true = mask_true.to(device=device, dtype=torch.long)
48
+ mask_true_vector = F.one_hot(mask_true, num_classes).permute(0, 3, 1, 2).float()
49
+
50
+ with torch.no_grad():
51
+ # predict the mask
52
+ mask_pred = net(image)
53
+ mask_pred = mask_pred.argmax(dim=1)
54
+ mask_pred_vector = F.one_hot(mask_pred, num_classes).permute(0, 3, 1, 2).float()
55
+ iou_score += multiclass_iou(mask_pred_vector[:, eval_class, ...], mask_true_vector[:, eval_class, ...], reduce_batch_first=True)
56
+ net.train()
57
+ return iou_score/num_items
58
+
59
+ def evaluate_3d_iou_large(net, dataset, device, eval_class):
60
+ net.eval()
61
+ iou_score = 0
62
+ # iterate over the validation set
63
+ num_items = 0
64
+ for image_3d in tqdm(dataset.get_3d_iter(), desc='3D Evaluation', unit='image(s)', leave=False):
65
+ image, mask_true = image_3d['image'], image_3d['mask']
66
+ num_items += 1
67
+ # move images and labels to correct device and type
68
+
69
+ image = image.to(device=device)
70
+ mask_true = mask_true.to(device=device)
71
+ mask_true_vector = F.one_hot(mask_true, num_classes).permute(0, 3, 1, 2).float()
72
+
73
+ net.to(device=device)
74
+ with torch.no_grad():
75
+ # predict the mask
76
+ mask_pred = net(image)
77
+ mask_pred = mask_pred.argmax(dim=1)
78
+ mask_pred_vector = F.one_hot(mask_pred, num_classes).permute(0, 3, 1, 2).float()
79
+ iou_score += multiclass_iou(mask_pred_vector[:, eval_class, ...], mask_true_vector[:, eval_class, ...], reduce_batch_first=True)
80
+ net.train()
81
+ return iou_score/num_items
82
+
83
+ def evaluate_3d_iou_fast(net, dataset, device, eval_class):
84
+ """
85
+ This function is similar as evaluate_3d_iou but get a batch size in shape [batch_size, dimension, W, H]
86
+ :param net:
87
+ :param dataset:
88
+ :param device:
89
+ :param eval_class:
90
+ :return:
91
+ """
92
+ net.eval()
93
+ iou_score = 0
94
+ # iterate over the validation set
95
+ num_items = 0
96
+ for image_3d in tqdm(dataset, desc='3D Evaluation', unit='image(s)', leave=False):
97
+ image, mask_true = image_3d['image'][0], image_3d['mask'][0]
98
+ # print ("Image and mask shapes in 3D evaluation are {}, {}".format(image.shape, mask_true.shape))
99
+ num_items += 1
100
+ # move images and labels to correct device and type
101
+
102
+ image = image.to(device=device, dtype=torch.float32)
103
+ mask_true = mask_true.to(device=device, dtype=torch.long)
104
+ mask_true_vector = F.one_hot(mask_true, num_classes).permute(0, 3, 1, 2).float()
105
+
106
+ with torch.no_grad():
107
+ # predict the mask
108
+ mask_pred = net(image)
109
+ mask_pred = mask_pred.argmax(dim=1)
110
+ mask_pred_vector = F.one_hot(mask_pred, num_classes).permute(0, 3, 1, 2).float()
111
+ iou_score += multiclass_iou(mask_pred_vector[:, eval_class, ...], mask_true_vector[:, eval_class, ...], reduce_batch_first=True)
112
+ net.train()
113
+ return iou_score/num_items
114
+
115
+ def evaluate_3d_dice(net, dataset, device, eval_class):
116
+ net.eval()
117
+ dice_score = 0
118
+ # iterate over the validation set
119
+ num_items = 0
120
+ for image_3d in tqdm(dataset.get_3d_iter(), desc='3D Evaluation', unit='image(s)', leave=False):
121
+ image, mask_true = image_3d['image'], image_3d['mask_ete']
122
+ num_items += 1
123
+ # move images and labels to correct device and type
124
+
125
+ image = image.to(device=device, dtype=torch.float32)
126
+ mask_true = mask_true.to(device=device, dtype=torch.long)
127
+ mask_true_vector = F.one_hot(mask_true, num_classes).permute(0, 3, 1, 2).float()
128
+
129
+ with torch.no_grad():
130
+ # predict the mask
131
+ mask_pred = net(image)
132
+ mask_pred = mask_pred.argmax(dim=1)
133
+ mask_pred_vector = F.one_hot(mask_pred, num_classes).permute(0, 3, 1, 2).float()
134
+ dice_score += multiclass_dice_coeff(mask_pred_vector[:, eval_class, ...], mask_true_vector[:, eval_class, ...], reduce_batch_first=True)
135
+ net.train()
136
+ return dice_score/num_items
files_split/BUID.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"train": ["benign (298).png", "benign (420).png", "benign (167).png", "benign (102).png", "benign (256).png", "benign (128).png", "benign (405).png", "benign (273).png", "benign (158).png", "benign (265).png", "malignant (113).png", "benign (41).png", "benign (152).png", "benign (304).png", "benign (151).png", "malignant (191).png", "benign (91).png", "benign (46).png", "benign (105).png", "malignant (170).png", "benign (396).png", "benign (261).png", "benign (412).png", "benign (284).png", "benign (71).png", "malignant (116).png", "benign (222).png", "malignant (3).png", "benign (28).png", "malignant (77).png", "benign (185).png", "benign (1).png", "benign (309).png", "benign (361).png", "benign (154).png", "malignant (86).png", "benign (172).png", "benign (372).png", "benign (225).png", "malignant (42).png", "malignant (201).png", "malignant (27).png", "benign (124).png", "malignant (104).png", "benign (43).png", "benign (98).png", "malignant (19).png", "benign (97).png", "malignant (92).png", "benign (136).png", "malignant (8).png", "malignant (74).png", "malignant (136).png", "benign (419).png", "malignant (97).png", "malignant (68).png", "malignant (51).png", "malignant (203).png", "benign (409).png", "malignant (38).png", "benign (242).png", "benign (354).png", "benign (291).png", "benign (162).png", "benign (392).png", "malignant (141).png", "malignant (40).png", "benign (79).png", "malignant (210).png", "benign (266).png", "benign (64).png", "malignant (165).png", "malignant (21).png", "benign (140).png", "benign (369).png", "benign (88).png", "benign (181).png", "malignant (174).png", "malignant (144).png", "benign (399).png", "malignant (87).png", "benign (13).png", "benign (57).png", "benign (130).png", "benign (293).png", "benign (302).png", "malignant (150).png", "benign (76).png", "malignant (186).png", "malignant (151).png", "benign (259).png", "benign (16).png", "malignant (1).png", "benign (320).png", "malignant (16).png", "malignant (70).png", "benign (104).png", "malignant (71).png", "malignant (13).png", "benign (112).png", "benign (192).png", "benign (183).png", "malignant (47).png", "malignant (125).png", "malignant (34).png", "benign (4).png", "benign (282).png", "malignant (188).png", "benign (50).png", "benign (285).png", "malignant (168).png", "benign (235).png", "benign (286).png", "benign (166).png", "malignant (115).png", "malignant (196).png", "benign (237).png", "benign (281).png", "malignant (156).png", "malignant (57).png", "benign (327).png", "benign (338).png", "benign (290).png", "benign (306).png", "malignant (95).png", "malignant (7).png", "malignant (145).png", "benign (328).png", "malignant (181).png", "benign (375).png", "benign (398).png", "benign (173).png", "benign (278).png", "benign (20).png", "benign (109).png", "malignant (157).png", "benign (288).png", "malignant (62).png", "benign (312).png", "benign (153).png", "benign (171).png", "malignant (140).png", "benign (305).png", "benign (418).png", "benign (268).png", "malignant (162).png", "malignant (41).png", "benign (344).png", "malignant (106).png", "malignant (52).png", "benign (160).png", "benign (395).png", "benign (86).png", "malignant (190).png", "benign (100).png", "benign (114).png", "benign (429).png", "benign (201).png", "malignant (6).png", "benign (23).png", "benign (211).png", "benign (299).png", "malignant (207).png", "benign (143).png", "benign (18).png", "benign (287).png", "malignant (209).png", "malignant (202).png", "benign (127).png", "benign (123).png", "benign (103).png", "malignant (14).png", "benign (422).png", "benign (255).png", "benign (49).png", "malignant (114).png", "benign (332).png", "benign (189).png", "benign (209).png", "malignant (131).png", "benign (414).png", "benign (415).png", "benign (31).png", "benign (246).png", "benign (56).png", "malignant (194).png", "benign (339).png", "benign (121).png", "malignant (46).png", "malignant (130).png", "malignant (81).png", "benign (413).png", "benign (406).png", "benign (208).png", "benign (176).png", "malignant (45).png", "benign (221).png", "benign (303).png", "benign (436).png", "benign (257).png", "benign (250).png", "malignant (103).png", "malignant (142).png", "malignant (88).png", "benign (371).png", "benign (424).png", "benign (417).png", "benign (294).png", "benign (411).png", "benign (384).png", "benign (334).png", "benign (126).png", "malignant (180).png", "malignant (25).png", "benign (81).png", "malignant (169).png", "benign (69).png", "benign (270).png", "malignant (96).png", "malignant (155).png", "benign (315).png", "benign (131).png", "benign (25).png", "benign (199).png", "benign (67).png", "malignant (84).png", "malignant (206).png", "benign (2).png", "benign (39).png", "benign (99).png", "benign (343).png", "benign (358).png", "benign (7).png", "benign (226).png", "benign (212).png", "benign (425).png", "benign (427).png", "benign (279).png", "malignant (161).png", "benign (89).png", "benign (219).png", "malignant (152).png", "benign (317).png", "benign (231).png", "benign (8).png", "malignant (138).png", "benign (17).png", "benign (170).png", "benign (32).png", "benign (297).png", "benign (117).png", "benign (416).png", "malignant (5).png", "benign (397).png", "benign (108).png", "benign (434).png", "benign (355).png", "malignant (184).png", "benign (408).png", "benign (230).png", "benign (323).png", "malignant (65).png", "benign (421).png", "benign (80).png", "benign (83).png", "benign (274).png", "benign (94).png", "benign (179).png", "malignant (54).png", "benign (352).png", "benign (391).png", "benign (65).png", "benign (296).png", "malignant (189).png", "benign (129).png", "benign (85).png", "benign (254).png", "malignant (83).png", "malignant (60).png", "benign (163).png", "malignant (35).png", "benign (161).png", "benign (340).png", "benign (262).png", "benign (356).png", "malignant (39).png", "benign (264).png", "benign (370).png", "benign (349).png", "benign (142).png", "benign (321).png", "benign (435).png", "malignant (199).png", "benign (74).png", "malignant (166).png", "malignant (59).png", "benign (14).png", "benign (203).png", "benign (324).png", "benign (55).png", "benign (186).png", "malignant (171).png", "malignant (99).png", "malignant (111).png", "malignant (107).png", "malignant (153).png", "benign (150).png", "malignant (26).png", "benign (267).png", "malignant (56).png", "malignant (73).png", "malignant (11).png", "malignant (90).png", "benign (47).png", "malignant (37).png", "malignant (101).png", "benign (386).png", "benign (301).png", "benign (336).png", "malignant (124).png", "benign (195).png", "benign (24).png", "malignant (167).png", "malignant (94).png", "malignant (204).png", "benign (59).png", "benign (138).png", "benign (190).png", "benign (144).png", "malignant (160).png", "benign (238).png", "malignant (159).png", "malignant (175).png", "malignant (67).png", "benign (70).png", "malignant (43).png", "benign (44).png", "benign (373).png", "benign (118).png", "benign (248).png", "malignant (102).png", "benign (178).png", "benign (93).png", "benign (45).png", "benign (394).png", "malignant (18).png", "malignant (55).png", "benign (271).png", "benign (229).png", "benign (58).png", "benign (300).png", "benign (423).png", "malignant (28).png", "malignant (183).png", "benign (27).png", "benign (381).png", "benign (132).png", "benign (430).png", "benign (342).png", "malignant (128).png", "malignant (164).png", "malignant (4).png", "benign (310).png", "malignant (64).png", "benign (29).png", "malignant (89).png", "benign (137).png", "benign (390).png", "benign (330).png", "benign (387).png", "malignant (72).png", "malignant (121).png", "benign (364).png", "malignant (20).png", "benign (116).png", "benign (359).png", "malignant (147).png", "benign (251).png", "benign (164).png", "benign (146).png", "benign (35).png", "benign (107).png", "malignant (137).png", "malignant (78).png", "benign (345).png", "benign (62).png", "benign (15).png", "benign (84).png", "benign (252).png", "benign (42).png", "benign (311).png", "benign (34).png", "benign (210).png", "malignant (143).png", "benign (33).png", "benign (68).png", "malignant (200).png", "benign (77).png", "malignant (33).png", "benign (245).png", "benign (96).png", "benign (110).png", "benign (407).png", "benign (234).png", "malignant (100).png", "benign (403).png", "benign (9).png", "malignant (22).png", "benign (223).png", "benign (61).png", "benign (63).png", "benign (155).png", "benign (240).png"], "valid": ["benign (205).png", "benign (115).png", "benign (382).png", "benign (214).png", "malignant (50).png", "malignant (172).png", "benign (433).png", "benign (37).png", "benign (215).png", "malignant (61).png", "benign (182).png", "benign (308).png", "malignant (176).png", "benign (125).png", "malignant (17).png", "benign (159).png", "benign (12).png", "malignant (135).png", "benign (277).png", "malignant (119).png", "benign (187).png", "malignant (192).png", "benign (53).png", "malignant (105).png", "benign (202).png", "benign (147).png", "benign (21).png", "benign (206).png", "benign (329).png", "benign (101).png", "benign (200).png", "benign (404).png", "malignant (126).png", "benign (236).png", "malignant (44).png", "benign (360).png", "benign (135).png", "malignant (98).png", "benign (184).png", "benign (307).png", "benign (60).png", "malignant (146).png", "benign (145).png", "benign (36).png", "benign (243).png", "malignant (80).png", "benign (289).png", "benign (11).png", "malignant (49).png", "benign (95).png", "benign (48).png", "benign (260).png", "malignant (69).png", "malignant (197).png", "malignant (66).png", "malignant (129).png", "benign (52).png", "malignant (29).png", "benign (353).png", "benign (139).png", "benign (314).png", "benign (224).png", "benign (428).png", "benign (175).png", "malignant (10).png", "benign (180).png", "benign (122).png", "benign (220).png", "malignant (117).png", "malignant (53).png", "benign (51).png", "malignant (63).png", "malignant (9).png", "benign (362).png", "benign (87).png", "malignant (108).png", "benign (377).png", "malignant (12).png", "benign (233).png", "malignant (149).png", "benign (383).png", "malignant (177).png", "benign (295).png", "benign (258).png", "malignant (139).png", "malignant (112).png", "benign (432).png", "benign (319).png", "malignant (173).png", "malignant (122).png", "malignant (127).png", "malignant (195).png", "benign (196).png", "benign (111).png", "malignant (123).png", "benign (40).png", "benign (241).png", "benign (325).png", "benign (204).png", "malignant (75).png", "benign (197).png", "benign (272).png", "benign (400).png", "benign (3).png"], "test": ["malignant (109).png", "benign (275).png", "benign (188).png", "benign (90).png", "benign (431).png", "malignant (2).png", "benign (141).png", "benign (263).png", "benign (75).png", "malignant (179).png", "benign (10).png", "malignant (133).png", "benign (244).png", "benign (385).png", "malignant (118).png", "malignant (163).png", "benign (388).png", "benign (376).png", "benign (276).png", "benign (156).png", "benign (26).png", "malignant (198).png", "benign (78).png", "benign (380).png", "benign (326).png", "benign (38).png", "benign (357).png", "benign (227).png", "benign (217).png", "benign (351).png", "malignant (110).png", "benign (393).png", "benign (366).png", "malignant (32).png", "malignant (148).png", "benign (347).png", "benign (368).png", "benign (113).png", "benign (149).png", "benign (216).png", "malignant (79).png", "benign (247).png", "benign (6).png", "malignant (178).png", "benign (280).png", "benign (316).png", "benign (66).png", "benign (378).png", "malignant (15).png", "benign (92).png", "benign (341).png", "benign (249).png", "benign (269).png", "benign (198).png", "malignant (23).png", "benign (333).png", "benign (374).png", "benign (22).png", "benign (318).png", "benign (30).png", "benign (133).png", "benign (213).png", "benign (120).png", "benign (19).png", "benign (218).png", "benign (191).png", "benign (350).png", "malignant (58).png", "benign (207).png", "benign (348).png", "malignant (82).png", "benign (379).png", "malignant (31).png", "benign (157).png", "benign (401).png", "malignant (24).png", "malignant (85).png", "benign (363).png", "malignant (36).png", "benign (193).png", "benign (313).png", "malignant (120).png", "benign (5).png", "benign (335).png", "benign (426).png", "benign (174).png", "benign (410).png", "benign (148).png", "benign (253).png", "benign (346).png", "benign (331).png", "malignant (30).png", "benign (194).png", "benign (134).png", "malignant (91).png", "malignant (187).png", "benign (54).png", "benign (389).png", "benign (402).png", "malignant (205).png", "benign (73).png", "malignant (154).png", "benign (232).png", "benign (169).png", "benign (437).png", "malignant (93).png", "benign (168).png", "benign (365).png", "benign (106).png", "benign (292).png", "malignant (208).png", "benign (367).png", "malignant (48).png", "malignant (158).png", "benign (82).png", "benign (239).png", "malignant (185).png", "benign (119).png", "malignant (182).png", "malignant (132).png", "benign (283).png", "benign (322).png", "malignant (193).png", "malignant (134).png", "benign (177).png", "benign (337).png", "benign (228).png", "benign (165).png", "benign (72).png", "malignant (76).png"], "train_labels": ["benign (298).png", "benign (420).png", "benign (167).png", "benign (102).png", "benign (256).png", "benign (128).png", "benign (405).png", "benign (273).png", "benign (158).png", "benign (265).png", "malignant (113).png", "benign (41).png", "benign (152).png", "benign (304).png", "benign (151).png", "malignant (191).png", "benign (91).png", "benign (46).png", "benign (105).png", "malignant (170).png", "benign (396).png", "benign (261).png", "benign (412).png", "benign (284).png", "benign (71).png", "malignant (116).png", "benign (222).png", "malignant (3).png", "benign (28).png", "malignant (77).png", "benign (185).png", "benign (1).png", "benign (309).png", "benign (361).png", "benign (154).png", "malignant (86).png", "benign (172).png", "benign (372).png", "benign (225).png", "malignant (42).png", "malignant (201).png", "malignant (27).png", "benign (124).png", "malignant (104).png", "benign (43).png", "benign (98).png", "malignant (19).png", "benign (97).png", "malignant (92).png", "benign (136).png", "malignant (8).png", "malignant (74).png", "malignant (136).png", "benign (419).png", "malignant (97).png", "malignant (68).png", "malignant (51).png", "malignant (203).png", "benign (409).png", "malignant (38).png", "benign (242).png", "benign (354).png", "benign (291).png", "benign (162).png", "benign (392).png", "malignant (141).png", "malignant (40).png", "benign (79).png", "malignant (210).png", "benign (266).png", "benign (64).png", "malignant (165).png", "malignant (21).png", "benign (140).png", "benign (369).png", "benign (88).png", "benign (181).png", "malignant (174).png", "malignant (144).png", "benign (399).png", "malignant (87).png", "benign (13).png", "benign (57).png", "benign (130).png", "benign (293).png", "benign (302).png", "malignant (150).png", "benign (76).png", "malignant (186).png", "malignant (151).png", "benign (259).png", "benign (16).png", "malignant (1).png", "benign (320).png", "malignant (16).png", "malignant (70).png", "benign (104).png", "malignant (71).png", "malignant (13).png", "benign (112).png", "benign (192).png", "benign (183).png", "malignant (47).png", "malignant (125).png", "malignant (34).png", "benign (4).png", "benign (282).png", "malignant (188).png", "benign (50).png", "benign (285).png", "malignant (168).png", "benign (235).png", "benign (286).png", "benign (166).png", "malignant (115).png", "malignant (196).png", "benign (237).png", "benign (281).png", "malignant (156).png", "malignant (57).png", "benign (327).png", "benign (338).png", "benign (290).png", "benign (306).png", "malignant (95).png", "malignant (7).png", "malignant (145).png", "benign (328).png", "malignant (181).png", "benign (375).png", "benign (398).png", "benign (173).png", "benign (278).png", "benign (20).png", "benign (109).png", "malignant (157).png", "benign (288).png", "malignant (62).png", "benign (312).png", "benign (153).png", "benign (171).png", "malignant (140).png", "benign (305).png", "benign (418).png", "benign (268).png", "malignant (162).png", "malignant (41).png", "benign (344).png", "malignant (106).png", "malignant (52).png", "benign (160).png", "benign (395).png", "benign (86).png", "malignant (190).png", "benign (100).png", "benign (114).png", "benign (429).png", "benign (201).png", "malignant (6).png", "benign (23).png", "benign (211).png", "benign (299).png", "malignant (207).png", "benign (143).png", "benign (18).png", "benign (287).png", "malignant (209).png", "malignant (202).png", "benign (127).png", "benign (123).png", "benign (103).png", "malignant (14).png", "benign (422).png", "benign (255).png", "benign (49).png", "malignant (114).png", "benign (332).png", "benign (189).png", "benign (209).png", "malignant (131).png", "benign (414).png", "benign (415).png", "benign (31).png", "benign (246).png", "benign (56).png", "malignant (194).png", "benign (339).png", "benign (121).png", "malignant (46).png", "malignant (130).png", "malignant (81).png", "benign (413).png", "benign (406).png", "benign (208).png", "benign (176).png", "malignant (45).png", "benign (221).png", "benign (303).png", "benign (436).png", "benign (257).png", "benign (250).png", "malignant (103).png", "malignant (142).png", "malignant (88).png", "benign (371).png", "benign (424).png", "benign (417).png", "benign (294).png", "benign (411).png", "benign (384).png", "benign (334).png", "benign (126).png", "malignant (180).png", "malignant (25).png", "benign (81).png", "malignant (169).png", "benign (69).png", "benign (270).png", "malignant (96).png", "malignant (155).png", "benign (315).png", "benign (131).png", "benign (25).png", "benign (199).png", "benign (67).png", "malignant (84).png", "malignant (206).png", "benign (2).png", "benign (39).png", "benign (99).png", "benign (343).png", "benign (358).png", "benign (7).png", "benign (226).png", "benign (212).png", "benign (425).png", "benign (427).png", "benign (279).png", "malignant (161).png", "benign (89).png", "benign (219).png", "malignant (152).png", "benign (317).png", "benign (231).png", "benign (8).png", "malignant (138).png", "benign (17).png", "benign (170).png", "benign (32).png", "benign (297).png", "benign (117).png", "benign (416).png", "malignant (5).png", "benign (397).png", "benign (108).png", "benign (434).png", "benign (355).png", "malignant (184).png", "benign (408).png", "benign (230).png", "benign (323).png", "malignant (65).png", "benign (421).png", "benign (80).png", "benign (83).png", "benign (274).png", "benign (94).png", "benign (179).png", "malignant (54).png", "benign (352).png", "benign (391).png", "benign (65).png", "benign (296).png", "malignant (189).png", "benign (129).png", "benign (85).png", "benign (254).png", "malignant (83).png", "malignant (60).png", "benign (163).png", "malignant (35).png", "benign (161).png", "benign (340).png", "benign (262).png", "benign (356).png", "malignant (39).png", "benign (264).png", "benign (370).png", "benign (349).png", "benign (142).png", "benign (321).png", "benign (435).png", "malignant (199).png", "benign (74).png", "malignant (166).png", "malignant (59).png", "benign (14).png", "benign (203).png", "benign (324).png", "benign (55).png", "benign (186).png", "malignant (171).png", "malignant (99).png", "malignant (111).png", "malignant (107).png", "malignant (153).png", "benign (150).png", "malignant (26).png", "benign (267).png", "malignant (56).png", "malignant (73).png", "malignant (11).png", "malignant (90).png", "benign (47).png", "malignant (37).png", "malignant (101).png", "benign (386).png", "benign (301).png", "benign (336).png", "malignant (124).png", "benign (195).png", "benign (24).png", "malignant (167).png", "malignant (94).png", "malignant (204).png", "benign (59).png", "benign (138).png", "benign (190).png", "benign (144).png", "malignant (160).png", "benign (238).png", "malignant (159).png", "malignant (175).png", "malignant (67).png", "benign (70).png", "malignant (43).png", "benign (44).png", "benign (373).png", "benign (118).png", "benign (248).png", "malignant (102).png", "benign (178).png", "benign (93).png", "benign (45).png", "benign (394).png", "malignant (18).png", "malignant (55).png", "benign (271).png", "benign (229).png", "benign (58).png", "benign (300).png", "benign (423).png", "malignant (28).png", "malignant (183).png", "benign (27).png", "benign (381).png", "benign (132).png", "benign (430).png", "benign (342).png", "malignant (128).png", "malignant (164).png", "malignant (4).png", "benign (310).png", "malignant (64).png", "benign (29).png", "malignant (89).png", "benign (137).png", "benign (390).png", "benign (330).png", "benign (387).png", "malignant (72).png", "malignant (121).png", "benign (364).png", "malignant (20).png", "benign (116).png", "benign (359).png", "malignant (147).png", "benign (251).png", "benign (164).png", "benign (146).png", "benign (35).png", "benign (107).png", "malignant (137).png", "malignant (78).png", "benign (345).png", "benign (62).png", "benign (15).png", "benign (84).png", "benign (252).png", "benign (42).png", "benign (311).png", "benign (34).png", "benign (210).png", "malignant (143).png", "benign (33).png", "benign (68).png", "malignant (200).png", "benign (77).png", "malignant (33).png", "benign (245).png", "benign (96).png", "benign (110).png", "benign (407).png", "benign (234).png", "malignant (100).png", "benign (403).png", "benign (9).png", "malignant (22).png", "benign (223).png", "benign (61).png", "benign (63).png", "benign (155).png", "benign (240).png"], "valid_labels": ["benign (205).png", "benign (115).png", "benign (382).png", "benign (214).png", "malignant (50).png", "malignant (172).png", "benign (433).png", "benign (37).png", "benign (215).png", "malignant (61).png", "benign (182).png", "benign (308).png", "malignant (176).png", "benign (125).png", "malignant (17).png", "benign (159).png", "benign (12).png", "malignant (135).png", "benign (277).png", "malignant (119).png", "benign (187).png", "malignant (192).png", "benign (53).png", "malignant (105).png", "benign (202).png", "benign (147).png", "benign (21).png", "benign (206).png", "benign (329).png", "benign (101).png", "benign (200).png", "benign (404).png", "malignant (126).png", "benign (236).png", "malignant (44).png", "benign (360).png", "benign (135).png", "malignant (98).png", "benign (184).png", "benign (307).png", "benign (60).png", "malignant (146).png", "benign (145).png", "benign (36).png", "benign (243).png", "malignant (80).png", "benign (289).png", "benign (11).png", "malignant (49).png", "benign (95).png", "benign (48).png", "benign (260).png", "malignant (69).png", "malignant (197).png", "malignant (66).png", "malignant (129).png", "benign (52).png", "malignant (29).png", "benign (353).png", "benign (139).png", "benign (314).png", "benign (224).png", "benign (428).png", "benign (175).png", "malignant (10).png", "benign (180).png", "benign (122).png", "benign (220).png", "malignant (117).png", "malignant (53).png", "benign (51).png", "malignant (63).png", "malignant (9).png", "benign (362).png", "benign (87).png", "malignant (108).png", "benign (377).png", "malignant (12).png", "benign (233).png", "malignant (149).png", "benign (383).png", "malignant (177).png", "benign (295).png", "benign (258).png", "malignant (139).png", "malignant (112).png", "benign (432).png", "benign (319).png", "malignant (173).png", "malignant (122).png", "malignant (127).png", "malignant (195).png", "benign (196).png", "benign (111).png", "malignant (123).png", "benign (40).png", "benign (241).png", "benign (325).png", "benign (204).png", "malignant (75).png", "benign (197).png", "benign (272).png", "benign (400).png", "benign (3).png"], "test_labels": ["malignant (109).png", "benign (275).png", "benign (188).png", "benign (90).png", "benign (431).png", "malignant (2).png", "benign (141).png", "benign (263).png", "benign (75).png", "malignant (179).png", "benign (10).png", "malignant (133).png", "benign (244).png", "benign (385).png", "malignant (118).png", "malignant (163).png", "benign (388).png", "benign (376).png", "benign (276).png", "benign (156).png", "benign (26).png", "malignant (198).png", "benign (78).png", "benign (380).png", "benign (326).png", "benign (38).png", "benign (357).png", "benign (227).png", "benign (217).png", "benign (351).png", "malignant (110).png", "benign (393).png", "benign (366).png", "malignant (32).png", "malignant (148).png", "benign (347).png", "benign (368).png", "benign (113).png", "benign (149).png", "benign (216).png", "malignant (79).png", "benign (247).png", "benign (6).png", "malignant (178).png", "benign (280).png", "benign (316).png", "benign (66).png", "benign (378).png", "malignant (15).png", "benign (92).png", "benign (341).png", "benign (249).png", "benign (269).png", "benign (198).png", "malignant (23).png", "benign (333).png", "benign (374).png", "benign (22).png", "benign (318).png", "benign (30).png", "benign (133).png", "benign (213).png", "benign (120).png", "benign (19).png", "benign (218).png", "benign (191).png", "benign (350).png", "malignant (58).png", "benign (207).png", "benign (348).png", "malignant (82).png", "benign (379).png", "malignant (31).png", "benign (157).png", "benign (401).png", "malignant (24).png", "malignant (85).png", "benign (363).png", "malignant (36).png", "benign (193).png", "benign (313).png", "malignant (120).png", "benign (5).png", "benign (335).png", "benign (426).png", "benign (174).png", "benign (410).png", "benign (148).png", "benign (253).png", "benign (346).png", "benign (331).png", "malignant (30).png", "benign (194).png", "benign (134).png", "malignant (91).png", "malignant (187).png", "benign (54).png", "benign (389).png", "benign (402).png", "malignant (205).png", "benign (73).png", "malignant (154).png", "benign (232).png", "benign (169).png", "benign (437).png", "malignant (93).png", "benign (168).png", "benign (365).png", "benign (106).png", "benign (292).png", "malignant (208).png", "benign (367).png", "malignant (48).png", "malignant (158).png", "benign (82).png", "benign (239).png", "malignant (185).png", "benign (119).png", "malignant (182).png", "malignant (132).png", "benign (283).png", "benign (322).png", "malignant (193).png", "malignant (134).png", "benign (177).png", "benign (337).png", "benign (228).png", "benign (165).png", "benign (72).png", "malignant (76).png"]}
files_split/Kvasir.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"train": ["cju5wphwwlu3m0987hh3ltg88.jpg", "cju8aj01yqeqm0850lhdz3xdw.jpg", "cju2lz8vqktne0993fuym6drw.jpg", "cju2rxm8rpbaf0993o3qr2oph.jpg", "cju3xga12iixg0817dijbvjxw.jpg", "cju5fb86jd1jp0755b1ukbhq5.jpg", "cju2nsmwjlzyl0993jl80chvz.jpg", "cju7fq7mm2pw508176uk5ugtx.jpg", "cju18kevfrojc0835bn90f1in.jpg", "cju2tvrvm53ws0801a0jfjdxg.jpg", "cju2qqn5ys4uo0988ewrt2ip2.jpg", "cju306x7w05nb0835cunv799x.jpg", "cju5c7oijaqmq09878qwgqv8n.jpg", "cju35oyvd3y850988km12hdz1.jpg", "cju2yljr0yzhw0988ecf271ly.jpg", "cju8c9akjsdjj0850s67uzlxq.jpg", "cju5ccpvqash50850kb4bs22k.jpg", "cju7db7lp2f400755tntd1ohf.jpg", "cju6vgdmivcvb08018fra5lnv.jpg", "cju2syxa93yw40799x2iuwabz.jpg", "cju1cvkfwqrec0993wbp1jlzm.jpg", "cju320gyvbch60801v2amdi2g.jpg", "cju7emdni2py40871ivhxjtut.jpg", "cju5f8hxdcxxn08188obby0ea.jpg", "cju2lcyfgkf5809932fn9gucn.jpg", "cju5i5oh2efg60987ez6cpf72.jpg", "cjyzkmjy8evns070165gf9dmq.jpg", "cju31y80qbawn0801twwm2l5s.jpg", "cju5bwhapakm90987c1v4z46a.jpg", "cju1hyolc7aqu0878rrkfn1lr.jpg", "cju0qx73cjw570799j4n5cjze.jpg", "cju7dbppn28nx085097654msi.jpg", "cju2i6acqvo6l0799u20fift8.jpg", "cju2raxlosl630988jdbfy9b0.jpg", "cju30xqmh0ni00835ix3batv1.jpg", "cju1alwgo30z60855fm3y23sm.jpg", "cju7fpfzq2wyf0818xxd1oziv.jpg", "cju8bk8oirjhw0817hgkua2w8.jpg", "cju34i3qvcyog0855qiejxx5w.jpg", "cju2qozsk20cq0855ugrg3cri.jpg", "cju84kplnl1y30755ropua1b0.jpg", "cju40taxlkrho0987smigg0x0.jpg", "cju18849rrsgr0988p90hkygb.jpg", "cju1cyjb5qtie0993njqne9m3.jpg", "cju33o12x2jm50988944mxq0v.jpg", "cju7cq6su27qv075574dir0r3.jpg", "cju0qoxqj9q6s0835b43399p4.jpg", "cju2igw4gvxds0878808qj398.jpg", "cju2zxja9w1eh09933609ho9z.jpg", "cju2iatlki5u309930zmgkv6h.jpg", "cju83rcnzkbsj0755x5anfrcg.jpg", "cju2xs6na81t20878pt6nkfip.jpg", "cju1fmsyf6gxb0801cimx2gle.jpg", "cju2u73dj53oz0878486k8k4b.jpg", "cju7efffp2ivf0817etg3jehl.jpg", "cju8a1jtvpt9m081712iwkca7.jpg", "cju85je7vlht70817c9jcjwi4.jpg", "cju5wcc90lu020850mjrxppv6.jpg", "cju1f320ewfyu0988ndz6blh5.jpg", "cju2zwg05a0oy0801yr73ig7g.jpg", "cju32phw2bv130801yj7bkouq.jpg", "cju32zhbnc1oy0801iyv1ix6p.jpg", "cju887ftknop008177nnjt46y.jpg", "cju32gzs6xo8x0993r8tedbpb.jpg", "cju0rx1idathl0835detmsp84.jpg", "cju2r7h21sj9608354gzks3ae.jpg", "cju5jz5fff8c50871hbe6108f.jpg", "cju35ldepdtlm0801yv79y8vu.jpg", "cju34uhepd3dd0799hs8782ad.jpg", "cju2otvvv0l7z0855x7we8cb0.jpg", "cju7ajnbo1gvm098749rdouk0.jpg", "cju1dnz61vfp40988e78bkjga.jpg", "cju846ec0kj7z08012o10klrb.jpg", "cju5eyfe9cpk90987laa7tsl3.jpg", "cju2zgbj9zmrw0835nnlzxj4c.jpg", "cju7dizi82h2i0755doucgnt3.jpg", "cju7dhpsc2dnn0818025m6857.jpg", "cju1dia8hvc6v098827mgffnm.jpg", "cju6x35ervu2808015c7eoqe4.jpg", "cju2upu4evw7g08358guwozxv.jpg", "cju77196iyshb0850ycbto50a.jpg", "cju87xn2snfmv0987sc3d9xnq.jpg", "cjyzl833ndne80838pzuq6ila.jpg", "cju8bj2ssrmlm0871gc2ug2rs.jpg", "cju7d5m0p23kn09871rk7pu3v.jpg", "cju8432cmkgq90871cxe4iptl.jpg", "cju34xspwzenf0993cyzajv9n.jpg", "cju5eftctcdbj08712gdp989f.jpg", "cju772304yw5t0818vbw8kkjf.jpg", "cju83u9ftk3ni0987qnhlcinv.jpg", "cju2tqfgw4oat0799rn0g5b2z.jpg", "cju2qfie4rvz508357kad9z5o.jpg", "cju2sszfq3uye0878sucelzk2.jpg", "cju1drnhbrb9409935wi7vkhg.jpg", "cju2i03ptvkiu0799xbbd4det.jpg", "cju2oo0wh0bqy0878biujeyhe.jpg", "cju1haab178i70799tk9z8y8x.jpg", "cju5nyu31gv8e0871zpk74a2n.jpg", "cju3v0fl3gwce0755qkjhzmd4.jpg", "cju2r2obh2bjm08553kng0rh7.jpg", "cju2srvy5440s0801y1ba9akr.jpg", "cju8bm24yrrdp081829mbo8ic.jpg", "cju8bh8surexp0987o5pzklk1.jpg", "cju2okvco06xc0799kxe5n1qh.jpg", "cju8ceacrsqkr0755hdz145es.jpg", "ck2bxpfgxu2mk0748gsh7xelu.jpg", "cju8cdeazsm8h0801jxifmzur.jpg", "cju2hw5gjlr5h0988so2qqres.jpg", "cju2suk42469908015ngmq6f2.jpg", "cju2p4ddkmzxj0993p94o62av.jpg", "cju88vx2uoocy075531lc63n3.jpg", "cju77re6fz5bb0817vp9redjg.jpg", "cju5wmvsdlx1j0871npgj8j4b.jpg", "cju787jnjzjuj0871p94nck9g.jpg", "cju5wkonqlrl409877y8zvnub.jpg", "cju1ffnjn6ctm08015perkg37.jpg", "cju2rpa30t07b0835im0erql0.jpg", "cju5ekty5ckzf07550c9u3ckk.jpg", "cju7awzmu1ncs0871hziy65zx.jpg", "cju7el6xv2k520817qxx9wdr5.jpg", "cju1gv7106qd008784gk603mg.jpg", "cju1dfeupuzlw0835gnxip369.jpg", "cju6xmqd9w0250817l5kxfnsk.jpg", "cju42py9mlqyd0818u3d1d7ga.jpg", "cju7eotqi2qea0871y8yc7tqh.jpg", "cju2ricdv2iys0878sv1adh0u.jpg", "cju7f4sc62xqj075597xpmuoy.jpg", "cju2zdhsczmn50988z64qwg2q.jpg", "cju2s9g11pnra0993gn4eh793.jpg", "cju88k75inzyb0850ccv5x3vk.jpg", "cju2saez63gxl08559ucjq3kt.jpg", "cju3yht87j83m08507yk1u1fg.jpg", "cju336l68y7if0993wf092166.jpg", "cjyztzaqtrv430848l8xgcerw.jpg", "cju8b8yair65w09878pyqtr96.jpg", "cju2z6ez69g4u0801qwt088lw.jpg", "cju1c0qb4tzi308355wtsnp0y.jpg", "cju5ht88gedbu0755xrcuddcx.jpg", "cju7d2q1k27nf08715zshsckt.jpg", "cju7epwj82koz098713apjnzo.jpg", "cju2rzpsmtb0f0835jabkbao1.jpg", "cju1d31sp4d4k0878r3fr02ul.jpg", "cju8bop5jrsid08716i24fqda.jpg", "cju2wve9v7esz0878mxsdcy04.jpg", "cju1b0y2e396p08558ois175d.jpg", "cju2top2ruxxy0988p1svx36g.jpg", "cju1erep75us208553i4ofwwe.jpg", "cju6v4szov55u0871qmqz3v8n.jpg", "cju76erapykj30871x5eaxh4q.jpg", "cju7ey10f2rvf0871bwbi9x82.jpg", "cju6v6g6kvdw007552x6mb0po.jpg", "cju85dx63lic408017f0l0400.jpg", "cju2hjrqcvi2j0801bx1i6gxg.jpg", "cju5huurrecm70801y680y13m.jpg", "cju2trbpkv0c00988hxla5dzz.jpg", "cju16ach3m1da0993r1dq3sn2.jpg", "cju6vifjlv55z0987un6y4zdo.jpg", "cju2qs32r1vys07999conmbvx.jpg", "cju32csyfblyh080170aa3x5p.jpg", "cju32fhnhbds40799broyoptc.jpg", "cju8bljw9rqk20801kr54akrl.jpg", "cju7fmvpk2q170987v6i3ola8.jpg", "cju7d6ux323ze0987xos3srkx.jpg", "cju85l4yjlops0801fvmnwptf.jpg", "cju1egh885m1l0855ci1lt37c.jpg", "cju6v5ilsv8hk0850rb5sgh6o.jpg", "cju8bzzy2s66m08016z6mouqt.jpg", "cju1djtprvd7b0988thwwrg09.jpg", "cju7aifyo1p3n07552nxjx51f.jpg", "cju2ulk385h170799rlklxob0.jpg", "cju424hy5lckr085073fva1ok.jpg", "cju5knbbqfipk080128cggukq.jpg", "cju5bf6hxa6m50817rbwettgu.jpg", "cju2tjrog4jy30878pawyazqc.jpg", "cju88rl5eo94l0850kf5wtrm1.jpg", "cju300m3s04fg0988uzupuf7z.jpg", "cju3u1c8tfyqx08503iedc3mx.jpg", "cju43mkj9m8wb0871qiadahub.jpg", "cju18ibp219ub08783i6o98g7.jpg", "cju5fydrud94708507vo6oy21.jpg", "cju8ashhnquqr0801rwduzt7d.jpg", "cju45ty6zn9oz0850qy4qnck1.jpg", "cju2y40d8ulqo0993q0adtgtb.jpg", "cju16whaj0e7n0855q7b6cjkm.jpg", "cju2wxv0hxs2f09884w48v8fi.jpg", "cju1hmff8tkp809931jps6fbr.jpg", "cju857ad0l88m0817qx4cwxnf.jpg", "cju7ekbo32pft0871fv7kzwb9.jpg", "cju8bff9nrfi10850fmfzbf8v.jpg", "cju85plp7lmkw0850rx42jdpf.jpg", "cju1ewnoh5z030855vpex9uzt.jpg", "cju5tenjojp1j0755ms4949h2.jpg", "cju2ntxtdzlvu0799xl3j9pan.jpg", "cju2zm0axztpe0988r8s9twjr.jpg", "cju3ykamdj9u208503pygyuc8.jpg", "cju15czxqp3lv0835jvhgzurz.jpg", "cju88v2f9oi8w0871hx9auh01.jpg", "cju8828oxnool0801qno9luhr.jpg", "cju2sxf3iqbpv09937iksn8ep.jpg", "cju0sr5ghl0nd08789uzf1raf.jpg", "cju43gfosm63n08714rpih8pe.jpg", "cju3ya7goj6at0818v2l5ay7f.jpg", "cju5hjxaae3i40850h5z2laf5.jpg", "cju30u1hbakn808019g15nb8b.jpg", "cju8bbznkrf5g0871jncffynk.jpg", "cju85citjlnfm0755i4rk5tqj.jpg", "cju7dqcwi2dz00850gcmr2ert.jpg", "cju87q6yoneim0871dl4phvkd.jpg", "cju35c4wzdhow0799h6eq4sgs.jpg", "cju7b1ygu1msd0801hywhy0mc.jpg", "cju8c5223s8j80850b4kealt4.jpg", "cju1bhnfitmge0835ynls0l6b.jpg", "cju5x7iskmad90818frchyfwd.jpg", "cju83vvmik9wa08710yeh7cuk.jpg", "cju87nkyrnb970801q84m47yt.jpg", "cju2oi8sq0i2y0801mektzvw8.jpg", "cju40wto5kxwi0755it190f2k.jpg", "cju5jx7jzf7c90871c2i9aiov.jpg", "cju6vucxvvlda0755j7msqnya.jpg", "cju3xtufwiv9c0818djsc4cqd.jpg", "cju84ffdzkrjn08183jh1fxmb.jpg", "cju8auylgqx0z0871u4o4db7o.jpg", "cju2nbdpmlmcj0993s1cht0dz.jpg", "cju6yywx1whbb0871ksgfgf9f.jpg", "cju5ft6mcd5q40987rhjgbrr6.jpg", "cju7dymur2od30755eg8yv2ht.jpg", "cju14g8o4xui30878gkgbrvqj.jpg", "cju83syhdk6gs0801rf1rekdl.jpg", "cju7do8c72dbo0801vxfzxdc4.jpg", "cju7alcgr1lsr0871riqk84z7.jpg", "cju330ofbc2l30801th5g3hw6.jpg", "cju3xzvnzj0hd0755xprz39nj.jpg", "cju2rga4psq9n09881z519xx0.jpg", "cju18gzrq18zw0878wbf4ftw6.jpg", "cju8apjewqrk00801k5d71gky.jpg", "cju43b8daly4408170e5ev06g.jpg", "cju3xiic0ilzp0850lusrb42j.jpg", "cju3v11mrgwwb0755u242ygye.jpg", "cju77b3wyz4160755qis4ljsb.jpg", "cju3uz4o6gr9z0850lhxyxvsj.jpg", "cju5o1vu9gz8a0818eyy92bns.jpg", "cju8ayeq7r1fb0818z1junacy.jpg", "cjyzk8qieoboa0848ogj51wwm.jpg", "cju3128yi0rpu0988o4oo5n8n.jpg", "cju1d50a94qf50855wsowacrc.jpg", "cju6x0yqbvxqt0755dhxislgb.jpg", "cju5buy2bal250818ipl6fqwv.jpg", "cju7ff97z2ow40817u2r83my5.jpg", "cju1g4nsb6ngy0799l4ezm8ab.jpg", "cju34ds2531520988qjpqt6e3.jpg", "cju6wjm81vgsc0987enk9n3pr.jpg", "cju8dic9mtppa0987swn23wbc.jpg", "cju6vta3kvazg0817qbeppjtm.jpg", "cju15wdt3zla10801odjiw7sy.jpg", "cju8aeei7q8k308173n9y4klv.jpg", "cju7aez2x1jtj0871ztezs3oi.jpg", "cju1f5x1164xv08555654c24r.jpg", "cju8chxndsre008015uisl4si.jpg", "cju5wtdu4m0im0871mix0yvc0.jpg", "cju85c2d4ln1b0755zz1z3onx.jpg", "cju7g7ba42z310987bqzbi2bq.jpg", "cju7f5ghb2r5s0801chwkxxh9.jpg", "cju16jgnyzp970878melv7r25.jpg", "cju5v8pgplg6k0755rvi2t63h.jpg", "cju1euuc65wm00799m4sjdnnn.jpg", "cju1871y11d6r0799k6cw4yze.jpg", "cju8bqxxurs6i0850mu7mtef9.jpg", "cju7ecl9i2i060987xawjp4l0.jpg", "cju7d3oc82cho0755dajlwldz.jpg", "cju326h4v1gxw08352px40p7r.jpg", "cju8bafgqrf4x0818twisk3ea.jpg", "cju84aoa3ktwn0755pfl4gfwd.jpg", "cju6xa0qmvzun0818xjukgncj.jpg", "cju85qefyln6v0850szeb9byi.jpg", "cju8c5zcbsdfz0801o5t6jag1.jpg", "cjyzul1qggwwj07216mhiv5sy.jpg", "cju40jl7skiuo0817p0smlgg8.jpg", "cju2hos57llxm08359g92p6jj.jpg", "cju7dubap2g0w0801fgl42mg9.jpg", "cju85nr8elly209872w9n5m0s.jpg", "cju42wamblrqn098798r2yyok.jpg", "cju7f0ec32txj08184asb8w5f.jpg", "cju1cdxvz48hw0801i0fjwcnk.jpg", "cju3xl264ingx0850rcf0rshj.jpg", "cju17bz250pgd0799u1hqkj5u.jpg", "cju783tmkzkqu081803g7q5vk.jpg", "cju41p90plcsx08018cnzpndc.jpg", "cju32jcdabepz0878d0cznmfe.jpg", "cju1gghyjwxt80835vx0wgxw0.jpg", "cju7arvfe1ldu0850erdmphgj.jpg", "cju1hirfi7ekp0855q0vgm9qq.jpg", "cju30525w04r10835ygp257sb.jpg", "cju5vwbr4lhqn0987a1pji0ux.jpg", "cju42qet0lsq90871e50xbnuv.jpg", "cju8aw9n1qyg10801jkjlmors.jpg", "cju7787c5yy3l080159mwqsnj.jpg", "cju15ptjtppz40988odsm9azx.jpg", "cju34ymm8d6700799uop0cw33.jpg", "cju6uy20suzbl0987rzuhz7z9.jpg", "cju310f6val1v0855xo8tc3gu.jpg", "cju7atnm31if40817pqclnjer.jpg", "cju88aq6vo1ij0755c2ey7z7n.jpg", "cju8dn0c3u2v50801k8rvq02f.jpg", "cju8doa16u5gh0818w1ywda3q.jpg", "cju77t0razbvm080106o56289.jpg", "cju84hibuktj80871u519o71q.jpg", "cju7f900s2o0k08175gl1giid.jpg", "cju422cm8lfxn0818ojicxejb.jpg", "cju8567gdlcbq0801dwwyo2jt.jpg", "cju2lyynuymli0855g7fxgbhe.jpg", "cju3x5u2tiihx0818914gzxy1.jpg", "cju5vcmrqla7i0817x4sp4pqw.jpg", "cju0s2a9ekvms080138tjjpxr.jpg", "cju43kj2pm34f0850l28ahpni.jpg", "cju41lojblbs307555jdci937.jpg", "cju88trl3ogi208716qvti51b.jpg", "cju2ro5jqsy680988pi6qsujw.jpg", "cju8c5mxls96t0850wvkvsity.jpg", "cju890guyoiti098753yg6cdu.jpg", "cju5yimthmlv80850zhoc90c2.jpg", "cju1egx9pvz2n0988eoy8jp23.jpg", "cju7d4jk723eu0817bqz2n39m.jpg", "cju2qh5le1ock0878oahaql7d.jpg", "cju8b3ka8r64u0801fh18hk7l.jpg", "cju5yhgznmkzb0801cji2vi8j.jpg", "cju2nqapmzvk20801f9us40dx.jpg", "cju8djdqztu6408506pzhlo18.jpg", "cju418rckl3ur08012psrx1r1.jpg", "cju2hqt33lmra0988fr5ijv8j.jpg", "cju6vvxsev9y30987kespucdg.jpg", "cju84jdl9kv0i0871eog9b3i9.jpg", "cjz14qsk2wci60794un9ozwmw.jpg", "cju7afqon1ip40850ue2308b6.jpg", "cju8a84g0q76m0818hwiggkod.jpg", "cju2rz4k434s70855wwx3ddtx.jpg", "cju1c8ffau5770835g0g343o8.jpg", "cju41s6nbleqy0755e2mslg0b.jpg", "cju31t8xd17bk0835rnb893jk.jpg", "cju8cbsyssiqj0871gr4jedjp.jpg", "cju5klveuff6w0871wbibgh3m.jpg", "cju2sggy13na70855tbeoqgha.jpg", "cju8dm2cau2km0818jsv9eeq2.jpg", "cju7dtb1e2j0t0818deq51ib3.jpg", "cju2xyd9vyi7m098831qcucse.jpg", "cju2r11x7sdgx0988o8ule0wl.jpg", "cju85omszllp30850b6rm9mi3.jpg", "cju2nfnvxzdkd0878399axlco.jpg", "cju5bhv81abur0850ean02atv.jpg", "cju77j66ez52p08019xygi0co.jpg", "cju33yemn2qb20988wfjxximx.jpg", "cju3518w2d838079939fqztbc.jpg", "cju2t62nq45jl0799odpufwx6.jpg", "cju7fen322ou10817ziqkob4k.jpg", "cju5wqonpm0e60801z88ewmy1.jpg", "cju42romflni20817etb9a0fl.jpg", "cju3381d8bz3h07991xtl7ra0.jpg", "cju33qpdvc9g0087825jhf3s9.jpg", "cju8alhigqn2h0801zksudldd.jpg", "cju8418jhkf7d0818ga2v0xq0.jpg", "cju7fcgbe2z3p07550vaflqdb.jpg", "cju428k5fldt108177s6g6f45.jpg", "cju7fnfv02tt90801djnix9m8.jpg", "cju1cj3f0qi5n0993ut8f49rj.jpg", "cju1dq3x1vgx109889c7wyirg.jpg", "cju784jpdzeae0987q5ypq883.jpg", "cju1ats0y372e08011yazcsxm.jpg", "cju7deifq2fzn0755lc8idyh8.jpg", "cju1c6yfz42md08550zgoz3pw.jpg", "cju2zdvjn9h7r08553cp4eed5.jpg", "cju32upim1z7u0988l883nqp6.jpg", "cju0s690hkp960855tjuaqvv0.jpg", "cju7dglf226g50987ohbthl19.jpg", "cju1ejj7dvqfa0835ra184v5m.jpg", "cju83k8fyjsxr0817d6nxs6r4.jpg", "cju35a77vdj4n08556jj2lgmc.jpg", "cju45v0pungu40871acnwtmu5.jpg", "cju1hs0za7jha0855vj0mdrjt.jpg", "cju5woy82m07m08505dmjg7g1.jpg", "cju34repocy5208780gswillm.jpg", "cju5tgbzhjllu08174ca41eus.jpg", "cju5hqz50e7o90850e0prlpa0.jpg", "cju0t4oil7vzk099370nun5h9.jpg", "cju30qbm1ad3x0855znuhpz9u.jpg", "cju1b3zgj3d8e0801kpolea6c.jpg", "cju17r8il13910799dr2wme2e.jpg", "cju2rnkt22xep0801as160g9t.jpg", "cju88gx09o2vk0818610zody3.jpg", "cju0u2g7pmnux0801vkk47ivj.jpg", "cju5nxkujgscq0817l9gss626.jpg", "cju2hfqnmhisa0993gpleeldd.jpg", "cju5uhrdwkmsu0817ervv91l8.jpg", "cju6vrs1ov8cr098788h8gs6j.jpg", "cju353d1eda8c07992afde611.jpg", "cju6w733bveoz0817e600tw72.jpg", "cju2nyc5f02m40801ojqbtiea.jpg", "cju45rj7ln8980850a7821fov.jpg", "cju2xf8e5y2wm08359vcgk09b.jpg", "cju5yeqiwmkgl0801fzv2douc.jpg", "cju35740hzm0g0993zl5ic246.jpg", "cju13fwthn9mq0835gacxgy01.jpg", "cju76l27oyrw907551ri2a7fl.jpg", "cju7cp6dw244p0818gncdol4m.jpg", "cju8c6hnxsdvr0801wn0vrsa6.jpg", "cju43c92lm5cj0755lorsorfg.jpg", "cju45n0oxn5vu08500yfrt9jn.jpg", "cju30ywtc0oar0835bp2en7ec.jpg", "cju5waeduln160817w0agirve.jpg", "cju5clr68b48r0755cmuvponm.jpg", "cju2zpw4q9vzr0801p0lysjdl.jpg", "cju1b75x63ddl0799sdp0i2j3.jpg", "cju87tyddnnad0755bj0wxahe.jpg", "cju5ymyd8mmdc0801ry3by1xr.jpg", "cju8ando2qqdo0818ck7i1be1.jpg", "cju3tsh4lfsok0987w6x3a0v1.jpg", "cju2z2x3nvd3c099350zgty7w.jpg", "cju3uhb79gcgr0871orbrbi3x.jpg", "cju2omjpeqj5a0988pjdlb8l1.jpg", "cju15mhjczc8z0801kit5c6di.jpg", "cju2ycp1u8g2r0799jslnp7cz.jpg", "cju888fr7nveu0818r9uwtiit.jpg", "cju426tomlhll0818fc0i7nvh.jpg", "cju5ukkg6kv7u08011x2b6zl5.jpg", "ck2bxiswtxuw80838qkisqjwz.jpg", "cju5bj926aiec07559rshy4wa.jpg", "cju2zo0fwzv580988qlijd2xa.jpg", "cju1ddr6p4k5z08780uuuzit2.jpg", "cju85a8h8llwm07559wxg4t5w.jpg", "cju2htabevq9108015qjei0x7.jpg", "cju14hjh2ob2o0835ouz3r5aa.jpg", "cju88y1mwoln50871emyfny1g.jpg", "cju3xeexgii1j0817zs68tb4g.jpg", "cju6xlygpw7bs0818n691jsq4.jpg", "cju7aklv31h4309871m29l4e7.jpg", "cju6z2616wqbk07555bvnuyr1.jpg", "cju1c4fcu40hl07992b8gj0c8.jpg", "cju34eqjpcpm508788b3lhp97.jpg", "cju8b5p40r2c60987ofa0mu03.jpg", "cju77q10sz9ug0801449wu1nu.jpg", "cju6uzxk0v83p0801rcwnexdu.jpg", "cju7csvlb22fr0850lvm45n3x.jpg", "cju1cbokpuiw70988j4lq1fpi.jpg", "cju8b2rmgr52s0801p54eyflx.jpg", "cju357rxxdaz30878y2esjpjt.jpg", "cju34m7h536wq0988xz7gx79v.jpg", "cju3yb47cj1xq0817zfotbni4.jpg", "cju2u4pymvc720988wsxrmi84.jpg", "cju41nz76lcxu0755cya2qefx.jpg", "cju3xhpvvimda0987ygrpzni2.jpg", "cju8b4ja9r2s808509d45ma86.jpg", "cju88nroho44508500129f1nh.jpg", "cju1g20bdwq6u0835e16xugcd.jpg", "cju43in5fm22c08175rxziqrk.jpg", "cju8cgi2kspp308011nxdtjp6.jpg", "cju16b6ynq8e40988m8vx0xnj.jpg", "cju2qu37qobl50993aw7ghcfq.jpg", "cju2spdagu1l50835da1f46fr.jpg", "cju3v664kh0px0818y4y7wolf.jpg", "cju30lncba3ny0878jwnous8n.jpg", "cju1amqw6p8pw0993d9gc5crl.jpg", "cju2lejzcy4pc0878c9rlonot.jpg", "cju2qdj95ru8g09886gfi9rsz.jpg", "cju5eq8c8ck690850vix98hv3.jpg", "cju1fyb1d69et0878muzdak9u.jpg", "cju2wtwj87kys0855kx6mddzw.jpg", "cju88itqbny720987hxizbj5y.jpg", "cju3v3ac9gyz30755hfqwyp1i.jpg", "cju5vzjoslpj708186z2fusmz.jpg", "cju2ij9uiic2l09933ljiv6gm.jpg", "cju2uwz9f5yf1085506cfamfx.jpg", "cju2lberzkdzm09938cl40pog.jpg", "cju7cufm7298k0755j09uf3of.jpg", "cju7b9vcs1luz0987ta60j1dy.jpg", "cju40poe4kt9s0755f9cnm3h5.jpg", "cju7ap09p1kz10850ldccjebj.jpg", "cju5ew4h9cqaf0818rrczkmqh.jpg", "cju88fpm4o0tl0871w1i6a4ds.jpg", "cju7bgnvb1sf808717qa799ir.jpg", "cju2m71z2ywwv080131bcrsd3.jpg", "cju41r6v2lcww0871ps8k8pf5.jpg", "cju30ajhw09sx0988qyahx9s8.jpg", "cju87zv8lni0o0850hbbecbq6.jpg", "cju5yjq1pmlgc0801z0t24bly.jpg", "cjyzuio1qgh040763k56deohv.jpg", "cjyzufihqquiw0a46jatrbwln.jpg", "cju2zrojo9kcd0878ld2epejq.jpg", "cju5vxuc5loxw0818u8xgf45p.jpg", "cju2rlqdnoz9k0993cpjae3x0.jpg", "cju8402x1kcy70801t6kz6bdi.jpg", "cju1h89h6xbnx08352k2790o9.jpg", "cju8at3s1qqqx0850hcq8nmnq.jpg", "cju886ryxnsl50801r93jai7q.jpg", "ck2bxqz3evvg20794iiyv5v2m.jpg", "cju35k2fr3vc50988c85qkrwg.jpg", "cju8c1a0ws7o208181c6lbsom.jpg", "cju7dda8w2br20818zhsuz8s7.jpg", "cju1ftaji6isw0855108yqcse.jpg", "cju8c3xs7sauj0801ieyzezr5.jpg", "cju33za6l2qy70988jhrlp2ev.jpg", "cju30ov1oah920801mi8thuyg.jpg", "cju7ez7r22qbc08015xfoz2wb.jpg", "cju5o4pk9h0720755lgp9jq8m.jpg", "cju410dnfl0960755y8lu8d79.jpg", "cju334jzo261t0835yqudnfs1.jpg", "cju2yi9tz8vky0801yqip0xyl.jpg", "cju45qbf3n9sa0987oonbkly9.jpg", "cju6ut4l8va6y0755tyw3vfqq.jpg", "cju6ur9l9v9jq0755paud9uka.jpg", "cju89z6pqpqfx0817mfv8ixjc.jpg", "cju7b10ce1mnm08011c5bwyr4.jpg", "cju175facms5f0993a5tjikvt.jpg", "cju2txjfzv60w098839dcimys.jpg", "cju1csmlc4ht10799b8ymmghg.jpg", "cju3tp94kfstl08181awh6z49.jpg", "cju2p91qir00k08350ddfif0w.jpg", "cju5hyi9yegob0755ho3do8en.jpg", "cju43h43am1dy08176gwfhmnt.jpg", "cju88msmoo3470817m441j4sg.jpg", "cju13hp5rnbjx0835bf0jowgx.jpg", "cju83ipu3jwpx0801z5pvguf8.jpg", "cju33w4sdcivk0855x879zht7.jpg", "cju2tzypl4wss0799ow05oxb9.jpg", "cju6wll7wvo3y08502pagos8m.jpg", "cju7bc95p1mdm0817yqj5jc6j.jpg", "cju30j1rgadut0801vuyrsnt8.jpg", "cju35mdz73x890835eynq1h9v.jpg", "cju43lcnum9y10755bjs7z87f.jpg", "cju7etr3y2p4t0801cdzjj8ab.jpg", "cju774fmayxif0818u2g79usw.jpg", "cju1cu1u2474n0878tt7v4tdr.jpg", "cju323ypb1fbb0988gx5rzudb.jpg", "cju33x0f22peh0988g0ln7w5v.jpg", "cju2y5zas8m7f0801d34g5owq.jpg", "cju5ddda9bkkt0850enzwatb1.jpg", "cju5ufn3skquf0818dhapnhba.jpg", "cju84gpefknwm098714oq8q61.jpg", "cju2trtjf4qjd0878a2zle9v9.jpg", "cju7fazv92ywx0755xov2erga.jpg", "cju2rn0hasxri0835nfy3buay.jpg", "cju3x4blzieu30850x10uuvbm.jpg", "cju3y9difj6th0801kd1rqm3w.jpg", "cju2osuru0ki00855txo0n3uu.jpg", "cjyzlw7f9faqr070129au64sq.jpg", "cju3u39fog1bo0871lxjrabks.jpg", "cju2yo1j1v0qz09934o0e683p.jpg", "cju33231uy4gi0993qc7b1jch.jpg", "cju2xlcqxy9c60988vjacdznb.jpg", "cju77vvcwzcm50850lzoykuva.jpg", "cju8dpa89u6l80818dj6lldh9.jpg", "cju3xwpgviwlx0871rwm15q7v.jpg", "cju1h5w4wxajx0835mc954kxy.jpg", "cju303j5r062k098835zxfds5.jpg", "cju35fxqyzt5p0993vusm54qz.jpg", "cju31w6goazci0799n014ly1q.jpg", "cju3u815rg4ek0850vvhtcvcm.jpg", "cju8bpctzrqkr0850zeldv9kt.jpg", "cju5f26ebcuai0818xlwh6116.jpg", "cju5g163vd6mt0817uccuga6u.jpg", "cju2zjcvj9qma0801dk71hhi0.jpg", "cju2mfjndoz700988b9lc3zeq.jpg", "cju5uxjnol2r509871qv2yeia.jpg", "cju7dwe282dc309876rco45ts.jpg", "cju5wuhm1lwm40987vugqn3vv.jpg", "cju77u1sjz77b0817ft44r3fk.jpg", "cju2yv4imv6cz099314jveiib.jpg", "cju16d65tzw9d0799ouslsw25.jpg", "cju8b6rp0r5st0850184f79xt.jpg", "cju3umoh1geet0817cmpef5am.jpg", "cju5y7buemcw80987p0r30g9f.jpg", "cju32srle1xfq083575i3fl75.jpg", "cju0roawvklrq0799vmjorwfv.jpg", "cju7b5afm1nfw0801xqm8bf8q.jpg", "cju1fb9236a110801yvg0fwju.jpg", "cju2z45kuzf6d0988nz2c819m.jpg", "cju45lbgznahl08180xz1h7u6.jpg", "cju2tpfa5uyx408359datxqqj.jpg", "cju3v72v5h1qz0818fggilwtq.jpg", "cju2yb31a8e8u0878wdashg7o.jpg", "cju6x97w4vwua0850x0997r0a.jpg", "cju42u5bjlvi10801dc13sskp.jpg", "cju77bvg0yv4r0987yh60xmjo.jpg", "cju5wrapcm2290818jsh26ppb.jpg", "cju17v6ih0u7808783zcbg1jy.jpg", "cju8d2q30tfhs0801n7lx77xl.jpg", "cju2nd7l7z98o0799gfjvyfmw.jpg", "cju5uzmaol56l0817flxh4w9p.jpg", "cju17otoe119u0799nqcbl8n1.jpg", "cju2s16zp317h0799gr67jqc2.jpg", "cju0u82z3cuma0835wlxrnrjv.jpg", "cju2zy1e49pqk0878t6ncqn12.jpg", "cju1f15k3w4ct0835cmde6ypo.jpg", "cju8bgdmqrksy0801tozdmraa.jpg", "cju3521y5d5mq0878t3ezsu4p.jpg", "cju40sdwukv3k0755y99ug1k8.jpg", "cju2pjb9v0ywn0878j5g5n69j.jpg", "cju2i3hzclw3o0988rrgh911i.jpg", "cju6yxyt0wh080871sqpepu47.jpg", "cju5x28nzm7t907558ocq4bt7.jpg", "cju1hp9i2xu8e0988u2dazk7m.jpg", "cju160wshltz10993i1gmqxbe.jpg", "cju34aozyyy830993bn16u32n.jpg", "cju7dxffn2eam0817qxosfwch.jpg", "cju8dqkrqu83i0818ev74qpxq.jpg", "cju8bysfgrzkl081786jwac09.jpg", "cju5gucasds9d0801019axylx.jpg", "cju5vi4nxlc530817uoqm2m7a.jpg", "cju5wj0faly5008187n6530af.jpg", "cju30mm25a53s0799qa5wiqe8.jpg", "cju5ca9hcatkc0801jzwe7tfx.jpg", "cju7bd1qu1mx409877xjxibox.jpg", "cju2yg5ht8i4p087800js8hp4.jpg", "cju5y4hgqmk0i08180rjhbwvp.jpg", "cju1euant5l960878iqj5vvto.jpg", "cju1dg44i4z3w0801nyz4p6zf.jpg", "cju2uy8ox62jo0801g88hh42z.jpg", "cju2t16vuucaq0835xcpsivn2.jpg", "cju5u4pywk81x0817vn9pe14z.jpg", "cju8ca4geseia0850i2ru11hw.jpg", "cju83wwn1k55e0850kw6i2d81.jpg", "cju45ofd9ne1j0801ri8dup7t.jpg", "cju2uzabhs6er0993x3aaf87p.jpg", "cju8a56vxpy780850r45yu4wk.jpg", "cju45pm27n80u08174kyow1gj.jpg", "cju3u4lxmg59o0755rz42b9en.jpg", "cju1gkndf6yi10801o1qnje19.jpg", "cju30gxjq0djk0988jytm49rs.jpg", "cju45jpvfn6c809873pv1i34s.jpg", "cju7adqyj1jcx08712r1ro5gx.jpg", "cju7dmlgf2ebw0871ieqas5fh.jpg", "cju8d4jgatgpj0871q2ophhkm.jpg", "cju2wx0gh7fpz0878wwyd9ep8.jpg", "cju2x7vw87mu30878hye2ca0m.jpg", "cju1hhj6mxfp90835n3wofrap.jpg", "cju30ftgja7170855xl9bkdm0.jpg", "cju43eigtm6ev0801mv0m96t1.jpg", "cju1fjsb4sipq09931lvd8e41.jpg", "cju77g99iyxc00817zqi2ppor.jpg", "cju34zivp3fq80988opxbaqyn.jpg", "cju2t9tdwuk700835kv0ljmtl.jpg", "cju5wi6bqlxy90755bu227nvb.jpg", "cju2rmd2rsw9g09888hh1efu0.jpg"], "valid": ["cju5vgawslbe30987ndeepc1b.jpg", "ck2bxlujamu330725szlc2jdu.jpg", "cju2hx006vidl0799igm81vmh.jpg", "cju7aqkue1i2k09879uzcpt8r.jpg", "cju5uget8krjy0818kvywd0zu.jpg", "cju8dk7eztzup08182yxko5zh.jpg", "cju1c3218411b08014g9f6gig.jpg", "cju7f6cqy2ur20818t1saazbm.jpg", "cju6wi3akvn8r0801px8eligc.jpg", "cju5enq1tcn1i0755hnkon787.jpg", "cju2hewssldzx0835ep795xu0.jpg", "ck2bxskgxxzfv08386xkqtqdy.jpg", "cju2np2k9zi3v079992ypxqkn.jpg", "cju5bycdkalkb09875f7bfrvx.jpg", "cju2hlm19vjjf0801o69qnber.jpg", "cju7amjna1ly40871ugiokehb.jpg", "cju34c1xfyz920993itxkkfad.jpg", "cju88oh0po9gq0801nge4tgr1.jpg", "cju5i39mreass0817au8p22zy.jpg", "cju5f0dezct4q08183ydw11dx.jpg", "cju5cky5xb0ay0801oxet697t.jpg", "cju7ehljc2or70871261br8ai.jpg", "cju183od81ff608017ekzif89.jpg", "cju7evxt12m730987rxivne3x.jpg", "cju8cj10qsrau0871o2dr6ai1.jpg", "cju2y26c588bo07993ksd8eoz.jpg", "cju2zkpdl9h7t0799ix60teqg.jpg", "cju85bf1algsq0871y9gtlq97.jpg", "cju40w3hbkwpn08015rbs3wko.jpg", "cju17hw9hr9c5098800fu4u8e.jpg", "cju6wuojavt740818b5qcv3iw.jpg", "cju2qvuj1s9ok0835tp2k4ozh.jpg", "cju33jon3ygbj0993pu22a4k6.jpg", "cju7dsrtb2f8i085064kwugfk.jpg", "cju77k828z46w0871r0avuoo9.jpg", "cju1aqqv02qwz0878a5cyhr67.jpg", "cju412uwlkva50850d1ps1ww7.jpg", "cju2nguelpmlj0835rojdn097.jpg", "cju35eg0tdmjt085525sb4bua.jpg", "cju7dn24o296i09871qfxb8s2.jpg", "cju2ma647l0nj0993ot4deq2q.jpg", "cju1expq45zst0855rjqwwj4m.jpg", "cju88t4fvokxf07558ymyh281.jpg", "cju83nwu1jxte0987h1krpfmv.jpg", "cju1fj6axwfp30835ukhuzhw9.jpg", "cju8b0jr0r2oi0801jiquetd5.jpg", "cju7bmi1v1pnj0987pa52jjok.jpg", "ck2da7fwcjfis07218r1rvm95.jpg", "cju2zblxw9848087853csbrx1.jpg", "cju5udcufki0s09874ll1dbr5.jpg", "cju2rqo702wpx0855fn7d5cxh.jpg", "cju88l66no10s0850rsda7ej1.jpg", "cju83yddek68q0850d2x7zfkm.jpg", "cju6z1bzbwfq50817b2alatvr.jpg", "cju5hi52odyf90817prvcwg45.jpg", "cju324q101fhe08350wae9cif.jpg", "cju5cetivauok0987ok3e5bre.jpg", "cju5u6wf0kh1t0755bg1ssixv.jpg", "cju8clorgsuwn08714toqb7v6.jpg", "cju5b9oyda4yr0850g9viziyv.jpg", "cju2qtee81yd708787bsjr75d.jpg", "cju3tvffffx5f0818t5ov22al.jpg", "cju1d96gsv62d09881b3wecw2.jpg", "cju5yclrymlgj0818k426ud6z.jpg", "cju2i8br1vqtd08784u6vmcjk.jpg", "cju7dvl5m2n4t0755hlnnjjet.jpg", "cju5hl8nee8a40755fm8qjj0o.jpg", "cju7d8m3b2e210755l8fj1yph.jpg", "cju1f79yhsb5w0993txub59ol.jpg", "cju7frtqu2xa20818wq8r9fzf.jpg", "cju35atpxdjot0855q46aqrd0.jpg", "cju3y0pjrj1c30755nxekxccj.jpg", "cju2ti1du4idn0878giuozonw.jpg", "cju2yyhsp933j0855hp32e012.jpg", "cju2r6mt2om21099352pny5gw.jpg", "cju3ttznuftyf09875t11850w.jpg", "cju42xpi8lw4w0871ve317a1p.jpg", "cju5u8gz4kj5b07552e2wpkwp.jpg", "cju7ezs7g2mxm098787atbran.jpg", "cju17g6ykn1cs0993dww6qdi8.jpg", "cju8arof2qpf20850ifr1bnqj.jpg", "cju3xuj20ivgp0818mij8bjrd.jpg", "cju34sh43d8zm08019xbwhc0o.jpg", "cju2zp89k9q1g0855k1x0f1xa.jpg", "cju7agj961l2r0818z29iq8yn.jpg", "cju3ua8u0g9rg0801uayhdxhu.jpg", "cju2hdr06v2bq0799mbm3bks1.jpg", "cju2qz06823a40878ojcz9ccx.jpg", "cju8azmhcr66e0755t61atz72.jpg", "cju87ox0kncom0801b98hqnd2.jpg", "cju1fuoa4wmc50835qfd11sp9.jpg", "cju88cddensj00987788yotmg.jpg", "cju7azuu31mia0801pf9ib5ed.jpg", "cju5k3j3uf6de0817hszzfr7n.jpg", "cju5x00l6m5j608503k78ptee.jpg", "cju430pm2lz0y0755jkhcc3d1.jpg", "cju0vtox5ain6099360pu62rp.jpg", "cju7dp3dw2k4n0755zhe003ad.jpg", "cju885ikhnmkn09878s2lqtuh.jpg", "cju2zr3c3vwb00993jn06bbaz.jpg", "cju8bw697rwg308177tg8huas.jpg", "cju1efbr0rqxz09931z0lf4vf.jpg", "cju7d7aut2a2p0818z4uxc6cd.jpg", "cju2sevf53lkx08558h5bpaig.jpg", "cju15l5ubz9yh0855b3ivdpse.jpg", "cju2nnqrqzp580855z8mhzgd6.jpg", "cju2mh8t6p07008350e01tx2a.jpg", "cju30nyxe0gfb0835p256yoju.jpg", "cju85rkbnlo1c08503uxcpax1.jpg", "cju3280wv1ir009882jze27tc.jpg", "cju7b2l561oas0871decgslaf.jpg", "cju2m56cryvqd0801gtn2yp8t.jpg", "cju5boicjagt20871b1fotkh4.jpg", "ck2bxknhjvs1x0794iogrq49k.jpg", "cju7crgxa28550755wbsgqkel.jpg", "cju1brhsj3rls0855a1vgdlen.jpg", "cju8b542nr81x0871uxnkm9ih.jpg", "cju87li0zn3yb0817kbwgjiz8.jpg", "cju1f8w0t65en0799m9oacq0q.jpg", "cju8a3nhbpwnb0850d37fo2na.jpg", "cju1bm8063nmh07996rsjjemq.jpg", "cju2z1nxlzaj40835wj81s1iy.jpg", "cju83qd0yjyht0817ktkfl268.jpg", "cju414lf2l1lt0801rl3hjllj.jpg", "cju2yw4s7z7p20988lmf2gdgd.jpg", "cju5fs6j6d8350801vglraq4u.jpg", "cju7er4kc2opa0801anuxc0eb.jpg", "cju5bdwa3aatx0818b79i18zf.jpg", "cjyzurzvohqnr0794es1itzek.jpg", "ck2bxw18mmz1k0725litqq2mc.jpg", "cju41z76wlgbz0801qdetlvby.jpg", "cju84ih17kp5l09876bkooocl.jpg", "cju5vbo6jldrt0871jf6f1700.jpg", "cju7es23b2vcp0755gpbm9s7v.jpg", "cju6ywm40wdbo0987pbftsvtg.jpg", "cju32l161bi1v07990vm376in.jpg", "cju5fi0yxd3ei0801v7u0yudn.jpg", "cju884985nlmx0817vzpax3y4.jpg", "cju32qr9tbvsj08013pkpjenq.jpg", "cju7flevb2wii08188otgs9p2.jpg", "cju16fpvhzypl0799p9phnlx6.jpg", "cju1dhfok4mhe0878jlgrag0h.jpg", "cju5xq3tdm9fn0987pbedxdg5.jpg", "cju7bb3ss1uoo0755pmhyco7t.jpg", "cju6us80mv1b50871ebyq2wxa.jpg", "cju2p0eveqtdc0835gpi3p93i.jpg", "cju7apr0c1qqm0755s7msqot4.jpg", "cju34o6dbd2lo0855aqlcy1hs.jpg", "cju2xd75m82720801q4s4ik3n.jpg", "cju7ebe962hr409872ovibahw.jpg", "cju1fr4etsmrr09933u4t4aql.jpg", "cju0ue769mxii08019zqgdbxn.jpg", "cju7cl8zm1xcu0817ado0jpas.jpg", "cju5ktjwofed70817eg58ef7u.jpg", "cju843yjskhq30818qre4rwm2.jpg", "cju8cwy02t9eq08185qn12c02.jpg", "cju892fesoq2g0801n0e0jyia.jpg", "cju3ul8dogf1z09872y2ecowp.jpg", "cju85fc11ljr40818edpb0inh.jpg", "cju8c2rqzs5t80850d0zky5dy.jpg"], "test": ["cju8abobpqbir08189u01huru.jpg", "cju8axq24r4an0755yhv9d4ly.jpg", "cju5cu8qkb84x08186jwo8yin.jpg", "cju30k2z40ds308353kdew70n.jpg", "cju6vqarjv7yo0987q4b1btk1.jpg", "cju1819curo000988pd5xcqme.jpg", "cju7d9seq29zd0871nzl2uu5m.jpg", "cju31ugmfb3dz0855xtqshki6.jpg", "cju858eswlepn0871pzvdrhj1.jpg", "cju5fw37edaae0801vkwvocn7.jpg", "cju83kxitjv340987z09m0ezy.jpg", "cjyzkpsbjdsjq07211dfi4sru.jpg", "cju2z9vlp9j0w0801oag91sy9.jpg", "cju0tl3uz8blh0993wxvn7ly3.jpg", "cju33eqwbcch208012jikwdky.jpg", "cju8bssulrrcy0987h1vq5060.jpg", "cju2qxxko229x08786gvxxhur.jpg", "cju6wn57mvooj0850rp78hhy7.jpg", "cju7ejm2l2ncl0801wq6y84nw.jpg", "cju7b3f5h1sm40755i572jden.jpg", "cju2pmhtr17a00855cvpelzb0.jpg", "cju2u2b9o4zvp08788qb9nqxj.jpg", "cju85ia1slh220987y7c20sm2.jpg", "cju439oazm2fu0871ma0vvrft.jpg", "cju5hwonqedw10801vsd3w6kk.jpg", "cju1gi7jlwyld0835cdf6g6qz.jpg", "cjyzjzssvd8pq0838f4nolj5l.jpg", "cju17x0j4nfc10993y31pvlgs.jpg", "cju1fm3id6gl50801r3fok20c.jpg", "cju30bmab08bi0835mvlr6e0r.jpg", "cju41kd7yl4nm0850gil5qqwh.jpg", "cju2s2527pfyr0993l3h1149a.jpg", "cju2urqpwvxw70835rvndvtsi.jpg", "cju7et17a2vjk0755e743npl1.jpg", "cju7fob3x301u0755x985pmmq.jpg", "cju17z0qongpa0993de4boim4.jpg", "cju2phaksnahz0993yxogjcpv.jpg", "cju8b1v3br45u087189kku66u.jpg", "cju8aqq8uqmoq0987hphto9gg.jpg", "cju33mirdc8mj0799k33wzoes.jpg", "cju2y0z6g87p10878fpk5d3rq.jpg", "cju6vvb8svhed0801jjcquh5e.jpg", "cju2t3ibkuecr0835o7si16zv.jpg", "cju8914beokbf0850isxpocrk.jpg", "cju8chdlqsu620755azjty1tj.jpg", "cju43o6n7m9nk087191ijwqq9.jpg", "cju7bf1lp1shi081835vs84lc.jpg", "cju2ysg748ru80878sp6j0gm0.jpg", "cju88z8bson4h0871nnd7fdxo.jpg", "cju8brv16rx7f0818uf5n89pv.jpg", "cju7da88w2eod0755wejzynvt.jpg", "cju7eueum2oqn0850rodmx8zo.jpg", "cju773hsyyosz0817pk1e7sjq.jpg", "cju358pwtdby20878cg7nm0np.jpg", "cju2oq5570avm079959o20op1.jpg", "cju3y54kwj3nr0801biidlb4e.jpg", "cju5bmhdcafs909878qfzrqzi.jpg", "cju83h9ysjwe808716nt35oah.jpg", "cju5chrxxawka0871qcj171yz.jpg", "cju8czvnztbf40871b4m7t78w.jpg", "cju3xvoo2iqlc0817eku2r3wl.jpg", "cju7f9umg2olj0987fj5y285w.jpg", "cju87vqa0ndwg0850onjdz7ol.jpg", "cju2ouil2mssu0993hvxsed6d.jpg", "cju2zi4l09f5807991s8do2b2.jpg", "cju5k503sfa5f0871lx0rpu5y.jpg", "cju87z6o6nh73085045bzsx6o.jpg", "cju5xopi0md7q0871r1sjc1av.jpg", "cju40r6jrksyk0871wg98zgho.jpg", "cju5xneamme2p0801qdf7fdwv.jpg", "cju3xjqtpikx50817tppy6g84.jpg", "cju8bn7m2rmm70817hgxpb1uq.jpg", "cju42nm68lpyo0818xvvqmupq.jpg", "cju88q6h6obpd0871ckmiabbo.jpg", "cju3wstckialg0871xs0vevsj.jpg", "cju2y8s56ymqr083541ggdsml.jpg", "cju5ygh1zmmdi0755uod5e17i.jpg", "cju7bfx651qr80801cs7epotb.jpg", "cju7d7tly27h408016fyp5nr7.jpg", "cju77idwfz36d0871tzfzz51i.jpg", "cju7ddtz729960801uazp1knc.jpg", "cju30ia8da2bq0799klnehml2.jpg", "cju3y79ofj3va0871uqfb1mzo.jpg", "cju7cue9b232j0801qdzk1ykj.jpg", "cju5vutu7ll8w0871dfp92n9p.jpg", "cju2xa3i4y0160988i679zsqd.jpg", "cju6x4t13vyw60755gtcf9ndu.jpg", "cju7fd6yt2p740987wkr8exo1.jpg", "cju2xbk0080y80801eghyddi2.jpg", "cju32a52lb9rc0799xi40qs00.jpg", "cju42tauqlo5p08171l3cuo4b.jpg", "cju7ae7bq1f820987toc8si1d.jpg", "cju5y84q3mdv50817eyp82xf3.jpg", "cju893jmdompz0817xn3g1w4h.jpg", "cju2uokeg5jm20799xwgsyz89.jpg", "cju42dwedlmk60871jbgu4ehi.jpg", "cju35i2e63uxr0835h7zgkg9k.jpg", "cju6z9a9kwsl007552s49rx6i.jpg", "cju15jr8jz8sb0855ukmkswkz.jpg", "cjyzu9th0qt4r0a46pyl4zik0.jpg", "cju89y9h0puti0818i5yw29e6.jpg", "cju7bduyq1rjf08719giru9ho.jpg", "cju2xwm1s84l50799i60mq0pu.jpg", "cju7dlk532dsh0871zvr6qz0r.jpg", "cju85mpuglq8k0818d2it6hzb.jpg", "cju5xkwzxmf0z0818gk4xabdm.jpg", "cju8cattbsivm0818p446wgel.jpg", "cju2pag1f0s4r0878h52uq83s.jpg", "cju5x15djm7ae0755h8czf6nt.jpg", "cju5c5xc7algd0817pb1ej5yo.jpg", "cju32pzh9bpw10855q4vaxfhe.jpg", "cju6v3bb2v7xo085090blubyw.jpg", "cju83mki1jv5w0817kubxm31r.jpg", "cju5bbtwsa8cl0987wgfsqpao.jpg", "cju14pxbaoksp0835qzorx6g6.jpg", "cju785htizjzo08017tvlhtg4.jpg", "cju42m60jlpcm08186kqppzqv.jpg", "cju847pxykriq0755268ktrk2.jpg", "cju3x9lttikfb0818a0g104zn.jpg", "cju1cnnziug1l0835yh4ropyg.jpg", "cju76lsehyia10987u54vn8rb.jpg", "cju7fbndk2sl608015ravktum.jpg", "cju5cjh3xattc0817j2vbulzi.jpg", "cju3uwz6ogsp10801h2r3bj5l.jpg", "cju34ouumcznz07996gg1xq7v.jpg", "cju3x2s11ibzi0817kk284k0j.jpg", "cju34fojcctcf0799ebolbvkn.jpg", "cju3v56bwgy8v0871w14pz8fx.jpg", "cju87r56lnkyp0755hz30leew.jpg", "cju2r91dg2k090801bh0xzbxk.jpg", "cju7ev2b12owa08500bpfpwyw.jpg", "cju76o55nymqd0871h31sph9w.jpg", "ck2395w2mb4vu07480otsu6tw.jpg", "cju2pkwt3r8b90988v2ywq1px.jpg", "cju33belnbyhm0878yxl42233.jpg", "cju7ahtkb1jr90801jck4kbds.jpg", "cju8adb60qbiu080188mxpf8d.jpg", "cju5wrrs0m2af0818vmnajbtw.jpg", "cju2wzu8wxtgu09880ku9x1pg.jpg", "cju3y21quj0ir0818kgjagr15.jpg", "cju87mrypnb1e0818scv1mxxg.jpg", "cju0sxqiclckk08551ycbwhno.jpg", "cju5h57xedz5h0755mjpc8694.jpg", "cju1cfhyg48bb0799cl5pr2jh.jpg", "cju8c82iosagu0817l74s4m5g.jpg", "cju30df2j09dd08351ayx2t6w.jpg", "cju2rkjfwoxys0993x768l1j2.jpg", "cjyzu3reghjya0794w7pwoi50.jpg", "cju7druhp2gp308715i6km7be.jpg", "cju5w7xn0lrkq0801f9k0htgx.jpg", "cju40u30gkuzc0871rq7t666d.jpg", "cju6v1m1xv07w09870ah3njy1.jpg", "cju849c23kgnk0817cgv2hw1e.jpg", "cju5k7r0yf98c09878csbxb4d.jpg", "cju8a2itsq4dv0755ntlovpxe.jpg", "cju6z7e4bwgdd0987ogkzq9kt.jpg", "cju7avvi51iox0817ym55y6tt.jpg", "cju0qkwl35piu0993l0dewei2.jpg", "cju85hguellg50818kwu3s8d1.jpg", "cju302fqq9spc0878rrygyzzz.jpg", "cju8amfdtqi4x09871tygrgqe.jpg", "cju6z600qwh4z081700qimgl9.jpg", "cju7ea4om2l910801bohqjccy.jpg", "cju45t5ddnbio0987qtqzx762.jpg", "cju84dsvaklpx098750hp83x4.jpg", "cju1cqc7n4gpy0855jt246k68.jpg", "cju5thdbrjp1108715xdfx356.jpg", "cju87kbcen2av0987usezo8kn.jpg", "cju8b7aqtr4a00987coba14b7.jpg", "cju5xjn5mm78b09871spyqhhr.jpg", "cju3x7xsaijq80818f0psavav.jpg", "cju5fu081d8gc0818l3yylujk.jpg", "cju171py4qiha0835u8sl59ds.jpg", "cju2qn2fzs1vy0988l243cvzy.jpg", "cju7d1tvt25bu08019dvw3uff.jpg", "cju2ueb6j5ado0878vf5md13o.jpg", "cju13cgqmnhwn0988yrainhcp.jpg", "cju3tx1qyg0c907552fglumhc.jpg", "cju31rb7vb6110801p9rhacuw.jpg", "cju77afzlz3kp07550x5nafzs.jpg", "cju2hugv9vget0799hhk7ksvg.jpg", "cju88evxanv9r08176zkeovec.jpg", "cju6xifswvwbo0987nibtdr50.jpg", "cju43jcqim2cp08172dvjvyui.jpg", "cju5es375cnzy0801nkq35ffs.jpg", "cju7dff9529h208503w60lbil.jpg", "cju2hgsptlfam0835o3b59h1o.jpg", "cju8buos5rz9b08715lfr0f4f.jpg", "cju7ctvqn25dy08186g442m1r.jpg", "cju7dz5yy2i7z0801ausi7rna.jpg", "cju7b4mtw1n9n080186209f3d.jpg", "cju42g865lorv07552ytz6xxa.jpg", "cju5von04litr08718j8po40a.jpg", "cju7eea9b2m0z0801ynqv1fqu.jpg", "cju8bi8q7rlmn0871abc5ch8k.jpg", "cju5kre09fhka0850h7b1898j.jpg", "cju40m0rjkpw80871z6n6yg1u.jpg", "cju6wt9jvvn500871hjn3t3g0.jpg", "cju2xjz2ju8pe0993ysv9wg17.jpg", "cju2t2ivz43i10878zeg8r1br.jpg"], "train_labels": ["cju5wphwwlu3m0987hh3ltg88.jpg", "cju8aj01yqeqm0850lhdz3xdw.jpg", "cju2lz8vqktne0993fuym6drw.jpg", "cju2rxm8rpbaf0993o3qr2oph.jpg", "cju3xga12iixg0817dijbvjxw.jpg", "cju5fb86jd1jp0755b1ukbhq5.jpg", "cju2nsmwjlzyl0993jl80chvz.jpg", "cju7fq7mm2pw508176uk5ugtx.jpg", "cju18kevfrojc0835bn90f1in.jpg", "cju2tvrvm53ws0801a0jfjdxg.jpg", "cju2qqn5ys4uo0988ewrt2ip2.jpg", "cju306x7w05nb0835cunv799x.jpg", "cju5c7oijaqmq09878qwgqv8n.jpg", "cju35oyvd3y850988km12hdz1.jpg", "cju2yljr0yzhw0988ecf271ly.jpg", "cju8c9akjsdjj0850s67uzlxq.jpg", "cju5ccpvqash50850kb4bs22k.jpg", "cju7db7lp2f400755tntd1ohf.jpg", "cju6vgdmivcvb08018fra5lnv.jpg", "cju2syxa93yw40799x2iuwabz.jpg", "cju1cvkfwqrec0993wbp1jlzm.jpg", "cju320gyvbch60801v2amdi2g.jpg", "cju7emdni2py40871ivhxjtut.jpg", "cju5f8hxdcxxn08188obby0ea.jpg", "cju2lcyfgkf5809932fn9gucn.jpg", "cju5i5oh2efg60987ez6cpf72.jpg", "cjyzkmjy8evns070165gf9dmq.jpg", "cju31y80qbawn0801twwm2l5s.jpg", "cju5bwhapakm90987c1v4z46a.jpg", "cju1hyolc7aqu0878rrkfn1lr.jpg", "cju0qx73cjw570799j4n5cjze.jpg", "cju7dbppn28nx085097654msi.jpg", "cju2i6acqvo6l0799u20fift8.jpg", "cju2raxlosl630988jdbfy9b0.jpg", "cju30xqmh0ni00835ix3batv1.jpg", "cju1alwgo30z60855fm3y23sm.jpg", "cju7fpfzq2wyf0818xxd1oziv.jpg", "cju8bk8oirjhw0817hgkua2w8.jpg", "cju34i3qvcyog0855qiejxx5w.jpg", "cju2qozsk20cq0855ugrg3cri.jpg", "cju84kplnl1y30755ropua1b0.jpg", "cju40taxlkrho0987smigg0x0.jpg", "cju18849rrsgr0988p90hkygb.jpg", "cju1cyjb5qtie0993njqne9m3.jpg", "cju33o12x2jm50988944mxq0v.jpg", "cju7cq6su27qv075574dir0r3.jpg", "cju0qoxqj9q6s0835b43399p4.jpg", "cju2igw4gvxds0878808qj398.jpg", "cju2zxja9w1eh09933609ho9z.jpg", "cju2iatlki5u309930zmgkv6h.jpg", "cju83rcnzkbsj0755x5anfrcg.jpg", "cju2xs6na81t20878pt6nkfip.jpg", "cju1fmsyf6gxb0801cimx2gle.jpg", "cju2u73dj53oz0878486k8k4b.jpg", "cju7efffp2ivf0817etg3jehl.jpg", "cju8a1jtvpt9m081712iwkca7.jpg", "cju85je7vlht70817c9jcjwi4.jpg", "cju5wcc90lu020850mjrxppv6.jpg", "cju1f320ewfyu0988ndz6blh5.jpg", "cju2zwg05a0oy0801yr73ig7g.jpg", "cju32phw2bv130801yj7bkouq.jpg", "cju32zhbnc1oy0801iyv1ix6p.jpg", "cju887ftknop008177nnjt46y.jpg", "cju32gzs6xo8x0993r8tedbpb.jpg", "cju0rx1idathl0835detmsp84.jpg", "cju2r7h21sj9608354gzks3ae.jpg", "cju5jz5fff8c50871hbe6108f.jpg", "cju35ldepdtlm0801yv79y8vu.jpg", "cju34uhepd3dd0799hs8782ad.jpg", "cju2otvvv0l7z0855x7we8cb0.jpg", "cju7ajnbo1gvm098749rdouk0.jpg", "cju1dnz61vfp40988e78bkjga.jpg", "cju846ec0kj7z08012o10klrb.jpg", "cju5eyfe9cpk90987laa7tsl3.jpg", "cju2zgbj9zmrw0835nnlzxj4c.jpg", "cju7dizi82h2i0755doucgnt3.jpg", "cju7dhpsc2dnn0818025m6857.jpg", "cju1dia8hvc6v098827mgffnm.jpg", "cju6x35ervu2808015c7eoqe4.jpg", "cju2upu4evw7g08358guwozxv.jpg", "cju77196iyshb0850ycbto50a.jpg", "cju87xn2snfmv0987sc3d9xnq.jpg", "cjyzl833ndne80838pzuq6ila.jpg", "cju8bj2ssrmlm0871gc2ug2rs.jpg", "cju7d5m0p23kn09871rk7pu3v.jpg", "cju8432cmkgq90871cxe4iptl.jpg", "cju34xspwzenf0993cyzajv9n.jpg", "cju5eftctcdbj08712gdp989f.jpg", "cju772304yw5t0818vbw8kkjf.jpg", "cju83u9ftk3ni0987qnhlcinv.jpg", "cju2tqfgw4oat0799rn0g5b2z.jpg", "cju2qfie4rvz508357kad9z5o.jpg", "cju2sszfq3uye0878sucelzk2.jpg", "cju1drnhbrb9409935wi7vkhg.jpg", "cju2i03ptvkiu0799xbbd4det.jpg", "cju2oo0wh0bqy0878biujeyhe.jpg", "cju1haab178i70799tk9z8y8x.jpg", "cju5nyu31gv8e0871zpk74a2n.jpg", "cju3v0fl3gwce0755qkjhzmd4.jpg", "cju2r2obh2bjm08553kng0rh7.jpg", "cju2srvy5440s0801y1ba9akr.jpg", "cju8bm24yrrdp081829mbo8ic.jpg", "cju8bh8surexp0987o5pzklk1.jpg", "cju2okvco06xc0799kxe5n1qh.jpg", "cju8ceacrsqkr0755hdz145es.jpg", "ck2bxpfgxu2mk0748gsh7xelu.jpg", "cju8cdeazsm8h0801jxifmzur.jpg", "cju2hw5gjlr5h0988so2qqres.jpg", "cju2suk42469908015ngmq6f2.jpg", "cju2p4ddkmzxj0993p94o62av.jpg", "cju88vx2uoocy075531lc63n3.jpg", "cju77re6fz5bb0817vp9redjg.jpg", "cju5wmvsdlx1j0871npgj8j4b.jpg", "cju787jnjzjuj0871p94nck9g.jpg", "cju5wkonqlrl409877y8zvnub.jpg", "cju1ffnjn6ctm08015perkg37.jpg", "cju2rpa30t07b0835im0erql0.jpg", "cju5ekty5ckzf07550c9u3ckk.jpg", "cju7awzmu1ncs0871hziy65zx.jpg", "cju7el6xv2k520817qxx9wdr5.jpg", "cju1gv7106qd008784gk603mg.jpg", "cju1dfeupuzlw0835gnxip369.jpg", "cju6xmqd9w0250817l5kxfnsk.jpg", "cju42py9mlqyd0818u3d1d7ga.jpg", "cju7eotqi2qea0871y8yc7tqh.jpg", "cju2ricdv2iys0878sv1adh0u.jpg", "cju7f4sc62xqj075597xpmuoy.jpg", "cju2zdhsczmn50988z64qwg2q.jpg", "cju2s9g11pnra0993gn4eh793.jpg", "cju88k75inzyb0850ccv5x3vk.jpg", "cju2saez63gxl08559ucjq3kt.jpg", "cju3yht87j83m08507yk1u1fg.jpg", "cju336l68y7if0993wf092166.jpg", "cjyztzaqtrv430848l8xgcerw.jpg", "cju8b8yair65w09878pyqtr96.jpg", "cju2z6ez69g4u0801qwt088lw.jpg", "cju1c0qb4tzi308355wtsnp0y.jpg", "cju5ht88gedbu0755xrcuddcx.jpg", "cju7d2q1k27nf08715zshsckt.jpg", "cju7epwj82koz098713apjnzo.jpg", "cju2rzpsmtb0f0835jabkbao1.jpg", "cju1d31sp4d4k0878r3fr02ul.jpg", "cju8bop5jrsid08716i24fqda.jpg", "cju2wve9v7esz0878mxsdcy04.jpg", "cju1b0y2e396p08558ois175d.jpg", "cju2top2ruxxy0988p1svx36g.jpg", "cju1erep75us208553i4ofwwe.jpg", "cju6v4szov55u0871qmqz3v8n.jpg", "cju76erapykj30871x5eaxh4q.jpg", "cju7ey10f2rvf0871bwbi9x82.jpg", "cju6v6g6kvdw007552x6mb0po.jpg", "cju85dx63lic408017f0l0400.jpg", "cju2hjrqcvi2j0801bx1i6gxg.jpg", "cju5huurrecm70801y680y13m.jpg", "cju2trbpkv0c00988hxla5dzz.jpg", "cju16ach3m1da0993r1dq3sn2.jpg", "cju6vifjlv55z0987un6y4zdo.jpg", "cju2qs32r1vys07999conmbvx.jpg", "cju32csyfblyh080170aa3x5p.jpg", "cju32fhnhbds40799broyoptc.jpg", "cju8bljw9rqk20801kr54akrl.jpg", "cju7fmvpk2q170987v6i3ola8.jpg", "cju7d6ux323ze0987xos3srkx.jpg", "cju85l4yjlops0801fvmnwptf.jpg", "cju1egh885m1l0855ci1lt37c.jpg", "cju6v5ilsv8hk0850rb5sgh6o.jpg", "cju8bzzy2s66m08016z6mouqt.jpg", "cju1djtprvd7b0988thwwrg09.jpg", "cju7aifyo1p3n07552nxjx51f.jpg", "cju2ulk385h170799rlklxob0.jpg", "cju424hy5lckr085073fva1ok.jpg", "cju5knbbqfipk080128cggukq.jpg", "cju5bf6hxa6m50817rbwettgu.jpg", "cju2tjrog4jy30878pawyazqc.jpg", "cju88rl5eo94l0850kf5wtrm1.jpg", "cju300m3s04fg0988uzupuf7z.jpg", "cju3u1c8tfyqx08503iedc3mx.jpg", "cju43mkj9m8wb0871qiadahub.jpg", "cju18ibp219ub08783i6o98g7.jpg", "cju5fydrud94708507vo6oy21.jpg", "cju8ashhnquqr0801rwduzt7d.jpg", "cju45ty6zn9oz0850qy4qnck1.jpg", "cju2y40d8ulqo0993q0adtgtb.jpg", "cju16whaj0e7n0855q7b6cjkm.jpg", "cju2wxv0hxs2f09884w48v8fi.jpg", "cju1hmff8tkp809931jps6fbr.jpg", "cju857ad0l88m0817qx4cwxnf.jpg", "cju7ekbo32pft0871fv7kzwb9.jpg", "cju8bff9nrfi10850fmfzbf8v.jpg", "cju85plp7lmkw0850rx42jdpf.jpg", "cju1ewnoh5z030855vpex9uzt.jpg", "cju5tenjojp1j0755ms4949h2.jpg", "cju2ntxtdzlvu0799xl3j9pan.jpg", "cju2zm0axztpe0988r8s9twjr.jpg", "cju3ykamdj9u208503pygyuc8.jpg", "cju15czxqp3lv0835jvhgzurz.jpg", "cju88v2f9oi8w0871hx9auh01.jpg", "cju8828oxnool0801qno9luhr.jpg", "cju2sxf3iqbpv09937iksn8ep.jpg", "cju0sr5ghl0nd08789uzf1raf.jpg", "cju43gfosm63n08714rpih8pe.jpg", "cju3ya7goj6at0818v2l5ay7f.jpg", "cju5hjxaae3i40850h5z2laf5.jpg", "cju30u1hbakn808019g15nb8b.jpg", "cju8bbznkrf5g0871jncffynk.jpg", "cju85citjlnfm0755i4rk5tqj.jpg", "cju7dqcwi2dz00850gcmr2ert.jpg", "cju87q6yoneim0871dl4phvkd.jpg", "cju35c4wzdhow0799h6eq4sgs.jpg", "cju7b1ygu1msd0801hywhy0mc.jpg", "cju8c5223s8j80850b4kealt4.jpg", "cju1bhnfitmge0835ynls0l6b.jpg", "cju5x7iskmad90818frchyfwd.jpg", "cju83vvmik9wa08710yeh7cuk.jpg", "cju87nkyrnb970801q84m47yt.jpg", "cju2oi8sq0i2y0801mektzvw8.jpg", "cju40wto5kxwi0755it190f2k.jpg", "cju5jx7jzf7c90871c2i9aiov.jpg", "cju6vucxvvlda0755j7msqnya.jpg", "cju3xtufwiv9c0818djsc4cqd.jpg", "cju84ffdzkrjn08183jh1fxmb.jpg", "cju8auylgqx0z0871u4o4db7o.jpg", "cju2nbdpmlmcj0993s1cht0dz.jpg", "cju6yywx1whbb0871ksgfgf9f.jpg", "cju5ft6mcd5q40987rhjgbrr6.jpg", "cju7dymur2od30755eg8yv2ht.jpg", "cju14g8o4xui30878gkgbrvqj.jpg", "cju83syhdk6gs0801rf1rekdl.jpg", "cju7do8c72dbo0801vxfzxdc4.jpg", "cju7alcgr1lsr0871riqk84z7.jpg", "cju330ofbc2l30801th5g3hw6.jpg", "cju3xzvnzj0hd0755xprz39nj.jpg", "cju2rga4psq9n09881z519xx0.jpg", "cju18gzrq18zw0878wbf4ftw6.jpg", "cju8apjewqrk00801k5d71gky.jpg", "cju43b8daly4408170e5ev06g.jpg", "cju3xiic0ilzp0850lusrb42j.jpg", "cju3v11mrgwwb0755u242ygye.jpg", "cju77b3wyz4160755qis4ljsb.jpg", "cju3uz4o6gr9z0850lhxyxvsj.jpg", "cju5o1vu9gz8a0818eyy92bns.jpg", "cju8ayeq7r1fb0818z1junacy.jpg", "cjyzk8qieoboa0848ogj51wwm.jpg", "cju3128yi0rpu0988o4oo5n8n.jpg", "cju1d50a94qf50855wsowacrc.jpg", "cju6x0yqbvxqt0755dhxislgb.jpg", "cju5buy2bal250818ipl6fqwv.jpg", "cju7ff97z2ow40817u2r83my5.jpg", "cju1g4nsb6ngy0799l4ezm8ab.jpg", "cju34ds2531520988qjpqt6e3.jpg", "cju6wjm81vgsc0987enk9n3pr.jpg", "cju8dic9mtppa0987swn23wbc.jpg", "cju6vta3kvazg0817qbeppjtm.jpg", "cju15wdt3zla10801odjiw7sy.jpg", "cju8aeei7q8k308173n9y4klv.jpg", "cju7aez2x1jtj0871ztezs3oi.jpg", "cju1f5x1164xv08555654c24r.jpg", "cju8chxndsre008015uisl4si.jpg", "cju5wtdu4m0im0871mix0yvc0.jpg", "cju85c2d4ln1b0755zz1z3onx.jpg", "cju7g7ba42z310987bqzbi2bq.jpg", "cju7f5ghb2r5s0801chwkxxh9.jpg", "cju16jgnyzp970878melv7r25.jpg", "cju5v8pgplg6k0755rvi2t63h.jpg", "cju1euuc65wm00799m4sjdnnn.jpg", "cju1871y11d6r0799k6cw4yze.jpg", "cju8bqxxurs6i0850mu7mtef9.jpg", "cju7ecl9i2i060987xawjp4l0.jpg", "cju7d3oc82cho0755dajlwldz.jpg", "cju326h4v1gxw08352px40p7r.jpg", "cju8bafgqrf4x0818twisk3ea.jpg", "cju84aoa3ktwn0755pfl4gfwd.jpg", "cju6xa0qmvzun0818xjukgncj.jpg", "cju85qefyln6v0850szeb9byi.jpg", "cju8c5zcbsdfz0801o5t6jag1.jpg", "cjyzul1qggwwj07216mhiv5sy.jpg", "cju40jl7skiuo0817p0smlgg8.jpg", "cju2hos57llxm08359g92p6jj.jpg", "cju7dubap2g0w0801fgl42mg9.jpg", "cju85nr8elly209872w9n5m0s.jpg", "cju42wamblrqn098798r2yyok.jpg", "cju7f0ec32txj08184asb8w5f.jpg", "cju1cdxvz48hw0801i0fjwcnk.jpg", "cju3xl264ingx0850rcf0rshj.jpg", "cju17bz250pgd0799u1hqkj5u.jpg", "cju783tmkzkqu081803g7q5vk.jpg", "cju41p90plcsx08018cnzpndc.jpg", "cju32jcdabepz0878d0cznmfe.jpg", "cju1gghyjwxt80835vx0wgxw0.jpg", "cju7arvfe1ldu0850erdmphgj.jpg", "cju1hirfi7ekp0855q0vgm9qq.jpg", "cju30525w04r10835ygp257sb.jpg", "cju5vwbr4lhqn0987a1pji0ux.jpg", "cju42qet0lsq90871e50xbnuv.jpg", "cju8aw9n1qyg10801jkjlmors.jpg", "cju7787c5yy3l080159mwqsnj.jpg", "cju15ptjtppz40988odsm9azx.jpg", "cju34ymm8d6700799uop0cw33.jpg", "cju6uy20suzbl0987rzuhz7z9.jpg", "cju310f6val1v0855xo8tc3gu.jpg", "cju7atnm31if40817pqclnjer.jpg", "cju88aq6vo1ij0755c2ey7z7n.jpg", "cju8dn0c3u2v50801k8rvq02f.jpg", "cju8doa16u5gh0818w1ywda3q.jpg", "cju77t0razbvm080106o56289.jpg", "cju84hibuktj80871u519o71q.jpg", "cju7f900s2o0k08175gl1giid.jpg", "cju422cm8lfxn0818ojicxejb.jpg", "cju8567gdlcbq0801dwwyo2jt.jpg", "cju2lyynuymli0855g7fxgbhe.jpg", "cju3x5u2tiihx0818914gzxy1.jpg", "cju5vcmrqla7i0817x4sp4pqw.jpg", "cju0s2a9ekvms080138tjjpxr.jpg", "cju43kj2pm34f0850l28ahpni.jpg", "cju41lojblbs307555jdci937.jpg", "cju88trl3ogi208716qvti51b.jpg", "cju2ro5jqsy680988pi6qsujw.jpg", "cju8c5mxls96t0850wvkvsity.jpg", "cju890guyoiti098753yg6cdu.jpg", "cju5yimthmlv80850zhoc90c2.jpg", "cju1egx9pvz2n0988eoy8jp23.jpg", "cju7d4jk723eu0817bqz2n39m.jpg", "cju2qh5le1ock0878oahaql7d.jpg", "cju8b3ka8r64u0801fh18hk7l.jpg", "cju5yhgznmkzb0801cji2vi8j.jpg", "cju2nqapmzvk20801f9us40dx.jpg", "cju8djdqztu6408506pzhlo18.jpg", "cju418rckl3ur08012psrx1r1.jpg", "cju2hqt33lmra0988fr5ijv8j.jpg", "cju6vvxsev9y30987kespucdg.jpg", "cju84jdl9kv0i0871eog9b3i9.jpg", "cjz14qsk2wci60794un9ozwmw.jpg", "cju7afqon1ip40850ue2308b6.jpg", "cju8a84g0q76m0818hwiggkod.jpg", "cju2rz4k434s70855wwx3ddtx.jpg", "cju1c8ffau5770835g0g343o8.jpg", "cju41s6nbleqy0755e2mslg0b.jpg", "cju31t8xd17bk0835rnb893jk.jpg", "cju8cbsyssiqj0871gr4jedjp.jpg", "cju5klveuff6w0871wbibgh3m.jpg", "cju2sggy13na70855tbeoqgha.jpg", "cju8dm2cau2km0818jsv9eeq2.jpg", "cju7dtb1e2j0t0818deq51ib3.jpg", "cju2xyd9vyi7m098831qcucse.jpg", "cju2r11x7sdgx0988o8ule0wl.jpg", "cju85omszllp30850b6rm9mi3.jpg", "cju2nfnvxzdkd0878399axlco.jpg", "cju5bhv81abur0850ean02atv.jpg", "cju77j66ez52p08019xygi0co.jpg", "cju33yemn2qb20988wfjxximx.jpg", "cju3518w2d838079939fqztbc.jpg", "cju2t62nq45jl0799odpufwx6.jpg", "cju7fen322ou10817ziqkob4k.jpg", "cju5wqonpm0e60801z88ewmy1.jpg", "cju42romflni20817etb9a0fl.jpg", "cju3381d8bz3h07991xtl7ra0.jpg", "cju33qpdvc9g0087825jhf3s9.jpg", "cju8alhigqn2h0801zksudldd.jpg", "cju8418jhkf7d0818ga2v0xq0.jpg", "cju7fcgbe2z3p07550vaflqdb.jpg", "cju428k5fldt108177s6g6f45.jpg", "cju7fnfv02tt90801djnix9m8.jpg", "cju1cj3f0qi5n0993ut8f49rj.jpg", "cju1dq3x1vgx109889c7wyirg.jpg", "cju784jpdzeae0987q5ypq883.jpg", "cju1ats0y372e08011yazcsxm.jpg", "cju7deifq2fzn0755lc8idyh8.jpg", "cju1c6yfz42md08550zgoz3pw.jpg", "cju2zdvjn9h7r08553cp4eed5.jpg", "cju32upim1z7u0988l883nqp6.jpg", "cju0s690hkp960855tjuaqvv0.jpg", "cju7dglf226g50987ohbthl19.jpg", "cju1ejj7dvqfa0835ra184v5m.jpg", "cju83k8fyjsxr0817d6nxs6r4.jpg", "cju35a77vdj4n08556jj2lgmc.jpg", "cju45v0pungu40871acnwtmu5.jpg", "cju1hs0za7jha0855vj0mdrjt.jpg", "cju5woy82m07m08505dmjg7g1.jpg", "cju34repocy5208780gswillm.jpg", "cju5tgbzhjllu08174ca41eus.jpg", "cju5hqz50e7o90850e0prlpa0.jpg", "cju0t4oil7vzk099370nun5h9.jpg", "cju30qbm1ad3x0855znuhpz9u.jpg", "cju1b3zgj3d8e0801kpolea6c.jpg", "cju17r8il13910799dr2wme2e.jpg", "cju2rnkt22xep0801as160g9t.jpg", "cju88gx09o2vk0818610zody3.jpg", "cju0u2g7pmnux0801vkk47ivj.jpg", "cju5nxkujgscq0817l9gss626.jpg", "cju2hfqnmhisa0993gpleeldd.jpg", "cju5uhrdwkmsu0817ervv91l8.jpg", "cju6vrs1ov8cr098788h8gs6j.jpg", "cju353d1eda8c07992afde611.jpg", "cju6w733bveoz0817e600tw72.jpg", "cju2nyc5f02m40801ojqbtiea.jpg", "cju45rj7ln8980850a7821fov.jpg", "cju2xf8e5y2wm08359vcgk09b.jpg", "cju5yeqiwmkgl0801fzv2douc.jpg", "cju35740hzm0g0993zl5ic246.jpg", "cju13fwthn9mq0835gacxgy01.jpg", "cju76l27oyrw907551ri2a7fl.jpg", "cju7cp6dw244p0818gncdol4m.jpg", "cju8c6hnxsdvr0801wn0vrsa6.jpg", "cju43c92lm5cj0755lorsorfg.jpg", "cju45n0oxn5vu08500yfrt9jn.jpg", "cju30ywtc0oar0835bp2en7ec.jpg", "cju5waeduln160817w0agirve.jpg", "cju5clr68b48r0755cmuvponm.jpg", "cju2zpw4q9vzr0801p0lysjdl.jpg", "cju1b75x63ddl0799sdp0i2j3.jpg", "cju87tyddnnad0755bj0wxahe.jpg", "cju5ymyd8mmdc0801ry3by1xr.jpg", "cju8ando2qqdo0818ck7i1be1.jpg", "cju3tsh4lfsok0987w6x3a0v1.jpg", "cju2z2x3nvd3c099350zgty7w.jpg", "cju3uhb79gcgr0871orbrbi3x.jpg", "cju2omjpeqj5a0988pjdlb8l1.jpg", "cju15mhjczc8z0801kit5c6di.jpg", "cju2ycp1u8g2r0799jslnp7cz.jpg", "cju888fr7nveu0818r9uwtiit.jpg", "cju426tomlhll0818fc0i7nvh.jpg", "cju5ukkg6kv7u08011x2b6zl5.jpg", "ck2bxiswtxuw80838qkisqjwz.jpg", "cju5bj926aiec07559rshy4wa.jpg", "cju2zo0fwzv580988qlijd2xa.jpg", "cju1ddr6p4k5z08780uuuzit2.jpg", "cju85a8h8llwm07559wxg4t5w.jpg", "cju2htabevq9108015qjei0x7.jpg", "cju14hjh2ob2o0835ouz3r5aa.jpg", "cju88y1mwoln50871emyfny1g.jpg", "cju3xeexgii1j0817zs68tb4g.jpg", "cju6xlygpw7bs0818n691jsq4.jpg", "cju7aklv31h4309871m29l4e7.jpg", "cju6z2616wqbk07555bvnuyr1.jpg", "cju1c4fcu40hl07992b8gj0c8.jpg", "cju34eqjpcpm508788b3lhp97.jpg", "cju8b5p40r2c60987ofa0mu03.jpg", "cju77q10sz9ug0801449wu1nu.jpg", "cju6uzxk0v83p0801rcwnexdu.jpg", "cju7csvlb22fr0850lvm45n3x.jpg", "cju1cbokpuiw70988j4lq1fpi.jpg", "cju8b2rmgr52s0801p54eyflx.jpg", "cju357rxxdaz30878y2esjpjt.jpg", "cju34m7h536wq0988xz7gx79v.jpg", "cju3yb47cj1xq0817zfotbni4.jpg", "cju2u4pymvc720988wsxrmi84.jpg", "cju41nz76lcxu0755cya2qefx.jpg", "cju3xhpvvimda0987ygrpzni2.jpg", "cju8b4ja9r2s808509d45ma86.jpg", "cju88nroho44508500129f1nh.jpg", "cju1g20bdwq6u0835e16xugcd.jpg", "cju43in5fm22c08175rxziqrk.jpg", "cju8cgi2kspp308011nxdtjp6.jpg", "cju16b6ynq8e40988m8vx0xnj.jpg", "cju2qu37qobl50993aw7ghcfq.jpg", "cju2spdagu1l50835da1f46fr.jpg", "cju3v664kh0px0818y4y7wolf.jpg", "cju30lncba3ny0878jwnous8n.jpg", "cju1amqw6p8pw0993d9gc5crl.jpg", "cju2lejzcy4pc0878c9rlonot.jpg", "cju2qdj95ru8g09886gfi9rsz.jpg", "cju5eq8c8ck690850vix98hv3.jpg", "cju1fyb1d69et0878muzdak9u.jpg", "cju2wtwj87kys0855kx6mddzw.jpg", "cju88itqbny720987hxizbj5y.jpg", "cju3v3ac9gyz30755hfqwyp1i.jpg", "cju5vzjoslpj708186z2fusmz.jpg", "cju2ij9uiic2l09933ljiv6gm.jpg", "cju2uwz9f5yf1085506cfamfx.jpg", "cju2lberzkdzm09938cl40pog.jpg", "cju7cufm7298k0755j09uf3of.jpg", "cju7b9vcs1luz0987ta60j1dy.jpg", "cju40poe4kt9s0755f9cnm3h5.jpg", "cju7ap09p1kz10850ldccjebj.jpg", "cju5ew4h9cqaf0818rrczkmqh.jpg", "cju88fpm4o0tl0871w1i6a4ds.jpg", "cju7bgnvb1sf808717qa799ir.jpg", "cju2m71z2ywwv080131bcrsd3.jpg", "cju41r6v2lcww0871ps8k8pf5.jpg", "cju30ajhw09sx0988qyahx9s8.jpg", "cju87zv8lni0o0850hbbecbq6.jpg", "cju5yjq1pmlgc0801z0t24bly.jpg", "cjyzuio1qgh040763k56deohv.jpg", "cjyzufihqquiw0a46jatrbwln.jpg", "cju2zrojo9kcd0878ld2epejq.jpg", "cju5vxuc5loxw0818u8xgf45p.jpg", "cju2rlqdnoz9k0993cpjae3x0.jpg", "cju8402x1kcy70801t6kz6bdi.jpg", "cju1h89h6xbnx08352k2790o9.jpg", "cju8at3s1qqqx0850hcq8nmnq.jpg", "cju886ryxnsl50801r93jai7q.jpg", "ck2bxqz3evvg20794iiyv5v2m.jpg", "cju35k2fr3vc50988c85qkrwg.jpg", "cju8c1a0ws7o208181c6lbsom.jpg", "cju7dda8w2br20818zhsuz8s7.jpg", "cju1ftaji6isw0855108yqcse.jpg", "cju8c3xs7sauj0801ieyzezr5.jpg", "cju33za6l2qy70988jhrlp2ev.jpg", "cju30ov1oah920801mi8thuyg.jpg", "cju7ez7r22qbc08015xfoz2wb.jpg", "cju5o4pk9h0720755lgp9jq8m.jpg", "cju410dnfl0960755y8lu8d79.jpg", "cju334jzo261t0835yqudnfs1.jpg", "cju2yi9tz8vky0801yqip0xyl.jpg", "cju45qbf3n9sa0987oonbkly9.jpg", "cju6ut4l8va6y0755tyw3vfqq.jpg", "cju6ur9l9v9jq0755paud9uka.jpg", "cju89z6pqpqfx0817mfv8ixjc.jpg", "cju7b10ce1mnm08011c5bwyr4.jpg", "cju175facms5f0993a5tjikvt.jpg", "cju2txjfzv60w098839dcimys.jpg", "cju1csmlc4ht10799b8ymmghg.jpg", "cju3tp94kfstl08181awh6z49.jpg", "cju2p91qir00k08350ddfif0w.jpg", "cju5hyi9yegob0755ho3do8en.jpg", "cju43h43am1dy08176gwfhmnt.jpg", "cju88msmoo3470817m441j4sg.jpg", "cju13hp5rnbjx0835bf0jowgx.jpg", "cju83ipu3jwpx0801z5pvguf8.jpg", "cju33w4sdcivk0855x879zht7.jpg", "cju2tzypl4wss0799ow05oxb9.jpg", "cju6wll7wvo3y08502pagos8m.jpg", "cju7bc95p1mdm0817yqj5jc6j.jpg", "cju30j1rgadut0801vuyrsnt8.jpg", "cju35mdz73x890835eynq1h9v.jpg", "cju43lcnum9y10755bjs7z87f.jpg", "cju7etr3y2p4t0801cdzjj8ab.jpg", "cju774fmayxif0818u2g79usw.jpg", "cju1cu1u2474n0878tt7v4tdr.jpg", "cju323ypb1fbb0988gx5rzudb.jpg", "cju33x0f22peh0988g0ln7w5v.jpg", "cju2y5zas8m7f0801d34g5owq.jpg", "cju5ddda9bkkt0850enzwatb1.jpg", "cju5ufn3skquf0818dhapnhba.jpg", "cju84gpefknwm098714oq8q61.jpg", "cju2trtjf4qjd0878a2zle9v9.jpg", "cju7fazv92ywx0755xov2erga.jpg", "cju2rn0hasxri0835nfy3buay.jpg", "cju3x4blzieu30850x10uuvbm.jpg", "cju3y9difj6th0801kd1rqm3w.jpg", "cju2osuru0ki00855txo0n3uu.jpg", "cjyzlw7f9faqr070129au64sq.jpg", "cju3u39fog1bo0871lxjrabks.jpg", "cju2yo1j1v0qz09934o0e683p.jpg", "cju33231uy4gi0993qc7b1jch.jpg", "cju2xlcqxy9c60988vjacdznb.jpg", "cju77vvcwzcm50850lzoykuva.jpg", "cju8dpa89u6l80818dj6lldh9.jpg", "cju3xwpgviwlx0871rwm15q7v.jpg", "cju1h5w4wxajx0835mc954kxy.jpg", "cju303j5r062k098835zxfds5.jpg", "cju35fxqyzt5p0993vusm54qz.jpg", "cju31w6goazci0799n014ly1q.jpg", "cju3u815rg4ek0850vvhtcvcm.jpg", "cju8bpctzrqkr0850zeldv9kt.jpg", "cju5f26ebcuai0818xlwh6116.jpg", "cju5g163vd6mt0817uccuga6u.jpg", "cju2zjcvj9qma0801dk71hhi0.jpg", "cju2mfjndoz700988b9lc3zeq.jpg", "cju5uxjnol2r509871qv2yeia.jpg", "cju7dwe282dc309876rco45ts.jpg", "cju5wuhm1lwm40987vugqn3vv.jpg", "cju77u1sjz77b0817ft44r3fk.jpg", "cju2yv4imv6cz099314jveiib.jpg", "cju16d65tzw9d0799ouslsw25.jpg", "cju8b6rp0r5st0850184f79xt.jpg", "cju3umoh1geet0817cmpef5am.jpg", "cju5y7buemcw80987p0r30g9f.jpg", "cju32srle1xfq083575i3fl75.jpg", "cju0roawvklrq0799vmjorwfv.jpg", "cju7b5afm1nfw0801xqm8bf8q.jpg", "cju1fb9236a110801yvg0fwju.jpg", "cju2z45kuzf6d0988nz2c819m.jpg", "cju45lbgznahl08180xz1h7u6.jpg", "cju2tpfa5uyx408359datxqqj.jpg", "cju3v72v5h1qz0818fggilwtq.jpg", "cju2yb31a8e8u0878wdashg7o.jpg", "cju6x97w4vwua0850x0997r0a.jpg", "cju42u5bjlvi10801dc13sskp.jpg", "cju77bvg0yv4r0987yh60xmjo.jpg", "cju5wrapcm2290818jsh26ppb.jpg", "cju17v6ih0u7808783zcbg1jy.jpg", "cju8d2q30tfhs0801n7lx77xl.jpg", "cju2nd7l7z98o0799gfjvyfmw.jpg", "cju5uzmaol56l0817flxh4w9p.jpg", "cju17otoe119u0799nqcbl8n1.jpg", "cju2s16zp317h0799gr67jqc2.jpg", "cju0u82z3cuma0835wlxrnrjv.jpg", "cju2zy1e49pqk0878t6ncqn12.jpg", "cju1f15k3w4ct0835cmde6ypo.jpg", "cju8bgdmqrksy0801tozdmraa.jpg", "cju3521y5d5mq0878t3ezsu4p.jpg", "cju40sdwukv3k0755y99ug1k8.jpg", "cju2pjb9v0ywn0878j5g5n69j.jpg", "cju2i3hzclw3o0988rrgh911i.jpg", "cju6yxyt0wh080871sqpepu47.jpg", "cju5x28nzm7t907558ocq4bt7.jpg", "cju1hp9i2xu8e0988u2dazk7m.jpg", "cju160wshltz10993i1gmqxbe.jpg", "cju34aozyyy830993bn16u32n.jpg", "cju7dxffn2eam0817qxosfwch.jpg", "cju8dqkrqu83i0818ev74qpxq.jpg", "cju8bysfgrzkl081786jwac09.jpg", "cju5gucasds9d0801019axylx.jpg", "cju5vi4nxlc530817uoqm2m7a.jpg", "cju5wj0faly5008187n6530af.jpg", "cju30mm25a53s0799qa5wiqe8.jpg", "cju5ca9hcatkc0801jzwe7tfx.jpg", "cju7bd1qu1mx409877xjxibox.jpg", "cju2yg5ht8i4p087800js8hp4.jpg", "cju5y4hgqmk0i08180rjhbwvp.jpg", "cju1euant5l960878iqj5vvto.jpg", "cju1dg44i4z3w0801nyz4p6zf.jpg", "cju2uy8ox62jo0801g88hh42z.jpg", "cju2t16vuucaq0835xcpsivn2.jpg", "cju5u4pywk81x0817vn9pe14z.jpg", "cju8ca4geseia0850i2ru11hw.jpg", "cju83wwn1k55e0850kw6i2d81.jpg", "cju45ofd9ne1j0801ri8dup7t.jpg", "cju2uzabhs6er0993x3aaf87p.jpg", "cju8a56vxpy780850r45yu4wk.jpg", "cju45pm27n80u08174kyow1gj.jpg", "cju3u4lxmg59o0755rz42b9en.jpg", "cju1gkndf6yi10801o1qnje19.jpg", "cju30gxjq0djk0988jytm49rs.jpg", "cju45jpvfn6c809873pv1i34s.jpg", "cju7adqyj1jcx08712r1ro5gx.jpg", "cju7dmlgf2ebw0871ieqas5fh.jpg", "cju8d4jgatgpj0871q2ophhkm.jpg", "cju2wx0gh7fpz0878wwyd9ep8.jpg", "cju2x7vw87mu30878hye2ca0m.jpg", "cju1hhj6mxfp90835n3wofrap.jpg", "cju30ftgja7170855xl9bkdm0.jpg", "cju43eigtm6ev0801mv0m96t1.jpg", "cju1fjsb4sipq09931lvd8e41.jpg", "cju77g99iyxc00817zqi2ppor.jpg", "cju34zivp3fq80988opxbaqyn.jpg", "cju2t9tdwuk700835kv0ljmtl.jpg", "cju5wi6bqlxy90755bu227nvb.jpg", "cju2rmd2rsw9g09888hh1efu0.jpg"], "valid_labels": ["cju5vgawslbe30987ndeepc1b.jpg", "ck2bxlujamu330725szlc2jdu.jpg", "cju2hx006vidl0799igm81vmh.jpg", "cju7aqkue1i2k09879uzcpt8r.jpg", "cju5uget8krjy0818kvywd0zu.jpg", "cju8dk7eztzup08182yxko5zh.jpg", "cju1c3218411b08014g9f6gig.jpg", "cju7f6cqy2ur20818t1saazbm.jpg", "cju6wi3akvn8r0801px8eligc.jpg", "cju5enq1tcn1i0755hnkon787.jpg", "cju2hewssldzx0835ep795xu0.jpg", "ck2bxskgxxzfv08386xkqtqdy.jpg", "cju2np2k9zi3v079992ypxqkn.jpg", "cju5bycdkalkb09875f7bfrvx.jpg", "cju2hlm19vjjf0801o69qnber.jpg", "cju7amjna1ly40871ugiokehb.jpg", "cju34c1xfyz920993itxkkfad.jpg", "cju88oh0po9gq0801nge4tgr1.jpg", "cju5i39mreass0817au8p22zy.jpg", "cju5f0dezct4q08183ydw11dx.jpg", "cju5cky5xb0ay0801oxet697t.jpg", "cju7ehljc2or70871261br8ai.jpg", "cju183od81ff608017ekzif89.jpg", "cju7evxt12m730987rxivne3x.jpg", "cju8cj10qsrau0871o2dr6ai1.jpg", "cju2y26c588bo07993ksd8eoz.jpg", "cju2zkpdl9h7t0799ix60teqg.jpg", "cju85bf1algsq0871y9gtlq97.jpg", "cju40w3hbkwpn08015rbs3wko.jpg", "cju17hw9hr9c5098800fu4u8e.jpg", "cju6wuojavt740818b5qcv3iw.jpg", "cju2qvuj1s9ok0835tp2k4ozh.jpg", "cju33jon3ygbj0993pu22a4k6.jpg", "cju7dsrtb2f8i085064kwugfk.jpg", "cju77k828z46w0871r0avuoo9.jpg", "cju1aqqv02qwz0878a5cyhr67.jpg", "cju412uwlkva50850d1ps1ww7.jpg", "cju2nguelpmlj0835rojdn097.jpg", "cju35eg0tdmjt085525sb4bua.jpg", "cju7dn24o296i09871qfxb8s2.jpg", "cju2ma647l0nj0993ot4deq2q.jpg", "cju1expq45zst0855rjqwwj4m.jpg", "cju88t4fvokxf07558ymyh281.jpg", "cju83nwu1jxte0987h1krpfmv.jpg", "cju1fj6axwfp30835ukhuzhw9.jpg", "cju8b0jr0r2oi0801jiquetd5.jpg", "cju7bmi1v1pnj0987pa52jjok.jpg", "ck2da7fwcjfis07218r1rvm95.jpg", "cju2zblxw9848087853csbrx1.jpg", "cju5udcufki0s09874ll1dbr5.jpg", "cju2rqo702wpx0855fn7d5cxh.jpg", "cju88l66no10s0850rsda7ej1.jpg", "cju83yddek68q0850d2x7zfkm.jpg", "cju6z1bzbwfq50817b2alatvr.jpg", "cju5hi52odyf90817prvcwg45.jpg", "cju324q101fhe08350wae9cif.jpg", "cju5cetivauok0987ok3e5bre.jpg", "cju5u6wf0kh1t0755bg1ssixv.jpg", "cju8clorgsuwn08714toqb7v6.jpg", "cju5b9oyda4yr0850g9viziyv.jpg", "cju2qtee81yd708787bsjr75d.jpg", "cju3tvffffx5f0818t5ov22al.jpg", "cju1d96gsv62d09881b3wecw2.jpg", "cju5yclrymlgj0818k426ud6z.jpg", "cju2i8br1vqtd08784u6vmcjk.jpg", "cju7dvl5m2n4t0755hlnnjjet.jpg", "cju5hl8nee8a40755fm8qjj0o.jpg", "cju7d8m3b2e210755l8fj1yph.jpg", "cju1f79yhsb5w0993txub59ol.jpg", "cju7frtqu2xa20818wq8r9fzf.jpg", "cju35atpxdjot0855q46aqrd0.jpg", "cju3y0pjrj1c30755nxekxccj.jpg", "cju2ti1du4idn0878giuozonw.jpg", "cju2yyhsp933j0855hp32e012.jpg", "cju2r6mt2om21099352pny5gw.jpg", "cju3ttznuftyf09875t11850w.jpg", "cju42xpi8lw4w0871ve317a1p.jpg", "cju5u8gz4kj5b07552e2wpkwp.jpg", "cju7ezs7g2mxm098787atbran.jpg", "cju17g6ykn1cs0993dww6qdi8.jpg", "cju8arof2qpf20850ifr1bnqj.jpg", "cju3xuj20ivgp0818mij8bjrd.jpg", "cju34sh43d8zm08019xbwhc0o.jpg", "cju2zp89k9q1g0855k1x0f1xa.jpg", "cju7agj961l2r0818z29iq8yn.jpg", "cju3ua8u0g9rg0801uayhdxhu.jpg", "cju2hdr06v2bq0799mbm3bks1.jpg", "cju2qz06823a40878ojcz9ccx.jpg", "cju8azmhcr66e0755t61atz72.jpg", "cju87ox0kncom0801b98hqnd2.jpg", "cju1fuoa4wmc50835qfd11sp9.jpg", "cju88cddensj00987788yotmg.jpg", "cju7azuu31mia0801pf9ib5ed.jpg", "cju5k3j3uf6de0817hszzfr7n.jpg", "cju5x00l6m5j608503k78ptee.jpg", "cju430pm2lz0y0755jkhcc3d1.jpg", "cju0vtox5ain6099360pu62rp.jpg", "cju7dp3dw2k4n0755zhe003ad.jpg", "cju885ikhnmkn09878s2lqtuh.jpg", "cju2zr3c3vwb00993jn06bbaz.jpg", "cju8bw697rwg308177tg8huas.jpg", "cju1efbr0rqxz09931z0lf4vf.jpg", "cju7d7aut2a2p0818z4uxc6cd.jpg", "cju2sevf53lkx08558h5bpaig.jpg", "cju15l5ubz9yh0855b3ivdpse.jpg", "cju2nnqrqzp580855z8mhzgd6.jpg", "cju2mh8t6p07008350e01tx2a.jpg", "cju30nyxe0gfb0835p256yoju.jpg", "cju85rkbnlo1c08503uxcpax1.jpg", "cju3280wv1ir009882jze27tc.jpg", "cju7b2l561oas0871decgslaf.jpg", "cju2m56cryvqd0801gtn2yp8t.jpg", "cju5boicjagt20871b1fotkh4.jpg", "ck2bxknhjvs1x0794iogrq49k.jpg", "cju7crgxa28550755wbsgqkel.jpg", "cju1brhsj3rls0855a1vgdlen.jpg", "cju8b542nr81x0871uxnkm9ih.jpg", "cju87li0zn3yb0817kbwgjiz8.jpg", "cju1f8w0t65en0799m9oacq0q.jpg", "cju8a3nhbpwnb0850d37fo2na.jpg", "cju1bm8063nmh07996rsjjemq.jpg", "cju2z1nxlzaj40835wj81s1iy.jpg", "cju83qd0yjyht0817ktkfl268.jpg", "cju414lf2l1lt0801rl3hjllj.jpg", "cju2yw4s7z7p20988lmf2gdgd.jpg", "cju5fs6j6d8350801vglraq4u.jpg", "cju7er4kc2opa0801anuxc0eb.jpg", "cju5bdwa3aatx0818b79i18zf.jpg", "cjyzurzvohqnr0794es1itzek.jpg", "ck2bxw18mmz1k0725litqq2mc.jpg", "cju41z76wlgbz0801qdetlvby.jpg", "cju84ih17kp5l09876bkooocl.jpg", "cju5vbo6jldrt0871jf6f1700.jpg", "cju7es23b2vcp0755gpbm9s7v.jpg", "cju6ywm40wdbo0987pbftsvtg.jpg", "cju32l161bi1v07990vm376in.jpg", "cju5fi0yxd3ei0801v7u0yudn.jpg", "cju884985nlmx0817vzpax3y4.jpg", "cju32qr9tbvsj08013pkpjenq.jpg", "cju7flevb2wii08188otgs9p2.jpg", "cju16fpvhzypl0799p9phnlx6.jpg", "cju1dhfok4mhe0878jlgrag0h.jpg", "cju5xq3tdm9fn0987pbedxdg5.jpg", "cju7bb3ss1uoo0755pmhyco7t.jpg", "cju6us80mv1b50871ebyq2wxa.jpg", "cju2p0eveqtdc0835gpi3p93i.jpg", "cju7apr0c1qqm0755s7msqot4.jpg", "cju34o6dbd2lo0855aqlcy1hs.jpg", "cju2xd75m82720801q4s4ik3n.jpg", "cju7ebe962hr409872ovibahw.jpg", "cju1fr4etsmrr09933u4t4aql.jpg", "cju0ue769mxii08019zqgdbxn.jpg", "cju7cl8zm1xcu0817ado0jpas.jpg", "cju5ktjwofed70817eg58ef7u.jpg", "cju843yjskhq30818qre4rwm2.jpg", "cju8cwy02t9eq08185qn12c02.jpg", "cju892fesoq2g0801n0e0jyia.jpg", "cju3ul8dogf1z09872y2ecowp.jpg", "cju85fc11ljr40818edpb0inh.jpg", "cju8c2rqzs5t80850d0zky5dy.jpg"], "test_labels": ["cju8abobpqbir08189u01huru.jpg", "cju8axq24r4an0755yhv9d4ly.jpg", "cju5cu8qkb84x08186jwo8yin.jpg", "cju30k2z40ds308353kdew70n.jpg", "cju6vqarjv7yo0987q4b1btk1.jpg", "cju1819curo000988pd5xcqme.jpg", "cju7d9seq29zd0871nzl2uu5m.jpg", "cju31ugmfb3dz0855xtqshki6.jpg", "cju858eswlepn0871pzvdrhj1.jpg", "cju5fw37edaae0801vkwvocn7.jpg", "cju83kxitjv340987z09m0ezy.jpg", "cjyzkpsbjdsjq07211dfi4sru.jpg", "cju2z9vlp9j0w0801oag91sy9.jpg", "cju0tl3uz8blh0993wxvn7ly3.jpg", "cju33eqwbcch208012jikwdky.jpg", "cju8bssulrrcy0987h1vq5060.jpg", "cju2qxxko229x08786gvxxhur.jpg", "cju6wn57mvooj0850rp78hhy7.jpg", "cju7ejm2l2ncl0801wq6y84nw.jpg", "cju7b3f5h1sm40755i572jden.jpg", "cju2pmhtr17a00855cvpelzb0.jpg", "cju2u2b9o4zvp08788qb9nqxj.jpg", "cju85ia1slh220987y7c20sm2.jpg", "cju439oazm2fu0871ma0vvrft.jpg", "cju5hwonqedw10801vsd3w6kk.jpg", "cju1gi7jlwyld0835cdf6g6qz.jpg", "cjyzjzssvd8pq0838f4nolj5l.jpg", "cju17x0j4nfc10993y31pvlgs.jpg", "cju1fm3id6gl50801r3fok20c.jpg", "cju30bmab08bi0835mvlr6e0r.jpg", "cju41kd7yl4nm0850gil5qqwh.jpg", "cju2s2527pfyr0993l3h1149a.jpg", "cju2urqpwvxw70835rvndvtsi.jpg", "cju7et17a2vjk0755e743npl1.jpg", "cju7fob3x301u0755x985pmmq.jpg", "cju17z0qongpa0993de4boim4.jpg", "cju2phaksnahz0993yxogjcpv.jpg", "cju8b1v3br45u087189kku66u.jpg", "cju8aqq8uqmoq0987hphto9gg.jpg", "cju33mirdc8mj0799k33wzoes.jpg", "cju2y0z6g87p10878fpk5d3rq.jpg", "cju6vvb8svhed0801jjcquh5e.jpg", "cju2t3ibkuecr0835o7si16zv.jpg", "cju8914beokbf0850isxpocrk.jpg", "cju8chdlqsu620755azjty1tj.jpg", "cju43o6n7m9nk087191ijwqq9.jpg", "cju7bf1lp1shi081835vs84lc.jpg", "cju2ysg748ru80878sp6j0gm0.jpg", "cju88z8bson4h0871nnd7fdxo.jpg", "cju8brv16rx7f0818uf5n89pv.jpg", "cju7da88w2eod0755wejzynvt.jpg", "cju7eueum2oqn0850rodmx8zo.jpg", "cju773hsyyosz0817pk1e7sjq.jpg", "cju358pwtdby20878cg7nm0np.jpg", "cju2oq5570avm079959o20op1.jpg", "cju3y54kwj3nr0801biidlb4e.jpg", "cju5bmhdcafs909878qfzrqzi.jpg", "cju83h9ysjwe808716nt35oah.jpg", "cju5chrxxawka0871qcj171yz.jpg", "cju8czvnztbf40871b4m7t78w.jpg", "cju3xvoo2iqlc0817eku2r3wl.jpg", "cju7f9umg2olj0987fj5y285w.jpg", "cju87vqa0ndwg0850onjdz7ol.jpg", "cju2ouil2mssu0993hvxsed6d.jpg", "cju2zi4l09f5807991s8do2b2.jpg", "cju5k503sfa5f0871lx0rpu5y.jpg", "cju87z6o6nh73085045bzsx6o.jpg", "cju5xopi0md7q0871r1sjc1av.jpg", "cju40r6jrksyk0871wg98zgho.jpg", "cju5xneamme2p0801qdf7fdwv.jpg", "cju3xjqtpikx50817tppy6g84.jpg", "cju8bn7m2rmm70817hgxpb1uq.jpg", "cju42nm68lpyo0818xvvqmupq.jpg", "cju88q6h6obpd0871ckmiabbo.jpg", "cju3wstckialg0871xs0vevsj.jpg", "cju2y8s56ymqr083541ggdsml.jpg", "cju5ygh1zmmdi0755uod5e17i.jpg", "cju7bfx651qr80801cs7epotb.jpg", "cju7d7tly27h408016fyp5nr7.jpg", "cju77idwfz36d0871tzfzz51i.jpg", "cju7ddtz729960801uazp1knc.jpg", "cju30ia8da2bq0799klnehml2.jpg", "cju3y79ofj3va0871uqfb1mzo.jpg", "cju7cue9b232j0801qdzk1ykj.jpg", "cju5vutu7ll8w0871dfp92n9p.jpg", "cju2xa3i4y0160988i679zsqd.jpg", "cju6x4t13vyw60755gtcf9ndu.jpg", "cju7fd6yt2p740987wkr8exo1.jpg", "cju2xbk0080y80801eghyddi2.jpg", "cju32a52lb9rc0799xi40qs00.jpg", "cju42tauqlo5p08171l3cuo4b.jpg", "cju7ae7bq1f820987toc8si1d.jpg", "cju5y84q3mdv50817eyp82xf3.jpg", "cju893jmdompz0817xn3g1w4h.jpg", "cju2uokeg5jm20799xwgsyz89.jpg", "cju42dwedlmk60871jbgu4ehi.jpg", "cju35i2e63uxr0835h7zgkg9k.jpg", "cju6z9a9kwsl007552s49rx6i.jpg", "cju15jr8jz8sb0855ukmkswkz.jpg", "cjyzu9th0qt4r0a46pyl4zik0.jpg", "cju89y9h0puti0818i5yw29e6.jpg", "cju7bduyq1rjf08719giru9ho.jpg", "cju2xwm1s84l50799i60mq0pu.jpg", "cju7dlk532dsh0871zvr6qz0r.jpg", "cju85mpuglq8k0818d2it6hzb.jpg", "cju5xkwzxmf0z0818gk4xabdm.jpg", "cju8cattbsivm0818p446wgel.jpg", "cju2pag1f0s4r0878h52uq83s.jpg", "cju5x15djm7ae0755h8czf6nt.jpg", "cju5c5xc7algd0817pb1ej5yo.jpg", "cju32pzh9bpw10855q4vaxfhe.jpg", "cju6v3bb2v7xo085090blubyw.jpg", "cju83mki1jv5w0817kubxm31r.jpg", "cju5bbtwsa8cl0987wgfsqpao.jpg", "cju14pxbaoksp0835qzorx6g6.jpg", "cju785htizjzo08017tvlhtg4.jpg", "cju42m60jlpcm08186kqppzqv.jpg", "cju847pxykriq0755268ktrk2.jpg", "cju3x9lttikfb0818a0g104zn.jpg", "cju1cnnziug1l0835yh4ropyg.jpg", "cju76lsehyia10987u54vn8rb.jpg", "cju7fbndk2sl608015ravktum.jpg", "cju5cjh3xattc0817j2vbulzi.jpg", "cju3uwz6ogsp10801h2r3bj5l.jpg", "cju34ouumcznz07996gg1xq7v.jpg", "cju3x2s11ibzi0817kk284k0j.jpg", "cju34fojcctcf0799ebolbvkn.jpg", "cju3v56bwgy8v0871w14pz8fx.jpg", "cju87r56lnkyp0755hz30leew.jpg", "cju2r91dg2k090801bh0xzbxk.jpg", "cju7ev2b12owa08500bpfpwyw.jpg", "cju76o55nymqd0871h31sph9w.jpg", "ck2395w2mb4vu07480otsu6tw.jpg", "cju2pkwt3r8b90988v2ywq1px.jpg", "cju33belnbyhm0878yxl42233.jpg", "cju7ahtkb1jr90801jck4kbds.jpg", "cju8adb60qbiu080188mxpf8d.jpg", "cju5wrrs0m2af0818vmnajbtw.jpg", "cju2wzu8wxtgu09880ku9x1pg.jpg", "cju3y21quj0ir0818kgjagr15.jpg", "cju87mrypnb1e0818scv1mxxg.jpg", "cju0sxqiclckk08551ycbwhno.jpg", "cju5h57xedz5h0755mjpc8694.jpg", "cju1cfhyg48bb0799cl5pr2jh.jpg", "cju8c82iosagu0817l74s4m5g.jpg", "cju30df2j09dd08351ayx2t6w.jpg", "cju2rkjfwoxys0993x768l1j2.jpg", "cjyzu3reghjya0794w7pwoi50.jpg", "cju7druhp2gp308715i6km7be.jpg", "cju5w7xn0lrkq0801f9k0htgx.jpg", "cju40u30gkuzc0871rq7t666d.jpg", "cju6v1m1xv07w09870ah3njy1.jpg", "cju849c23kgnk0817cgv2hw1e.jpg", "cju5k7r0yf98c09878csbxb4d.jpg", "cju8a2itsq4dv0755ntlovpxe.jpg", "cju6z7e4bwgdd0987ogkzq9kt.jpg", "cju7avvi51iox0817ym55y6tt.jpg", "cju0qkwl35piu0993l0dewei2.jpg", "cju85hguellg50818kwu3s8d1.jpg", "cju302fqq9spc0878rrygyzzz.jpg", "cju8amfdtqi4x09871tygrgqe.jpg", "cju6z600qwh4z081700qimgl9.jpg", "cju7ea4om2l910801bohqjccy.jpg", "cju45t5ddnbio0987qtqzx762.jpg", "cju84dsvaklpx098750hp83x4.jpg", "cju1cqc7n4gpy0855jt246k68.jpg", "cju5thdbrjp1108715xdfx356.jpg", "cju87kbcen2av0987usezo8kn.jpg", "cju8b7aqtr4a00987coba14b7.jpg", "cju5xjn5mm78b09871spyqhhr.jpg", "cju3x7xsaijq80818f0psavav.jpg", "cju5fu081d8gc0818l3yylujk.jpg", "cju171py4qiha0835u8sl59ds.jpg", "cju2qn2fzs1vy0988l243cvzy.jpg", "cju7d1tvt25bu08019dvw3uff.jpg", "cju2ueb6j5ado0878vf5md13o.jpg", "cju13cgqmnhwn0988yrainhcp.jpg", "cju3tx1qyg0c907552fglumhc.jpg", "cju31rb7vb6110801p9rhacuw.jpg", "cju77afzlz3kp07550x5nafzs.jpg", "cju2hugv9vget0799hhk7ksvg.jpg", "cju88evxanv9r08176zkeovec.jpg", "cju6xifswvwbo0987nibtdr50.jpg", "cju43jcqim2cp08172dvjvyui.jpg", "cju5es375cnzy0801nkq35ffs.jpg", "cju7dff9529h208503w60lbil.jpg", "cju2hgsptlfam0835o3b59h1o.jpg", "cju8buos5rz9b08715lfr0f4f.jpg", "cju7ctvqn25dy08186g442m1r.jpg", "cju7dz5yy2i7z0801ausi7rna.jpg", "cju7b4mtw1n9n080186209f3d.jpg", "cju42g865lorv07552ytz6xxa.jpg", "cju5von04litr08718j8po40a.jpg", "cju7eea9b2m0z0801ynqv1fqu.jpg", "cju8bi8q7rlmn0871abc5ch8k.jpg", "cju5kre09fhka0850h7b1898j.jpg", "cju40m0rjkpw80871z6n6yg1u.jpg", "cju6wt9jvvn500871hjn3t3g0.jpg", "cju2xjz2ju8pe0993ysv9wg17.jpg", "cju2t2ivz43i10878zeg8r1br.jpg"]}
files_split/MMWHS_CT_Heart.json ADDED
The diff for this file is too large to render. See raw diff
 
files_split/MMWHS_MR_Heart.json ADDED
The diff for this file is too large to render. See raw diff
 
files_split/__init__.py ADDED
File without changes
files_split/fgadr_pkl_file.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d44356d5fc5e30bb200ddb789d70730a4158875a61140171232ab44ac3c98400
3
+ size 159475
further_training_lvm_med/README.md ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ # Description
3
+
4
+ The LIVECell dataset was published by [Edlund et.al.](https://www.nature.com/articles/s41592-021-01249-6) in 2021. This dataset consists of over 1.6 million high-quality cells from various sets of cell morphologies and
5
+ culture densities which are manually annotated carefully by experts.
6
+ There are 8 types of Cells in this dataset. All of them were merged and then continued pre-trained from LVM-MED weights.
7
+
8
+
9
+ ```bibtex
10
+ @article{edlund2021livecell,
11
+ title={LIVECell—A large-scale dataset for label-free live cell segmentation},
12
+ author={Edlund, Christoffer and Jackson, Timothy R and Khalid, Nabeel and Bevan, Nicola and Dale, Timothy and Dengel, Andreas and Ahmed, Sheraz and Trygg, Johan and Sj{\"o}gren, Rickard},
13
+ journal={Nature methods},
14
+ volume={18},
15
+ number={9},
16
+ pages={1038--1045},
17
+ year={2021},
18
+ publisher={Nature Publishing Group US New York}
19
+ }
20
+ ```
further_training_lvm_med/__init__.py ADDED
File without changes
lvm-med-training-data/0_SSL_BraTS2018_Brain/file_list.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:afc528cf7ea027d47295dfd92d269b7c28f5a798a11fb8b7741c007199088a40
3
+ size 1239
lvm-med-training-data/0_SSL_HNSCC_Mixed_HeadNeck/file_list.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:cda6b92937fa473d5f34cdfb4a4f5fb7ac0d499f465a89cea70543dd589172ed
3
+ size 12493214