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编译:

  1. cuda-slic使用pycuda进行JIT编译。在
  2. gpu-slic使用cupy进行JIT编译。在

安装cuda slic(带PyCUDA)

^{pr2}$

cuda-slic使用pycuda,它具有以下非python 生成依赖项:

  1. gcc和g++/gcc-c++。Windows上的MSVC++编译器和C++构建工具。在
  2. 用于与cuda.h链接的cudatoolkit。在

以及以下运行时依赖项:

  1. gcc和g++/gcc-c++。Windows上的MSVC++编译器和C++构建工具。在
  2. 用于链接cuda库的cudatoolkit。在
  3. nvcc编译器。随附更新的cudatoolkit版本提供。在

请参见pycuda docs 安装说明。在

安装gpu slic(带Cupy)

pip install gpu-slic

gpu-slic使用具有以下非python的Cupy 生成依赖项:

  1. gcc和g++/gcc-c++。在
  2. 用于链接cuda库的cudatoolkit。在
  3. 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)

发展

先决条件:
  1. gcc和g++/gcc-c++已安装并在PATH上可用。在
  2. cudatoolkit已安装,CUDA_HOME指向其位置。在
  3. 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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
http POST请求Java CouchDB   java删除带有大量尾随0的浮点字符串上的科学符号   JavaEE5和Hibernate   java如何在Spring Social中获得比特定id更早的tweet   java是框架。revalidate()在事件后获取输出是否重要?   java为什么不能返回通用映射?   java如何理解和优化工厂方法的高自时间   java Eclipse 202006错误由于项目的生成路径不完整,因此未生成该项目   多线程是java。util。向量序列化线程安全?   在Eclipse和java中使用不同的构建配置。属性文件   编译Java:从命令行运行的问题   java如何知道消息是否已确认/取消?   Java铸造一套   java Android Seekbar progress已更改变量,给出错误