Cartes de probabilité#

APOC est basé sur pyclesperanto et sklearn.

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

from skimage.io import imread, imshow, imsave
import matplotlib.pyplot as plt
import numpy as np
import apoc

image = imread('blobs.tif')
imshow(image)
<matplotlib.image.AxesImage at 0x25fc553f9a0>
../_images/5a4c39e0461e2e52e2033810b9b5414fac596269ce2d789b46600c150d286c9f.png
do_manual_annotation = False

if do_manual_annotation: # vous pouvez utiliser ceci pour faire des annotations manuelles
    import napari

    # démarrer napari
    viewer = napari.Viewer()
    napari.run()

    # ajouter l'image
    viewer.add_image(image)

    # ajouter une couche d'étiquettes vide et la garder dans une variable
    labels = np.zeros(image.shape).astype(int)
    viewer.add_labels(labels)
    
else:
    labels = imread('annotations_3class.tif')
manual_annotations = labels
if do_manual_annotation:
    imsave('annotations_3class.tif', manual_annotations)

from skimage.io import imshow
imshow(manual_annotations, vmin=0, vmax=3)
C:\Users\rober\miniconda3\envs\bio_38\lib\site-packages\skimage\io\_plugins\matplotlib_plugin.py:150: UserWarning: Low image data range; displaying image with stretched contrast.
  lo, hi, cmap = _get_display_range(image)
<matplotlib.image.AxesImage at 0x25fc565c5e0>
../_images/a01cbf11939ee92b88fe012daa0788b19e9cb563e2a4a0516873c46140fa1f49.png

Entraînement#

Nous allons maintenant entraîner un PixelClassifier, 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é.

# définir les caractéristiques : image originale, une version floue et une image de bords
features = "original gaussian_blur=2 sobel_of_gaussian_blur=2"

# c'est là que le modèle sera sauvegardé
cl_filename = 'my_model.cl'

output_probability_of_class = 3

apoc.erase_classifier(cl_filename)
clf = apoc.ProbabilityMapper(opencl_filename=cl_filename, output_probability_of_class=output_probability_of_class)
clf.train(features, manual_annotations, image)

Prédiction#

Le classificateur peut ensuite être utilisé pour classifier 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.

result = clf.predict(image=image)
imshow(result)
<matplotlib.image.AxesImage at 0x25fc5770670>
../_images/58c1763290241911a3217d74a012f1e2b171748d445be2066bce602eaec3059a.png

Entraînement / prédiction pour d’autres classes#

Nous allons maintenant entraîner à nouveau et produire la probabilité d’une autre classe

output_probability_of_class = 2

apoc.erase_classifier(cl_filename)
clf = apoc.ProbabilityMapper(opencl_filename=cl_filename, output_probability_of_class=output_probability_of_class)
clf.train(features, manual_annotations, image)

result = clf.predict(image=image)
imshow(result)
<matplotlib.image.AxesImage at 0x25fc57d9d30>
../_images/084b771ea6ee52d109f6b68e1029ad74a455ecde73273ce4ee1a782321d28ce6.png
output_probability_of_class = 1

apoc.erase_classifier(cl_filename)
clf = apoc.ProbabilityMapper(opencl_filename=cl_filename, output_probability_of_class=output_probability_of_class)
clf.train(features, manual_annotations, image)

result = clf.predict(image=image)
imshow(result)
<matplotlib.image.AxesImage at 0x25fc58484c0>
../_images/9deedc1187c1b4a138f80d974a7cdf273a7cd6f6d5697cc8451d00fbfb3be8fd.png