Seleccionar etiquetas usando aprendizaje automático#

apoc permite seleccionar objetos etiquetados según propiedades como tamaño, forma e intensidad en una imagen correspondiente. En este ejemplo, seleccionaremos objetos alargados de una segmentación de instancias de manchas.

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

Entrenamiento#

Para entrenar el clasificador, necesitas especificar características. A continuación, usamos la intensidad media y la desviación estándar dentro de los objetos etiquetados, así como el tamaño y la forma del objeto.

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)

Predicción#

Después de que el clasificador ha sido entrenado, podemos usarlo para seleccionar objetos.

result = classifier.predict(labels, image)

print(result.max())

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

También se puede cargar el clasificador desde el disco y aplicarlo a otro conjunto de datos. Demostramos esto aplicando el clasificador a una versión rotada de la imagen y la imagen de etiquetas de arriba.

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

Después del entrenamiento, podemos preguntarle al clasificador qué tan importantes fueron las características al hacer la predicción.

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

Ejercicio#

Usa el código y las imágenes de ejemplo anteriores para entrenar un clasificador que seleccione todos los objetos pequeños en la imagen de etiquetas.