Auswahl von Labels mittels maschinellem Lernen#

apoc ermöglicht die Auswahl von beschrifteten Objekten anhand von Eigenschaften wie Größe, Form und Intensität in einem entsprechenden Bild. In diesem Beispiel werden wir längliche Objekte aus einer Instanzsegmentierung von Blobs auswählen.

import apoc

from skimage.io import imread
import pyclesperanto_prototype as cle
import numpy as np

cle.select_device('RTX')
<NVIDIA GeForce RTX 3050 Ti Laptop GPU on Platform: NVIDIA CUDA (1 refs)>
image = imread('../../data/blobs.tif')
labels = cle.label(cle.threshold_otsu(image))
annotation = imread('../../data/label_annotation.tif')
cle.imshow(image)
cle.imshow(labels, labels=True)
cle.imshow(annotation, labels=True)
../_images/074888b68c318aac4eaadaf285f2b3805ee8f6a5d77939ccafc418406a2d6628.png ../_images/5ef923f8cd4e5b2b95049217b531aafef6a031da122db41be7fa6914462733b6.png ../_images/d62174c6ca905e29f8799378346f96368531856b5ba0d7af2c0fa12f88908d81.png

Training#

Für das Training des Klassifikators müssen Sie Merkmale angeben. Im Folgenden verwenden wir die mittlere und standardabweichende Intensität innerhalb der beschrifteten Objekte sowie die Objektgröße und -form.

features = 'area,mean_max_distance_to_centroid_ratio,standard_deviation_intensity'

cl_filename = "object_selector.cl"

# Create an object classifier
apoc.erase_classifier(cl_filename) # delete it if it was existing before
classifier = apoc.ObjectSelector(cl_filename, positive_class_identifier=1)

# train it
classifier.train(features, labels, annotation, image)

Vorhersage#

Nachdem der Klassifikator trainiert wurde, können wir ihn zur Auswahl von Objekten verwenden.

result = classifier.predict(labels, image)

print(result.max())

cle.imshow(result, labels=True)
23.0
../_images/2ac9a9e2d05250288a7a4a8342d64f468bb15963699af586aa5e4b33df9f1666.png

Man kann den Klassifikator auch von der Festplatte laden und auf einen anderen Datensatz anwenden. Wir demonstrieren das, indem wir den Klassifikator auf eine rotierte Version des oben gezeigten Bildes und Labelbildes anwenden.

image1 = image.T
labels1 = cle.label(cle.threshold_otsu(image1))

classifier = apoc.ObjectSelector(cl_filename)

result = classifier.predict(labels1, image1)

print(result.max())

cle.imshow(result, labels=True)
23.0
../_images/83d82c2c9c55fe10dcee900eeed4bbd856859f377092480cc1879033fe5aed93.png

Nach dem Training können wir den Klassifikator fragen, wie wichtig die Merkmale bei der Vorhersage waren.

classifier.feature_importances()
{'area': 0.29573084473661354,
 'mean_max_distance_to_centroid_ratio': 0.4264564597125618,
 'standard_deviation_intensity': 0.27781269555082466}

Übung#

Verwenden Sie den obigen Code und die Beispielbilder, um einen Klassifikator zu trainieren, der alle kleinen Objekte im Labelbild auswählt.