Skip to content

Error at running Object Segmentation (APOC) #21

Open
@aloboa

Description

@aloboa

(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:

Image

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions