Projektaufbau – Entrasterungs-KI: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Fabian.babik@stud.hshl.de (Diskussion | Beiträge)
Fabian.babik@stud.hshl.de (Diskussion | Beiträge)
Zeile 101: Zeile 101:
* <math>P</math> die Rasterperiode
* <math>P</math> die Rasterperiode
repräsentieren.
repräsentieren.
===Erster Versuch===
====Erster Versuch====
<syntaxhighlight lang="matlab">
<syntaxhighlight lang="matlab">
Eingangsbild = 500x500  
Eingangsbild = 500x500  
Zeile 135: Zeile 135:


Diese Anzahl ist offensichtlich zu gering, um das Bild angemessen darzustellen.
Diese Anzahl ist offensichtlich zu gering, um das Bild angemessen darzustellen.
===Zweiter Versuch===
===Zweiter Versuch===
<syntaxhighlight lang="matlab">
<syntaxhighlight lang="matlab">

Version vom 9. Januar 2026, 11:39 Uhr

Worum geht es in dem Projekt?

In diesem Projekt wird ein Denoising Convolutional Neural Network (DnCNN) in MATLAB implementiert, das zur Entfernung von Druckrastern eingesetzt wird. Anders als beim klassischen DnCNN-Ansatz wird kein Residual Learning verwendet. Stattdessen kommt ein Direct-Mapping-Ansatz zum Einsatz. Das Netzwerk wird direkt darauf trainiert, ein Bild, das durch ein amplitudenmoduliertes Raster (AM-Raster) geprägt ist, in ein sauberes, rasterfreies Bild zu überführen.

Damit dieser Ansatz funktioniert, müssen mehrere vorbereitende Schritte durchgeführt werden. Obwohl die KI die Transformation grundsätzlich kanonisch und bijektiv umsetzt (AM-Bild → normales Bild), ist ein Preprocessing erforderlich. Eine vollständig in die KI integrierte Lösung konnte bisher nicht gefunden werden, trotz intensiver Bemühungen.

Was ich damit genau meine, wird im weiteren Verlauf des Artikels noch ausführlich erläutert.

Technische Vorraussetzungen

Folgender Befehl in der Kommandozeile gibt immer alle Notwendigen Toolboxen zurück.

[files, products] = matlab.codetools.requiredFilesAndProducts("Datei.mlx")

Stand 06.01.2026 sollten folgende Toolboxen installiert werden:

  1. Deep Learning Toolbox
  2. Image Processing Toolbox
  3. Parallel Computing Toolbox
  4. System Identification Toolbox
  5. Signal Processing Toolbox

Des weiteren sind Folgende Dateien wichtig und im SVN hochgeladen:

  1. Training.mlx
  2. Training_fortsetzen.mlx
  3. PatchDatastore.m
  4. combinedLoss.mlx
  5. Druckmuster_erstellen_function.mlx
  6. SynthetischeBilderErzeugen.mlx
  7. KI_Test_Fertig.mlx

Exemplarische Durchführung

KI Erzeugen

Hier wird erklärt wie man eine KI trainiert.

Training.mlx

Hier wird das Training erklärt

PatchDatastore.m

Hier wird der PatchDatastore erklärt

combinedLoss.mlx

Hier wird die Loss Funktion nochmal erklärk

Druckmuster_erstellen_function und Druckmuster_erstellen_function2

Hier wird erklärt wie die Druckmuster erstellt werden

KI Anwenden

Zunächst muss aus einem beliebigen Bild ein synthetisches Bild erzeugt werden, das die Eigenschaften eines Druckrasters aufweist. Alternativ kann man auch ein Bild verwenden, das bereits ein Druckraster enthält. Am besten verwenden Sie ein buntes oder schwarz-weiß Bild. Wenn Sie ein buntes Bild verwenden, ist ein direkter Vergleich mit dem Endergebnis schwierig, da dieses ohnehin schwarz-weiß sein wird. Daher wird empfohlen, den Code zunächst mit dem gewählten Bild auszuführen, um die Ergebnisse zu überprüfen.

