Mapas de probabilidad#
APOC se basa en pyclesperanto y sklearn.
Comencemos cargando una imagen de ejemplo y algunos datos de verdad terreno:
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>
do_manual_annotation = False
if do_manual_annotation: # puedes usar esto para hacer anotaciones manuales
import napari
# iniciar napari
viewer = napari.Viewer()
napari.run()
# agregar imagen
viewer.add_image(image)
# agregar una capa de etiquetas vacía y mantenerla en una 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>
Entrenamiento#
Ahora entrenamos un PixelClassifier, 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.
# definir características: imagen original, una versión borrosa y una imagen de bordes
features = "original gaussian_blur=2 sobel_of_gaussian_blur=2"
# aquí es donde se guardará el modelo
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)
Predicció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 la predicción.
result = clf.predict(image=image)
imshow(result)
<matplotlib.image.AxesImage at 0x25fc5770670>
Entrenamiento / predicción para otras clases#
Ahora entrenaremos nuevamente y mostraremos la probabilidad de otra clase
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>
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>