From e174978d60ee3fd4ea52c8b9b4bf4f1e964de817 Mon Sep 17 00:00:00 2001 From: kmindc Date: Fri, 21 Oct 2022 23:10:14 +1000 Subject: [PATCH 1/3] Add all necessary files into my own project folder --- recognition/s4557453_ISIC-Improved_UNet/README.MD | 0 recognition/s4557453_ISIC-Improved_UNet/dataset.py | 0 recognition/s4557453_ISIC-Improved_UNet/modules.py | 0 recognition/s4557453_ISIC-Improved_UNet/predict.py | 0 recognition/s4557453_ISIC-Improved_UNet/train.py | 0 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 recognition/s4557453_ISIC-Improved_UNet/README.MD create mode 100644 recognition/s4557453_ISIC-Improved_UNet/dataset.py create mode 100644 recognition/s4557453_ISIC-Improved_UNet/modules.py create mode 100644 recognition/s4557453_ISIC-Improved_UNet/predict.py create mode 100644 recognition/s4557453_ISIC-Improved_UNet/train.py diff --git a/recognition/s4557453_ISIC-Improved_UNet/README.MD b/recognition/s4557453_ISIC-Improved_UNet/README.MD new file mode 100644 index 0000000000..e69de29bb2 diff --git a/recognition/s4557453_ISIC-Improved_UNet/dataset.py b/recognition/s4557453_ISIC-Improved_UNet/dataset.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/recognition/s4557453_ISIC-Improved_UNet/modules.py b/recognition/s4557453_ISIC-Improved_UNet/modules.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/recognition/s4557453_ISIC-Improved_UNet/predict.py b/recognition/s4557453_ISIC-Improved_UNet/predict.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/recognition/s4557453_ISIC-Improved_UNet/train.py b/recognition/s4557453_ISIC-Improved_UNet/train.py new file mode 100644 index 0000000000..e69de29bb2 From f9245af221f0668a2d9e9923c158f675bc087999 Mon Sep 17 00:00:00 2001 From: kmindc Date: Fri, 28 Oct 2022 02:00:37 +1000 Subject: [PATCH 2/3] Created context, localization, and upsampling module functions according to the research paper in the modules.py file. --- .../s4557453_ISIC-Improved_UNet/modules.py | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/recognition/s4557453_ISIC-Improved_UNet/modules.py b/recognition/s4557453_ISIC-Improved_UNet/modules.py index e69de29bb2..50fbf69622 100644 --- a/recognition/s4557453_ISIC-Improved_UNet/modules.py +++ b/recognition/s4557453_ISIC-Improved_UNet/modules.py @@ -0,0 +1,53 @@ +from keras.layers import BatchNormalization, Conv2D, UpSampling2D, LeakyReLU, Dropout + + +def contextModule(inputs, filters): + """ + Implemented based on: https://arxiv.org/abs/1802.10508v1 + Two 3x3x3 convolutional layers and a dropout layer (p = 0.3) in between. + Use leaky ReLU nonlinearities with a negative slope of 10^−2 + """ + + conv1 = Conv2D(filters, (3, 3), strides=1, padding="same")(inputs) + leak1 = LeakyReLU(0.01)(conv1) + norm1 = BatchNormalization()(leak1) + + drop = Dropout(0.3)(norm1) + + conv2 = Conv2D(filters, (3, 3), strides=1, padding="same")(drop) + leak2 = LeakyReLU(0.01)(conv2) + norm2 = BatchNormalization()(leak2) + + return norm2 + + +def localizationModule(inputs, filters): + """ + Implemented based on: https://arxiv.org/abs/1802.10508v1 + Consists of a 3x3x3 convolution followed by a 1x1x1 convolution that halves the number of feature maps. + """ + + conv1 = Conv2D(filters, (3, 3), strides=1, padding="same")(inputs) + leak1 = LeakyReLU(0.01)(conv1) + norm1 = BatchNormalization()(leak1) + + conv2 = Conv2D(filters/2, (1, 1), strides=1, padding="same")(norm1) + leak2 = LeakyReLU(0.01)(conv2) + norm2 = BatchNormalization()(leak2) + + return norm2 + + +def upsamplingModule(inputs, filters): + """ + Implemented based on: https://arxiv.org/abs/1802.10508v1 + upsampling the low resolution feature maps, which is done by means of a simple upscale that repeats the + feature voxels twice in each spatial dimension, followed by a 3x3x3 convolution that halves the number + of feature maps. + """ + upsample = UpSampling2D((2, 2))(inputs) + conv1 = Conv2D(filters, (3, 3), strides=1, padding="same")(upsample) + leak1 = LeakyReLU(0.01)(conv1) + norm1 = BatchNormalization()(leak1) + + return norm1 From c515e267ef9f2a35c54b3bff504069c1c775e1c2 Mon Sep 17 00:00:00 2001 From: kmindc Date: Fri, 28 Oct 2022 04:00:18 +1000 Subject: [PATCH 3/3] Created a function to get the improved unet model for some input size (named getModel) modules.py file. B --- .../s4557453_ISIC-Improved_UNet/modules.py | 107 +++++++++++++++++- 1 file changed, 106 insertions(+), 1 deletion(-) diff --git a/recognition/s4557453_ISIC-Improved_UNet/modules.py b/recognition/s4557453_ISIC-Improved_UNet/modules.py index 50fbf69622..356bca3aca 100644 --- a/recognition/s4557453_ISIC-Improved_UNet/modules.py +++ b/recognition/s4557453_ISIC-Improved_UNet/modules.py @@ -1,4 +1,5 @@ -from keras.layers import BatchNormalization, Conv2D, UpSampling2D, LeakyReLU, Dropout +from keras.layers import BatchNormalization, Conv2D, UpSampling2D, LeakyReLU, Dropout, Add, Concatenate +from keras import Input, Model def contextModule(inputs, filters): @@ -51,3 +52,107 @@ def upsamplingModule(inputs, filters): norm1 = BatchNormalization()(leak1) return norm1 + + +def getModel(input_size): + """ + Implement the Improved UNet as per: https://arxiv.org/abs/1802.10508v1 + """ + + # Entry block + inputs = Input(shape=input_size) + + # Layer 1 (16 filter) - Context Pathway + conv1 = Conv2D(16, (3, 3), strides=1, padding="same")(inputs) + leak1 = LeakyReLU(0.01)(conv1) + + cont1 = contextModule(leak1, 16) + + add1 = Add()([leak1, cont1]) + + # Layer 2 (32 filter) - Context Pathway + conv2 = Conv2D(32, (3, 3), strides=2, padding="same")(add1) + leak2 = LeakyReLU(0.01)(conv2) + + cont2 = contextModule(leak2, 32) + + add2 = Add()([leak2, cont2]) + + # Layer 3 (64 filter) - Context Pathway + conv3 = Conv2D(64, (3, 3), strides=2, padding="same")(add2) + leak3 = LeakyReLU(0.01)(conv3) + + cont3 = contextModule(leak3, 64) + + add3 = Add()([leak3, cont3]) + + # Layer 4 (128 filter) - Context Pathway + conv4 = Conv2D(128, (3, 3), strides=2, padding="same")(add3) + leak4 = LeakyReLU(0.01)(conv4) + + cont4 = contextModule(leak4, 128) + + add4 = Add()([leak4, cont4]) + + # Layer 5 (256 filter) - Bottleneck + conv5 = Conv2D(256, (3, 3), strides=2, padding="same")(add4) + leak5 = LeakyReLU(0.01)(conv5) + + cont5 = contextModule(leak5, 256) + + add5 = Add()([leak5, cont5]) + + # Layer 5 (128 filter) - Bottleneck + upsamp1 = upsamplingModule(add5, 128) + + concat1 = Concatenate()([upsamp1, add4]) + + # Layer 4 (128 and 64 filters) - Localization Pathway + local1 = localizationModule(concat1, 128) + upsamp2 = upsamplingModule(local1, 64) + + concat2 = Concatenate()([upsamp2, add3]) + + # Layer 3 (64 and 32 filters) - Localization Pathway + local2 = localizationModule(concat2, 64) + upsamp3 = upsamplingModule(local2, 32) + + concat3 = Concatenate()([upsamp3, add2]) + + seg1 = Conv2D(2, (3, 3), strides=1, padding="same")(local2) + seg1 = LeakyReLU(0.01)(seg1) + + # Layer 2 (32 and 16 filters) - Localization Pathway + local3 = localizationModule(concat3, 32) + upsamp4 = upsamplingModule(local3, 16) + + concat4 = Concatenate()([upsamp4, add1]) + + seg2 = Conv2D(2, (3, 3), strides=1, padding="same")(local3) + seg2 = LeakyReLU(0.01)(seg2) + + segUp1 = UpSampling2D((2, 2))(seg1) + add6 = Add()([segUp1, seg2]) + + # Layer 1 (32 filter) - Localization Pathway + conv6 = Conv2D(32, (3, 3), strides=1, padding="same")(concat4) + + seg3 = Conv2D(2, (3, 3), strides=1, padding="same")(conv6) + seg3 = LeakyReLU(0.01)(seg3) + + segUp2 = UpSampling2D((2, 2))(seg2) + add7 = Add()([segUp2, seg3]) + + output = Conv2D(2, (3, 3), strides=1, padding="same", activation="softmax")(add7) + model = Model(inputs, output) + + return model + + +def main(): + model = get_model((256, 256, 1)) + print(model.summary()) + + +if __name__ == "__main__": + main()