Projektaufbau – Entrauschungs-KI: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
| Zeile 122: | Zeile 122: | ||
end</syntaxhighlight> | end</syntaxhighlight> | ||
= 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.}, | * 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.}, | ||
Version vom 12. Dezember 2025, 11:07 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
./PatchesCreatedByThisScriptInOrderToProperlyTrainTheAIabgelegt. - 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.},