Cainvas
Model Files
cnn_model_skin1.h5
keras
Model
deepSea Compiled Models
cnn_model_skin1.exe
deepSea
Ubuntu

SKIN CANCER DETECTION USING CNN

Credit: AITS Cainvas Community

Photo by SELECTO on Dribbble

In [1]:
import tensorflow as tf
from tensorflow import keras 
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as img
%matplotlib inline
import tensorflow.keras.backend as K
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.preprocessing import image
from pylab import imread,subplot,imshow,show
import cv2
import os
In [2]:
!wget -N "https://cainvas-static.s3.amazonaws.com/media/user_data/cainvas-admin/CNN_model_dataset.zip"
!unzip -qo CNN_model_dataset.zip 
!rm CNN_model_dataset.zip
--2021-07-21 16:12:34--  https://cainvas-static.s3.amazonaws.com/media/user_data/cainvas-admin/CNN_model_dataset.zip
Resolving cainvas-static.s3.amazonaws.com (cainvas-static.s3.amazonaws.com)... 52.219.66.84
Connecting to cainvas-static.s3.amazonaws.com (cainvas-static.s3.amazonaws.com)|52.219.66.84|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 170317173 (162M) [application/x-zip-compressed]
Saving to: ‘CNN_model_dataset.zip’

CNN_model_dataset.z 100%[===================>] 162.43M  97.2MB/s    in 1.7s    

2021-07-21 16:12:36 (97.2 MB/s) - ‘CNN_model_dataset.zip’ saved [170317173/170317173]

In [3]:
fig = plt.figure(figsize=(13, 10))

path = r'data/train/benign/100.jpg'
Image1 = cv2.imread(path,0)

path_1 = r'data/train/benign/1021.jpg'
Image2 = cv2.imread(path_1,0)

path_2 = r'data/train/malignant/19.jpg'
Image3 = cv2.imread(path_2,0)

path_3 = r'data/train/malignant/55.jpg'
Image4 = cv2.imread(path_3,0)

path_4 = r'data/test/benign/105.jpg'
Image5 = cv2.imread(path_4,0)

path_5 = r'data/test/benign/259.jpg'
Image6 = cv2.imread(path_5,0)

fig.add_subplot(3,3,1)
plt.imshow(Image1)
fig.add_subplot(3,3,2)
plt.imshow(Image2)
fig.add_subplot(3,3,3)
plt.imshow(Image3)
fig.add_subplot(3,3,4)
plt.imshow(Image4)
fig.add_subplot(3,3,5)
plt.imshow(Image5)
fig.add_subplot(3,3,6)
plt.imshow(Image6)
Out[3]:
<matplotlib.image.AxesImage at 0x7ffaae905080>

Rescaling

In [4]:
train = ImageDataGenerator(rescale=1./255)
test =  ImageDataGenerator(rescale=1./255)
val =  ImageDataGenerator(rescale=1./255)
In [5]:
train='data/train/'
In [6]:
train_data = tf.keras.preprocessing.image_dataset_from_directory(
    train,
    validation_split=0.25,
    image_size=(224,224),
    batch_size=35,
    subset='training',
    seed=50 )
Found 2637 files belonging to 2 classes.
Using 1978 files for training.
In [7]:
val='data/train/'
In [8]:
val_data = tf.keras.preprocessing.image_dataset_from_directory(
    val,
    validation_split=0.25,
    image_size=(224,224),
    batch_size=35,
    subset='validation',
    seed=50
    )
Found 2637 files belonging to 2 classes.
Using 659 files for validation.
In [9]:
test='data/test/'
In [10]:
test_data=tf.keras.preprocessing.image_dataset_from_directory(
    test,
    image_size=(224,224),
    batch_size=35,
    seed=50
    )
Found 660 files belonging to 2 classes.
In [11]:
class_names = ['Benign', 'Malignant']
In [12]:
train_data.class_names = class_names
val_data.class_names = class_names
In [13]:
plt.figure(figsize=(14, 14))
for images, labels in train_data.take(1):
    for i in range(9):
        ax = plt.subplot(3, 3, i + 1)
        plt.imshow(images[i].numpy().astype("uint8"))
        plt.title(train_data.class_names[labels[i]])
        plt.axis("off")
In [14]:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D,Input
from tensorflow.keras.layers import Dense

Model Creation