img = imread("Ergebnisse_VonSynthetischenDruckraster_ZuNormal\PommesPizza.jpg");
img = im2gray(img);
imwrite(img,"Ergebnisse_VonSynthetischenDruckraster_ZuNormal\BlackWhite_PommesPizza.jpg")
PommesPizza zu Schwarz-Weiß konvertieren PommesPizzaSchwarzWeiss

Dieses Schwarz-Weiß-Bild stellt das angestrebte Zielergebnis dar. Öffnen Sie anschließend die Datei SynthetischeBilderErzeugen.mlx, um aus diesem Bild ein synthetisches AM-Druckmuster zu erzeugen.

SynthetischeBilderErzeugen.mlx

In Schritt 2 ist der Pfad zum entsprechenden Bild anzugeben. Nach Abschluss des Prozesses wird das Bild mit dem generierten Druckmuster ausgegeben. Details zur Funktionsweise der Funktion Druckraster_erstellen_function sind im entsprechenden Abschnitt dieses Artikels dokumentiert.

%Synthetische Bilder erzeugen
%Schritt 1: 
clear; clc; close all;

%Schritt 2: Bild laden
img = imread('E:\MATLAB_Vorkurs\Signalverarbeitung_mit_Kuenstlicher_Intelligenz\mFiles\DruckrasterEntfernen\2026\1\Ergebnisse_VonSynthetischenDruckraster_ZuNormal\PommesPizza.jpg');   % <-- HIER dein Bild einsetzen

%Schritt 3: Wichtige Parameter
RasterPerioden = 15;     % Rasterzellengröße
FaktorRadius   = 0.75;   % Punktgroessen-Faktor
ScaleFaktor    = 5;      % Bildskalierung

%Schritt 4: AM-Druckraster erzeugen mit einer custom Funktion
AM = Druckmuster_erstellen_function( ...
        img, RasterPerioden, FaktorRadius, ScaleFaktor);

%Schritt 5: Speichern
imwrite(AM, 'Synthetisches_PommesPizza.png');
PommesPizza zu einem Synthetischen AM-Raster konvertieren PommesPizzaSynthetisch

Die Parameter sind das Wichtigste Maß, damit die KI erfolgreich das Raster entfernen kann. Die Rasterperiode gibt an bis zu wie viel Platz jeder Dot zu verfügung hat. Der FaktorRadius manipuliert nochmal die Größe der Dots und der Scale Faktor bestimmt wie sehr ein Bild skaliet werden soll. Das Netzwerk wurde darauf trainiert mit 16 Dots Minimum das Schwarz-Weiß Bild zu rekonstruiren. Betrachte folgende Rechnung:

Die Anzahl der Abtastpunkte N in horizontaler (x-) und vertikaler (y-) Richtung ergibt sich ungefähr aus:

NxBxSP,NyBySP,NNxNy

wobei

  • Bx und By die Bildabmessungen in Pixeln,
  • S der Skalierungsfaktor,
  • P die Rasterperiode

repräsentieren.

Erster Versuch

Eingangsbild = 500x500 
RasterPerioden = 50;     % Rasterzellengröße
FaktorRadius   = 1;      % Punktgroessen-Faktor
ScaleFaktor    = 1;      % Bildskalierung

Für die horizontale und vertikale Richtung gilt:

50015010

50015010

Damit repräsentieren etwa

10×10100 Abtastpunkte das gesamte Bild.

HSHL
Druckmuster_erstellen_Vollstaendig.mlx
Druckraster_erstellen_function.mlx
Druckraster_erstellen_function2.mlx

Diese Anzahl ist offensichtlich zu gering, um das Bild angemessen darzustellen.

Zweiter Versuch

Eingangsbild = 500x500 
RasterPerioden = 5;     % Rasterzellengröße
FaktorRadius   = 1;     % Punktgroessen-Faktor
ScaleFaktor    = 1;     % Bildskalierung

50015100

50015100

Damit repräsentieren etwa

100×1001000 das Gesamtbild.

HSHL
Druckmuster_erstellen_Vollstaendig.mlx
Druckraster_erstellen_function.mlx
Druckraster_erstellen_function2.mlx

