Teachable Machine
Was ist Teachable Machine?
Teachable Machine ist eine einfache, webbasierte Anwendung von Google, mit der man Machine-Learning-Modelle trainieren kann. Sie funktioniert mit Bildern, Tönen oder Bewegungen. Das Ergebnis ist ein Modell, das in Webseiten, Spiele oder kreative Projekte eingebunden werden kann.
Umgang mit Teachable Machine
- Bildvorbereitung: Bilder ggf. verkleinern oder zuschneiden, um Ladezeit und Modellgröße zu reduzieren. Mindestens 20–30 Bilder pro Klasse werden empfohlen.
- Modell trainieren: Projektart wählen (Bild, Audio oder Pose), Klassen erstellen, Trainingsdaten hochladen, auf „Train Model“ klicken.
- Modell exportieren: „Export Model“ > „TensorFlow.js“ wählen. Optional: In die Cloud hochladen und die öffentliche URL nutzen.
Nützliche Links
Begriffsklärungen
- ml5.js: JavaScript-Bibliothek für einfaches Machine Learning
- Label: Vorhergesagtes Ergebnis des Modells (z. B. „Hund“)
- Callback: Funktion, die nach Abschluss einer anderen Funktion aufgerufen wird
- Loop: Wiederholung zur kontinuierlichen Klassifizierung
- preload(): Lädt wichtige Dateien vor dem Start in p5.js
- Classifier: ML-Modul zur Klassifizierung von Daten
- Array: Liste von Werten, z. B.
array[0]
- Rekursion: Funktion ruft sich selbst wieder auf
- Confidence: Sicherheit der Vorhersage (Wert zwischen 0 und 1)
Beispiel-Code für die Nutzung mit p5.js
let imageModelURL = 'https://teachablemachine.withgoogle.com/models/6eL2SJyis/';
let classifier;
- imageModelURL: Hier steht der Link zum Modell, das bei Teachable Machine erstellt wurde.
- classifier: Variable, in der später das Modell gespeichert wird.
function preload() {
classifier = ml5.imageClassifier(imageModelURL + ‚model.json');
}
- Die Funktion preload() lädt das Modell bevor setup() startet. So ist es rechtzeitig verfügbar.
- Hier wird das Modell aus Teachable Machine vorgeladen, damit es später verfügbar ist.
- ml5.imageClassifier(...): Damit wird das Bildklassifizierungsmodell von der URL geladen.
- Die Bibliothek ml5.js kümmert sich darum, das Modell zu laden und mit der Webcam zu arbeiten.
function setup() {
createCanvas(320, 260);
video = createCapture(VIDEO);
video.size(320, 240);
video.hide();
classifyVideo();
}
- createCanvas(...): Erstellt eine Zeichenfläche, auf der wir alles anzeigen (z. B. Video, Text).
- video = createCapture(VIDEO): Holt das Livebild der Webcam. p5.js speichert das Video in einer Variable.
- video.hide(): Der Video-Stream wird im HTML ausgeblendet, aber im Hintergrund weiter genutzt. Wir nutzen ihn zwar, zeichnen ihn aber selbst im Canvas.
- p5.js greift sich Frame für Frame aus dem Stream und zeigt sie im Canvas.
- classifyVideo() startet die erste Klassifizierung.
function draw() {
background(0);
image(video, 0, 0);
fill(255);
textSize(16);
textAlign(CENTER);
text(label, width / 2, height - 4);
}
- image(video, 0, 0): Zeichnet den aktuellen Frame der Webcam ins Canvas.
- text(label, ...): Zeigt das aktuell erkannte Label des Modells (z. B. „Tasse“, „Hand“, „X“).
function classifyVideo() {
classifier.classify(video, gotResult);
}
- Übergibt das aktuelle Video-Frame an das ML-Modell.
- Sobald das Modell fertig ist, wird die Funktion gotResult() aufgerufen → das ist ein Callback.
function gotResult(results) {
label = results[0].label;
classifyVideo(); // Starte direkt wieder die nächste Analyse
}
- results ist eine Liste (Array) mit allen möglichen Ergebnissen, sortiert nach Sicherheit (Confidence).
- results[0]: Das wahrscheinlichste Ergebnis.
- .label: Der Name der erkannten Klasse (z. B. „Hund“, „A“, „Daumen hoch“).
- Die Funktion ruft am Ende sich selbst indirekt wieder auf, dadurch entsteht eine Endlosschleife: Frame holen → klassifizieren → Ergebnis anzeigen → nächstes Frame …
Weitere Beispiele
Bild-Drop:
canvas.dragOver(function () {
message = "Uh yeah, drop it";
bgcolor = "#ccc";
});
canvas.dragLeave(function () {
bgcolor = "white";
message = defaultMessage;
});
canvas.drop(handleFile, function () {
bgcolor = "white";
message = "";
});
- Diese Funktionen sorgen dafür, dass visuelles Feedback (Hintergrundfarbe, Text) angezeigt wird, wenn man mit dem Bild über das Canvas geht oder es loslässt.
function handleFile(file) {
if (file.type === "image") {
img = createImg(file.data, "uploaded image");
img.hide();
classifyImage(img);
}
}
- Nimmt das Bild entgegen, versteckt es (wichtig, um es nicht doppelt darzustellen), und übergibt es an die Klassifizierungsfunktion.
Zeichnen auf dem Canvas:
cnv = createCanvas(200, 200);
cnv.parent("sketch");
background(255);
- Erstellt einen initialen Hintergrund. Wenn wir später das Canvas frei machen, müssen wir wieder einen Hintergrund setzten.
if (mouseIsPressed) {
let weight = dist(px, py, mouseX, mouseY);
strokeWeight(constrain(weight, 1, 10));
line(px, py, mouseX, mouseY);
}
px = mouseX;
py = mouseY;
- Wenn die Maus gedrückt ist, wird eine Linie gezeichnet.
- line(px, py, mouseX, mouseY) verbindet den letzten Punkt mit dem aktuellen → ergibt einen Zeichenstrich.
- Die Linienbreite basiert auf der Distanz zwischen dem vorherigen und aktuellen Punkt der Maus.
Markdown
Markdown ist ein leichtgewichtiger Markup-Standard, der darauf abzielt, Text menschenlesbar und gleichzeitig maschinenfreundlich zu strukturieren. Markdown-Dateien (.md) können in einfache HTML-Dokumente umgewandelt werden und helfen, Informationen klar und organisiert zu präsentieren.
- Verwendung in Repositories: Die README.md-Datei ist ein Markdown-Dokument, das zum Beispiel erklärt, was dein Projekt macht und wie es funktioniert.
- Struktur: Markdown reduziert den Text auf grundlegende semantische Elemente (Überschriften, Listen, Links, Bilder usw.), die sowohl von Menschen als auch Maschinen leicht zu verstehen sind.
Wie man Markdown richtig anwendet in Visual Studio Code (VSCode):
- Stelle sicher, dass du Markdown als Standardsprache wählst. Klicke in der unteren Leiste auf die Code-Sprache und wähle Markdown aus.
- Wenn du ein neues Projekt startest, speichere die Datei mit der Endung .md (z.B. README.md).
Bedeutung | Markdown-Syntax |
---|---|
Heading 1 (größte Überschrift) | # Überschrift |
Heading 2 (mittlere Überschrift) | ## Überschrift |
Heading 3 (kleinste Überschrift) | ### Überschrift |
Liste (Bulletpoints) | - Punkt 1 * Punkt 1 |
Zitat (Blockquote) | > Dies ist ein Zitat. |
Inline-Code | `console.log("Hello World!");` |
Fetter Text | **Fett** |
Kursiver Text | *Kursiv* |
Link | [Text](URL) |
Bild |  |
Markdown-Erweiterungen und Tools in VSCode:
- Markdown All in One: Ein nützliches VSCode-Plugin, das dir beim Bearbeiten und Vorschauen von Markdown-Dateien hilft.
- Markdown Preview Enhanced: Zeige eine Vorschau deiner Markdown-Datei an, um zu sehen, wie sie als HTML aussieht. Du kannst die Datei auch direkt als HTML exportieren.
- Markdown to HTML: Ein weiteres nützliches Tool, um HTML aus Markdown zu generieren.
Umgang mit Künstlicher Intelligenz
Wenn KIs mit veränderlichen Daten arbeiten, wie z.B. aktuellen Ereignissen, fehlt oft der Kontext im Training. Um dieses Problem zu lösen, müssen wir der KI explizit Informationen mitgeben, damit sie die Daten korrekt verarbeiten kann. Wenn wir möchten, dass sich das Modell auf bestimmte Weise verhält, müssen wir es mit entsprechendem Kontext versorgen.
Gerade bei der Arbeit mit KIs wie ChatGPT ist der Kontext entscheidend: Um präzisere Antworten zu erhalten, ist es wichtig, der KI klare Anweisungen zu geben und den Hintergrund einer Frage oder Aufgabe zu erklären. Der Text wird dabei in kleinere Einheiten zerlegt, die sogenannten Tokens. Ein Token kann ein Wort, ein Satzzeichen oder ein Teil eines Wortes sein. Je mehr Kontext in Form von Tokens zur Verfügung steht, desto besser kann die KI die Anfrage verstehen und darauf reagieren.
Debate Club
Heutzutage ist KI schon stark in der Gesellschaft vertreten – ob in kreativen Bereichen, der öffentlichen Sicherheit, der generellen Arbeitswelt oder allen möglichen anderen Bereichen. Die rasant zunehmende Nutzung von Künstlicher Intelligenz zieht aber auch ein Spannungsfeld zwischen Potenzial und Moral mit sich, da sie einerseits als effiziente Entlastung für Menschen dienen, andererseits aber auch gesellschaftliche und ethische Konsequenzen mit sich bringen kann.
Da das Arbeiten und Integrieren von KI dieses Semester Thema war, haben wir uns auch mit den auseinandergehenden Meinungen dazu beschäftigt und einen Debattierclub geführt. Eine Hälfte des Kurses war für die Nutzung von KI, die andere eher negativ eingestellt. Nach einer Vorstellung der Aspekte beider Seiten kam man dann ins Diskutieren; dabei stand zum Beispiel der Punkt Effizienz gegen den Punkt Verdrängung, wirtschaftlicher Nutzen gegen Umweltzerstörung, Missbrauch gegen Sicherheit. Richtig einig wurde man sich nicht, aber am Ende schien die Seite mit den positiven Aspekten überzeugender zu sein.
Ich finde die Unterhaltung über KI sehr wichtig, und gerade wenn man sich anschaut, was wir studieren, wird es auch weiterhin ein großes Thema für uns sein. Am Anfang war mir meine Position relativ klar: Natürlich ist KI vor allem sehr gefährlich und führt nur zu weiterer Spaltung der Gesellschaft. Deswegen war ich auch sehr froh, dass ich mich auf der Con-Seite befand. Allerdings hat die Debatte dazu geführt, dass meine Sorge ein wenig abnahm und ich eingestanden habe, dass Katastrophenszenarien jetzt vielleicht doch nicht so leicht eintreten werden. Trotzdem bleibe ich bei dem Punkt, dass sich Menschen mit der zunehmenden Nutzung von Künstlicher Intelligenz in allen Bereichen nicht unbedingt einen Gefallen machen.
Syntax & Coding-Grundlagen
Konzepte und Elemente
Struktur:
- Header (Der Kopfbereich, der oft Titel, Logos oder Navigation enthält. Er gibt den Einstiegspunkt in eine Seite oder Anwendung.)
- Navigation (Nav) (Ein Bereich, der Links oder Menüs zur Navigation innerhalb der Seite oder Anwendung bereitstellt.)
- Main (Der Hauptinhalt der Seite, der den wichtigsten Text, Bilder oder Funktionen enthält.)
- Section (Ein Abschnitt innerhalb des Hauptinhalts, um unterschiedliche Themen oder Bereiche zu trennen.)
Typografie:
- Überschriften (z.B. h2, h3)(Überschriften gliedern den Text in Kapitel oder Abschnitte und geben eine Hierarchie vor.)
- Absatz (p) (Ein Textblock, der normalen Fließtext enthält.)
- Listen (ul, li) (Eine ungeordnete Liste (ul) enthält mehrere Einträge (li), z.B. Aufzählungen.)
Interaktivität & Styling:
- Links (a) (Elemente, die Nutzer zu anderen Seiten oder Bereichen führen.)
- Klassen (.text-link) (Klassen sind Kennzeichnungen für Elemente, mit denen man gezielt Stil- oder Verhaltensregeln zuweisen kann.)
- Hover-Effekt (Eine Änderung des Aussehens, wenn man mit der Maus über ein Element fährt, z.B. Farbwechsel bei Links.)
- Responsive Design (@media) (Technik, damit sich das Layout an verschiedene Bildschirmgrößen anpasst, z.B. für Smartphones oder große Monitore.)
Diese Seite
Bedeutung | HTML | CSS |
---|---|---|
Navigation mit Links | <nav><ul><li><a href="#..."></a></li></ul></nav> |
nav ul { display: flex; gap: 20px; } |
Seitenabschnitt | <section id="..."></section> |
section { background: white; } |
Große Überschrift | <h2>...</h2> |
h2 { color: #2575fc; text-align: center; } |
Mittlere Überschrift | <h3>...</h3> |
h3 { margin-top: 40px; border-left: 4px solid #2575fc; } |
Absatz | <p>...</p> |
p { font-size: 1rem; color: #555; } |
Liste | <ul><li>...</li></ul> |
ul { padding-left: 10px; } li { margin-bottom: 10px; } |
Links | <a href="..." target="_blank"class="text-link">...</a> |
.text-link { color: #2575fc; font-weight: bold; } .text-link:hover { transform: scale(1.2); } |
Tabelle | table class="table"<table><thead><tr><th></th></tr></thead><tbody><tr><td></td></tr></tbody></table> |
.table { width: 100%; border-collapse: collapse; } |
Codeblock | <pre><code>...</code></pre> |
pre { background: #f0f0f0; padding: 15px; } |
Grundlagen JS
Bedeutung | Syntax und *Beispiele* |
---|---|
Variable deklarieren (neu) | let *x* = *5*; |
Konstante (nicht veränderbar) | const *name* = "*Lynn*"; |
Funktion definieren | function *greet*() { console.log(*"Hallo!"*); } |
Funktion aufrufen | *greet*(); |
Bedingung (if-Anweisung) | if (*x > 3*) { console.log(*"Größer als 3"*); } |
Wiederholung (Schleife) | for (let i = 0; i < 5; i++) { console.log(i); } |
Array (Liste) | let farben = ["rot", "grün", "blau"]; |
Zugriff auf Array-Element | farben[0]; // ergibt "rot" |
Objekt erstellen | let person = { name: "Lynn", alter: 22 }; |
Eigenschaft auslesen | person.name; // ergibt "Lynn" |
Konsole zum Debuggen | console.log("Hallo Welt"); |
Zufallszahl erzeugen | let z = random(0, 10); |
Mausposition abfragen (p5.js) | mouseX, mouseY |
Variablen und Funktionen
JavaScript führt Anweisungen Schritt für Schritt von oben nach unten aus – Zeile für Zeile. Dabei können wir bestimmte Informationen speichern, z. B. in sogenannten Variablen, und ganze Befehlspakete zusammenfassen, die wir bei Bedarf immer wieder verwenden können – das geschieht mit Funktionen.
let name = "Max";
function greet() {
console.log("Hallo, " + name + "!");
}
greet();
- Mit let wird eine Variable erstellt. Eine Variable ist wie eine kleine Box, in der du etwas speichern kannst. Die Variable heißt hier name.
- In die Box legen wir den Text "Max". Die Variable name enthält jetzt den Wert "Max".
- Dann wird die Funktion mit dem Namen greet definiert. Eine Funktion ist ein Befehlspaket, das man mehrmals verwenden kann, in dem man greet() aufruft. Dann wird alles, was zwischen den geschweiften Klammern { } steht, ausgeführt.
- console.log(...) bedeutet: Schreibe etwas in die Konsole (also das Ausgabefenster im Browser oder Editor).
- "Hallo, " ist ein fester Text, das + verbindet (verknüpft) die einzelnen Textstücke und Variablen zu einem einzigen Text, name ist "Max" (aus der Variable oben) und "!" ist wieder fester Text.
- Mit greet() wird die Funktion aufgerufen, in diesem Fall: Es wird "Hallo, Max!" in die Konsole geschrieben.
Konstante und Bedingung
In JavaScript kann man mit Konstanten (const) feste Werte speichern, die sich im Laufe des Programms nicht mehr ändern sollen. Mit Bedingungen (if) kann man entscheiden, ob ein bestimmter Teil des Codes ausgeführt werden soll – je nachdem, ob etwas true oder false ist.
const age = 18;
const isAdult = (age >= 18);
if (isAdult === true) {
console.log("Du bist volljährig.");
}
- Es wird eine Konstante namens age deklariert und ihr der Wert 18 zugewiesen. const bedeutet, dass dieser Wert später nicht mehr geändert werden kann.
- Es wird eine weitere Konstante isAdult deklariert. Eine Konstante kann man praktisch beliebig benennen, solange der Name den Regeln für JavaScript-Variablennamen entspricht.
- Rechts vom Gleichheitszeichen steht der Ausdruck age >= 18, eine Bedingung, die überprüft, ob age größer oder gleich 18 ist.
- Da age den Wert 18 hat (durch: const age = 18;), ergibt die Bedingung wahr (true). Der Wert true wird durch die Auswertung des Vergleichs erzeugt und in die Variable isAdult gespeichert.
- Es wird eine if-Bedingung ausgeführt, die lautet: Prüfe, ob isAdult gleich (===) true ist.
- Da isAdult tatsächlich true ist, wird der Codeblock innerhalb der {} ausgeführt, also gibt diese Anweisung den Text „Du bist volljährig.“ in der Entwicklerkonsole aus.
Arrays und Schleifen
Arrays dienen dazu, mehrere Werte übersichtlich zusammen in einer einzigen Variablen zu speichern. Wiederholungen (Schleifen) ermöglichen es, bestimmte Anweisungen mehrmals automatisch auszuführen, zum Beispiel um jedes Element in einem Array nacheinander zu verarbeiten, ohne den Code dafür mehrfach schreiben zu müssen.
let farben = ["Rot", "Blau", "Grün", "Gelb"];
for (let i = 0; i < farben.length; i++) {
console.log("Farbe " + (i + 1) + ": " + farben[i]);
}
- Es wird eine Variable farben erstellt, die ein Array enthält. Dieses Array besteht aus vier Texten (Strings): "Rot", "Blau", "Grün" und "Gelb".
- Es wird eine for-Schleife gestartet. Eine Programmier-Anweisung, die es ermöglicht, einen bestimmten Code-Block mehrmals hintereinander auszuführen — also eine Wiederholung.
- Dabei wird eine Zählvariable i verwendet und let i = 0 initialisiert, da Arrays in JavaScript nullbasierent sind. Das erste Element also den Index 0 hat. Danach wird i nach jedem Durchlauf automatisch erhöht (meist mit i++), also um 1 erhöht.
- Mit der Bedingung i < farben.length wird geprüft, ob i kleiner ist als die Anzahl der Elemente im Array farben (farben.length). Solange diese Bedingung erfüllt ist, läuft die Schleife weiter (i++).
- Mit console.log() wird ein Text ausgegeben. "Farbe " und ":" wird als Text hinzugefügt. Es wird i + 1 hinzugefügt, damit die Aufzählung des aktuellen Index im Array nicht bei 0 beginnt und mit farben[i] wird der Inhalt an der Stelle i im Array farben ergänzt.
- Danach wird i um 1 erhöht (i++), und die Schleife prüft wieder, ob i < farben.length gilt. Dieser Vorgang wird so lange wiederholt, bis alle Farben aus dem Array ausgegeben sind.
Zufallswert und Benutzerinteraktion
let name = "Sara";
let hobbies = ["Lesen", "Schwimmen", "Programmieren"];
function checkDrivingPermission(age) {
const legalDrivingAge = 18;
const isAllowed = (age >= legalDrivingAge);
let result = "";
if (isAllowed) {
result += name + " darf Auto fahren.<br>";
} else {
result += name + " darf noch kein Auto fahren.<br>";
}
result += name + " hat folgende Hobbys:<br><ul>";
for (let i = 0; i < hobbies.length; i++) {
result += "<li>" + hobbies[i] + "</li>";
}
result += "</ul>";
let random = Math.floor(Math.random() * hobbies.length);
let randomHobby = hobbies[random];
result += "<br>Ein zufälliges Hobby von " + name + " ist: <strong>"
+ randomHobby + "</strong>";
return result;
}
document.getElementById("checkBtn").addEventListener
("click", () => {
const age
= parseInt(document.getElementById("ageInput").value, 10);
const output = checkDrivingPermission(age);
document.getElementById("output").innerHTML = output;
});
- Es wird die Variable name erstellt und mit dem Text "Sara" belegt.
- Es wird das Array hobbies erstellt, das drei Hobbys enthält.
- Es wird die Funktion checkDrivingPermission definiert. (age) ist ein sogenannter Parameter – das bedeutet: Die Funktion erwartet eine Eingabe, nämlich eine Zahl, die das Alter darstellt. Diese Zahl bekommt die Funktion später durch den EventListener.
- Es wird die Konstante legalDrivingAge erstellt, die das gesetzliche Mindestalter zum Autofahren speichert – nämlich 18.
- Mit der Konstanten isAllowed wird geprüft, ob das eingegebene Alter größer oder gleich 18 (const legalDrivingAge) ist. Das Ergebnis ist true oder false – und wird in isAllowed gespeichert.
- Mit let result = "" wird eine leere Text-Variable namens result erstellt. In diese Variable wird Schritt für Schritt Text hinzugefügt, damit man am Ende alles zusammen anzeigen kann.
- Danach wird eine Bedingung (if { ... } else { ... }) überprüft: Wenn isAllowed true ist (also (age) ≥ legalDrivingAge), wird ins result mit += hinzugefügt: die Variable name (Sara) und „darf Auto fahren.“ Wenn isAllowed false ist, wird hinzugefügt: die Variable name und „darf noch kein Auto fahren.“ Jeweils mit einem Zeilenumbruch (< br >).
- Zum result wird eine Überschrift für die Hobby-Liste aus name und Text erstellt. Damit die Hobbys übersichtlich und als Liste untereinander angezeigt werden – werden Zeilenumbruch (< br >) und Aufzählungspunkten (< ul >) hinzugefügt.
- Um die Liste zu füllen, wird eine Schleife gestartet, die durch das Array hobbies geht. Für jedes Hobby im Array wird ein Listeneintrag (< li >...< /li>) erzeugt und ins result hinzugefügt. Mit += "< /ul >" wird die Liste beendet.
- Danach wird ein zufälliges Hobby aus dem Array genommen und als Variable random definiert. Dies wird mit Math.floor() gemacht, eine Funktion, die zur Math-Bibliothek gehört und ganze Zahlen zurück gibt. Die Zahl wird erimmelt, indem Math.random() eine zufällige Zahl zwischen 0 und 1 zurück gibt. Durch die Rechnung Math.random() * hobbies.length (also 3) wird daraus eine Zahl zwischen 0 und fast 3. Math.floor() rundet die Zahl dann nach unten auf die nächste ganze Zahl.
- Nun wird die Variable randomHobby erstellt, in der das Element aus dem Array hobbies basierend auf der Zufallszahl gespeichert wird (hobbies[random]). Dieses wird im result mit Text hinzugefügt.
- Mit return result; gibt die Funktion den gesamten Text (mit Info zum Autofahren, allen Hobbys und dem Zufallshobby) zurück.
- Der interaktive Teil steht ganz unten, weil er nur funktionieren kann, wenn vorher alles schon definiert ist (Funktion, Array, Variablen etc.). Hier such sich JavaScript mit document.getElementById("checkBtn") zuerst Zugriff auf den Button der in HTML hinzugefügt wurde und hängt einen "Event Listener" an, damit auch etwas passiert, wenn der Benutzer mit der Webseite interagiert (("click",).
- Mit () => { ... } wird gesagt, dass eine Funktion ausgeführt werden soll, wenn der Button geklickt wird.
- In der Konstante age wird die Zahl gespeichert, die der Benutzer eingegeben hat. Die Funktion parseInt(..., 10) nimmt den Text (String), den der Code aus einem Eingabefeld (input) holt und macht daraus eine ganze Zahl (Integer), mit der JavaScript arbeiten kann. Die Funktion sucht im HTML das Eingabefeld mit der ID ageInput und bekommt den Wert durch .value.
- const output übergibt dann der am Anfang definierten Funktion checkDrivingPermission die eingegebene Zahl (Alter) und der Rückgabewert (return) wird in output gespeichert.
- Danach wir der Text in einem HTML-Element mit der ID output angezeigt. (document.getElementById("output".innerHTML)= output).
Beispiel HTML:
<body>
<h1>Führerschein-Check</h1>
<label for="ageInput">Alter eingeben: </label>
<input type="number" id="ageInput" value="20" />
<button id="checkBtn">Prüfen</button>
<div id="output"></div>
</body>