In [15]:
model=Sequential()
In [16]:
#CNN Layer
model.add(Conv2D(32,(3,3), activation='relu', input_shape=(224,224,3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32,(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(16,(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(16,(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(16,(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(16,(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(50,activation='relu'))
model.add(Dense(100,activation='relu'))
model.add(Dense(200,activation='relu'))
model.add(Dense(2, activation='softmax'))
In [17]:
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 222, 222, 32)      896       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 111, 111, 32)      0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 109, 109, 32)      9248      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 54, 54, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 52, 52, 16)        4624      
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 26, 26, 16)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 24, 24, 16)        2320      
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 12, 12, 16)        0         
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 10, 10, 16)        2320      
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 5, 5, 16)          0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 3, 3, 16)          2320      
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 1, 1, 16)          0         
_________________________________________________________________
flatten (Flatten)            (None, 16)                0         
_________________________________________________________________
dense (Dense)                (None, 50)                850       
_________________________________________________________________
dense_1 (Dense)              (None, 100)               5100      
_________________________________________________________________
dense_2 (Dense)              (None, 200)               20200     
_________________________________________________________________
dense_3 (Dense)              (None, 2)                 402       
=================================================================
Total params: 48,280
Trainable params: 48,280
Non-trainable params: 0
_________________________________________________________________
In [18]:
model.compile(loss="sparse_categorical_crossentropy", 
              optimizer="adam",
              metrics=["accuracy"])
In [19]:
samples=2637
batch_size=35
new_values= samples//batch_size
value=print(new_values)
history = model.fit(
          train_data,
          steps_per_epoch = value,
          epochs=10,
          validation_data=val_data,
                             )
75
Epoch 1/10
57/57 [==============================] - 5s 96ms/step - loss: 0.7022 - accuracy: 0.5566 - val_loss: 0.6043 - val_accuracy: 0.6586
Epoch 2/10
57/57 [==============================] - 5s 83ms/step - loss: 0.6317 - accuracy: 0.6082 - val_loss: 0.6840 - val_accuracy: 0.6328
Epoch 3/10
57/57 [==============================] - 5s 85ms/step - loss: 0.6368 - accuracy: 0.6279 - val_loss: 0.5637 - val_accuracy: 0.7132
Epoch 4/10
57/57 [==============================] - 5s 83ms/step - loss: 0.5208 - accuracy: 0.7386 - val_loss: 0.5387 - val_accuracy: 0.7223
Epoch 5/10
57/57 [==============================] - 5s 84ms/step - loss: 0.4922 - accuracy: 0.7654 - val_loss: 0.4920 - val_accuracy: 0.7602
Epoch 6/10
57/57 [==============================] - 5s 83ms/step - loss: 0.4365 - accuracy: 0.7887 - val_loss: 0.4430 - val_accuracy: 0.7830
Epoch 7/10
57/57 [==============================] - 5s 84ms/step - loss: 0.4646 - accuracy: 0.7720 - val_loss: 0.4609 - val_accuracy: 0.7693
Epoch 8/10
57/57 [==============================] - 5s 83ms/step - loss: 0.4447 - accuracy: 0.7760 - val_loss: 0.4891 - val_accuracy: 0.7587
Epoch 9/10
57/57 [==============================] - 5s 84ms/step - loss: 0.4141 - accuracy: 0.8008 - val_loss: 0.4231 - val_accuracy: 0.7921
Epoch 10/10
57/57 [==============================] - 5s 83ms/step - loss: 0.4098 - accuracy: 0.8054 - val_loss: 0.4053 - val_accuracy: 0.8027
In [20]:
model.evaluate(val_data)
19/19 [==============================] - 1s 35ms/step - loss: 0.4053 - accuracy: 0.8027
Out[20]:
[0.4052870571613312, 0.8027313947677612]
In [21]:
model.evaluate(test_data)
19/19 [==============================] - 1s 43ms/step - loss: 0.3915 - accuracy: 0.8212
Out[21]:
[0.39148470759391785, 0.821212112903595]

Model Saving

In [22]:
model.save("cnn_model_skin1.h5")

Graph Plots