Dadurch würde man an sich mehr Rasterpunkte erhalten aber die einzelnen Dots wären nicht mehr so vielfältig und genau. Dann könnte man noch den Ansatz in Erwägung ziehen einfach beide Werte sehr stark zu vergrößern.

Dritter Versuch

Eingangsbild = 500x500 
RasterPerioden = 50;     % Rasterzellengröße
FaktorRadius   = 1;      % Punktgroessen-Faktor
ScaleFaktor    = 10;     % Bildskalierung

5001050100

5001050100

Damit repräsentieren etwa

100×1001000 das Gesamtbild.

HSHL
Druckmuster_erstellen_Vollstaendig.mlx
Druckraster_erstellen_function.mlx
Druckraster_erstellen_function2.mlx

Hier würde man wieder die gleiche Anzahl an Dots erhalten aber die Dots selber würden eine größere Varriation aufweisen. Trotzdem sind 100 dots für ein 5000x5000 relativ wenig. Und wenn man die Werte einfach noch mehr vergrößert wird das Bild genauer. Trotzdem muss man im klaren sein, dass sich das Bild proportional ebenso vergrößert durch den Skale Faktor und wenn das Bild sehr groß wird braucht die KI Zeitlich gesehen deutlich länger.

Letzter Versuch

Das sind Beispielhafte gute Werte:

Eingangsbild = 3000x4000 
RasterPerioden = 15;     % Rasterzellengröße
FaktorRadius   = 0.75;      % Punktgroessen-Faktor
ScaleFaktor    = 5;      % Bildskalierung

30005151000

40005151333

Damit repräsentieren etwa

1000×13331333000 das Gesamtbild. Außerdem erkennt man, dass sich wie aus dem Beispiel vorher erklärt das Bild sich sehr stark vergrößert (1500x20000)
PommesPizza_Druckmuster_erstellen_Vollstaendig.mlx
PommesPizza_Druckraster_erstellen_function.mlx
PommesPizza_Druckraster_erstellen_function2.mlx
Ein kleines Probelm

Eingangsbild = 481x321
RasterPerioden = 48;     % Rasterzellengröße
FaktorRadius   = 1;      % Punktgroessen-Faktor
ScaleFaktor    = 1;      % Bildskalierung

Die Abtastung erfolgt mit einer Rasterperiode von 48 Pixeln. Da 48 kein Teiler der Bildabmessungen ist, ergeben sich keine ganzzahligen Abtastpunkte:

4814810321486,7

Diese Werte beschreiben lediglich die Anzahl der Rasterperioden über dem Bild. Eine direkte Interpretation als Anzahl diskreter Bildpunkte ist nicht zulässig, da am Bildrand partielle Rasterzellen entstehen.

Trotzdem kann diese Rechnung einen ungefähren Wert Angeben wie viele Abtastpunkte entstanden sind!

KI_Test_Fertig.mlx

Mit dieser Datei lässt sich ein feines AM-Raster zuverlässig entfernen. Dazu muss in Schritt 2 lediglich der entsprechende Pfad angegeben werden. Um den Arbeitsspeicher effizient zu nutzen, wird beim Anwendungsbild ebenfalls mit Patches gearbeitet (Schritt 3).

Dabei ist zu berücksichtigen, wie viele Rasterzellen bei der Erstellung verwendet wurden. Entscheidend ist, dass die Patchgröße mindestens Rasterzellen × 16 beträgt, da sonst die KI aus einem grob gerasterten Bild schlecht das Orginal erstellt. In Versuch 1 hatten wir 10x10 was selbst fuer ein Patch zu klein ist weswegen es nichtmal sinnvoll ist diese zu testen.

Ergebnis von Versuch 2

Der Hintergrund ist, dass das Netzwerk während des Trainings stets mit einer ausreichenden Anzahl an Bildpunkten („Dots“) gearbeitet hat. Bei zu wenigen Punkten stehen dem Modell nicht genügend Informationen zur Verfügung, um verlässlich zu lernen und zu generalisieren.

Weiter Ergänzungen und Ideen

Hier ist ein Text

Schlusswort