Projektaufbau – Entrauschungs-KI: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Adrian.klinspon@stud.hshl.de (Diskussion | Beiträge)
Adrian.klinspon@stud.hshl.de (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
= Aufbau =
= Aufbau =
Dieses Projekt implementiert ein Denoising Convolutional Neural Network (DnCNN) in MATLAB. Es dient dazu, Bildrauschen aus digitalen Bildern zu entfernen. Das System besteht aus drei Hauptmodulen: Training, Evaluierung und Datensatz-Verrauschung.
Dieses Projekt implementiert ein Denoising Convolutional Neural Network (DnCNN) in MATLAB unter Verwendung von Residual Learning. Es dient dazu, Bildrauschen aus digitalen Bildern zu entfernen. Im Gegensatz zu klassischen Ansätzen lernt das Netz hierbei das Rauschen selbst (Residual) und subtrahiert es vom Eingangsbild.


== Technische Voraussetzungen ==
== Technische Voraussetzungen ==
Zeile 6: Zeile 6:
* Deep Learning Toolbox
* Deep Learning Toolbox
* Image Processing Toolbox
* Image Processing Toolbox
* Parallel Computing Toolbox


= Training (<code>DnCnnTrain.m</code>)=
= Training (<code>DnCnnTrain.m</code>)=
Trainiert das neuronale Netz mit Bildern aus dem Ordner <code>./BSDS500</code>.
Trainiert das neuronale Netz mit Bildern aus dem Ordner <code>./BSDS500</code>.


== Funktionsweise & Code ==
== Funktionsweise ==
Es werden saubere Bilder geladen, bei denen dynamisch beim Training Rauschen hinzugefügt wird. Des Weiteren wird die GPU-Kompatibilität erzwungen, damit auch GPUs ab der 30er-Serie von NVIDIA verwendet werden können. <br>
Im Gegensatz zu einfachen Ansätzen lädt dieses Skript nicht ganze Bilder, sondern zerlegt diese in kleine Ausschnitte (Patches), um den GPU-Speicher effizient zu nutzen und die Trainingsmenge zu erhöhen.
<syntaxhighlight lang="matlab">% GPU-Kompatibilität für RTX 30er/40er/50er
 
* '''Patch-Extraktion:''' Bilder werden in 50x50 Pixel große Quadrate zerlegt (Stride: 30px).
* '''Speicherung:''' Patches werden physisch im Ordner <code>./PatchesCreatedByThisScriptInOrderToProperlyTrainTheAI</code> abgelegt.
* '''Architektur:''' Ein 15-Layer tiefes CNN mit Residual Learning (Regression Layer am Ende).
* '''Optimiser:''' Verwendet ADAM mit dynamischer Anpassung der Lernrate (Piecewise Drop).
 
== Code-Auszug ==
<syntaxhighlight lang="matlab">% Konfiguration
patchSize = 50;
networkDepth = 15;
numFilters = 64;
 
% GPU-Kompatibilität erzwingen
parallel.gpu.enableCUDAForwardCompatibility(true);
parallel.gpu.enableCUDAForwardCompatibility(true);


% Laden der sauberen Bilder
% Netzwerk-Architektur (Auszug)
CleanImages = imageDatastore('./BSDS500', 'IncludeSubfolders', true);
layers = [
    imageInputLayer([patchSize patchSize channels], "Normalization", "none")
    convolution2dLayer(3, numFilters, 'Padding', 'same')
    batchNormalizationLayer
    reluLayer
];


% Dynamische Rausch-Generierung (keine festen verrauschten Dateien nötig)
% Dynamischer Aufbau der mittleren Layer
NoisyTrain = denoisingImageDatastore(CleanImages, 'ChannelFormat', 'grayscale');
for i = 2:(networkDepth-1)
    layers = [
        layers
        convolution2dLayer(3, numFilters, 'Padding', 'same')
        batchNormalizationLayer
        reluLayer
    ];
end


% Konfiguration (SGDM Optimizer)
% Abschluss (Residual Learning)
options = trainingOptions('sgdm', ...
layers = [
     'InitialLearnRate', 1e-3, ...
    layers
    'MaxEpochs', 1, ...
     convolution2dLayer(3, channels, "Padding","same")
     'MiniBatchSize', 128, ...
     batchNormalizationLayer
     'ExecutionEnvironment', 'auto'); % Nutzt GPU automatisch
     regressionLayer
];


% Training starten
% Training starten
net = trainnet(NoisyTrain, layer, 'mse', options);</syntaxhighlight>
options = trainingOptions("adam", ...
'MaxEpochs', 70, ...
'ExecutionEnvironment', 'gpu', ...
);
net = trainNetwork(dsTrain, lgraph, options);</syntaxhighlight>


= Evaluierung (<code>DnCnnEval.m</code>) =
= Evaluierung (<code>DnCnnEval.m</code>) =
Wendet das trainierte Modell auf neue Bilder im Ordner <code>./Testbilder</code> an.
Wendet das trainierte Modell auf neue Bilder im Ordner <code>./Testbilder</code> an.


== Funktionsweise & Code ==
== Funktionsweise ==
Da das DnCNN auf Graustufenbildern trainiert wurde, werden RGB-Bilder zunächst in ihre Rot-, Grün- und Blaukanäle zerlegt, separat entrauscht und anschließend wieder zu einem Farbbild zusammengeführt.<br>
* '''Preprocessing:''' Lädt Bilder und konvertiert Graustufenbilder künstlich in 3-Kanal-Bilder (RGB), um die Kompatibilität mit dem Netz zu gewährleisten.
* '''Rauschen:''' Falls das Bild als "sauber" markiert ist, fügt das Skript automatisch Gaußsches Rauschen hinzu.
* '''Visualisierung:''' Erstellt eine "Input vs. Output"-Collage.
 
== Code-Auszug ==
<syntaxhighlight lang="matlab">% Modell laden
<syntaxhighlight lang="matlab">% Modell laden
loadNet = load('./KIs/Name.mat');
if ~exist('net', 'var')
net = loadNet.net;
    data = load("Path/AI_InitialLearnRate_1e-3.mat");
    net = data.net;
end


% Farbbilder verarbeiten (RGB Split)
% Rauschen hinzufügen (falls nötig)
[h, w, c] = size(img);
if ~isImageNoisy
if c == 3
     imgDouble = imnoise(imgDouble, "gaussian", 0, 0.03);
    % Kanäle trennen
    R = img(:, :, 1); G = img(:, :, 2); B = img(:, :, 3);
   
    % Einzeln entrauschen
    RDenoise = denoiseImage(R, net);
    GDenoise = denoiseImage(G, net);
    BDenoise = denoiseImage(B, net);
   
    % Zusammenfügen
     dImg = cat(3, RDenoise, GDenoise, BDenoise);
else
    dImg = denoiseImage(img, net);
end
end


% Vergleich erstellen (Collage)
% Entrauschen
collage = imtile({img, dImg}, 'GridSize', [1 2]);
imgRestored = denoiseImages(net, imgDouble, 50, 50/2, true);
imwrite(collage, outPath);</syntaxhighlight>
 
% Collage erstellen (Input | Separator | Output)
separatorWidth = 20;
separator = ones(h, separatorWidth, 3);
collage = [imgDouble, separator, imgRestored];
 
% Beschriftung einfügen
textLabels = {'Input', 'Output'};
positions = [10, 10; (w + separatorWidth + 10), 10];
 
collage = insertText(collage, positions, textLabels, ...
    'FontSize', max(20, round(h/25)), ...
    'BoxColor', 'white', ...
    'BoxOpacity', 0.7);
 
imwrite(collage, saveName);</syntaxhighlight>


= Rausch-Generator Tool (<code>DnCNNNoise.m</code>) =
= Rausch-Generator Tool (<code>DnCNNNoise.m</code>) =

Version vom 12. Dezember 2025, 11:06 Uhr

Aufbau

Dieses Projekt implementiert ein Denoising Convolutional Neural Network (DnCNN) in MATLAB unter Verwendung von Residual Learning. Es dient dazu, Bildrauschen aus digitalen Bildern zu entfernen. Im Gegensatz zu klassischen Ansätzen lernt das Netz hierbei das Rauschen selbst (Residual) und subtrahiert es vom Eingangsbild.

Technische Voraussetzungen

MATLAB mit folgenden Toolboxen:

  • Deep Learning Toolbox
  • Image Processing Toolbox
  • Parallel Computing Toolbox

Training (DnCnnTrain.m)

Trainiert das neuronale Netz mit Bildern aus dem Ordner ./BSDS500.

Funktionsweise

Im Gegensatz zu einfachen Ansätzen lädt dieses Skript nicht ganze Bilder, sondern zerlegt diese in kleine Ausschnitte (Patches), um den GPU-Speicher effizient zu nutzen und die Trainingsmenge zu erhöhen.

  • Patch-Extraktion: Bilder werden in 50x50 Pixel große Quadrate zerlegt (Stride: 30px).
  • Speicherung: Patches werden physisch im Ordner ./PatchesCreatedByThisScriptInOrderToProperlyTrainTheAI abgelegt.
  • Architektur: Ein 15-Layer tiefes CNN mit Residual Learning (Regression Layer am Ende).
  • Optimiser: Verwendet ADAM mit dynamischer Anpassung der Lernrate (Piecewise Drop).

Code-Auszug

% Konfiguration
patchSize = 50;
networkDepth = 15;
numFilters = 64;

% GPU-Kompatibilität erzwingen
parallel.gpu.enableCUDAForwardCompatibility(true);

% Netzwerk-Architektur (Auszug)
layers = [
    imageInputLayer([patchSize patchSize channels], "Normalization", "none")
    convolution2dLayer(3, numFilters, 'Padding', 'same')
    batchNormalizationLayer
    reluLayer
];

% Dynamischer Aufbau der mittleren Layer
for i = 2:(networkDepth-1)
    layers = [
        layers
        convolution2dLayer(3, numFilters, 'Padding', 'same')
        batchNormalizationLayer
        reluLayer
    ];
end

% Abschluss (Residual Learning)
layers = [
    layers
    convolution2dLayer(3, channels, "Padding","same")
    batchNormalizationLayer
    regressionLayer
];

% Training starten
options = trainingOptions("adam", ...
'MaxEpochs', 70, ...
'ExecutionEnvironment', 'gpu', ...
);
net = trainNetwork(dsTrain, lgraph, options);

Evaluierung (DnCnnEval.m)

Wendet das trainierte Modell auf neue Bilder im Ordner ./Testbilder an.

Funktionsweise

  • Preprocessing: Lädt Bilder und konvertiert Graustufenbilder künstlich in 3-Kanal-Bilder (RGB), um die Kompatibilität mit dem Netz zu gewährleisten.
  • Rauschen: Falls das Bild als "sauber" markiert ist, fügt das Skript automatisch Gaußsches Rauschen hinzu.
  • Visualisierung: Erstellt eine "Input vs. Output"-Collage.

Code-Auszug

% Modell laden
if ~exist('net', 'var')
    data = load("Path/AI_InitialLearnRate_1e-3.mat");
    net = data.net;
end

% Rauschen hinzufügen (falls nötig)
if ~isImageNoisy
    imgDouble = imnoise(imgDouble, "gaussian", 0, 0.03);
end

% Entrauschen
imgRestored = denoiseImages(net, imgDouble, 50, 50/2, true);

% Collage erstellen (Input | Separator | Output)
separatorWidth = 20;
separator = ones(h, separatorWidth, 3);
collage = [imgDouble, separator, imgRestored];

% Beschriftung einfügen
textLabels = {'Input', 'Output'};
positions = [10, 10; (w + separatorWidth + 10), 10];

collage = insertText(collage, positions, textLabels, ...
    'FontSize', max(20, round(h/25)), ...
    'BoxColor', 'white', ...
    'BoxOpacity', 0.7);

imwrite(collage, saveName);

Rausch-Generator Tool (DnCNNNoise.m)

Ein Hilfsskript, um einen kompletten Ordner von Bildern permanent zu verrauschen, falls Testdaten benötigt werden.

Funktionsweise & Code

Nutzt eine grafische Oberfläche (GUI) zur Ordnerauswahl und die Image Processing Toolbox (imnoise), um mathematisch exaktes Rauschen hinzuzufügen.

% User Interface für Auswahl
noiseChoice = questdlg('Which noise for ALL images?', 'Noise Type', ...
    'Salt & Pepper', 'Gaussian', 'Speckle', 'Gaussian');

% Rauschen anwenden
switch noiseChoice
    case 'Salt & Pepper'
        % Fügt "Salz und Pfeffer"-Rauschen hinzu (Dichte: 0.05)
        imgNoisy = imnoise(img, 'salt & pepper', 0.05);
    case 'Gaussian'
        % Fügt Gaußsches Rauschen hinzu (Mittelwert 0, Varianz 0.01)
        imgNoisy = imnoise(img, 'gaussian', 0, 0.01);
    case 'Speckle'
        % Fügt multiplikatives Rauschen hinzu (Varianz 0.04)
        imgNoisy = imnoise(img, 'speckle', 0.04);
end

Quellen

  • P. Arbeláez, M. Maire, C. Fowlkes and J. Malik, "Contour Detection and Hierarchical Image Segmentation," in IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 33, no. 5, pp. 898-916, May 2011, doi: 10.1109/TPAMI.2010.161. keywords: {Image segmentation;Pixel;Detectors;Image edge detection;Humans;Histograms;Benchmark testing;Contour detection;image segmentation;computer vision.},