Team Front-/Backend

Übersicht

Mitglieder

Clara Odinius , Marvin Alexander Schäcke

Einleitung

Das Team Front- und Backend hat sich mit der Erstellung einer Visualisierungsmöglichkeit für DICOM Tags beschäftigt. Zunächst folgt eine kurze Erläuterung und ein Überblick über die Ziele der Gruppe. Danach wird präziser auf die Motivation, vorherige Zielsetzungen und Arbeiten, die Planung und das Vorgehen und die eigentlich Implementierung eingegangen. Abschließend wird ein Fazit gezogen.

Erläuterung

DICOM (Digital Imaging and Communication in Medicine) Tags sind Datenelemente oder Attribute, die aus drei Teilen bestehen. Dem Tag, anhand dessen das Attribut eindeutig identifiziert werden kann, der Value Representation (VR), die den Datentyp und das genaue Format beschreibt und dem Namen des Tags. Jedes Tag hat wiederum einen Value, also einen Wert, der idealerweise Informationen enthält beziehungsweise enthalten muss.

Ein Beispiel hierfür wäre:
(0010,0010)
PN
Patient's Name
Peter Patient

Diese Daten sind Tag, VR, Name und Value in genau dieser Reihenfolge. Größere Datensätze beinhalten tausende Patienten und Studien und die dazugehörigen Scans, die alle jeweils DICOM Tags haben.

Ziele und Anmerkungen

Das Hauptziel des Teams ist es, eine Übersicht dieser Datensätze in Form eines logischen Dashboards zu erstellen, auf das per Weboberfläche zugegriffen werden kann. Wichtig hierbei ist, dass einerseits viele Daten eingebunden und dargestellt werden können und andererseits die Performance subjektiv schnell genug für die Arbeit mit dem Dashboard ist. Dies hat sich auch auf die Wahl der Technologien ausgewirkt. Zusätzlich ist anzumerken, dass dieses Team aus zwei Mitgliedern besteht, weshalb sich der Umfang des internen Projektziels zu denen der anderen unterscheidet.

DICOM Dashboard

Einleitung

Digital Imaging and Communications in Medicine ist ein offener Standart zur Speicherung und zum Austausch von Informationen im medizinischen Bilddatenmanagement. DICOM Tags beinhalten Informationen zu Patienten, Studien, Serien und vielem mehr. Der Anwender soll unter Anderem auf Anhieb erkennen können, wie viele Patienten an welcher Studie teilgenommen haben, wie umfangreich die jeweilige Studie ist oder um welche Art der Aufnahme von welchem Teil des Körpers oder Organes es sich handelt. Es entsteht ein Gesamtbild der Datensätze. Verbunden mit der Erfahrung des Nutzers können so einfacher Rückschlüsse darauf gezogen werden, ob z.B. manuell eingetragene Tags richtig sind.

Motivation

Ein Problem der DICOM Tags ist es, dass sie viele Informationen beinhalten, diese aber nicht in übersichtlicher Form darstellen. Insbesondere bei größeren Datensätzen mit vielen Patienten und Studien wird es dadurch unübersichtlich, weshalb eine Visualisierungsmöglichkeit sinnvoll ist. Durch ein Dashboard lassen sich auch mehrere Tags in Kombination darstellen, wodurch sich neue Erkenntnisse für den Nutzer ergeben können. Außerdem variiert die Qualität der Daten, wodurch sie ohne Dashboard manchmal schwer vergleichbar sind.

Vorherige Zielsetzungen und Arbeiten

Vor der eigentlichen Implementierung wurde sich zunächst mit der Auswahl und Aneignung der verschiedenen Technologien beschäftigt. Einige davon haben nach Testläufen doch keine Anwendung gefunden. Unter anderem SQLite, CouchDB, ein lokaler SATORI Server, eine WebApp in JavaScript und Docker fallen in diese Kategorie. Gemeinsam mit den Projektbetreuern wurde sich auf mehrere Technologien geeinigt. Elasticsearch wurde gewählt, da die einfachen Such- und Filterfunktionen und eine hohe Performance, auch bei großen Datensätzen, wichtig sind. Ein zusätzlicher Vorteil ist die Kombination mit Kibana, wodurch sich das Dashboard einfacher erstellen lässt und die vorhandene Verbindung zwischen Suchmaschine und Visualisierung, die bereits implementiert und gut dokumentiert ist. Die Umwandlung der Daten in ein passendes Format und die Einbindung in Elasticsearch wurden durch Module in MeVisLab realisiert. MeVisLab wurde gewählt, da es bei Fraunhofer MEVIS bereits im Einsatz ist und Module, die für die Aufgabenstellung relevant sind, verwendet werden können.

Planung und Vorgehen

Die User Stories, Meilensteine und Zwischenziele wurden gemeinsam mit einem Projektbetreuer und einem Fraunhofer MEVIS Mitarbeiter, der in diesem Bereich tätig ist, erstellt. Die User Stories entsprechen hierbei den Erfahrungen und Vorstellungen des Mitarbeiters. Dadurch wurde die Zielsetzung konkretisiert. Die Meilensteine wurden definiert, um einzugrenzen, was realistisch in der Gruppe erreicht werden kann und wo die Prioritäten liegen. Die Zwischenziele wiederum dienen als Ablaufplan. Anhand dieser kann überprüft werden, ob die Umsetzung noch im Zeitplan ist.

Implementierung

Zunächst musste eine Datenbank oder Suchmaschine gefunden werden, in der die Tags hinterlegt werden können, um mit ihnen anschießend zu arbeiten. Hier bietet sich Elasticsearch in Kombination mit Kibana an. Elasticsearch ist ein in Java geschriebener Suchserver auf Basis von Lucene, der mit Dokumenten im JSON Format arbeitet. Der Client kommuniziert über ein RESTful Webinterface. Kibana baut auf Elasticsearch auf und ist eine browserbasierte Analyseplattform, die sowohl die Suche, als auch die Visualisierung der Dokumente, die in Elasticsearch verfügbar sind, ermöglicht. Module, die mit Elasticsearch und Kibana interagieren, wurden in MeVisLab realisiert.\\

Im ersten Schritt werden die Hosts und Ports definiert. Findet die Arbeit ausschließlich lokal statt, reichen die Voreinstellung von Elasticsearch (localhost:9200) und Kibana (localhost:5601). Für eine nicht lokale Arbeit wurden die Module ElasticsearchConnection und KibanaConnection erstellt. Diese Module modifizieren die Konfigurationsdateien so, dass beide unter ihren jeweiligen Hosts und Ports erreichbar sind und weiterhin untereinander kommunizieren können. Beide Module können auch einzeln konfiguriert werden, allerdings muss bei einer Änderung bei Elasticsearch auch immer Kibana angepasst werden, da die Kommunikation sonst nicht mehr stattfindet.

Daher ist es sinnvoll, beide Module zu verwenden und diese vom Output von ElasticsearchConnection zum Input von KibanaConnection zu verbinden. Im Modulpanel von ElasticsearchConnection können der Host und Port von Elasticsearch angepasst werden. Diese werden auch an den Moduloutput weitergegeben. Zwingend notwendig ist die Angabe des Pfades zur Konfigurationsdatei elasticsearch.yml, der je nach Betriebssystem, Installationsart und Installationspfad unterschiedlich ist. Im Modul KibanaConnection können der Host und Port von Kibana angepasst werden. Des Weiteren muss, bei einer Änderung bei Elasticsearch, die URL inklusive http oder https zu Elasticsearch angegeben werden. Die Daten aus dem Modulinput werden automatisch übernommen. Auch hier ist es zwingend notwendig den Pfad zur Konfigurationsdatei kibana.yml, der je nach Betriebssystem, Installationsart und Installationspfad unterschiedlich ist, anzugeben, da Änderungen sonst nicht übernommen und von Elasticsearch und Kibana verarbeitet werden können. In beiden Modulen sorgt der Button "Define connection" dafür, dass dies geschieht.

Beispielhafte Änderungen in MeVisLab
Abbildung 1: Beispielhafte Änderungen in MeVisLab
Änderungen sichtbar im Browser
Abbildung 2: Änderungen sichtbar im Browser

Der nächste Schritt ist es, die DICOM Tags aus den Datensätzen zu extrahieren, da die Aufnahmen selbst nicht verwendet werden. Basierend auf der Wahl der Technologien ergibt sich die Aufgabenstellung, die DICOM Datensätze in JSON umzuwandeln. Das bereits existierende Modul DirectDicomImport von Wolf Spindler wurde in den Prozess eingebunden. Es ermöglicht das Importieren der DICOM Datensätze in MeVisLab und fasst diese in Volumen zusammen. An dessen Output wird das Modul MultiFileVolumeListIteratorOutput von Wolf Spindler angeknüpft. Es iteriert über die gefundenen Volumen des DirectDicomImport. An den Output von MultiFileVolumeListIteratorOutput knüpft das Modul PushJsonToElasticsearch an, wodurch jedes einzelne Volumen einfach bearbeitet werden kann.

Funktionsaufbau
Abbildung 3: Funktionsaufbau

Die Datenstruktur in Elasticsearch sieht für jeden Eintrag einen Index und eine ID vor. Der Index wird zuerst erstellt und beschreibt einen Datensatz. Jeder erzeugte Eintrag im Datensatz erhält eine eigene ID.

Daten
Abbildung 4: Daten mit dem Index dicom und der ID 1

Wird ein neuer Eintrag mit der gleichen ID erstellt, wird der vorherige überschrieben. Damit dies nur beabsichtigt geschieht, kann der Wert des Tags (0008,0018) SOP Instance UID als ID verwendet werden, da jedes Volumen über eine einmalige SOPInstanceUID verfügt.

Elasticsearch
Abbildung 5: User Interface von PushJsonToElasticSearch - Elasticsearch

Im Modul PushJsonToElasticsearch gibt der Anwender zunächst die Adresse zu Elasticsearch an. Anschließend bestimmt er eine Bezeichnung für den Index und wählt für die ID zwischen Default (hexadezimal), Number (chronologisch nummeriert) und SOPInstanceUID (wie zuvor erläutert). Das Drücken des Push-Buttons sorgt dafür, dass die Eingaben gelesen, Elasticsearch instanziiert und der Index erstellt werden. Für jedes Volumen werden die Tags initialisiert, deren Tag Names mit ihren Tag Values verknüpft und in JSON Objekte zusammengefasst. Diese Objekte können nun als "body" zusammen mit dem Index und der ID gepusht werden und sind somit in Elasticsearch hinterlegt. Des Weiteren können die Daten unter Angabe eines Pfades zusätzlich lokal gespeichert werden. Die Art der Datei ist auswählbar.

Save json to file
Abbildung 6: User Interface von PushJsonToElasticSearch - Save json to file
Lokale JSON-Dateien können über das Modul LocalJsonToElasticsearch in Elasticsearch eingebunden werden. Falls möglich, werden der Host und Port von Elasticsearch vom Modulinput übernommen. Ansonsten müssen beide über das Modulpanel angegeben werden. Des Weiteren werden ein Indexname und die Art der ID-Zuweisung benötigt. Abschließend können entweder einzelne JSON-Dateien oder ganze Ordner per Pfad angegeben werden. Bei Ordnern werden ausschließlich Dateien verarbeitet, die auf .json enden. Die Buttons "Save File To ES" und "Save Dir To ES" starten diese Prozesse.
Beispielhafte Konfiguration in MeVisLab
Abbildung 7: Beispielhafte Konfiguration in MeVisLab

Kibana bietet die Möglichkeit die Datensätze zu visualisieren. Dafür muss ein Index-Pattern erstellt werden, das die Daten einer Visualisierung zuweist. Im Folgenden wird die Funktionsweise beispielhaft erläutert.

User Interface PushJsonToElasticSearch
Abbildung 8: Beispielhafte Kibana Visualisierung

Hier wird veranschaulicht, wie viele Volumen welchen Körperteil beschreiben. Für die Y-Achse wird die Aggregation count angegeben, um die jeweilige Menge der Volumen zu zählen. Für die X-Achse wird das Feld BodyPartExamined ausgewählt, um für jeden vorkommenden Wert eine Säule darzustellen. Dadurch, dass bei Split Series erneut BodyPartExamined in Zusammenhang mit PatientID gewählt wird, werden die Säulen farblich unterteilt. Jede Farbe ist einem Patienten zuzuordnen. Darüber hinaus sind diese Visualisierungen dynamisch. Wird auf ein Feld geklickt, werden nur noch die Daten angezeigt, die im Zusammenhang mit der Auswahl stehen. In diesem Fall die Daten des Patienten, dem das Feld zuzuordnen ist.

Wird ein Dashboard erstellt, können diese Visualisierungen hinzugefügt und angeordnet werden. Alle Objekte werden in Kibana als Saved Objects gespeichert. Diese Saved Objects Index-Pattern, Visualisierungen, Dashboards oder auch Saved Searches können als .json exportiert und importiert werden. Wird ein Dashboard exportiert, so werden auch die darin enthaltenen Objekte exportiert. Ausgenommen sind die dem Index-Pattern hinterlegten Daten.

Dashboard Vorstudie
Abbildung 9: Dashboard einer Vorstudie mit vier Patienten
Dashboard mit Gender-Filter
Abbildung 10: Dashboard mit Gender-Filter
Dashboard mit Patient-Filter
Abbildung 11: Dashboard mit Patient-Filter

Der bisherige Funktionsumfang in MeVisLab kann durch das Modul KibanaExtension erweitert werden. Es beinhaltet das im Bachelorprojekt erstellte Dashboard als Script-Datei. In dieser Datei sind die entsprechenden cURL Befehle und die export.json hinterlegt. Um sie ausführen zu können, muss der Benutzer den Pfad zu seinen Makromodulen und die Adresse angeben. Per Klick auf "Import Dashboard" wir das Dashboard importiert.

User Interface von KibanaExtension
Abbildung 12: User Interface von KibanaExtension

Da der Index-Pattern des Dashboards fest definiert ist, gibt es in PushJsonToElasticsearch eine Checkbox. Wenn Daten, mit der Absicht sie in diesem Dashboard anzeigen zu lassen, gepusht werden, kann diese Checkbox gewählt werden. Der Index wird dann automatisch initialisiert und das Index-Pattern erstellt. Der Anwender hat so die Möglichkeit die DICOM Daten optimal in Kibana zu nutzen.

Ausblick

Das Dashboard könnte in zukünftigen Projekten oder Bachelorarbeiten um zwei Aspekte erweitert werden. Dies wäre einerseits die Zusammenfassung ähnlicher Werte oder verschiedener Schreibweisen der Werte der DICOM Tags zu einem dargestellten Wert. Dadurch würde das Dashboard bei großen Datensätzen übersichtlicher werden. Andererseits wäre die Möglichkeit zu einem Viewer, der die ausgewählten Scans anzeigt, zu wechseln eine sinnvolle Erweiterung.

Fazit

Auf das Projektziel hinzuarbeiten war sehr interessant und lehrreich. Es gab Hürden, an denen die Teammitglieder gewachsen sind, aber ebenso auch Erfolgserlebnisse, die zur Weiterarbeit motiviert haben. Es war eine tolle Möglichkeit, viele verschiedene Technologien kennenzulernen und Einblicke in das Fraunhofer MEVIS Institut zu bekommen. Es hat Freude bereitet, an dem Projekt zu arbeiten und die gesetzten Meilensteine zu erreichen. Das Team ist mit der Realisierung zufrieden und kann sich vorstellen, diese im Rahmen einer Bachelorarbeit zu erweitern.

Zurück zur Übersichtsseite