+
```python
From 987d6efdeeef3165973ac42b10c8b6947fa0b4fa Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Tue, 4 Oct 2022 16:08:16 +1000
Subject: [PATCH 02/31] Creation of Files and Instructions added to README
All files listed in the report spec sheet have been created and README instructions from spec sheet have been added to the README file.
---
recognition/46413587_ImprovedUNet/README.md | 10 ++++++++++
recognition/46413587_ImprovedUNet/dataset.py | 0
recognition/46413587_ImprovedUNet/modules.py | 0
recognition/46413587_ImprovedUNet/predict.py | 0
recognition/46413587_ImprovedUNet/train.py | 0
recognition/46413587_ImprovedUNet/utils.py | 0
6 files changed, 10 insertions(+)
create mode 100644 recognition/46413587_ImprovedUNet/README.md
create mode 100644 recognition/46413587_ImprovedUNet/dataset.py
create mode 100644 recognition/46413587_ImprovedUNet/modules.py
create mode 100644 recognition/46413587_ImprovedUNet/predict.py
create mode 100644 recognition/46413587_ImprovedUNet/train.py
create mode 100644 recognition/46413587_ImprovedUNet/utils.py
diff --git a/recognition/46413587_ImprovedUNet/README.md b/recognition/46413587_ImprovedUNet/README.md
new file mode 100644
index 0000000000..1ffe79516c
--- /dev/null
+++ b/recognition/46413587_ImprovedUNet/README.md
@@ -0,0 +1,10 @@
+Attempt at easy difficulty task.
+
+1. The readme file should contain a title, a description of the algorithm and the problem that it solves
+(approximately a paragraph), how it works in a paragraph and a figure/visualization.
+2. It should also list any dependencies required, including versions and address reproducibility of results,
+if applicable.
+3. provide example inputs, outputs and plots of your algorithm
+4. The read me file should be properly formatted using GitHub markdown
+5. Describe any specific pre-processing you have used with references if any. Justify your training, validation
+and testing splits of the data.
diff --git a/recognition/46413587_ImprovedUNet/dataset.py b/recognition/46413587_ImprovedUNet/dataset.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/recognition/46413587_ImprovedUNet/modules.py b/recognition/46413587_ImprovedUNet/modules.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/recognition/46413587_ImprovedUNet/predict.py b/recognition/46413587_ImprovedUNet/predict.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/recognition/46413587_ImprovedUNet/train.py b/recognition/46413587_ImprovedUNet/train.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/recognition/46413587_ImprovedUNet/utils.py b/recognition/46413587_ImprovedUNet/utils.py
new file mode 100644
index 0000000000..e69de29bb2
From 04efe94cb6949fb8a1cebc3d0625b5699e558887 Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Sat, 15 Oct 2022 11:58:35 +1000
Subject: [PATCH 03/31] Updated Gitignore
Updated to prevent local data files from being uploaded
---
.gitignore | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/.gitignore b/.gitignore
index 92459a9d2f..c1b98d256f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,9 @@ __pycache__/
*.py[cod]
*$py.class
+#DataSets
+**DataSets/
+
# C extensions
*.so
@@ -129,4 +132,4 @@ dmypy.json
.vscode/
# no tracking mypy config file
-mypy.ini
\ No newline at end of file
+mypy.ini
From e75007f76dbd15a32c23ee2ec5d3a31fc7afb006 Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Sat, 15 Oct 2022 11:59:58 +1000
Subject: [PATCH 04/31] End UNet
Changing project from UNet to VQVAE
---
recognition/46413587_ImprovedUNet/dataset.py | 43 ++++++++++++++++++++
recognition/46413587_ImprovedUNet/modules.py | 28 +++++++++++++
2 files changed, 71 insertions(+)
diff --git a/recognition/46413587_ImprovedUNet/dataset.py b/recognition/46413587_ImprovedUNet/dataset.py
index e69de29bb2..01f33b0096 100644
--- a/recognition/46413587_ImprovedUNet/dataset.py
+++ b/recognition/46413587_ImprovedUNet/dataset.py
@@ -0,0 +1,43 @@
+import torch
+import torch.optim as optim
+import torch.nn as nn
+import torch.nn.parallel
+import argparse
+import torchvision.transforms as transforms
+import torch.backends.cudnn as cudnn
+import torch.utils.data
+import torchvision.datasets as dset
+import torchvision.utils as vutils
+import os
+import numpy as np
+import matplotlib.pyplot as plt
+import random
+
+TrainImRoot="\DataSets\ISIC-2017_Training_Data"
+TrainLbRoot="\DataSets\ISIC-2017_Training_Truth"
+#TestImRoot="\DataSets\ISIC-2017_Test_Data"
+TestLbRoot="\DataSets\ISIC-2017_Test_Truth"
+ValImRoot="\DataSets\ISIC-2017_Validation_Data"
+ValLbRoot="\DataSets\ISIC-2017_Validation_Truth"
+workers = 2
+batch_size=128
+image_size=64
+channels=3
+num_epochs=20
+learn_rate=0.0002
+beta1=0.5
+
+trainset=dset.ImageFolder(root = TrainImRoot,
+ transform=transforms.Compose([
+ transforms.Resize(image_size),
+ transforms.CenterCrop(image_size),
+ transforms.ToTensor(),
+ transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5)),
+ ]))
+
+dataloader=torch.utils.data.DataLoader(TrainImRoot, shuffle = True, batch_size=batch_size,
+ numworkers = workers)
+
+device=torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
+
+print("no errors")
\ No newline at end of file
diff --git a/recognition/46413587_ImprovedUNet/modules.py b/recognition/46413587_ImprovedUNet/modules.py
index e69de29bb2..2ef8c19b08 100644
--- a/recognition/46413587_ImprovedUNet/modules.py
+++ b/recognition/46413587_ImprovedUNet/modules.py
@@ -0,0 +1,28 @@
+
+'''
+import tensorflow as tf
+from tensorflow import keras
+from tensorflow.keras import layers
+from tensorflow.keras.models import Sequential
+from tensorflow.keras.layers import concatenate, Flatten
+from tensorflow.keras.layers import Input, Conv2D, UpSampling2D
+from tensorflow.keras.models import Model
+
+import numpy as np
+'''
+import torch
+import torch.optim as optim
+import torch.nn as nn
+import torch.nn.parallel
+import argparse
+import torchvision.transforms as transforms
+import torch.backends.cudnn as cudnn
+import torch.utils.data
+import torchvision.datasets as dset
+import torchvision.utils as vutils
+import os
+import numpy as np
+import matplotlib.pyplot as plt
+import random
+
+print("TF Version:", tf.__version__)
\ No newline at end of file
From afa251c131959e6ab290371bdd5900553eb393df Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Sat, 15 Oct 2022 14:19:24 +1000
Subject: [PATCH 05/31] Changed File name
Due to errors in data loading, file name has been changes (will revert to more appropriate name at end of project)
---
recognition/46413587_ImprovedUNet/README.md | 10 -----
recognition/46413587_ImprovedUNet/dataset.py | 43 --------------------
recognition/46413587_ImprovedUNet/modules.py | 28 -------------
recognition/46413587_ImprovedUNet/predict.py | 0
recognition/46413587_ImprovedUNet/train.py | 0
recognition/46413587_ImprovedUNet/utils.py | 0
6 files changed, 81 deletions(-)
delete mode 100644 recognition/46413587_ImprovedUNet/README.md
delete mode 100644 recognition/46413587_ImprovedUNet/dataset.py
delete mode 100644 recognition/46413587_ImprovedUNet/modules.py
delete mode 100644 recognition/46413587_ImprovedUNet/predict.py
delete mode 100644 recognition/46413587_ImprovedUNet/train.py
delete mode 100644 recognition/46413587_ImprovedUNet/utils.py
diff --git a/recognition/46413587_ImprovedUNet/README.md b/recognition/46413587_ImprovedUNet/README.md
deleted file mode 100644
index 1ffe79516c..0000000000
--- a/recognition/46413587_ImprovedUNet/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-Attempt at easy difficulty task.
-
-1. The readme file should contain a title, a description of the algorithm and the problem that it solves
-(approximately a paragraph), how it works in a paragraph and a figure/visualization.
-2. It should also list any dependencies required, including versions and address reproducibility of results,
-if applicable.
-3. provide example inputs, outputs and plots of your algorithm
-4. The read me file should be properly formatted using GitHub markdown
-5. Describe any specific pre-processing you have used with references if any. Justify your training, validation
-and testing splits of the data.
diff --git a/recognition/46413587_ImprovedUNet/dataset.py b/recognition/46413587_ImprovedUNet/dataset.py
deleted file mode 100644
index 01f33b0096..0000000000
--- a/recognition/46413587_ImprovedUNet/dataset.py
+++ /dev/null
@@ -1,43 +0,0 @@
-import torch
-import torch.optim as optim
-import torch.nn as nn
-import torch.nn.parallel
-import argparse
-import torchvision.transforms as transforms
-import torch.backends.cudnn as cudnn
-import torch.utils.data
-import torchvision.datasets as dset
-import torchvision.utils as vutils
-import os
-import numpy as np
-import matplotlib.pyplot as plt
-import random
-
-TrainImRoot="\DataSets\ISIC-2017_Training_Data"
-TrainLbRoot="\DataSets\ISIC-2017_Training_Truth"
-#TestImRoot="\DataSets\ISIC-2017_Test_Data"
-TestLbRoot="\DataSets\ISIC-2017_Test_Truth"
-ValImRoot="\DataSets\ISIC-2017_Validation_Data"
-ValLbRoot="\DataSets\ISIC-2017_Validation_Truth"
-workers = 2
-batch_size=128
-image_size=64
-channels=3
-num_epochs=20
-learn_rate=0.0002
-beta1=0.5
-
-trainset=dset.ImageFolder(root = TrainImRoot,
- transform=transforms.Compose([
- transforms.Resize(image_size),
- transforms.CenterCrop(image_size),
- transforms.ToTensor(),
- transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5)),
- ]))
-
-dataloader=torch.utils.data.DataLoader(TrainImRoot, shuffle = True, batch_size=batch_size,
- numworkers = workers)
-
-device=torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
-
-print("no errors")
\ No newline at end of file
diff --git a/recognition/46413587_ImprovedUNet/modules.py b/recognition/46413587_ImprovedUNet/modules.py
deleted file mode 100644
index 2ef8c19b08..0000000000
--- a/recognition/46413587_ImprovedUNet/modules.py
+++ /dev/null
@@ -1,28 +0,0 @@
-
-'''
-import tensorflow as tf
-from tensorflow import keras
-from tensorflow.keras import layers
-from tensorflow.keras.models import Sequential
-from tensorflow.keras.layers import concatenate, Flatten
-from tensorflow.keras.layers import Input, Conv2D, UpSampling2D
-from tensorflow.keras.models import Model
-
-import numpy as np
-'''
-import torch
-import torch.optim as optim
-import torch.nn as nn
-import torch.nn.parallel
-import argparse
-import torchvision.transforms as transforms
-import torch.backends.cudnn as cudnn
-import torch.utils.data
-import torchvision.datasets as dset
-import torchvision.utils as vutils
-import os
-import numpy as np
-import matplotlib.pyplot as plt
-import random
-
-print("TF Version:", tf.__version__)
\ No newline at end of file
diff --git a/recognition/46413587_ImprovedUNet/predict.py b/recognition/46413587_ImprovedUNet/predict.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/recognition/46413587_ImprovedUNet/train.py b/recognition/46413587_ImprovedUNet/train.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/recognition/46413587_ImprovedUNet/utils.py b/recognition/46413587_ImprovedUNet/utils.py
deleted file mode 100644
index e69de29bb2..0000000000
From 600d662fcb4b80d45621f85c06f9dc0ba38b757a Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Sat, 15 Oct 2022 14:20:17 +1000
Subject: [PATCH 06/31] DataSet
Can now load in data as keras objects
---
recognition/AA_VQVAE_Mine/README.md | 10 ++++
recognition/AA_VQVAE_Mine/dataset.py | 82 ++++++++++++++++++++++++++++
recognition/AA_VQVAE_Mine/utils.py | 0
3 files changed, 92 insertions(+)
create mode 100644 recognition/AA_VQVAE_Mine/README.md
create mode 100644 recognition/AA_VQVAE_Mine/dataset.py
create mode 100644 recognition/AA_VQVAE_Mine/utils.py
diff --git a/recognition/AA_VQVAE_Mine/README.md b/recognition/AA_VQVAE_Mine/README.md
new file mode 100644
index 0000000000..1ffe79516c
--- /dev/null
+++ b/recognition/AA_VQVAE_Mine/README.md
@@ -0,0 +1,10 @@
+Attempt at easy difficulty task.
+
+1. The readme file should contain a title, a description of the algorithm and the problem that it solves
+(approximately a paragraph), how it works in a paragraph and a figure/visualization.
+2. It should also list any dependencies required, including versions and address reproducibility of results,
+if applicable.
+3. provide example inputs, outputs and plots of your algorithm
+4. The read me file should be properly formatted using GitHub markdown
+5. Describe any specific pre-processing you have used with references if any. Justify your training, validation
+and testing splits of the data.
diff --git a/recognition/AA_VQVAE_Mine/dataset.py b/recognition/AA_VQVAE_Mine/dataset.py
new file mode 100644
index 0000000000..1f9eca845f
--- /dev/null
+++ b/recognition/AA_VQVAE_Mine/dataset.py
@@ -0,0 +1,82 @@
+import numpy as np
+import matplotlib.pyplot as plt
+
+from tensorflow import keras
+from tensorflow.keras import layers
+import tensorflow_probability as tfp
+import tensorflow as tf
+
+import os
+
+
+im_root = path = os.path.join(os.getcwd(), "recognition\AA_VQVAE_Mine\DataSets\AD_NC")
+
+
+training_set = tf.keras.utils.image_dataset_from_directory(
+ os.path.join(im_root,"train"),
+ labels='inferred',
+ label_mode='categorical',
+ color_mode='grayscale',
+ batch_size=None,
+ image_size=(256, 256),
+ shuffle=True,
+ seed=46,
+ validation_split=0.3,
+ subset='training',
+ interpolation='bilinear',
+ crop_to_aspect_ratio=True
+ )
+
+validation_set = tf.keras.utils.image_dataset_from_directory(
+ os.path.join(im_root,"train"),
+ labels='inferred',
+ label_mode='categorical',
+ color_mode='grayscale',
+ batch_size=None,
+ image_size=(256, 256),
+ shuffle=True,
+ seed=46,
+ validation_split=0.3,
+ subset='validation',
+ interpolation='bilinear',
+ crop_to_aspect_ratio=True
+ )
+
+test_set = tf.keras.utils.image_dataset_from_directory(
+ os.path.join(im_root,"test"),
+ labels='inferred',
+ label_mode='categorical',
+ color_mode='grayscale',
+ batch_size=None,
+ image_size=(256, 256),
+ shuffle=True,
+ seed=46,
+ interpolation='bilinear',
+ crop_to_aspect_ratio=True
+ )
+
+class_names = training_set.class_names
+print(class_names)
+
+'''
+x_train = np.expand_dims(x_train, -1)
+x_test = np.expand_dims(x_test, -1)
+x_val = np.expand_dims(x_val, -1)
+x_train_scaled = (x_train / 255.0) - 0.5
+x_test_scaled = (x_test / 255.0) - 0.5
+x_val_scaled = (x_val / 255.0) - 0.5
+
+data_variance = np.var(x_train / 255.0)
+'''
+
+
+#And plot images
+plt.figure(figsize=(10, 10))
+for images, labels in training_set.take(1):
+ for i in range(9):
+ ax = plt.subplot(3, 3, i + 1)
+ plt.imshow(images[i].numpy().astype("uint8"))
+ #plt.title(class_names[label_list[i]])
+ plt.axis("off")
+
+plt.show()
\ No newline at end of file
diff --git a/recognition/AA_VQVAE_Mine/utils.py b/recognition/AA_VQVAE_Mine/utils.py
new file mode 100644
index 0000000000..e69de29bb2
From a17e779b7bfdbc5959f0209032ef06e98120a190 Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Sat, 15 Oct 2022 15:15:08 +1000
Subject: [PATCH 07/31] dataset image display
Updated and debugged to sample images for display
---
recognition/AA_VQVAE_Mine/dataset.py | 27 +++++++++++++++------------
1 file changed, 15 insertions(+), 12 deletions(-)
diff --git a/recognition/AA_VQVAE_Mine/dataset.py b/recognition/AA_VQVAE_Mine/dataset.py
index 1f9eca845f..ee07080f46 100644
--- a/recognition/AA_VQVAE_Mine/dataset.py
+++ b/recognition/AA_VQVAE_Mine/dataset.py
@@ -8,6 +8,9 @@
import os
+image_height = 240
+image_width = 256
+b_size = 32
im_root = path = os.path.join(os.getcwd(), "recognition\AA_VQVAE_Mine\DataSets\AD_NC")
@@ -15,10 +18,10 @@
training_set = tf.keras.utils.image_dataset_from_directory(
os.path.join(im_root,"train"),
labels='inferred',
- label_mode='categorical',
+ label_mode='int',
color_mode='grayscale',
- batch_size=None,
- image_size=(256, 256),
+ image_size=(image_width, image_height),
+ batch_size = b_size,
shuffle=True,
seed=46,
validation_split=0.3,
@@ -30,10 +33,10 @@
validation_set = tf.keras.utils.image_dataset_from_directory(
os.path.join(im_root,"train"),
labels='inferred',
- label_mode='categorical',
+ label_mode='int',
color_mode='grayscale',
- batch_size=None,
- image_size=(256, 256),
+ image_size=(image_width, image_height),
+ batch_size = b_size,
shuffle=True,
seed=46,
validation_split=0.3,
@@ -45,10 +48,10 @@
test_set = tf.keras.utils.image_dataset_from_directory(
os.path.join(im_root,"test"),
labels='inferred',
- label_mode='categorical',
+ label_mode='int',
color_mode='grayscale',
- batch_size=None,
- image_size=(256, 256),
+ image_size=(image_width, image_height),
+ batch_size = b_size,
shuffle=True,
seed=46,
interpolation='bilinear',
@@ -75,8 +78,8 @@
for images, labels in training_set.take(1):
for i in range(9):
ax = plt.subplot(3, 3, i + 1)
- plt.imshow(images[i].numpy().astype("uint8"))
- #plt.title(class_names[label_list[i]])
+ plt.imshow(images[i].numpy().astype("uint8"),cmap='gray')
+ plt.title(class_names[labels[i]])
plt.axis("off")
-plt.show()
\ No newline at end of file
+plt.show()
From 86096c8deea93be31018704028d359bc0c047dfa Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Sun, 16 Oct 2022 13:48:21 +1000
Subject: [PATCH 08/31] Added Pickle to speed up module testing
Note that train code references module which is not yet successful and thus not committed.
Code adapted from https://github.com/keras-team/keras-io/blob/master/examples/generative/vq_vae.py which is linked to in paper 11 from assignment resources
---
recognition/AA_VQVAE_Mine/dataset.py | 33 +++++++++++++----
recognition/AA_VQVAE_Mine/train.py | 53 ++++++++++++++++++++++++++++
2 files changed, 79 insertions(+), 7 deletions(-)
create mode 100644 recognition/AA_VQVAE_Mine/train.py
diff --git a/recognition/AA_VQVAE_Mine/dataset.py b/recognition/AA_VQVAE_Mine/dataset.py
index ee07080f46..a37a4b2e28 100644
--- a/recognition/AA_VQVAE_Mine/dataset.py
+++ b/recognition/AA_VQVAE_Mine/dataset.py
@@ -9,7 +9,7 @@
import os
image_height = 240
-image_width = 256
+image_width = 240
b_size = 32
im_root = path = os.path.join(os.getcwd(), "recognition\AA_VQVAE_Mine\DataSets\AD_NC")
@@ -21,7 +21,7 @@
label_mode='int',
color_mode='grayscale',
image_size=(image_width, image_height),
- batch_size = b_size,
+ batch_size = None,
shuffle=True,
seed=46,
validation_split=0.3,
@@ -36,7 +36,7 @@
label_mode='int',
color_mode='grayscale',
image_size=(image_width, image_height),
- batch_size = b_size,
+ batch_size = None,
shuffle=True,
seed=46,
validation_split=0.3,
@@ -51,7 +51,7 @@
label_mode='int',
color_mode='grayscale',
image_size=(image_width, image_height),
- batch_size = b_size,
+ batch_size = None,
shuffle=True,
seed=46,
interpolation='bilinear',
@@ -59,9 +59,13 @@
)
class_names = training_set.class_names
-print(class_names)
+#print(class_names)
-'''
+
+"""Convert images to floating point with the range [0.5, 0.5]"""
+(x_train, y_train) = tuple(zip(*training_set))
+(x_val,y_val) = tuple(zip(*validation_set))
+(x_test,y_test) = tuple(zip(*test_set))
x_train = np.expand_dims(x_train, -1)
x_test = np.expand_dims(x_test, -1)
x_val = np.expand_dims(x_val, -1)
@@ -70,9 +74,9 @@
x_val_scaled = (x_val / 255.0) - 0.5
data_variance = np.var(x_train / 255.0)
-'''
+'''
#And plot images
plt.figure(figsize=(10, 10))
for images, labels in training_set.take(1):
@@ -83,3 +87,18 @@
plt.axis("off")
plt.show()
+'''
+import pickle
+
+# example, replace with your result
+filename = "resulta.pickle"
+with open(filename, "wb") as file:
+ pickle.dump(x_train, file)
+
+filename = "resultb.pickle"
+with open(filename, "wb") as file:
+ pickle.dump(data_variance, file)
+
+filename = "resultc.pickle"
+with open(filename, "wb") as file:
+ pickle.dump(x_test_scaled, file)
\ No newline at end of file
diff --git a/recognition/AA_VQVAE_Mine/train.py b/recognition/AA_VQVAE_Mine/train.py
new file mode 100644
index 0000000000..876614785b
--- /dev/null
+++ b/recognition/AA_VQVAE_Mine/train.py
@@ -0,0 +1,53 @@
+import numpy as np
+import matplotlib.pyplot as plt
+
+from tensorflow import keras
+from tensorflow.keras import layers
+import tensorflow_probability as tfp
+import tensorflow as tf
+
+
+import pickle
+
+# same filename
+filename = "resulta.pickle"
+with open(filename, "rb") as file:
+ x_train = pickle.load(file)
+
+filename = "resultb.pickle"
+with open(filename, "rb") as file:
+ data_variance = pickle.load(file)
+
+filename = "resultc.pickle"
+with open(filename, "rb") as file:
+ x_test_scaled = pickle.load(file)
+
+import modules
+
+
+vqvae_trainer = modules.VQVAETrainer(data_variance, latent_dim=16, num_embeddings=128)
+vqvae_trainer.compile(optimizer=keras.optimizers.Adam())
+vqvae_trainer.fit(x_train, epochs=3, batch_size=28)
+
+
+def show_subplot(original, reconstructed):
+ plt.subplot(1, 2, 1)
+ plt.imshow(original.squeeze() + 0.5,cmap='gray')
+ plt.title("Original")
+ plt.axis("off")
+
+ plt.subplot(1, 2, 2)
+ plt.imshow(reconstructed.squeeze() + 0.5,cmap='gray')
+ plt.title("Reconstructed")
+ plt.axis("off")
+
+ plt.show()
+
+
+trained_vqvae_model = vqvae_trainer.vqvae
+idx = np.random.choice(len(x_test_scaled), 10)
+test_images = x_test_scaled[idx]
+reconstructions_test = trained_vqvae_model.predict(test_images)
+
+for test_image, reconstructed_image in zip(test_images, reconstructions_test):
+ show_subplot(test_image, reconstructed_image)
\ No newline at end of file
From ff2332629eb1af19fb08c4bd67d543bded3aabd1 Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Sun, 16 Oct 2022 13:49:27 +1000
Subject: [PATCH 09/31] Updates .gitignore w/ pickle files
---
.gitignore | 1 +
1 file changed, 1 insertion(+)
diff --git a/.gitignore b/.gitignore
index c1b98d256f..d8f0547fcc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -133,3 +133,4 @@ dmypy.json
# no tracking mypy config file
mypy.ini
+*.pickle
From 473dadf84263486956a94c39c5c37e54117841b3 Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Tue, 18 Oct 2022 20:33:16 +1000
Subject: [PATCH 10/31] End VQVAE
Marking the end of all progress towards the VQVAE Task and moving back to UNet
---
recognition/AA_VQVAE_Mine/dataset.py | 22 ++--
recognition/AA_VQVAE_Mine/modules.py | 146 +++++++++++++++++++++++++++
recognition/AA_VQVAE_Mine/predict.py | 21 ++++
recognition/AA_VQVAE_Mine/train.py | 10 +-
4 files changed, 189 insertions(+), 10 deletions(-)
create mode 100644 recognition/AA_VQVAE_Mine/modules.py
create mode 100644 recognition/AA_VQVAE_Mine/predict.py
diff --git a/recognition/AA_VQVAE_Mine/dataset.py b/recognition/AA_VQVAE_Mine/dataset.py
index a37a4b2e28..296fdd98e9 100644
--- a/recognition/AA_VQVAE_Mine/dataset.py
+++ b/recognition/AA_VQVAE_Mine/dataset.py
@@ -63,20 +63,24 @@
"""Convert images to floating point with the range [0.5, 0.5]"""
-(x_train, y_train) = tuple(zip(*training_set))
-(x_val,y_val) = tuple(zip(*validation_set))
-(x_test,y_test) = tuple(zip(*test_set))
-x_train = np.expand_dims(x_train, -1)
-x_test = np.expand_dims(x_test, -1)
-x_val = np.expand_dims(x_val, -1)
+(x_train, y_train) = zip(*training_set)
+#x_train = np.expand_dims(x_train, -1)
+x_train = np.asarray(x_train)
x_train_scaled = (x_train / 255.0) - 0.5
-x_test_scaled = (x_test / 255.0) - 0.5
+(x_val,y_val) = zip(*validation_set)
+#x_val = np.expand_dims(x_val, -1)
+x_val = np.asarray(x_val)
x_val_scaled = (x_val / 255.0) - 0.5
+(x_test,y_test) = zip(*test_set)
+#x_test = np.expand_dims(x_test, -1)
+x_test = np.asarray(x_test)
+x_test_scaled = (x_test / 255.0) - 0.5
+
data_variance = np.var(x_train / 255.0)
-'''
+
#And plot images
plt.figure(figsize=(10, 10))
for images, labels in training_set.take(1):
@@ -87,7 +91,7 @@
plt.axis("off")
plt.show()
-'''
+
import pickle
# example, replace with your result
diff --git a/recognition/AA_VQVAE_Mine/modules.py b/recognition/AA_VQVAE_Mine/modules.py
new file mode 100644
index 0000000000..408e67860f
--- /dev/null
+++ b/recognition/AA_VQVAE_Mine/modules.py
@@ -0,0 +1,146 @@
+import numpy as np
+import matplotlib.pyplot as plt
+
+from tensorflow import keras
+from tensorflow.keras import layers
+import tensorflow_probability as tfp
+import tensorflow as tf
+
+class VectorQuantizer(layers.Layer):
+ def __init__(self, num_embeddings, embedding_dim, beta=0.55, **kwargs):
+ super().__init__(**kwargs)
+ self.embedding_dim = embedding_dim
+ self.num_embeddings = num_embeddings
+
+ # The `beta` parameter is best kept between [0.25, 2] as per the paper.
+ self.beta = beta
+
+ # Initialize the embeddings which we will quantize.
+ w_init = tf.random_uniform_initializer()
+ self.embeddings = tf.Variable(
+ initial_value=w_init(
+ shape=(self.embedding_dim, self.num_embeddings), dtype="float32"
+ ),
+ trainable=True,
+ name="embeddings_vqvae",
+ )
+
+ def call(self, x):
+ # Calculate the input shape of the inputs and
+ # then flatten the inputs keeping `embedding_dim` intact.
+ input_shape = tf.shape(x)
+ flattened = tf.reshape(x, [-1, self.embedding_dim])
+
+ # Quantization.
+ encoding_indices = self.get_code_indices(flattened)
+ encodings = tf.one_hot(encoding_indices, self.num_embeddings)
+ quantized = tf.matmul(encodings, self.embeddings, transpose_b=True)
+
+ # Reshape the quantized values back to the original input shape
+ quantized = tf.reshape(quantized, input_shape)
+
+ # Calculate vector quantization loss and add that to the layer. You can learn more
+ # about adding losses to different layers here:
+ # https://keras.io/guides/making_new_layers_and_models_via_subclassing/. Check
+ # the original paper to get a handle on the formulation of the loss function.
+ commitment_loss = tf.reduce_mean((tf.stop_gradient(quantized) - x) ** 2)
+ codebook_loss = tf.reduce_mean((quantized - tf.stop_gradient(x)) ** 2)
+ self.add_loss(self.beta * commitment_loss + codebook_loss)
+
+ # Straight-through estimator.
+ quantized = x + tf.stop_gradient(quantized - x)
+ return quantized
+
+ def get_code_indices(self, flattened_inputs):
+ # Calculate L2-normalized distance between the inputs and the codes.
+ similarity = tf.matmul(flattened_inputs, self.embeddings)
+ distances = (
+ tf.reduce_sum(flattened_inputs ** 2, axis=1, keepdims=True)
+ + tf.reduce_sum(self.embeddings ** 2, axis=0)
+ - 2 * similarity
+ )
+
+ # Derive the indices for minimum distances.
+ encoding_indices = tf.argmin(distances, axis=1)
+ return encoding_indices
+
+def get_encoder(latent_dim=16):
+ encoder_inputs = keras.Input(shape=(240, 240, 1))
+ x = layers.Conv2D(32, 3, activation="relu", strides=2, padding="same")(
+ encoder_inputs
+ )
+ x = layers.Conv2D(64, 3, activation="relu", strides=2, padding="same")(x)
+ encoder_outputs = layers.Conv2D(latent_dim, 1, padding="same")(x)
+ return keras.Model(encoder_inputs, encoder_outputs, name="encoder")
+
+
+def get_decoder(latent_dim=16):
+ latent_inputs = keras.Input(shape=get_encoder(latent_dim).output.shape[1:])
+ x = layers.Conv2DTranspose(64, 3, activation="relu", strides=2, padding="same")(
+ latent_inputs
+ )
+ x = layers.Conv2DTranspose(32, 3, activation="relu", strides=2, padding="same")(x)
+ decoder_outputs = layers.Conv2DTranspose(1, 3, padding="same")(x)
+ return keras.Model(latent_inputs, decoder_outputs, name="decoder")
+
+def get_vqvae(latent_dim=16, num_embeddings=64):
+ vq_layer = VectorQuantizer(num_embeddings, latent_dim, name="vector_quantizer")
+ encoder = get_encoder(latent_dim)
+ decoder = get_decoder(latent_dim)
+ inputs = keras.Input(shape=(240, 240, 1))
+ encoder_outputs = encoder(inputs)
+ quantized_latents = vq_layer(encoder_outputs)
+ reconstructions = decoder(quantized_latents)
+ return keras.Model(inputs, reconstructions, name="vq_vae")
+
+class VQVAETrainer(keras.models.Model):
+ def __init__(self, train_variance, latent_dim=32, num_embeddings=128, **kwargs):
+ super(VQVAETrainer, self).__init__(**kwargs)
+ self.train_variance = train_variance
+ self.latent_dim = latent_dim
+ self.num_embeddings = num_embeddings
+
+ self.vqvae = get_vqvae(self.latent_dim, self.num_embeddings)
+
+ self.total_loss_tracker = keras.metrics.Mean(name="total_loss")
+ self.reconstruction_loss_tracker = keras.metrics.Mean(
+ name="reconstruction_loss"
+ )
+ self.vq_loss_tracker = keras.metrics.Mean(name="vq_loss")
+
+ @property
+ def metrics(self):
+ return [
+ self.total_loss_tracker,
+ self.reconstruction_loss_tracker,
+ self.vq_loss_tracker,
+ ]
+
+ def train_step(self, x):
+ with tf.GradientTape() as tape:
+ # Outputs from the VQ-VAE.
+ reconstructions = self.vqvae(x)
+
+ # Calculate the losses.
+ reconstruction_loss = (
+ tf.reduce_mean((x - reconstructions) ** 2) / self.train_variance
+ )
+ total_loss = reconstruction_loss + sum(self.vqvae.losses)
+
+ # Backpropagation.
+ grads = tape.gradient(total_loss, self.vqvae.trainable_variables)
+ self.optimizer.apply_gradients(zip(grads, self.vqvae.trainable_variables))
+
+ # Loss tracking.
+ self.total_loss_tracker.update_state(total_loss)
+ self.reconstruction_loss_tracker.update_state(reconstruction_loss)
+ self.vq_loss_tracker.update_state(sum(self.vqvae.losses))
+
+ # Log results.
+ return {
+ "loss": self.total_loss_tracker.result(),
+ "reconstruction_loss": self.reconstruction_loss_tracker.result(),
+ "vqvae_loss": self.vq_loss_tracker.result(),
+ }
+
+
diff --git a/recognition/AA_VQVAE_Mine/predict.py b/recognition/AA_VQVAE_Mine/predict.py
new file mode 100644
index 0000000000..1b20708a45
--- /dev/null
+++ b/recognition/AA_VQVAE_Mine/predict.py
@@ -0,0 +1,21 @@
+def show_subplot(original, reconstructed):
+ plt.subplot(1, 2, 1)
+ plt.imshow(original.squeeze() + 0.5)
+ plt.title("Original")
+ plt.axis("off")
+
+ plt.subplot(1, 2, 2)
+ plt.imshow(reconstructed.squeeze() + 0.5)
+ plt.title("Reconstructed")
+ plt.axis("off")
+
+ plt.show()
+
+
+trained_vqvae_model = vqvae_trainer.vqvae
+idx = np.random.choice(len(x_test_scaled), 10)
+test_images = x_test_scaled[idx]
+reconstructions_test = trained_vqvae_model.predict(test_images)
+
+for test_image, reconstructed_image in zip(test_images, reconstructions_test):
+ show_subplot(test_image, reconstructed_image)
\ No newline at end of file
diff --git a/recognition/AA_VQVAE_Mine/train.py b/recognition/AA_VQVAE_Mine/train.py
index 876614785b..7b516a03d5 100644
--- a/recognition/AA_VQVAE_Mine/train.py
+++ b/recognition/AA_VQVAE_Mine/train.py
@@ -24,10 +24,18 @@
import modules
+plt.figure(figsize=(10, 10))
+for images in x_train.take(1):
+ for i in range(9):
+ ax = plt.subplot(3, 3, i + 1)
+ plt.imshow(images[i].numpy().astype("uint8"),cmap='gray')
+ plt.axis("off")
+
+plt.show()
vqvae_trainer = modules.VQVAETrainer(data_variance, latent_dim=16, num_embeddings=128)
vqvae_trainer.compile(optimizer=keras.optimizers.Adam())
-vqvae_trainer.fit(x_train, epochs=3, batch_size=28)
+vqvae_trainer.fit(x_train, epochs=1, batch_size=128)
def show_subplot(original, reconstructed):
From df4a7e6f5a3464132e2d1e8d1901014510162bd8 Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Tue, 18 Oct 2022 21:40:59 +1000
Subject: [PATCH 11/31] Load in image/mask pair
Successfully load in and display image and mask pairs
---
recognition/AA_VQVAE_Mine/dataset.py | 91 ++++++++++++++++-
recognition/AA_VQVAE_Mine/modules.py | 144 ++-------------------------
2 files changed, 94 insertions(+), 141 deletions(-)
diff --git a/recognition/AA_VQVAE_Mine/dataset.py b/recognition/AA_VQVAE_Mine/dataset.py
index 296fdd98e9..aa57ef803e 100644
--- a/recognition/AA_VQVAE_Mine/dataset.py
+++ b/recognition/AA_VQVAE_Mine/dataset.py
@@ -1,17 +1,101 @@
import numpy as np
import matplotlib.pyplot as plt
+import cv2
from tensorflow import keras
from tensorflow.keras import layers
+from tensorflow.keras.preprocessing.image import load_img, img_to_array
+from tensorflow.keras.utils import to_categorical ,Sequence
import tensorflow_probability as tfp
import tensorflow as tf
import os
+from PIL import Image
+from glob import glob
+from pathlib import Path
+from random import sample, choice
-image_height = 240
-image_width = 240
+img_w = 4288
+img_h = 2848
b_size = 32
+partition = {}
+labels = {}
+
+im_root = Path(os.path.join(os.getcwd(), "recognition\AA_VQVAE_Mine\DataSets\ISIC"))
+
+paths = [
+ "ISIC-2017_Training_Data",
+ "ISIC-2017_Training_Truth",
+ "ISIC-2017_Test_Data",
+ "ISIC-2017_Test_Truth",
+ "ISIC-2017_Validation_Data",
+ "ISIC-2017_Validation_Truth"
+]
+'''
+for p in paths:
+ folder_fp = os.path.join(im_root, p)
+ for im_fn in os.listdir(folder_fp):
+ im_fp = os.path.join(folder_fp, im_fn)
+ new_im = os.path.join(folder_fp, im_fn)
+ im = Image.open(new_im).convert("L")
+ im.save(new_im)
+'''
+train_imgs = list((im_root / "ISIC-2017_Training_Data").glob("*.jpg"))
+train_labels = list((im_root / "ISIC-2017_Training_Truth").glob("*.png"))
+test_imgs = list((im_root / "ISIC-2017_Test_Data").glob("*.jpg"))
+test_labels = list((im_root / "ISIC-2017_Test_Truth").glob("*.png"))
+val_imgs = list((im_root / "ISIC-2017_Validation_Data").glob("*.jpg"))
+val_labels = list((im_root / "ISIC-2017_Validation_Truth").glob("*.png"))
+
+(len(train_imgs),len(train_labels)), (len(val_imgs),len(val_labels)) , (len(test_imgs),len(test_labels))
+
+def make_pair(img,label,dataset):
+ pairs = []
+ for im in img:
+ pairs.append((im , dataset / label / (im.stem +"_segmentation.png")))
+
+ return pairs
+
+train_pair = make_pair(train_imgs, "ISIC-2017_Training_Truth", im_root)
+test_pair = make_pair(val_imgs, "ISIC-2017_Test_Truth", im_root)
+val_pair = make_pair(test_imgs, "ISIC-2017_Validation_Truth", im_root)
+
+temp = choice(train_pair)
+img = img_to_array(load_img(temp[0], target_size=(img_w,img_h)))
+mask = img_to_array(load_img(temp[1], target_size = (img_w,img_h)))
+plt.figure(figsize=(10,10))
+plt.subplot(121)
+plt.imshow(img/255)
+plt.subplot(122)
+plt.imshow(mask/255)
+plt.show()
+
+class_map = []
+for index,item in class_map_df.iterrows():
+ class_map.append(np.array([item['b'], item['w']]))
+
+
+'''
+seed = 909 # (IMPORTANT) to transform image and corresponding mask with same augmentation parameter.
+image_datagen = ImageDataGenerator(width_shift_range=0.1,
+ height_shift_range=0.1,
+ preprocessing_function = image_preprocessing) # custom fuction for each image you can use resnet one too.
+mask_datagen = ImageDataGenerator(width_shift_range=0.1,
+ height_shift_range=0.1,
+ preprocessing_function = mask_preprocessing) # to make mask as feedable formate (256,256,1)
+
+image_generator =image_datagen.flow_from_directory(os.path.join(im_root, "ISIC-2017_Training_Data"),
+ class_mode=None, seed=seed)
+
+mask_generator = mask_datagen.flow_from_directory(os.path.join(im_root, "ISIC-2017_Training_Truth"),
+ class_mode=None, seed=seed)
+'''
+
+print("no errors")
+
+
+'''
im_root = path = os.path.join(os.getcwd(), "recognition\AA_VQVAE_Mine\DataSets\AD_NC")
@@ -105,4 +189,5 @@
filename = "resultc.pickle"
with open(filename, "wb") as file:
- pickle.dump(x_test_scaled, file)
\ No newline at end of file
+ pickle.dump(x_test_scaled, file)
+ '''
\ No newline at end of file
diff --git a/recognition/AA_VQVAE_Mine/modules.py b/recognition/AA_VQVAE_Mine/modules.py
index 408e67860f..1edc38ad9f 100644
--- a/recognition/AA_VQVAE_Mine/modules.py
+++ b/recognition/AA_VQVAE_Mine/modules.py
@@ -6,141 +6,9 @@
import tensorflow_probability as tfp
import tensorflow as tf
-class VectorQuantizer(layers.Layer):
- def __init__(self, num_embeddings, embedding_dim, beta=0.55, **kwargs):
- super().__init__(**kwargs)
- self.embedding_dim = embedding_dim
- self.num_embeddings = num_embeddings
-
- # The `beta` parameter is best kept between [0.25, 2] as per the paper.
- self.beta = beta
-
- # Initialize the embeddings which we will quantize.
- w_init = tf.random_uniform_initializer()
- self.embeddings = tf.Variable(
- initial_value=w_init(
- shape=(self.embedding_dim, self.num_embeddings), dtype="float32"
- ),
- trainable=True,
- name="embeddings_vqvae",
- )
-
- def call(self, x):
- # Calculate the input shape of the inputs and
- # then flatten the inputs keeping `embedding_dim` intact.
- input_shape = tf.shape(x)
- flattened = tf.reshape(x, [-1, self.embedding_dim])
-
- # Quantization.
- encoding_indices = self.get_code_indices(flattened)
- encodings = tf.one_hot(encoding_indices, self.num_embeddings)
- quantized = tf.matmul(encodings, self.embeddings, transpose_b=True)
-
- # Reshape the quantized values back to the original input shape
- quantized = tf.reshape(quantized, input_shape)
-
- # Calculate vector quantization loss and add that to the layer. You can learn more
- # about adding losses to different layers here:
- # https://keras.io/guides/making_new_layers_and_models_via_subclassing/. Check
- # the original paper to get a handle on the formulation of the loss function.
- commitment_loss = tf.reduce_mean((tf.stop_gradient(quantized) - x) ** 2)
- codebook_loss = tf.reduce_mean((quantized - tf.stop_gradient(x)) ** 2)
- self.add_loss(self.beta * commitment_loss + codebook_loss)
-
- # Straight-through estimator.
- quantized = x + tf.stop_gradient(quantized - x)
- return quantized
-
- def get_code_indices(self, flattened_inputs):
- # Calculate L2-normalized distance between the inputs and the codes.
- similarity = tf.matmul(flattened_inputs, self.embeddings)
- distances = (
- tf.reduce_sum(flattened_inputs ** 2, axis=1, keepdims=True)
- + tf.reduce_sum(self.embeddings ** 2, axis=0)
- - 2 * similarity
- )
-
- # Derive the indices for minimum distances.
- encoding_indices = tf.argmin(distances, axis=1)
- return encoding_indices
-
-def get_encoder(latent_dim=16):
- encoder_inputs = keras.Input(shape=(240, 240, 1))
- x = layers.Conv2D(32, 3, activation="relu", strides=2, padding="same")(
- encoder_inputs
- )
- x = layers.Conv2D(64, 3, activation="relu", strides=2, padding="same")(x)
- encoder_outputs = layers.Conv2D(latent_dim, 1, padding="same")(x)
- return keras.Model(encoder_inputs, encoder_outputs, name="encoder")
-
-
-def get_decoder(latent_dim=16):
- latent_inputs = keras.Input(shape=get_encoder(latent_dim).output.shape[1:])
- x = layers.Conv2DTranspose(64, 3, activation="relu", strides=2, padding="same")(
- latent_inputs
- )
- x = layers.Conv2DTranspose(32, 3, activation="relu", strides=2, padding="same")(x)
- decoder_outputs = layers.Conv2DTranspose(1, 3, padding="same")(x)
- return keras.Model(latent_inputs, decoder_outputs, name="decoder")
-
-def get_vqvae(latent_dim=16, num_embeddings=64):
- vq_layer = VectorQuantizer(num_embeddings, latent_dim, name="vector_quantizer")
- encoder = get_encoder(latent_dim)
- decoder = get_decoder(latent_dim)
- inputs = keras.Input(shape=(240, 240, 1))
- encoder_outputs = encoder(inputs)
- quantized_latents = vq_layer(encoder_outputs)
- reconstructions = decoder(quantized_latents)
- return keras.Model(inputs, reconstructions, name="vq_vae")
-
-class VQVAETrainer(keras.models.Model):
- def __init__(self, train_variance, latent_dim=32, num_embeddings=128, **kwargs):
- super(VQVAETrainer, self).__init__(**kwargs)
- self.train_variance = train_variance
- self.latent_dim = latent_dim
- self.num_embeddings = num_embeddings
-
- self.vqvae = get_vqvae(self.latent_dim, self.num_embeddings)
-
- self.total_loss_tracker = keras.metrics.Mean(name="total_loss")
- self.reconstruction_loss_tracker = keras.metrics.Mean(
- name="reconstruction_loss"
- )
- self.vq_loss_tracker = keras.metrics.Mean(name="vq_loss")
-
- @property
- def metrics(self):
- return [
- self.total_loss_tracker,
- self.reconstruction_loss_tracker,
- self.vq_loss_tracker,
- ]
-
- def train_step(self, x):
- with tf.GradientTape() as tape:
- # Outputs from the VQ-VAE.
- reconstructions = self.vqvae(x)
-
- # Calculate the losses.
- reconstruction_loss = (
- tf.reduce_mean((x - reconstructions) ** 2) / self.train_variance
- )
- total_loss = reconstruction_loss + sum(self.vqvae.losses)
-
- # Backpropagation.
- grads = tape.gradient(total_loss, self.vqvae.trainable_variables)
- self.optimizer.apply_gradients(zip(grads, self.vqvae.trainable_variables))
-
- # Loss tracking.
- self.total_loss_tracker.update_state(total_loss)
- self.reconstruction_loss_tracker.update_state(reconstruction_loss)
- self.vq_loss_tracker.update_state(sum(self.vqvae.losses))
-
- # Log results.
- return {
- "loss": self.total_loss_tracker.result(),
- "reconstruction_loss": self.reconstruction_loss_tracker.result(),
- "vqvae_loss": self.vq_loss_tracker.result(),
- }
-
-
+batch_size=128
+image_size=64
+channels=3
+num_epochs=20
+learn_rate=0.0002
+beta1=0.5
\ No newline at end of file
From 3527f148b8a9d40c85db64f5379f21bbbef3be41 Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Tue, 18 Oct 2022 21:58:41 +1000
Subject: [PATCH 12/31] convert mask to 2D array of labels
Tweaking source code to work for black and white data instead of rgb values in a .cvs file
---
recognition/AA_VQVAE_Mine/dataset.py | 32 +++++++++++++++++++++++-----
1 file changed, 27 insertions(+), 5 deletions(-)
diff --git a/recognition/AA_VQVAE_Mine/dataset.py b/recognition/AA_VQVAE_Mine/dataset.py
index aa57ef803e..cd16866d2e 100644
--- a/recognition/AA_VQVAE_Mine/dataset.py
+++ b/recognition/AA_VQVAE_Mine/dataset.py
@@ -1,19 +1,24 @@
import numpy as np
import matplotlib.pyplot as plt
-import cv2
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.preprocessing.image import load_img, img_to_array
from tensorflow.keras.utils import to_categorical ,Sequence
+from tensorflow.keras import backend as K
import tensorflow_probability as tfp
import tensorflow as tf
+from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, concatenate, Conv2DTranspose, BatchNormalization, Activation, Dropout
+from tensorflow.keras.optimizers import Adadelta, Nadam ,Adam
+from tensorflow.keras.models import Model, load_model
+from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau, CSVLogger, TensorBoard
import os
from PIL import Image
from glob import glob
from pathlib import Path
from random import sample, choice
+import shutil
img_w = 4288
img_h = 2848
@@ -69,12 +74,29 @@ def make_pair(img,label,dataset):
plt.subplot(122)
plt.imshow(mask/255)
-plt.show()
+#plt.show()
+
+class_map = [(255),(0)]
-class_map = []
-for index,item in class_map_df.iterrows():
- class_map.append(np.array([item['b'], item['w']]))
+def assert_map_range(mask,class_map):
+ mask = mask.astype("uint8")
+ for j in range(img_w):
+ for k in range(img_h):
+ assert mask[j][k] in class_map , tuple(mask[j][k])
+
+def form_2D_label(mask,class_map):
+ mask = mask.astype("uint8")
+ label = np.zeros(mask.shape[:2],dtype= np.uint8)
+
+ for i, rgb in enumerate(class_map):
+ label[(mask == rgb).all(axis=2)] = i
+ return label
+
+lab = form_2D_label(mask,class_map)
+np.unique(lab,return_counts=True)
+
+
'''
seed = 909 # (IMPORTANT) to transform image and corresponding mask with same augmentation parameter.
From 5a5431b6adaa0218f77bddb4a4edf7b987690a4e Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Wed, 19 Oct 2022 08:29:01 +1000
Subject: [PATCH 13/31] Functional DataLoader
---
recognition/AA_VQVAE_Mine/dataset.py | 172 +++++++++++----------------
1 file changed, 71 insertions(+), 101 deletions(-)
diff --git a/recognition/AA_VQVAE_Mine/dataset.py b/recognition/AA_VQVAE_Mine/dataset.py
index cd16866d2e..40145e74f5 100644
--- a/recognition/AA_VQVAE_Mine/dataset.py
+++ b/recognition/AA_VQVAE_Mine/dataset.py
@@ -20,8 +20,8 @@
from random import sample, choice
import shutil
-img_w = 4288
-img_h = 2848
+img_h = 4288
+img_w = 2848
b_size = 32
partition = {}
labels = {}
@@ -52,7 +52,7 @@
val_imgs = list((im_root / "ISIC-2017_Validation_Data").glob("*.jpg"))
val_labels = list((im_root / "ISIC-2017_Validation_Truth").glob("*.png"))
-(len(train_imgs),len(train_labels)), (len(val_imgs),len(val_labels)) , (len(test_imgs),len(test_labels))
+(len(train_imgs),len(train_labels)), (len(test_imgs),len(test_labels)) , (len(val_imgs),len(val_labels))
def make_pair(img,label,dataset):
pairs = []
@@ -62,8 +62,8 @@ def make_pair(img,label,dataset):
return pairs
train_pair = make_pair(train_imgs, "ISIC-2017_Training_Truth", im_root)
-test_pair = make_pair(val_imgs, "ISIC-2017_Test_Truth", im_root)
-val_pair = make_pair(test_imgs, "ISIC-2017_Validation_Truth", im_root)
+test_pair = make_pair(test_imgs, "ISIC-2017_Test_Truth", im_root)
+val_pair = make_pair(val_imgs, "ISIC-2017_Validation_Truth", im_root)
temp = choice(train_pair)
img = img_to_array(load_img(temp[0], target_size=(img_w,img_h)))
@@ -96,107 +96,76 @@ def form_2D_label(mask,class_map):
lab = form_2D_label(mask,class_map)
np.unique(lab,return_counts=True)
+class DataGenerator(Sequence):
+ 'Generates data for Keras'
+
+ def __init__(self, pair, class_map, batch_size=16, dim=(224,224,3), shuffle=True):
+ 'Initialization'
+ self.dim = dim
+ self.pair = pair
+ self.class_map = class_map
+ self.batch_size = batch_size
+ self.shuffle = shuffle
+ self.on_epoch_end()
+
+ def __len__(self):
+ 'Denotes the number of batches per epoch'
+ return int(np.floor(len(self.pair) / self.batch_size))
+
+ def __getitem__(self, index):
+ 'Generate one batch of data'
+ # Generate indexes of the batch
+ indexes = self.indexes[index*self.batch_size:(index+1)*self.batch_size]
+
+ # Find list of IDs
+ list_IDs_temp = [k for k in indexes]
+
+ # Generate data
+ X, Y = self.__data_generation(list_IDs_temp)
+
+ return X, Y
+
+ def on_epoch_end(self):
+ 'Updates indexes after each epoch'
+ self.indexes = np.arange(len(self.pair))
+ if self.shuffle == True:
+ np.random.shuffle(self.indexes)
+
+ def __data_generation(self, list_IDs_temp):
+ 'Generates data containing batch_size samples' # X : (n_samples, *dim, n_channels)
+ # Initialization
+ batch_imgs = list()
+ batch_labels = list()
+
+ # Generate data
+ for i in list_IDs_temp:
+ # Store sample
+ img = load_img(self.pair[i][0] ,target_size=self.dim)
+ img = img_to_array(img)/255.
+ batch_imgs.append(img)
+
+ label = load_img(self.pair[i][1],target_size=self.dim)
+ label = img_to_array(label)
+ label = form_2D_label(label,self.class_map)
+ label = to_categorical(label , num_classes = 2)
+ batch_labels.append(label)
+
+ return np.array(batch_imgs) ,np.array(batch_labels)
+
+train_generator = DataGenerator(train_pair+test_pair,class_map,b_size, dim=(img_w,img_h,3) ,shuffle=True)
+train_steps = train_generator.__len__()
+
+X,Y = train_generator.__getitem__(1)
+print(Y.shape)
+
+val_generator = DataGenerator(val_pair, class_map, batch_size=4, dim=(img_w,img_h,3) ,shuffle=True)
+val_steps = val_generator.__len__()
-'''
-seed = 909 # (IMPORTANT) to transform image and corresponding mask with same augmentation parameter.
-image_datagen = ImageDataGenerator(width_shift_range=0.1,
- height_shift_range=0.1,
- preprocessing_function = image_preprocessing) # custom fuction for each image you can use resnet one too.
-mask_datagen = ImageDataGenerator(width_shift_range=0.1,
- height_shift_range=0.1,
- preprocessing_function = mask_preprocessing) # to make mask as feedable formate (256,256,1)
-
-image_generator =image_datagen.flow_from_directory(os.path.join(im_root, "ISIC-2017_Training_Data"),
- class_mode=None, seed=seed)
-
-mask_generator = mask_datagen.flow_from_directory(os.path.join(im_root, "ISIC-2017_Training_Truth"),
- class_mode=None, seed=seed)
-'''
-
print("no errors")
'''
-im_root = path = os.path.join(os.getcwd(), "recognition\AA_VQVAE_Mine\DataSets\AD_NC")
-
-
-training_set = tf.keras.utils.image_dataset_from_directory(
- os.path.join(im_root,"train"),
- labels='inferred',
- label_mode='int',
- color_mode='grayscale',
- image_size=(image_width, image_height),
- batch_size = None,
- shuffle=True,
- seed=46,
- validation_split=0.3,
- subset='training',
- interpolation='bilinear',
- crop_to_aspect_ratio=True
- )
-
-validation_set = tf.keras.utils.image_dataset_from_directory(
- os.path.join(im_root,"train"),
- labels='inferred',
- label_mode='int',
- color_mode='grayscale',
- image_size=(image_width, image_height),
- batch_size = None,
- shuffle=True,
- seed=46,
- validation_split=0.3,
- subset='validation',
- interpolation='bilinear',
- crop_to_aspect_ratio=True
- )
-
-test_set = tf.keras.utils.image_dataset_from_directory(
- os.path.join(im_root,"test"),
- labels='inferred',
- label_mode='int',
- color_mode='grayscale',
- image_size=(image_width, image_height),
- batch_size = None,
- shuffle=True,
- seed=46,
- interpolation='bilinear',
- crop_to_aspect_ratio=True
- )
-
-class_names = training_set.class_names
-#print(class_names)
-
-
-"""Convert images to floating point with the range [0.5, 0.5]"""
-(x_train, y_train) = zip(*training_set)
-#x_train = np.expand_dims(x_train, -1)
-x_train = np.asarray(x_train)
-x_train_scaled = (x_train / 255.0) - 0.5
-(x_val,y_val) = zip(*validation_set)
-#x_val = np.expand_dims(x_val, -1)
-x_val = np.asarray(x_val)
-x_val_scaled = (x_val / 255.0) - 0.5
-(x_test,y_test) = zip(*test_set)
-#x_test = np.expand_dims(x_test, -1)
-x_test = np.asarray(x_test)
-x_test_scaled = (x_test / 255.0) - 0.5
-
-
-data_variance = np.var(x_train / 255.0)
-
-
-
-#And plot images
-plt.figure(figsize=(10, 10))
-for images, labels in training_set.take(1):
- for i in range(9):
- ax = plt.subplot(3, 3, i + 1)
- plt.imshow(images[i].numpy().astype("uint8"),cmap='gray')
- plt.title(class_names[labels[i]])
- plt.axis("off")
-
-plt.show()
import pickle
@@ -212,4 +181,5 @@ def form_2D_label(mask,class_map):
filename = "resultc.pickle"
with open(filename, "wb") as file:
pickle.dump(x_test_scaled, file)
- '''
\ No newline at end of file
+
+'''
\ No newline at end of file
From 6f8478aaf502bca6b50bcbb55e496018e54ff87f Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Thu, 20 Oct 2022 21:26:38 +1000
Subject: [PATCH 14/31] Note to Marker
Note to marker: I am about to do a bunch of commits in a short period of time - this is because I've been working in google colab & forgot to do commits. I've split these into where I would have committed had I remembered to do that properly - each point where I copied across to my personal device to save (using undo, this is the real code I had at these times). Please don't be too harsh.
---
recognition/AA_VQVAE_Mine/Note to Maker | 1 +
1 file changed, 1 insertion(+)
create mode 100644 recognition/AA_VQVAE_Mine/Note to Maker
diff --git a/recognition/AA_VQVAE_Mine/Note to Maker b/recognition/AA_VQVAE_Mine/Note to Maker
new file mode 100644
index 0000000000..d4b0f41f01
--- /dev/null
+++ b/recognition/AA_VQVAE_Mine/Note to Maker
@@ -0,0 +1 @@
+Please see commit description
\ No newline at end of file
From 4a0e2805386fd6b670721852ade3d722e56e7e0a Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Thu, 20 Oct 2022 21:28:10 +1000
Subject: [PATCH 15/31] Create Convolution Blocks & Tidy Dataset
Convolution and deconvolution blocks built
---
recognition/AA_VQVAE_Mine/Note to Maker | 1 -
recognition/AA_VQVAE_Mine/dataset.py | 7 +-----
recognition/AA_VQVAE_Mine/modules.py | 30 ++++++++++++++++++++-----
3 files changed, 25 insertions(+), 13 deletions(-)
delete mode 100644 recognition/AA_VQVAE_Mine/Note to Maker
diff --git a/recognition/AA_VQVAE_Mine/Note to Maker b/recognition/AA_VQVAE_Mine/Note to Maker
deleted file mode 100644
index d4b0f41f01..0000000000
--- a/recognition/AA_VQVAE_Mine/Note to Maker
+++ /dev/null
@@ -1 +0,0 @@
-Please see commit description
\ No newline at end of file
diff --git a/recognition/AA_VQVAE_Mine/dataset.py b/recognition/AA_VQVAE_Mine/dataset.py
index 40145e74f5..33daaceafd 100644
--- a/recognition/AA_VQVAE_Mine/dataset.py
+++ b/recognition/AA_VQVAE_Mine/dataset.py
@@ -8,10 +8,6 @@
from tensorflow.keras import backend as K
import tensorflow_probability as tfp
import tensorflow as tf
-from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, concatenate, Conv2DTranspose, BatchNormalization, Activation, Dropout
-from tensorflow.keras.optimizers import Adadelta, Nadam ,Adam
-from tensorflow.keras.models import Model, load_model
-from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau, CSVLogger, TensorBoard
import os
from PIL import Image
@@ -23,8 +19,7 @@
img_h = 4288
img_w = 2848
b_size = 32
-partition = {}
-labels = {}
+
im_root = Path(os.path.join(os.getcwd(), "recognition\AA_VQVAE_Mine\DataSets\ISIC"))
diff --git a/recognition/AA_VQVAE_Mine/modules.py b/recognition/AA_VQVAE_Mine/modules.py
index 1edc38ad9f..17832806e0 100644
--- a/recognition/AA_VQVAE_Mine/modules.py
+++ b/recognition/AA_VQVAE_Mine/modules.py
@@ -6,9 +6,27 @@
import tensorflow_probability as tfp
import tensorflow as tf
-batch_size=128
-image_size=64
-channels=3
-num_epochs=20
-learn_rate=0.0002
-beta1=0.5
\ No newline at end of file
+from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, concatenate, Conv2DTranspose, BatchNormalization, Activation, Dropout
+from tensorflow.keras.models import Model, load_model
+
+img_h = 4288
+img_w = 2848
+b_size = 32
+
+def conv_block(tensor, nfilters, size=3, padding='same', initializer="he_normal"):
+ block = Conv2D(filters=nfilters, kernel_size=(size, size), padding=padding, kernel_initializer=initializer)(tensor)
+ block = BatchNormalization()(block)
+ block = Activation("relu")(block)
+ block = Conv2D(filters=nfilters, kernel_size=(size, size), padding=padding, kernel_initializer=initializer)(block)
+ block = BatchNormalization()(block)
+ block = Activation("relu")(block)
+ return block
+
+
+def deconv_block(tensor, residual, nfilters, size=3, padding='same', strides=(2, 2)):
+ block = Conv2DTranspose(nfilters, kernel_size=(size, size), strides=strides, padding=padding)(tensor)
+ block = concatenate([block, residual], axis=3)
+ block = conv_block(block, nfilters)
+ return block
+
+
From aa2dd1e8d8497fba2d903c9d608bd8014a80546f Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Thu, 20 Oct 2022 21:34:10 +1000
Subject: [PATCH 16/31] Create Unet
Unet created from convolutional blocks with snapshots
---
recognition/AA_VQVAE_Mine/modules.py | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/recognition/AA_VQVAE_Mine/modules.py b/recognition/AA_VQVAE_Mine/modules.py
index 17832806e0..4719c09243 100644
--- a/recognition/AA_VQVAE_Mine/modules.py
+++ b/recognition/AA_VQVAE_Mine/modules.py
@@ -30,3 +30,30 @@ def deconv_block(tensor, residual, nfilters, size=3, padding='same', strides=(2,
return block
+def Unet(h, w, filters):
+# down
+ input = Input(shape=(h, w, 1), name='image_input')
+ conv1_snapshot = conv_block(input, nfilters=filters)
+ conv1_out = MaxPooling2D(pool_size=(2, 2))(conv1_snapshot)
+ conv2_snapshot = conv_block(conv1_out, nfilters=filters*2)
+ conv2_out = MaxPooling2D(pool_size=(2, 2))(conv2_snapshot)
+ conv3_snapshot = conv_block(conv2_out, nfilters=filters*4)
+ conv3_out = MaxPooling2D(pool_size=(2, 2))(conv3_snapshot)
+ conv4_snapshot = conv_block(conv3_out, nfilters=filters*8)
+ conv4_out = MaxPooling2D(pool_size=(2, 2))(conv4_snapshot)
+ conv4_out = Dropout(0.5)(conv4_out)
+ conv5 = conv_block(conv4_out, nfilters=filters*16)
+ conv5 = Dropout(0.5)(conv5)
+# up
+ deconv6 = deconv_block(conv5, residual=conv4_snapshot, nfilters=filters*8)
+ deconv6 = Dropout(0.5)(deconv6)
+ deconv7 = deconv_block(deconv6, residual=conv3_snapshot, nfilters=filters*4)
+ deconv7 = Dropout(0.5)(deconv7)
+ deconv8 = deconv_block(deconv7, residual=conv2_snapshot, nfilters=filters*2)
+ deconv9 = deconv_block(deconv8, residual=conv1_snapshot, nfilters=filters)
+ output_layer = Conv2D(filters=2, kernel_size=(1, 1), activation='softmax')(deconv9)
+
+ model = Model(inputs=input, outputs=output_layer, name='Unet')
+ return model
+
+model = Unet(img_w,img_h, 64)
From fa08e7af04ea9500843f0fc0097572db38c2cc27 Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Thu, 20 Oct 2022 21:35:17 +1000
Subject: [PATCH 17/31] Training process created
Training code written - currently throwing memory errors
---
recognition/AA_VQVAE_Mine/train.py | 59 ++++++++++++++----------------
1 file changed, 28 insertions(+), 31 deletions(-)
diff --git a/recognition/AA_VQVAE_Mine/train.py b/recognition/AA_VQVAE_Mine/train.py
index 7b516a03d5..f04f2e2404 100644
--- a/recognition/AA_VQVAE_Mine/train.py
+++ b/recognition/AA_VQVAE_Mine/train.py
@@ -6,38 +6,24 @@
import tensorflow_probability as tfp
import tensorflow as tf
+from tensorflow.keras.optimizers import Adadelta, Nadam ,Adam
+from tensorflow.keras.models import Model, load_model
+from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau, CSVLogger, TensorBoard
-import pickle
-
-# same filename
-filename = "resulta.pickle"
-with open(filename, "rb") as file:
- x_train = pickle.load(file)
-
-filename = "resultb.pickle"
-with open(filename, "rb") as file:
- data_variance = pickle.load(file)
-
-filename = "resultc.pickle"
-with open(filename, "rb") as file:
- x_test_scaled = pickle.load(file)
+import dataset
import modules
-plt.figure(figsize=(10, 10))
-for images in x_train.take(1):
- for i in range(9):
- ax = plt.subplot(3, 3, i + 1)
- plt.imshow(images[i].numpy().astype("uint8"),cmap='gray')
- plt.axis("off")
+modules.model.compile(optimizer='adam', loss='categorical_crossentropy' ,metrics=['accuracy'])
-plt.show()
-
-vqvae_trainer = modules.VQVAETrainer(data_variance, latent_dim=16, num_embeddings=128)
-vqvae_trainer.compile(optimizer=keras.optimizers.Adam())
-vqvae_trainer.fit(x_train, epochs=1, batch_size=128)
+es = EarlyStopping(mode='max', monitor='val_acc', patience=10, verbose=0)
+tb = TensorBoard(log_dir="logs/", histogram_freq=0, write_graph=True, write_images=False)
+rl = ReduceLROnPlateau(monitor='val_acc',factor=0.1,patience=5,verbose=1,mode="max",min_lr=0.0001)
+results = modules.model.fit(dataset.train_generator , steps_per_epoch=dataset.train_steps ,epochs=30,
+ validation_data=dataset.val_generator,validation_steps=dataset.val_steps,callbacks=[es,tb,rl])
+'''
def show_subplot(original, reconstructed):
plt.subplot(1, 2, 1)
plt.imshow(original.squeeze() + 0.5,cmap='gray')
@@ -52,10 +38,21 @@ def show_subplot(original, reconstructed):
plt.show()
-trained_vqvae_model = vqvae_trainer.vqvae
-idx = np.random.choice(len(x_test_scaled), 10)
-test_images = x_test_scaled[idx]
-reconstructions_test = trained_vqvae_model.predict(test_images)
-for test_image, reconstructed_image in zip(test_images, reconstructions_test):
- show_subplot(test_image, reconstructed_image)
\ No newline at end of file
+
+import pickle
+
+# same filename
+filename = "resulta.pickle"
+with open(filename, "rb") as file:
+ x_train = pickle.load(file)
+
+filename = "resultb.pickle"
+with open(filename, "rb") as file:
+ data_variance = pickle.load(file)
+
+filename = "resultc.pickle"
+with open(filename, "rb") as file:
+ x_test_scaled = pickle.load(file)
+
+'''
\ No newline at end of file
From 1f57e850aa5ebeb2011954434ee28048d975d687 Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Thu, 20 Oct 2022 21:37:00 +1000
Subject: [PATCH 18/31] Training Excess Removed
Unnecessary code removed to help with debugging
---
recognition/AA_VQVAE_Mine/train.py | 40 +-----------------------------
1 file changed, 1 insertion(+), 39 deletions(-)
diff --git a/recognition/AA_VQVAE_Mine/train.py b/recognition/AA_VQVAE_Mine/train.py
index f04f2e2404..99190b07b9 100644
--- a/recognition/AA_VQVAE_Mine/train.py
+++ b/recognition/AA_VQVAE_Mine/train.py
@@ -16,43 +16,5 @@
modules.model.compile(optimizer='adam', loss='categorical_crossentropy' ,metrics=['accuracy'])
-es = EarlyStopping(mode='max', monitor='val_acc', patience=10, verbose=0)
-tb = TensorBoard(log_dir="logs/", histogram_freq=0, write_graph=True, write_images=False)
-rl = ReduceLROnPlateau(monitor='val_acc',factor=0.1,patience=5,verbose=1,mode="max",min_lr=0.0001)
-
results = modules.model.fit(dataset.train_generator , steps_per_epoch=dataset.train_steps ,epochs=30,
- validation_data=dataset.val_generator,validation_steps=dataset.val_steps,callbacks=[es,tb,rl])
-
-'''
-def show_subplot(original, reconstructed):
- plt.subplot(1, 2, 1)
- plt.imshow(original.squeeze() + 0.5,cmap='gray')
- plt.title("Original")
- plt.axis("off")
-
- plt.subplot(1, 2, 2)
- plt.imshow(reconstructed.squeeze() + 0.5,cmap='gray')
- plt.title("Reconstructed")
- plt.axis("off")
-
- plt.show()
-
-
-
-
-import pickle
-
-# same filename
-filename = "resulta.pickle"
-with open(filename, "rb") as file:
- x_train = pickle.load(file)
-
-filename = "resultb.pickle"
-with open(filename, "rb") as file:
- data_variance = pickle.load(file)
-
-filename = "resultc.pickle"
-with open(filename, "rb") as file:
- x_test_scaled = pickle.load(file)
-
-'''
\ No newline at end of file
+ validation_data=dataset.val_generator,validation_steps=dataset.val_steps)
From 8d340edaf3c8d53278d7408a1aff329850be24bb Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Thu, 20 Oct 2022 21:38:08 +1000
Subject: [PATCH 19/31] Input shape fixed
Incorrect input shape found to be causing errors
---
recognition/AA_VQVAE_Mine/modules.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/recognition/AA_VQVAE_Mine/modules.py b/recognition/AA_VQVAE_Mine/modules.py
index 4719c09243..a2272bc12b 100644
--- a/recognition/AA_VQVAE_Mine/modules.py
+++ b/recognition/AA_VQVAE_Mine/modules.py
@@ -32,7 +32,7 @@ def deconv_block(tensor, residual, nfilters, size=3, padding='same', strides=(2,
def Unet(h, w, filters):
# down
- input = Input(shape=(h, w, 1), name='image_input')
+ input = Input(shape=(h, w, 3), name='image_input')
conv1_snapshot = conv_block(input, nfilters=filters)
conv1_out = MaxPooling2D(pool_size=(2, 2))(conv1_snapshot)
conv2_snapshot = conv_block(conv1_out, nfilters=filters*2)
From e81c877c0e86d6d3fcb2a6d5a9eb37378b1bd8fa Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Thu, 20 Oct 2022 21:39:46 +1000
Subject: [PATCH 20/31] Images and Epochs fixed
Images were too large & causing memory errors. Also, Epochs were taking too long and reached a reasonable val-accuracy after only 10 epochs.
---
recognition/AA_VQVAE_Mine/dataset.py | 4 ++--
recognition/AA_VQVAE_Mine/train.py | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/recognition/AA_VQVAE_Mine/dataset.py b/recognition/AA_VQVAE_Mine/dataset.py
index 33daaceafd..e61dc7d843 100644
--- a/recognition/AA_VQVAE_Mine/dataset.py
+++ b/recognition/AA_VQVAE_Mine/dataset.py
@@ -16,8 +16,8 @@
from random import sample, choice
import shutil
-img_h = 4288
-img_w = 2848
+img_h = 432
+img_w = 288
b_size = 32
diff --git a/recognition/AA_VQVAE_Mine/train.py b/recognition/AA_VQVAE_Mine/train.py
index 99190b07b9..8b9e72dc90 100644
--- a/recognition/AA_VQVAE_Mine/train.py
+++ b/recognition/AA_VQVAE_Mine/train.py
@@ -16,5 +16,5 @@
modules.model.compile(optimizer='adam', loss='categorical_crossentropy' ,metrics=['accuracy'])
-results = modules.model.fit(dataset.train_generator , steps_per_epoch=dataset.train_steps ,epochs=30,
+results = modules.model.fit(dataset.train_generator , steps_per_epoch=dataset.train_steps ,epochs=10,
validation_data=dataset.val_generator,validation_steps=dataset.val_steps)
From 33214139343fa410956fe4ae1dacf15c0c95f23d Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Thu, 20 Oct 2022 21:42:03 +1000
Subject: [PATCH 21/31] Fixed Train+Test
Source code merged training and testing data - this would invalidate results - fixed.
---
recognition/AA_VQVAE_Mine/dataset.py | 39 +++-------------------------
1 file changed, 4 insertions(+), 35 deletions(-)
diff --git a/recognition/AA_VQVAE_Mine/dataset.py b/recognition/AA_VQVAE_Mine/dataset.py
index e61dc7d843..255d6454cb 100644
--- a/recognition/AA_VQVAE_Mine/dataset.py
+++ b/recognition/AA_VQVAE_Mine/dataset.py
@@ -31,15 +31,7 @@
"ISIC-2017_Validation_Data",
"ISIC-2017_Validation_Truth"
]
-'''
-for p in paths:
- folder_fp = os.path.join(im_root, p)
- for im_fn in os.listdir(folder_fp):
- im_fp = os.path.join(folder_fp, im_fn)
- new_im = os.path.join(folder_fp, im_fn)
- im = Image.open(new_im).convert("L")
- im.save(new_im)
-'''
+
train_imgs = list((im_root / "ISIC-2017_Training_Data").glob("*.jpg"))
train_labels = list((im_root / "ISIC-2017_Training_Truth").glob("*.png"))
test_imgs = list((im_root / "ISIC-2017_Test_Data").glob("*.jpg"))
@@ -147,34 +139,11 @@ def __data_generation(self, list_IDs_temp):
return np.array(batch_imgs) ,np.array(batch_labels)
-train_generator = DataGenerator(train_pair+test_pair,class_map,b_size, dim=(img_w,img_h,3) ,shuffle=True)
+train_generator = DataGenerator(train_pair,class_map,b_size, dim=(img_w,img_h,3) ,shuffle=True)
train_steps = train_generator.__len__()
-X,Y = train_generator.__getitem__(1)
-print(Y.shape)
+test_generator = DataGenerator(test_pair,class_map,b_size, dim=(img_w,img_h,3) ,shuffle=True)
+test_steps = test_generator.__len__()
val_generator = DataGenerator(val_pair, class_map, batch_size=4, dim=(img_w,img_h,3) ,shuffle=True)
val_steps = val_generator.__len__()
-
-
-print("no errors")
-
-
-'''
-
-import pickle
-
-# example, replace with your result
-filename = "resulta.pickle"
-with open(filename, "wb") as file:
- pickle.dump(x_train, file)
-
-filename = "resultb.pickle"
-with open(filename, "wb") as file:
- pickle.dump(data_variance, file)
-
-filename = "resultc.pickle"
-with open(filename, "wb") as file:
- pickle.dump(x_test_scaled, file)
-
-'''
\ No newline at end of file
From 05714966e27eee50044fb1ff6fd1f4953477547e Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Thu, 20 Oct 2022 21:47:46 +1000
Subject: [PATCH 22/31] Producing Labels
The code now runs and produces fairly decent labels for the images (when run to 30 epochs, the labels almost seem better than the true labels for identifying skin discolourations - possibly over trained, so 10 epochs will be kept as optimal)
---
recognition/AA_VQVAE_Mine/modules.py | 8 +++--
recognition/AA_VQVAE_Mine/predict.py | 52 +++++++++++++++++++---------
recognition/AA_VQVAE_Mine/train.py | 4 ---
3 files changed, 41 insertions(+), 23 deletions(-)
diff --git a/recognition/AA_VQVAE_Mine/modules.py b/recognition/AA_VQVAE_Mine/modules.py
index a2272bc12b..3387581270 100644
--- a/recognition/AA_VQVAE_Mine/modules.py
+++ b/recognition/AA_VQVAE_Mine/modules.py
@@ -9,9 +9,11 @@
from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, concatenate, Conv2DTranspose, BatchNormalization, Activation, Dropout
from tensorflow.keras.models import Model, load_model
-img_h = 4288
-img_w = 2848
-b_size = 32
+import dataset
+
+img_h = dataset.img_h
+img_w = dataset.img_w
+b_size = dataset.b_size
def conv_block(tensor, nfilters, size=3, padding='same', initializer="he_normal"):
block = Conv2D(filters=nfilters, kernel_size=(size, size), padding=padding, kernel_initializer=initializer)(tensor)
diff --git a/recognition/AA_VQVAE_Mine/predict.py b/recognition/AA_VQVAE_Mine/predict.py
index 1b20708a45..3ef118630d 100644
--- a/recognition/AA_VQVAE_Mine/predict.py
+++ b/recognition/AA_VQVAE_Mine/predict.py
@@ -1,21 +1,41 @@
-def show_subplot(original, reconstructed):
- plt.subplot(1, 2, 1)
- plt.imshow(original.squeeze() + 0.5)
- plt.title("Original")
- plt.axis("off")
+import numpy as np
+import matplotlib.pyplot as plt
- plt.subplot(1, 2, 2)
- plt.imshow(reconstructed.squeeze() + 0.5)
- plt.title("Reconstructed")
- plt.axis("off")
+from tensorflow import keras
+from tensorflow.keras import layers
+from tensorflow.keras.preprocessing.image import load_img, img_to_array
- plt.show()
+import train
+import dataset
+import modules
-trained_vqvae_model = vqvae_trainer.vqvae
-idx = np.random.choice(len(x_test_scaled), 10)
-test_images = x_test_scaled[idx]
-reconstructions_test = trained_vqvae_model.predict(test_images)
+img_mask = choice(dataset.val_pair)
+img= img_to_array(load_img(img_mask[0] , target_size= (dataset.img_w,dataset.img_h)))
+gt_img = img_to_array(load_img(img_mask[1] , target_size= (dataset.img_w,dataset.img_h)))
-for test_image, reconstructed_image in zip(test_images, reconstructions_test):
- show_subplot(test_image, reconstructed_image)
\ No newline at end of file
+def make_prediction(model,img_path,shape):
+ img= img_to_array(load_img(img_path , target_size= shape))/255.
+ img = np.expand_dims(img,axis=0)
+ labels = model.predict(img)
+ labels = np.argmax(labels[0],axis=2)
+ return labels
+
+pred_label = make_prediction(train.model, img_mask[0], (dataset.img_w,dataset.img_h,3))
+
+def form_colormap(prediction,mapping):
+ h,w = prediction.shape
+ color_label = np.zeros((h,w,3),dtype=np.uint8)
+ color_label = mapping[prediction]
+ color_label = color_label.astype(np.uint8)
+ return color_label
+
+pred_colored = form_colormap(pred_label,np.array(dataset.class_map))
+
+plt.figure(figsize=(15,15))
+plt.subplot(131);plt.title('Original Image')
+plt.imshow(img/255.)
+plt.subplot(132);plt.title('True labels')
+plt.imshow(gt_img/255.)
+plt.subplot(133)
+plt.imshow(pred_colored/255.);plt.title('predicted labels')
\ No newline at end of file
diff --git a/recognition/AA_VQVAE_Mine/train.py b/recognition/AA_VQVAE_Mine/train.py
index 8b9e72dc90..5a5c820133 100644
--- a/recognition/AA_VQVAE_Mine/train.py
+++ b/recognition/AA_VQVAE_Mine/train.py
@@ -6,10 +6,6 @@
import tensorflow_probability as tfp
import tensorflow as tf
-from tensorflow.keras.optimizers import Adadelta, Nadam ,Adam
-from tensorflow.keras.models import Model, load_model
-from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping, ReduceLROnPlateau, CSVLogger, TensorBoard
-
import dataset
import modules
From c0a2dd6325ff4de4fe96607012e9af5041891c6f Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Thu, 20 Oct 2022 21:48:39 +1000
Subject: [PATCH 23/31] Labels corrected
The labels were being printed in a colour map - updated to show correct 'grey scale' black and white
---
recognition/AA_VQVAE_Mine/predict.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/recognition/AA_VQVAE_Mine/predict.py b/recognition/AA_VQVAE_Mine/predict.py
index 3ef118630d..e71067f27e 100644
--- a/recognition/AA_VQVAE_Mine/predict.py
+++ b/recognition/AA_VQVAE_Mine/predict.py
@@ -38,4 +38,4 @@ def form_colormap(prediction,mapping):
plt.subplot(132);plt.title('True labels')
plt.imshow(gt_img/255.)
plt.subplot(133)
-plt.imshow(pred_colored/255.);plt.title('predicted labels')
\ No newline at end of file
+plt.imshow(pred_colored/255., cmap='gray');plt.title('predicted labels')
\ No newline at end of file
From 26742c6b45015fca34792a265f442b4ab9116954 Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Thu, 20 Oct 2022 22:52:13 +1000
Subject: [PATCH 24/31] Updated loss and tweaked metrics
Updated loss to use dice coefficient and made improvements model fit call.
---
recognition/AA_VQVAE_Mine/modules.py | 10 ++++++++++
recognition/AA_VQVAE_Mine/predict.py | 3 ++-
recognition/AA_VQVAE_Mine/train.py | 3 ++-
3 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/recognition/AA_VQVAE_Mine/modules.py b/recognition/AA_VQVAE_Mine/modules.py
index 3387581270..8b00da2681 100644
--- a/recognition/AA_VQVAE_Mine/modules.py
+++ b/recognition/AA_VQVAE_Mine/modules.py
@@ -31,6 +31,16 @@ def deconv_block(tensor, residual, nfilters, size=3, padding='same', strides=(2,
block = conv_block(block, nfilters)
return block
+def dice_similarity(real, pred):
+ """
+ Simple implementation of the Dice Similarity formula from wikipedia
+ """
+ real_flattened = tf.keras.backend.flatten(real)
+ pred_flattened = tf.keras.backend.flatten(pred)
+ numerator = 2 * (tf.keras.backend.sum(real_flattened*pred_flattened))
+ denominator = tf.keras.backend.sum(real_flattened) + tf.keras.backend.sum(pred_flattened)
+
+ return numerator/denominator
def Unet(h, w, filters):
# down
diff --git a/recognition/AA_VQVAE_Mine/predict.py b/recognition/AA_VQVAE_Mine/predict.py
index e71067f27e..2d92aecf12 100644
--- a/recognition/AA_VQVAE_Mine/predict.py
+++ b/recognition/AA_VQVAE_Mine/predict.py
@@ -5,10 +5,11 @@
from tensorflow.keras import layers
from tensorflow.keras.preprocessing.image import load_img, img_to_array
+from random import sample, choice
+
import train
import dataset
-import modules
img_mask = choice(dataset.val_pair)
img= img_to_array(load_img(img_mask[0] , target_size= (dataset.img_w,dataset.img_h)))
diff --git a/recognition/AA_VQVAE_Mine/train.py b/recognition/AA_VQVAE_Mine/train.py
index 5a5c820133..f194edb8f0 100644
--- a/recognition/AA_VQVAE_Mine/train.py
+++ b/recognition/AA_VQVAE_Mine/train.py
@@ -13,4 +13,5 @@
modules.model.compile(optimizer='adam', loss='categorical_crossentropy' ,metrics=['accuracy'])
results = modules.model.fit(dataset.train_generator , steps_per_epoch=dataset.train_steps ,epochs=10,
- validation_data=dataset.val_generator,validation_steps=dataset.val_steps)
+ validation_data=dataset.val_generator,validation_steps=dataset.val_steps, verbose=1,
+ loss='sparse_categorical_crossentropy', optimizer='adam', metrics=[modules.dice_similarity])
From bb0653e090bb5ae91107f637b776e8d6028d1a9a Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Thu, 20 Oct 2022 22:58:02 +1000
Subject: [PATCH 25/31] Fixed the tweaking
Put the code from the previous commit in the wrong line - fixed
---
recognition/AA_VQVAE_Mine/train.py | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/recognition/AA_VQVAE_Mine/train.py b/recognition/AA_VQVAE_Mine/train.py
index f194edb8f0..f8466a647e 100644
--- a/recognition/AA_VQVAE_Mine/train.py
+++ b/recognition/AA_VQVAE_Mine/train.py
@@ -10,8 +10,7 @@
import dataset
import modules
-modules.model.compile(optimizer='adam', loss='categorical_crossentropy' ,metrics=['accuracy'])
+modules.model.compile(optimizer='adam', loss='sparse_categorical_crossentropy' ,metrics=[modules.dice_similarity])
results = modules.model.fit(dataset.train_generator , steps_per_epoch=dataset.train_steps ,epochs=10,
- validation_data=dataset.val_generator,validation_steps=dataset.val_steps, verbose=1,
- loss='sparse_categorical_crossentropy', optimizer='adam', metrics=[modules.dice_similarity])
+ validation_data=dataset.val_generator,validation_steps=dataset.val_steps, verbose=1)
From 522b0c49ef397fc3fbd96b9fa9aca6e988dde666 Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Thu, 20 Oct 2022 23:41:52 +1000
Subject: [PATCH 26/31] Corrected loss
---
recognition/AA_VQVAE_Mine/train.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/recognition/AA_VQVAE_Mine/train.py b/recognition/AA_VQVAE_Mine/train.py
index f8466a647e..c6c33b452f 100644
--- a/recognition/AA_VQVAE_Mine/train.py
+++ b/recognition/AA_VQVAE_Mine/train.py
@@ -10,7 +10,7 @@
import dataset
import modules
-modules.model.compile(optimizer='adam', loss='sparse_categorical_crossentropy' ,metrics=[modules.dice_similarity])
+modules.model.compile(optimizer='adam', loss='categorical_crossentropy' ,metrics=[modules.dice_similarity])
results = modules.model.fit(dataset.train_generator , steps_per_epoch=dataset.train_steps ,epochs=10,
validation_data=dataset.val_generator,validation_steps=dataset.val_steps, verbose=1)
From 8f4fc9e2e13e72c62fff7d73f4d8d0857578f062 Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Fri, 21 Oct 2022 12:58:40 +1000
Subject: [PATCH 27/31] Finalised Code
Correct dice similarity and loss implemented. Epochs raised from 10 to 15 and learning rate specialized to 0.00003 to regain good accuracy results. Evaluation and prediction code added to verify functionality. Prediction now outputs 5 comparisons instead of 1.
---
recognition/AA_VQVAE_Mine/modules.py | 19 +++++++++-----
recognition/AA_VQVAE_Mine/predict.py | 39 ++++++++++++++--------------
recognition/AA_VQVAE_Mine/train.py | 35 +++++++++++++++++++++++--
3 files changed, 65 insertions(+), 28 deletions(-)
diff --git a/recognition/AA_VQVAE_Mine/modules.py b/recognition/AA_VQVAE_Mine/modules.py
index 8b00da2681..c70dee723c 100644
--- a/recognition/AA_VQVAE_Mine/modules.py
+++ b/recognition/AA_VQVAE_Mine/modules.py
@@ -31,16 +31,21 @@ def deconv_block(tensor, residual, nfilters, size=3, padding='same', strides=(2,
block = conv_block(block, nfilters)
return block
-def dice_similarity(real, pred):
+def dice_similarity(x, y):
"""
- Simple implementation of the Dice Similarity formula from wikipedia
+ Returns:
+ int: dice coefficient
"""
- real_flattened = tf.keras.backend.flatten(real)
- pred_flattened = tf.keras.backend.flatten(pred)
- numerator = 2 * (tf.keras.backend.sum(real_flattened*pred_flattened))
- denominator = tf.keras.backend.sum(real_flattened) + tf.keras.backend.sum(pred_flattened)
+ return 2 * (tf.keras.backend.sum(tf.keras.backend.flatten(x) * tf.keras.backend.flatten(y)) + 1) / \
+ (tf.keras.backend.sum(tf.keras.backend.flatten(x) + tf.keras.backend.flatten(y)) + 1)
- return numerator/denominator
+
+def dice_loss(x, y):
+ """
+ Returns:
+ int: dice co-efficient loss
+ """
+ return 1 - dice_similarity(x, y)
def Unet(h, w, filters):
# down
diff --git a/recognition/AA_VQVAE_Mine/predict.py b/recognition/AA_VQVAE_Mine/predict.py
index 2d92aecf12..2a52539a51 100644
--- a/recognition/AA_VQVAE_Mine/predict.py
+++ b/recognition/AA_VQVAE_Mine/predict.py
@@ -11,10 +11,13 @@
import train
import dataset
-img_mask = choice(dataset.val_pair)
-img= img_to_array(load_img(img_mask[0] , target_size= (dataset.img_w,dataset.img_h)))
-gt_img = img_to_array(load_img(img_mask[1] , target_size= (dataset.img_w,dataset.img_h)))
-
+def form_colormap(prediction,mapping):
+ h,w = prediction.shape
+ color_label = np.zeros((h,w,3),dtype=np.uint8)
+ color_label = mapping[prediction]
+ color_label = color_label.astype(np.uint8)
+ return color_label
+
def make_prediction(model,img_path,shape):
img= img_to_array(load_img(img_path , target_size= shape))/255.
img = np.expand_dims(img,axis=0)
@@ -22,21 +25,19 @@ def make_prediction(model,img_path,shape):
labels = np.argmax(labels[0],axis=2)
return labels
-pred_label = make_prediction(train.model, img_mask[0], (dataset.img_w,dataset.img_h,3))
+for i in range(5):
+ img_mask = choice(dataset.val_pair)
+ img= img_to_array(load_img(img_mask[0] , target_size= (dataset.img_w,dataset.img_h)))
+ gt_img = img_to_array(load_img(img_mask[1] , target_size= (dataset.img_w,dataset.img_h)))
-def form_colormap(prediction,mapping):
- h,w = prediction.shape
- color_label = np.zeros((h,w,3),dtype=np.uint8)
- color_label = mapping[prediction]
- color_label = color_label.astype(np.uint8)
- return color_label
+ pred_label = make_prediction(train.model, img_mask[0], (dataset.img_w,dataset.img_h,3))
-pred_colored = form_colormap(pred_label,np.array(dataset.class_map))
+ pred_colored = form_colormap(pred_label,np.array(dataset.class_map))
-plt.figure(figsize=(15,15))
-plt.subplot(131);plt.title('Original Image')
-plt.imshow(img/255.)
-plt.subplot(132);plt.title('True labels')
-plt.imshow(gt_img/255.)
-plt.subplot(133)
-plt.imshow(pred_colored/255., cmap='gray');plt.title('predicted labels')
\ No newline at end of file
+ plt.figure(figsize=(15,15))
+ plt.subplot(131);plt.title('Original Image')
+ plt.imshow(img/255.)
+ plt.subplot(132);plt.title('True labels')
+ plt.imshow(gt_img/255.)
+ plt.subplot(133)
+ plt.imshow(pred_colored/255., cmap='gray');plt.title('predicted labels')
\ No newline at end of file
diff --git a/recognition/AA_VQVAE_Mine/train.py b/recognition/AA_VQVAE_Mine/train.py
index c6c33b452f..376d6de343 100644
--- a/recognition/AA_VQVAE_Mine/train.py
+++ b/recognition/AA_VQVAE_Mine/train.py
@@ -10,7 +10,38 @@
import dataset
import modules
-modules.model.compile(optimizer='adam', loss='categorical_crossentropy' ,metrics=[modules.dice_similarity])
+modules.model.compile(tf.keras.optimizers.Adam(learning_rate= 0.00003),loss=[modules.dice_loss],metrics=[modules.dice_similarity, 'accuracy'])
-results = modules.model.fit(dataset.train_generator , steps_per_epoch=dataset.train_steps ,epochs=10,
+history = modules.model.fit(dataset.train_generator , steps_per_epoch=dataset.train_steps ,epochs=15,
validation_data=dataset.val_generator,validation_steps=dataset.val_steps, verbose=1)
+
+#Accuracy
+plt.plot(history.history['accuracy'])
+plt.plot(history.history['val_accuracy'])
+plt.title('model accuracy')
+plt.ylabel('accuracy')
+plt.xlabel('epoch')
+plt.legend(['train', 'validation'], loc='upper left')
+plt.show()
+#dice similarity
+plt.plot(history.history['dice_similarity'])
+plt.plot(history.history['val_dice_similarity'])
+plt.title('model dice_similarity')
+plt.ylabel('dice_similarity')
+plt.xlabel('epoch')
+plt.legend(['train', 'validation'], loc='upper left')
+plt.show()
+# "Loss"
+plt.plot(history.history['loss'])
+plt.plot(history.history['val_loss'])
+plt.title('model loss')
+plt.ylabel('loss')
+plt.xlabel('epoch')
+plt.legend(['train', 'validation'], loc='upper left')
+plt.show()
+
+loss, dice_similarity, acc = model.evaluate(test_generator,batch_size=b_size)
+
+print('Test loss:', loss)
+print('Test dice_similarity:', dice_similarity)
+print('Test accuracy:', acc)
\ No newline at end of file
From 2c7ad0498e90e32b70ca24e918edc44db99b69a8 Mon Sep 17 00:00:00 2001
From: MikStap <111872333+MikStap@users.noreply.github.com>
Date: Fri, 21 Oct 2022 19:32:15 +1000
Subject: [PATCH 28/31] Comments and ReadMe
Added some general comments & produced ReadMe document. Also updated File Name
---
recognition/AA_VQVAE_Mine/README.md | 10 ---
recognition/AA_VQVAE_Mine/utils.py | 0
.../Images/acc.png | Bin 0 -> 14872 bytes
.../Images/dsc.png | Bin 0 -> 15971 bytes
.../Images/evaluation.png | Bin 0 -> 21637 bytes
.../Images/good.png | Bin 0 -> 88896 bytes
.../Images/good1.png | Bin 0 -> 73416 bytes
.../Images/good3.png | Bin 0 -> 74060 bytes
.../Images/good5.png | Bin 0 -> 95252 bytes
.../Images/good6.png | Bin 0 -> 78869 bytes
.../Images/loss.png | Bin 0 -> 14642 bytes
.../Images/unet.png | Bin 0 -> 57883 bytes
.../s46413587_Improved_Unet_on_ISIC/README.md | 57 ++++++++++++++++++
.../dataset.py | 12 +++-
.../modules.py | 9 ++-
.../predict.py | 17 +++---
.../train.py | 10 ++-
17 files changed, 91 insertions(+), 24 deletions(-)
delete mode 100644 recognition/AA_VQVAE_Mine/README.md
delete mode 100644 recognition/AA_VQVAE_Mine/utils.py
create mode 100644 recognition/s46413587_Improved_Unet_on_ISIC/Images/acc.png
create mode 100644 recognition/s46413587_Improved_Unet_on_ISIC/Images/dsc.png
create mode 100644 recognition/s46413587_Improved_Unet_on_ISIC/Images/evaluation.png
create mode 100644 recognition/s46413587_Improved_Unet_on_ISIC/Images/good.png
create mode 100644 recognition/s46413587_Improved_Unet_on_ISIC/Images/good1.png
create mode 100644 recognition/s46413587_Improved_Unet_on_ISIC/Images/good3.png
create mode 100644 recognition/s46413587_Improved_Unet_on_ISIC/Images/good5.png
create mode 100644 recognition/s46413587_Improved_Unet_on_ISIC/Images/good6.png
create mode 100644 recognition/s46413587_Improved_Unet_on_ISIC/Images/loss.png
create mode 100644 recognition/s46413587_Improved_Unet_on_ISIC/Images/unet.png
create mode 100644 recognition/s46413587_Improved_Unet_on_ISIC/README.md
rename recognition/{AA_VQVAE_Mine => s46413587_Improved_Unet_on_ISIC}/dataset.py (91%)
rename recognition/{AA_VQVAE_Mine => s46413587_Improved_Unet_on_ISIC}/modules.py (87%)
rename recognition/{AA_VQVAE_Mine => s46413587_Improved_Unet_on_ISIC}/predict.py (65%)
rename recognition/{AA_VQVAE_Mine => s46413587_Improved_Unet_on_ISIC}/train.py (87%)
diff --git a/recognition/AA_VQVAE_Mine/README.md b/recognition/AA_VQVAE_Mine/README.md
deleted file mode 100644
index 1ffe79516c..0000000000
--- a/recognition/AA_VQVAE_Mine/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-Attempt at easy difficulty task.
-
-1. The readme file should contain a title, a description of the algorithm and the problem that it solves
-(approximately a paragraph), how it works in a paragraph and a figure/visualization.
-2. It should also list any dependencies required, including versions and address reproducibility of results,
-if applicable.
-3. provide example inputs, outputs and plots of your algorithm
-4. The read me file should be properly formatted using GitHub markdown
-5. Describe any specific pre-processing you have used with references if any. Justify your training, validation
-and testing splits of the data.
diff --git a/recognition/AA_VQVAE_Mine/utils.py b/recognition/AA_VQVAE_Mine/utils.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/recognition/s46413587_Improved_Unet_on_ISIC/Images/acc.png b/recognition/s46413587_Improved_Unet_on_ISIC/Images/acc.png
new file mode 100644
index 0000000000000000000000000000000000000000..e5bdea7bcaa43a7f491e7435ab1b8914791aa7e1
GIT binary patch
literal 14872
zcmaL81yoc~*Ec?N$AEN?gh)$w4GNM1gLDXjAl==<07DEYjf6-HAfVDU(kP(+TY_qa5*W#jjWV#WTh+sNaNZNo_-0q&v7icDGcJGiz$FtFql~kT7#tO9jA?EA^
z{msgYRjg&{NhwjECaUI`tJJ(Vf<<_ZxN)T~n>t|_2K_ZFGIc%U52;pxp+uHy*rIyn(N
Q<60c&lEC^!>|
zNaX|O3K_llAZf*AG2dZ3ceX);>*28Mu2?o)?q0c2QF&}(<*;!>-O27LGts0~Pd6f<
zn}}cvJh!ILE}Q?(SWaV#pV#Pr$>Mi|U7EI|ZA0(Do#97ketIAwU?vN&LD<>bS)QA#
zMF}3pgu$^!oz7gnGuzC9{d4k{`(L$0E{}bUN6i&&_JAD|B78vxHdau=k^WQ_HmApa
zwfnn6$CZ5)`NL$xtw_*k7