In [23]:
plt.plot(history.history['accuracy'])
plt.title('Train model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.show()
In [24]:
plt.plot(history.history['loss'])
plt.title('Train Model loss')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.show()
In [25]:
plt.plot(history.history['val_accuracy'])
plt.title(' Val model Accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.show()
In [26]:
plt.plot(history.history['val_loss'])
plt.title(' Val Model Loss')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.show()
In [27]:
loss_train = history.history['loss']
loss_val = history.history['val_loss']
plt.plot(loss_train, 'g', label='Training loss')
plt.plot(loss_val, 'b', label='validation loss')
plt.title('Training and Validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
In [28]:
accuracy_train = history.history['accuracy']
accuracy_val = history.history['val_accuracy']
plt.plot(accuracy_train, 'g', label='Training accuracy')
plt.plot(accuracy_val, 'b', label='Validation accuracy')
plt.title('Training and Validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
In [29]:
from tensorflow.keras.models import load_model       
prediction=tf.keras.models.load_model("cnn_model_skin1.h5")

Prediction

In [30]:
import glob
import cv2


    
In [31]:
path = glob.glob("dummy/*.jpg")
print(path)
['dummy/30.jpg', 'dummy/84.jpg', 'dummy/37.jpg', 'dummy/95.jpg', 'dummy/5.jpg']
In [32]:
list=[]
In [33]:
for file in path:
    photo=cv2.imread(file)
    list.append(photo)
In [34]:
from tensorflow.keras.preprocessing import image
In [35]:
dir_path="dummy/"

for i in os.listdir(dir_path):
    img=image.load_img(dir_path+'//'+ i)
    plt.imshow(img)
    plt.show()
    
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    p=np.argmax(prediction.predict(x))
    if p==0:
        print("---------------Benign---------------\n\n\n")
    elif p==1:
        print("--------------Malignant-------------\n\n\n")

    
--------------Malignant-------------



---------------Benign---------------



---------------Benign---------------



---------------Benign---------------



--------------Malignant-------------



In [36]:
class_names={0:"Benign", 1:"Malignant"}
In [37]:
for images, labels in test_data.take(1):
    for i in range(6):
        print("True_class:",val_data.class_names[labels[i]])
        x = image.img_to_array(images[i])
        x = np.expand_dims(x, axis=0)
        p=np.argmax(model.predict(x))
        if p==0:
            print("Predicted Image: Benign")
        else:
            print("Predicted Image: Malignant")
        
        print("Predicted class:",p)
        print(" ")
True_class: Malignant
Predicted Image: Malignant
Predicted class: 1
 
True_class: Malignant
Predicted Image: Malignant
Predicted class: 1
 
True_class: Benign
Predicted Image: Benign
Predicted class: 0
 
True_class: Malignant
Predicted Image: Malignant
Predicted class: 1
 
True_class: Benign
Predicted Image: Benign
Predicted class: 0
 
True_class: Malignant
Predicted Image: Malignant
Predicted class: 1
 

DeepCC

In [38]:
!deepCC "cnn_model_skin1.h5"
[INFO]
Reading [keras model] 'cnn_model_skin1.h5'
[SUCCESS]
Saved 'cnn_model_skin1_deepC/cnn_model_skin1.onnx'
[INFO]
Reading [onnx model] 'cnn_model_skin1_deepC/cnn_model_skin1.onnx'
[INFO]
Model info:
  ir_vesion : 5
  doc       : 
[WARNING]
[ONNX]: terminal (input/output) conv2d_input's shape is less than 1. Changing it to 1.
[WARNING]
[ONNX]: terminal (input/output) dense_3's shape is less than 1. Changing it to 1.
WARN (GRAPH): found operator node with the same name (dense_3) as io node.
[INFO]
Running DNNC graph sanity check ...
[SUCCESS]
Passed sanity check.
[INFO]
Writing C++ file 'cnn_model_skin1_deepC/cnn_model_skin1.cpp'
[INFO]
deepSea model files are ready in 'cnn_model_skin1_deepC/' 
[RUNNING COMMAND]
g++ -std=c++11 -O3 -fno-rtti -fno-exceptions -I. -I/opt/tljh/user/lib/python3.7/site-packages/deepC-0.13-py3.7-linux-x86_64.egg/deepC/include -isystem /opt/tljh/user/lib/python3.7/site-packages/deepC-0.13-py3.7-linux-x86_64.egg/deepC/packages/eigen-eigen-323c052e1731 "cnn_model_skin1_deepC/cnn_model_skin1.cpp" -D_AITS_MAIN -o "cnn_model_skin1_deepC/cnn_model_skin1.exe"
[RUNNING COMMAND]
size "cnn_model_skin1_deepC/cnn_model_skin1.exe"
   text	   data	    bss	    dec	    hex	filename
 387429	   3784	    760	 391973	  5fb25	cnn_model_skin1_deepC/cnn_model_skin1.exe
[SUCCESS]
Saved model as executable "cnn_model_skin1_deepC/cnn_model_skin1.exe"