4. KI: Bildklassifizierung für Straßenschäden¶
4.1. Vorwort¶
Bildklassifizierung ist ein häufiges Problem in der Computer Vision, bei dem ein Computerprogramm ein Bild analysiert und eine Klasse oder Kategorie für das Bild vorhersagt. Dieser Leitfaden bietet eine grobe Anleitung zur Erstellung einer Bildklassifizierung für Straßenschäden mit TensorFlow. Damit dieses Modell funktioniert, benötigen Sie alle erforderlichen Bibliotheken und Daten. Die Daten sind in unserem Hochschuleinternen Repository zu finden. Bei Problemen und Fragen wenden Sie sich bitte an die in der Startseite gelisteten Entwickler.
4.2. Voraussetzungen¶
Bevor Sie beginnen, stellen Sie sicher, dass Sie folgendes installiert haben:
Python
TensorFlow
NumPy
matplotlib
4.3. Schritt 1: Datensatz vorbereiten¶
Zuerst benötigen wir einen Datensatz von Bildern mit zugehörigen Klassen. Sie können einen beliebigen Datensatz verwenden oder Ihren eigenen erstellen. Wir haben unseren von der Seite https://www.kaggle.com/datasets/prudhvignv/road-damage-classification-and-assessment?resource=download verwendet. WICHTIG: Der Datensatz muss in einem Verzeichnis mit Unterordnern für jede Klasse von Bildern organisiert sein. In unserem Fall haben wir die Klassen „Good“, „Sophisticated“, „Poor“ und „Verypoor“ verwendet.
4.4. Schritt 2: Daten laden und vorverarbeiten¶
Laden Sie den Datensatz in Ihr Projekt und führen Sie die erforderlichen Vorverarbeitungsschritte durch, z. B. Skalierung der Pixelwerte.
Hier ist ein Beispielcode zum Laden eines Bild-Datensatzes mit TensorFlow:
import tensorflow as tf
batch_size = 32 # Number of samples in each batch for training
img_height = 180 # Height of the images
img_width = 180 # Width of the images
# Creating a training dataset using images from the specified directory
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
data_dir, # Directory containing the images
validation_split=0.2, # Percentage of data to use for validation
subset="training", # Specifies that this dataset is for training
seed=123, # Seed for shuffling the data
image_size=(img_height, img_width), # Size to resize the images to
batch_size=batch_size) # Number of samples in each batch
# Creating a validation dataset using images from the same directory
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)
4.5. Schritt 3: Modell erstellen¶
Erstellen Sie ein neuronales Netzwerkmodell in TensorFlow. Für diesen Leitfaden verwenden wir ein einfaches Faltungsnetzwerk (CNN).
Hier ist ein Beispielcode zum Erstellen eines einfachen CNN-Modells:
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential
num_classes = len(class_names) # Number of classes in the dataset
# Defining the model architecture using Sequential API
model = Sequential([
layers.Rescaling(1./255, input_shape=(img_height, img_width, 3)), # Rescaling layer to normalize pixel values between 0 and 1
layers.Conv2D(16, 3, padding='same', activation='relu'), # Convolutional layer with 16 filters, kernel size of 3x3, 'same' padding, and ReLU activation
layers.MaxPooling2D(), # Max pooling layer with default pool size (2x2)
layers.Conv2D(32, 3, padding='same', activation='relu'), # Convolutional layer with 32 filters, kernel size of 3x3, 'same' padding, and ReLU activation
layers.MaxPooling2D(), # Max pooling layer with default pool size (2x2)
layers.Conv2D(64, 3, padding='same', activation='relu'), # Convolutional layer with 64 filters, kernel size of 3x3, 'same' padding, and ReLU activation
layers.MaxPooling2D(), # Max pooling layer with default pool size (2x2)
layers.Dropout(0.2), # Dropout layer to prevent overfitting by randomly dropping 20% of the neurons during training
layers.Flatten(), # Flattening layer to convert 2D feature maps to a 1D vector
layers.Dense(128, activation='relu'), # Fully connected layer with 128 neurons and ReLU activation
layers.Dense(num_classes) # Output layer with num_classes neurons (one for each class) and no activation (for classification)
])
4.6. Schritt 4: Modell trainieren¶
Trainieren Sie das erstellte Modell mit Ihren vorverarbeiteten Daten.
Hier ist ein Beispielcode zum Trainieren des Modells:
import tensorflow as tf
model.compile(
optimizer='adam', # Using the Adam optimizer for training the model
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), # Sparse categorical cross-entropy loss function for multi-class classification
metrics=['accuracy']
)
epochs = 15 # Number of epochs for training
history = model.fit(
train_ds, # Training dataset
validation_data=val_ds, # Validation dataset
epochs=epochs # Number of epochs
)
4.7. Schritt 5: Vorhersagen machen¶
Verwenden Sie das trainierte Modell, um Vorhersagen für neue Bilder zu machen.
Hier ist ein Beispielcode zum Erstellen von Vorhersagen:
predictions = model.predict(test_images)
4.8. Künstliche Intelligenz in GUI einbinden¶
Für das Graphical User Interface wurde die in Python schon eingebundene Library Tkinter benutzt. Die GUI ist einfach aufgebaut. In der Mitte wird ein Bild angezeigt, das durch den User hochgeladen wird. Nach dem Upload des Bildes, wird dieses durch die Ki analysiert. Auf der linken Seite werden dann die Ergbnisse der Ki ausgegeben.
4.9. Fazit¶
Somit haben wir ein einfaches neuronales Netzwerk erstellt, um Bilder zu klassifizieren. Sie können das Modell weiter optimieren, indem Sie verschiedene Architekturen, Hyperparameter und Vorverarbeitungstechniken ausprobieren. In der Regel wird die Leistung des Modells durch die Qualität und Menge der Trainingsdaten, die Modellarchitektur und die Hyperparameter beeinflusst.
Unsere Powerpoint-Präsentation finden Sie unter:
unsere Präsentation
4.10. Extra: Ansatz mit OpenCV - Bibliothek für die Bildverarbeitung und Konturenerkennung¶
- Funktionsweise:
Skaliert Bild auf eine festgelegte Größe (275x180)
Konvertiert es in ein Graustufenbild
Verwendet Schwellenwerte um Konturen im Graustufenbild zu finden
Zeichnet die Konturen auf
Findet er Konturen im Bild, dann erkennt er einen Straßenschaden.
- Fazit zu OpenCV approach:
Sehr ungenau, da nur auf Konturen geschaut wird
Nur sehr spezifische Straßenschäden können erkennt werden (Ohne Störungen im Bild)
4.11. Ressource für die Erstellung der Image Classification¶
4.12. Weiterführende Ressourcen¶
TensorFlow-Dokumentation: https://www.tensorflow.org/
TensorFlow-Tutorials: https://www.tensorflow.org/tutorials
TensorFlow-Community: https://community.tensorflow.org/