.. _image_classification_guide: KI: Bildklassifizierung für Straßenschäden =========================================== 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. Voraussetzungen ---------------- Bevor Sie beginnen, stellen Sie sicher, dass Sie folgendes installiert haben: - Python - TensorFlow - NumPy - matplotlib 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. 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: .. code-block:: python 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) 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: .. code-block:: python 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) ]) Schritt 4: Modell trainieren ---------------------------- Trainieren Sie das erstellte Modell mit Ihren vorverarbeiteten Daten. Hier ist ein Beispielcode zum Trainieren des Modells: .. code-block:: python 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 ) 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: .. code-block:: python predictions = model.predict(test_images) 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. 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: :download:`unsere Präsentation ` 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) Ressource für die Erstellung der Image Classification ------------------------------------------------------ - https://www.tensorflow.org/tutorials/images/classification Weiterführende Ressourcen --------------------------- - TensorFlow-Dokumentation: https://www.tensorflow.org/ - TensorFlow-Tutorials: https://www.tensorflow.org/tutorials - TensorFlow-Community: https://community.tensorflow.org/