Open
Description
(running on Pop OS (essentially the same as Ubuntu 22.04 LTS))
Following https://biapol.github.io/BioImage-Analysis-and-Data-Processing-Workshop-2025/interactive_pixel_classification/readme.html,
I get to:
and after I click on train, I get I get an error: dGetPlatformIDs failed
Traceback message:
dGetPlatformIDs failed
---------------------------------------------------------------------------
LogicError Traceback (most recent call last)
File ~/miniconda3/envs/napari25/lib/python3.10/site-packages/napari_accelerated_pixel_and_object_classification/_dock_widget.py:161, in ObjectSegmentation.__init__.<locals>.train_clicked(*arg=(False,), **kwargs={})
157 return
159 first_image_layer = self.get_selected_images()[0]
--> 161 self.train(
self = <napari_accelerated_pixel_and_object_classification._dock_widget.ObjectSegmentation object at 0x7db13931b520>
num_object_annotation_spinner = <PyQt5.QtWidgets.QSpinBox object at 0x7db1391d44c0>
self.feature_selector = <napari_accelerated_pixel_and_object_classification._dock_widget.FeatureSelector object at 0x7db1391d49d0>
num_max_depth_spinner = <PyQt5.QtWidgets.QSpinBox object at 0x7db1391e0310>
num_trees_spinner = <PyQt5.QtWidgets.QSpinBox object at 0x7db1391e03a0>
filename_edit = FileEdit(mode='w', value=PosixPath('ObjectSegmenter.cl'))
show_classifier_statistics_checkbox = <PyQt5.QtWidgets.QCheckBox object at 0x7db1391e0670>
first_image_layer = <Image layer 'blobs' at 0x7db1391f2140>
162 self.get_selected_images_data(),
163 self.get_selected_annotation_data(),
164 num_object_annotation_spinner.value(),
165 self.feature_selector.getFeatures(),
166 num_max_depth_spinner.value(),
167 num_trees_spinner.value(),
168 str(filename_edit.value.absolute()).replace("\\", "/").replace("//", "/"),
169 show_classifier_statistics_checkbox.isChecked(),
170 first_image_layer.scale
171 )
File ~/miniconda3/envs/napari25/lib/python3.10/site-packages/napari_accelerated_pixel_and_object_classification/_dock_widget.py:288, in ObjectSegmentation.train(self=<napari_accelerated_pixel_and_object_classification._dock_widget.ObjectSegmentation object>, images=array([[ 40, 32, ..., 200, 200],
[ 56, ...,
[ 96, 88, ..., 48, 48]], dtype=uint8), annotation=array([[0, 0, ..., 0, 0],
[0, 0, ..., 0, ...., 0, 0],
[0, 0, ..., 0, 0]], dtype=uint8), object_annotation_value=2, feature_definition='gaussian_blur=1 difference_of_gaussian=1 laplace_box_of_gaussian_blur=1 sobel_of_gaussian_blur=1', num_max_depth=2, num_trees=100, filename='/home/alobo/BioImage-Analysis-and-Data-Processing-Workshop-2025/ObjectSegmenter.cl', show_classifier_statistics=False, scale=array([1., 1.]))
284 classifier.output_probability_of_class = object_annotation_value
286 print("annotation shape", annotation.shape)
--> 288 classifier.train(feature_definition, annotation, images)
classifier = Classifier type: ObjectSegmenter
--- Random forest info ---
Used features for training: gaussian_blur=1 difference_of_gaussian=1 laplace_box_of_gaussian_blur=1 sobel_of_gaussian_blur=1
Ground truth dimensions: 2
Maximum depth: 2
Number of ensembles: 100
Number of classes:
Number of features: 0
Number of channels: 0Positive class identifier: 2
feature_definition = 'gaussian_blur=1 difference_of_gaussian=1 laplace_box_of_gaussian_blur=1 sobel_of_gaussian_blur=1'
annotation = array([[0, 0, ..., 0, 0],
[0, 0, ..., 0, 0],
...,
[0, 0, ..., 0, 0],
[0, 0, ..., 0, 0]], dtype=uint8)
images = array([[ 40, 32, ..., 200, 200],
[ 56, 40, ..., 216, 216],
...,
[ 80, 80, ..., 48, 48],
[ 96, 88, ..., 48, 48]], dtype=uint8)
290 print("Training done. Applying model...")
292 result = np.asarray(classifier.predict(features=feature_definition, image=images))
File ~/miniconda3/envs/napari25/lib/python3.10/site-packages/apoc/_object_segmenter.py:38, in ObjectSegmenter.train(self=Classifier type: ObjectSegmenter
--- Random fore...Number of channels: 0Positive class identifier: 2, features='gaussian_blur=1 difference_of_gaussian=1 laplace_box_of_gaussian_blur=1 sobel_of_gaussian_blur=1', ground_truth=array([[0, 0, ..., 0, 0],
[0, 0, ..., 0, ...., 0, 0],
[0, 0, ..., 0, 0]], dtype=uint8), image=array([[ 40, 32, ..., 200, 200],
[ 56, ...,
[ 96, 88, ..., 48, 48]], dtype=uint8), continue_training=False)
31 """Train the classifier with.
32
33 See Also
34 --------
35 .. PixelClassifier.train()
36 """
37 self.positive_class_identifier_from_file = self.positive_class_identifier
---> 38 super().train(features, ground_truth, image, continue_training=continue_training)
features = 'gaussian_blur=1 difference_of_gaussian=1 laplace_box_of_gaussian_blur=1 sobel_of_gaussian_blur=1'
ground_truth = array([[0, 0, ..., 0, 0],
[0, 0, ..., 0, 0],
...,
[0, 0, ..., 0, 0],
[0, 0, ..., 0, 0]], dtype=uint8)
image = array([[ 40, 32, ..., 200, 200],
[ 56, 40, ..., 216, 216],
...,
[ 80, 80, ..., 48, 48],
[ 96, 88, ..., 48, 48]], dtype=uint8)
continue_training = False
File ~/miniconda3/envs/napari25/lib/python3.10/site-packages/apoc/_pixel_classifier.py:101, in PixelClassifier.train(self=Classifier type: ObjectSegmenter
--- Random fore...Number of channels: 0Positive class identifier: 2, features='gaussian_blur=1 difference_of_gaussian=1 laplace_box_of_gaussian_blur=1 sobel_of_gaussian_blur=1', ground_truth=array([[0, 0, ..., 0, 0],
[0, 0, ..., 0, ...., 0, 0],
[0, 0, ..., 0, 0]], dtype=uint8), image=array([[ 40, 32, ..., 200, 200],
[ 56, ...,
[ 96, 88, ..., 48, 48]], dtype=uint8), continue_training=False)
99 # make features and convert in the right format
100 self.num_ground_truth_dimensions = len(ground_truth.shape)
--> 101 features = self._make_features_potentially_multichannel(features, image)
features = 'gaussian_blur=1 difference_of_gaussian=1 laplace_box_of_gaussian_blur=1 sobel_of_gaussian_blur=1'
self = Classifier type: ObjectSegmenter
--- Random forest info ---
Used features for training: gaussian_blur=1 difference_of_gaussian=1 laplace_box_of_gaussian_blur=1 sobel_of_gaussian_blur=1
Ground truth dimensions: 2
Maximum depth: 2
Number of ensembles: 100
Number of classes:
Number of features: 0
Number of channels: 0Positive class identifier: 2
image = array([[ 40, 32, ..., 200, 200],
[ 56, 40, ..., 216, 216],
...,
[ 80, 80, ..., 48, 48],
[ 96, 88, ..., 48, 48]], dtype=uint8)
102 self.num_features = len(features)
103 X, y = self._to_np(features, ground_truth)
File ~/miniconda3/envs/napari25/lib/python3.10/site-packages/apoc/_pixel_classifier.py:282, in PixelClassifier._make_features_potentially_multichannel(self=Classifier type: ObjectSegmenter
--- Random fore...Number of channels: 0Positive class identifier: 2, features='gaussian_blur=1 difference_of_gaussian=1 laplace_box_of_gaussian_blur=1 sobel_of_gaussian_blur=1', image=array([[ 40, 32, ..., 200, 200],
[ 56, ...,
[ 96, 88, ..., 48, 48]], dtype=uint8))
280 features = new_features
281 else:
--> 282 features = self._make_features(features, image)
features = 'gaussian_blur=1 difference_of_gaussian=1 laplace_box_of_gaussian_blur=1 sobel_of_gaussian_blur=1'
image = array([[ 40, 32, ..., 200, 200],
[ 56, 40, ..., 216, 216],
...,
[ 80, 80, ..., 48, 48],
[ 96, 88, ..., 48, 48]], dtype=uint8)
self = Classifier type: ObjectSegmenter
--- Random forest info ---
Used features for training: gaussian_blur=1 difference_of_gaussian=1 laplace_box_of_gaussian_blur=1 sobel_of_gaussian_blur=1
Ground truth dimensions: 2
Maximum depth: 2
Number of ensembles: 100
Number of classes:
Number of features: 0
Number of channels: 0Positive class identifier: 2
283 return features
File ~/miniconda3/envs/napari25/lib/python3.10/site-packages/apoc/_pixel_classifier.py:304, in PixelClassifier._make_features(self=Classifier type: ObjectSegmenter
--- Random fore...Number of channels: 0Positive class identifier: 2, features='gaussian_blur=1 difference_of_gaussian=1 laplace_box_of_gaussian_blur=1 sobel_of_gaussian_blur=1', image=array([[ 40, 32, ..., 200, 200],
[ 56, ...,
[ 96, 88, ..., 48, 48]], dtype=uint8))
302 if image is None:
303 raise TypeError("If features are provided as string, an image must be given as well to generate features.")
--> 304 features = generate_feature_stack(image, features)
features = 'gaussian_blur=1 difference_of_gaussian=1 laplace_box_of_gaussian_blur=1 sobel_of_gaussian_blur=1'
image = array([[ 40, 32, ..., 200, 200],
[ 56, 40, ..., 216, 216],
...,
[ 80, 80, ..., 48, 48],
[ 96, 88, ..., 48, 48]], dtype=uint8)
306 return features
File ~/miniconda3/envs/napari25/lib/python3.10/site-packages/apoc/_utils.py:27, in generate_feature_stack(image=array([[ 40, 32, ..., 200, 200],
[ 56, ...,
[ 96, 88, ..., 48, 48]], dtype=uint8), features_specification='gaussian_blur=1 difference_of_gaussian=1 laplace_box_of_gaussian_blur=1 sobel_of_gaussian_blur=1')
9 def generate_feature_stack(image, features_specification : Union[str, PredefinedFeatureSet] = None):
10 """
11 Creates a feature stack from a given image.
12
(...)
24 a list of OCLarray images
25 """
---> 27 image = cle.push(image)
image = array([[ 40, 32, ..., 200, 200],
[ 56, 40, ..., 216, 216],
...,
[ 80, 80, ..., 48, 48],
[ 96, 88, ..., 48, 48]], dtype=uint8)
cle = <module 'pyclesperanto_prototype' from '/home/alobo/miniconda3/envs/napari25/lib/python3.10/site-packages/pyclesperanto_prototype/__init__.py'>
29 # default features
30 if features_specification is None:
File ~/miniconda3/envs/napari25/lib/python3.10/site-packages/pyclesperanto_prototype/_tier0/_push.py:41, in push(any_array=array([[ 40, 32, ..., 200, 200],
[ 56, ...,
[ 96, 88, ..., 48, 48]], dtype=uint8))
38 if hasattr(any_array, 'shape') and hasattr(any_array, 'dtype') and hasattr(any_array, 'get'):
39 any_array = np.asarray(any_array.get())
---> 41 return Backend.get_instance().get().from_array(np.float32(any_array))
any_array = array([[ 40, 32, ..., 200, 200],
[ 56, 40, ..., 216, 216],
...,
[ 80, 80, ..., 48, 48],
[ 96, 88, ..., 48, 48]], dtype=uint8)
np = <module 'numpy' from '/home/alobo/.local/lib/python3.10/site-packages/numpy/__init__.py'>
File ~/miniconda3/envs/napari25/lib/python3.10/site-packages/pyclesperanto_prototype/_tier0/_opencl_backend.py:44, in OpenCLBackend.from_array(self=<pyclesperanto_prototype._tier0._opencl_backend.OpenCLBackend object>, *args=(array([[ 40., 32., ..., 200., 200.],
[ 5... [ 96., 88., ..., 48., 48.]], dtype=float32),), **kwargs={})
43 def from_array(self, *args, **kwargs):
---> 44 return OCLArray.from_array(*args, **kwargs)
args = (array([[ 40., 32., ..., 200., 200.],
[ 56., 40., ..., 216., 216.],
...,
[ 80., 80., ..., 48., 48.],
[ 96., 88., ..., 48., 48.]], dtype=float32),)
kwargs = {}
File ~/miniconda3/envs/napari25/lib/python3.10/site-packages/pyclesperanto_prototype/_tier0/_pycl.py:69, in OCLArray.from_array(cls=<class 'pyclesperanto_prototype._tier0._pycl.OCLArray'>, arr=array([[ 40., 32., ..., 200., 200.],
[ 5... [ 96., 88., ..., 48., 48.]], dtype=float32), *args=(), **kwargs={})
66 @classmethod
67 def from_array(cls, arr, *args, **kwargs):
68 assert_supported_ndarray_type(arr.dtype.type)
---> 69 queue = get_device().queue
70 return OCLArray.to_device(queue, prepare(arr), *args, **kwargs)
File ~/miniconda3/envs/napari25/lib/python3.10/site-packages/pyclesperanto_prototype/_tier0/_device.py:45, in get_device()
43 def get_device() -> Device:
44 """Get the current device GPU class."""
---> 45 return _current_device._instance or select_device()
_current_device._instance = None
File ~/miniconda3/envs/napari25/lib/python3.10/site-packages/pyclesperanto_prototype/_tier0/_device.py:75, in select_device(name=None, dev_type=None, score_key=None, device_index=-1)
71 except:
72 pass
---> 75 device = filter_devices(name, dev_type, score_key)[device_index]
device_index = -1
name = None
dev_type = None
score_key = None
76 if name is not None and name not in device.name:
77 warnings.warn(f"No OpenCL device found with {name} in their name. Using {device.name} instead.")
File ~/miniconda3/envs/napari25/lib/python3.10/site-packages/pyclesperanto_prototype/_tier0/_device.py:107, in filter_devices(name=None, dev_type=None, score_key=None)
95 """Filter devices based on various options
96
97 :param name: First device that contains ``name`` will be returned, defaults to None
(...)
104 :rtype: List[cl.Device]
105 """
106 devices = []
--> 107 for platform in cl.get_platforms():
cl.get_platforms = <nanobind.nb_func object at 0x7db13b2db010>
cl = <module 'pyopencl' from '/home/alobo/miniconda3/envs/napari25/lib/python3.10/site-packages/pyopencl/__init__.py'>
108 for device in platform.get_devices():
109 if name and name.lower() in device.name.lower():
LogicError: clGetPlatformIDs failed: PLATFORM_NOT_FOUND_KHR
Metadata
Metadata
Assignees
Labels
No labels