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.

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