optionale Aufgabe

This commit is contained in:
Angelos committed 2026-11-12 13:37:11 +01:00
1 parent d5753d1510
commit c6053f61bc
2 files changed
+66 -5

No files matched your search

+65 -5
View File
@@ -1,8 +1,12 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "mnistVisualization.h"
#define Matrix RaylibMatrix
#include "raylib.h"
#undef Matrix
#include "mnistVisualization.h"
#define MAX_TEXT_LEN 100
@@ -13,6 +17,9 @@ typedef struct
const unsigned char *predictions;
unsigned int currentIdx;
Vector2 pixelSize;
int isDrawing;
GrayScaleImage canvas;
NeuralNetwork model;
} MnistVisualization;
typedef struct
@@ -55,16 +62,23 @@ static MnistVisualization *createVisualizationContainer(const GrayScaleImageSeri
if(container != NULL)
{
container->canvas.width = series->images[0].width;
container->canvas.height = series->images[0].height;
container->canvas.buffer = (unsigned char *)calloc(container->canvas.width * container->canvas.height, sizeof(unsigned char));
container->model = loadModel("mnist_model.info2");
Vector2 pixelSize = {(int)(size.x / series->images[0].width), (int)(size.y / series->images[0].height)};
container->pixelSize = pixelSize;
container->series = series;
container->predictions = predictions;
container->isDrawing = 0;
}
}
return container;
}
static void drawTextLabel(const TextLabel *label)
{
DrawText(label->text, label->position.x, label->position.y, label->fontSize, label->color);
@@ -99,7 +113,11 @@ static void drawAll(const MnistVisualization *container, const TextLabel *naviga
BeginDrawing();
ClearBackground(BLACK);
drawDigit(container->series->images[container->currentIdx], container->position, container->pixelSize);
if (container->isDrawing) {
drawDigit(container->canvas, container->position, container->pixelSize);
} else {
drawDigit(container->series->images[container->currentIdx], container->position, container->pixelSize);
}
drawTextLabel(navigationLabel);
drawTextLabel(predictionLabel);
@@ -114,6 +132,10 @@ static int checkUserInput()
inputResult = -1;
else if(IsKeyReleased(KEY_RIGHT))
inputResult = 1;
else if(IsKeyReleased(KEY_UP))
inputResult = 2;
else if(IsKeyReleased(KEY_DOWN))
inputResult = 3;
return inputResult;
}
@@ -137,8 +159,41 @@ static void updatePredictionLabel(TextLabel *predictionLabel, unsigned char true
static void update(MnistVisualization *container, TextLabel *predictionLabel, int updateDirection)
{
updateDisplayContainer(container, updateDirection);
updatePredictionLabel(predictionLabel, container->series->labels[container->currentIdx], container->predictions[container->currentIdx]);
if (updateDirection == 2)
{
container->isDrawing = !container->isDrawing;
}
else if (updateDirection == 3)
{
memset(container->canvas.buffer, 0, container->canvas.width * container->canvas.height);
}
else if (!container->isDrawing)
{
updateDisplayContainer(container, updateDirection);
}
if (container->isDrawing == 1 && IsMouseButtonDown(MOUSE_BUTTON_LEFT))
{
int col = GetMouseX() / (int)container->pixelSize.x;
int row = GetMouseY() / (int)container->pixelSize.y;
if (col >= 0 && col < container->canvas.width && row >= 0 && row < container->canvas.height)
{
container->canvas.buffer[row * container->canvas.width + col] = 255;
}
}
if (container->isDrawing)
{
unsigned char *liveResult = predict(container->model, &container->canvas, 1);
unsigned char predictedDigit = liveResult[0];
free(liveResult);
updatePredictionLabel(predictionLabel, 0, predictedDigit);
}
else
{
updatePredictionLabel(predictionLabel, container->series->labels[container->currentIdx], container->predictions[container->currentIdx]);
}
}
void showMnist(unsigned int windowWidth, unsigned int windowHeight, const GrayScaleImageSeries *series, const unsigned char predictions[])
@@ -146,7 +201,7 @@ void showMnist(unsigned int windowWidth, unsigned int windowHeight, const GraySc
const Vector2 windowSize = {windowWidth, windowHeight};
MnistVisualization *container = createVisualizationContainer(series, predictions, windowSize);
TextLabel *navigationLabel = createTextLabel("Use left and right key to navigate ...", 20, WHITE);
TextLabel *navigationLabel = createTextLabel("Use left and right key to navigate\n Use up and down key to enable free-Drawing and reset", 20, WHITE);
TextLabel *predictionLabel = createTextLabel("", 20, WHITE);
predictionLabel->position.x = 10;
predictionLabel->position.y = windowSize.y - 50;
@@ -167,6 +222,11 @@ void showMnist(unsigned int windowWidth, unsigned int windowHeight, const GraySc
CloseWindow();
if(container != NULL)
{
free(container->canvas.buffer);
clearModel(&container->model);
}
free(container);
free(navigationLabel);
free(predictionLabel);