{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "c6c2112d", "metadata": {}, "outputs": [], "source": [ "import cv2\n", "import os\n", "\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "id": "677fd6f1", "metadata": {}, "outputs": [], "source": [ "labels=['Cancer', 'Non Cancer']\n", "img_path='Skin Data/'" ] }, { "cell_type": "code", "execution_count": 3, "id": "1ae9f20f", "metadata": {}, "outputs": [], "source": [ "img_list=[]\n", "label_list=[]\n", "\n", "for label in labels:\n", " for img_file in os.listdir(img_path+label):\n", " img_list.append(img_path+label+'/'+img_file)\n", " label_list.append(label)" ] }, { "cell_type": "code", "execution_count": 4, "id": "6736fc5f", "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame({'img': img_list, 'label': label_list})" ] }, { "cell_type": "code", "execution_count": 5, "id": "bb9a0009", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
imglabel
130Skin Data/Non Cancer/614.JPGNon Cancer
73Skin Data/Cancer/2301-1.JPGCancer
202Skin Data/Non Cancer/1111.JPGNon Cancer
211Skin Data/Non Cancer/1248-1.JPGNon Cancer
199Skin Data/Non Cancer/1065.jpgNon Cancer
\n", "
" ], "text/plain": [ " img label\n", "130 Skin Data/Non Cancer/614.JPG Non Cancer\n", "73 Skin Data/Cancer/2301-1.JPG Cancer\n", "202 Skin Data/Non Cancer/1111.JPG Non Cancer\n", "211 Skin Data/Non Cancer/1248-1.JPG Non Cancer\n", "199 Skin Data/Non Cancer/1065.jpg Non Cancer" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sample(5)" ] }, { "cell_type": "code", "execution_count": 6, "id": "54440c37", "metadata": {}, "outputs": [], "source": [ "d={'Non Cancer': 0, 'Cancer': 1}\n", "df['encode_label']=df['label'].map(d)" ] }, { "cell_type": "code", "execution_count": 7, "id": "53cd4b47", "metadata": {}, "outputs": [], "source": [ "x = []\n", "\n", "for img in df['img']:\n", " img = cv2.imread(str(img))\n", " img = cv2.resize(img, (170, 170))\n", " img = img / 255.0 #normalize\n", " x.append(img)" ] }, { "cell_type": "code", "execution_count": 8, "id": "d81879b5", "metadata": {}, "outputs": [], "source": [ "x = np.array(x)" ] }, { "cell_type": "code", "execution_count": 9, "id": "6578ffef", "metadata": {}, "outputs": [], "source": [ "y=df['encode_label']" ] }, { "cell_type": "code", "execution_count": 10, "id": "0f9856e8", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2024-05-15 10:21:21.775290: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", "To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n" ] } ], "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "from keras.models import Sequential\n", "from keras.layers import Conv2D, Dense, Flatten, Input, MaxPooling2D, Dropout, BatchNormalization, Reshape" ] }, { "cell_type": "code", "execution_count": 11, "id": "6eefab7a", "metadata": {}, "outputs": [], "source": [ "x_train,x_test,y_train,y_test=train_test_split(x,y, test_size=.20, random_state=42)" ] }, { "cell_type": "code", "execution_count": 12, "id": "281f7cae", "metadata": {}, "outputs": [], "source": [ "# CNN = Convolutional Neural Networks" ] }, { "cell_type": "code", "execution_count": 23, "id": "4e283b50", "metadata": {}, "outputs": [], "source": [ "model=Sequential()\n", "model.add(Input(shape=(170,170,3)))\n", "model.add(Conv2D(32,kernel_size=(3,3),activation='relu'))\n", "model.add(MaxPooling2D(pool_size=(2,2)))\n", "model.add(Conv2D(64,kernel_size=(3,3),activation='relu'))\n", "model.add(MaxPooling2D(pool_size=(2,2)))\n", "model.add(Flatten())\n", "model.add(Dense(128))\n", "model.add(Dense(2, activation='softmax')) # 10 fakli cevap classification 0-9 a kadar olan rakamlar\n", "\n", "# Compile the model\n", "model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])" ] }, { "cell_type": "code", "execution_count": 24, "id": "fcc1a740", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/15\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m7s\u001b[0m 660ms/step - accuracy: 0.5291 - loss: 9.7854 - val_accuracy: 0.7414 - val_loss: 2.5156\n", "Epoch 2/15\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 610ms/step - accuracy: 0.6474 - loss: 2.9485 - val_accuracy: 0.2586 - val_loss: 0.7912\n", "Epoch 3/15\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 623ms/step - accuracy: 0.6237 - loss: 0.6547 - val_accuracy: 0.7586 - val_loss: 0.5047\n", "Epoch 4/15\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 669ms/step - accuracy: 0.7573 - loss: 0.5762 - val_accuracy: 0.7931 - val_loss: 0.4346\n", "Epoch 5/15\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 650ms/step - accuracy: 0.7664 - loss: 0.4830 - val_accuracy: 0.7414 - val_loss: 0.6113\n", "Epoch 6/15\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 619ms/step - accuracy: 0.7919 - loss: 0.4656 - val_accuracy: 0.8448 - val_loss: 0.3715\n", "Epoch 7/15\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 643ms/step - accuracy: 0.8623 - loss: 0.3305 - val_accuracy: 0.8276 - val_loss: 0.4111\n", "Epoch 8/15\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 617ms/step - accuracy: 0.8871 - loss: 0.3118 - val_accuracy: 0.8103 - val_loss: 0.3918\n", "Epoch 9/15\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 612ms/step - accuracy: 0.8852 - loss: 0.2627 - val_accuracy: 0.7241 - val_loss: 0.7321\n", "Epoch 10/15\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 624ms/step - accuracy: 0.8766 - loss: 0.2683 - val_accuracy: 0.7931 - val_loss: 0.4346\n", "Epoch 11/15\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 632ms/step - accuracy: 0.9435 - loss: 0.1946 - val_accuracy: 0.8103 - val_loss: 0.3652\n", "Epoch 12/15\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 622ms/step - accuracy: 0.9718 - loss: 0.1293 - val_accuracy: 0.8621 - val_loss: 0.4700\n", "Epoch 13/15\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 613ms/step - accuracy: 0.9279 - loss: 0.1620 - val_accuracy: 0.8276 - val_loss: 0.4200\n", "Epoch 14/15\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 639ms/step - accuracy: 0.9648 - loss: 0.0937 - val_accuracy: 0.7586 - val_loss: 0.6257\n", "Epoch 15/15\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m5s\u001b[0m 635ms/step - accuracy: 0.9669 - loss: 0.1067 - val_accuracy: 0.8448 - val_loss: 0.3362\n" ] } ], "source": [ "# Train the model\n", "history=model.fit( x_train, y_train,validation_data=(x_test,y_test), epochs=15, verbose=1)\n" ] }, { "cell_type": "code", "execution_count": 20, "id": "8199ab93", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n" ] } ], "source": [ "model.save('cnn_model.h5')" ] }, { "cell_type": "code", "execution_count": null, "id": "ca51b883", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "b26379a9", "metadata": {}, "outputs": [], "source": [ "# VGGNET, ResNet50, Inceptionv3, Xception, MobileNetv2 Transfer Learning" ] }, { "cell_type": "code", "execution_count": 27, "id": "d3f206da", "metadata": {}, "outputs": [], "source": [ "from keras.models import Sequential\n", "from keras.layers import Conv2D, Dense, Flatten, Input, MaxPooling2D, Dropout, BatchNormalization, Reshape\n", "\n", "from tensorflow.keras.applications import VGG16, ResNet50\n", "from tensorflow.keras.preprocessing.image import ImageDataGenerator" ] }, { "cell_type": "code", "execution_count": 30, "id": "fccd2086", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Found 232 images belonging to 2 classes.\n", "Found 56 images belonging to 2 classes.\n", "Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/vgg16/vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5\n", "\u001b[1m58889256/58889256\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 0us/step\n", "Epoch 1/10\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/opt/anaconda3/lib/python3.11/site-packages/keras/src/trainers/data_adapters/py_dataset_adapter.py:121: UserWarning: Your `PyDataset` class should call `super().__init__(**kwargs)` in its constructor. `**kwargs` can include `workers`, `use_multiprocessing`, `max_queue_size`. Do not pass these arguments to `fit()`, as they will be ignored.\n", " self._warn_if_super_not_called()\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m43s\u001b[0m 5s/step - accuracy: 0.5209 - loss: 5.4695 - val_accuracy: 0.7143 - val_loss: 1.6115\n", "Epoch 2/10\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m41s\u001b[0m 5s/step - accuracy: 0.6928 - loss: 2.1946 - val_accuracy: 0.3036 - val_loss: 1.9652\n", "Epoch 3/10\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m38s\u001b[0m 5s/step - accuracy: 0.5871 - loss: 1.1498 - val_accuracy: 0.7679 - val_loss: 0.5415\n", "Epoch 4/10\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m38s\u001b[0m 5s/step - accuracy: 0.8169 - loss: 0.4627 - val_accuracy: 0.7679 - val_loss: 0.5914\n", "Epoch 5/10\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m37s\u001b[0m 5s/step - accuracy: 0.8383 - loss: 0.3790 - val_accuracy: 0.7857 - val_loss: 0.4250\n", "Epoch 6/10\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m37s\u001b[0m 5s/step - accuracy: 0.9351 - loss: 0.1650 - val_accuracy: 0.8393 - val_loss: 0.3612\n", "Epoch 7/10\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m34s\u001b[0m 4s/step - accuracy: 0.9531 - loss: 0.1619 - val_accuracy: 0.8393 - val_loss: 0.3391\n", "Epoch 8/10\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m33s\u001b[0m 4s/step - accuracy: 0.9621 - loss: 0.1155 - val_accuracy: 0.8393 - val_loss: 0.3643\n", "Epoch 9/10\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m36s\u001b[0m 5s/step - accuracy: 0.9667 - loss: 0.1090 - val_accuracy: 0.8214 - val_loss: 0.3249\n", "Epoch 10/10\n", "\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m36s\u001b[0m 4s/step - accuracy: 0.9823 - loss: 0.0831 - val_accuracy: 0.8214 - val_loss: 0.4653\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_dir='Skin Data'\n", "img_width,img_heigth=224,224\n", "\n", "train_datagen=ImageDataGenerator(rescale=1/255, validation_split=.20)\n", "train_datagenerator=train_datagen.flow_from_directory(directory=data_dir,target_size=(img_width,img_heigth),\n", " class_mode='binary', subset='training')\n", "\n", " \n", "test_datagen=ImageDataGenerator(rescale=1/255)\n", "test_datagenerator=train_datagen.flow_from_directory(directory=data_dir,target_size=(img_width,img_heigth),\n", " class_mode='binary', subset='validation')\n", "\n", " \n", "base_model=VGG16(weights='imagenet', input_shape=(img_width,img_heigth,3),include_top=False)\n", "\n", "model=Sequential()\n", "\n", "model.add(base_model)\n", "for layer in base_model.layers:\n", " layer.trainable=False\n", "\n", "model.add(Flatten())\n", "model.add(Dense(1024,activation='relu'))\n", "model.add(Dense(1,activation='sigmoid'))\n", "\n", "model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])\n", "\n", "model.fit(train_datagenerator,epochs=10,validation_data=test_datagenerator)" ] }, { "cell_type": "code", "execution_count": 31, "id": "ffef776f", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Model: \"sequential_5\"\n",
       "
\n" ], "text/plain": [ "\u001b[1mModel: \"sequential_5\"\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
       "┃ Layer (type)                     Output Shape                  Param # ┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
       "│ vgg16 (Functional)              │ (None, 7, 7, 512)      │    14,714,688 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ flatten_5 (Flatten)             │ (None, 25088)          │             0 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ dense_10 (Dense)                │ (None, 1024)           │    25,691,136 │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ dense_11 (Dense)                │ (None, 1)              │         1,025 │\n",
       "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
       "
\n" ], "text/plain": [ "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n", "┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n", "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n", "│ vgg16 (\u001b[38;5;33mFunctional\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m7\u001b[0m, \u001b[38;5;34m7\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m14,714,688\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ flatten_5 (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m25088\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ dense_10 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1024\u001b[0m) │ \u001b[38;5;34m25,691,136\u001b[0m │\n", "├─────────────────────────────────┼────────────────────────┼───────────────┤\n", "│ dense_11 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m1,025\u001b[0m │\n", "└─────────────────────────────────┴────────────────────────┴───────────────┘\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Total params: 91,791,173 (350.16 MB)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m91,791,173\u001b[0m (350.16 MB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Trainable params: 25,692,161 (98.01 MB)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m25,692,161\u001b[0m (98.01 MB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Non-trainable params: 14,714,688 (56.13 MB)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m14,714,688\u001b[0m (56.13 MB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
 Optimizer params: 51,384,324 (196.02 MB)\n",
       "
\n" ], "text/plain": [ "\u001b[1m Optimizer params: \u001b[0m\u001b[38;5;34m51,384,324\u001b[0m (196.02 MB)\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model.summary()" ] }, { "cell_type": "code", "execution_count": null, "id": "4b483c57", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "eee6be78", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.7" } }, "nbformat": 4, "nbformat_minor": 5 }