SLIC分段算法的CUDA实现。
cuda-slic的Python项目详细描述
cuda-slic:slic超像素算法的cuda实现
SLIC公司
SLIC代表simple linear iterative clustering。SLIC用途 平铺k-均值聚类将输入图像分割成一个集合 超像素/超体素。在
这个库被设计用来分割来自不同 探测器位于Diamond Light Source。这些图像 可以非常大,所以使用串行CPU代码是不可能的。在
为了加快处理速度,我们使用GPU加速来达到很高的速度
对替代实现的改进。cuda-slic
借用了它的API
来自skimage.segmentation.slic
。在
基准
Machine:8核Intel Xeon(R)W-2123 CPU@3.60GHz,NVIDIA Quadro P2000
fromskimageimportdatafromcuda_slic.slicimportslicascuda_slicfromskimage.segmentationimportslicasskimage_slicblob=data.binary_blobs(length=500,n_dim=3,seed=2)n_segments=500**3/5**3# super pixel shape = (5,5,5)%timeit-r1-n1skimage_slic(blob,n_segments=n_segments,multichannel=False,max_iter=5)# 2min 28s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)%timeit-r1-n1cuda_slic(blob,n_segments=n_segments,multichannel=False,max_iter=5)# 13.1 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
CUDA JIT编译
cuda-slic
使用JIT编译将CUDA内核转换为GPU机器码(PTX)。
使用python进行JIT编译CUDA代码有两个选项:Cupy或PyCUDA。
如果PyCUDA安装在virtutalenv中,则默认使用它。否则丘比就是
用过。在
为了便于分发,cuda-slic
被打包成两个独立的包,它们共享
相同的源代码,但依赖于不同的库进行JIT编译:
cuda-slic
使用pycuda进行JIT编译。在gpu-slic
使用cupy进行JIT编译。在
安装cuda slic(带PyCUDA)
^{pr2}$cuda-slic
使用pycuda,它具有以下非python
生成依赖项:
- gcc和g++/gcc-c++。Windows上的MSVC++编译器和C++构建工具。在
- 用于与
cuda.h
链接的cudatoolkit。在
以及以下运行时依赖项:
- gcc和g++/gcc-c++。Windows上的MSVC++编译器和C++构建工具。在
- 用于链接cuda库的cudatoolkit。在
- nvcc编译器。随附更新的cudatoolkit版本提供。在
请参见pycuda docs 安装说明。在
安装gpu slic(带Cupy)
pip install gpu-slic
gpu-slic
使用具有以下非python的Cupy
生成依赖项:
- gcc和g++/gcc-c++。在
- 用于链接cuda库的cudatoolkit。在
- nvcc编译器。随附更新的cudatoolkit版本提供。在
注意,当pip安装gpuslic时,cupy被安装为sdist
这意味着您的主机必须满足编译和链接要求
丘比的。在
检查conda forge上是否有gpu slic以获取 丘比的预编译二进制文件。在
另请参见cupy docs 安装说明。在
使用
fromcuda_slicimportslicfromskimageimportdata# 2D RGB imageimg=data.astronaut()labels=slic(img,n_segments=100,compactness=10)# 3D gray scalevol=data.binary_blobs(length=50,n_dim=3,seed=2)labels=slic(vol,n_segments=100,multichannel=False,compactness=0.1)# 3D multi-channel# volume with dimentions (z, y, x, c)# or video with dimentions (t, y, x, c)vol=data.binary_blobs(length=33,n_dim=4,seed=2)labels=slic(vol,n_segments=100,multichannel=True,compactness=1)
发展
先决条件:
- gcc和g++/gcc-c++已安装并在PATH上可用。在
- cudatoolkit已安装,CUDA_HOME指向其位置。在
nvcc
编译器。随附最新版本的cudatoolkit。在
依赖关系管理
我们使用conda
作为依赖项安装程序和虚拟环境管理器。
开发环境可以用
conda env create -f environment.yml
现在您可以使用conda activate cuda-slic
激活虚拟环境,
并用conda deactivate
关闭。
要添加依赖项,请将其添加到environment.yml文件中,然后可以运行
conda env update -f environment.yml
为了使environment.yml
文件尽可能精简,开发依赖项
保存在requirements_dev.txt
中,可以与一起安装
conda install --file requirements_dev.txt -c conda-forge
或者
pip install -r requirements_dev.txt
测试
在notebooks文件夹中有Jupyter笔记本 在这里可以直观地检查分割算法。在
我们选择的单元测试框架是Py.test。 单元测试可以用
conda activate cuda-slic pip install pytest pytest
或者
conda activate cuda-slic pip install tox tox
- 项目
标签: