[![pdm-managed](https://img.shields.io/endpoint?url=https%3A%2F%2Fcdn.jsdelivr.net%2Fgh%2Fpdm-project%2F.github%2Fbadge.json)](https://pdm-project.org)
[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)

# EKF Diagnostic: Detektion von Sensor-Anomalien

## Übersicht

### Funktion

Die im Rahmen des Projekts erstellte Anwendung erlaubt es, Bilder von Sensoren, die in der laufenden Fertigung während der Inline-Qualitätskontrolle erstellt werden, auf folgende Eigenschaften hin zu überprüfen:

- Abmessungen der Elektroden eines jeden Sensors auf Basis von Kalibrierungswerten (in der Form Pixel/Maßeinheit)
- Erkennung von Anomalien und damit möglichen Defekten eines Sensors

Ein zu analysierendes Bild enthält zwei Sensoren mit ihrer jeweils definierten Anzahl an Elektroden. Ein solches Bild kann über das bereitgestellte Command-Line-Interface (CLI) analysiert werden. Ist die Analyse erfolgreich, wird eine nach dem Bild benannte CSV-Datei im selben Verzeichnis, in welchem sich das Bild befindet, abgelegt. Diese CSV-Datei enthält die ermittelten Werte für die Abmessungen der Elektroden sowie deren Flächeninhalte. Jeder Sensor besitzt drei Elektroden. Demzufolge ergeben sich 2x3x3 = 18 Kennwerte.

Darüber hinaus wird ermittelt, ob die Sensoren jeweils Anomalien aufweisen. Die CSV-Datei enthält zusätzlich zu den 18 Maß-Kennwerten zwei Einträge mit jeweils ``0`` oder ``1``, ein Ergebnis der Anomaliedetektion für jeden Sensor. Bei einem Ergebnis von ``0`` wurde keine Anomalie festgestellt, bei ``1`` hingegen schon.

Im Zuge der Analyse wird eine Heatmap für das Bild erzeugt, welche Rückschlüsse auf Anomaliebereiche erlaubt. Die Datei wird analog der CSV-Datei im entsprechenden Ordner der ursprünglichen Bilddatei mit einem Suffix abgelegt.

### Architektur und Implementierung

Die Anwendung ist vollständig in Python implementiert. Zur Nutzung wird eine vollständige Python-Standalone-Umgebung mit allen erforderlichen Abhängigkeiten bereitgestellt. Das Anwendungsverzeichnis wird als gepacktes ZIP-Archiv bereitgestellt. Die entpackte Größe liegt bei etwa 1,3 GB.

Die Nutzung erfolgt über ein CLI, das über ein Python-Skript abgerufen werden kann. Dieses liegt im Wurzelverzeichnis der Python-Umgebung als ``cli.py`` ab.

## Command-Line-Interface

Die Funktionalität wird über ein CLI nutzbar gemacht. Hierfür liegt in der bereitgestellten Distribution im Ordner "python" ein Python-Skript ab. Dieses muss durch den ebenfalls in diesem Ordner befindlichen Interpreter "python.exe" aufgerufen werden. Erfolgt der Aufruf mit einem anderen Interpreter, werden die installierten Abhängigkeiten nicht gefunden und das Programm funktioniert nicht. Ausgehend vom Ordner, in dem das entpackte Applikationsverzeichnis abliegt, kann die Applikation folgendermaßen aufgerufen werden:

```pwsh
cd ekf-sensor-anomalies-deployment\python
.\python.exe .\cli.py --help
```

Dieser Befehl gibt den folgenden Hilfetext aus:

```
usage: cli.py [-h] img_path calib_value_x calib_value_y

simple CLI tool to analyse single sensor images for anomalies

positional arguments:
  img_path       file path to the image which is to be analysed
  calib_value_x  calibration value in pixels per mcm for x axis, type: float
  calib_value_y  calibration value in pixels per mcm for y axis, type: float

options:
  -h, --help     show this help message and exit
```

Das CLI besteht entsprechend der obigen Beschreibung aus einer Funktion. Diese benötigt die folgenden Parameter:

- ``img_path``: den Pfad zur Bilddatei, in diesem Projekt Bitmap-Dateien (``.bmp``)
- ``calib_value_x``: den Kalibrierwert in x-Richtung zur Ermittlung der Abmessungen, angegeben in Pixel/µm als Gleitkommazahl
- ``calib_value_y``: den Kalibrierwert in y-Richtung zur Ermittlung der Abmessungen, angegeben in Pixel/µm als Gleitkommazahl

Alle Parameter sind obligatorisch und müssen bereitgestellt werden. Die Analyse ist stets für nur ein Bild zur selben Zeit durchführbar. Eine Übergabe mehrerer Dateien ist nicht möglich. Ausgaben, die nicht auf Fehler zurückzuführen sind, werden standardmäßig über ``STDOUT`` ausgegeben.

### Fehlermeldungen

Die Anwendung führt zahlreiche Verarbeitungsschritte durch. Treten hierbei Fehler auf, werden diese mit ihrer Bezeichnung und einer Fehlerbeschreibung ausgegeben. Dies erlaubt Rückschlüsse, an welcher Stelle der Verarbeitungs-Pipeline Fehler aufgetreten sind und aus welchen Gründen das geschah. Die Fehlerausgabe erfolgt über ``STDERR``.

Ein separates Loggen weiterer Ausgaben erfolgt nicht.
