# Deep Learning Lab 2021 - Challenge
[Klick: Zurück zum Teil 3 der "Exercises"](https://hackmd.io/Rs1zef_hQAKyKPDmWNbdPQ)
Anmeldung beim Repository-Hoster: https://bitbucket.org/
---
## ANSTEHEND
**Performance on clean data verbessern:**
* Dropouts benutzen R bis Donnerstag --> Downsampling vs. Upsampling
* Scheduler/Lernrate R bis Donnerstag 


* (Optimizer R später SGDM vs. ADAM)
* Pre-Processing (~~wie testet man 10%?~~) Kompression abklären
* Kompression bzw. Teile daraus (cos-Trafo, Koeff. weglassen) --> Stärke einstellbar R
* Adversial Training (Rauschen) F/T/R
* Normalisierung: Andere Ansätze, ggf. mehr Layer nutzen R/T
* Validation bzgl. perturbierter Daten F/T
Implementierung steht prinzipiell, Werte müssen noch überptüft werden, ob das Ganze auch das richtige macht


* IFGSM ([BIM](https://arxiv.org/pdf/2010.01950.pdf) in torchattack) und FFF (ist es ~~DeepFool~~?) ins Training mit aufnehmen F
* Test auf andere Attacken
Implementierung steht prinzipiell, Werte müssen noch überptüft werden, ob das Ganze auch das richtige macht

* (Anderen Datensatz zusätzlich zum Cityscapes laden)
**Adversial Training**
**!!!Wichtig!!!**
**Batchsize muss aktuell auf 1 gesetzt werden damit das Adversial Training funktioniert**
* Implementierung:
Hab in Bitbucket einen Branch Adversial Training erstellt. Hier eine kurze Erklärung:
Oben im Code ist eine Funktion definiert, derzeit ist erst die FGSM Methode getestet worden, aber das String argument "attack" soll später zur Auswahl der Attacke ausgewählt werden. Die Flag ist zum steuern ob Adversial Training angewendet werden soll oder nicht (True/False), bei "model" muss unser Netz übergeben werden und "usage" repräsentiert den Anteil von Adversial Exampels im Training (2 für jedes 2., 3 für jedes 3. ....)
Aufgerufen wird die Funktion vor der Trainingsschleife, hier wird dann entschieden ob Adversial Training angewendet wird oder nicht.

Zur FGSM_Attacke:
Diese wird einmal mit e1 und e10 angwendet, laut Namensgebung im Skript. Ich habe die Vermutung, dass das nicht direkt die Epsilons sind, sondern dass man 1/255 oder 10/255 (Hat glaub mit dem Farbspektrum zu tun) übergeben muss, um die jeweilige Attacke auszuführen.
Hier mal ein paar Ergebnisse als Anhaltspunkte:
* Parameter: 10 Epochen , von scratch, eps = 10/255 , jedes Sample als adv
Attack mIoU
single_fgsm_bs_e1 0.249586
single_fgsm_bs_e10 0.351039
avg_attack 0.300313
clean 0.298335

Kommentar: Man erkennt, dass mit eps = 10/255 speziell die e10 Attacke verbessert wird, aber dass das Training mit so einer starken Attake auf die Trainingsdaten natürlich die eigentliche Klassifikation deutlich verschlechtert.
* Parameter: ca. 50 Epochen , von scratch, eps = 1/255 , jedes Sample als adv
Attack mIoU
single_fgsm_bs_e1 0.452962
single_fgsm_bs_e10 0.277066
avg_attack 0.365014
clean 0.535724

Kommentar: Mit eps = 1/255 bleiben die Werte bei e1 gleich zur Base, e10 verbessert sich auch noch deutlich und bei clean wird man nicht all zu schlechter, da die Attacke nicht so stark ist.
* Parameter: ca. 50 Epochen , von scratch, eps = 1/255 , jedes 2. Sample als adv
Attack mIoU
single_fgsm_bs_e1 0.476709
single_fgsm_bs_e10 0.208934
avg_attack 0.342821
clean 0.596404

Kommentrar: Gleiche Parameter wie beim oberen Beispiel nur jetzt wird nur jedes 2.Sample "pertubiert". Logischerweise ist nun die clean Performance besser und die Verbesserung vor allem in e10 nicht mehr so gut.
* Parameter: ca. 50 Epochen , pre trained, eps = 1/255 , jedes Sample als adv
Attack mIoU
single_fgsm_bs_e1 0.500731
single_fgsm_bs_e10 0.287251
avg_attack 0.393991
clean 0.613930

Kommentar: Mit dem pre trained Modell ist die clean und e1 performance verglichen mit base sehr ählich bzw. besser in e1. Zudem erzielt man eine sehr gute Performance bei e10 --> scheint der richtige Weg zu sein!
Man muss jetzt natürlich noch die optimalen Parameter finden.
[Klick: Informationen/ Doku zu torchattacks](https://pypi.org/project/torchattacks/).
---
## Infos zur Challenge


## Literatur zum Semantischen Segmentierung
**mIoU**: mean Intersection over Union
[How we use image semantic segmentation](https://medium.com/digitalbridge/how-we-use-image-semantic-segmentation-e85fac734caf)
## Literatur zum Thema ERFNet

[Efficient ConvNet for Real-time Semantic Segmentation](http://www.robesafe.uah.es/personal/eduardo.romera/pdfs/Romera17iv.pdf)
[ERFNet: Efficient Residual Factorized ConvNet forReal-time Semantic Segmentation](http://www.robesafe.uah.es/personal/eduardo.romera/pdfs/Romera17tits.pdf)
* Sonst: sehr tiefe Netze bringen irgendwann keine starken Performance-Verbesserungen, schwer zu rechnen (auch on-board --> viel Rechenpower benötigt)
* Ansatz hier: statt Tiefe in die Breite (Feature Dimension) gehen, unter Verwendung eines Res-Nets
* Folgender Aufbau wird verwendet ("Non-bt" bedeutet "Non bottleneck"):

## Wikipedia zu "Adversial Attack"
*Unter einer Adversarial Attack (zu deutsch „feindlicher Angriff“) versteht man im Kontext von Künstlicher Intelligenz (KI) bzw. Deep Learning die Verwendung von Adversarial Examples (zu Deutsch „feindliche Beispiele“) zur Manipulation der Klassifikationsergebnisse. Ein Adversarial Example ist ein speziell manipuliertes Eingangs-Signal in ein künstliches Neuronales Netzwerk, welches dieses absichtlich zu Fehlklassifikationen verleitet. Die Manipulation wird so vorgenommen, dass ein menschlicher Beobachter diese nicht bemerkt oder nicht als solche erkennt. Beispielsweise bei einem zur Objekterkennung trainierten neuronalen Netzwerk könnten die Pixel eines Bildes leicht verändert werden, sodass diese Veränderungen für Menschen nicht sichtbar sind, das Netzwerk die Objekte auf dem Bild jedoch falsch zuordnet.*
*In allen Anwendungsbereichen neuronaler Netzwerke konnte die Anfälligkeit für Adversarial Examples gezeigt werden. Aufgrund der zunehmenden Erfolge tiefer neuronaler Netzwerke und deren Einsatz in sicherheitskritischen Aufgaben, wie im autonomen Fahren zur Erkennung von Verkehrsschildern, rücken Adversarial Attacks und Methoden zur Abwehr oder Erkennung solcher Adversarial Examples zunehmend in den Fokus der KI-Forschung.*
[Zum Artikel](https://de.wikipedia.org/wiki/Adversarial_Attack)
#### Auswirkungen eines Adversial Attacks
Die Auswirkungen eines Angriffs sind in dem [Paper zur Fast Gradient Sign Method (FGSM)](https://arxiv.org/pdf/1710.06081.pdf) illustriert:

## Benchmark Baseline

Best epoch is 108, with Val-IoU= 0.6761
Zum Vergleich die Daten aus dem [Paper](http://www.robesafe.uah.es/personal/eduardo.romera/pdfs/Romera17tits.pdf):

--> Attacke auf das Modell mit den Gewichten aus dem Training 108 liefert folgende Performance:

## Literaturrecherche Attackenabwehr
### Multi-task Learning
https://arxiv.org/abs/2004.11072
Zusammenfassung: Nutzen von Multitask-learning um das NN robuster zu machen. In diesem Fall wird ein anderer Datensatz benutzt, um eine Tiefenschätzung der Pixel in den Daten zu machen. Das ganze wird "self-supervised" umgesetzt. Die eigentliche Trainingsaufgabe wird natürlich auch noch umgesetzt. Man erhofft sich allerdings durch das zusätzliche Training mit der Tiefenschätzung robuster gegen Attacken zu seim (Auch die normale performance wurde hier gesteigert). Das Paper ist von Marvin und hier wird "zufällig" der Datensatz KITTI mit genutzt den wir nicht benutzen dürfen. Sprich das sieht für mich aus, dass wir ziemlich genau die Aufgabe behandeln, über die er das Paper geschrieben hat.
### Adversial Training
https://arxiv.org/pdf/1412.6572.pdf
Zusammenfassung: Hier wird von der Methode des Adversial Training gesprochen. Dies bedeutet das man beim Training nicht nur die klassischen Transforamtionen wie Rotation, Translation... andwendet (bei denen geht man davon aus das reale Bilder später so aussehen könnten), sondern speziell versucht Tranformationen herbeizuführen die der späteren Attacke entsprechen und so das Netz robust gegen solche Attacken zu machen. Hierfür wird ein spezieller Regularisierer eingebunden. (Vielleicht ist diese recht leicht implementierbar?)
J˜(θ, x, y) = αJ(θ, x, y) + (1 − α)J(θ, x + sign (∇xJ(θ, x, y))
In diesem Paper wird auch erwähnt, dass früher Dropouts der Standard machen um die Robustheit zu fördern, sprich das ich auf jeden Fall ein Versuch wert, da es leicht umzusetzen ist.
> [name=robKay]Finde ich sehr gut! Dieses Training ist ja sozusagen das "Basis-Training" zur Reduktion der Auswirkungen der Attacken von FGSM bzw. I-FGSM
Hier noch ein vielversprechender Github-Link: https://github.com/mahyarnajibi/FreeAdversarialTraining
### Pre-Processing strategies
https://arxiv.org/pdf/1711.00117.pdf
Zusammenfassung: Anwenden von verschiedenen Pre-Processing Strategien um das NN robuster zu machen. Hierbei sind im Paper verschiedene Strategien aufegführt: : (1) image cropping and rescaling, (2) bit-depth reduction, (3) JPEG compression, (4) total variance minimization, and (5) image quilting
Ich denke die umsetzung sollte verglichen zu anderen Versuchen "relativ" einfach sein und ist daher eventuell ein guter Schritt zum anfangen. Zusätzlich ist im Paper der zugehörige Code verlinkt:
https://github.com/facebookarchive/adversarial_image_defenses
Problematisch: Das Ergebnis des Papers ist, dass nicht differntierbare Pre-Processing Strategien das beste Ergebnis bringen, da diese schwierig zum attakieren sind. Das stimmt mit der Aussage von Jasmin überein und bestätigt die Regel, dass wir unsere Pre-Processing mit 10% Abweichung approximieren können müssen, wenn es nicht vollständig differnzierbar ist. Aber Jasmin meinte ja, dass die 10% relativ viel sind, deshalb wäre zu schauen welche der oben genannten Funktionen überhaupt in Frage kommen würden.
> [name=robKay]Das sehe ich genauso. Sie hat sehr viel vom Pre-Processing gesprochen. Hier würde ich bzgl. Recherche einen ersten Schwerpunkt setzen wollen
> [DiffJPEG](https://github.com/mlomnitz/DiffJPEG)
> [StackOverflow: Diff. image compression](https://stackoverflow.com/questions/61132905/differentiable-image-compression-operations-in-pytorch)
> [Torch DCT](https://github.com.cnpmjs.org/zh217/torch-dct)
> [TorchJPEG Beta](https://pypi.org/project/torchjpeg/)
> [name=robKay] [Normalisierungslayer, angeblich differenzierbar!](https://github.com/jorge-pessoa/pytorch-gdn)
> [name=robKay] Link von Tom: [https://github.com/awaisrauf/RobustNorm](https://github.com/awaisrauf/RobustNorm)
### TRADES
https://arxiv.org/pdf/1901.08573.pdf
Zusammenfassung: Ein Algorithmus der mehrere Preise in dem Bereich gewonnen hat. Genauere Zusammanfassung folgt noch...
Auf jeden Fall gibt es auch Code dazu:
https://github.com/yaodongyu/TRADES
### Distillation
[Zum Paper "Distillation as a Defense to Adversarial Perturbations against Deep Neural Networks"](https://arxiv.org/pdf/1511.04508.pdf)
[Vortrag eines der Autoren zum Thema](https://www.youtube.com/watch?v=oQr0gODUiZo)
Zusammenfassung: Es handelt sich um einer adversiale Trainingstechnik, die mehr Flexibilität zu einem Klassifikationsalgorithmus hinzufügt. Es wird hier ein zweites Netz trainiert, das auf Basis der Outputs des ersten Netzes wie ein Filter wirkt und die Ergebnisse sozusagen "destilliert".
Vorteile:
* Adaptiert an unbekannte Attacken
* "Leicht" zu Implementieren, wenig Overhead nötig (zweimaliger Trainingsdurchlauf)
* Akzeptable Auswirkungen auf Accuracy
Nachteil:
* Angriffe mit einer riesigen Rechenpower oder ein sog. "poisoning attack" legt das Gesamtsystem dann doch lahm. Das sind aber tatsächlich "corner cases", um die ich mir erstmal keine Sorgen machen würde :D
Weitere Zusammenfassungen auf englisch:
https://deepai.org/machine-learning-glossary-and-terms/defensive-distillation
https://medium.com/@hyponymous/paper-summary-distillation-as-a-defense-to-adversarial-perturbations-against-deep-neural-networks-b68970789bfc
## Literaturrecherche Attacken
### Fast Gradient Sign Method (FGSM)
[Paper zu Fast Gradient Sign Method (FGSM)](https://arxiv.org/abs/1710.06081)
Zusammenfassung folgt...
https://pytorch.org/tutorials/beginner/fgsm_tutorial.html
### Iterative Fast Gradient Sign Method (I-FGSM)
[Paper zu Iterative Fast Gradient Sign Method (I-FGSM)](https://arxiv.org/abs/1607.02533)
Zusammenfassung folgt später im Projekt (geplant: nach Pre-Submission)...
### Fast Feature Fool (FFF)
[Paper zu Fast Feature Fool (FFF)](https://arxiv.org/abs/1801.08092)
Zusammenfassung folgt später im Projekt (geplant: nach Pre-Submission)...
### Weitere Attacken
* Jacobian Based Saliency Approach