Bildsegmentierung mit StarDist#

StarDist ist eine auf Deep Learning basierende Bildsegmentierungsmethode zur Segmentierung von Objekten wie Zellkernen.

Siehe auch

Wie üblich beginnen wir mit dem Laden eines Beispielbildes.

from stardist.models import StarDist2D
from csbdeep.utils import normalize
from stardist import random_label_cmap

import stackview
import matplotlib.pyplot as plt
import numpy as np
from skimage.data import human_mitosis
image = human_mitosis()
stackview.insight(image)
shape(512, 512)
dtypeuint8
size256.0 kB
min7
max255

Laden eines Modells#

Modelle sind Dateien, die typischerweise ein neuronales Netzwerk enthalten, das in der Lage ist, ein Bild zu segmentieren. StarDist kommt mit einigen vortrainierten Modellen, um zu demonstrieren, wie der Algorithmus in einem allgemeinen Anwendungsfall wie der Zellkernsegmentierung funktioniert. Wenn ein solches vortrainiertes Modell bei Ihren Daten nicht gut funktioniert (seien Sie ein guter Wissenschaftler und überprüfen Sie das sorgfältig!), müssen Sie Ihr eigenes Modell trainieren, das zu Ihren Daten passt. Für das Training benötigen Sie wahrscheinlich eine leistungsstarke GPU, für die Anwendung eines Modells (Vorhersageschritt) auf ein 2D-Bild ist keine GPU erforderlich.

# creates a pretrained model
model = StarDist2D.from_pretrained('2D_versatile_fluo')
Found model '2D_versatile_fluo' for 'StarDist2D'.
Loading network weights from 'weights_best.h5'.
Loading thresholds from 'thresholds.json'.
Using default values: prob_thresh=0.479071, nms_thresh=0.3.

Normalisierung des Eingangsbildes#

Viele Algorithmen, die neuronale Netze verwenden, benötigen normalisierte Eingangsdaten, um damit arbeiten zu können. Zum Beispiel können Sie das 1%- und das 99,8%-Perzentil bestimmen (das ist sehr üblich) und Ihr Bild so normalisieren, dass die Intensitäten, die sich zwischen diesen Perzentilen ausbreiten, anschließend im Bereich zwischen 0 und 1 liegen. Wir müssen dies tun, weil das Modell auf einem Bild in diesem Bereich trainiert wurde und möglicherweise nicht in der Lage ist, Bilder mit unterschiedlichen Intensitätsbereichen zu segmentieren.

axis_norm = (0,1)
image = normalize(image, 1,99.8, axis=axis_norm)

Die Segmentierung des Bildes und die Beschriftung der einzelnen Objekte wird in der künstlichen Intelligenz-Gemeinschaft oft als “Instanzsegmentierung” oder “Vorhersage” bezeichnet.

labels, details = model.predict_instances(image)

stackview.insight(labels)
1/1 [==============================] - 0s 127ms/step
shape(512, 512)
dtypeint32
size1024.0 kB
min0
max317

Ergebnisvisualisierung#

Zell- / Zellkernsegmentierungsergebnisse lassen sich am besten überprüfen, wenn das resultierende Labelbild über das Originalbild gelegt wird

plt.figure(figsize=(5,5))
plt.imshow(image, clim=(0,1), cmap='gray')
plt.imshow(labels, cmap=random_label_cmap(), alpha=0.5)
plt.axis('off');
../_images/4648d5a57dc1a7c80d78f9c3fbec4988adea0d8a03b2c386e5a6fb3988047e7e.png

… oder indem Umrisse um segmentierte Regionen gezeichnet werden.

# create a new plot
fig, axes = plt.subplots(1,1)

# add two images
axes.imshow(image, cmap=plt.cm.gray)
axes.contour(labels, [0.5], linewidths=1.2, colors='r')
<matplotlib.contour.QuadContourSet at 0x22b34c4f1f0>
../_images/f39ea03af19a1ee75cbefb87b9241abb773b6cbd2868ab14af5522ca56ad5682.png

Hinweis: Das Modell, das wir hier auf blobs.gif angewendet haben, wurde nicht darauf trainiert. Das Ergebnis sieht trotzdem nicht so schlecht aus.

Weitere verfügbare vortrainierte Modelle#

StarDist bietet weitere verfügbare vortrainierte Modelle an.

StarDist2D.from_pretrained() 
There are 4 registered models for 'StarDist2D':

Name                  Alias(es)
────                  ─────────
'2D_versatile_fluo'   'Versatile (fluorescent nuclei)'
'2D_versatile_he'     'Versatile (H&E nuclei)'
'2D_paper_dsb2018'    'DSB 2018 (from StarDist 2D paper)'
'2D_demo'             None

Übung#

Laden Sie ../../data/blobs.tif und wenden Sie Cellpose darauf an.