1. Einführung in Computer Vision
2. Bildklassifikation (Image Classification)
import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.datasets import cifar10
# Laden des CIFAR-10-Datensatzes
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
# Normalisierung der Bilddaten
x_train, x_test = x_train / 255.0, x_test / 255.0
# Aufbau des Modells
model = models.Sequential([
layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(64, (3, 3), activation='relu'),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(64, (3, 3), activation='relu'),
layers.Flatten(),
layers.Dense(64, activation='relu'),
layers.Dense(10, activation='softmax')
])
# Kompilieren des Modells
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# Trainieren des Modells
model.fit(x_train, y_train, epochs=10, validation_data=(x_test, y_test))
# Evaluieren des Modells
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f'Test accuracy: {test_acc}')
3. Objekterkennung (Object Detection)
import tensorflow as tf
import cv2
import numpy as np
# Laden des vortrainierten YOLO-Modells und der COCO-Klassen
net = cv2.dnn.readNet("yolov3.weights", "yolov3.cfg")
layer_names = net.getLayerNames()
output_layers = [layer_names[i - 1] for i in net.getUnconnectedOutLayers()]
classes = []
with open("coco.names", "r") as f:
classes = [line.strip() for line in f.readlines()]
# Laden und Vorverarbeiten eines Bildes
image = cv2.imread("image.jpg")
height, width, channels = image.shape
blob = cv2.dnn.blobFromImage(image, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
net.setInput(blob)
outs = net.forward(output_layers)
# Verarbeitung der Ausgaben
class_ids = []
confidences = []
boxes = []
for out in outs:
for detection in out:
scores = detection[5:]
class_id = np.argmax(scores)
confidence = scores[class_id]
if confidence > 0.5:
center_x = int(detection[0] * width)
center_y = int(detection[1] * height)
w = int(detection[2] * width)
h = int(detection[3] * height)
x = int(center_x - w / 2)
y = int(center_y - h / 2)
boxes.append([x, y, w, h])
confidences.append(float(confidence))
class_ids.append(class_id)
# Zeichnen der Bounding Boxes
for i in range(len(boxes)):
x, y, w, h = boxes[i]
label = str(classes[class_ids[i]])
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.putText(image, label, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
# Anzeigen des Ergebnisses
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
In diesem Beispiel verwenden wir das vortrainierte YOLOv3-Modell zur Erkennung von Objekten in einem Bild. Das Modell identifiziert die Objekte und zeichnet Bounding Boxes um sie herum.
4. Bildsegmentierung (Image Segmentation)
Die Bildsegmentierung teilt ein Bild in mehrere Segmente auf, um die Struktur des Bildes besser zu verstehen. Jeder Pixel des Bildes wird einer Klasse zugeordnet. Zu den gängigen Anwendungen gehören die medizinische Bildverarbeitung und autonomes Fahren.
Der U-Net-Modell ist eine spezielle Art von neuronalen Netzwerken, die vor allem für Bildsegmentierungsaufgaben entwickelt wurde. Das Modell wurde erstmals 2015 von Olaf Ronneberger, Philipp Fischer und Thomas Brox in ihrem Paper "U-Net: Convolutional Networks for Biomedical Image Segmentation" vorgestellt. Der U-Net-Architektur verdankt ihren Namen der charakteristischen U-Form.

Hier sind die Hauptmerkmale und Komponenten des U-Net-Modells:
Encoder-Teil: Der Encoder, auch als kontraktiver Pfad bezeichnet, besteht aus einer Reihe von Convolutional Layers, gefolgt von Max-Pooling-Schichten. Dieser Teil des Netzwerks extrahiert zunehmend abstrakte Merkmale aus dem Bild und reduziert dabei die räumliche Auflösung.
Bottleneck: Dies ist der tiefste Punkt der U-Net-Architektur, wo die Merkmalsdarstellung des Bildes am abstraktesten ist. Hier werden die Informationen stark verdichtet.
Decoder-Teil: Der Decoder, auch als expansiver Pfad bezeichnet, besteht aus einer Reihe von Up-Convolutions (auch Transposed Convolutions genannt) und Convolutional Layers. Dieser Teil des Netzwerks erhöht die räumliche Auflösung der Merkmalskarten wieder und rekonstruiert das Bildsegment.
Skip-Verbindungen: Eine der Schlüsselinnovationen des U-Net ist die Verwendung von Skip-Verbindungen. Diese Verbindungen überspringen mehrere Schichten und verbinden den Encoder direkt mit dem Decoder. Sie helfen dabei, detaillierte Informationen von den hohen Auflösungsschichten des Encoders zu den entsprechenden Schichten des Decoders zu übertragen, was die Segmentierungsergebnisse erheblich verbessert.
Loss-Funktion: Für die Bildsegmentierung wird häufig der Dice-Koeffizient oder der Cross-Entropy-Loss verwendet, um die Genauigkeit der Segmentierung zu maximieren.
Das U-Net-Modell wird häufig in der biomedizinischen Bildverarbeitung verwendet, insbesondere für Aufgaben wie Zellsegmentierung in Mikroskopbildern, da es in der Lage ist, genaue und feinkörnige Segmentierungen zu liefern. Durch seine Architektur kann das U-Net-Modell sowohl globale als auch lokale Informationen effektiv verarbeiten und liefert daher sehr präzise Segmentierungsergebnisse.
Beispiel: Bildsegmentierung mit TensorFlow und U-Net
U-Net ist ein beliebtes Modell für die Bildsegmentierung, insbesondere in der biomedizinischen Bildverarbeitung.
import tensorflow as tf
from tensorflow.keras import layers, models
# Aufbau des U-Net-Modells
def unet_model(input_size=(128, 128, 1)):
inputs = layers.Input(input_size)
conv1 = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(inputs)
conv1 = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(conv1)
pool1 = layers.MaxPooling2D(pool_size=(2, 2))(conv1)
conv2 = layers.Conv2D(128, (3, 3), activation='relu', padding='same')(pool1)
conv2 = layers.Conv2D(128, (3, 3), activation='relu', padding='same')(conv2)
pool2 = layers.MaxPooling2D(pool_size=(2, 2))(conv2)
conv3 = layers.Conv2D(256, (3, 3), activation='relu', padding='same')(pool2)
conv3 = layers.Conv2D(256, (3, 3), activation='relu', padding='same')(conv3)
pool3 = layers.MaxPooling2D(pool_size=(2, 2))(conv3)
conv4 = layers.Conv2D(512, (3, 3), activation='relu', padding='same')(pool3)
conv4 = layers.Conv2D(512, (3, 3), activation='relu', padding='same')(conv4)
drop4 = layers.Dropout(0.5)(conv4)
pool4 = layers.MaxPooling2D(pool_size=(2, 2))(drop4)
conv5 = layers.Conv2D(1024, (3, 3), activation='relu', padding='same')(pool4)
conv5 = layers.Conv2D(1024, (3, 3), activation='relu', padding='same')(conv5)
drop5 = layers.Dropout(0.5)(conv5)
up6 = layers.Conv2D(512, (2, 2), activation='relu', padding='same')(layers.UpSampling2D(size=(2, 2))(drop5))
merge6 = layers.concatenate([drop4, up6], axis=3)
conv6 = layers.Conv2D(512, (3, 3), activation='relu', padding='same')(merge6)
conv6 = layers.Conv2D(512, (3, 3), activation='relu', padding='same')(conv6)
up7 = layers.Conv2D(256, (2, 2), activation='relu', padding='same')(layers.UpSampling2D(size=(2, 2))(conv6))
merge7 = layers.concatenate([conv3, up7], axis=3)
conv7 = layers.Conv2D(256, (3, 3), activation='relu', padding='same')(merge7)
conv7 = layers.Conv2D(256, (3, 3), activation='relu', padding='same')(conv7)
up8 = layers.Conv2D(128, (2, 2), activation='relu', padding='same')(layers.UpSampling2D(size=(2, 2))(conv7))
merge8 = layers.concatenate([conv2, up8], axis=3)
conv8 = layers.Conv2D(128, (3, 3), activation='relu', padding='same')(merge8)
conv8 = layers.Conv2D(128, (3, 3), activation='relu', padding='same')(conv8)
up9 = layers.Conv2D(64, (2, 2), activation='relu', padding='same')(layers.UpSampling2D(size=(2, 2))(conv8))
merge9 = layers.concatenate([conv1, up9], axis=3)
conv9 = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(merge9)
conv9 = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(conv9)
conv9 = layers.Conv2D(2, (3, 3), activation='relu', padding='same')(conv9)
conv10 = layers.Conv2D(1, (1, 1), activation='sigmoid')(conv9)
model = models.Model(inputs=inputs, outputs=conv10)
return model
model = unet_model()
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# Anzeigen der Modellzusammenfassung
model.summary()
# Annehmen, dass x_train und y_train bereits vorverarbeitet und geladen sind
# x_train: Eingabebilder
# y_train: Segmentierungsmasken
# Trainieren des Modells
model.fit(x_train, y_train, epochs=10, batch_size=8, validation_split=0.1)