Skip to content
Snippets Groups Projects
Commit f271fe8e authored by Jupyter Autodeployer's avatar Jupyter Autodeployer
Browse files

updated notebooks

parent 5d0f73f4
Branches
No related tags found
No related merge requests found
%% Cell type:markdown id:f126ef25-6172-4cf0-86db-ce87deb76f0b tags:
# Kickoff
%% Cell type:markdown id:039a40ed-476b-46bd-9436-980c5b420889 tags:
Ziele:
Ziele für heute:
- [ ] Gruppen eintragen
- [ ] Coaches kennen lernen
- [ ] Autos übernehmen
- Material auf Komplettheit prüfen
- [ ] mit dem Auto verbinden
- Raspberry-Pi Kennenlernen
- HotSpot einrichten
- Daten übertragen/SSH Verbindung
- Sicherstellen, dass:
- fahren möglich
- Aufnahme möglich
- Daten Übertragbar
- [ ] Logins erstellen
- Zugänge prüfen
%% Cell type:markdown id:cd755543-e0bf-4e08-9411-7245f66f5275 tags:
Material:
* Fahrzeuge
* Laptops
* Strom
* ...
* Autos übernehmen
* Ablauf durchgehen
* Coaches Kennenlernen
* Logins erstellen
* Parat für "Homework"
* Fragen klären
* Spass haben
Alles! :-)
%% Cell type:markdown id:53d47112-d3db-452a-aacd-0c58f97f957b tags:
## Ablauf
%% Cell type:markdown id:bbfcef0f-89a2-4e79-b97f-25d60442da95 tags:
......
%% Cell type:code id:38b90e01-eaef-4f24-8433-aa6cd4672a1e tags:
%% Cell type:markdown id:82d3e06a-b63d-428b-b076-dd1e4a518fc8 tags:
# Weiterführende Links
Wir verwenden die fastai-Library. Für alle Interressierte gibt es den umfangreichen Kurs gratis (englisch).
Einstieg über die Seite: https://fast.ai.
%% Cell type:code id:cc19c041-288b-4c12-8694-fabd94e55cff tags:
``` python
```
......
%% Cell type:markdown id:11afed6e-38ec-4dde-9b76-aa5343ac1d7e tags:
# Einleitung
WAS PASSIERT HIER
%% Cell type:markdown id:393d9c47-cbe1-4301-bd75-c97f641fe35e tags:
# Imports
Zuerst müssen die benötigten Namespaces und Funktionen aus den verschiedenen Libraries importiert werden.
Um alle Funktionen aus fastai zu importieren könnte man auch das verwenden:
```python
from fastai import *
from fastai.vision import *
```
Diese Methode ist jedoch eher unschön, da man den Überblick nicht hat, welche Namespaces man importiert hat. Falls man so mehrere Namespaces mit dem selbden Namen importiert, dann gewinnt der letzte. Als Beispiel: fastai hat einen Namespace mit dem Namen `Model`, welchen man hier nicht explizit gebraucht wird. Pytorch hat ebenfalls einen Namespace mit dem Namen `Model`, welcher gebraucht wird. Wenn man also `*` importiert kann es zu verwirrung führen welcher `Model`-Namespace jetzt verwendet wird oder von welcher Library dieser überhaupt kommt.
Darum ist es immer besser nur explizit Namespaces und Funktionen zu importieren
%% Cell type:code id:08ae75c1-c131-4f74-8976-bdf9846702bd tags:
``` python
from fastcore.foundation import L
from fastcore.xtras import Path # @patch'd properties to the Pathlib module
from fastai.callback.schedule import fit_one_cycle, lr_find
from fastai.data.block import CategoryBlock, DataBlock
from fastai.data.transforms import get_image_files, RandomSplitter
from fastai.learner import Learner
from fastai.metrics import error_rate
from torchvision.models.resnet import resnet34
import torchvision.models as torch_models
from fastai.vision.all import (
aug_transforms,
ImageBlock,
RegressionBlock,
vision_learner,
PILImage,
)
import json
import matplotlib.pyplot as plt
```
%% Cell type:markdown id:e599033f-4f77-4e6c-99a3-d78bb8ef1d74 tags:
# Datei-Ablage
In diesem Abschnitt wird definiert, in welchem Ordner die Trainingsdaten gespeichert sind. Hier wird angenommen, das in dem Ordner immer pro Bild-Datei eine JSON-Datei mit demselben Namen befindet. Anschliessend wird überprüft, ob der Ordner existiert und das Resultat wird ausgegeben.
- `image_path`: Variablenname für den Dateipfad
%% Cell type:code id:0cc3ae95-d44f-4e68-a635-e358604f1cd6 tags:
``` python
image_path = Path('data/results/<meine_resultate>')
image_path.exists()
```
%% Output
False
%% Cell type:markdown id:35bfed02-eba3-410a-8181-403b058d069f tags:
# Daten aus einer JSON-Datei auslesen
In einem nächsten Schritt wird eine Funktion definiert, bei die nötigen Daten aus einer JSON-Datei ausliest und in einer Liste zurück gibt:
```python
def read_data_from_json(image):
```
- `image`: Ist der Posix Pfad zu dem Bild
%% Cell type:code id:0f14ac6d-0a46-4530-8da2-5aa9f633a5fc tags:
``` python
def read_data_from_json(image):
with open(image_path/f'{image.stem}.json') as f:
json_file = json.load(f)
return[float(json_file['throttle']), float(json_file['steering'])]
```
%% Cell type:markdown id:78f095cb-d4c6-4a9f-a60f-f3be30cfc746 tags:
# Testen
Nun ein kruzer Test der bereits erstellen Funktionalitäten. Dafür wird ein Bild geladen als PILImage.
So kann man ganz einfach ein PILImage aus einem bestehenden Bild erstellen und anzeigen lassen:
%% Cell type:code id:86cf73d1-ff45-4564-880e-fe8af9eafd22 tags:
``` python
img = PILImage.create(image_path/'2022-10-18T14:15:52.011617.png')
img.show()
```
%% Output
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
Input In [3], in <cell line: 1>()
----> 1 img = PILImage.create(image_path/'2022-10-18T14:15:52.011617.png')
2 img.show()
File /opt/conda/lib/python3.10/site-packages/fastai/vision/core.py:123, in PILBase.create(cls, fn, **kwargs)
121 if isinstance(fn,ndarray): return cls(Image.fromarray(fn))
122 if isinstance(fn,bytes): fn = io.BytesIO(fn)
--> 123 return cls(load_image(fn, **merge(cls._open_args, kwargs)))
File /opt/conda/lib/python3.10/site-packages/fastai/vision/core.py:98, in load_image(fn, mode)
96 def load_image(fn, mode=None):
97 "Open and load a `PIL.Image` and convert to `mode`"
---> 98 im = Image.open(fn)
99 im.load()
100 im = im._new(im.im)
File /opt/conda/lib/python3.10/site-packages/PIL/Image.py:3092, in open(fp, mode, formats)
3089 filename = fp
3091 if filename:
-> 3092 fp = builtins.open(filename, "rb")
3093 exclusive_fp = True
3095 try:
FileNotFoundError: [Errno 2] No such file or directory: '/home/jovyan/work/data/results/<meine_resultate>/2022-10-18T14:15:52.011617.png'
%% Cell type:markdown id:de74132c-34f6-4855-bea5-cba97b7ad218 tags:
Als nächstes noch die `read_data_from_json` Funktion aufrufen
%% Cell type:code id:f1c5763e-d5ec-4e55-9d61-2cdb29f0f338 tags:
``` python
read_data_from_json(Path(image_path/'2022-10-18T14:15:52.011617.png'))
```
%% Cell type:markdown id:b5a758ae-c751-4817-bf0a-3ec165feb77a tags:
# Datenblock
Jetzt ist alles so vorbereitet, dass man das Training mit der AI aufsetzten kann. Um damit zu beginnen muss zuerst ein `Datablock` erstellt werden. Ein Datablock ist einfach gesagt nichts anderes als ein Packet für eine genormte Schnittstelle. Das heisst, dass es sehr einfach ist anzugeben, was für Daten sind der Input, von wo kommen diese Daten, was ist der Ziel Output etc.
Da es sich hier um das Trainieren handelt werden sowohl der Erwartete Input, wie auch der dazugehörige Output benötigt.
Ein Datablock erstellt man relativ einfach:
%% Cell type:code id:4e935563-92bc-4b4a-ada6-e30e041929d9 tags:
``` python
data_block = DataBlock(blocks=(ImageBlock, RegressionBlock(n_out=2)),
get_items=get_image_files,
splitter=RandomSplitter(),
get_y=read_data_from_json)
```
%% Cell type:markdown id:06c9fb7d-6ea3-40b7-81f6-07978d75ee82 tags:
- `blocks`: Definiert mit welchen Daten das Model arbeiten wird. Meistens werden mind. zwei Blöcke definiert. Der erste Block spezifiziert die Input-Daten und der zweite Block die erwarteten Output-Daten sind. In diesem Beispiel werden Bilder als Input erwartet und als Output ein RegressionBlock mit zwei Ausgabewerten. Anhand dieser Regression wird versucht einem Bild Werte zuzuweisen. Der Grund wieso es zwei Outputs hat ist, dass es einmal für die Steuerung und einmal für die Geschwindigkeit ist.
- `get_items`: Von wo die Input-Daten gelesen werden. In diesem Fall wird die Methode `get_image_files` verwendet, welche Bilder aus einem Verzeichnis lädt.
- `splitter`: Für das Trainieren von Daten muss bestummen werden, welche Daten für das Training und welche für die anschliessende Validierung genutzt werden. Dies kann man zufällig machen mit einem `RandomSplitter`, aber es gibt auch Methoden, wo der Nutzer dies selber definieren kann z.B. einem `FileSplitter`
- `get_y`: Wie der Output definiert wird von den Input-Daten. Hier wird die Methode 'read_data_from_json' genutzt, beiwelcher definiert wurde, dass Anhand eines Bildes die Steuerung und das Tempo ausgelesen wird.
- `item_tfms`: Falls Bilder zu gross sind, kann diese Methode verwendet werden, um eine Transformation auf allen Bildern auszuführen, wie z.B. zuscheiden, verkleiner, hereinzoomen etc.
%% Cell type:markdown id:3fba30f5-2dae-4d3c-9640-3faa3defb452 tags:
# Dataloaders
Mit der fertigstellung des DataBlocks ist nun definiert, wie unsere Daten Strukturiert, Kategorisiert und Bearbeitet werden müssen. Als nächstes folg die Erstellung eines `DataLoaders`.
%% Cell type:code id:1b6789e5-c1b2-4438-8286-8709a1334bcc tags:
``` python
data_loaders = data_block.dataloaders(Path(image_path), bs=4)
```
%% Cell type:markdown id:2bfba668-c9b5-4bf5-99b7-1636c8fc1a33 tags:
Zuerst wird der Pfad angegeben, bei welcher der DataBlock die Bilder sucht. Die Variable `bs` steht für die Batch_Size.
Ein DataLoaders ist eine Iterator-Klasse, welche vom DataBlock aufgerufen wird um die Daten in Chunks zu laden anhand der definierten Batch-Size. Also der DataLoaders erzeugt mehrere `DataLoader` Einheiten. In einem DataLoader sind die Daten dann bereits vorbereitet und ready.
Man kann so ein Batch sich auch anzeigen lassen
%% Cell type:code id:556d6b72-bf44-4a6e-a8bb-2efee0963a8d tags:
``` python
data_loaders.show_batch()
```
%% Cell type:code id:0a95e460-31b4-4632-8bcd-d74988f068b6 tags:
%% Cell type:markdown id:f04e2aea-66e3-4503-aef6-cc308ddeec9d tags:
# Learner
Der nächste Schritt ist es eine `learner` zu erstellen. Der Learner fasst ein `Model`, mehrere `DataLoader` und eine `loss_function` zusammen in eine Methode. Die Dataloader wurden bereits erstellt, bzw. Die Iterator-Klasse `DataLoaders`.
Die erste Frage ist es, welche Art von `Learner` gebraucht wird. Hier wird ein `Vision Learner` genutzt. Der Vision Learner ist ein sogenannter CNN (Convolutional Neural Network) Learner. Ein CNN ist ein Netzwerk, dass für die Erkennung und Klassifizierung von Bildern genutzt wird. Anhand von übertragbaren lernen kann dieses Netzwerk für die Bildererkennung genutzt werden.
## Model
Eine Wichtige Entscheidung, die hier getroffen werden muss, ist die Entscheidung welches `Model` vewendet werden soll. Bei einem Modell handelt es sich um ein bereits trainiertes Modell mit vielen bis zu sehr vielen Daten.
Es gibt eine grosse Auswahl von verscheidenen Modellen. Die Auswahl ein richtiges Modell ist keine Einfache. Der Unterschied zwischen den Models ist, dass das Trainieren viel länger dauern kann, dafür aber je nachdem auch genauer ist. Jedoch ist das grösste Model auch nicht immer die beste Wahl, da ein grössere Modell auch für die Auswertung länger braucht.
Aus diesen Gründen ist die Wahl des Modells sehr wichtig und auch keine Einfache.
%% Cell type:code id:265f99f9-9f50-4038-9636-367e0b3c705b tags:
``` python
learn = vision_learner(dls, resnet34)
```
%% Cell type:markdown id:6d6ddcc9-b57e-4607-bcfb-b08417a1e3b0 tags:
# Learning Rate (Lern-Rate)
Bevor man anfängt das Model zu trainieren muss die `learning rate` gefunden werden. Dabei ist es wichtig, dass eine gute Lern-Rate gefunden wird:
- `Tiefe Lern-Rate`: Bei einer tiefen Lern-Rate dauert es länger bis das Modell einen optimalen Zustand erreicht. Das bedeutet es werden mehr Ressourcen und mehr Zeit gebraucht, als wenn man die Lern-Rate berechnet.
- `Hohe Lern-Rate`: Bei einer hohen Lern-Rate macht das Modell oft zu grosse Schritte, was dazu führen kann, dass der optimal Zustand überschossen wird und das Modell im gegenzug and Qualität verliert.
%% Cell type:code id:4bf34214-5e95-4302-8332-0fabdc9fb867 tags:
``` python
learn.lr_find()
```
%% Cell type:code id:a1658d21-21a6-405c-bdaf-c782858b3acb tags:
``` python
lr = 3.630780702224001e-05
```
%% Cell type:markdown id:d5445c86-f708-41f0-bec9-54c0c66d1606 tags:
Nun ist es endlich an der Zeit das Modell zu trainieren
%% Cell type:code id:5c808fd5-e966-45ab-8656-e96dbe4361ff tags:
``` python
learn.fine_tune(25, lr)
```
%% Cell type:markdown id:4df54aa8-b7d8-49a2-a8c1-d911d4e31a9d tags:
Beim `fine_tune` wird sowohl der `train_loss`, wie auch der `valid_loss` angezeigt:
- `train_loss`: Der Trainings-Verlust zeigt an, wie passend das Modell zu den Trainingsdaten ist. Je kleiner dieser Wert ist desto besser.
- `valid_loss`: Der Validierungs-Verlust zeigt an, wie passend das Modell zu den neuen Daten ist. Je kleiner dieser Wert ist desto besser.
%% Cell type:markdown id:271cb9c9-0452-4b0a-8163-8e95fd8daa73 tags:
# Fertig mit dem Training
Wenn man fertig mit dem Trainieren ist, dann kann man sich auch das Resultat anzeigen lassen
%% Cell type:code id:76b674ec-08ad-4cb7-b9f7-885c764090ad tags:
``` python
learn.show_results(ds_idx=1)
```
%% Cell type:markdown id:af82abe1-f264-446e-858a-3d680f0d772b tags:
Oder auch mal ein Testbild vorhersagen lassen
%% Cell type:code id:eb202bf2-8fee-43f2-a75e-81e5dc6b926b tags:
``` python
learn.predict('<pfad>/<zum>/<Bild>')
```
%% Cell type:markdown id:353ba28f-6188-4abe-ab4a-266b1bd56f7a tags:
Oder sogar für mehrere Bilder auf einmal
%% Cell type:code id:2d3b75a6-2ff6-4eb7-8ec0-271c1f277bc3 tags:
``` python
files = get_image_files('<pfad-zu-den-Bildern>')
test_dl = learn.dls.test_dl(files)
preds = learn.get_preds(dl=test_dl)
preds
```
%% Cell type:markdown id:f6e2d88e-434c-4224-bf62-5a8b317670cc tags:
# Exportieren der Daten
Daten können ganz einfach in ein `Pickle`-File exportiert werden. So können sie später mit der `load_learner`-Funktion einfach wieder geladen werden.
**Achtung** Damit der Learner wieder importiert und gebraucht werden kann müssen auch die Funktionen, die im DataBlock benutzt wurden am neuen Ort erstellt werden. In diesem Fall ist das die Funktion `read_data_from_json`.
%% Cell type:code id:198d3f9e-1687-4d94-8d6e-dd6518054039 tags:
``` python
learn.export(Path('<Pfad>/<Modellname>.pkl'))
```
%% Cell type:markdown id:25fb2731-e22e-4292-a55f-854583ec81a2 tags:
# Importieren
Wenn der Learner importiert wurde, kann dieser wie vorhin weiter verwendet werden.
In diesem Fall wird der Learner dann auf dem Fahrzeug importiert und genutzt, damit dieses so gut wie möglich selbst fahren kann.
%% Cell type:code id:1021ca58-3462-46bd-b7c5-79541a11bb1b tags:
``` python
learn = load_learner('<Pfad>/<Modellname>.pkl')
```
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment