Segmentation d’objets sur des GPU compatibles OpenCL#

APOC est basé sur pyclesperanto et scikit-learn. Pour la segmentation d’objets, il utilise un classificateur de pixels et un étiquetage des composantes connexes.

Commençons par charger une image d’exemple et une vérité terrain :

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)
../_images/697332ed931701bd777704b279b47e121b548544b81f7a635c3783b21c04fb53.png
manual_annotations = imread('../../data/blobs_annotations.tif')

cle.imshow(manual_annotations, labels=True)
../_images/6c1441d186140c2fdbd15cd26860006b84a192e2d8c9478cbedbe26fa88c3a97.png

Entraînement#

Nous allons maintenant entraîner un ObjectSegmenter, qui est en réalité un RandomForestClassifier de scikit-learn. Après l’entraînement, le classificateur sera converti en code OpenCL compatible avec clij et sauvegardé sur le disque sous un nom de fichier donné.

# 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)

Prédiction / segmentation#

Le classificateur peut ensuite être utilisé pour classer tous les pixels de l’image donnée. Le point de départ est à nouveau la pile de caractéristiques. Ainsi, l’utilisateur doit s’assurer que les mêmes caractéristiques sont utilisées pour l’entraînement et pour la prédiction. La prédiction peut être effectuée sur le CPU en utilisant le code original de scikit-learn et sur le GPU en utilisant le code OpenCL généré. OCLRFC fonctionne bien si les deux images résultantes sont identiques.

segmentation_result = clf.predict(features=features, image=image)
cle.imshow(segmentation_result, labels=True)
../_images/fad4c1c1b5b80dd7e8a0fe0d5c2e83387c00fdd89bb6e9c96ba39eeb2d809db6.png

Segmentation à partir d’un segmenteur chargé#

clf = apoc.ObjectSegmenter(opencl_filename=cl_filename)

segmentation_result = clf.predict(image=image)
cle.imshow(segmentation_result, labels=True)
../_images/fad4c1c1b5b80dd7e8a0fe0d5c2e83387c00fdd89bb6e9c96ba39eeb2d809db6.png