图像处理用gpu

2016-12-20 17:01:51 qq_25819827 阅读数 19491

还认为你的电脑的速度效果比不上苹果吗?还在嫌电脑渲染速度慢吗?试一下,电脑开启GPU硬件加速吧!只要有独显轻松加速(毕竟苹果笔记本要配独显电脑的价格基本上在15000以上,而且显卡的性能还不怎么好)

先打开PhotoShop软件查看一下当前你电脑的ps软件用的是Inter的核显还是独显
选择编辑->首选项(可能要往下拉或者Photoshop全屏)->常规
这里写图片描述

选择常规后选择性能;可以看到如下界面:
这里写图片描述
其中内存使用情况通俗一点讲是让ps同时打开多少图片不卡,一般分配越多越好(如果本身电脑就比较卡,建议可以加一块内存,买内存时注意内存的频率)
旁边的图形处理器设置,如果检测到的是Inter /Inter(R) HD Graphics 4600(我的笔记本CPU是4代所以检测到是4XXX,如果是6代CPU择会检测到6XXX,虽然6XXX性能比4XXX好但一般和主流独立显卡还是差很远),
如果直接检测到是NVIDI或者AMD的就说明以经开启了独显的加速。

然后来尝试开启独显的功能:
先在桌面上点击右键看是否有英伟达控制面板的功能;这里写图片描述
如果没有可以下载驱动人生或者驱动精灵来更新一下驱动:
选择显卡驱动如(显卡NVIDIA GeForce XXX)选择安装,之后重启后右键就能看到有英伟达控制面板
这里写图片描述
打开英伟达控制面板后选择管理3D设置->全局设置中首选图形处理器选择高性能NVIDIA处理器(或者AMD)点击应用
之后再重启Ps->编辑->首选项->常规->性能就能看到图形处理器已经变成了NVIDI的显卡了
这里写图片描述
(唉~ 我的电脑比较差,被店家坑了,性能就属于比inter的集显好不到哪里去的那种,如果是950,960,性能应该会有很大提升,这就是为什么显卡要选得好一点);
再之前将全局图形处理器选择NVIDI处理器对看视频等也有加速(比如之前老师给的4k视频,cpu集显根本放不来,cpu直接飙到100%)
带来的坏处是电脑的耗电量比较快,在所用电池时可以再把全局图形处理器改为inter的
这里写图片描述
在介绍一下高级设置中的OPENCL:
OpenCL(全称Open Computing Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计算服务器、桌面计算系统、手持设备编写高效轻便的代码,而且广泛适用于多核心处理器(CPU)、图形处理器(GPU)、Cell类型架构以及数字信号处理器(DSP)等其他并行处理器,在游戏、娱乐、科研、医疗等各种领域都有广阔的发展前景。
OpenCL最初苹果公司开发,拥有其商标权,并在与AMD,IBM,英特尔和nVIDIA技术团队的合作之下初步完善。随后,苹果将这一草案提交至Khronos Group。
2008年6月的WWDC大会上,苹果提出了OpenCL规范,旨在提供一个通用的开放API,在此基础上开发GPU通用计算软件。随后,Khronos Group宣布成立GPU通用计算开放行业标准工作组,以苹果的提案为基础创立OpenCL行业规范。5个月后的2008年11月18日,该工作组完成了OpenCL 1.0规范的技术细节。2010年6月14日,OpenCL 1.1 发布。2011年11月15日,OpenCL 1.2 发布。2013年11月19日,OpenCL 2.0发布。
(opencl最初是由苹果开发的 ,苹果也是一家伟大的公司)

2018-05-24 12:06:19 ep661215 阅读数 2795

       文章最开始先致敬几位大佬的文章,有他们的无私奉献才有这篇入门级的文章,大家可以一起看看,瞻仰一下大佬们的风采:

文章1文章2文章3文章4

      如果通过以上4篇文章大家可以理解了ComputeShader并且满足了需求,那现在你就可以关闭页面了,接下来是针对不太理解的萌新的。

      言归正传,在看了上述几位大佬的文章以后,问我也照着写以一个抠图的脚本,结果有报错,并且其中的一些参数也不是太了解,后来经过苦苦思索倒是想通了某些关键和几个需要注意的点,现在写出来给可能用到的各位。

       先贴我的抠图代码吧:

       C#:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class MattingTexture : MonoBehaviour
{
    public Texture2D inputTexture;//输入图片
    public RawImage outputImage;//输出显示框
    public ComputeShader shader;
    int k;
    RenderTexture t;//输出图片
    // Use this for initialization
    void Start ()
    {
        t = new RenderTexture(inputTexture.width, inputTexture.height, 24);
        t.enableRandomWrite = true;
        t.Create();
        outputImage.texture = t;

        k = shader.FindKernel("CSMain");
        
    }
	
	// Update is called once per frame
	void Update () {
		
	}

    public void StartChange()
    {
        shader.SetTexture(k, "inputTexture", inputTexture);
        shader.SetTexture(k, "outputTexture", t);
        shader.Dispatch(k, inputTexture.width / 8, inputTexture.height / 8, 1);
    }
}

     shader:

// Each #kernel tells which function to compile; you can have many kernels
#pragma kernel CSMain
Texture2D inputTexture;

RWTexture2D <float4> outputTexture;
[numthreads(8,8,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{
	// TODO: insert actual code here!
	//for (int a = 0;a < dataCount;a++) {
	//	if (textureData[a].intR > minR) {
	//		if (textureData[a].intG < maxG) {
	//			if (textureData[a].intB < maxB) {

	//				continue;
	//			}
	//		}
	//	}
	//	textureData[a].intA = 0;//不满足条件设为透明
	//}
	float R = inputTexture[id.xy].r;
	float G = inputTexture[id.xy].g;
	float B = inputTexture[id.xy].b;
	float A = 1;
	if (R > 0.5) {
		if (G < 0.1) {
			if (B < 0.2) {
				R = G = B = 1;
				//A = 1;
			}
		}
	}
	outputTexture[id.xy] = float4(R, G, B, A); //过滤RGB
	
}

第一:问:C#中Dispatch中我为什么要除8呢?答案:因为在shader中我把线程分为了(8,8,1),这个什么意思呢?参考文章1说通俗点(可能不太对)就是有三个“核心”X、Y、Z,X分成了8个线程,Y分成8个,Z还是1个,每一个线程又分成一个 数组,那每个线程数组就有inputTexture.width / 8个需要处理的 项。

第二:问shader中的main的ID是什么?答:就是这个三维数组中的索引,在本例中就是像素的编号。

第三:注意:在shader中不要给小数后边加f,亲测,定义中加f会报错:Shader error in 'ChangeTexture.compute': syntax error: unexpected token 'f' at kernel CSMain at ChangeTexture.compute

然后就是输出结果,随便写的 ,给红色换成白色的:


2015-02-13 16:10:06 zj0789 阅读数 13445

OpenCV中提供了GPU模块,可以用来加速图像处理的相关运算。OpenCV的GPU模块是使用CUDA编写的。

OpenCV中GPU模块的调用点击这里,使用GPU模块需要开启WITH_CUDA选项。

OpenCV官方关于CUDA的说明及范例点击这里

关于如何在实时图像处理中使用OpenCV与GPU可以参考这篇文章


2013-08-14 11:22:47 zhang0311 阅读数 11150

1                什么是GPU高性能计算

      近年来,以NVIDIA Tesla为代表的异构芯片(协处理器)逐渐被引入到通用计算领域中。最初的图形处理(Graphic Processing Unit, GPU)就是用来处理大规模的并行计算,并且GPU的并行处理能力在不断的上升。GPU将更多的晶体管用于执行单元,而非像CPU那样用作复杂的数据cache和指令控制。由于GPU具有超强的浮点计算能力,除了在传统领域(图形显示,多用于游戏)的应用以外,GPU越来越多地应用在科学计算领域上,并且逐渐进入高性能计算的主流。

       CUDA(Compute Unified Device Architecture,统一计算设备架构)是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的高性能计算问题。CUDA编程是在C语言上的基础上对C语言的扩展,不再需要借助于图形学APICUDA开发人员只需要在C语言的基础上从CPU过度到GPU上,CUDA提供了简单、容易的GPU开发工具,因此对于开发者来说,CUDA的开发门槛大大降低了。CUDA编程采用了异构体系结构的模式,CPU作为主机,GPU作为CPU的协处理器(或称设备),CPUGPU协同工作,CPU负责逻辑性强的事务处理和串行计算,GPU负责高度并行化的计算任务,CPUGPU共同完成加速任务。

     CUDA编程语言的推出,使得在GPU平台上的高性能计算应用软件越来越多。目前,CUDA在石油勘测、流体动力学模拟、天文计算、分子动力学仿真、生物计算、图像处理、音频视频编解码、医疗成像、金融、数据库等领域得到广泛的应用,在很多应用中获得2-3个数量级的加速比,极大地提高了性能。

 

     GPU已广泛应用在图像增强处理、图像目标搜索、公安行业、国防安全、平安城市、交通系统、救灾、卫星成像、信号处理、人脸识别、指纹识别、多路高清直播、智能视频监控等领域中。在这些领域,利用GPU可以达到实时性计算,相对CPU平台加速数十倍甚至数百倍,CUDA计算在图像处理领域中的成功案例如下图:

2                GPU高性能计算特点

     目前,高端的Nvidia GPU包含上千个核,双精度峰值性能超过1Tflops,单精度性能超过3Tflops,性价比远超过CPUNVIDIA GPUTeslaGeForce两个系列,Tesla为服务器上专用,内存空间较大,运行稳定,但价格较高,GeForce系列显卡性能达到Tesla的性能,然而成本很低,中端系列的GeForce显卡只需要一千多元配置在PC上即可获得数十倍的性能。

     目前,很多应用运行在PC机器上,然后PC的性能有限,尤其随着处理的数据规模的增大,PC已远不能满足性能的需求,当采用CPU服务器解决时,成本将提高5-10倍,不利于成本的控制。然后,Nvidia提供了PC版本的GeForce系列GPUGeForce系列GPU价格在数百元到上万元之前,我们可以采用PC+ GeForce GPU的配置方案,性能同样可以获得原PC的数十倍,然而,成本仅增加10%-50%PC+GPU的优化方案将成为一些应用软件的重要配置方案。


          Emailzhang03_11@163.com

          QQ331526010

 

 

2014-07-27 20:47:02 Evankaka 阅读数 7318

     现代GPU提供了顶点处理器和片段处理器两个可编程并行处理部件。在利用GPU执行图像处理等通用计算任务时,要做的主要工作是把待求解的任务映射到GPU支持的图形绘制流水线上。通常的方法是把计算任务的输入数据用顶点的位置、颜色、法向量等属性或者纹理等图形绘制要素来表达,而相应的处理算法则被分解为一系列的执行步骤,并改写为GPU的顶点处理程序或片段处理程序,然后,调用3D API执行图形绘制操作,调用片段程序进行处理;最后,保存在帧缓存中的绘制结果就是算法的输出数据。虽然数字图像处理算法多种多样,具体实现过程也很不相同,但是在利用GPU进行并行化处理时,有一些共性的关键技术问题需要解决,如:数据的加载,计算结果的反馈、保存等。下面对这些共性的问题进行分析,并提出相应的解决思路。

    1.数据加载
    在GPU的流式编程模型中,所有的数据都必须以“流”的形式进行加载处理,并通过抽象的3D API进行访问。在利用GPU进行图像处理时,最直接有效的数据加载方法是把待处理的图像打包为纹理,在绘制四边形时进行加载、处理。同时为了保证GPU上片段程序能够逐像素的对纹理图像进行处理,必须将投影变换设置为正交投影,视点变换的视区与纹理大小相同,使得光栅化后的每个片段(fragment)和每个纹理单元(texel)一一对应。对于图像处理算法中的其他参数,如果数据量很小,则可以直接通过接口函数进行设置;如果参数比较多,也应该将其打包为纹理的形式传输给GPU。在打包的过程中应充分利用纹理图像所具有的R、G、B、A四个通道。
    2.计算结果的反馈、保存
应用程序是通过调用3D API绘制带纹理的四边形,激活GPU上的片段程序进行图像处理的,而GPU片段着色器的直接渲染输出是一个帧缓冲区,它对应着计算机屏幕上的一个窗口,传统上用来容纳要显示到屏幕的像素,但是在GPU流式计算中可以用来保存计算结果。虽然CPU可以通过3D API直接读写这个帧缓冲区,将渲染处理的结果从帧缓存中复制到系统内存进行保存,但是帧缓存的大小受窗口大小限制,而且由于AGP总线的带宽限制(2.1GB/s),从显存到系统

镜像变换 GPU 渲染主要包括以下几个步骤:

1) 设置 1 个输入纹理;
2) 对输入纹理进行纹理采样;
3) 设置变换矩阵;
4) 在顶点着色器中,将输入顶点与变换矩阵相乘;

5) 输出图像数据;


GPU 图像并行处理

阅读数 4427