CUDA实现了SLIC分段算法。

gpu-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第三方库


热门话题
来自偏移量的java JavaPairInputStream流   gzip Java TarInputStream读取tar的文件名。包含另一个tar的gz文件。gz文件   如何在Linux shell脚本中确定和使用实际的java路径   java请求太多FirebaseError   java错误json解析   java在localserver上发送安卓应用程序的输出   JavaSpring:启动和停止webapplication时更新DBtable条目   java如何使用JavaFX在矩形处设置文本?   java SQL查询在Hibernate中出现异常   java我无法使用javamail代码通过outlook(hotmail帐户)配置发送邮件,但在gmail中工作正常   java是不同的持久性。测试运行/JPA装置的xml属性   无头Eclipse的java导出战   使用ContentVersionStrategy的java Spring引导缓存禁止使用gzip进行资源压缩   java如何获取计算机的设备令牌?   图像文件的java ImageInfo不包含有效值   继承强制在Java中使用基类方法