3/10/24, 6:07 PM ResNet50-Copy2
In [1]: !pip install Augmentor #### installing Augmentor library for augmentation of dataset #
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: Augmentor in c:\users\nat\appdata\roaming\python\pytho
n311\site-packages (0.2.12)
Requirement already satisfied: Pillow>=5.2.0 in c:\programdata\anaconda3\envs\project
\lib\site-packages (from Augmentor) (10.1.0)
Requirement already satisfied: tqdm>=4.9.0 in c:\programdata\anaconda3\envs\project\l
ib\site-packages (from Augmentor) (4.66.1)
Requirement already satisfied: numpy>=1.11.0 in c:\programdata\anaconda3\envs\project
\lib\site-packages (from Augmentor) (1.25.2)
Requirement already satisfied: colorama in c:\programdata\anaconda3\envs\project\lib
\site-packages (from tqdm>=4.9.0->Augmentor) (0.4.6)
In [1]: import Augmentor #### importing library ####
p = Augmentor.Pipeline(r"C:\Users\NAT\Desktop\COMMISSION 2.0\RESNET50_FOR AUG\Mites")
p.flip_top_bottom(probability=0.4)
p.rotate_random_90(probability=1.0)
p.shear(probability=0.9, max_shear_left=20, max_shear_right=20)
p.skew(probability=0.3, magnitude=1)
p.skew_corner(probability=0.01, magnitude=1)
p.skew_left_right(probability=0.02, magnitude=1)
p.skew_tilt(probability=0.03, magnitude=1)
p.skew_top_bottom(probability=0.04, magnitude=1)
#p.random_brightness(probability=0.4, min_factor=0, max_factor=0.65)
p.sample(700) #### number of output images after augmentation of Mites ####
Initialised with 49 image(s) found.
Output directory set to C:\Users\NAT\Desktop\COMMISSION 2.0\RESNET50_FOR AUG\Mites\ou
tput.
Processing <PIL.Image.Image image mode=RGB size=853x640 at 0x1C70004CC50>: 11%|█
| 77/700 [00:23<03:09, 3.29 Samples/s]
localhost:8888/nbconvert/html/ResNet50-Copy2.ipynb?download=false 1/9
3/10/24, 6:07 PM ResNet50-Copy2
---------------------------------------------------------------------------
KeyboardInterrupt Traceback (most recent call last)
Cell In[1], line 12
10 p.skew_top_bottom(probability=0.04, magnitude=1)
11 #p.random_brightness(probability=0.4, min_factor=0, max_factor=0.65)
---> 12 p.sample(700)
File ~\AppData\Roaming\Python\Python311\site-packages\Augmentor\Pipeline.py:364, in P
ipeline.sample(self, n, multi_threaded)
362 with tqdm(total=len(augmentor_images), desc="Executing Pipeline", unit=" Samp
les") as progress_bar:
363 with ThreadPoolExecutor(max_workers=None) as executor:
--> 364 for result in executor.map(self, augmentor_images):
365 progress_bar.set_description("Processing %s" % result)
366 progress_bar.update(1)
File C:\ProgramData\anaconda3\Lib\concurrent\futures\_base.py:619, in Executor.map.<l
ocals>.result_iterator()
616 while fs:
617 # Careful not to keep a reference to the popped future
618 if timeout is None:
--> 619 yield _result_or_cancel(fs.pop())
620 else:
621 yield _result_or_cancel(fs.pop(), end_time - time.monotonic())
File C:\ProgramData\anaconda3\Lib\concurrent\futures\_base.py:317, in _result_or_canc
el(***failed resolving arguments***)
315 try:
316 try:
--> 317 return fut.result(timeout)
318 finally:
319 fut.cancel()
File C:\ProgramData\anaconda3\Lib\concurrent\futures\_base.py:451, in Future.result(s
elf, timeout)
448 elif self._state == FINISHED:
449 return self.__get_result()
--> 451 self._condition.wait(timeout)
453 if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]:
454 raise CancelledError()
File C:\ProgramData\anaconda3\Lib\threading.py:320, in Condition.wait(self, timeout)
318 try: # restore state no matter what (e.g., KeyboardInterrupt)
319 if timeout is None:
--> 320 waiter.acquire()
321 gotit = True
322 else:
KeyboardInterrupt:
In [ ]: p = Augmentor.Pipeline(r"C:\Users\NAT\Desktop\COMMISSION 2.0\RESNET50_FOR AUG\Dandruff
p.flip_top_bottom(probability=0.4)
p.rotate_random_90(probability=1.0)
p.shear(probability=0.9, max_shear_left=20, max_shear_right=20)
p.skew(probability=0.3, magnitude=1)
p.skew_corner(probability=0.01, magnitude=1)
p.skew_left_right(probability=0.02, magnitude=1)
p.skew_tilt(probability=0.03, magnitude=1)
p.skew_top_bottom(probability=0.04, magnitude=1)
localhost:8888/nbconvert/html/ResNet50-Copy2.ipynb?download=false 2/9
3/10/24, 6:07 PM ResNet50-Copy2
#p.random_brightness(probability=0.4, min_factor=0, max_factor=0.65)
p.sample(700) #### number of output images after augmentation of Dandruff ####
In [26]: %cd Desktop\COMMISSION 2.0
[WinError 3] The system cannot find the path specified: 'Desktop\\COMMISSION 2.0'
C:\Users\NAT\Desktop\COMMISSION 2.0
In [2]: !pip install split-folders #### installing splitfolders libary ####
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: split-folders in c:\users\nat\appdata\roaming\python\p
ython311\site-packages (0.5.1)
In [3]: import splitfolders #### importing splitfolders library to automatically split datset
In [27]: input_folder = "INPUT_DATASET_700SAMPLES_02182024" #### input_folder path ####
output = "PROCESSED_DATASET_700SAMPLES_02182024" #### create the output folder path ##
splitfolders.ratio(input_folder, output, seed=42, ratio=(.6, .2, .2)) #### ratio for t
Copying files: 1496 files [00:10, 145.77 files/s]
In [ ]: //////
In [2]: from tensorflow.keras.layers import Conv2D, Flatten, Dense, MaxPool2D, BatchNormalizat
from tensorflow.keras.applications.resnet50 import preprocess_input, decode_prediction
from tensorflow.keras.preprocessing.image import ImageDataGenerator, load_img
from tensorflow.keras.applications.resnet50 import ResNet50
from tensorflow.keras.preprocessing import image
from tensorflow.keras.models import Sequential
from tensorflow.keras.models import Model
import matplotlib.pyplot as plt
import numpy as np
#### importing necessary libraries for training ResNet50 model ####
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
Cell In[2], line 1
----> 1 from tensorflow.keras.layers import Conv2D, Flatten, Dense, MaxPool2D, BatchN
ormalization, GlobalAveragePooling2D
2 from tensorflow.keras.applications.resnet50 import preprocess_input, decode_p
redictions
3 from tensorflow.keras.preprocessing.image import ImageDataGenerator, load_img
ModuleNotFoundError: No module named 'tensorflow'
In [3]: img_height, img_width = (224,224) #### setting the image height and width ####
batch_size = 32 #### Batch sze for training ####
train_data_dir = r"PROCESSED_DATASET_700SAMPLES_02182024\train" #### location of train
valid_data_dir = r"PROCESSED_DATASET_700SAMPLES_02182024\val" #### location of valid
test_data_dir = r"PROCESSED_DATASET_wmekusmekusCopy\test" #### location of testi
In [3]: train_datagen = ImageDataGenerator (preprocessing_function=preprocess_input,
validation_split=0.4)
train_generator = train_datagen.flow_from_directory(
train_data_dir,
localhost:8888/nbconvert/html/ResNet50-Copy2.ipynb?download=false 3/9
3/10/24, 6:07 PM ResNet50-Copy2
target_size=(img_height, img_width),
batch_size=batch_size,
class_mode='categorical',
subset="training") #### set as training data ####
valid_generator = train_datagen.flow_from_directory(
valid_data_dir, #### same directory as training data ####
target_size=(img_height, img_width),
batch_size=batch_size,
class_mode='categorical',
subset= 'validation') #### set as validation data ####
#### preprocessing #### necessary to be able to start the training process ####
Found 539 images belonging to 2 classes.
Found 118 images belonging to 2 classes.
In [4]: test_generator = train_datagen.flow_from_directory(
test_data_dir, #### same directory as training data ####
target_size=(img_height, img_width),
batch_size=1,
class_mode='categorical',
subset= 'validation') #### set as validation data ####
#### preprocessing #### necessary to be able to start the testing process ####
Found 118 images belonging to 2 classes.
In [6]: x,y=test_generator.next()
x.shape
(1, 416, 416, 3)
Out[6]:
In [7]: #### this is the code for training ####
base_model = ResNet50(include_top=False, weights='imagenet') ### using ResNet50 algori
x = base_model.output #### taking the output of base_model ####
x = GlobalAveragePooling2D()(x) #### adding additional layer ####
x = Dense (1024, activation='relu')(x) #### another additional layer ####
predictions = Dense (train_generator.num_classes, activation='softmax')(x) #### return
model = Model(inputs=base_model.input, outputs=predictions) #### transfer learning. us
for layer in base_model.layers:
layer.trainable = False
model.compile(optimizer = 'adam', loss='categorical_crossentropy', metrics = ['accurac
model.fit(train_generator,
epochs = 10)
localhost:8888/nbconvert/html/ResNet50-Copy2.ipynb?download=false 4/9
3/10/24, 6:07 PM ResNet50-Copy2
WARNING:tensorflow:From C:\ProgramData\anaconda3\envs\Project\Lib\site-packages\keras
\src\backend.py:1398: The name tf.executing_eagerly_outside_functions is deprecated.
Please use tf.compat.v1.executing_eagerly_outside_functions instead.
WARNING:tensorflow:From C:\ProgramData\anaconda3\envs\Project\Lib\site-packages\keras
\src\layers\normalization\batch_normalization.py:979: The name tf.nn.fused_batch_norm
is deprecated. Please use tf.compat.v1.nn.fused_batch_norm instead.
WARNING:tensorflow:From C:\ProgramData\anaconda3\envs\Project\Lib\site-packages\keras
\src\optimizers\__init__.py:309: The name tf.train.Optimizer is deprecated. Please us
e tf.compat.v1.train.Optimizer instead.
Epoch 1/10
WARNING:tensorflow:From C:\ProgramData\anaconda3\envs\Project\Lib\site-packages\keras
\src\utils\tf_utils.py:492: The name tf.ragged.RaggedTensorValue is deprecated. Pleas
e use tf.compat.v1.ragged.RaggedTensorValue instead.
WARNING:tensorflow:From C:\ProgramData\anaconda3\envs\Project\Lib\site-packages\keras
\src\engine\base_layer_utils.py:384: The name tf.executing_eagerly_outside_functions
is deprecated. Please use tf.compat.v1.executing_eagerly_outside_functions instead.
17/17 [==============================] - 82s 4s/step - loss: 1.4117 - accuracy: 0.662
3
Epoch 2/10
17/17 [==============================] - 72s 4s/step - loss: 0.2601 - accuracy: 0.877
6
Epoch 3/10
17/17 [==============================] - 93s 6s/step - loss: 0.1220 - accuracy: 0.962
9
Epoch 4/10
17/17 [==============================] - 78s 4s/step - loss: 0.0593 - accuracy: 0.992
6
Epoch 5/10
17/17 [==============================] - 100s 6s/step - loss: 0.0350 - accuracy: 0.99
81
Epoch 6/10
17/17 [==============================] - 87s 5s/step - loss: 0.0196 - accuracy: 0.998
1
Epoch 7/10
17/17 [==============================] - 100s 6s/step - loss: 0.0122 - accuracy: 1.00
00
Epoch 8/10
17/17 [==============================] - 92s 5s/step - loss: 0.0082 - accuracy: 1.000
0
Epoch 9/10
17/17 [==============================] - 97s 6s/step - loss: 0.0064 - accuracy: 1.000
0
Epoch 10/10
17/17 [==============================] - 105s 6s/step - loss: 0.0044 - accuracy: 1.00
00
<keras.src.callbacks.History at 0x15440015e10>
Out[7]:
In [8]: !pip install pyyaml h5py #### necessary library to be able to save the model ####
model.save('Saved_Model\ResNet50_MiteOrDandruff02182024_700smpls10epoch_Resnet50copy2.
localhost:8888/nbconvert/html/ResNet50-Copy2.ipynb?download=false 5/9
3/10/24, 6:07 PM ResNet50-Copy2
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: pyyaml in c:\programdata\anaconda3\envs\project\lib\si
te-packages (6.0.1)
Requirement already satisfied: h5py in c:\programdata\anaconda3\envs\project\lib\site
-packages (3.10.0)
Requirement already satisfied: numpy>=1.17.3 in c:\programdata\anaconda3\envs\project
\lib\site-packages (from h5py) (1.25.2)
C:\ProgramData\anaconda3\envs\Project\Lib\site-packages\keras\src\engine\training.py:
3103: UserWarning: You are saving your model as an HDF5 file via `model.save()`. This
file format is considered legacy. We recommend using instead the native Keras format,
e.g. `model.save('my_model.keras')`.
saving_api.save_model(
In [9]: #### evaluation of the model using testing dataset ####
#### results will show accruacy % and loss % ####
test_loss, test_acc = model.evaluate(test_generator, verbose=2)
print('\nTest accuracy:', test_acc)
118/118 - 27s - loss: 0.3734 - accuracy: 0.9322 - 27s/epoch - 225ms/step
Test accuracy: 0.9322034120559692
In [10]: #### importing necessary libraries for testing ####
import pandas as pd
import seaborn as sn
import tensorflow as tf
#### testing the saved model ####
#### results will show the accuracy % and generates confusion matrix table ####
model = tf.keras.models.load_model("Saved_Model\ResNet50_MiteOrDandruff02182024_700smp
filenames = test_generator.filenames
nb_samples = len(test_generator)
y_prob=[]
y_act=[]
test_generator.reset()
for _ in range(nb_samples):
X_test,Y_test = test_generator.next()
y_prob.append(model.predict(X_test))
y_act.append(Y_test)
predicted_class = [list(train_generator.class_indices.keys())[i.argmax()] for i in y_p
actual_class = [list(train_generator.class_indices.keys())[i.argmax()] for i in y_act]
out_df = pd.DataFrame(np.vstack([predicted_class,actual_class]).T,columns=['predicted_
confusion_matrix = pd.crosstab (out_df['actual_class'],out_df['predicted_class'], rown
sn.heatmap(confusion_matrix, cmap='Blues', annot=True, fmt='d')
plt.show()
print('test accuracy : {}'.format((np.diagonal (confusion_matrix).sum()/confusion_matr
localhost:8888/nbconvert/html/ResNet50-Copy2.ipynb?download=false 6/9
3/10/24, 6:07 PM ResNet50-Copy2
1/1 [==============================] - 1s 868ms/step
1/1 [==============================] - 0s 156ms/step
1/1 [==============================] - 0s 148ms/step
1/1 [==============================] - 0s 156ms/step
1/1 [==============================] - 0s 150ms/step
1/1 [==============================] - 0s 160ms/step
1/1 [==============================] - 0s 170ms/step
1/1 [==============================] - 0s 151ms/step
1/1 [==============================] - 0s 160ms/step
1/1 [==============================] - 0s 162ms/step
1/1 [==============================] - 0s 155ms/step
1/1 [==============================] - 0s 178ms/step
1/1 [==============================] - 0s 150ms/step
1/1 [==============================] - 0s 152ms/step
1/1 [==============================] - 0s 154ms/step
1/1 [==============================] - 0s 167ms/step
1/1 [==============================] - 0s 159ms/step
1/1 [==============================] - 0s 148ms/step
1/1 [==============================] - 0s 152ms/step
1/1 [==============================] - 0s 156ms/step
1/1 [==============================] - 0s 178ms/step
1/1 [==============================] - 0s 170ms/step
1/1 [==============================] - 0s 168ms/step
1/1 [==============================] - 0s 151ms/step
1/1 [==============================] - 0s 151ms/step
1/1 [==============================] - 0s 165ms/step
1/1 [==============================] - 0s 163ms/step
1/1 [==============================] - 0s 177ms/step
1/1 [==============================] - 0s 157ms/step
1/1 [==============================] - 0s 209ms/step
1/1 [==============================] - 0s 158ms/step
1/1 [==============================] - 0s 155ms/step
1/1 [==============================] - 0s 144ms/step
1/1 [==============================] - 0s 143ms/step
1/1 [==============================] - 0s 161ms/step
1/1 [==============================] - 0s 143ms/step
1/1 [==============================] - 0s 153ms/step
1/1 [==============================] - 0s 156ms/step
1/1 [==============================] - 0s 163ms/step
1/1 [==============================] - 0s 164ms/step
1/1 [==============================] - 0s 158ms/step
1/1 [==============================] - 0s 156ms/step
1/1 [==============================] - 0s 168ms/step
1/1 [==============================] - 0s 162ms/step
1/1 [==============================] - 0s 152ms/step
1/1 [==============================] - 0s 150ms/step
1/1 [==============================] - 0s 144ms/step
1/1 [==============================] - 0s 163ms/step
1/1 [==============================] - 0s 160ms/step
1/1 [==============================] - 0s 151ms/step
1/1 [==============================] - 0s 143ms/step
1/1 [==============================] - 0s 178ms/step
1/1 [==============================] - 0s 155ms/step
1/1 [==============================] - 0s 146ms/step
1/1 [==============================] - 0s 141ms/step
1/1 [==============================] - 0s 147ms/step
1/1 [==============================] - 0s 153ms/step
1/1 [==============================] - 0s 171ms/step
1/1 [==============================] - 0s 147ms/step
1/1 [==============================] - 0s 160ms/step
localhost:8888/nbconvert/html/ResNet50-Copy2.ipynb?download=false 7/9
3/10/24, 6:07 PM ResNet50-Copy2
1/1 [==============================] - 0s 154ms/step
1/1 [==============================] - 0s 146ms/step
1/1 [==============================] - 0s 161ms/step
1/1 [==============================] - 0s 153ms/step
1/1 [==============================] - 0s 156ms/step
1/1 [==============================] - 0s 154ms/step
1/1 [==============================] - 0s 157ms/step
1/1 [==============================] - 0s 159ms/step
1/1 [==============================] - 0s 184ms/step
1/1 [==============================] - 0s 179ms/step
1/1 [==============================] - 0s 162ms/step
1/1 [==============================] - 0s 159ms/step
1/1 [==============================] - 0s 146ms/step
1/1 [==============================] - 0s 158ms/step
1/1 [==============================] - 0s 163ms/step
1/1 [==============================] - 0s 172ms/step
1/1 [==============================] - 0s 172ms/step
1/1 [==============================] - 0s 176ms/step
1/1 [==============================] - 0s 154ms/step
1/1 [==============================] - 0s 161ms/step
1/1 [==============================] - 0s 160ms/step
1/1 [==============================] - 0s 156ms/step
1/1 [==============================] - 0s 159ms/step
1/1 [==============================] - 0s 157ms/step
1/1 [==============================] - 0s 174ms/step
1/1 [==============================] - 0s 179ms/step
1/1 [==============================] - 0s 217ms/step
1/1 [==============================] - 0s 176ms/step
1/1 [==============================] - 0s 175ms/step
1/1 [==============================] - 0s 176ms/step
1/1 [==============================] - 0s 162ms/step
1/1 [==============================] - 0s 167ms/step
1/1 [==============================] - 0s 156ms/step
1/1 [==============================] - 0s 184ms/step
1/1 [==============================] - 0s 161ms/step
1/1 [==============================] - 0s 183ms/step
1/1 [==============================] - 0s 161ms/step
1/1 [==============================] - 0s 165ms/step
1/1 [==============================] - 0s 153ms/step
1/1 [==============================] - 0s 152ms/step
1/1 [==============================] - 0s 149ms/step
1/1 [==============================] - 0s 147ms/step
1/1 [==============================] - 0s 164ms/step
1/1 [==============================] - 0s 157ms/step
1/1 [==============================] - 0s 173ms/step
1/1 [==============================] - 0s 165ms/step
1/1 [==============================] - 0s 162ms/step
1/1 [==============================] - 0s 163ms/step
1/1 [==============================] - 0s 164ms/step
1/1 [==============================] - 0s 151ms/step
1/1 [==============================] - 0s 157ms/step
1/1 [==============================] - 0s 171ms/step
1/1 [==============================] - 0s 165ms/step
1/1 [==============================] - 0s 166ms/step
1/1 [==============================] - 0s 168ms/step
1/1 [==============================] - 0s 159ms/step
1/1 [==============================] - 0s 162ms/step
1/1 [==============================] - 0s 171ms/step
localhost:8888/nbconvert/html/ResNet50-Copy2.ipynb?download=false 8/9
3/10/24, 6:07 PM ResNet50-Copy2
test accuracy : 93.22033898305084
In [25]:
C:\Users\NAT\Desktop\COMMISSION 2.0\Saved_Model
In [ ]:
localhost:8888/nbconvert/html/ResNet50-Copy2.ipynb?download=false 9/9