{ "cells": [ { "cell_type": "code", "execution_count": 13, "id": "602ab916", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import glob\n", "from os import walk" ] }, { "cell_type": "code", "execution_count": 2, "id": "a7492299", "metadata": {}, "outputs": [], "source": [ "TRAIN_DATA_DIR = \"./data/cropped_images\"\n", "TRAIN_LABELS_PATH = \"./data/labels.txt\"" ] }, { "cell_type": "code", "execution_count": 29, "id": "5239a585", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
label
0without_mask
1with_mask
2without_mask
3with_mask
4with_mask
......
4067with_mask
4068with_mask
4069mask_weared_incorrect
4070with_mask
4071with_mask
\n", "

4072 rows × 1 columns

\n", "
" ], "text/plain": [ " label\n", "0 without_mask\n", "1 with_mask\n", "2 without_mask\n", "3 with_mask\n", "4 with_mask\n", "... ...\n", "4067 with_mask\n", "4068 with_mask\n", "4069 mask_weared_incorrect\n", "4070 with_mask\n", "4071 with_mask\n", "\n", "[4072 rows x 1 columns]" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "labels = pd.read_csv(TRAIN_LABELS_PATH, sep=\" \", header=None)[0].to_numpy()\n", "d = {'label':labels}\n", "labels = pd.DataFrame(d)\n", "labels" ] }, { "cell_type": "code", "execution_count": 34, "id": "6672b327", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "label \n", "with_mask 3232\n", "without_mask 717\n", "mask_weared_incorrect 123\n", "dtype: int64" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "labels.value_counts()" ] }, { "cell_type": "code", "execution_count": 10, "id": "96dd03bc", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['mask_weared_incorrect', 'with_mask', 'without_mask'], dtype=object)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "classes = np.unique(labels)\n", "classes" ] }, { "cell_type": "code", "execution_count": 28, "id": "9bbd7813", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
file_name
00.png
11.png
22.png
33.png
44.png
......
40674067.png
40684068.png
40694069.png
40704070.png
40714071.png
\n", "

4072 rows × 1 columns

\n", "
" ], "text/plain": [ " file_name\n", "0 0.png\n", "1 1.png\n", "2 2.png\n", "3 3.png\n", "4 4.png\n", "... ...\n", "4067 4067.png\n", "4068 4068.png\n", "4069 4069.png\n", "4070 4070.png\n", "4071 4071.png\n", "\n", "[4072 rows x 1 columns]" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "filenames = []\n", "for i in range(len(labels)):\n", " filenames.append(str(i) + '.png')\n", "d = {'file_name':filenames}\n", "filenames = pd.DataFrame(d)" ] }, { "cell_type": "code", "execution_count": 30, "id": "e84e5c50", "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split\n", "X_train,X_test,Y_train,Y_test=train_test_split(filenames,labels,test_size=0.20,stratify=labels,random_state=42)" ] }, { "cell_type": "code", "execution_count": 32, "id": "2e9f5520", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(3257, 1) (815, 1)\n" ] } ], "source": [ "print(X_train.shape,X_test.shape)" ] }, { "cell_type": "code", "execution_count": 33, "id": "a20e7180", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "label \n", "with_mask 2585\n", "without_mask 574\n", "mask_weared_incorrect 98\n", "dtype: int64" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Y_train.value_counts()" ] }, { "cell_type": "code", "execution_count": 35, "id": "634ae5c2", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\Piotrek\\AppData\\Local\\Temp/ipykernel_1696/91195937.py:1: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " X_train['label']=Y_train\n", "C:\\Users\\Piotrek\\AppData\\Local\\Temp/ipykernel_1696/91195937.py:2: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " X_test['label']=Y_test\n" ] } ], "source": [ "X_train['label']=Y_train\n", "X_test['label']=Y_test" ] }, { "cell_type": "code", "execution_count": 39, "id": "5ce58a3e", "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", " \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", "
file_namelabel
16601660.pngwith_mask
29762976.pngwith_mask
920920.pngwith_mask
39843984.pngwith_mask
38673867.pngwith_mask
.........
530530.pngwith_mask
13441344.pngwith_mask
17561756.pngwith_mask
11961196.pngwithout_mask
364364.pngwith_mask
\n", "

815 rows × 2 columns

\n", "
" ], "text/plain": [ " file_name label\n", "1660 1660.png with_mask\n", "2976 2976.png with_mask\n", "920 920.png with_mask\n", "3984 3984.png with_mask\n", "3867 3867.png with_mask\n", "... ... ...\n", "530 530.png with_mask\n", "1344 1344.png with_mask\n", "1756 1756.png with_mask\n", "1196 1196.png without_mask\n", "364 364.png with_mask\n", "\n", "[815 rows x 2 columns]" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_test" ] }, { "cell_type": "code", "execution_count": 164, "id": "54aa844d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Found 3257 validated image filenames belonging to 3 classes.\n" ] } ], "source": [ "from keras_preprocessing.image import ImageDataGenerator\n", "\n", "image_target_size = (int(128), int(128))\n", "\n", "train_image_generator = ImageDataGenerator(rescale = 1. / 255.)\n", "\n", "train_generator = train_image_generator.flow_from_dataframe(\n", " dataframe = X_train,\n", " directory = TRAIN_DATA_DIR,\n", " x_col = 'file_name',\n", " y_col = 'label',\n", " subset = 'training',\n", " batch_size = 32,\n", " seed = 42,\n", " shuffle = True,\n", " class_mode = 'categorical',\n", " target_size = image_target_size\n", ")" ] }, { "cell_type": "code", "execution_count": 165, "id": "4c8f1393", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'mask_weared_incorrect': 0, 'with_mask': 1, 'without_mask': 2}" ] }, "execution_count": 165, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class_ind=train_generator.class_indices\n", "class_ind" ] }, { "cell_type": "code", "execution_count": 166, "id": "40429c13", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Found 815 validated image filenames belonging to 3 classes.\n" ] } ], "source": [ "test_image_generator = ImageDataGenerator(rescale = 1. / 255.)\n", "\n", "test_generator = train_image_generator.flow_from_dataframe(\n", " dataframe = X_test,\n", " directory = TRAIN_DATA_DIR,\n", " x_col = 'file_name',\n", " y_col = 'label',\n", " batch_size = 32,\n", " seed = 42,\n", " shuffle = True,\n", " class_mode = 'categorical',\n", " target_size = image_target_size\n", ")" ] }, { "cell_type": "code", "execution_count": 167, "id": "f3dc7458", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'mask_weared_incorrect': 0, 'with_mask': 1, 'without_mask': 2}" ] }, "execution_count": 167, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_generator.class_indices" ] }, { "cell_type": "code", "execution_count": 145, "id": "e91a0899", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:`input_shape` is undefined or non-square, or `rows` is not in [96, 128, 160, 192, 224]. Weights for input shape (224, 224) will be loaded as the default.\n" ] } ], "source": [ "from tensorflow.keras.applications import MobileNetV2\n", "from tensorflow.keras.layers import Input\n", "input_tensor = Input(shape=(128, 128, 3))\n", "mobileNet = MobileNetV2(weights=\"imagenet\", include_top=False,input_tensor=input_tensor)" ] }, { "cell_type": "code", "execution_count": 146, "id": "9efeef8c", "metadata": {}, "outputs": [], "source": [ "from tensorflow.keras.layers import AveragePooling2D" ] }, { "cell_type": "code", "execution_count": 150, "id": "59fb5432", "metadata": {}, "outputs": [], "source": [ "import tensorflow as tf\n", "from tensorflow import keras\n", "from tensorflow.keras import layers\n", "\n", "x = mobileNet.output\n", "x = AveragePooling2D(pool_size=(4, 4))(x)\n", "x = layers.Flatten()(x)\n", "x = layers.Dense(256, activation=\"relu\")(x)\n", "x = layers.Dropout(0.5)(x)\n", "x = layers.Dense(64, activation=\"relu\")(x)\n", "outputs = layers.Dense(3,activation='softmax')(x)\n", "model = keras.Model(inputs=mobileNet.input, outputs=outputs)" ] }, { "cell_type": "code", "execution_count": 151, "id": "4fb27b1f", "metadata": {}, "outputs": [], "source": [ "for layer in mobileNet.layers:\n", " layer.trainable = False" ] }, { "cell_type": "code", "execution_count": 152, "id": "d06c0841", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/15\n", "102/102 [==============================] - 31s 277ms/step - loss: 0.5791 - accuracy: 0.8001 - val_loss: 0.4123 - val_accuracy: 0.8466\n", "Epoch 2/15\n", "102/102 [==============================] - 27s 270ms/step - loss: 0.4334 - accuracy: 0.8342 - val_loss: 0.3737 - val_accuracy: 0.8466\n", "Epoch 3/15\n", "102/102 [==============================] - 28s 271ms/step - loss: 0.3859 - accuracy: 0.8505 - val_loss: 0.3362 - val_accuracy: 0.8847\n", "Epoch 4/15\n", "102/102 [==============================] - 28s 270ms/step - loss: 0.3585 - accuracy: 0.8591 - val_loss: 0.3520 - val_accuracy: 0.8540\n", "Epoch 5/15\n", "102/102 [==============================] - 28s 273ms/step - loss: 0.3224 - accuracy: 0.8806 - val_loss: 0.3561 - val_accuracy: 0.8503\n", "Epoch 6/15\n", "102/102 [==============================] - 27s 270ms/step - loss: 0.3080 - accuracy: 0.8766 - val_loss: 0.3010 - val_accuracy: 0.8798\n", "Epoch 7/15\n", "102/102 [==============================] - 30s 291ms/step - loss: 0.2779 - accuracy: 0.8870 - val_loss: 0.2870 - val_accuracy: 0.8982\n", "Epoch 8/15\n", "102/102 [==============================] - 32s 319ms/step - loss: 0.2697 - accuracy: 0.8971 - val_loss: 0.3190 - val_accuracy: 0.8847\n", "Epoch 9/15\n", "102/102 [==============================] - 32s 312ms/step - loss: 0.2526 - accuracy: 0.9011 - val_loss: 0.2778 - val_accuracy: 0.8945\n", "Epoch 10/15\n", "102/102 [==============================] - 31s 304ms/step - loss: 0.2416 - accuracy: 0.9073 - val_loss: 0.2891 - val_accuracy: 0.8883\n", "Epoch 11/15\n", "102/102 [==============================] - 31s 303ms/step - loss: 0.2325 - accuracy: 0.9100 - val_loss: 0.2945 - val_accuracy: 0.8933\n", "Epoch 12/15\n", "102/102 [==============================] - 31s 302ms/step - loss: 0.2156 - accuracy: 0.9128 - val_loss: 0.2748 - val_accuracy: 0.9067\n", "Epoch 13/15\n", "102/102 [==============================] - 33s 328ms/step - loss: 0.2105 - accuracy: 0.9211 - val_loss: 0.3212 - val_accuracy: 0.8994\n", "Epoch 14/15\n", "102/102 [==============================] - 32s 311ms/step - loss: 0.1986 - accuracy: 0.9171 - val_loss: 0.2914 - val_accuracy: 0.9043\n", "Epoch 15/15\n", "102/102 [==============================] - 32s 311ms/step - loss: 0.2002 - accuracy: 0.9254 - val_loss: 0.2541 - val_accuracy: 0.9117\n" ] } ], "source": [ "model.compile(loss = 'categorical_crossentropy',\n", " optimizer = keras.optimizers.Adam(lr=0.001),\n", " metrics = ['accuracy'])\n", "\n", "history_1 = model.fit(train_generator, epochs = 15, steps_per_epoch = len(train_generator),\n", " validation_data = test_generator, validation_steps = len(test_generator))" ] }, { "cell_type": "code", "execution_count": 162, "id": "0225e0bd", "metadata": {}, "outputs": [], "source": [ "model.save('face_mask_detection2.h5')" ] }, { "cell_type": "code", "execution_count": 163, "id": "a2216268", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model: \"model_8\"\n", "__________________________________________________________________________________________________\n", " Layer (type) Output Shape Param # Connected to \n", "==================================================================================================\n", " input_17 (InputLayer) [(None, 128, 128, 3 0 [] \n", " )] \n", " \n", " Conv1 (Conv2D) (None, 64, 64, 32) 864 ['input_17[0][0]'] \n", " \n", " bn_Conv1 (BatchNormalization) (None, 64, 64, 32) 128 ['Conv1[0][0]'] \n", " \n", " Conv1_relu (ReLU) (None, 64, 64, 32) 0 ['bn_Conv1[0][0]'] \n", " \n", " expanded_conv_depthwise (Depth (None, 64, 64, 32) 288 ['Conv1_relu[0][0]'] \n", " wiseConv2D) \n", " \n", " expanded_conv_depthwise_BN (Ba (None, 64, 64, 32) 128 ['expanded_conv_depthwise[0][0]']\n", " tchNormalization) \n", " \n", " expanded_conv_depthwise_relu ( (None, 64, 64, 32) 0 ['expanded_conv_depthwise_BN[0][0\n", " ReLU) ]'] \n", " \n", " expanded_conv_project (Conv2D) (None, 64, 64, 16) 512 ['expanded_conv_depthwise_relu[0]\n", " [0]'] \n", " \n", " expanded_conv_project_BN (Batc (None, 64, 64, 16) 64 ['expanded_conv_project[0][0]'] \n", " hNormalization) \n", " \n", " block_1_expand (Conv2D) (None, 64, 64, 96) 1536 ['expanded_conv_project_BN[0][0]'\n", " ] \n", " \n", " block_1_expand_BN (BatchNormal (None, 64, 64, 96) 384 ['block_1_expand[0][0]'] \n", " ization) \n", " \n", " block_1_expand_relu (ReLU) (None, 64, 64, 96) 0 ['block_1_expand_BN[0][0]'] \n", " \n", " block_1_pad (ZeroPadding2D) (None, 65, 65, 96) 0 ['block_1_expand_relu[0][0]'] \n", " \n", " block_1_depthwise (DepthwiseCo (None, 32, 32, 96) 864 ['block_1_pad[0][0]'] \n", " nv2D) \n", " \n", " block_1_depthwise_BN (BatchNor (None, 32, 32, 96) 384 ['block_1_depthwise[0][0]'] \n", " malization) \n", " \n", " block_1_depthwise_relu (ReLU) (None, 32, 32, 96) 0 ['block_1_depthwise_BN[0][0]'] \n", " \n", " block_1_project (Conv2D) (None, 32, 32, 24) 2304 ['block_1_depthwise_relu[0][0]'] \n", " \n", " block_1_project_BN (BatchNorma (None, 32, 32, 24) 96 ['block_1_project[0][0]'] \n", " lization) \n", " \n", " block_2_expand (Conv2D) (None, 32, 32, 144) 3456 ['block_1_project_BN[0][0]'] \n", " \n", " block_2_expand_BN (BatchNormal (None, 32, 32, 144) 576 ['block_2_expand[0][0]'] \n", " ization) \n", " \n", " block_2_expand_relu (ReLU) (None, 32, 32, 144) 0 ['block_2_expand_BN[0][0]'] \n", " \n", " block_2_depthwise (DepthwiseCo (None, 32, 32, 144) 1296 ['block_2_expand_relu[0][0]'] \n", " nv2D) \n", " \n", " block_2_depthwise_BN (BatchNor (None, 32, 32, 144) 576 ['block_2_depthwise[0][0]'] \n", " malization) \n", " \n", " block_2_depthwise_relu (ReLU) (None, 32, 32, 144) 0 ['block_2_depthwise_BN[0][0]'] \n", " \n", " block_2_project (Conv2D) (None, 32, 32, 24) 3456 ['block_2_depthwise_relu[0][0]'] \n", " \n", " block_2_project_BN (BatchNorma (None, 32, 32, 24) 96 ['block_2_project[0][0]'] \n", " lization) \n", " \n", " block_2_add (Add) (None, 32, 32, 24) 0 ['block_1_project_BN[0][0]', \n", " 'block_2_project_BN[0][0]'] \n", " \n", " block_3_expand (Conv2D) (None, 32, 32, 144) 3456 ['block_2_add[0][0]'] \n", " \n", " block_3_expand_BN (BatchNormal (None, 32, 32, 144) 576 ['block_3_expand[0][0]'] \n", " ization) \n", " \n", " block_3_expand_relu (ReLU) (None, 32, 32, 144) 0 ['block_3_expand_BN[0][0]'] \n", " \n", " block_3_pad (ZeroPadding2D) (None, 33, 33, 144) 0 ['block_3_expand_relu[0][0]'] \n", " \n", " block_3_depthwise (DepthwiseCo (None, 16, 16, 144) 1296 ['block_3_pad[0][0]'] \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " nv2D) \n", " \n", " block_3_depthwise_BN (BatchNor (None, 16, 16, 144) 576 ['block_3_depthwise[0][0]'] \n", " malization) \n", " \n", " block_3_depthwise_relu (ReLU) (None, 16, 16, 144) 0 ['block_3_depthwise_BN[0][0]'] \n", " \n", " block_3_project (Conv2D) (None, 16, 16, 32) 4608 ['block_3_depthwise_relu[0][0]'] \n", " \n", " block_3_project_BN (BatchNorma (None, 16, 16, 32) 128 ['block_3_project[0][0]'] \n", " lization) \n", " \n", " block_4_expand (Conv2D) (None, 16, 16, 192) 6144 ['block_3_project_BN[0][0]'] \n", " \n", " block_4_expand_BN (BatchNormal (None, 16, 16, 192) 768 ['block_4_expand[0][0]'] \n", " ization) \n", " \n", " block_4_expand_relu (ReLU) (None, 16, 16, 192) 0 ['block_4_expand_BN[0][0]'] \n", " \n", " block_4_depthwise (DepthwiseCo (None, 16, 16, 192) 1728 ['block_4_expand_relu[0][0]'] \n", " nv2D) \n", " \n", " block_4_depthwise_BN (BatchNor (None, 16, 16, 192) 768 ['block_4_depthwise[0][0]'] \n", " malization) \n", " \n", " block_4_depthwise_relu (ReLU) (None, 16, 16, 192) 0 ['block_4_depthwise_BN[0][0]'] \n", " \n", " block_4_project (Conv2D) (None, 16, 16, 32) 6144 ['block_4_depthwise_relu[0][0]'] \n", " \n", " block_4_project_BN (BatchNorma (None, 16, 16, 32) 128 ['block_4_project[0][0]'] \n", " lization) \n", " \n", " block_4_add (Add) (None, 16, 16, 32) 0 ['block_3_project_BN[0][0]', \n", " 'block_4_project_BN[0][0]'] \n", " \n", " block_5_expand (Conv2D) (None, 16, 16, 192) 6144 ['block_4_add[0][0]'] \n", " \n", " block_5_expand_BN (BatchNormal (None, 16, 16, 192) 768 ['block_5_expand[0][0]'] \n", " ization) \n", " \n", " block_5_expand_relu (ReLU) (None, 16, 16, 192) 0 ['block_5_expand_BN[0][0]'] \n", " \n", " block_5_depthwise (DepthwiseCo (None, 16, 16, 192) 1728 ['block_5_expand_relu[0][0]'] \n", " nv2D) \n", " \n", " block_5_depthwise_BN (BatchNor (None, 16, 16, 192) 768 ['block_5_depthwise[0][0]'] \n", " malization) \n", " \n", " block_5_depthwise_relu (ReLU) (None, 16, 16, 192) 0 ['block_5_depthwise_BN[0][0]'] \n", " \n", " block_5_project (Conv2D) (None, 16, 16, 32) 6144 ['block_5_depthwise_relu[0][0]'] \n", " \n", " block_5_project_BN (BatchNorma (None, 16, 16, 32) 128 ['block_5_project[0][0]'] \n", " lization) \n", " \n", " block_5_add (Add) (None, 16, 16, 32) 0 ['block_4_add[0][0]', \n", " 'block_5_project_BN[0][0]'] \n", " \n", " block_6_expand (Conv2D) (None, 16, 16, 192) 6144 ['block_5_add[0][0]'] \n", " \n", " block_6_expand_BN (BatchNormal (None, 16, 16, 192) 768 ['block_6_expand[0][0]'] \n", " ization) \n", " \n", " block_6_expand_relu (ReLU) (None, 16, 16, 192) 0 ['block_6_expand_BN[0][0]'] \n", " \n", " block_6_pad (ZeroPadding2D) (None, 17, 17, 192) 0 ['block_6_expand_relu[0][0]'] \n", " \n", " block_6_depthwise (DepthwiseCo (None, 8, 8, 192) 1728 ['block_6_pad[0][0]'] \n", " nv2D) \n", " \n", " block_6_depthwise_BN (BatchNor (None, 8, 8, 192) 768 ['block_6_depthwise[0][0]'] \n", " malization) \n", " \n", " block_6_depthwise_relu (ReLU) (None, 8, 8, 192) 0 ['block_6_depthwise_BN[0][0]'] \n", " \n", " block_6_project (Conv2D) (None, 8, 8, 64) 12288 ['block_6_depthwise_relu[0][0]'] \n", " \n", " block_6_project_BN (BatchNorma (None, 8, 8, 64) 256 ['block_6_project[0][0]'] \n", " lization) \n", " \n", " block_7_expand (Conv2D) (None, 8, 8, 384) 24576 ['block_6_project_BN[0][0]'] \n", " \n", " block_7_expand_BN (BatchNormal (None, 8, 8, 384) 1536 ['block_7_expand[0][0]'] \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " ization) \n", " \n", " block_7_expand_relu (ReLU) (None, 8, 8, 384) 0 ['block_7_expand_BN[0][0]'] \n", " \n", " block_7_depthwise (DepthwiseCo (None, 8, 8, 384) 3456 ['block_7_expand_relu[0][0]'] \n", " nv2D) \n", " \n", " block_7_depthwise_BN (BatchNor (None, 8, 8, 384) 1536 ['block_7_depthwise[0][0]'] \n", " malization) \n", " \n", " block_7_depthwise_relu (ReLU) (None, 8, 8, 384) 0 ['block_7_depthwise_BN[0][0]'] \n", " \n", " block_7_project (Conv2D) (None, 8, 8, 64) 24576 ['block_7_depthwise_relu[0][0]'] \n", " \n", " block_7_project_BN (BatchNorma (None, 8, 8, 64) 256 ['block_7_project[0][0]'] \n", " lization) \n", " \n", " block_7_add (Add) (None, 8, 8, 64) 0 ['block_6_project_BN[0][0]', \n", " 'block_7_project_BN[0][0]'] \n", " \n", " block_8_expand (Conv2D) (None, 8, 8, 384) 24576 ['block_7_add[0][0]'] \n", " \n", " block_8_expand_BN (BatchNormal (None, 8, 8, 384) 1536 ['block_8_expand[0][0]'] \n", " ization) \n", " \n", " block_8_expand_relu (ReLU) (None, 8, 8, 384) 0 ['block_8_expand_BN[0][0]'] \n", " \n", " block_8_depthwise (DepthwiseCo (None, 8, 8, 384) 3456 ['block_8_expand_relu[0][0]'] \n", " nv2D) \n", " \n", " block_8_depthwise_BN (BatchNor (None, 8, 8, 384) 1536 ['block_8_depthwise[0][0]'] \n", " malization) \n", " \n", " block_8_depthwise_relu (ReLU) (None, 8, 8, 384) 0 ['block_8_depthwise_BN[0][0]'] \n", " \n", " block_8_project (Conv2D) (None, 8, 8, 64) 24576 ['block_8_depthwise_relu[0][0]'] \n", " \n", " block_8_project_BN (BatchNorma (None, 8, 8, 64) 256 ['block_8_project[0][0]'] \n", " lization) \n", " \n", " block_8_add (Add) (None, 8, 8, 64) 0 ['block_7_add[0][0]', \n", " 'block_8_project_BN[0][0]'] \n", " \n", " block_9_expand (Conv2D) (None, 8, 8, 384) 24576 ['block_8_add[0][0]'] \n", " \n", " block_9_expand_BN (BatchNormal (None, 8, 8, 384) 1536 ['block_9_expand[0][0]'] \n", " ization) \n", " \n", " block_9_expand_relu (ReLU) (None, 8, 8, 384) 0 ['block_9_expand_BN[0][0]'] \n", " \n", " block_9_depthwise (DepthwiseCo (None, 8, 8, 384) 3456 ['block_9_expand_relu[0][0]'] \n", " nv2D) \n", " \n", " block_9_depthwise_BN (BatchNor (None, 8, 8, 384) 1536 ['block_9_depthwise[0][0]'] \n", " malization) \n", " \n", " block_9_depthwise_relu (ReLU) (None, 8, 8, 384) 0 ['block_9_depthwise_BN[0][0]'] \n", " \n", " block_9_project (Conv2D) (None, 8, 8, 64) 24576 ['block_9_depthwise_relu[0][0]'] \n", " \n", " block_9_project_BN (BatchNorma (None, 8, 8, 64) 256 ['block_9_project[0][0]'] \n", " lization) \n", " \n", " block_9_add (Add) (None, 8, 8, 64) 0 ['block_8_add[0][0]', \n", " 'block_9_project_BN[0][0]'] \n", " \n", " block_10_expand (Conv2D) (None, 8, 8, 384) 24576 ['block_9_add[0][0]'] \n", " \n", " block_10_expand_BN (BatchNorma (None, 8, 8, 384) 1536 ['block_10_expand[0][0]'] \n", " lization) \n", " \n", " block_10_expand_relu (ReLU) (None, 8, 8, 384) 0 ['block_10_expand_BN[0][0]'] \n", " \n", " block_10_depthwise (DepthwiseC (None, 8, 8, 384) 3456 ['block_10_expand_relu[0][0]'] \n", " onv2D) \n", " \n", " block_10_depthwise_BN (BatchNo (None, 8, 8, 384) 1536 ['block_10_depthwise[0][0]'] \n", " rmalization) \n", " \n", " block_10_depthwise_relu (ReLU) (None, 8, 8, 384) 0 ['block_10_depthwise_BN[0][0]'] \n", " \n", " block_10_project (Conv2D) (None, 8, 8, 96) 36864 ['block_10_depthwise_relu[0][0]']\n", " \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " block_10_project_BN (BatchNorm (None, 8, 8, 96) 384 ['block_10_project[0][0]'] \n", " alization) \n", " \n", " block_11_expand (Conv2D) (None, 8, 8, 576) 55296 ['block_10_project_BN[0][0]'] \n", " \n", " block_11_expand_BN (BatchNorma (None, 8, 8, 576) 2304 ['block_11_expand[0][0]'] \n", " lization) \n", " \n", " block_11_expand_relu (ReLU) (None, 8, 8, 576) 0 ['block_11_expand_BN[0][0]'] \n", " \n", " block_11_depthwise (DepthwiseC (None, 8, 8, 576) 5184 ['block_11_expand_relu[0][0]'] \n", " onv2D) \n", " \n", " block_11_depthwise_BN (BatchNo (None, 8, 8, 576) 2304 ['block_11_depthwise[0][0]'] \n", " rmalization) \n", " \n", " block_11_depthwise_relu (ReLU) (None, 8, 8, 576) 0 ['block_11_depthwise_BN[0][0]'] \n", " \n", " block_11_project (Conv2D) (None, 8, 8, 96) 55296 ['block_11_depthwise_relu[0][0]']\n", " \n", " block_11_project_BN (BatchNorm (None, 8, 8, 96) 384 ['block_11_project[0][0]'] \n", " alization) \n", " \n", " block_11_add (Add) (None, 8, 8, 96) 0 ['block_10_project_BN[0][0]', \n", " 'block_11_project_BN[0][0]'] \n", " \n", " block_12_expand (Conv2D) (None, 8, 8, 576) 55296 ['block_11_add[0][0]'] \n", " \n", " block_12_expand_BN (BatchNorma (None, 8, 8, 576) 2304 ['block_12_expand[0][0]'] \n", " lization) \n", " \n", " block_12_expand_relu (ReLU) (None, 8, 8, 576) 0 ['block_12_expand_BN[0][0]'] \n", " \n", " block_12_depthwise (DepthwiseC (None, 8, 8, 576) 5184 ['block_12_expand_relu[0][0]'] \n", " onv2D) \n", " \n", " block_12_depthwise_BN (BatchNo (None, 8, 8, 576) 2304 ['block_12_depthwise[0][0]'] \n", " rmalization) \n", " \n", " block_12_depthwise_relu (ReLU) (None, 8, 8, 576) 0 ['block_12_depthwise_BN[0][0]'] \n", " \n", " block_12_project (Conv2D) (None, 8, 8, 96) 55296 ['block_12_depthwise_relu[0][0]']\n", " \n", " block_12_project_BN (BatchNorm (None, 8, 8, 96) 384 ['block_12_project[0][0]'] \n", " alization) \n", " \n", " block_12_add (Add) (None, 8, 8, 96) 0 ['block_11_add[0][0]', \n", " 'block_12_project_BN[0][0]'] \n", " \n", " block_13_expand (Conv2D) (None, 8, 8, 576) 55296 ['block_12_add[0][0]'] \n", " \n", " block_13_expand_BN (BatchNorma (None, 8, 8, 576) 2304 ['block_13_expand[0][0]'] \n", " lization) \n", " \n", " block_13_expand_relu (ReLU) (None, 8, 8, 576) 0 ['block_13_expand_BN[0][0]'] \n", " \n", " block_13_pad (ZeroPadding2D) (None, 9, 9, 576) 0 ['block_13_expand_relu[0][0]'] \n", " \n", " block_13_depthwise (DepthwiseC (None, 4, 4, 576) 5184 ['block_13_pad[0][0]'] \n", " onv2D) \n", " \n", " block_13_depthwise_BN (BatchNo (None, 4, 4, 576) 2304 ['block_13_depthwise[0][0]'] \n", " rmalization) \n", " \n", " block_13_depthwise_relu (ReLU) (None, 4, 4, 576) 0 ['block_13_depthwise_BN[0][0]'] \n", " \n", " block_13_project (Conv2D) (None, 4, 4, 160) 92160 ['block_13_depthwise_relu[0][0]']\n", " \n", " block_13_project_BN (BatchNorm (None, 4, 4, 160) 640 ['block_13_project[0][0]'] \n", " alization) \n", " \n", " block_14_expand (Conv2D) (None, 4, 4, 960) 153600 ['block_13_project_BN[0][0]'] \n", " \n", " block_14_expand_BN (BatchNorma (None, 4, 4, 960) 3840 ['block_14_expand[0][0]'] \n", " lization) \n", " \n", " block_14_expand_relu (ReLU) (None, 4, 4, 960) 0 ['block_14_expand_BN[0][0]'] \n", " \n", " block_14_depthwise (DepthwiseC (None, 4, 4, 960) 8640 ['block_14_expand_relu[0][0]'] \n", " onv2D) \n", " \n", " block_14_depthwise_BN (BatchNo (None, 4, 4, 960) 3840 ['block_14_depthwise[0][0]'] \n", " rmalization) \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " \n", " block_14_depthwise_relu (ReLU) (None, 4, 4, 960) 0 ['block_14_depthwise_BN[0][0]'] \n", " \n", " block_14_project (Conv2D) (None, 4, 4, 160) 153600 ['block_14_depthwise_relu[0][0]']\n", " \n", " block_14_project_BN (BatchNorm (None, 4, 4, 160) 640 ['block_14_project[0][0]'] \n", " alization) \n", " \n", " block_14_add (Add) (None, 4, 4, 160) 0 ['block_13_project_BN[0][0]', \n", " 'block_14_project_BN[0][0]'] \n", " \n", " block_15_expand (Conv2D) (None, 4, 4, 960) 153600 ['block_14_add[0][0]'] \n", " \n", " block_15_expand_BN (BatchNorma (None, 4, 4, 960) 3840 ['block_15_expand[0][0]'] \n", " lization) \n", " \n", " block_15_expand_relu (ReLU) (None, 4, 4, 960) 0 ['block_15_expand_BN[0][0]'] \n", " \n", " block_15_depthwise (DepthwiseC (None, 4, 4, 960) 8640 ['block_15_expand_relu[0][0]'] \n", " onv2D) \n", " \n", " block_15_depthwise_BN (BatchNo (None, 4, 4, 960) 3840 ['block_15_depthwise[0][0]'] \n", " rmalization) \n", " \n", " block_15_depthwise_relu (ReLU) (None, 4, 4, 960) 0 ['block_15_depthwise_BN[0][0]'] \n", " \n", " block_15_project (Conv2D) (None, 4, 4, 160) 153600 ['block_15_depthwise_relu[0][0]']\n", " \n", " block_15_project_BN (BatchNorm (None, 4, 4, 160) 640 ['block_15_project[0][0]'] \n", " alization) \n", " \n", " block_15_add (Add) (None, 4, 4, 160) 0 ['block_14_add[0][0]', \n", " 'block_15_project_BN[0][0]'] \n", " \n", " block_16_expand (Conv2D) (None, 4, 4, 960) 153600 ['block_15_add[0][0]'] \n", " \n", " block_16_expand_BN (BatchNorma (None, 4, 4, 960) 3840 ['block_16_expand[0][0]'] \n", " lization) \n", " \n", " block_16_expand_relu (ReLU) (None, 4, 4, 960) 0 ['block_16_expand_BN[0][0]'] \n", " \n", " block_16_depthwise (DepthwiseC (None, 4, 4, 960) 8640 ['block_16_expand_relu[0][0]'] \n", " onv2D) \n", " \n", " block_16_depthwise_BN (BatchNo (None, 4, 4, 960) 3840 ['block_16_depthwise[0][0]'] \n", " rmalization) \n", " \n", " block_16_depthwise_relu (ReLU) (None, 4, 4, 960) 0 ['block_16_depthwise_BN[0][0]'] \n", " \n", " block_16_project (Conv2D) (None, 4, 4, 320) 307200 ['block_16_depthwise_relu[0][0]']\n", " \n", " block_16_project_BN (BatchNorm (None, 4, 4, 320) 1280 ['block_16_project[0][0]'] \n", " alization) \n", " \n", " Conv_1 (Conv2D) (None, 4, 4, 1280) 409600 ['block_16_project_BN[0][0]'] \n", " \n", " Conv_1_bn (BatchNormalization) (None, 4, 4, 1280) 5120 ['Conv_1[0][0]'] \n", " \n", " out_relu (ReLU) (None, 4, 4, 1280) 0 ['Conv_1_bn[0][0]'] \n", " \n", " average_pooling2d_22 (AverageP (None, 1, 1, 1280) 0 ['out_relu[0][0]'] \n", " ooling2D) \n", " \n", " flatten_9 (Flatten) (None, 1280) 0 ['average_pooling2d_22[0][0]'] \n", " \n", " dense_27 (Dense) (None, 256) 327936 ['flatten_9[0][0]'] \n", " \n", " dropout_9 (Dropout) (None, 256) 0 ['dense_27[0][0]'] \n", " \n", " dense_28 (Dense) (None, 64) 16448 ['dropout_9[0][0]'] \n", " \n", " dense_29 (Dense) (None, 3) 195 ['dense_28[0][0]'] \n", " \n", "==================================================================================================\n", "Total params: 2,602,563\n", "Trainable params: 344,579\n", "Non-trainable params: 2,257,984\n", "__________________________________________________________________________________________________\n" ] } ], "source": [ "model.summary()" ] }, { "cell_type": "code", "execution_count": 154, "id": "e361de12", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "26/26 [==============================] - 6s 213ms/step - loss: 0.2541 - accuracy: 0.9117\n", "Test loss: 0.2540619671344757 / Test accuracy: 0.9116564393043518\n" ] } ], "source": [ "score = model.evaluate(test_generator)\n", "print(f'Test loss: {score[0]} / Test accuracy: {score[1]}')" ] }, { "cell_type": "code", "execution_count": 172, "id": "d911dded", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 172, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from matplotlib import pyplot as plt\n", "plt.subplot(2,1,1)\n", "plt.plot(history_1.history['accuracy'])\n", "plt.plot(history_1.history['val_accuracy'])\n", "plt.title('model accuracy')\n", "plt.ylabel('accuracy')\n", "plt.xlabel('epoch')\n", "plt.legend(['train', 'test'], loc='lower right')" ] }, { "cell_type": "code", "execution_count": 174, "id": "537b6db4", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(history_1.history['loss'])\n", "plt.plot(history_1.history['val_loss'])\n", "plt.title('model loss')\n", "plt.ylabel('loss')\n", "plt.xlabel('epoch')\n", "plt.legend(['train', 'test'], loc='upper left')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "90bd07ae", "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.9.7" } }, "nbformat": 4, "nbformat_minor": 5 }