本文为转载,原博客地址为:https://blog.csdn.net/JackyTintin/article/details/7833774

原文来自MIT News

只要我们稍微留意一下Instagram便不难发现,图像处理软件有着的广阔的市场前景。Facebook正在试图用10亿元收购这家从事图像处理业务的公司。以往人们主要通过计算机来向网络上传照片;但现在,越来越多的人却选择直接通过手机发送。因此图像处理也逐渐在移动终端变得流行。同时,现在的数码图片普遍非常大,不借助好的软件工具,即使是在台式机上也需要花费很长的时间业处理。工程师可以通过一定的技巧来加速图像处理算法,但不幸的是,这些技巧会使代码几乎没有可读性,也很难被复用。想要向图像处理程序中增加一个函数,或者将算法移植到一个不同的平台上,往往需要彻底地修改整个代码。

MIT计算机科学和人工智能实验室(CSAIL)的研究人员开发了一门名为“ Hlaide ”的新的编程语言,旨在改变图像处理编程的现状。比起用传统语言编写的代码,用Halide编写的程序不仅更容易阅读、编写和修改,而且,由于Halide能够自动优化代码(对常规的编程语言,这个过程需要花费数小时来手工完成),因此,程序的运行速度也显著提高。
在测试中,MIT的研究人员用Halide重写了几个常用的图像处理算法(这些算法都事先经过熟练的程序员优化)。Halide版本的算法在代码量上大体要多出1/3,但性能却有极大的提升,加速比能够加速达2倍、3倍甚至6倍。在一个算法中,Halide程序虽然比原程序长,但却取得是了70倍的加速比。

Jonathan Ragan-Kelley(电子工程与计算机科学技术学院研究生)和Andrew Adams(CSAIL博士后)领导了Halide的开发,并且还将原代码在网上公布。在这个月的Siggraph(最重要的图形会议)上,他们提交了一篇关于Halide的文章,这篇文章由他俩与MIT计算工教授Saman Amarasingh、Fredo Durand,以及他们在Adobe和斯坦福的同事共同写的。

并行流水线

图像处理之所以需要如此大的计算量的原因之一是,它通常需要一系列离散操作。当光打到手机摄像头的传感器上之后,手机扫描图像数据,查找可能导致异常像素点的数据并加以纠正。之后,将传感器信息转化为像素的颜色信息,并进行颜色校正以和比对度高速高速,以使图像更接近人眼的观看效果。至此,手机已经进行了大量的处理工作,最后还要再对所有数据进行一次清理处理。

这么工作也仅仅是使图像在手机屏幕上得以显示。之后,我们还需要更多的处理步骤,以便用软件完成诸去除红眼、柔化阴影或增加饱和度(甚至是使图像看起来更有老式一次性照片的感觉)等操作。此外,高级的修改操作常常需要软件能够撤销现有操作,恢复到上一阶段的状态。
在今天的多核心芯片上,将图像的不同区域分配到不同的计算核心上并行执行,能够使图像处理更加高效。但是,通常各个核心在完成计算任务后,会将结果返回给主存。由于数据传输要比计算慢很多,所以这会抵销并行化带来的性能提升。

因此,软件工程师试图使每个核心在将它们的计算结果返回到主存前,尽可能的保持忙碌。这意味着,在最终汇总所有数据前,每个计算核心都必须在它所分得的数据上,执行图像处理流水线中的若干个步骤。高效的图像处理代码之所以难以编写,原因在于我们必须跟踪不同核心上处理的像素点之间的所有依赖关系。计算核心数量、计算核心的处理能力、分配给每个核心的局部内存大小以及核心何时将数据移出芯片外,在这些因素的选择之间必须作出折衷,而折衷方案则会因机器而异。因此一台设备而言优化的程序,换在另一台机器上可能起不到加速效果。

分而治之

使用Halide,程序员也还得自己考虑在特定机器上高效实现并行化的方案,但是仅就描述图像处理算法而言,程序员则完全不用担心这些。一个Halide程序有两部分组成:一部分是算法,另部分是“调度“(schedule)。调度指定了每个计算核心在各个处理步骤中需要处理的图像块的大小和形状。同时,它还指定的数据的依赖性——例如,某个核心上的某个处理步骤需要用到在另外的核心上之前步骤的计算结果。一旦调度确定,Halide将自动处理调度中描述的操作。
程序员如果想要将程序移植到一台不同的机器上,他不需要改变算法描述,只需变更调度。程序员如果想要向流水线中增加一个新的处理步骤,也只需要插入一个关于这个操作过程的新的描述,而无需修改已有的代码。(但是,流水线中的新步骤需要在调度中有一个与之对应的设定)
“当你有一个想法,想要将某个操作步骤而并行化,或者需要将某些步骤作某种修改时,如果你需要手动编码实现,那么你会发现,想要正确地表达自己的这个想法是件很困难的事情。”Ragan_Kelley说,“如果你有一个最的优化思路想要应用,很可能你必须花上三天时间去调度,因为你必须将原算法的操作步骤打散。而利用Halide,你只需理性一行代码就能正确地表达出你的想法。”
虽然比起普通的画像处理程序,Halide程序更易于编写和阅读,但是,由于对并行化的调度是自动完成的,因此,相当比大多数精心手工编写的代码,它们仍然能够经常获得性能上的提升。更重要的是,Halide代码非常容易修改,它使程序员能够轻松地通过实验去验证自己初步的想法能否提升性能。
“你可以随心所欲的尝试不同的整改,并且你总会发现一些好的东西,”Adams说,“之后,当你经过深思熟虑之后,你将会发现它们为什么好的道理。”
“使用一个领域相关的语言——像他们现在选择去研究开发的这门语言——能够带来许多激动人心的事情,但是,成功的例子屈指可数,”John Owens,加州理工大学戴维斯分校的一位电气与计算机工程助理教授如是说,“我认为这将会是一个美妙的成功故事。它具备你期望从一个完整系统上找到的所有的部件,而且它所针对的确实一个非常重要的领域。”
“我也能预计它在未来将激发一系列的工作,这项目将具有重大的影响力”Owens补充道。

