From adc32281096a9cf362177d00fd739614654f1680 Mon Sep 17 00:00:00 2001 From: Adam Milton-Barker Date: Mon, 30 Mar 2020 09:40:48 +0200 Subject: [PATCH 01/13] Fixed typos, file names and formatting --- CNN/README.md | 65 +++++++++++++++++++++++--------------- CNN/Scripts/AutoRun.sh | 20 ++++++++++++ CNN/Scripts/Randomizer.sh | 43 +++++++++++++++++++++++++ CNN/Scripts/TimeDiff.sh | 21 ++++++++++++ CNN/Setup.sh | 3 +- CONTRIBUTING.md | 12 ------- Documentation/Anaconda.md | 10 +++--- Documentation/AutoPilot.md | 64 +++++++++++++++++++++++++++++++++++++ Documentation/README.md | 8 ++++- Documentation/Windows.md | 52 ++++++++++++++++++++++++++++++ README.md | 32 +++++++++++++------ 11 files changed, 278 insertions(+), 52 deletions(-) create mode 100644 CNN/Scripts/AutoRun.sh create mode 100644 CNN/Scripts/Randomizer.sh create mode 100644 CNN/Scripts/TimeDiff.sh create mode 100644 Documentation/AutoPilot.md create mode 100644 Documentation/Windows.md diff --git a/CNN/README.md b/CNN/README.md index 586368e..bf746f7 100644 --- a/CNN/README.md +++ b/CNN/README.md @@ -6,7 +6,7 @@ ## Introduction -This project is the classifier that is used in Acute the Lymphoblastic Leukemia Detection System 2020. The network provided in this project was originally created in [ALL research papers evaluation project](https://github.com/leukemiaresearchassociation/ALL-IDB-Classifiers/blob/master/Python/Tensorflow/2-0/Classification/ALL-Papers/Evaluations/Paper-1.md "ALL research papers evaluation project"), where we replicated the network proposed in the [Acute Leukemia Classification Using Convolution Neural Network In Clinical Decision Support System](https://airccj.org/CSCP/vol7/csit77505.pdf "Acute Leukemia Classification Using Convolution Neural Network In Clinical Decision Support System") paper by Thanh.TTP, Giao N. Pham, Jin-Hyeok Park, Kwang-Seok Moon, Suk-Hwan Lee, and Ki-Ryong Kwon, and the data augmentation proposed in [Leukemia Blood Cell Image Classification Using Convolutional Neural Network](http://www.ijcte.org/vol10/1198-H0012.pdf "Leukemia Blood Cell Image Classification Using Convolutional Neural Network") by T. T. P. Thanh, Caleb Vununu, Sukhrob Atoev, Suk-Hwan Lee, and Ki-Ryong Kwon. The original project was inspired by the [work](https://github.com/AmlResearchProject/AML-ALL-Classifiers/blob/master/Python/_Keras/QuantisedCode/QuantisedCode.ipynb "work") done by [Amita Kapoor](https://www.leukemiaresearchassociation.ai/team/amita-kapoor/profile "Amita Kapoor") and [Taru Jain](https://www.leukemiaresearchassociation.ai/student-program/student/taru-jain "Taru Jain") and Adam's [projects](https://github.com/AMLResearchProject/AML-ALL-Classifiers/tree/master/Python/_Keras/AllCNN "projects") based on their work. +This project is the classifier that is used in Acute the Lymphoblastic Leukemia Detection System 2020. The network provided in this project was originally created in [ALL research papers evaluation project](https://github.com/leukemiaresearchassociation/ALL-IDB-Classifiers/blob/master/Python/Tensorflow/2-0/Classification/ALL-Papers/Evaluations/Paper-1.md "ALL research papers evaluation project"), where we replicated the network proposed in the [Acute Leukemia Classification Using Convolution Neural Network In Clinical Decision Support System](https://airccj.org/CSCP/vol7/csit77505.pdf "Acute Leukemia Classification Using Convolution Neural Network In Clinical Decision Support System") paper by Thanh.TTP, Giao N. Pham, Jin-Hyeok Park, Kwang-Seok Moon, Suk-Hwan Lee, and Ki-Ryong Kwon, and the data augmentation proposed in [Leukemia Blood Cell Image Classification Using Convolutional Neural Network](http://www.ijcte.org/vol10/1198-H0012.pdf "Leukemia Blood Cell Image Classification Using Convolutional Neural Network") by T. T. P. Thanh, Caleb Vununu, Sukhrob Atoev, Suk-Hwan Lee, and Ki-Ryong Kwon. The original project was inspired by the [work](https://github.com/AmlResearchProject/AML-ALL-Classifiers/blob/master/Python/_Keras/QuantisedCode/QuantisedCode.ipynb "work") done by [Amita Kapoor](https://www.petermossamlallresearch.com/team/amita-kapoor/profile "Amita Kapoor") and [Taru Jain](https://www.petermossamlallresearch.com/students/student/taru-jain/profile "Taru Jain") and Adam's [projects](https://github.com/AMLResearchProject/AML-ALL-Classifiers/tree/master/Python/_Keras/AllCNN "projects") based on their work. _This is a high level tutorial for those that have little to no programming experience allowing them to use the system. In the coming weeks a series of low level articles will be published on our [Medium](https://medium.com/leukemiaairesearch "Medium") for the more experienced developers._ @@ -22,28 +22,23 @@ Below are the results from individual training sessions. | Hardware | Training | Validation | Test | Accuracy | Recall | Precision | AUC/ROC | | -------------------- | -------------------- | ----- | ---------- | ---------- | ---------- | ---------- | ---------- | -| NVIDIA GTX 1050 Ti Ti/PCIe/SSE2 | 1180 | 404 | 20 | 0.97772276 | 0.97772276 | 0.97772276 | 0.9945594 | -| Intel® Core™ i7-7700HQ CPU @ 2.80GHz × 8 | 1180 | 404 | 20 | 0.9752475 | 0.9752475 | 0.9752475 | 0.991492 | -| Intel® Core™ i5 CPU @ 2.4 GHz | 1180 | 404 | 20 | 0.9589041 | 0.9589041 | 0.9589041 | 0.99483955 | +| Windows 10 | NVIDIA GeoForce GTX 1060 | 1180 | 404 | 20 | 0.97066015 | 0.97066015 | 0.97066015 | 0.9908836 | +| Ubuntu 18.04 | NVIDIA GTX 1050 Ti Ti/PCIe/SSE2 | 1180 | 404 | 20 | 0.97772276 | 0.97772276 | 0.97772276 | 0.9945594 | +| Ubuntu 18.04 | Intel® Core™ i7-7700HQ CPU @ 2.80GHz × 8 | 1180 | 404 | 20 | 0.9752475 | 0.9752475 | 0.9752475 | 0.991492 | +| Windows 10 | Intel® Core™ i7-7700HQ CPU @ 2.80GHz × 8 | 1180 | 404 | 20 | 0.9851485 | 0.9851485 | 0.9851485 | 0.9985846 | +| Ubuntu 18.04 | Intel® Core™ i5 CPU @ 2.4 GHz | 1180 | 404 | 20 | 0.9589041 | 0.9589041 | 0.9589041 | 0.99483955 |   -# Hardware - -- Intel® Core™ i7-7700HQ CPU @ 2.80GHz × 8 -- GeForce GTX 1050 Ti/PCIe/SSE2 - -# OS - -- Ubuntu 18.04 64-bit - # Programming Language - Python 3.7 +  + # Software -In this project I used the following software: +In this project we have used the following softwares: - Anaconda - Tensorflow 2 GPU @@ -56,12 +51,22 @@ In this project I used the following software: If you haven't already installed Anaconda and set up your conda env and Tensorflow installation, please follow our [Anaconda installation guide](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/Documentation/Anaconda.md "Anaconda installation guide"). -All other requirements should be included in **Setup.sh** you can run this file on Linux or Mac by navigating to the **CNN** directory in terminal and using the command below: +## Setup.sh + +All other requirements are included in **Setup.sh**. You can run this file on machine by navigating to the **CNN** directory in terminal and using the command below: ``` sh Setup.sh ``` +## Windows Installation Issue(s) + +If you're working on a Windows 10 machine and facing some issues, please follow our [Windows Issues guide](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/Documentation/Windows.md "Windows Issues guide"). In case your issue is not mentioned and you're able to solve it, do create a pull request mentioning the same in the aforementioned file. + +## AutoRun Scripts + +If you would like to replicate the exact scenarios we tested in or simply like to put the entire process in AutoRun, please follow our [AutoRun guide](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/Documentation/AutoRun.md "AutoRun guide"). +   # Network Architecture @@ -94,7 +99,7 @@ Once you have your data you need to add it to the project filesystem. You will n We will created an augmented dataset based on the [Leukemia Blood Cell Image Classification Using Convolutional Neural Network](http://www.ijcte.org/vol10/1198-H0012.pdf "Leukemia Blood Cell Image Classification Using Convolutional Neural Network") by T. T. P. Thanh, Caleb Vununu, Sukhrob Atoev, Suk-Hwan Lee, and Ki-Ryong Kwon. In this case, we will use more rotated images to increase the dataset further. -First take the ten positive and ten negative samples shown below, and place them in the **Model/Data/Test** directory. This will be used by our Oculus Rift application and our testing purposes. You can use any data split you like, to ensure you get the same results please use the same test images and the CPU for training. There is currently an issue when using GPU, most likely due to randomness implemented in the GPU software. It is possible to replicate the results here but it may take more than one attempt at training. This is something I will work on for a future update. +First take the ten positive and ten negative samples shown below, and place them in the **Model/Data/Test** directory. This will be used by our Oculus Rift application and our testing purposes. You can use any data split you like, to ensure you get the same results please use the same test images and the CPU for training. There is currently an issue when using GPU, most likely due to randomness implemented in the GPU software. It is possible to replicate the results here but it may take more than one attempt at training. This is something we will work on for a future update. - im006_1.jpg - im020_1.jpg @@ -141,6 +146,7 @@ Our functionality for this network can be found mainly in the **Classes** direct | Data.py | [Data.py](https://github.com/AMLResearchProject/ALL-Detection-System-2020/tree/master/CNN/Classes/Data.py "Data.py") is a data helper class. The class provides the functionality for sorting and preparing your training and validation data. | | | Augmentation.py | [Augmentation.py](https://github.com/AMLResearchProject/ALL-Detection-System-2020/tree/master/CNN/Classes/Augmentation.py "Model.py") is a augmentation helper class, The class provides functionality for data augmentation. | | Model.py | [Model.py](https://github.com/AMLResearchProject/ALL-Detection-System-2020/tree/master/CNN/Classes/Model.py "Model.py") is a model helper class. The class provides the functionality for creating our CNN. | +| Server.py | [Server.py](https://github.com/AMLResearchProject/ALL-Detection-System-2020/tree/master/CNN/Classes/Server.py "Server.py"): is a server helpers class. The class provides the functionality for creating our CNN | #### Functions @@ -191,7 +197,12 @@ Our functionality for this network can be found mainly in the **Classes** direct | vr_http_classify() | The vr_http_classify() classifies an image sent via from VR via HTTP. | | get_predictions() | The get_predictions() gets a prediction for an image. | | reshape() | The reshape() reshapes an image. | -| Server.py | start() | The start() starts the classification API server. | + + ##### Server.py + +| Function | Description | +| --------- | -------- | +| start() | The start() starts the classification API server. |   @@ -269,7 +280,7 @@ Our functionality for this network can be found mainly in the **Classes** direct } ``` -The cnn object contains 3 Json Objects (api, data, model and train) and a JSON Array (core). Api has the information used to set up your server you will need to add your local ip, data has the configuration related to preparing the training and validation data. Model holds the model file paths, and train holds the training parameters. +The cnn object contains 4 Json Objects (api, data, model and train) and a JSON Array (core). Api has the information used to set up your server you will need to add your local ip, data has the configuration related to preparing the training and validation data, model holds the model file paths, and train holds the training parameters. In my case, the configuration above was the best out of my testing, but you may find different configurations work better. Feel free to update these settings to your liking, and please let us know of your experiences. @@ -299,7 +310,7 @@ Now you are ready to train your model. As mentioned above, an Ubuntu machine wit Ensuring you have completed all previous steps, you can start training using the following command. ``` -python3 AllDS2020.py Train +python AllDS2020.py Train ``` This tells the classifier to start in Train mode which will start the model training process. @@ -425,7 +436,7 @@ Now we will use the test data to see how the classifier reacts to our testing da This part of the system will use the test data from the **Model/Data/ALL-IDB-1/Test** directory. The command to start testing locally is as follows: ``` -python3 AllDS2020.py Classify +python AllDS2020.py Classify ``` ## Output/Results @@ -489,13 +500,13 @@ This part of the system will use the test data from the **Model/Data/Test** dire You need to open two terminal windows or tabs, in the first, use the following command to start the server: ``` -python3 AllDS2020.py Server +python AllDS2020.py Server ``` In your second terminal, use the following command: ``` -python3 AllDS2020.py Client +python AllDS2020.py Client ``` ## Output/Results @@ -582,11 +593,11 @@ Please read the [CONTRIBUTING](https://github.com/AMLResearchProject/ALL-Detecti ## Contributors -- **AUTHOR:** [Adam Milton-Barker](https://www.leukemiaresearchassociation.ai/team/adam-milton-barker "Adam Milton-Barker") - [Peter Moss Leukemia AI Research](https://www.leukemiaresearchassociation.ai "Peter Moss Leukemia AI Research") founder & Intel Software Innovator, Sabadell, Spain +- **AUTHOR:** [Adam Milton-Barker](https://www.petermossamlallresearch.com/team/adam-milton-barker/profile "Adam Milton-Barker") - [Peter Moss Leukemia AI Research](https://www.leukemiaresearchassociation.ai "Peter Moss Leukemia AI Research") founder & Intel Software Innovator, Sabadell, Spain -- **TESTING:** [Rishabh Banga](https://www.leukemiaresearchassociation.ai/team/rishabh-banga "Rishabh Banga") - [Peter Moss Leukemia AI Research](https://www.leukemiaresearchassociation.ai "Peter Moss Leukemia AI Research") & Intel Software Innovator, Dehli, India +- **TESTER:** [Rishabh Banga](https://www.petermossamlallresearch.com/team/rishabh-banga/profile "Rishabh Banga") - [Peter Moss Leukemia AI Research](https://www.leukemiaresearchassociation.ai "Peter Moss Leukemia AI Research") & Intel Software Innovator, Delhi, India -- **TESTING:** [Javier Lopez Alonso](https://www.leukemiaresearchassociation.ai/team/javier-lopez-alonso "Javier Lopez Alonso") - [Peter Moss Leukemia AI Research](https://www.leukemiaresearchassociation.ai "Peter Moss Leukemia AI Research") co-founder, Barcelona, Spain +- **TESTER:** [Javier Lopez Alonso](https://www.leukemiaresearchassociation.ai/team/javier-lopez-alonso "Javier Lopez Alonso") - [Peter Moss Leukemia AI Research](https://www.leukemiaresearchassociation.ai "Peter Moss Leukemia AI Research") Co-Founder, Barcelona, Spain   @@ -594,10 +605,14 @@ Please read the [CONTRIBUTING](https://github.com/AMLResearchProject/ALL-Detecti We use SemVer for versioning. For the versions available, see [Releases](https://github.com/AMLResearchProject/ALL-Detection-System-2020/releases "Releases"). +  + # License This project is licensed under the **MIT License** - see the [LICENSE](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/LICENSE "LICENSE") file for details. +  + # Bugs/Issues We use the [repo issues](https://github.com/AMLResearchProject/ALL-Detection-System-2020/issues "repo issues") to track bugs and general requests related to using this project. See [CONTRIBUTING](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/CONTRIBUTING.md "CONTRIBUTING") for more info on how to submit bugs, feature requests and proposals. \ No newline at end of file diff --git a/CNN/Scripts/AutoRun.sh b/CNN/Scripts/AutoRun.sh new file mode 100644 index 0000000..203f9c2 --- /dev/null +++ b/CNN/Scripts/AutoRun.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +echo "Installing dependencies via Setup Script" +sh ../Setup.sh +read -p 'Do you want to randomize the image transfer in Test folder? (Y/N) - ' input +read -p 'Enter path to im folder of ALL_IDB1 (in Windows path should be in format C:/Users/ instead of C:\Users\) - ' imPath +if [[ "$input" == "Y" ]]; then + ./Randomizer.sh -path $imPath -randomize $input +else + ./Randomizer.sh -path $imPath -randomize N +fi +echo "-- Starting training" +echo " " +cd - +TimeDiff.sh -op Train +echo "-- Finished training" +echo "-- Starting classifying" +echo " " +TimeDiff.sh -op Classify +echo "-- Finished classifying. Exiting Script." \ No newline at end of file diff --git a/CNN/Scripts/Randomizer.sh b/CNN/Scripts/Randomizer.sh new file mode 100644 index 0000000..a201f77 --- /dev/null +++ b/CNN/Scripts/Randomizer.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +function show_usage (){ + printf "Usage: $0 [options [parameters]]\n" + printf "\n" + printf "Options:\n" + printf " -path, Enter path to im folder of ALL_IDB1 (If Windows use full path starting with /mnt/c/\n" + printf " -randomize Y, Randomizes the images being transferred to Test Folder. Only use if not performance testing\n" + printf " i.e. Recreating the exact scenario using fixed test files\n" + printf " -h, Print help\n" +return 0 +} + +function incorrect_usage (){ + echo "-- Incorrect input provided" + echo " " + show_usage + echo " " + echo "Exiting script --" + exit +} + +if [[ "$1" == "-h" ]]; then + show_usage + exit +elif [[ "$1" == "-path" ]]; then + imPath=$2 + echo "Copying images to current path" + cp $imPath/* ../Model/Data/Train/ + if [[ "$4" == "Y" ]]; then + echo "Copying random images to Test folder" + shuf -zn10 -e ../Model/Data/Train/*_1.jpg | xargs -0 mv -vt ../Model/Data/Test/ + shuf -zn10 -e ../Model/Data/Train/*_0.jpg | xargs -0 mv -vt ../Model/Data/Test/ + elif [[ "$4" == "N" ]]; then + mv im006_1.jpg im020_1.jpg im024_1.jpg im026_1.jpg im028_1.jpg im031_1.jpg im035_0.jpg im041_0.jpg im047_0.jpg im053_1.jpg im057_1.jpg im060_1.jpg im063_1.jpg im069_0.jpg im074_0.jpg im088_0.jpg im095_0.jpg im099_0.jpg im101_0.jpg im106_0.jpg ../Test/ + else + incorrect_usage + fi + echo "Done" +else + incorrect_usage + exit +fi \ No newline at end of file diff --git a/CNN/Scripts/TimeDiff.sh b/CNN/Scripts/TimeDiff.sh new file mode 100644 index 0000000..cc3e605 --- /dev/null +++ b/CNN/Scripts/TimeDiff.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +timediff(){ + op=$1 + START=$(date +%s) + cd ../ + python AllDS2020.py $op + END=$(date +%s) + DIFF=$(( $END - $START )) + printf 'Operation %s took %ddays %dhrs %dmins %dsec\n' $op $(($DIFF/86400)) $(($DIFF%86400/3600)) $(($DIFF%3600/60)) \ $(($DIFF%60)) + cd - + exit +} + +if [[ "$2" == "Classify" ]] || [[ "$2" == "Train" ]] ; then + timediff $2 +else + echo "Wrong Input Provided" + echo "Use -op Train or -op Classify" + exit 0 +fi \ No newline at end of file diff --git a/CNN/Setup.sh b/CNN/Setup.sh index 1727800..08f89d5 100644 --- a/CNN/Setup.sh +++ b/CNN/Setup.sh @@ -1,5 +1,6 @@ -#!/bin/sh +#!/bin/bash +source ~/anaconda3/etc/profile.d/conda.sh echo "-- Installing requirements" echo " " conda install opencv diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3bc5942..2da8d11 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -54,14 +54,10 @@ When you are satisfied with your changes you can submit a pull request that will Please note we have a code of conduct, please follow it in all your interactions with the project. -  - ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. -  - ## Our Standards Examples of behavior that contributes to creating a positive environment include: @@ -80,8 +76,6 @@ Examples of unacceptable behavior by participants include: - Publishing others' private information, such as a physical or electronic address, without explicit permission - Other conduct which could reasonably be considered inappropriate in a professional setting -  - ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. @@ -89,20 +83,14 @@ Project maintainers are responsible for clarifying the standards of acceptable b Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. -  - ## Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. -  - ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at info@leukemiaresearchfoundation.ai All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. -  - Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.   diff --git a/Documentation/Anaconda.md b/Documentation/Anaconda.md index 2d13a3a..dbd7e11 100644 --- a/Documentation/Anaconda.md +++ b/Documentation/Anaconda.md @@ -2,12 +2,12 @@ ## Acute Lymphoblastic Leukemia Detection System 2020 -  - # Anaconda Installation Anaconda lets you create virtual environments for your projects. Within the environments you can install Python packages that will not interfere with your core Python installations. A particularly useful feature is that you are able to spin up an environment with Tensorflow GPU in a few seconds, this installation is separate from you system installation meaning you can play around without causing issues. +  + ## Installation ``` @@ -59,8 +59,6 @@ And you can deactivate an environment using the following: conda deactivate ``` -  - # Contributing The Peter Moss Acute Myeloid & Lymphoblastic Leukemia AI Research project encourages and welcomes code contributions, bug fixes and enhancements from the Github. @@ -77,10 +75,14 @@ Please read the [CONTRIBUTING](https://github.com/AMLResearchProject/ALL-Detecti We use SemVer for versioning. For the versions available, see [Releases](https://github.com/AMLResearchProject/ALL-Detection-System-2020/releases "Releases"). +  + # License This project is licensed under the **MIT License** - see the [LICENSE](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/LICENSE "LICENSE") file for details. +  + # Bugs/Issues We use the [repo issues](https://github.com/AMLResearchProject/ALL-Detection-System-2020/issues "repo issues") to track bugs and general requests related to using this project. See [CONTRIBUTING](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/CONTRIBUTING.md "CONTRIBUTING") for more info on how to submit bugs, feature requests and proposals. \ No newline at end of file diff --git a/Documentation/AutoPilot.md b/Documentation/AutoPilot.md new file mode 100644 index 0000000..4b06c4e --- /dev/null +++ b/Documentation/AutoPilot.md @@ -0,0 +1,64 @@ +# Peter Moss Acute Myeloid & Lymphoblastic Leukemia AI Research Project + +## Acute Lymphoblastic Leukemia Detection System 2020 + +## Using AutoPilot functionality + +To run in autopilot we'd be utilizing 3 scripts: + +1. Autorun.sh +2. Randomizer.sh +3. Timediff.sh + +All of these are located inside the Scripts folder of the CNN Directory. So, first step is to go inside the Scripts directory. + +``` +cd Scripts +``` + +From here we run + +``` +sh Autorun.sh +``` +**Autorun.sh** acts as a wrapper for **Script.sh** and runs all the remaining scripts. Now sit back and enjoy the ride as dependencies start installing on their own, but before you can completely relax you have to provide a couple of more inputs + +``` +Do you want to randomize the image transfer in Test folder? (Y/N) - +``` +If you put N here, then **Randomizer.sh** will replicate the exact scenario in terms of sorting Train and Test images based on which we measured performance. + +``` +Enter path to im folder of ALL_IDB1 (in Windows path should be in format C:/Users/ instead of C:\Users\ +``` +This one is pretty self explanatory, so path to be provided by User should be in the format C:/Users/XYZ/PML-AI-Research/ALL_IDB_Data/ALL_IDB1/im + +Once all this is done, Training and Testing would begin with **Timediff.sh** running each of them and recording the total time taken by each. + +# Contributing + +The Peter Moss Acute Myeloid & Lymphoblastic Leukemia AI Research project encourages and welcomes code contributions, bug fixes and enhancements from the Github. + +Please read the [CONTRIBUTING](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/CONTRIBUTING.md "CONTRIBUTING") document for a full guide to forking our repositories and submitting your pull requests. You will also find information about our code of conduct on this page. + +  + +## Contributors + +- **AUTHOR:** [Rishabh Banga](https://www.petermossamlallresearch.com/team/rishabh-banga/profile "Rishabh Banga") - [Peter Moss Leukemia AI Research](https://www.leukemiaresearchassociation.ai "Peter Moss Leukemia AI Research") & Intel Software Innovator, Delhi, India + +# Versioning + +We use SemVer for versioning. For the versions available, see [Releases](https://github.com/AMLResearchProject/ALL-Detection-System-2020/releases "Releases"). + +  + +# License + +This project is licensed under the **MIT License** - see the [LICENSE](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/LICENSE "LICENSE") file for details. + +  + +# Bugs/Issues + +We use the [repo issues](https://github.com/AMLResearchProject/ALL-Detection-System-2020/issues "repo issues") to track bugs and general requests related to using this project. See [CONTRIBUTING](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/CONTRIBUTING.md "CONTRIBUTING") for more info on how to submit bugs, feature requests and proposals. \ No newline at end of file diff --git a/Documentation/README.md b/Documentation/README.md index 16db0a3..9b3fa0e 100644 --- a/Documentation/README.md +++ b/Documentation/README.md @@ -16,7 +16,9 @@ Please read the [CONTRIBUTING](https://github.com/AMLResearchProject/ALL-Detecti ## Contributors -- **AUTHOR:** [Adam Milton-Barker](https://www.leukemiaresearchassociation.ai/team/adam-milton-barker "Adam Milton-Barker") - [Peter Moss Leukemia AI Research](https://www.leukemiaresearchassociation.ai "Peter Moss Leukemia AI Research") founder & Intel Software Innovator, Sabadell, Spain +- **AUTHOR:** [Adam Milton-Barker](https://www.petermossamlallresearch.com/team/adam-milton-barker/profile "Adam Milton-Barker") - [Peter Moss Leukemia AI Research](https://www.leukemiaresearchassociation.ai "Peter Moss Leukemia AI Research") Founder & Intel Software Innovator, Sabadell, Spain + +- **AUTHOR:** [Rishabh Banga](https://www.petermossamlallresearch.com/team/rishabh-banga/profile "Rishabh Banga") - [Peter Moss Leukemia AI Research](https://www.leukemiaresearchassociation.ai "Peter Moss Leukemia AI Research") & Intel Software Innovator, Delhi, India   @@ -24,10 +26,14 @@ Please read the [CONTRIBUTING](https://github.com/AMLResearchProject/ALL-Detecti We use SemVer for versioning. For the versions available, see [Releases](https://github.com/AMLResearchProject/ALL-Detection-System-2020/releases "Releases"). +  + # License This project is licensed under the **MIT License** - see the [LICENSE](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/LICENSE "LICENSE") file for details. +  + # Bugs/Issues We use the [repo issues](https://github.com/AMLResearchProject/ALL-Detection-System-2020/issues "repo issues") to track bugs and general requests related to using this project. See [CONTRIBUTING](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/CONTRIBUTING.md "CONTRIBUTING") for more info on how to submit bugs, feature requests and proposals. \ No newline at end of file diff --git a/Documentation/Windows.md b/Documentation/Windows.md new file mode 100644 index 0000000..b1279e8 --- /dev/null +++ b/Documentation/Windows.md @@ -0,0 +1,52 @@ +# Peter Moss Acute Myeloid & Lymphoblastic Leukemia AI Research Project + +## Acute Lymphoblastic Leukemia Detection System 2020 + +**Issue #1 +ImportError: DLL load failed: The specified module could not be found** + +**OS -** Windows 10 + +**Reason -** As per TF's Release Notes for 2.1.0. Officially-released Tensorflow Pip packages are now built with Visual Studio 2019 version 16.4 in order to take advantage of the new /d2ReducedOptimizeHugeFunctions compiler flag. + +To use these new packages, you must install "Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019", available from Microsoft's website here. + +**Solution -** If you are facing this after Tensorflow 2.1.0, it is probably because Tensorflow (CPU version) comes with GPU support by default. And it requires Microsoft Visual C++ Redistributable for Visual Studio 2015/17/19 as shown in the installation step #1 on the website. + +**Issue #2 - Win10: AttributeError: 'RepeatedCompositeFieldContainer' object has no attribute 'append'** + +**OS -** Windows 10 + +**Reason -** For binaries, the PIP dependency is protobuf >= 3.9.2. The same can be referred from [here](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/pip_package/setup.py#L64) + +**Solution -** Run pip install -U protobuf to install latest version of protobuf + +  + +# Contributing + +The Peter Moss Acute Myeloid & Lymphoblastic Leukemia AI Research project encourages and welcomes code contributions, bug fixes and enhancements from the Github. + +Please read the [CONTRIBUTING](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/CONTRIBUTING.md "CONTRIBUTING") document for a full guide to forking our repositories and submitting your pull requests. You will also find information about our code of conduct on this page. + +## Contributors + +- **AUTHOR:** [Rishabh Banga](https://www.petermossamlallresearch.com/team/rishabh-banga/profile "Rishabh Banga") - [Peter Moss Leukemia AI Research](https://www.leukemiaresearchassociation.ai "Peter Moss Leukemia AI Research") & Intel Software Innovator, Delhi, India + +  + +# Versioning + +We use SemVer for versioning. For the versions available, see [Releases](https://github.com/AMLResearchProject/ALL-Detection-System-2020/releases "Releases"). + +  + +# License + +This project is licensed under the **MIT License** - see the [LICENSE](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/LICENSE "LICENSE") file for details. + +  + +# Bugs/Issues + +We use the [repo issues](https://github.com/AMLResearchProject/ALL-Detection-System-2020/issues "repo issues") to track bugs and general requests related to using this project. See [CONTRIBUTING](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/CONTRIBUTING.md "CONTRIBUTING") for more info on how to submit bugs, feature requests and proposals. \ No newline at end of file diff --git a/README.md b/README.md index f993a39..4f6d419 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ ![Peter Moss Acute Myeloid & Lymphoblastic Leukemia AI Research Project](Media/Images/AllVrCNN.jpg) +  + # Introduction The Acute Lymphoblastic Leukemia Detection System 2020 uses Tensorflow 2 & Oculus Rift to provide a virtual diagnosis system. @@ -14,6 +16,8 @@ This project is made up of a number of components which work together as a netwo _This is a high level tutorial for those with little or no programming experience. In future articles I will go into the low level workings of the project._ +  + # Classifier Results Overview We have tested our model on a number of different hardwares, including Intel® CPUs & NVIDIA GPUs. Results seem to vary between CPU & GPU, and tests show further investigation into seeding and randomness introduced to our network via the GPU software. For reproducible results every time, it is suggested to train on a CPU, although this obviously requires more time. @@ -22,11 +26,15 @@ One method to overcome reproducibility issues and get an good idea of how well o Below are the results from individual training sessions. -| Hardware | Training | Validation | Test | Accuracy | Recall | Precision | AUC/ROC | -| -------------------- | -------------------- | ----- | ---------- | ---------- | ---------- | ---------- | ---------- | -| NVIDIA GTX 1050 Ti Ti/PCIe/SSE2 | 1180 | 404 | 20 | 0.97772276 | 0.97772276 | 0.97772276 | 0.9945594 | -| Intel® Core™ i7-7700HQ CPU @ 2.80GHz × 8 | 1180 | 404 | 20 | 0.9752475 | 0.9752475 | 0.9752475 | 0.991492 | -| Intel® Core™ i5 CPU @ 2.4 GHz | 1180 | 404 | 20 | 0.9589041 | 0.9589041 | 0.9589041 | 0.99483955 | +| Operating System | Hardware | Training | Validation | Test | Accuracy | Recall | Precision | AUC/ROC | +| -------------------- | -------------------- | -------------------- | ----- | ---------- | ---------- | ---------- | ---------- | ---------- | +| Windows 10 | NVIDIA GeoForce GTX 1060 | 1180 | 404 | 20 | 0.97066015 | 0.97066015 | 0.97066015 | 0.9908836 | +| Ubuntu 18.04 | NVIDIA GTX 1050 Ti Ti/PCIe/SSE2 | 1180 | 404 | 20 | 0.97772276 | 0.97772276 | 0.97772276 | 0.9945594 | +| Ubuntu 18.04 | Intel® Core™ i7-7700HQ CPU @ 2.80GHz × 8 | 1180 | 404 | 20 | 0.9752475 | 0.9752475 | 0.9752475 | 0.991492 | +| Windows 10 | Intel® Core™ i7-7700HQ CPU @ 2.80GHz × 8 | 1180 | 404 | 20 | 0.9851485 | 0.9851485 | 0.9851485 | 0.9985846 | +| Ubuntu 18.04 | Intel® Core™ i5 CPU @ 2.4 GHz | 1180 | 404 | 20 | 0.9589041 | 0.9589041 | 0.9589041 | 0.99483955 | + +  # Clone the repository @@ -42,6 +50,8 @@ The **-b "0.0.2"** parameter ensures you get the code from the latest developmen Once you have used the command above you will see a directory called **ALL-Detection-System-2020** in the location you chose to clone to. In terminal, navigate to the **ALL-Detection-System-2020** directory, this is your project root directory. +  + # ALL-IDB You need to be granted access to use the Acute Lymphoblastic Leukemia Image Database for Image Processing dataset. You can find the application form and information about getting access to the dataset on [this page](https://homes.di.unimi.it/scotti/all/#download) as well as information on how to contribute back to the project [here](https://homes.di.unimi.it/scotti/all/results.php). If you are not able to obtain a copy of the dataset please feel free to try this tutorial on your own dataset, we would be very happy to find additional AML & ALL datasets. @@ -50,7 +60,7 @@ You need to be granted access to use the Acute Lymphoblastic Leukemia Image Data In this project, [ALL-IDB1](https://homes.di.unimi.it/scotti/all/#datasets) is used, one of the datsets from the Acute Lymphoblastic Leukemia Image Database for Image Processing dataset. We will use data augmentation to increase the amount of training and testing data we have. -"The ALL_IDB1 version 1.0 can be used both for testing segmentation capability of algorithms, as well as the classification systems and image preprocessing methods. This dataset is composed of 108 images collected during September, 2005. It contains about 39000 blood elements, where the lymphocytes has been labeled by expert oncologists. The images are taken with different magnifications of the microscope ranging from 300 to 500." +"The ALL_IDB1 version 1.0 can be used both for testing segmentation capability of algorithms, as well as the classification systems and image preprocessing methods. This dataset is composed of 108 images collected during September, 2005. It contains about 39000 blood elements, where the lymphocytes has been labeled by expert oncologists. The images are taken with different magnifications of the microscope ranging from 300 to 500."   @@ -75,11 +85,11 @@ Please read the [CONTRIBUTING](https://github.com/AMLResearchProject/ALL-Detecti ## Contributors -- **AUTHOR:** [Adam Milton-Barker](https://www.leukemiaresearchassociation.ai/team/adam-milton-barker "Adam Milton-Barker") - [Peter Moss Leukemia AI Research](https://www.leukemiaresearchassociation.ai "Peter Moss Leukemia AI Research") founder & Intel Software Innovator, Sabadell, Spain +- **AUTHOR:** [Adam Milton-Barker](https://www.petermossamlallresearch.com/team/adam-milton-barker/profile "Adam Milton-Barker") - [Peter Moss Leukemia AI Research](https://www.leukemiaresearchassociation.ai "Peter Moss Leukemia AI Research") Founder & Intel Software Innovator, Sabadell, Spain -- **TESTING:** [Rishabh Banga](https://www.leukemiaresearchassociation.ai/team/rishabh-banga "Rishabh Banga") - [Peter Moss Leukemia AI Research](https://www.leukemiaresearchassociation.ai "Peter Moss Leukemia AI Research") & Intel Software Innovator, Dehli, India +- **TESTER:** [Rishabh Banga](https://www.petermossamlallresearch.com/team/rishabh-banga/profile "Rishabh Banga") - [Peter Moss Leukemia AI Research](https://www.leukemiaresearchassociation.ai "Peter Moss Leukemia AI Research") & Intel Software Innovator, Delhi, India -- **TESTING:** [Javier Lopez Alonso](https://www.leukemiaresearchassociation.ai/team/javier-lopez-alonso "Javier Lopez Alonso") - [Peter Moss Leukemia AI Research](https://www.leukemiaresearchassociation.ai "Peter Moss Leukemia AI Research") co-founder, Barcelona, Spain +- **TESTER:** [Javier Lopez Alonso](https://www.leukemiaresearchassociation.ai/team/javier-lopez-alonso "Javier Lopez Alonso") - [Peter Moss Leukemia AI Research](https://www.leukemiaresearchassociation.ai "Peter Moss Leukemia AI Research") Co-Founder, Barcelona, Spain   @@ -87,10 +97,14 @@ Please read the [CONTRIBUTING](https://github.com/AMLResearchProject/ALL-Detecti We use SemVer for versioning. For the versions available, see [Releases](https://github.com/AMLResearchProject/ALL-Detection-System-2020/releases "Releases"). +  + # License This project is licensed under the **MIT License** - see the [LICENSE](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/LICENSE "LICENSE") file for details. +  + # Bugs/Issues We use the [repo issues](https://github.com/AMLResearchProject/ALL-Detection-System-2020/issues "repo issues") to track bugs and general requests related to using this project. See [CONTRIBUTING](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/CONTRIBUTING.md "CONTRIBUTING") for more info on how to submit bugs, feature requests and proposals. \ No newline at end of file From a8612fca0726fb9d0c6b6456ef2d2e3a4a223b1d Mon Sep 17 00:00:00 2001 From: Adam Milton-Barker Date: Mon, 30 Mar 2020 09:42:54 +0200 Subject: [PATCH 02/13] Fixed typos, file names and formatting --- Documentation/Windows.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Documentation/Windows.md b/Documentation/Windows.md index b1279e8..47f7413 100644 --- a/Documentation/Windows.md +++ b/Documentation/Windows.md @@ -2,6 +2,8 @@ ## Acute Lymphoblastic Leukemia Detection System 2020 +  + **Issue #1 ImportError: DLL load failed: The specified module could not be found** From eb8b7669ad2ff20c9139441f6dd819c48fbe40cd Mon Sep 17 00:00:00 2001 From: Adam Milton-Barker Date: Mon, 30 Mar 2020 09:45:06 +0200 Subject: [PATCH 03/13] Fixed typos, file names and formatting --- CNN/README.md | 4 ++-- Documentation/AutoPilot.md | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CNN/README.md b/CNN/README.md index bf746f7..a4ea251 100644 --- a/CNN/README.md +++ b/CNN/README.md @@ -63,9 +63,9 @@ sh Setup.sh If you're working on a Windows 10 machine and facing some issues, please follow our [Windows Issues guide](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/Documentation/Windows.md "Windows Issues guide"). In case your issue is not mentioned and you're able to solve it, do create a pull request mentioning the same in the aforementioned file. -## AutoRun Scripts +## AutoPilot Scripts -If you would like to replicate the exact scenarios we tested in or simply like to put the entire process in AutoRun, please follow our [AutoRun guide](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/Documentation/AutoRun.md "AutoRun guide"). +If you would like to replicate the exact scenarios we tested in or simply like to put the entire process in AutoPilot, please follow our [AutoPilot guide](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/Documentation/AutoPilot.md "AutoPilot guide").   diff --git a/Documentation/AutoPilot.md b/Documentation/AutoPilot.md index 4b06c4e..e660a39 100644 --- a/Documentation/AutoPilot.md +++ b/Documentation/AutoPilot.md @@ -6,7 +6,7 @@ To run in autopilot we'd be utilizing 3 scripts: -1. Autorun.sh +1. AutoPilot.sh 2. Randomizer.sh 3. Timediff.sh @@ -19,9 +19,9 @@ cd Scripts From here we run ``` -sh Autorun.sh +sh AutoPilot.sh ``` -**Autorun.sh** acts as a wrapper for **Script.sh** and runs all the remaining scripts. Now sit back and enjoy the ride as dependencies start installing on their own, but before you can completely relax you have to provide a couple of more inputs +**AutoPilot.sh** acts as a wrapper for **Script.sh** and runs all the remaining scripts. Now sit back and enjoy the ride as dependencies start installing on their own, but before you can completely relax you have to provide a couple of more inputs ``` Do you want to randomize the image transfer in Test folder? (Y/N) - From 7b7974af4fd3a115074567176a5c777510947dc6 Mon Sep 17 00:00:00 2001 From: Adam Milton-Barker Date: Mon, 30 Mar 2020 09:45:46 +0200 Subject: [PATCH 04/13] Fixed typos, file names and formatting --- Documentation/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Documentation/README.md b/Documentation/README.md index 9b3fa0e..08e51d8 100644 --- a/Documentation/README.md +++ b/Documentation/README.md @@ -4,6 +4,8 @@ ### Documentation +  + This directory will provide documentation for 3rd party software that is required for this project to work.   From 69c8163f7ea00147481ad668bd9154e62286a79f Mon Sep 17 00:00:00 2001 From: Adam Milton-Barker Date: Mon, 30 Mar 2020 09:47:43 +0200 Subject: [PATCH 05/13] Fixed typos, file names and formatting --- CNN/README.md | 2 ++ Documentation/Anaconda.md | 2 ++ Documentation/AutoPilot.md | 6 +++++- Documentation/README.md | 4 ++-- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CNN/README.md b/CNN/README.md index a4ea251..cca4c46 100644 --- a/CNN/README.md +++ b/CNN/README.md @@ -2,6 +2,8 @@ ## Acute Lymphoblastic Leukemia Detection System 2020 +  + # AllDS2020 CNN ## Introduction diff --git a/Documentation/Anaconda.md b/Documentation/Anaconda.md index dbd7e11..d1acc4e 100644 --- a/Documentation/Anaconda.md +++ b/Documentation/Anaconda.md @@ -2,6 +2,8 @@ ## Acute Lymphoblastic Leukemia Detection System 2020 +  + # Anaconda Installation Anaconda lets you create virtual environments for your projects. Within the environments you can install Python packages that will not interfere with your core Python installations. A particularly useful feature is that you are able to spin up an environment with Tensorflow GPU in a few seconds, this installation is separate from you system installation meaning you can play around without causing issues. diff --git a/Documentation/AutoPilot.md b/Documentation/AutoPilot.md index e660a39..8fa887c 100644 --- a/Documentation/AutoPilot.md +++ b/Documentation/AutoPilot.md @@ -2,7 +2,9 @@ ## Acute Lymphoblastic Leukemia Detection System 2020 -## Using AutoPilot functionality +  + +# Using AutoPilot functionality To run in autopilot we'd be utilizing 3 scripts: @@ -35,6 +37,8 @@ This one is pretty self explanatory, so path to be provided by User should be in Once all this is done, Training and Testing would begin with **Timediff.sh** running each of them and recording the total time taken by each. +  + # Contributing The Peter Moss Acute Myeloid & Lymphoblastic Leukemia AI Research project encourages and welcomes code contributions, bug fixes and enhancements from the Github. diff --git a/Documentation/README.md b/Documentation/README.md index 08e51d8..aa3840b 100644 --- a/Documentation/README.md +++ b/Documentation/README.md @@ -2,10 +2,10 @@ ## Acute Lymphoblastic Leukemia Detection System 2020 -### Documentation -   +# Documentation + This directory will provide documentation for 3rd party software that is required for this project to work.   From aef50c8684343036a04a1f5d671f8ee73938a8b4 Mon Sep 17 00:00:00 2001 From: Adam Milton-Barker Date: Mon, 30 Mar 2020 10:17:24 +0200 Subject: [PATCH 06/13] Added Google Colab notebook and GPU results --- CNN/AllDS2020.ipynb | 1 + CNN/README.md | 5 +++-- README.md | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 CNN/AllDS2020.ipynb diff --git a/CNN/AllDS2020.ipynb b/CNN/AllDS2020.ipynb new file mode 100644 index 0000000..149608e --- /dev/null +++ b/CNN/AllDS2020.ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"AllDS2020.ipynb","provenance":[],"collapsed_sections":[],"toc_visible":true,"authorship_tag":"ABX9TyPogNJs5kt23gr3Qqx0EwI0"},"kernelspec":{"name":"python3","display_name":"Python 3"},"accelerator":"GPU"},"cells":[{"cell_type":"markdown","metadata":{"id":"WVpEyyrCwUcd","colab_type":"text"},"source":["# Peter Moss Acute Myeloid & Lymphoblastic Leukemia AI Research Project"]},{"cell_type":"markdown","metadata":{"id":"4ibTVeD8wIYq","colab_type":"text"},"source":["## Acute Lymphoblastic Leukemia Detection System 2020"]},{"cell_type":"markdown","metadata":{"id":"1sCF0koRwL1I","colab_type":"text"},"source":["### AllDS2020 CNN"]},{"cell_type":"markdown","metadata":{"id":"xAVazD95zelW","colab_type":"text"},"source":["#### Introduction\n","\n","This notebook is a lower level tutorial for AllDS2020 CNN. AllDS2020 CNN is the classifier that is used in Acute the Lymphoblastic Leukemia Detection System 2020. \n","\n","The model used here is based on the [Acute Leukemia Classification Using Convolution Neural Network In Clinical Decision Support System](https://airccj.org/CSCP/vol7/csit77505.pdf \"Acute Leukemia Classification Using Convolution Neural Network In Clinical Decision Support System\") paper by Thanh.TTP, Giao N. Pham, Jin-Hyeok Park, Kwang-Seok Moon, Suk-Hwan Lee, and Ki-Ryong Kwon, and the data augmentation proposed in [Leukemia Blood Cell Image Classification Using Convolutional Neural Network](http://www.ijcte.org/vol10/1198-H0012.pdf \"Leukemia Blood Cell Image Classification Using Convolutional Neural Network\") by T. T. P. Thanh, Caleb Vununu, Sukhrob Atoev, Suk-Hwan Lee, and Ki-Ryong Kwon. The original project was inspired by the [work](https://github.com/AmlResearchProject/AML-ALL-Classifiers/blob/master/Python/_Keras/QuantisedCode/QuantisedCode.ipynb \"work\") done by [Amita Kapoor](https://www.leukemiaresearchassociation.ai/team/amita-kapoor/profile \"Amita Kapoor\") and [Taru Jain](https://www.leukemiaresearchassociation.ai/student-program/student/taru-jain \"Taru Jain\") and my [projects](https://github.com/AMLResearchProject/AML-ALL-Classifiers/tree/master/Python/_Keras/AllCNN \"projects\") based on their work."]},{"cell_type":"markdown","metadata":{"id":"_Hss_qQxzMr0","colab_type":"text"},"source":["# Getting Started\n","\n","To get started make sure you completed the steps on the [project home README](https://github.com/AMLResearchProject/ALL-Detection-System-2020 \"project home README\").\n","\n","Switch runtime to GPU. (Runtime -> Change runtime type -> GPU)"]},{"cell_type":"markdown","metadata":{"id":"kSlc_FL4s1ap","colab_type":"text"},"source":["\n","\n","# Import required packages\n","\n","The following code block will import all required Python packages."]},{"cell_type":"code","metadata":{"id":"4yp_kkACzS36","colab_type":"code","colab":{}},"source":["import cv2, json, pathlib, random, os\n","\n","import matplotlib.pyplot as plt\n","import numpy as np\n","import tensorflow as tf\n","\n","from google.colab import drive\n","from numpy.random import seed\n","from scipy import ndimage\n","from skimage import transform as tm\n","from sklearn.metrics import confusion_matrix\n","from sklearn.model_selection import train_test_split\n","from sklearn.preprocessing import OneHotEncoder\n","from sklearn.utils import shuffle"],"execution_count":0,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"KTWj_9YyzPwf","colab_type":"text"},"source":["# Mount your Google Drive\n","\n","Upload the **ALL-Detection-System-2020** directory from your cloned repo to the root of your Google Drive. Use the following commands and follow the provided steps to mount your Google Drive. "]},{"cell_type":"code","metadata":{"id":"es2holdgF5yB","colab_type":"code","outputId":"def21ce2-8490-4f13-a43e-5be93282fbe8","executionInfo":{"status":"ok","timestamp":1585548594158,"user_tz":-120,"elapsed":4256,"user":{"displayName":"Adam Milton-Barker","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiJQTybaYpLCTq3z30X5AacqX3NuSp8php3Ivqfrw=s64","userId":"14960657777339458094"}},"colab":{"base_uri":"https://localhost:8080/","height":34}},"source":["root_dir = \"/content/drive/My Drive/ALL-Detection-System-2020/\"\n","drive.mount('/content/drive', force_remount=True)"],"execution_count":2,"outputs":[{"output_type":"stream","text":["Mounted at /content/drive\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"peGLHzfOJPg3","colab_type":"text"},"source":["# Prepare your data\n","\n","We will create an augmented dataset based on the [Leukemia Blood Cell Image Classification Using Convolutional Neural Network](http://www.ijcte.org/vol10/1198-H0012.pdf \"Leukemia Blood Cell Image Classification Using Convolutional Neural Network\") paper by T. T. P. Thanh, Caleb Vununu, Sukhrob Atoev, Suk-Hwan Lee, and Ki-Ryong Kwon. In this case, we will use more rotated images to increase the dataset further.\n","\n","You will notice the data folder in the Model directory, **Model/Data**, inside you have **Train** & **Test**. \n","\n","First take the ten positive and ten negative samples shown below, and place them in the **Model/Data/Test** directory. This will be used by our Oculus Rift application and our testing purposes. \n","\n","You can use any data split you like, to ensure you get the same results exactly you may need to use the same test images. Please use CPU for training if you require consistent results, there is currently an issue when using GPU, most likely due to randomness implemented in the GPU software. It is possible to replicate the results here but it may take more than one attempt at training. This is something I will work on for a future update. \n","\n","- im006_1.jpg\n","- im020_1.jpg\n","- im024_1.jpg\n","- im026_1.jpg\n","- im028_1.jpg\n","- im031_1.jpg\n","- im035_0.jpg\n","- im041_0.jpg\n","- im047_0.jpg\n","- im053_1.jpg\n","- im057_1.jpg\n","- im060_1.jpg\n","- im063_1.jpg\n","- im069_0.jpg\n","- im074_0.jpg\n","- im088_0.jpg\n","- im095_0.jpg\n","- im099_0.jpg\n","- im101_0.jpg\n","- im106_0.jpg\n","\n","Next add the remaining 88 images to the **Model/Data/Train** folder. The test images used will not be augmented, however the validation images will be."]},{"cell_type":"markdown","metadata":{"id":"cGU8l4mSO8yh","colab_type":"text"},"source":["# Setup variables\n","\n","The following code block will set up the global variables for this notebook."]},{"cell_type":"code","metadata":{"id":"Wc34GwN8SqSA","colab_type":"code","colab":{}},"source":["data = []\n","labels = []"],"execution_count":0,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"FwOghn6-JrNQ","colab_type":"text"},"source":["# Load and print configs\n","\n","We will use a configuration file to make it easy to manage our settings."]},{"cell_type":"code","metadata":{"id":"Jzaf6tWfzYvQ","colab_type":"code","outputId":"1cba3e17-73c1-421e-992d-53882c9d8184","executionInfo":{"status":"ok","timestamp":1585548594159,"user_tz":-120,"elapsed":4241,"user":{"displayName":"Adam Milton-Barker","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiJQTybaYpLCTq3z30X5AacqX3NuSp8php3Ivqfrw=s64","userId":"14960657777339458094"}},"colab":{"base_uri":"https://localhost:8080/","height":1000}},"source":["with open(root_dir + 'Model/config.json') as confs:\n"," confs = json.loads(confs.read())\n","\n","print(json.dumps(confs, indent=4, sort_keys=True))"],"execution_count":4,"outputs":[{"output_type":"stream","text":["{\n"," \"cnn\": {\n"," \"api\": {\n"," \"port\": 1234,\n"," \"server\": \"192.168.1.34\"\n"," },\n"," \"core\": [\n"," \"Train\",\n"," \"Server\",\n"," \"Client\",\n"," \"Classify\"\n"," ],\n"," \"data\": {\n"," \"dim\": 100,\n"," \"file_type\": \".jpg\",\n"," \"labels\": [\n"," 0,\n"," 1\n"," ],\n"," \"rotations\": 10,\n"," \"seed\": 2,\n"," \"split\": 0.3,\n"," \"test\": \"Model/Data/Test\",\n"," \"test_data\": [\n"," \"im006_1.jpg\",\n"," \"im020_1.jpg\",\n"," \"im024_1.jpg\",\n"," \"im026_1.jpg\",\n"," \"im028_1.jpg\",\n"," \"im031_1.jpg\",\n"," \"im035_0.jpg\",\n"," \"im041_0.jpg\",\n"," \"im047_0.jpg\",\n"," \"im053_1.jpg\",\n"," \"im057_1.jpg\",\n"," \"im060_1.jpg\",\n"," \"im063_1.jpg\",\n"," \"im069_0.jpg\",\n"," \"im074_0.jpg\",\n"," \"im088_0.jpg\",\n"," \"im095_0.jpg\",\n"," \"im099_0.jpg\",\n"," \"im101_0.jpg\",\n"," \"im106_0.jpg\"\n"," ],\n"," \"train_dir\": \"Model/Data/Train\",\n"," \"valid_types\": [\n"," \".JPG\",\n"," \".JPEG\",\n"," \".PNG\",\n"," \".GIF\",\n"," \".jpg\",\n"," \".jpeg\",\n"," \".png\",\n"," \".gif\"\n"," ]\n"," },\n"," \"model\": {\n"," \"model\": \"Model/model.json\",\n"," \"weights\": \"Model/weights.h5\"\n"," },\n"," \"train\": {\n"," \"batch\": 100,\n"," \"decay_adam\": 1e-06,\n"," \"epochs\": 150,\n"," \"learning_rate_adam\": 0.0001,\n"," \"val_steps\": 10\n"," }\n"," }\n","}\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"Nno0-dw9LjLi","colab_type":"text"},"source":["# Set your seeds\n","\n","Seeds allow us to generate random sequences of numbers in a deterministic way. This helps us to ensure that we can reproduce results consistently."]},{"cell_type":"code","metadata":{"id":"N_yrNQmg9trO","colab_type":"code","colab":{}},"source":["rseed = confs[\"cnn\"][\"data\"][\"seed\"]\n","dim = confs[\"cnn\"][\"data\"][\"dim\"]\n"," \n","seed(rseed)\n","random.seed(rseed)"],"execution_count":0,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"JzMOuPPtsPaW","colab_type":"text"},"source":["# Data augmentation functions\n","\n","Below are the functions used for data augmentation. Each of the methods used are proposed in the [Leukemia Blood Cell Image Classification Using Convolutional Neural Network](http://www.ijcte.org/vol10/1198-H0012.pdf \"Leukemia Blood Cell Image Classification Using Convolutional Neural Network\") paper by T. T. P. Thanh, Caleb Vununu, Sukhrob Atoev, Suk-Hwan Lee, and Ki-Ryong Kwon."]},{"cell_type":"code","metadata":{"id":"Rj8SNKSvsjkf","colab_type":"code","colab":{}},"source":["def grayscale(data):\n"," \"\"\" Creates a grayscale copy. \"\"\"\n","\n"," gray = cv2.cvtColor(data, cv2.COLOR_BGR2GRAY)\n"," return np.dstack([gray, gray, gray]).astype(np.float32)/255."],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"O8MvGE1xt85S","colab_type":"code","colab":{}},"source":["def equalize_hist(data):\n"," \"\"\" Creates a histogram equalized copy. \n","\n"," Credit: Amita Kapoor & Taru Jain\n"," Exploring novel convolutional network architecture to build a classification \n"," system for better assistance in diagonosing Acute Lymphoblastic Leukemia in \n"," blood cells.\n"," https://github.com/AMLResearchProject/ALL-Keras-2019\n"," \"\"\"\n","\n"," img_to_yuv = cv2.cvtColor(data, cv2.COLOR_BGR2YUV)\n"," img_to_yuv[:, :, 0] = cv2.equalizeHist(img_to_yuv[:, :, 0])\n"," hist_equalization_result = cv2.cvtColor(img_to_yuv, cv2.COLOR_YUV2BGR)\n"," return hist_equalization_result.astype(np.float32)/255."],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"Qw6_rqdru_17","colab_type":"code","colab":{}},"source":["def reflection(data):\n"," \"\"\" Creates horizontal and vertically reflected copies. \"\"\"\n","\n"," return cv2.flip(data, 0).astype(np.float32)/255., cv2.flip(data, 1).astype(np.float32)/255."],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"ZOfkIx7_vNna","colab_type":"code","colab":{}},"source":["def gaussian(data):\n"," \"\"\" Creates a gaussian blurred copy. \"\"\"\n","\n"," return ndimage.gaussian_filter(data, sigma=5.11).astype(np.float32)/255."],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"K3YBnl9gvTLX","colab_type":"code","colab":{}},"source":["def translate(data):\n"," \"\"\" Creates transformed copy. \"\"\"\n","\n"," cols, rows, chs = data.shape\n","\n"," return cv2.warpAffine(data, np.float32([[1, 0, 84], [0, 1, 56]]), (rows, cols),\n"," borderMode=cv2.BORDER_CONSTANT, borderValue=(144, 159, 162)).astype(np.float32)/255."],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"OtkFnQAJvg2S","colab_type":"code","colab":{}},"source":["def rotation(data, label, tdata, tlabels):\n"," \"\"\" Creates rotated copies. \"\"\"\n","\n"," cols, rows, chs = data.shape\n","\n"," for i in range(0, confs[\"cnn\"][\"data\"][\"rotations\"]):\n"," # Seed needs to be set each time randint is called\n"," random.seed(rseed)\n"," rand_deg = random.randint(-180, 180)\n"," matrix = cv2.getRotationMatrix2D((cols/2, rows/2), rand_deg, 0.70)\n"," rotated = cv2.warpAffine(data, matrix, (rows, cols), borderMode=cv2.BORDER_CONSTANT,\n"," borderValue=(144, 159, 162))\n","\n"," rotated = rotated.astype(np.float32)/255.\n","\n"," tdata.append(rotated)\n"," tlabels.append(label)\n"," \n"," return tdata, tlabels"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"AEzxqWdIv5Sj","colab_type":"code","colab":{}},"source":["def shear(data):\n"," \"\"\" Creates a histogram equalized copy. \n"," \n"," Credit: Amita Kapoor & Taru Jain\n"," Exploring novel convolutional network architecture to build a classification \n"," system for better assistance in diagonosing Acute Lymphoblastic Leukemia in \n"," blood cells.\n"," https://github.com/AMLResearchProject/ALL-Keras-2019\n"," \"\"\"\n","\n"," at = tm.AffineTransform(shear=0.5)\n"," return tm.warp(data, inverse_map=at)"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"GpwvwPecIcnk","colab_type":"code","colab":{}},"source":["def resize(path, dim):\n"," \"\"\" Resizes an image to the provided dimensions (dim). \"\"\"\n"," \n"," return cv2.resize(cv2.imread(path), (dim, dim))"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"rnq6vdm5JbQJ","colab_type":"code","colab":{}},"source":["def shuffle_c(data, labels, seed):\n"," \"\"\" Shuffles the data and labels. \"\"\"\n","\n"," data, labels = shuffle(data, labels, random_state=rseed)\n","\n"," return data, labels"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"EzUTO8i4JSSH","colab_type":"code","colab":{}},"source":["def convert_data(data):\n"," \"\"\" Converts the training data to a numpy array. \"\"\"\n","\n"," data = np.array(data)\n"," print(\"Data shape: \" + str(data.shape))\n","\n"," return data"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"pU1m1zLjJgCs","colab_type":"code","colab":{}},"source":["def encode_labels(labels):\n"," \"\"\" One Hot Encodes the labels. \"\"\"\n","\n"," encoder = OneHotEncoder(categories='auto')\n","\n"," labels = np.reshape(labels, (-1, 1))\n"," labels = encoder.fit_transform(labels).toarray()\n"," print(\"Labels shape: \" + str(labels.shape))\n","\n"," return labels"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"JGZit7u5KBAG","colab_type":"code","colab":{}},"source":["def get_split():\n"," \"\"\" Splits the data and labels creating training and validation datasets. \"\"\"\n","\n"," X_train, X_test, y_train, y_test = train_test_split(\n"," data, labels, test_size=0.255, random_state=rseed)\n","\n"," print(\"Training data: \" + str(X_train.shape))\n"," print(\"Training labels: \" + str(y_train.shape))\n"," print(\"Validation data: \" + str(X_test.shape))\n"," print(\"Validation labels: \" + str(y_test.shape))\n","\n"," return X_train, X_test, y_train, y_test"],"execution_count":0,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"71Q8KYspYfww","colab_type":"text"},"source":["# Sort the data\n","\n","Here we will sort the data and prepare our augmented dataset. We will use augmentation methods proposed in the \n"]},{"cell_type":"code","metadata":{"id":"S33SdM5-aIX7","colab_type":"code","outputId":"bfaa4791-1142-4bd8-f338-4b7ebe4d48ea","executionInfo":{"status":"ok","timestamp":1585548594164,"user_tz":-120,"elapsed":4158,"user":{"displayName":"Adam Milton-Barker","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiJQTybaYpLCTq3z30X5AacqX3NuSp8php3Ivqfrw=s64","userId":"14960657777339458094"}},"colab":{"base_uri":"https://localhost:8080/","height":51}},"source":["data_dir = pathlib.Path(\n"," root_dir + confs[\"cnn\"][\"data\"][\"train_dir\"])\n","data = list(data_dir.glob(\n"," '*' + confs[\"cnn\"][\"data\"][\"file_type\"]))\n"," \n","weights_file = root_dir + confs[\"cnn\"][\"model\"][\"weights\"]\n","model_json = root_dir + confs[\"cnn\"][\"model\"][\"model\"]\n","\n","print(data_dir)\n","print(len(data))"],"execution_count":18,"outputs":[{"output_type":"stream","text":["/content/drive/My Drive/ALL-Detection-System-2020/Model/Data/Train\n","88\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"Dn6XcFhPCWu_","colab_type":"code","outputId":"f372c6df-a44f-409d-b925-2e98ff1fbf92","executionInfo":{"status":"ok","timestamp":1585548601531,"user_tz":-120,"elapsed":11515,"user":{"displayName":"Adam Milton-Barker","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiJQTybaYpLCTq3z30X5AacqX3NuSp8php3Ivqfrw=s64","userId":"14960657777339458094"}},"colab":{"base_uri":"https://localhost:8080/","height":204}},"source":["count = 0\n","neg_count = 0\n","pos_count = 0\n","\n","augmented_data = []\n","augmented_labels = []\n","\n","for rimage in data:\n"," fpath = str(rimage)\n"," fname = os.path.basename(rimage)\n"," label = 0 if \"_0\" in fname else 1\n","\n"," image = resize(fpath, dim)\n","\n"," if image.shape[2] == 1:\n"," image = np.dstack(\n"," [image, image, image]) \n","\n"," augmented_data.append(image.astype(np.float32)/255.)\n"," augmented_labels.append(label)\n","\n"," augmented_data.append(grayscale(image))\n"," augmented_labels.append(label)\n","\n"," augmented_data.append(equalize_hist(image))\n"," augmented_labels.append(label)\n","\n"," horizontal, vertical = reflection(image)\n"," augmented_data.append(horizontal)\n"," augmented_labels.append(label)\n","\n"," augmented_data.append(vertical)\n"," augmented_labels.append(label)\n","\n"," augmented_data.append(gaussian(image))\n"," augmented_labels.append(label)\n","\n"," augmented_data.append(translate(image))\n"," augmented_labels.append(label)\n","\n"," augmented_data.append(shear(image))\n"," augmented_labels.append(label)\n","\n"," data, labels = rotation(image, label, augmented_data, augmented_labels)\n","\n"," if \"_0\" in fname:\n"," neg_count += 9\n"," else:\n"," pos_count += 9\n"," count += 9\n","\n","data, labels = shuffle_c(data, labels, rseed)\n","data = convert_data(data)\n","labels = encode_labels(labels)\n","\n","print(\"Raw data: \" + str(count))\n","print(\"Raw negative data: \" + str(neg_count))\n","print(\"Raw positive data: \" + str(count))\n","print(\"Augmented data: \" + str(data.shape))\n","print(\"Labels: \" + str(labels.shape))\n","\n","X_train, X_test, y_train, y_test = get_split()"],"execution_count":19,"outputs":[{"output_type":"stream","text":["Data shape: (1584, 100, 100, 3)\n","Labels shape: (1584, 2)\n","Raw data: 792\n","Raw negative data: 441\n","Raw positive data: 792\n","Augmented data: (1584, 100, 100, 3)\n","Labels: (1584, 2)\n","Training data: (1180, 100, 100, 3)\n","Training labels: (1180, 2)\n","Validation data: (404, 100, 100, 3)\n","Validation labels: (404, 2)\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"orp_4fV9E5-I","colab_type":"text"},"source":["# Create the network\n","\n","Replicates the networked outlined in the Acute Leukemia Classification Using Convolution Neural Network In Clinical Decision Support System paper using Tensorflow 2.0. \n","\n","https://airccj.org/CSCP/vol7/csit77505.pdf"]},{"cell_type":"code","metadata":{"id":"hxjehH8Kx36V","colab_type":"code","colab":{}},"source":["def do_network():\n"," \"\"\" Builds the network. \n","\n"," Replicates the networked outlined in the Acute Leukemia Classification \n"," Using Convolution Neural Network In Clinical Decision Support System paper\n"," using Tensorflow 2.0.\n"," https://airccj.org/CSCP/vol7/csit77505.pdf\n"," \"\"\"\n","\n"," batch_size = confs[\"cnn\"][\"train\"][\"batch\"] \n","\n"," tf_model = tf.keras.models.Sequential([\n"," tf.keras.layers.ZeroPadding2D(\n"," padding=(2, 2), input_shape=X_train.shape[1:]),\n"," tf.keras.layers.Conv2D(30, (5, 5), strides=1,\n"," padding=\"valid\", activation='relu'),\n"," tf.keras.layers.ZeroPadding2D(padding=(2, 2)),\n"," tf.keras.layers.Conv2D(30, (5, 5), strides=1,\n"," padding=\"valid\", activation='relu'),\n"," tf.keras.layers.MaxPooling2D(\n"," pool_size=(2, 2), strides=2, padding='valid'),\n"," tf.keras.layers.Flatten(),\n"," tf.keras.layers.Dense(2),\n"," tf.keras.layers.Activation('softmax')\n"," ], \n"," \"AllDS2020_TF_CNN\")\n"," tf_model.summary()\n"," print(\"Network initialization complete.\")\n","\n"," return tf_model"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"A-zZxEq1QwN8","colab_type":"code","colab":{}},"source":["def save_model_as_json():\n"," \"\"\" Saves the model to JSON. \"\"\"\n","\n"," with open(model_json, \"w\") as file:\n"," file.write(tf_model.to_json())\n"," \n"," print(\"Model JSON saved \" + model_json)"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"L_BfS3b9RAsP","colab_type":"code","colab":{}},"source":["def save_weights():\n"," \"\"\" Saves the model weights. \"\"\"\n"," \n"," tf_model.save_weights(weights_file) \n"," print(\"Weights saved \" + weights_file)"],"execution_count":0,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"fNQWaO7dFN4X","colab_type":"text"},"source":["# Train the network"]},{"cell_type":"code","metadata":{"id":"RdiPlwbryIpj","colab_type":"code","colab":{}},"source":["def do_train(tf_model):\n"," \"\"\" Trains the network. \"\"\"\n","\n"," val_steps = confs[\"cnn\"][\"train\"][\"val_steps\"]\n"," epochs = confs[\"cnn\"][\"train\"][\"epochs\"]\n","\n"," optimizer = tf.keras.optimizers.Adam(lr=confs[\"cnn\"][\"train\"][\"learning_rate_adam\"], \n"," decay = confs[\"cnn\"][\"train\"][\"decay_adam\"])\n","\n"," tf_model.compile(optimizer=optimizer,\n"," loss='binary_crossentropy',\n"," metrics=[tf.keras.metrics.BinaryAccuracy(name='acc'),\n"," tf.keras.metrics.Precision(name='precision'),\n"," tf.keras.metrics.Recall(name='recall'),\n"," tf.keras.metrics.AUC(name='auc') ])\n","\n"," history = tf_model.fit(X_train, y_train, validation_data=(X_test, y_test), \n"," validation_steps=val_steps, epochs=epochs)\n","\n"," print(history)\n"," print(\"\") \n","\n"," return history"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"W7HvMFXDy6Pi","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":442},"outputId":"514b50a8-b43f-41ec-d529-a85bb4bd85b4","executionInfo":{"status":"ok","timestamp":1585548601829,"user_tz":-120,"elapsed":11783,"user":{"displayName":"Adam Milton-Barker","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiJQTybaYpLCTq3z30X5AacqX3NuSp8php3Ivqfrw=s64","userId":"14960657777339458094"}}},"source":["tf_model = do_network()"],"execution_count":24,"outputs":[{"output_type":"stream","text":["Model: \"AllDS2020_TF_CNN\"\n","_________________________________________________________________\n","Layer (type) Output Shape Param # \n","=================================================================\n","zero_padding2d (ZeroPadding2 (None, 104, 104, 3) 0 \n","_________________________________________________________________\n","conv2d (Conv2D) (None, 100, 100, 30) 2280 \n","_________________________________________________________________\n","zero_padding2d_1 (ZeroPaddin (None, 104, 104, 30) 0 \n","_________________________________________________________________\n","conv2d_1 (Conv2D) (None, 100, 100, 30) 22530 \n","_________________________________________________________________\n","max_pooling2d (MaxPooling2D) (None, 50, 50, 30) 0 \n","_________________________________________________________________\n","flatten (Flatten) (None, 75000) 0 \n","_________________________________________________________________\n","dense (Dense) (None, 2) 150002 \n","_________________________________________________________________\n","activation (Activation) (None, 2) 0 \n","=================================================================\n","Total params: 174,812\n","Trainable params: 174,812\n","Non-trainable params: 0\n","_________________________________________________________________\n","Network initialization complete.\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"LG6QlaSB0yri","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":1000},"outputId":"975bd81a-851a-4979-8db8-76ff762d9df4","executionInfo":{"status":"ok","timestamp":1585548704336,"user_tz":-120,"elapsed":114279,"user":{"displayName":"Adam Milton-Barker","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiJQTybaYpLCTq3z30X5AacqX3NuSp8php3Ivqfrw=s64","userId":"14960657777339458094"}}},"source":["history = do_train(tf_model)"],"execution_count":25,"outputs":[{"output_type":"stream","text":["Epoch 1/150\n","37/37 [==============================] - 1s 34ms/step - loss: 0.6917 - acc: 0.5449 - precision: 0.5449 - recall: 0.5449 - auc: 0.5729 - val_loss: 0.6646 - val_acc: 0.5569 - val_precision: 0.5569 - val_recall: 0.5569 - val_auc: 0.7045\n","Epoch 2/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.6284 - acc: 0.6424 - precision: 0.6424 - recall: 0.6424 - auc: 0.7099 - val_loss: 0.5928 - val_acc: 0.7252 - val_precision: 0.7252 - val_recall: 0.7252 - val_auc: 0.7898\n","Epoch 3/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.5529 - acc: 0.7602 - precision: 0.7602 - recall: 0.7602 - auc: 0.8189 - val_loss: 0.5536 - val_acc: 0.7450 - val_precision: 0.7450 - val_recall: 0.7450 - val_auc: 0.8049\n","Epoch 4/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.4925 - acc: 0.7619 - precision: 0.7619 - recall: 0.7619 - auc: 0.8510 - val_loss: 0.4422 - val_acc: 0.7723 - val_precision: 0.7723 - val_recall: 0.7723 - val_auc: 0.8948\n","Epoch 5/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.3650 - acc: 0.8398 - precision: 0.8398 - recall: 0.8398 - auc: 0.9327 - val_loss: 0.3662 - val_acc: 0.8119 - val_precision: 0.8119 - val_recall: 0.8119 - val_auc: 0.9253\n","Epoch 6/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.2918 - acc: 0.8831 - precision: 0.8831 - recall: 0.8831 - auc: 0.9599 - val_loss: 0.3083 - val_acc: 0.8663 - val_precision: 0.8663 - val_recall: 0.8663 - val_auc: 0.9472\n","Epoch 7/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.2442 - acc: 0.9042 - precision: 0.9042 - recall: 0.9042 - auc: 0.9726 - val_loss: 0.2606 - val_acc: 0.9233 - val_precision: 0.9233 - val_recall: 0.9233 - val_auc: 0.9698\n","Epoch 8/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.2069 - acc: 0.9263 - precision: 0.9263 - recall: 0.9263 - auc: 0.9816 - val_loss: 0.2490 - val_acc: 0.8886 - val_precision: 0.8886 - val_recall: 0.8886 - val_auc: 0.9721\n","Epoch 9/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.1718 - acc: 0.9390 - precision: 0.9390 - recall: 0.9390 - auc: 0.9879 - val_loss: 0.2097 - val_acc: 0.9208 - val_precision: 0.9208 - val_recall: 0.9208 - val_auc: 0.9776\n","Epoch 10/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.1651 - acc: 0.9356 - precision: 0.9356 - recall: 0.9356 - auc: 0.9881 - val_loss: 0.2262 - val_acc: 0.9084 - val_precision: 0.9084 - val_recall: 0.9084 - val_auc: 0.9730\n","Epoch 11/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.1488 - acc: 0.9441 - precision: 0.9441 - recall: 0.9441 - auc: 0.9904 - val_loss: 0.1889 - val_acc: 0.9059 - val_precision: 0.9059 - val_recall: 0.9059 - val_auc: 0.9786\n","Epoch 12/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.1335 - acc: 0.9525 - precision: 0.9525 - recall: 0.9525 - auc: 0.9922 - val_loss: 0.1632 - val_acc: 0.9307 - val_precision: 0.9307 - val_recall: 0.9307 - val_auc: 0.9888\n","Epoch 13/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.1259 - acc: 0.9559 - precision: 0.9559 - recall: 0.9559 - auc: 0.9937 - val_loss: 0.1684 - val_acc: 0.9356 - val_precision: 0.9356 - val_recall: 0.9356 - val_auc: 0.9844\n","Epoch 14/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.1309 - acc: 0.9483 - precision: 0.9483 - recall: 0.9483 - auc: 0.9920 - val_loss: 0.1612 - val_acc: 0.9307 - val_precision: 0.9307 - val_recall: 0.9307 - val_auc: 0.9874\n","Epoch 15/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.1032 - acc: 0.9627 - precision: 0.9627 - recall: 0.9627 - auc: 0.9958 - val_loss: 0.1532 - val_acc: 0.9332 - val_precision: 0.9332 - val_recall: 0.9332 - val_auc: 0.9871\n","Epoch 16/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.1016 - acc: 0.9644 - precision: 0.9644 - recall: 0.9644 - auc: 0.9958 - val_loss: 0.1360 - val_acc: 0.9530 - val_precision: 0.9530 - val_recall: 0.9530 - val_auc: 0.9931\n","Epoch 17/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.1211 - acc: 0.9542 - precision: 0.9542 - recall: 0.9542 - auc: 0.9928 - val_loss: 0.1378 - val_acc: 0.9480 - val_precision: 0.9480 - val_recall: 0.9480 - val_auc: 0.9902\n","Epoch 18/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0954 - acc: 0.9686 - precision: 0.9686 - recall: 0.9686 - auc: 0.9961 - val_loss: 0.1860 - val_acc: 0.9233 - val_precision: 0.9233 - val_recall: 0.9233 - val_auc: 0.9823\n","Epoch 19/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0863 - acc: 0.9712 - precision: 0.9712 - recall: 0.9712 - auc: 0.9966 - val_loss: 0.1388 - val_acc: 0.9431 - val_precision: 0.9431 - val_recall: 0.9431 - val_auc: 0.9892\n","Epoch 20/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0815 - acc: 0.9746 - precision: 0.9746 - recall: 0.9746 - auc: 0.9975 - val_loss: 0.1436 - val_acc: 0.9381 - val_precision: 0.9381 - val_recall: 0.9381 - val_auc: 0.9882\n","Epoch 21/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0811 - acc: 0.9737 - precision: 0.9737 - recall: 0.9737 - auc: 0.9971 - val_loss: 0.1317 - val_acc: 0.9282 - val_precision: 0.9282 - val_recall: 0.9282 - val_auc: 0.9903\n","Epoch 22/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0844 - acc: 0.9678 - precision: 0.9678 - recall: 0.9678 - auc: 0.9969 - val_loss: 0.1203 - val_acc: 0.9505 - val_precision: 0.9505 - val_recall: 0.9505 - val_auc: 0.9919\n","Epoch 23/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0782 - acc: 0.9746 - precision: 0.9746 - recall: 0.9746 - auc: 0.9969 - val_loss: 0.1215 - val_acc: 0.9505 - val_precision: 0.9505 - val_recall: 0.9505 - val_auc: 0.9918\n","Epoch 24/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0795 - acc: 0.9746 - precision: 0.9746 - recall: 0.9746 - auc: 0.9973 - val_loss: 0.1129 - val_acc: 0.9505 - val_precision: 0.9505 - val_recall: 0.9505 - val_auc: 0.9929\n","Epoch 25/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0972 - acc: 0.9585 - precision: 0.9585 - recall: 0.9585 - auc: 0.9948 - val_loss: 0.1587 - val_acc: 0.9084 - val_precision: 0.9084 - val_recall: 0.9084 - val_auc: 0.9849\n","Epoch 26/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0846 - acc: 0.9686 - precision: 0.9686 - recall: 0.9686 - auc: 0.9967 - val_loss: 0.1198 - val_acc: 0.9678 - val_precision: 0.9678 - val_recall: 0.9678 - val_auc: 0.9922\n","Epoch 27/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0711 - acc: 0.9712 - precision: 0.9712 - recall: 0.9712 - auc: 0.9978 - val_loss: 0.1210 - val_acc: 0.9455 - val_precision: 0.9455 - val_recall: 0.9455 - val_auc: 0.9914\n","Epoch 28/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0716 - acc: 0.9771 - precision: 0.9771 - recall: 0.9771 - auc: 0.9976 - val_loss: 0.1843 - val_acc: 0.9356 - val_precision: 0.9356 - val_recall: 0.9356 - val_auc: 0.9848\n","Epoch 29/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0862 - acc: 0.9653 - precision: 0.9653 - recall: 0.9653 - auc: 0.9959 - val_loss: 0.1132 - val_acc: 0.9530 - val_precision: 0.9530 - val_recall: 0.9530 - val_auc: 0.9941\n","Epoch 30/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0661 - acc: 0.9805 - precision: 0.9805 - recall: 0.9805 - auc: 0.9982 - val_loss: 0.1094 - val_acc: 0.9530 - val_precision: 0.9530 - val_recall: 0.9530 - val_auc: 0.9925\n","Epoch 31/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0618 - acc: 0.9822 - precision: 0.9822 - recall: 0.9822 - auc: 0.9984 - val_loss: 0.1054 - val_acc: 0.9604 - val_precision: 0.9604 - val_recall: 0.9604 - val_auc: 0.9950\n","Epoch 32/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0593 - acc: 0.9831 - precision: 0.9831 - recall: 0.9831 - auc: 0.9984 - val_loss: 0.1253 - val_acc: 0.9678 - val_precision: 0.9678 - val_recall: 0.9678 - val_auc: 0.9920\n","Epoch 33/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0784 - acc: 0.9737 - precision: 0.9737 - recall: 0.9737 - auc: 0.9968 - val_loss: 0.1070 - val_acc: 0.9480 - val_precision: 0.9480 - val_recall: 0.9480 - val_auc: 0.9926\n","Epoch 34/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0588 - acc: 0.9805 - precision: 0.9805 - recall: 0.9805 - auc: 0.9984 - val_loss: 0.1060 - val_acc: 0.9777 - val_precision: 0.9777 - val_recall: 0.9777 - val_auc: 0.9939\n","Epoch 35/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0653 - acc: 0.9746 - precision: 0.9746 - recall: 0.9746 - auc: 0.9979 - val_loss: 0.1676 - val_acc: 0.9431 - val_precision: 0.9431 - val_recall: 0.9431 - val_auc: 0.9869\n","Epoch 36/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0695 - acc: 0.9797 - precision: 0.9797 - recall: 0.9797 - auc: 0.9978 - val_loss: 0.0944 - val_acc: 0.9579 - val_precision: 0.9579 - val_recall: 0.9579 - val_auc: 0.9954\n","Epoch 37/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0625 - acc: 0.9780 - precision: 0.9780 - recall: 0.9780 - auc: 0.9980 - val_loss: 0.0978 - val_acc: 0.9505 - val_precision: 0.9505 - val_recall: 0.9505 - val_auc: 0.9931\n","Epoch 38/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0629 - acc: 0.9746 - precision: 0.9746 - recall: 0.9746 - auc: 0.9981 - val_loss: 0.1358 - val_acc: 0.9381 - val_precision: 0.9381 - val_recall: 0.9381 - val_auc: 0.9904\n","Epoch 39/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0605 - acc: 0.9797 - precision: 0.9797 - recall: 0.9797 - auc: 0.9981 - val_loss: 0.0987 - val_acc: 0.9530 - val_precision: 0.9530 - val_recall: 0.9530 - val_auc: 0.9933\n","Epoch 40/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0522 - acc: 0.9831 - precision: 0.9831 - recall: 0.9831 - auc: 0.9987 - val_loss: 0.0995 - val_acc: 0.9629 - val_precision: 0.9629 - val_recall: 0.9629 - val_auc: 0.9934\n","Epoch 41/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0506 - acc: 0.9831 - precision: 0.9831 - recall: 0.9831 - auc: 0.9988 - val_loss: 0.0955 - val_acc: 0.9777 - val_precision: 0.9777 - val_recall: 0.9777 - val_auc: 0.9946\n","Epoch 42/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0539 - acc: 0.9805 - precision: 0.9805 - recall: 0.9805 - auc: 0.9987 - val_loss: 0.1042 - val_acc: 0.9505 - val_precision: 0.9505 - val_recall: 0.9505 - val_auc: 0.9927\n","Epoch 43/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0529 - acc: 0.9831 - precision: 0.9831 - recall: 0.9831 - auc: 0.9987 - val_loss: 0.1366 - val_acc: 0.9406 - val_precision: 0.9406 - val_recall: 0.9406 - val_auc: 0.9914\n","Epoch 44/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0542 - acc: 0.9814 - precision: 0.9814 - recall: 0.9814 - auc: 0.9984 - val_loss: 0.0974 - val_acc: 0.9678 - val_precision: 0.9678 - val_recall: 0.9678 - val_auc: 0.9940\n","Epoch 45/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0504 - acc: 0.9839 - precision: 0.9839 - recall: 0.9839 - auc: 0.9988 - val_loss: 0.0987 - val_acc: 0.9579 - val_precision: 0.9579 - val_recall: 0.9579 - val_auc: 0.9935\n","Epoch 46/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0536 - acc: 0.9780 - precision: 0.9780 - recall: 0.9780 - auc: 0.9986 - val_loss: 0.1393 - val_acc: 0.9431 - val_precision: 0.9431 - val_recall: 0.9431 - val_auc: 0.9911\n","Epoch 47/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0919 - acc: 0.9737 - precision: 0.9737 - recall: 0.9737 - auc: 0.9949 - val_loss: 0.1483 - val_acc: 0.9406 - val_precision: 0.9406 - val_recall: 0.9406 - val_auc: 0.9896\n","Epoch 48/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0551 - acc: 0.9822 - precision: 0.9822 - recall: 0.9822 - auc: 0.9983 - val_loss: 0.0930 - val_acc: 0.9728 - val_precision: 0.9728 - val_recall: 0.9728 - val_auc: 0.9967\n","Epoch 49/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0518 - acc: 0.9788 - precision: 0.9788 - recall: 0.9788 - auc: 0.9987 - val_loss: 0.1017 - val_acc: 0.9530 - val_precision: 0.9530 - val_recall: 0.9530 - val_auc: 0.9926\n","Epoch 50/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0453 - acc: 0.9831 - precision: 0.9831 - recall: 0.9831 - auc: 0.9990 - val_loss: 0.0826 - val_acc: 0.9802 - val_precision: 0.9802 - val_recall: 0.9802 - val_auc: 0.9956\n","Epoch 51/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0470 - acc: 0.9881 - precision: 0.9881 - recall: 0.9881 - auc: 0.9989 - val_loss: 0.0849 - val_acc: 0.9678 - val_precision: 0.9678 - val_recall: 0.9678 - val_auc: 0.9946\n","Epoch 52/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0464 - acc: 0.9864 - precision: 0.9864 - recall: 0.9864 - auc: 0.9988 - val_loss: 0.0920 - val_acc: 0.9629 - val_precision: 0.9629 - val_recall: 0.9629 - val_auc: 0.9940\n","Epoch 53/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0442 - acc: 0.9847 - precision: 0.9847 - recall: 0.9847 - auc: 0.9991 - val_loss: 0.1050 - val_acc: 0.9554 - val_precision: 0.9554 - val_recall: 0.9554 - val_auc: 0.9927\n","Epoch 54/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0435 - acc: 0.9873 - precision: 0.9873 - recall: 0.9873 - auc: 0.9992 - val_loss: 0.1272 - val_acc: 0.9480 - val_precision: 0.9480 - val_recall: 0.9480 - val_auc: 0.9913\n","Epoch 55/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0487 - acc: 0.9831 - precision: 0.9831 - recall: 0.9831 - auc: 0.9987 - val_loss: 0.1048 - val_acc: 0.9579 - val_precision: 0.9579 - val_recall: 0.9579 - val_auc: 0.9956\n","Epoch 56/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0509 - acc: 0.9788 - precision: 0.9788 - recall: 0.9788 - auc: 0.9989 - val_loss: 0.0939 - val_acc: 0.9728 - val_precision: 0.9728 - val_recall: 0.9728 - val_auc: 0.9946\n","Epoch 57/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0421 - acc: 0.9881 - precision: 0.9881 - recall: 0.9881 - auc: 0.9991 - val_loss: 0.0952 - val_acc: 0.9629 - val_precision: 0.9629 - val_recall: 0.9629 - val_auc: 0.9944\n","Epoch 58/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0438 - acc: 0.9864 - precision: 0.9864 - recall: 0.9864 - auc: 0.9990 - val_loss: 0.0962 - val_acc: 0.9678 - val_precision: 0.9678 - val_recall: 0.9678 - val_auc: 0.9951\n","Epoch 59/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0434 - acc: 0.9814 - precision: 0.9814 - recall: 0.9814 - auc: 0.9989 - val_loss: 0.2276 - val_acc: 0.9356 - val_precision: 0.9356 - val_recall: 0.9356 - val_auc: 0.9867\n","Epoch 60/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0566 - acc: 0.9746 - precision: 0.9746 - recall: 0.9746 - auc: 0.9983 - val_loss: 0.1038 - val_acc: 0.9505 - val_precision: 0.9505 - val_recall: 0.9505 - val_auc: 0.9932\n","Epoch 61/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0432 - acc: 0.9814 - precision: 0.9814 - recall: 0.9814 - auc: 0.9990 - val_loss: 0.1371 - val_acc: 0.9158 - val_precision: 0.9158 - val_recall: 0.9158 - val_auc: 0.9870\n","Epoch 62/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0429 - acc: 0.9873 - precision: 0.9873 - recall: 0.9873 - auc: 0.9991 - val_loss: 0.0917 - val_acc: 0.9629 - val_precision: 0.9629 - val_recall: 0.9629 - val_auc: 0.9943\n","Epoch 63/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0476 - acc: 0.9805 - precision: 0.9805 - recall: 0.9805 - auc: 0.9988 - val_loss: 0.1199 - val_acc: 0.9455 - val_precision: 0.9455 - val_recall: 0.9455 - val_auc: 0.9924\n","Epoch 64/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0418 - acc: 0.9864 - precision: 0.9864 - recall: 0.9864 - auc: 0.9991 - val_loss: 0.1751 - val_acc: 0.9406 - val_precision: 0.9406 - val_recall: 0.9406 - val_auc: 0.9896\n","Epoch 65/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0402 - acc: 0.9856 - precision: 0.9856 - recall: 0.9856 - auc: 0.9991 - val_loss: 0.1061 - val_acc: 0.9505 - val_precision: 0.9505 - val_recall: 0.9505 - val_auc: 0.9913\n","Epoch 66/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0434 - acc: 0.9864 - precision: 0.9864 - recall: 0.9864 - auc: 0.9991 - val_loss: 0.0872 - val_acc: 0.9777 - val_precision: 0.9777 - val_recall: 0.9777 - val_auc: 0.9950\n","Epoch 67/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0356 - acc: 0.9881 - precision: 0.9881 - recall: 0.9881 - auc: 0.9994 - val_loss: 0.0800 - val_acc: 0.9802 - val_precision: 0.9802 - val_recall: 0.9802 - val_auc: 0.9952\n","Epoch 68/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0354 - acc: 0.9873 - precision: 0.9873 - recall: 0.9873 - auc: 0.9994 - val_loss: 0.0927 - val_acc: 0.9752 - val_precision: 0.9752 - val_recall: 0.9752 - val_auc: 0.9955\n","Epoch 69/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0543 - acc: 0.9805 - precision: 0.9805 - recall: 0.9805 - auc: 0.9986 - val_loss: 0.1028 - val_acc: 0.9579 - val_precision: 0.9579 - val_recall: 0.9579 - val_auc: 0.9941\n","Epoch 70/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0509 - acc: 0.9797 - precision: 0.9797 - recall: 0.9797 - auc: 0.9987 - val_loss: 0.0972 - val_acc: 0.9653 - val_precision: 0.9653 - val_recall: 0.9653 - val_auc: 0.9913\n","Epoch 71/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0487 - acc: 0.9822 - precision: 0.9822 - recall: 0.9822 - auc: 0.9986 - val_loss: 0.1036 - val_acc: 0.9703 - val_precision: 0.9703 - val_recall: 0.9703 - val_auc: 0.9937\n","Epoch 72/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0424 - acc: 0.9873 - precision: 0.9873 - recall: 0.9873 - auc: 0.9992 - val_loss: 0.0789 - val_acc: 0.9777 - val_precision: 0.9777 - val_recall: 0.9777 - val_auc: 0.9970\n","Epoch 73/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0379 - acc: 0.9907 - precision: 0.9907 - recall: 0.9907 - auc: 0.9993 - val_loss: 0.1104 - val_acc: 0.9505 - val_precision: 0.9505 - val_recall: 0.9505 - val_auc: 0.9928\n","Epoch 74/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0336 - acc: 0.9898 - precision: 0.9898 - recall: 0.9898 - auc: 0.9994 - val_loss: 0.1038 - val_acc: 0.9505 - val_precision: 0.9505 - val_recall: 0.9505 - val_auc: 0.9934\n","Epoch 75/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0315 - acc: 0.9915 - precision: 0.9915 - recall: 0.9915 - auc: 0.9995 - val_loss: 0.0839 - val_acc: 0.9752 - val_precision: 0.9752 - val_recall: 0.9752 - val_auc: 0.9950\n","Epoch 76/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0343 - acc: 0.9907 - precision: 0.9907 - recall: 0.9907 - auc: 0.9995 - val_loss: 0.0879 - val_acc: 0.9653 - val_precision: 0.9653 - val_recall: 0.9653 - val_auc: 0.9941\n","Epoch 77/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0348 - acc: 0.9847 - precision: 0.9847 - recall: 0.9847 - auc: 0.9994 - val_loss: 0.1045 - val_acc: 0.9554 - val_precision: 0.9554 - val_recall: 0.9554 - val_auc: 0.9927\n","Epoch 78/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0351 - acc: 0.9881 - precision: 0.9881 - recall: 0.9881 - auc: 0.9995 - val_loss: 0.1344 - val_acc: 0.9480 - val_precision: 0.9480 - val_recall: 0.9480 - val_auc: 0.9916\n","Epoch 79/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0326 - acc: 0.9915 - precision: 0.9915 - recall: 0.9915 - auc: 0.9995 - val_loss: 0.1200 - val_acc: 0.9505 - val_precision: 0.9505 - val_recall: 0.9505 - val_auc: 0.9926\n","Epoch 80/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0324 - acc: 0.9873 - precision: 0.9873 - recall: 0.9873 - auc: 0.9995 - val_loss: 0.1077 - val_acc: 0.9505 - val_precision: 0.9505 - val_recall: 0.9505 - val_auc: 0.9934\n","Epoch 81/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0445 - acc: 0.9864 - precision: 0.9864 - recall: 0.9864 - auc: 0.9990 - val_loss: 0.0933 - val_acc: 0.9604 - val_precision: 0.9604 - val_recall: 0.9604 - val_auc: 0.9935\n","Epoch 82/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0325 - acc: 0.9881 - precision: 0.9881 - recall: 0.9881 - auc: 0.9995 - val_loss: 0.0819 - val_acc: 0.9802 - val_precision: 0.9802 - val_recall: 0.9802 - val_auc: 0.9970\n","Epoch 83/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0352 - acc: 0.9881 - precision: 0.9881 - recall: 0.9881 - auc: 0.9994 - val_loss: 0.1011 - val_acc: 0.9480 - val_precision: 0.9480 - val_recall: 0.9480 - val_auc: 0.9944\n","Epoch 84/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0378 - acc: 0.9873 - precision: 0.9873 - recall: 0.9873 - auc: 0.9993 - val_loss: 0.1010 - val_acc: 0.9629 - val_precision: 0.9629 - val_recall: 0.9629 - val_auc: 0.9938\n","Epoch 85/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0290 - acc: 0.9907 - precision: 0.9907 - recall: 0.9907 - auc: 0.9996 - val_loss: 0.0981 - val_acc: 0.9604 - val_precision: 0.9604 - val_recall: 0.9604 - val_auc: 0.9941\n","Epoch 86/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0294 - acc: 0.9924 - precision: 0.9924 - recall: 0.9924 - auc: 0.9996 - val_loss: 0.1097 - val_acc: 0.9579 - val_precision: 0.9579 - val_recall: 0.9579 - val_auc: 0.9930\n","Epoch 87/150\n","37/37 [==============================] - 1s 20ms/step - loss: 0.0288 - acc: 0.9907 - precision: 0.9907 - recall: 0.9907 - auc: 0.9996 - val_loss: 0.1154 - val_acc: 0.9530 - val_precision: 0.9530 - val_recall: 0.9530 - val_auc: 0.9935\n","Epoch 88/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0351 - acc: 0.9924 - precision: 0.9924 - recall: 0.9924 - auc: 0.9993 - val_loss: 0.0821 - val_acc: 0.9653 - val_precision: 0.9653 - val_recall: 0.9653 - val_auc: 0.9963\n","Epoch 89/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0365 - acc: 0.9881 - precision: 0.9881 - recall: 0.9881 - auc: 0.9994 - val_loss: 0.1176 - val_acc: 0.9554 - val_precision: 0.9554 - val_recall: 0.9554 - val_auc: 0.9920\n","Epoch 90/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0360 - acc: 0.9890 - precision: 0.9890 - recall: 0.9890 - auc: 0.9993 - val_loss: 0.0766 - val_acc: 0.9678 - val_precision: 0.9678 - val_recall: 0.9678 - val_auc: 0.9968\n","Epoch 91/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0272 - acc: 0.9907 - precision: 0.9907 - recall: 0.9907 - auc: 0.9997 - val_loss: 0.0919 - val_acc: 0.9604 - val_precision: 0.9604 - val_recall: 0.9604 - val_auc: 0.9941\n","Epoch 92/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0249 - acc: 0.9924 - precision: 0.9924 - recall: 0.9924 - auc: 0.9997 - val_loss: 0.0773 - val_acc: 0.9752 - val_precision: 0.9752 - val_recall: 0.9752 - val_auc: 0.9953\n","Epoch 93/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0279 - acc: 0.9932 - precision: 0.9932 - recall: 0.9932 - auc: 0.9996 - val_loss: 0.1199 - val_acc: 0.9530 - val_precision: 0.9530 - val_recall: 0.9530 - val_auc: 0.9927\n","Epoch 94/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0256 - acc: 0.9924 - precision: 0.9924 - recall: 0.9924 - auc: 0.9997 - val_loss: 0.0908 - val_acc: 0.9678 - val_precision: 0.9678 - val_recall: 0.9678 - val_auc: 0.9942\n","Epoch 95/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0280 - acc: 0.9907 - precision: 0.9907 - recall: 0.9907 - auc: 0.9997 - val_loss: 0.0865 - val_acc: 0.9728 - val_precision: 0.9728 - val_recall: 0.9728 - val_auc: 0.9949\n","Epoch 96/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0277 - acc: 0.9932 - precision: 0.9932 - recall: 0.9932 - auc: 0.9995 - val_loss: 0.1080 - val_acc: 0.9530 - val_precision: 0.9530 - val_recall: 0.9530 - val_auc: 0.9935\n","Epoch 97/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0261 - acc: 0.9924 - precision: 0.9924 - recall: 0.9924 - auc: 0.9997 - val_loss: 0.1264 - val_acc: 0.9554 - val_precision: 0.9554 - val_recall: 0.9554 - val_auc: 0.9925\n","Epoch 98/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0233 - acc: 0.9932 - precision: 0.9932 - recall: 0.9932 - auc: 0.9998 - val_loss: 0.0911 - val_acc: 0.9703 - val_precision: 0.9703 - val_recall: 0.9703 - val_auc: 0.9946\n","Epoch 99/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0285 - acc: 0.9915 - precision: 0.9915 - recall: 0.9915 - auc: 0.9996 - val_loss: 0.0865 - val_acc: 0.9752 - val_precision: 0.9752 - val_recall: 0.9752 - val_auc: 0.9949\n","Epoch 100/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0219 - acc: 0.9932 - precision: 0.9932 - recall: 0.9932 - auc: 0.9998 - val_loss: 0.0723 - val_acc: 0.9876 - val_precision: 0.9876 - val_recall: 0.9876 - val_auc: 0.9959\n","Epoch 101/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0227 - acc: 0.9941 - precision: 0.9941 - recall: 0.9941 - auc: 0.9998 - val_loss: 0.0724 - val_acc: 0.9876 - val_precision: 0.9876 - val_recall: 0.9876 - val_auc: 0.9962\n","Epoch 102/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0267 - acc: 0.9949 - precision: 0.9949 - recall: 0.9949 - auc: 0.9996 - val_loss: 0.0882 - val_acc: 0.9703 - val_precision: 0.9703 - val_recall: 0.9703 - val_auc: 0.9946\n","Epoch 103/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0263 - acc: 0.9915 - precision: 0.9915 - recall: 0.9915 - auc: 0.9996 - val_loss: 0.0802 - val_acc: 0.9703 - val_precision: 0.9703 - val_recall: 0.9703 - val_auc: 0.9950\n","Epoch 104/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0275 - acc: 0.9915 - precision: 0.9915 - recall: 0.9915 - auc: 0.9996 - val_loss: 0.0858 - val_acc: 0.9703 - val_precision: 0.9703 - val_recall: 0.9703 - val_auc: 0.9947\n","Epoch 105/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0242 - acc: 0.9924 - precision: 0.9924 - recall: 0.9924 - auc: 0.9998 - val_loss: 0.1256 - val_acc: 0.9530 - val_precision: 0.9530 - val_recall: 0.9530 - val_auc: 0.9929\n","Epoch 106/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0234 - acc: 0.9915 - precision: 0.9915 - recall: 0.9915 - auc: 0.9998 - val_loss: 0.1026 - val_acc: 0.9579 - val_precision: 0.9579 - val_recall: 0.9579 - val_auc: 0.9938\n","Epoch 107/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0211 - acc: 0.9907 - precision: 0.9907 - recall: 0.9907 - auc: 0.9998 - val_loss: 0.0785 - val_acc: 0.9802 - val_precision: 0.9802 - val_recall: 0.9802 - val_auc: 0.9958\n","Epoch 108/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0296 - acc: 0.9932 - precision: 0.9932 - recall: 0.9932 - auc: 0.9988 - val_loss: 0.0932 - val_acc: 0.9728 - val_precision: 0.9728 - val_recall: 0.9728 - val_auc: 0.9945\n","Epoch 109/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0257 - acc: 0.9932 - precision: 0.9932 - recall: 0.9932 - auc: 0.9997 - val_loss: 0.1171 - val_acc: 0.9530 - val_precision: 0.9530 - val_recall: 0.9530 - val_auc: 0.9933\n","Epoch 110/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0251 - acc: 0.9915 - precision: 0.9915 - recall: 0.9915 - auc: 0.9997 - val_loss: 0.1482 - val_acc: 0.9505 - val_precision: 0.9505 - val_recall: 0.9505 - val_auc: 0.9927\n","Epoch 111/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0225 - acc: 0.9932 - precision: 0.9932 - recall: 0.9932 - auc: 0.9998 - val_loss: 0.1646 - val_acc: 0.9480 - val_precision: 0.9480 - val_recall: 0.9480 - val_auc: 0.9917\n","Epoch 112/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0188 - acc: 0.9958 - precision: 0.9958 - recall: 0.9958 - auc: 0.9999 - val_loss: 0.0856 - val_acc: 0.9703 - val_precision: 0.9703 - val_recall: 0.9703 - val_auc: 0.9950\n","Epoch 113/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0199 - acc: 0.9932 - precision: 0.9932 - recall: 0.9932 - auc: 0.9998 - val_loss: 0.0758 - val_acc: 0.9777 - val_precision: 0.9777 - val_recall: 0.9777 - val_auc: 0.9958\n","Epoch 114/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0216 - acc: 0.9932 - precision: 0.9932 - recall: 0.9932 - auc: 0.9998 - val_loss: 0.0745 - val_acc: 0.9827 - val_precision: 0.9827 - val_recall: 0.9827 - val_auc: 0.9955\n","Epoch 115/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0204 - acc: 0.9932 - precision: 0.9932 - recall: 0.9932 - auc: 0.9998 - val_loss: 0.0821 - val_acc: 0.9678 - val_precision: 0.9678 - val_recall: 0.9678 - val_auc: 0.9946\n","Epoch 116/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0308 - acc: 0.9890 - precision: 0.9890 - recall: 0.9890 - auc: 0.9995 - val_loss: 0.1025 - val_acc: 0.9653 - val_precision: 0.9653 - val_recall: 0.9653 - val_auc: 0.9938\n","Epoch 117/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0227 - acc: 0.9958 - precision: 0.9958 - recall: 0.9958 - auc: 0.9997 - val_loss: 0.1315 - val_acc: 0.9530 - val_precision: 0.9530 - val_recall: 0.9530 - val_auc: 0.9926\n","Epoch 118/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0217 - acc: 0.9924 - precision: 0.9924 - recall: 0.9924 - auc: 0.9998 - val_loss: 0.0786 - val_acc: 0.9703 - val_precision: 0.9703 - val_recall: 0.9703 - val_auc: 0.9946\n","Epoch 119/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0181 - acc: 0.9949 - precision: 0.9949 - recall: 0.9949 - auc: 0.9999 - val_loss: 0.0781 - val_acc: 0.9678 - val_precision: 0.9678 - val_recall: 0.9678 - val_auc: 0.9952\n","Epoch 120/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0190 - acc: 0.9941 - precision: 0.9941 - recall: 0.9941 - auc: 0.9999 - val_loss: 0.1291 - val_acc: 0.9505 - val_precision: 0.9505 - val_recall: 0.9505 - val_auc: 0.9930\n","Epoch 121/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0177 - acc: 0.9941 - precision: 0.9941 - recall: 0.9941 - auc: 0.9999 - val_loss: 0.0739 - val_acc: 0.9851 - val_precision: 0.9851 - val_recall: 0.9851 - val_auc: 0.9960\n","Epoch 122/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0186 - acc: 0.9958 - precision: 0.9958 - recall: 0.9958 - auc: 0.9998 - val_loss: 0.0867 - val_acc: 0.9678 - val_precision: 0.9678 - val_recall: 0.9678 - val_auc: 0.9948\n","Epoch 123/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0168 - acc: 0.9941 - precision: 0.9941 - recall: 0.9941 - auc: 0.9999 - val_loss: 0.0781 - val_acc: 0.9728 - val_precision: 0.9728 - val_recall: 0.9728 - val_auc: 0.9952\n","Epoch 124/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0176 - acc: 0.9949 - precision: 0.9949 - recall: 0.9949 - auc: 0.9999 - val_loss: 0.1080 - val_acc: 0.9653 - val_precision: 0.9653 - val_recall: 0.9653 - val_auc: 0.9939\n","Epoch 125/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0174 - acc: 0.9958 - precision: 0.9958 - recall: 0.9958 - auc: 0.9999 - val_loss: 0.1256 - val_acc: 0.9579 - val_precision: 0.9579 - val_recall: 0.9579 - val_auc: 0.9934\n","Epoch 126/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0165 - acc: 0.9958 - precision: 0.9958 - recall: 0.9958 - auc: 0.9999 - val_loss: 0.1260 - val_acc: 0.9505 - val_precision: 0.9505 - val_recall: 0.9505 - val_auc: 0.9934\n","Epoch 127/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0162 - acc: 0.9949 - precision: 0.9949 - recall: 0.9949 - auc: 0.9999 - val_loss: 0.1329 - val_acc: 0.9554 - val_precision: 0.9554 - val_recall: 0.9554 - val_auc: 0.9931\n","Epoch 128/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0162 - acc: 0.9949 - precision: 0.9949 - recall: 0.9949 - auc: 0.9999 - val_loss: 0.0887 - val_acc: 0.9703 - val_precision: 0.9703 - val_recall: 0.9703 - val_auc: 0.9948\n","Epoch 129/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0151 - acc: 0.9958 - precision: 0.9958 - recall: 0.9958 - auc: 0.9999 - val_loss: 0.1016 - val_acc: 0.9653 - val_precision: 0.9653 - val_recall: 0.9653 - val_auc: 0.9944\n","Epoch 130/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0165 - acc: 0.9966 - precision: 0.9966 - recall: 0.9966 - auc: 0.9999 - val_loss: 0.1249 - val_acc: 0.9579 - val_precision: 0.9579 - val_recall: 0.9579 - val_auc: 0.9932\n","Epoch 131/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0155 - acc: 0.9966 - precision: 0.9966 - recall: 0.9966 - auc: 0.9999 - val_loss: 0.0827 - val_acc: 0.9678 - val_precision: 0.9678 - val_recall: 0.9678 - val_auc: 0.9950\n","Epoch 132/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0162 - acc: 0.9949 - precision: 0.9949 - recall: 0.9949 - auc: 0.9999 - val_loss: 0.1038 - val_acc: 0.9629 - val_precision: 0.9629 - val_recall: 0.9629 - val_auc: 0.9941\n","Epoch 133/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0143 - acc: 0.9966 - precision: 0.9966 - recall: 0.9966 - auc: 0.9999 - val_loss: 0.0748 - val_acc: 0.9777 - val_precision: 0.9777 - val_recall: 0.9777 - val_auc: 0.9955\n","Epoch 134/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0181 - acc: 0.9966 - precision: 0.9966 - recall: 0.9966 - auc: 0.9999 - val_loss: 0.0908 - val_acc: 0.9678 - val_precision: 0.9678 - val_recall: 0.9678 - val_auc: 0.9944\n","Epoch 135/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0170 - acc: 0.9949 - precision: 0.9949 - recall: 0.9949 - auc: 0.9999 - val_loss: 0.1176 - val_acc: 0.9554 - val_precision: 0.9554 - val_recall: 0.9554 - val_auc: 0.9934\n","Epoch 136/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0142 - acc: 0.9966 - precision: 0.9966 - recall: 0.9966 - auc: 0.9999 - val_loss: 0.0866 - val_acc: 0.9653 - val_precision: 0.9653 - val_recall: 0.9653 - val_auc: 0.9947\n","Epoch 137/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0143 - acc: 0.9975 - precision: 0.9975 - recall: 0.9975 - auc: 0.9999 - val_loss: 0.1208 - val_acc: 0.9629 - val_precision: 0.9629 - val_recall: 0.9629 - val_auc: 0.9938\n","Epoch 138/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0141 - acc: 0.9932 - precision: 0.9932 - recall: 0.9932 - auc: 0.9999 - val_loss: 0.0721 - val_acc: 0.9802 - val_precision: 0.9802 - val_recall: 0.9802 - val_auc: 0.9955\n","Epoch 139/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0182 - acc: 0.9932 - precision: 0.9932 - recall: 0.9932 - auc: 0.9999 - val_loss: 0.1412 - val_acc: 0.9505 - val_precision: 0.9505 - val_recall: 0.9505 - val_auc: 0.9921\n","Epoch 140/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0186 - acc: 0.9941 - precision: 0.9941 - recall: 0.9941 - auc: 0.9999 - val_loss: 0.1724 - val_acc: 0.9455 - val_precision: 0.9455 - val_recall: 0.9455 - val_auc: 0.9922\n","Epoch 141/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0166 - acc: 0.9958 - precision: 0.9958 - recall: 0.9958 - auc: 0.9999 - val_loss: 0.0547 - val_acc: 0.9827 - val_precision: 0.9827 - val_recall: 0.9827 - val_auc: 0.9984\n","Epoch 142/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0140 - acc: 0.9958 - precision: 0.9958 - recall: 0.9958 - auc: 0.9999 - val_loss: 0.0880 - val_acc: 0.9678 - val_precision: 0.9678 - val_recall: 0.9678 - val_auc: 0.9945\n","Epoch 143/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0129 - acc: 0.9958 - precision: 0.9958 - recall: 0.9958 - auc: 1.0000 - val_loss: 0.0935 - val_acc: 0.9629 - val_precision: 0.9629 - val_recall: 0.9629 - val_auc: 0.9944\n","Epoch 144/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0140 - acc: 0.9949 - precision: 0.9949 - recall: 0.9949 - auc: 0.9999 - val_loss: 0.0906 - val_acc: 0.9653 - val_precision: 0.9653 - val_recall: 0.9653 - val_auc: 0.9945\n","Epoch 145/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0144 - acc: 0.9975 - precision: 0.9975 - recall: 0.9975 - auc: 1.0000 - val_loss: 0.1190 - val_acc: 0.9653 - val_precision: 0.9653 - val_recall: 0.9653 - val_auc: 0.9936\n","Epoch 146/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0145 - acc: 0.9949 - precision: 0.9949 - recall: 0.9949 - auc: 0.9999 - val_loss: 0.0946 - val_acc: 0.9653 - val_precision: 0.9653 - val_recall: 0.9653 - val_auc: 0.9941\n","Epoch 147/150\n","37/37 [==============================] - 1s 18ms/step - loss: 0.0159 - acc: 0.9958 - precision: 0.9958 - recall: 0.9958 - auc: 0.9999 - val_loss: 0.1371 - val_acc: 0.9530 - val_precision: 0.9530 - val_recall: 0.9530 - val_auc: 0.9933\n","Epoch 148/150\n","37/37 [==============================] - 1s 19ms/step - loss: 0.0153 - acc: 0.9949 - precision: 0.9949 - recall: 0.9949 - auc: 0.9999 - val_loss: 0.0994 - val_acc: 0.9653 - val_precision: 0.9653 - val_recall: 0.9653 - val_auc: 0.9939\n","Epoch 149/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0178 - acc: 0.9941 - precision: 0.9941 - recall: 0.9941 - auc: 0.9999 - val_loss: 0.0558 - val_acc: 0.9851 - val_precision: 0.9851 - val_recall: 0.9851 - val_auc: 0.9980\n","Epoch 150/150\n","37/37 [==============================] - 1s 17ms/step - loss: 0.0207 - acc: 0.9941 - precision: 0.9941 - recall: 0.9941 - auc: 0.9998 - val_loss: 0.0763 - val_acc: 0.9728 - val_precision: 0.9728 - val_recall: 0.9728 - val_auc: 0.9949\n","\n","\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"ZUd4nW5b01Wa","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":34},"outputId":"1b1fc1ef-ffdb-43db-cf02-124ab34c4a45","executionInfo":{"status":"ok","timestamp":1585548704338,"user_tz":-120,"elapsed":114265,"user":{"displayName":"Adam Milton-Barker","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiJQTybaYpLCTq3z30X5AacqX3NuSp8php3Ivqfrw=s64","userId":"14960657777339458094"}}},"source":["save_model_as_json()"],"execution_count":26,"outputs":[{"output_type":"stream","text":["Model JSON saved /content/drive/My Drive/ALL-Detection-System-2020/Model/model.json\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"z6YNov--05Dp","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":34},"outputId":"5bb6eae2-b588-4b96-c88e-0f019c8834ac","executionInfo":{"status":"ok","timestamp":1585548704565,"user_tz":-120,"elapsed":114481,"user":{"displayName":"Adam Milton-Barker","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiJQTybaYpLCTq3z30X5AacqX3NuSp8php3Ivqfrw=s64","userId":"14960657777339458094"}}},"source":["save_weights()"],"execution_count":27,"outputs":[{"output_type":"stream","text":["Weights saved /content/drive/My Drive/ALL-Detection-System-2020/Model/weights.h5\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"v8LTGJXeFTZ3","colab_type":"text"},"source":["# Evaluate the model"]},{"cell_type":"code","metadata":{"id":"nvYnG_Hsgopn","colab_type":"code","colab":{}},"source":["def do_predictions():\n"," \"\"\" Makes predictions on the train & test sets. \"\"\"\n","\n"," train_preds = tf_model.predict(X_train)\n"," test_preds = tf_model.predict(X_test)\n","\n"," print(\"Training predictions: \" + str(train_preds))\n"," print(\"Training predictions shape: \" + str(train_preds.shape))\n"," print(\"\")\n"," print(\"Testing predictions: \" + str(test_preds))\n"," print(\"Testing predictions shape: \" + str(test_preds.shape))\n"," print(\"\")\n","\n"," return train_preds, test_preds"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"sI6ui7mHhpPg","colab_type":"code","colab":{}},"source":["def visualize_metrics():\n"," \"\"\" Visualize the metrics. \"\"\"\n","\n"," plt.plot(history.history['acc'])\n"," plt.plot(history.history['val_acc'])\n"," plt.title('Model Accuracy')\n"," plt.ylabel('Accuracy')\n"," plt.xlabel('Epoch')\n"," plt.ylim((0, 1))\n"," plt.legend(['Train', 'Validate'], loc='upper left')\n"," plt.savefig(root_dir + 'Model/Plots/Accuracy.png')\n"," plt.show()\n","\n"," plt.plot(history.history['loss'])\n"," plt.plot(history.history['val_loss'])\n"," plt.title('Model Loss')\n"," plt.ylabel('loss')\n"," plt.xlabel('Epoch')\n"," plt.legend(['Train', 'Validate'], loc='upper left')\n"," plt.savefig(root_dir + 'Model/Plots/Loss.png')\n"," plt.show()\n","\n"," plt.plot(history.history['auc'])\n"," plt.plot(history.history['val_auc'])\n"," plt.title('Model AUC')\n"," plt.ylabel('AUC')\n"," plt.xlabel('Epoch')\n"," plt.legend(['Train', 'Validate'], loc='upper left')\n"," plt.savefig(root_dir + 'Model/Plots/AUC.png')\n"," plt.show()\n","\n"," plt.plot(history.history['precision'])\n"," plt.plot(history.history['val_precision'])\n"," plt.title('Model Precision')\n"," plt.ylabel('Precision')\n"," plt.xlabel('Epoch')\n"," plt.legend(['Train', 'Validate'], loc='upper left')\n"," plt.savefig(root_dir + 'Model/Plots/Precision.png')\n"," plt.show()\n","\n"," plt.plot(history.history['recall'])\n"," plt.plot(history.history['val_recall'])\n"," plt.title('Model Recall')\n"," plt.ylabel('Recall')\n"," plt.xlabel('Epoch')\n"," plt.legend(['Train', 'Validate'], loc='upper left')\n"," plt.savefig(root_dir + 'Model/Plots/Recall.png')\n"," plt.show()"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"V4PcJkq6iCsZ","colab_type":"code","colab":{}},"source":["def confusion_matrix_c(train_preds, test_preds):\n"," \"\"\" Prints/displays the confusion matrix. \"\"\"\n","\n"," matrix = confusion_matrix(y_test.argmax(axis=1), \n"," test_preds.argmax(axis=1))\n","\n"," print(\"Confusion Matrix: \" + str(matrix))\n"," print(\"\")\n","\n"," plt.imshow(matrix, cmap=plt.cm.Blues)\n"," plt.xlabel(\"Predicted labels\")\n"," plt.ylabel(\"True labels\")\n"," plt.xticks([], [])\n"," plt.yticks([], [])\n"," plt.title('Confusion matrix ')\n"," plt.colorbar()\n"," plt.savefig(root_dir + 'Model/Plots/Confusion-Matrix.png')\n"," plt.show()\n","\n"," return matrix"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"dnvrQm4HjTcL","colab_type":"code","colab":{}},"source":["def figures_of_merit(matrix):\n"," \"\"\" Calculates/prints the figures of merit. \n","\n"," https://homes.di.unimi.it/scotti/all/results.php\n"," \"\"\"\n","\n"," test_len = len(X_test)\n","\n"," TP = matrix[1][1]\n"," TN = matrix[0][0]\n"," FP = matrix[0][1]\n"," FN = matrix[1][0]\n","\n"," TPP = (TP * 100)/test_len\n"," FPP = (FP * 100)/test_len\n"," FNP = (FN * 100)/test_len\n"," TNP = (TN * 100)/test_len\n","\n"," specificity = TN/(TN+FP) \n","\n"," misc = FP + FN \n"," miscp = (misc * 100)/test_len \n","\n"," print(\"True Positives: \" + str(TP) + \"(\" + str(TPP) + \"%)\")\n"," print(\"False Positives: \" + str(FP) + \"(\" + str(FPP) + \"%)\")\n"," print(\"True Negatives: \" + str(TN) + \"(\" + str(TNP) + \"%)\")\n"," print(\"False Negatives: \" + str(FN) + \"(\" + str(FNP) + \"%)\")\n","\n"," print(\"Specificity: \" + str(specificity))\n"," print(\"Misclassification: \" + str(misc) + \"(\" + str(miscp) + \"%)\")"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"yolJJVeXgQvE","colab_type":"code","colab":{}},"source":["def do_evaluate():\n"," \"\"\" Evaluates the model \"\"\"\n","\n"," train_preds, test_preds = do_predictions()\n","\n"," metrics = tf_model.evaluate(X_test, y_test, verbose=0) \n"," for name, value in zip(tf_model.metrics_names, metrics):\n"," print(\"Metrics: \" + name + \" \" + str(value))\n"," print()\n","\n"," visualize_metrics() \n"," matrix = confusion_matrix_c(train_preds, test_preds)\n"," figures_of_merit(matrix)"],"execution_count":0,"outputs":[]},{"cell_type":"code","metadata":{"id":"FAVXdHtJj1Lv","colab_type":"code","colab":{"base_uri":"https://localhost:8080/","height":1000},"outputId":"38934a51-0163-4b0f-8a82-749025e3498c","executionInfo":{"status":"ok","timestamp":1585548706398,"user_tz":-120,"elapsed":116271,"user":{"displayName":"Adam Milton-Barker","photoUrl":"https://lh3.googleusercontent.com/a-/AOh14GiJQTybaYpLCTq3z30X5AacqX3NuSp8php3Ivqfrw=s64","userId":"14960657777339458094"}}},"source":["do_evaluate()"],"execution_count":33,"outputs":[{"output_type":"stream","text":["Training predictions: [[4.5429658e-08 1.0000000e+00]\n"," [9.9966812e-01 3.3190424e-04]\n"," [9.9989235e-01 1.0762364e-04]\n"," ...\n"," [9.9996078e-01 3.9209172e-05]\n"," [3.9263859e-02 9.6073616e-01]\n"," [4.2276907e-34 1.0000000e+00]]\n","Training predictions shape: (1180, 2)\n","\n","Testing predictions: [[1.64164332e-21 1.00000000e+00]\n"," [9.99918342e-01 8.16889660e-05]\n"," [1.13144845e-08 1.00000000e+00]\n"," [9.92075324e-01 7.92461820e-03]\n"," [9.94516075e-01 5.48386527e-03]\n"," [5.40748537e-01 4.59251523e-01]\n"," [8.19067623e-08 9.99999881e-01]\n"," [4.20557272e-27 1.00000000e+00]\n"," [3.83874431e-05 9.99961615e-01]\n"," [8.19067623e-08 9.99999881e-01]\n"," [8.14363648e-06 9.99991894e-01]\n"," [9.99999285e-01 7.35762796e-07]\n"," [9.99775469e-01 2.24505813e-04]\n"," [9.99918342e-01 8.16889660e-05]\n"," [9.94531751e-01 5.46824560e-03]\n"," [9.97141123e-01 2.85894191e-03]\n"," [6.96022511e-01 3.03977549e-01]\n"," [9.99114692e-01 8.85271118e-04]\n"," [5.24609204e-05 9.99947548e-01]\n"," [9.36351866e-02 9.06364858e-01]\n"," [9.98626232e-01 1.37382688e-03]\n"," [9.99859571e-01 1.40394681e-04]\n"," [9.99964833e-01 3.52062962e-05]\n"," [9.94531751e-01 5.46824560e-03]\n"," [9.99939084e-01 6.09404742e-05]\n"," [9.98765111e-01 1.23487471e-03]\n"," [9.98999774e-01 1.00029190e-03]\n"," [5.63451494e-25 1.00000000e+00]\n"," [9.94531751e-01 5.46824560e-03]\n"," [4.89015016e-04 9.99511003e-01]\n"," [9.98999774e-01 1.00029190e-03]\n"," [5.90058653e-06 9.99994159e-01]\n"," [7.81748323e-14 1.00000000e+00]\n"," [9.99831915e-01 1.68056868e-04]\n"," [5.24609204e-05 9.99947548e-01]\n"," [1.10576162e-04 9.99889374e-01]\n"," [5.24609204e-05 9.99947548e-01]\n"," [9.98369157e-01 1.63081114e-03]\n"," [9.99998569e-01 1.40149689e-06]\n"," [9.94326890e-01 5.67306997e-03]\n"," [8.27870387e-21 1.00000000e+00]\n"," [9.99964833e-01 3.52062962e-05]\n"," [2.93098678e-17 1.00000000e+00]\n"," [5.14391272e-29 1.00000000e+00]\n"," [7.48390973e-01 2.51608998e-01]\n"," [1.00000000e+00 3.45981270e-08]\n"," [2.03357553e-10 1.00000000e+00]\n"," [9.94531751e-01 5.46824560e-03]\n"," [4.16871590e-05 9.99958277e-01]\n"," [9.99982476e-01 1.75462119e-05]\n"," [1.22409163e-13 1.00000000e+00]\n"," [9.99957085e-01 4.29615357e-05]\n"," [2.03357553e-10 1.00000000e+00]\n"," [1.00000000e+00 1.10584680e-10]\n"," [9.99996662e-01 3.37688448e-06]\n"," [9.99915838e-01 8.41063957e-05]\n"," [4.77035671e-01 5.22964299e-01]\n"," [9.70254064e-01 2.97458861e-02]\n"," [4.52670611e-06 9.99995470e-01]\n"," [9.99845743e-01 1.54185531e-04]\n"," [9.99998093e-01 1.88656327e-06]\n"," [6.01863831e-05 9.99939799e-01]\n"," [9.99964833e-01 3.52062962e-05]\n"," [9.99934196e-01 6.58004210e-05]\n"," [9.99915838e-01 8.41063957e-05]\n"," [2.13565763e-05 9.99978662e-01]\n"," [9.88495827e-01 1.15041519e-02]\n"," [3.81905368e-10 1.00000000e+00]\n"," [1.81567972e-04 9.99818504e-01]\n"," [5.92072203e-04 9.99407887e-01]\n"," [9.99998569e-01 1.40149689e-06]\n"," [1.76854462e-06 9.99998212e-01]\n"," [1.10585324e-21 1.00000000e+00]\n"," [9.99713242e-01 2.86794500e-04]\n"," [1.93872944e-01 8.06127071e-01]\n"," [9.99999881e-01 1.19946009e-07]\n"," [9.99915838e-01 8.41063957e-05]\n"," [9.72083807e-01 2.79161353e-02]\n"," [9.99982476e-01 1.75462119e-05]\n"," [9.87549305e-01 1.24506662e-02]\n"," [8.34094882e-01 1.65905103e-01]\n"," [9.99943852e-01 5.61051347e-05]\n"," [1.00000000e+00 3.45981270e-08]\n"," [9.99965072e-01 3.49564871e-05]\n"," [9.97755468e-01 2.24453839e-03]\n"," [9.99775469e-01 2.24505813e-04]\n"," [9.55329299e-01 4.46707234e-02]\n"," [8.87865067e-01 1.12134852e-01]\n"," [9.99831915e-01 1.68056868e-04]\n"," [9.92075324e-01 7.92461820e-03]\n"," [1.13144845e-08 1.00000000e+00]\n"," [6.36210018e-07 9.99999404e-01]\n"," [1.05242850e-06 9.99998927e-01]\n"," [1.00000000e+00 2.37395052e-11]\n"," [9.99960780e-01 3.92091715e-05]\n"," [1.05242850e-06 9.99998927e-01]\n"," [1.81567972e-04 9.99818504e-01]\n"," [9.23116386e-01 7.68835619e-02]\n"," [9.99999881e-01 8.11522582e-08]\n"," [4.33739433e-11 1.00000000e+00]\n"," [1.21517623e-15 1.00000000e+00]\n"," [9.99897718e-01 1.02212281e-04]\n"," [5.67226698e-06 9.99994278e-01]\n"," [8.14363648e-06 9.99991894e-01]\n"," [1.62657957e-10 1.00000000e+00]\n"," [1.13144845e-08 1.00000000e+00]\n"," [7.88698578e-34 1.00000000e+00]\n"," [1.13144845e-08 1.00000000e+00]\n"," [7.40093653e-10 1.00000000e+00]\n"," [9.68166590e-01 3.18333767e-02]\n"," [1.12687765e-07 9.99999881e-01]\n"," [9.99997735e-01 2.25370763e-06]\n"," [3.37668898e-04 9.99662280e-01]\n"," [9.97832835e-01 2.16711336e-03]\n"," [7.63306141e-01 2.36693889e-01]\n"," [5.87930227e-16 1.00000000e+00]\n"," [6.36210018e-07 9.99999404e-01]\n"," [8.62892509e-01 1.37107477e-01]\n"," [9.85905766e-01 1.40941916e-02]\n"," [3.20118971e-08 1.00000000e+00]\n"," [8.68560433e-01 1.31439567e-01]\n"," [9.95824456e-01 4.17558476e-03]\n"," [2.69274105e-13 1.00000000e+00]\n"," [9.34385924e-13 1.00000000e+00]\n"," [7.72503734e-01 2.27496266e-01]\n"," [9.99999762e-01 2.26662650e-07]\n"," [9.99668121e-01 3.31904244e-04]\n"," [6.21043938e-10 1.00000000e+00]\n"," [1.10585324e-21 1.00000000e+00]\n"," [1.92350764e-02 9.80764925e-01]\n"," [9.99915838e-01 8.41063957e-05]\n"," [1.33897737e-01 8.66102219e-01]\n"," [9.34385924e-13 1.00000000e+00]\n"," [9.99722183e-01 2.77837011e-04]\n"," [9.99995828e-01 4.18126137e-06]\n"," [9.07811522e-01 9.21884179e-02]\n"," [3.83874431e-05 9.99961615e-01]\n"," [7.88698578e-34 1.00000000e+00]\n"," [9.99943852e-01 5.61051347e-05]\n"," [9.92879331e-01 7.12068705e-03]\n"," [9.99943852e-01 5.61051347e-05]\n"," [2.93098678e-17 1.00000000e+00]\n"," [8.47186685e-01 1.52813271e-01]\n"," [9.99999881e-01 8.11522582e-08]\n"," [1.89467277e-14 1.00000000e+00]\n"," [9.87549305e-01 1.24506662e-02]\n"," [4.50442458e-04 9.99549568e-01]\n"," [1.00000000e+00 3.45981270e-08]\n"," [9.99999642e-01 3.09506902e-07]\n"," [9.99815524e-01 1.84537537e-04]\n"," [7.30115652e-01 2.69884318e-01]\n"," [9.23371255e-01 7.66287893e-02]\n"," [4.16871590e-05 9.99958277e-01]\n"," [4.85272302e-08 1.00000000e+00]\n"," [3.12953591e-01 6.87046409e-01]\n"," [9.55080450e-01 4.49195281e-02]\n"," [1.72458948e-18 1.00000000e+00]\n"," [9.99999762e-01 2.90594102e-07]\n"," [9.99668121e-01 3.31904244e-04]\n"," [9.95824456e-01 4.17558476e-03]\n"," [2.43697956e-01 7.56302059e-01]\n"," [2.69274105e-13 1.00000000e+00]\n"," [4.85272302e-08 1.00000000e+00]\n"," [1.24019628e-10 1.00000000e+00]\n"," [1.00000000e+00 3.45981270e-08]\n"," [1.26059609e-03 9.98739421e-01]\n"," [7.40093653e-10 1.00000000e+00]\n"," [2.69954171e-07 9.99999762e-01]\n"," [5.90058653e-06 9.99994159e-01]\n"," [9.96757925e-01 3.24208708e-03]\n"," [8.47981334e-01 1.52018651e-01]\n"," [9.77130055e-01 2.28699408e-02]\n"," [9.99999404e-01 6.20182107e-07]\n"," [6.01863831e-05 9.99939799e-01]\n"," [1.97732821e-13 1.00000000e+00]\n"," [3.32564851e-36 1.00000000e+00]\n"," [9.26285148e-01 7.37148598e-02]\n"," [1.76854462e-06 9.99998212e-01]\n"," [6.60413802e-01 3.39586139e-01]\n"," [1.76854462e-06 9.99998212e-01]\n"," [2.69274105e-13 1.00000000e+00]\n"," [1.13144845e-08 1.00000000e+00]\n"," [9.99996305e-01 3.63661638e-06]\n"," [4.85236038e-20 1.00000000e+00]\n"," [9.95824456e-01 4.17558476e-03]\n"," [1.33056793e-16 1.00000000e+00]\n"," [6.63760185e-01 3.36239755e-01]\n"," [9.88495827e-01 1.15041519e-02]\n"," [9.99997735e-01 2.25370763e-06]\n"," [3.81905368e-10 1.00000000e+00]\n"," [9.99915838e-01 8.41063957e-05]\n"," [9.98765111e-01 1.23487471e-03]\n"," [1.23623058e-05 9.99987602e-01]\n"," [9.99965906e-01 3.40573133e-05]\n"," [9.78849467e-12 1.00000000e+00]\n"," [1.05242850e-06 9.99998927e-01]\n"," [9.94299173e-01 5.70074748e-03]\n"," [9.94960904e-01 5.03907911e-03]\n"," [8.33202660e-01 1.66797340e-01]\n"," [9.07949209e-01 9.20507461e-02]\n"," [2.61340301e-05 9.99973893e-01]\n"," [5.09939790e-02 9.49006021e-01]\n"," [7.84374952e-01 2.15625018e-01]\n"," [6.21043938e-10 1.00000000e+00]\n"," [9.99337971e-01 6.62008068e-04]\n"," [9.99905944e-01 9.40147293e-05]\n"," [9.98999774e-01 1.00029190e-03]\n"," [9.99722183e-01 2.77837011e-04]\n"," [9.99993324e-01 6.71190446e-06]\n"," [3.88525950e-05 9.99961138e-01]\n"," [9.22580493e-14 1.00000000e+00]\n"," [2.26356734e-19 1.00000000e+00]\n"," [1.42766623e-07 9.99999881e-01]\n"," [9.87549305e-01 1.24506662e-02]\n"," [9.96757925e-01 3.24208708e-03]\n"," [9.99841452e-01 1.58483948e-04]\n"," [9.96268511e-01 3.73143307e-03]\n"," [9.99997616e-01 2.39263636e-06]\n"," [4.22026869e-06 9.99995828e-01]\n"," [7.40093653e-10 1.00000000e+00]\n"," [1.00000000e+00 2.08948006e-08]\n"," [3.12971390e-15 1.00000000e+00]\n"," [9.99262512e-01 7.37481576e-04]\n"," [9.99987721e-01 1.22602205e-05]\n"," [7.88453326e-04 9.99211550e-01]\n"," [9.99996066e-01 3.89765501e-06]\n"," [4.16871590e-05 9.99958277e-01]\n"," [9.80417099e-06 9.99990225e-01]\n"," [9.99964833e-01 3.52062962e-05]\n"," [3.66758347e-01 6.33241653e-01]\n"," [9.99943852e-01 5.61051347e-05]\n"," [9.99964833e-01 3.52062962e-05]\n"," [6.98255390e-05 9.99930143e-01]\n"," [9.92832899e-01 7.16714421e-03]\n"," [6.21043938e-10 1.00000000e+00]\n"," [9.99943852e-01 5.61051347e-05]\n"," [9.85905766e-01 1.40941916e-02]\n"," [9.99995708e-01 4.30520913e-06]\n"," [6.39882088e-01 3.60117912e-01]\n"," [9.78591979e-01 2.14080438e-02]\n"," [9.99999881e-01 1.19946009e-07]\n"," [2.03357553e-10 1.00000000e+00]\n"," [1.23623058e-05 9.99987602e-01]\n"," [9.81884778e-01 1.81151759e-02]\n"," [9.36710894e-32 1.00000000e+00]\n"," [7.13564396e-01 2.86435634e-01]\n"," [4.50442458e-04 9.99549568e-01]\n"," [8.56024683e-01 1.43975332e-01]\n"," [9.80982962e-10 1.00000000e+00]\n"," [1.31180707e-06 9.99998689e-01]\n"," [1.00000000e+00 3.45981270e-08]\n"," [1.72458948e-18 1.00000000e+00]\n"," [9.99897718e-01 1.02212281e-04]\n"," [9.99998569e-01 1.40149689e-06]\n"," [9.05313551e-01 9.46864933e-02]\n"," [9.99759138e-01 2.40876107e-04]\n"," [9.99998093e-01 1.88656327e-06]\n"," [9.99943852e-01 5.61051347e-05]\n"," [7.88965225e-01 2.11034730e-01]\n"," [6.21043938e-10 1.00000000e+00]\n"," [9.99999881e-01 1.19946009e-07]\n"," [8.73549640e-01 1.26450390e-01]\n"," [3.26430522e-10 1.00000000e+00]\n"," [2.11087126e-07 9.99999762e-01]\n"," [1.72458948e-18 1.00000000e+00]\n"," [1.33056793e-16 1.00000000e+00]\n"," [9.99997616e-01 2.39263636e-06]\n"," [9.99897718e-01 1.02212281e-04]\n"," [1.04762489e-06 9.99998927e-01]\n"," [6.43842340e-01 3.56157631e-01]\n"," [8.34229350e-01 1.65770680e-01]\n"," [7.59978533e-01 2.40021423e-01]\n"," [9.87627089e-01 1.23728830e-02]\n"," [9.34385924e-13 1.00000000e+00]\n"," [7.36580968e-01 2.63419092e-01]\n"," [9.99995708e-01 4.30520913e-06]\n"," [1.53854668e-01 8.46145332e-01]\n"," [9.99746740e-01 2.53196427e-04]\n"," [9.94531751e-01 5.46824560e-03]\n"," [4.50442458e-04 9.99549568e-01]\n"," [4.60589044e-02 9.53941107e-01]\n"," [9.99990463e-01 9.48817797e-06]\n"," [9.99976754e-01 2.32334514e-05]\n"," [9.87549305e-01 1.24506662e-02]\n"," [9.60938096e-01 3.90619040e-02]\n"," [5.24609204e-05 9.99947548e-01]\n"," [9.98835623e-01 1.16444810e-03]\n"," [9.63108815e-10 1.00000000e+00]\n"," [9.99668121e-01 3.31904244e-04]\n"," [9.96268511e-01 3.73143307e-03]\n"," [7.08279848e-01 2.91720182e-01]\n"," [1.89467277e-14 1.00000000e+00]\n"," [9.98912096e-01 1.08795997e-03]\n"," [1.06332506e-16 1.00000000e+00]\n"," [7.88698578e-34 1.00000000e+00]\n"," [9.07042444e-01 9.29575264e-02]\n"," [1.22409163e-13 1.00000000e+00]\n"," [9.99192774e-01 8.07188917e-04]\n"," [9.99999881e-01 1.19946009e-07]\n"," [2.42043408e-12 1.00000000e+00]\n"," [2.03357553e-10 1.00000000e+00]\n"," [9.99957085e-01 4.29615357e-05]\n"," [2.19675518e-19 1.00000000e+00]\n"," [9.99995708e-01 4.30520913e-06]\n"," [9.99943852e-01 5.61051347e-05]\n"," [8.72632205e-01 1.27367780e-01]\n"," [9.97141123e-01 2.85894191e-03]\n"," [9.38744426e-01 6.12555780e-02]\n"," [9.99775469e-01 2.24505813e-04]\n"," [9.98765111e-01 1.23487471e-03]\n"," [9.99999285e-01 7.35762796e-07]\n"," [9.98999774e-01 1.00029190e-03]\n"," [2.93098678e-17 1.00000000e+00]\n"," [8.58817399e-01 1.41182646e-01]\n"," [7.18990743e-01 2.81009287e-01]\n"," [3.22094373e-03 9.96779025e-01]\n"," [1.22409163e-13 1.00000000e+00]\n"," [9.96757925e-01 3.24208708e-03]\n"," [9.85905766e-01 1.40941916e-02]\n"," [9.99999642e-01 3.63598502e-07]\n"," [9.99967217e-01 3.27356538e-05]\n"," [9.99943852e-01 5.61051347e-05]\n"," [9.98912096e-01 1.08795997e-03]\n"," [9.99847412e-01 1.52568464e-04]\n"," [9.85075235e-01 1.49247320e-02]\n"," [3.83874431e-05 9.99961615e-01]\n"," [9.94960904e-01 5.03907911e-03]\n"," [9.92075324e-01 7.92461820e-03]\n"," [2.61340301e-05 9.99973893e-01]\n"," [2.61340301e-05 9.99973893e-01]\n"," [9.99999046e-01 9.15256635e-07]\n"," [4.95093160e-36 1.00000000e+00]\n"," [9.99957085e-01 4.29615357e-05]\n"," [8.14363648e-06 9.99991894e-01]\n"," [1.00000000e+00 2.49322282e-11]\n"," [9.96757925e-01 3.24208708e-03]\n"," [1.23623058e-05 9.99987602e-01]\n"," [1.23623058e-05 9.99987602e-01]\n"," [9.97141123e-01 2.85894191e-03]\n"," [1.13144845e-08 1.00000000e+00]\n"," [9.99934316e-01 6.57281853e-05]\n"," [9.99999881e-01 1.05488581e-07]\n"," [9.99775469e-01 2.24505813e-04]\n"," [6.36210018e-07 9.99999404e-01]\n"," [1.23623058e-05 9.99987602e-01]\n"," [4.09752579e-11 1.00000000e+00]\n"," [7.54819751e-01 2.45180205e-01]\n"," [1.33056793e-16 1.00000000e+00]\n"," [1.83642749e-12 1.00000000e+00]\n"," [7.88547099e-01 2.11452872e-01]\n"," [9.98744488e-01 1.25542877e-03]\n"," [7.74567967e-21 1.00000000e+00]\n"," [1.43451513e-18 1.00000000e+00]\n"," [1.00000000e+00 5.31782840e-10]\n"," [9.99998569e-01 1.40149689e-06]\n"," [2.26924613e-01 7.73075402e-01]\n"," [8.15258420e-04 9.99184787e-01]\n"," [9.99991655e-01 8.36825166e-06]\n"," [1.30530782e-06 9.99998689e-01]\n"," [7.40887462e-10 1.00000000e+00]\n"," [9.34385924e-13 1.00000000e+00]\n"," [9.80293512e-01 1.97065137e-02]\n"," [1.60860626e-12 1.00000000e+00]\n"," [9.99982476e-01 1.75462119e-05]\n"," [9.98864174e-01 1.13589852e-03]\n"," [9.92075324e-01 7.92461820e-03]\n"," [1.23623058e-05 9.99987602e-01]\n"," [9.92832899e-01 7.16714421e-03]\n"," [9.99965906e-01 3.40573133e-05]\n"," [9.90548670e-01 9.45133530e-03]\n"," [1.10585324e-21 1.00000000e+00]\n"," [9.99988794e-01 1.12077978e-05]\n"," [9.92075324e-01 7.92461820e-03]\n"," [1.00000000e+00 2.28079597e-10]\n"," [9.98835623e-01 1.16444810e-03]\n"," [9.61605430e-01 3.83946374e-02]\n"," [2.61340301e-05 9.99973893e-01]\n"," [9.51952040e-01 4.80479784e-02]\n"," [9.21027143e-12 1.00000000e+00]\n"," [1.23623058e-05 9.99987602e-01]\n"," [1.78005301e-11 1.00000000e+00]\n"," [9.99999881e-01 1.19946009e-07]\n"," [9.99982476e-01 1.75462119e-05]\n"," [9.99808133e-01 1.91832733e-04]\n"," [8.70102465e-01 1.29897565e-01]\n"," [2.48688847e-10 1.00000000e+00]\n"," [7.55022764e-02 9.24497783e-01]\n"," [1.00000000e+00 9.08723860e-11]\n"," [6.74777865e-01 3.25222164e-01]\n"," [9.92075324e-01 7.92461820e-03]\n"," [3.81905368e-10 1.00000000e+00]\n"," [8.40213358e-01 1.59786627e-01]\n"," [7.88698578e-34 1.00000000e+00]\n"," [1.00000000e+00 1.11072024e-12]\n"," [9.85905766e-01 1.40941916e-02]\n"," [9.27457571e-01 7.25424439e-02]\n"," [9.34385924e-13 1.00000000e+00]\n"," [6.46495801e-10 1.00000000e+00]\n"," [9.99987602e-01 1.24417747e-05]\n"," [8.19988787e-01 1.80011272e-01]\n"," [9.96889532e-01 3.11048795e-03]\n"," [9.99983668e-01 1.63075401e-05]\n"," [8.37249279e-01 1.62750736e-01]\n"," [1.10576162e-04 9.99889374e-01]]\n","Testing predictions shape: (404, 2)\n","\n","Metrics: loss 0.07910887151956558\n","Metrics: acc 0.9727723002433777\n","Metrics: precision 0.9727723002433777\n","Metrics: recall 0.9727723002433777\n","Metrics: auc 0.9948963522911072\n","\n"],"name":"stdout"},{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"tags":[]}},{"output_type":"display_data","data":{"image/png":"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\n8a2jo/n8dgAAAABJRU5ErkJggg==\n","text/plain":["
"]},"metadata":{"tags":[]}},{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"tags":[]}},{"output_type":"display_data","data":{"image/png":"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\nTkSuQmCC\n","text/plain":["
"]},"metadata":{"tags":[]}},{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"tags":[]}},{"output_type":"stream","text":["Confusion Matrix: [[225 0]\n"," [ 11 168]]\n","\n"],"name":"stdout"},{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"tags":[]}},{"output_type":"stream","text":["True Positives: 168(41.584158415841586%)\n","False Positives: 0(0.0%)\n","True Negatives: 225(55.693069306930695%)\n","False Negatives: 11(2.722772277227723%)\n","Specificity: 1.0\n","Misclassification: 11(2.722772277227723%)\n"],"name":"stdout"}]}]} \ No newline at end of file diff --git a/CNN/README.md b/CNN/README.md index cca4c46..379e306 100644 --- a/CNN/README.md +++ b/CNN/README.md @@ -22,8 +22,9 @@ One method to overcome reproducibility issues and get an good idea of how well o Below are the results from individual training sessions. -| Hardware | Training | Validation | Test | Accuracy | Recall | Precision | AUC/ROC | -| -------------------- | -------------------- | ----- | ---------- | ---------- | ---------- | ---------- | ---------- | +| OS | Hardware | Training | Validation | Test | Accuracy | Recall | Precision | AUC/ROC | +| -------------------- | -------------------- | -------------------- | ----- | ---------- | ---------- | ---------- | ---------- | ---------- | +| Google Colab | Tesla K80 GPU | 1180 | 404 | 20 | 0.9727723002433777 | 0.9727723002433777 | 0.9727723002433777 | 0.9948963522911072 | | Windows 10 | NVIDIA GeoForce GTX 1060 | 1180 | 404 | 20 | 0.97066015 | 0.97066015 | 0.97066015 | 0.9908836 | | Ubuntu 18.04 | NVIDIA GTX 1050 Ti Ti/PCIe/SSE2 | 1180 | 404 | 20 | 0.97772276 | 0.97772276 | 0.97772276 | 0.9945594 | | Ubuntu 18.04 | Intel® Core™ i7-7700HQ CPU @ 2.80GHz × 8 | 1180 | 404 | 20 | 0.9752475 | 0.9752475 | 0.9752475 | 0.991492 | diff --git a/README.md b/README.md index 4f6d419..7ff9426 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,9 @@ One method to overcome reproducibility issues and get an good idea of how well o Below are the results from individual training sessions. -| Operating System | Hardware | Training | Validation | Test | Accuracy | Recall | Precision | AUC/ROC | +| OS | Hardware | Training | Validation | Test | Accuracy | Recall | Precision | AUC/ROC | | -------------------- | -------------------- | -------------------- | ----- | ---------- | ---------- | ---------- | ---------- | ---------- | +| Google Colab | Tesla K80 GPU | 1180 | 404 | 20 | 0.9727723002433777 | 0.9727723002433777 | 0.9727723002433777 | 0.9948963522911072 | | Windows 10 | NVIDIA GeoForce GTX 1060 | 1180 | 404 | 20 | 0.97066015 | 0.97066015 | 0.97066015 | 0.9908836 | | Ubuntu 18.04 | NVIDIA GTX 1050 Ti Ti/PCIe/SSE2 | 1180 | 404 | 20 | 0.97772276 | 0.97772276 | 0.97772276 | 0.9945594 | | Ubuntu 18.04 | Intel® Core™ i7-7700HQ CPU @ 2.80GHz × 8 | 1180 | 404 | 20 | 0.9752475 | 0.9752475 | 0.9752475 | 0.991492 | From eae74021d3fd4affe806eb1d1113cf7be4c05f0f Mon Sep 17 00:00:00 2001 From: Adam Milton-Barker Date: Mon, 30 Mar 2020 10:19:05 +0200 Subject: [PATCH 07/13] Rounded Google Colab results --- CNN/README.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CNN/README.md b/CNN/README.md index 379e306..238d41c 100644 --- a/CNN/README.md +++ b/CNN/README.md @@ -24,7 +24,7 @@ Below are the results from individual training sessions. | OS | Hardware | Training | Validation | Test | Accuracy | Recall | Precision | AUC/ROC | | -------------------- | -------------------- | -------------------- | ----- | ---------- | ---------- | ---------- | ---------- | ---------- | -| Google Colab | Tesla K80 GPU | 1180 | 404 | 20 | 0.9727723002433777 | 0.9727723002433777 | 0.9727723002433777 | 0.9948963522911072 | +| Google Colab | Tesla K80 GPU | 1180 | 404 | 20 | 0.9727723 | 0.9727723 | 0.9727723 | 0.9948964 | | Windows 10 | NVIDIA GeoForce GTX 1060 | 1180 | 404 | 20 | 0.97066015 | 0.97066015 | 0.97066015 | 0.9908836 | | Ubuntu 18.04 | NVIDIA GTX 1050 Ti Ti/PCIe/SSE2 | 1180 | 404 | 20 | 0.97772276 | 0.97772276 | 0.97772276 | 0.9945594 | | Ubuntu 18.04 | Intel® Core™ i7-7700HQ CPU @ 2.80GHz × 8 | 1180 | 404 | 20 | 0.9752475 | 0.9752475 | 0.9752475 | 0.991492 | diff --git a/README.md b/README.md index 7ff9426..7851213 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Below are the results from individual training sessions. | OS | Hardware | Training | Validation | Test | Accuracy | Recall | Precision | AUC/ROC | | -------------------- | -------------------- | -------------------- | ----- | ---------- | ---------- | ---------- | ---------- | ---------- | -| Google Colab | Tesla K80 GPU | 1180 | 404 | 20 | 0.9727723002433777 | 0.9727723002433777 | 0.9727723002433777 | 0.9948963522911072 | +| Google Colab | Tesla K80 GPU | 1180 | 404 | 20 | 0.9727723 | 0.9727723 | 0.9727723 | 0.9948964 | | Windows 10 | NVIDIA GeoForce GTX 1060 | 1180 | 404 | 20 | 0.97066015 | 0.97066015 | 0.97066015 | 0.9908836 | | Ubuntu 18.04 | NVIDIA GTX 1050 Ti Ti/PCIe/SSE2 | 1180 | 404 | 20 | 0.97772276 | 0.97772276 | 0.97772276 | 0.9945594 | | Ubuntu 18.04 | Intel® Core™ i7-7700HQ CPU @ 2.80GHz × 8 | 1180 | 404 | 20 | 0.9752475 | 0.9752475 | 0.9752475 | 0.991492 | From 5e65f3413d94a48de991a598a02de84129e8ecfb Mon Sep 17 00:00:00 2001 From: Adam Milton-Barker Date: Mon, 30 Mar 2020 12:29:45 +0200 Subject: [PATCH 08/13] Cleaned up function descriptions --- CNN/README.md | 84 +++++++++++++++++++++++---------------------------- 1 file changed, 37 insertions(+), 47 deletions(-) diff --git a/CNN/README.md b/CNN/README.md index 238d41c..a07db60 100644 --- a/CNN/README.md +++ b/CNN/README.md @@ -143,13 +143,11 @@ The code for this project consists of 5 main Python files and a configuration fi Our functionality for this network can be found mainly in the **Classes** directory. -| Class | Description | -| ------------- | ------------ | -| Helpers.py | [Helpers.py](https://github.com/AMLResearchProject/ALL-Detection-System-2020/tree/master/CNN/Classes/Helpers.py "Helpers.py") is a helper class. The class loads the configuration and logging that the project uses. | -| Data.py | [Data.py](https://github.com/AMLResearchProject/ALL-Detection-System-2020/tree/master/CNN/Classes/Data.py "Data.py") is a data helper class. The class provides the functionality for sorting and preparing your training and validation data. | | -| Augmentation.py | [Augmentation.py](https://github.com/AMLResearchProject/ALL-Detection-System-2020/tree/master/CNN/Classes/Augmentation.py "Model.py") is a augmentation helper class, The class provides functionality for data augmentation. | -| Model.py | [Model.py](https://github.com/AMLResearchProject/ALL-Detection-System-2020/tree/master/CNN/Classes/Model.py "Model.py") is a model helper class. The class provides the functionality for creating our CNN. | -| Server.py | [Server.py](https://github.com/AMLResearchProject/ALL-Detection-System-2020/tree/master/CNN/Classes/Server.py "Server.py"): is a server helpers class. The class provides the functionality for creating our CNN | +- [Helpers.py](https://github.com/AMLResearchProject/ALL-Detection-System-2020/tree/master/CNN/Classes/Helpers.py "Helpers.py") is a helper class. The class loads the configuration and logging that the project uses. +- [Data.py](https://github.com/AMLResearchProject/ALL-Detection-System-2020/tree/master/CNN/Classes/Data.py "Data.py") is a data helper class. The class provides the functionality for sorting and preparing your training and validation data. +- [Augmentation.py](https://github.com/AMLResearchProject/ALL-Detection-System-2020/tree/master/CNN/Classes/Augmentation.py "Augmentation.py") is a augmentation helper class, The class provides functionality for data augmentation. +- [Model.py](https://github.com/AMLResearchProject/ALL-Detection-System-2020/tree/master/CNN/Classes/Model.py "Model.py") is a model helper class. The class provides the functionality for creating our CNN. +- [Server.py](https://github.com/AMLResearchProject/ALL-Detection-System-2020/tree/master/CNN/Classes/Server.py "Server.py") is a server helpers class. The class provides the functionality for creating our CNN #### Functions @@ -157,55 +155,47 @@ Our functionality for this network can be found mainly in the **Classes** direct ##### Data.py -| Function | Description | -| ------------ | -------- | -| do_im_process() | The do_im_process() function augments and prepares the data. | -| convert_data() | The convert_data() function converts the training data to a numpy array. | -| encode_labels() | The encode_labels() function One Hot Encodes the labels. | -| shuffle() | The shuffle() function shuffles the data helping to eliminate bias. | -| get_split() | The get_split() function splits the prepared data and labels into training and validation data. | -| resize() | The resize() function resizes an image. | +- **do_im_process()** - The do_im_process() function augments and prepares the data. +- **convert_data()** - The convert_data() function converts the training data to a numpy array. +- **encode_labels()** - The encode_labels() function One Hot Encodes the labels. +- **shuffle()** - The shuffle() function shuffles the data helping to eliminate bias. +- **get_split()** - The get_split() function splits the prepared data and labels into training and validation data. +- **resize()** - The resize() function resizes an image. ##### Augmentation.py -| Function | Description | -| ------------ | -------- | -| grayscale() | The grayscale() function creates a grayscale copy of an image. | -| equalize_hist() | The equalize_hist() function creates a histogram equalized copy of an image. | -| reflection() | The reflection() function creates a horizontally and vertically reflected copies of an image. | -| gaussian() | The gaussian() function creates a gaussian blurred copy of an image. | -| translate() | The translate() function creates a translated copy of an image. | -| rotation() | The rotation() function creates rotated copy/copies of an image. | -| shear() | The shear() function creates sheared copy of an image. | +- **grayscale()** The grayscale() function creates a grayscale copy of an image. +- **equalize_hist()** The equalize_hist() function creates a histogram equalized copy of an image. +- **reflection()** The reflection() function creates a horizontally and vertically reflected copies of an image. +- **gaussian()** The gaussian() function creates a gaussian blurred copy of an image. +- **translate()** The translate() function creates a translated copy of an image. +- **rotation()** The rotation() function creates rotated copy/copies of an image. +- **shear()** The shear() function creates sheared copy of an image. ##### Model.py -| Function | Description | -| ------------ | -------- | -| do_data() | The do_data() creates an augmented dataset that we will use for our model training and validation. | -| do_network() | The do_network() function creates the network architecture proposed in the [Acute Leukemia Classification Using Convolution Neural Network In Clinical Decision Support System](https://airccj.org/CSCP/vol7/csit77505.pdf "Acute Leukemia Classification Using Convolution Neural Network In Clinical Decision Support System") paper. | -| do_train() | The do_train() function compiles and trains the model. | -| do_evaluate() | The do_evaluate() function evaluates the model, and displays the values for the metrics we specified. | -| do_predictions() | The do_predictions() function makes predictions on the train & test sets. | -| visualize_metrics() | The visualize_metrics() function allows you to visualize and save the metrics plot images. | -| confusion_matrix() | The confusion_matrix() function allows you to visualize the confusion matrix. | -| figures_of_merit() | The figures_of_merit() calculates the figures of merit requested on the ALL-IDB website. | -| save_weights() | The save_weights() saves the model weights. | -| save_model_as_json() | The save_model_as_json() saves the model as JSON. | -| load_model_and_weights() | The load_model_and_weights() loads the trained model and weights. | -| test_classifier() | The test_classifier() tests the classifier using the test data set. | -| send_request() | The send_request() sends a HTTP request. | -| test_http_classifier() | The test_http_classifier() tests the server / API by sending the test data to the classifier with the API. | -| http_classify() | The http_classify() classifies an image sent via HTTP. | -| vr_http_classify() | The vr_http_classify() classifies an image sent via from VR via HTTP. | -| get_predictions() | The get_predictions() gets a prediction for an image. | -| reshape() | The reshape() reshapes an image. | +- **do_data()** The do_data() creates an augmented dataset that we will use for our model training and validation. +- **do_network()** The do_network() function creates the network architecture proposed in the [Acute Leukemia Classification Using Convolution Neural Network In Clinical Decision Support System](https://airccj.org/CSCP/vol7/csit77505.pdf "Acute Leukemia Classification Using Convolution Neural Network In Clinical Decision Support System") paper. +- **do_train()** The do_train() function compiles and trains the model. +- **do_evaluate()** The do_evaluate() function evaluates the model, and displays the values for the metrics we specified. +- **do_predictions()** The do_predictions() function makes predictions on the train & test sets. +- **visualize_metrics()** The visualize_metrics() function allows you to visualize and save the metrics plot images. +- **confusion_matrix()** The confusion_matrix() function allows you to visualize the confusion matrix. +- **figures_of_merit()** The figures_of_merit() calculates the figures of merit requested on the ALL-IDB website. +- **save_weights()** The save_weights() saves the model weights. +- **save_model_as_json()** The save_model_as_json() saves the model as JSON. +- **load_model_and_weights()** The load_model_and_weights() loads the trained model and weights. +- **test_classifier()** The test_classifier() tests the classifier using the test data set. +- **send_request()** The send_request() sends a HTTP request. +- **test_http_classifier()** The test_http_classifier() tests the server / API by sending the test data to the classifier with the API. +- **http_classify()** The http_classify() classifies an image sent via HTTP. +- **vr_http_classify()** The vr_http_classify() classifies an image sent via from VR via HTTP. +- **get_predictions()** The get_predictions() gets a prediction for an image. +- **reshape()** The reshape() reshapes an image. ##### Server.py -| Function | Description | -| --------- | -------- | -| start() | The start() starts the classification API server. | +- **start()** The start() starts the classification API server.   From 709b1b9637730a6883cace9ed3a43e405dab48fa Mon Sep 17 00:00:00 2001 From: AdamMiltonBarker Date: Mon, 30 Mar 2020 22:21:25 +0200 Subject: [PATCH 09/13] Delete WindowsIssues.md --- Documentation/WindowsIssues.md | 50 ---------------------------------- 1 file changed, 50 deletions(-) delete mode 100644 Documentation/WindowsIssues.md diff --git a/Documentation/WindowsIssues.md b/Documentation/WindowsIssues.md deleted file mode 100644 index 15cff27..0000000 --- a/Documentation/WindowsIssues.md +++ /dev/null @@ -1,50 +0,0 @@ -# Peter Moss Acute Myeloid & Lymphoblastic Leukemia AI Research Project - -## Acute Lymphoblastic Leukemia Detection System 2020 - -**Issue #1 -ImportError: DLL load failed: The specified module could not be found** - -**OS -** Windows 10 - -**Reason -** As per TF's Release Notes for 2.1.0. Officially-released tensorflow Pip packages are now built with Visual Studio 2019 version 16.4 in order to take advantage of the new /d2ReducedOptimizeHugeFunctions compiler flag. - -To use these new packages, you must install "Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019", available from Microsoft's website here. - -**Solution -** If you are facing this after Tensorflow 2.1.0, it is probably because Tensorflow (CPU version) comes with GPU support by default. And it requires Microsoft Visual C++ Redistributable for Visual Studio 2015/17/19 as shown in the installation step #1 on the website. - -**Issue #2 - Win10: AttributeError: 'RepeatedCompositeFieldContainer' object has no attribute 'append'** - -**OS -** Windows 10 - -**Reason -** For binaries, the PIP dependency is protobuf >= 3.9.2. The same can be referred from [here](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/pip_package/setup.py#L64) - -**Solution -** Run pip install -U protobuf to install latest version of protobuf - -# Contributing - -The Peter Moss Acute Myeloid & Lymphoblastic Leukemia AI Research project encourages and welcomes code contributions, bug fixes and enhancements from the Github. - -Please read the [CONTRIBUTING](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/CONTRIBUTING.md "CONTRIBUTING") document for a full guide to forking our repositories and submitting your pull requests. You will also find information about our code of conduct on this page. - -## Contributors - -- **AUTHOR:** [Rishabh Banga](https://www.petermossamlallresearch.com/team/rishabh-banga/profile "Rishabh Banga") - [Peter Moss Leukemia AI Research](https://www.leukemiaresearchassociation.ai "Peter Moss Leukemia AI Research") & Intel Software Innovator, Delhi, India - -  - -# Versioning - -We use SemVer for versioning. For the versions available, see [Releases](https://github.com/AMLResearchProject/ALL-Detection-System-2020/releases "Releases"). - -  - -# License - -This project is licensed under the **MIT License** - see the [LICENSE](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/LICENSE "LICENSE") file for details. - -  - -# Bugs/Issues - -We use the [repo issues](https://github.com/AMLResearchProject/ALL-Detection-System-2020/issues "repo issues") to track bugs and general requests related to using this project. See [CONTRIBUTING](https://github.com/AMLResearchProject/ALL-Detection-System-2020/blob/master/CONTRIBUTING.md "CONTRIBUTING") for more info on how to submit bugs, feature requests and proposals. \ No newline at end of file From 96ba8d2e66a7357aad2e684de52aa45b57ff8e0e Mon Sep 17 00:00:00 2001 From: AdamMiltonBarker Date: Mon, 30 Mar 2020 22:21:51 +0200 Subject: [PATCH 10/13] Delete Autorun.sh --- CNN/Scripts/Autorun.sh | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 CNN/Scripts/Autorun.sh diff --git a/CNN/Scripts/Autorun.sh b/CNN/Scripts/Autorun.sh deleted file mode 100644 index 7413189..0000000 --- a/CNN/Scripts/Autorun.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -echo "Installing dependencies via Setup Script" -sh ../Setup.sh -read -p 'Do you want to randomize the image transfer in Test folder? (Y/N) - ' input -read -p 'Enter path to im folder of ALL_IDB1 (in Windows path should be in format C:/Users/ instead of C:\Users\) - ' imPath -if [[ "$input" == "Y" ]]; then - ./Randomizer.sh -path $imPath -randomize $input -else - ./Randomizer.sh -path $imPath -randomize N -fi -echo "-- Starting training" -echo " " -cd - -Timediff.sh -op Train -echo "-- Finished training" -echo "-- Starting classifying" -echo " " -Timediff.sh -op Classify -echo "-- Finished classifying. Exiting Script." \ No newline at end of file From ac738cfdf416a7568256d4dc3420c706d0f827b3 Mon Sep 17 00:00:00 2001 From: AdamMiltonBarker Date: Mon, 30 Mar 2020 22:22:01 +0200 Subject: [PATCH 11/13] Delete Timediff.sh --- CNN/Scripts/Timediff.sh | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 CNN/Scripts/Timediff.sh diff --git a/CNN/Scripts/Timediff.sh b/CNN/Scripts/Timediff.sh deleted file mode 100644 index cc3e605..0000000 --- a/CNN/Scripts/Timediff.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -timediff(){ - op=$1 - START=$(date +%s) - cd ../ - python AllDS2020.py $op - END=$(date +%s) - DIFF=$(( $END - $START )) - printf 'Operation %s took %ddays %dhrs %dmins %dsec\n' $op $(($DIFF/86400)) $(($DIFF%86400/3600)) $(($DIFF%3600/60)) \ $(($DIFF%60)) - cd - - exit -} - -if [[ "$2" == "Classify" ]] || [[ "$2" == "Train" ]] ; then - timediff $2 -else - echo "Wrong Input Provided" - echo "Use -op Train or -op Classify" - exit 0 -fi \ No newline at end of file From d49b394d69b98e31ca90a647e1480241afd298f3 Mon Sep 17 00:00:00 2001 From: Adam Milton-Barker Date: Mon, 30 Mar 2020 22:42:58 +0200 Subject: [PATCH 12/13] Fixed TimeDiff in documentation --- Documentation/AutoPilot.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/AutoPilot.md b/Documentation/AutoPilot.md index 8fa887c..3dee54b 100644 --- a/Documentation/AutoPilot.md +++ b/Documentation/AutoPilot.md @@ -10,7 +10,7 @@ To run in autopilot we'd be utilizing 3 scripts: 1. AutoPilot.sh 2. Randomizer.sh -3. Timediff.sh +3. TimeDiff.sh All of these are located inside the Scripts folder of the CNN Directory. So, first step is to go inside the Scripts directory. From 9e4bcaee73d33857a167fb582905b4cff20e975c Mon Sep 17 00:00:00 2001 From: Adam Milton-Barker Date: Mon, 30 Mar 2020 22:43:45 +0200 Subject: [PATCH 13/13] Fixed TimeDiff in documentation --- Documentation/AutoPilot.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/AutoPilot.md b/Documentation/AutoPilot.md index 3dee54b..40a1e59 100644 --- a/Documentation/AutoPilot.md +++ b/Documentation/AutoPilot.md @@ -35,7 +35,7 @@ Enter path to im folder of ALL_IDB1 (in Windows path should be in format C:/User ``` This one is pretty self explanatory, so path to be provided by User should be in the format C:/Users/XYZ/PML-AI-Research/ALL_IDB_Data/ALL_IDB1/im -Once all this is done, Training and Testing would begin with **Timediff.sh** running each of them and recording the total time taken by each. +Once all this is done, Training and Testing would begin with **TimeDiff.sh** running each of them and recording the total time taken by each.