image classification to file without training
This commit is contained in:
parent
ff968efae6
commit
8f9d89b908
@ -1,136 +0,0 @@
|
|||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
class Classificator():
|
|
||||||
|
|
||||||
def __init__(self, data_dir: str) -> None:
|
|
||||||
super().__init__()
|
|
||||||
self.data = self.train_model(data_dir)
|
|
||||||
|
|
||||||
def train_model(self, data_dir):
|
|
||||||
batch_size = 32
|
|
||||||
img_height = 180
|
|
||||||
img_width = 180
|
|
||||||
|
|
||||||
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()
|
|
||||||
return model, class_names, img_width, img_height
|
|
||||||
|
|
||||||
def image_clasification(self,image_path):
|
|
||||||
# ścieżka do sprawdzanego obrazu
|
|
||||||
# image_path = "./th-367101945.jpg"
|
|
||||||
|
|
||||||
img = tf.keras.utils.load_img(
|
|
||||||
image_path, target_size=(180, 180)
|
|
||||||
)
|
|
||||||
img_array = tf.keras.utils.img_to_array(img)
|
|
||||||
img_array = tf.expand_dims(img_array, 0) # Create a batch
|
|
||||||
|
|
||||||
predictions = self.data[0].predict(img_array)
|
|
||||||
score = tf.nn.softmax(predictions[0])
|
|
||||||
|
|
||||||
print(
|
|
||||||
"This image most likely belongs to {} with a {:.2f} percent confidence."
|
|
||||||
.format(self.data[1][np.argmax(score)], 100 * np.max(score))
|
|
||||||
)
|
|
||||||
return self.data[1][np.argmax(score)]
|
|
15
imageClasification/my_model/keras_metadata.pb
Normal file
15
imageClasification/my_model/keras_metadata.pb
Normal file
File diff suppressed because one or more lines are too long
BIN
imageClasification/my_model/saved_model.pb
Normal file
BIN
imageClasification/my_model/saved_model.pb
Normal file
Binary file not shown.
Binary file not shown.
BIN
imageClasification/my_model/variables/variables.index
Normal file
BIN
imageClasification/my_model/variables/variables.index
Normal file
Binary file not shown.
136
imageClasification/usedAssets/ClassificatorInside.py
Normal file
136
imageClasification/usedAssets/ClassificatorInside.py
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
class Classificator():
|
||||||
|
|
||||||
|
def __init__(self, data_dir: str) -> None:
|
||||||
|
super().__init__()
|
||||||
|
self.data = self.train_model(data_dir)
|
||||||
|
|
||||||
|
def train_model(self, data_dir):
|
||||||
|
batch_size = 32
|
||||||
|
img_height = 180
|
||||||
|
img_width = 180
|
||||||
|
|
||||||
|
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()
|
||||||
|
return model, class_names, img_width, img_height
|
||||||
|
|
||||||
|
def image_clasification(self,image_path):
|
||||||
|
# ścieżka do sprawdzanego obrazu
|
||||||
|
# image_path = "./th-367101945.jpg"
|
||||||
|
|
||||||
|
img = tf.keras.utils.load_img(
|
||||||
|
image_path, target_size=(180, 180)
|
||||||
|
)
|
||||||
|
img_array = tf.keras.utils.img_to_array(img)
|
||||||
|
img_array = tf.expand_dims(img_array, 0) # Create a batch
|
||||||
|
|
||||||
|
predictions = self.data[0].predict(img_array)
|
||||||
|
score = tf.nn.softmax(predictions[0])
|
||||||
|
|
||||||
|
print(
|
||||||
|
"This image most likely belongs to {} with a {:.2f} percent confidence."
|
||||||
|
.format(self.data[1][np.argmax(score)], 100 * np.max(score))
|
||||||
|
)
|
||||||
|
return self.data[1][np.argmax(score)]
|
Loading…
Reference in New Issue
Block a user