Halide:简化图像编程相关推荐

  1. jQuery是一个JavaScript库极大的简化JavaScript编程

    jQuery是一个JavaScript库极大的简化JavaScript编程 1.jQuery 库包含以下特性: HTML 元素选取 HTML 元素操作 CSS 操作 HTML 事件函数 JavaScr ...

  2. 第十节:利用async和await简化异步编程模式的几种写法

    一. async和await简介 PS:简介 1. async和await这两个关键字是为了简化异步编程模型而诞生的,使的异步编程更简洁,它本身并不创建新线程,但在该方法内部开启多线程,则另算. 2. ...

  3. 译文丨伯克利对serverless的看法:简化云编程

    摘要:Serveless计算的目标和机会是让云编程者像使用高级语言那样受益. 本文分享自华为云社区<简化云编程,伯克利对serverless的看法(翻译)>,作者: 二手雄狮. 译者言: ...

  4. Python可以这样学(第七季:pillow扩展库图像编程)-董付国-专题视频课程

    Python可以这样学(第七季:pillow扩展库图像编程)-1738人已学习 课程介绍         董付国老师系列教材<Python程序设计(第2版)>(ISBN:978730243 ...

  5. C# 图像编程 (1) 准备工作; 你好,空姐; 为空姐照片添加特效

    很久之前,就想写一系列C#图像编程的文章,但始终没有下笔,其主要原因有二:(1)我的C#图像处理库 Geb.Image 库在大幅度变动中:(2)没有找到一个很好的演示工具.现在,对于第一个问题,Geb ...

  6. 计算机数控编程特点,什么是数控图像编程系统有哪些特点

    第五章 图像数控编程 一. 图像编程简介 二. 二坐标平面轮廓数 控加工图像编程 三. 多坐标图像数控编程 四. 高速切削加工简介 图像编程即根据计算 机图形显示器上显示的 零件设计三维模型,在1. ...

  7. 图形图像编程实践 课程报告

    文章目录 图形图像编程实践 课程报告 实验环境 EX01 图像的二值化 问题描述 算法设计 结果分析 原图 灰度图 二值化结果图 EX02 图像的加减 问题描述 算法设计 结果分析 原图 灰度图 图片 ...

  8. WINDOWS图像编程

    图形设备接口(GDI,Graphics Device Interface)的主要目标之一是支持在输出设备(如视频显示器.打印机和绘图仪)上的与设备无关的图形. GDI通过将应用程序与不同输出设备特性相 ...

  9. 如何自学图像编程(转)

    现在,图像类信息越来越多了,对图像的编程需求也越来越多.图像类项目的特点是性价比高,单行代码的价格一般是普通的程序的10倍,每行代码能够卖几块钱.很多人把目光放在这个上面.刚才又有网友咨询,做图像要看 ...

最新文章

  1. 全球科技大会鸿蒙,华为开发者大会:全球瞩目的“鸿蒙”面子和里子大格局
  2. Tomcat容器、JSP和Servlet
  3. session-cookie 和token登录验证
  4. 数据库中的表还是一定要建索引
  5. mysql有没有实现高可用_MySQL高可用架构:mysql+keepalived实现
  6. C#类、接口、虚方法和抽象方法
  7. 手写“2021”新年春节艺术字,好素材会说话!
  8. SpringBoot启动源码探究---getRunListener()
  9. 二维前缀和(附模板题)
  10. 手把手教你升级到MySQL 8.0
  11. JavaWebServlet学生教师信息管理系统【JavaWeb】Servlet+Mysql+Jsp+Tomcat
  12. 【C++设计模式】建造者模式
  13. Django模板实现地址的省市县三级联动
  14. 目标检测之RFB-NET(论文翻译辅助阅读)
  15. css+svg实现的定宽高比
  16. 学习自旋电子学的笔记00:杂谈(闲话) OOMMF软件的安装
  17. 安全面试之WEB安全(二)
  18. 但使龙城飞将在,不教胡马度阴山
  19. 大学物理--电磁辐射的量子理论部分
  20. 芒果PPT助手在POWERPOINT中的使用

热门文章

  1. jQuery入门案例
  2. uni-app H5 的下载,如何实现
  3. 图像的灰度化灰度值的读取Matlab
  4. 深度学习中的优化问题
  5. 刘润对谈吴军:给腾讯和所有上进企业的4点建议
  6. MTP模式下恢复手机误删数据方法(MX2、MX3亲测可用)
  7. PCPNET与POINTNET的比较
  8. Trinity 概述(一)
  9. Qt MetaObject 详解之二:QMeta数据以及数据结构信息
  10. FindProxyForURL设置浏览器代理