Segmentación de objetos en GPUs compatibles con OpenCL#
APOC está basado en pyclesperanto y scikit-learn. Para la segmentación de objetos, utiliza un clasificador de píxeles y etiquetado de componentes conectados.
Comencemos cargando una imagen de ejemplo y algunas etiquetas de referencia:
from skimage.io import imread, imsave
import pyclesperanto_prototype as cle
import numpy as np
import apoc
image = imread('../../data/blobs.tif')
cle.imshow(image)
manual_annotations = imread('../../data/blobs_annotations.tif')
cle.imshow(manual_annotations, labels=True)
Entrenamiento#
Ahora entrenamos un ObjectSegmenter, que internamente es un RandomForestClassifier de scikit-learn. Después del entrenamiento, el clasificador se convertirá a código OpenCL compatible con clij y se guardará en el disco bajo un nombre de archivo dado.
# define features
features = apoc.PredefinedFeatureSet.medium_quick.value
# this is where the model will be saved
cl_filename = '../../data/blobs_object_segmenter.cl'
apoc.erase_classifier(cl_filename)
clf = apoc.ObjectSegmenter(opencl_filename=cl_filename, positive_class_identifier=2)
clf.train(features, manual_annotations, image)
Predicción / segmentación#
El clasificador puede entonces ser utilizado para clasificar todos los píxeles en la imagen dada. El punto de partida es nuevamente el conjunto de características. Por lo tanto, el usuario debe asegurarse de que se utilicen las mismas características para el entrenamiento y para la predicción. La predicción se puede realizar en la CPU utilizando el código original de scikit-learn y en la GPU utilizando el código OpenCL generado. OCLRFC funciona bien si ambas imágenes resultantes se ven idénticas.
segmentation_result = clf.predict(features=features, image=image)
cle.imshow(segmentation_result, labels=True)
Segmentación desde un segmentador cargado#
clf = apoc.ObjectSegmenter(opencl_filename=cl_filename)
segmentation_result = clf.predict(image=image)
cle.imshow(segmentation_result, labels=True)