From a767b8b0ea832f07b4dc4917dce0be22219c5932 Mon Sep 17 00:00:00 2001 From: Jakub-Prus <68164819+Jakub-Prus@users.noreply.github.com> Date: Wed, 25 May 2022 08:48:28 +0200 Subject: [PATCH] build image clasification and update requirements --- imageClasification/imageClasification.py | 128 +++++++++++++++++++++++ imageClasification/th-367101945.jpg | Bin 0 -> 23533 bytes requirements.txt | 13 ++- 3 files changed, 137 insertions(+), 4 deletions(-) create mode 100644 imageClasification/imageClasification.py create mode 100644 imageClasification/th-367101945.jpg diff --git a/imageClasification/imageClasification.py b/imageClasification/imageClasification.py new file mode 100644 index 0000000..705e0c8 --- /dev/null +++ b/imageClasification/imageClasification.py @@ -0,0 +1,128 @@ +import matplotlib.pyplot as plt +import numpy as np +import os +import PIL +import tensorflow as tf + +from tensorflow import keras +from tensorflow.keras import layers +from tensorflow.keras.models import Sequential + +batch_size = 32 +img_height = 180 +img_width = 180 +data_dir = "../SI_InteligentnyWozekWidlowy/imageClasification/images" + +train_ds = tf.keras.utils.image_dataset_from_directory( + data_dir, + validation_split=0.2, + subset="training", + seed=123, + image_size=(img_height, img_width), + batch_size=batch_size) + +val_ds = tf.keras.utils.image_dataset_from_directory( + data_dir, + validation_split=0.2, + subset="validation", + seed=123, + image_size=(img_height, img_width), + batch_size=batch_size) + +class_names = train_ds.class_names +print(class_names) + +plt.figure(figsize=(10, 10)) +for images, labels in train_ds.take(1): + for i in range(9): + ax = plt.subplot(3, 3, i + 1) + plt.imshow(images[i].numpy().astype("uint8")) + plt.title(class_names[labels[i]]) + plt.axis("off") + +for image_batch, labels_batch in train_ds: + print(image_batch.shape) + print(labels_batch.shape) + break + +AUTOTUNE = tf.data.AUTOTUNE + +train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE) +val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE) + +normalization_layer = layers.Rescaling(1. / 255) + +normalized_ds = train_ds.map(lambda x, y: (normalization_layer(x), y)) +image_batch, labels_batch = next(iter(normalized_ds)) +first_image = image_batch[0] +# Notice the pixel values are now in `[0,1]`. +print(np.min(first_image), np.max(first_image)) + +num_classes = len(class_names) + +model = Sequential([ + layers.Rescaling(1. / 255, input_shape=(img_height, img_width, 3)), + layers.Conv2D(16, 3, padding='same', activation='relu'), + layers.MaxPooling2D(), + layers.Conv2D(32, 3, padding='same', activation='relu'), + layers.MaxPooling2D(), + layers.Conv2D(64, 3, padding='same', activation='relu'), + layers.MaxPooling2D(), + layers.Flatten(), + layers.Dense(128, activation='relu'), + layers.Dense(num_classes) +]) + +model.compile(optimizer='adam', + loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), + metrics=['accuracy']) + +# model.summary() + + +epochs = 10 +history = model.fit( + train_ds, + validation_data=val_ds, + epochs=epochs +) + +acc = history.history['accuracy'] +val_acc = history.history['val_accuracy'] + +loss = history.history['loss'] +val_loss = history.history['val_loss'] + +epochs_range = range(epochs) + +plt.figure(figsize=(8, 8)) +plt.subplot(1, 2, 1) +plt.plot(epochs_range, acc, label='Training Accuracy') +plt.plot(epochs_range, val_acc, label='Validation Accuracy') +plt.legend(loc='lower right') +plt.title('Training and Validation Accuracy') + +plt.subplot(1, 2, 2) +plt.plot(epochs_range, loss, label='Training Loss') +plt.plot(epochs_range, val_loss, label='Validation Loss') +plt.legend(loc='upper right') +plt.title('Training and Validation Loss') +plt.show() + + +# ścieżka do sprawdzanego obrazu +image_path = "./th-367101945.jpg" + +img = tf.keras.utils.load_img( + image_path, target_size=(img_height, img_width) +) +img_array = tf.keras.utils.img_to_array(img) +img_array = tf.expand_dims(img_array, 0) # Create a batch + +predictions = model.predict(img_array) +score = tf.nn.softmax(predictions[0]) + +print( + "This image most likely belongs to {} with a {:.2f} percent confidence." + .format(class_names[np.argmax(score)], 100 * np.max(score)) +) diff --git a/imageClasification/th-367101945.jpg b/imageClasification/th-367101945.jpg new file mode 100644 index 0000000000000000000000000000000000000000..719e4de3460fca0deb49d9ba3927e245eced42e6 GIT binary patch literal 23533 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

E&8jv{hlz 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 TQZi98Rde!>N+_;~Y*GK&OuEIB literal 0 HcmV?d00001 diff --git a/requirements.txt b/requirements.txt index 649e298..a899ebb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,10 @@ jupyter -matplotlib -mesa -numpy -sklearn \ No newline at end of file +matplotlib~=3.5.2 +mesa~=0.9.0 +numpy~=1.22.3 +sklearn~=0.0 +pandas~=1.4.2 +scikit-learn~=1.1.1 +Pillow~=9.1.1 +requests~=2.27.1 +tensorflow~=2.9.1 \ No newline at end of file