0% found this document useful (0 votes)
171 views9 pages

ResNet50 Image Augmentation Guide

The document discusses using various Python libraries like Augmentor and split-folders to perform data augmentation and splitting on image datasets. It then loads a ResNet50 model from Keras and attempts to train it on the augmented datasets but encounters errors regarding missing TensorFlow modules.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
171 views9 pages

ResNet50 Image Augmentation Guide

The document discusses using various Python libraries like Augmentor and split-folders to perform data augmentation and splitting on image datasets. It then loads a ResNet50 model from Keras and attempts to train it on the augmented datasets but encounters errors regarding missing TensorFlow modules.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

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

You might also like