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 0000000..719e4de Binary files /dev/null and b/imageClasification/th-367101945.jpg differ 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