反思深度学习与传统计算机视觉的关系-程序员宅基地

技术标签: ViewUI  人工智能  前端  

TB1dZoXP9zqK1RjSZFpXXakSXXa.jpg

雷锋网(公众号:雷锋网)注:【 图片来源:Google  所有者:Google 】

如今,深度学习在众多领域都有一席之地,尤其是在计算机视觉领域。尽管许多人都为之深深着迷,然而,深网就相当于一个黑盒子,我们大多数人,甚至是该领域接受过培训的科学家,都不知道它们究竟是如何运作的。

大量有关深度学习的成功或失败事例给我们上了宝贵的一课,教会我们正确处理数据。在这篇文章中,我们将深入剖析深度学习的潜力,深度学习与经典计算机视觉的关系,以及深度学习用于关键应用程序的潜在危险。

视觉问题的简单与复杂

首先,我们需要就视觉/计算机视觉问题提出一些看法。原则上它可以这样理解,人们给定一幅由摄像机拍摄的图像,并允许计算机回答关于与该图像内容的相关问题。

问题的范围可以从“图像中是否存在三角形”,“图像中是否有人脸”等简单问题到更为复杂的问题,例如“图像中是否有狗在追逐猫”。尽管这类的问题看起来很相似,对于人类来说甚至有点微不足道,但事实证明,这些问题所隐藏的复杂性存在巨大差异。   

虽然回答诸如“图像中是否有红圈”或“图像中有多少亮点”之类的问题相对容易,但其他看似简单的问题如“图像中是否有一只猫”,则要复杂得多。“简单”视觉问题和“复杂”视觉问题之间的区别难以界限。

这一点值得注意,因为对于人类这种高度视觉化的动物来说,上述所有问题都是不足以成为难题,即便是对孩子们来说,回答上述视觉问题也并不困难。然而,处在变革时期的深度学习却无法回答这些问题。

传统计算机视觉V.S.深度学习

传统计算机视觉是广泛算法的集合,允许计算机从图像中提取信息(通常表示为像素值数组)。目前,传统计算机视觉已有多种用途,例如对不同的对象进行去噪,增强和检测。

一些用途旨在寻找简单的几何原语,如边缘检测,形态分析,霍夫变换,斑点检测,角点检测,各种图像阈值化技术等。还有一些特征代表技术,如方向梯度直方图可以作为机器学习分类器的前端,来构建更复杂的检测器。

与普遍的看法相反,上面讨论的工具结合在一起可以造出针对特定对象的检测器,这种检测器性能强,效率高。除此之外,人们还可以构建面部检测器,汽车检测器,路标检测器,在精准度和计算复杂性等方面,这些检测器很可能优于深度学习。

但问题是,每个检测器都需要由有能力的人从头开始构建,这一行为低效又昂贵。因此,从历史上看,表现优良的探测器只适用于那些必须经常被检测,并且能够证明前期投资是明智的对象。

这些探测器中有许多是专有的,不向公众开放,比如人脸检测器,车牌识别器等等。但是,没有一个心智正常的人会花钱编写狗探测器或分类器,以便从图像中对狗的品种进行分类。于是,深度学习就派上了用场。

尖子生的启迪

假设你正在教授计算机视觉课程,在课程的前半部分,你要带领学生们复习大量的专业知识,然后留时间给学生完成任务,也就是收集图像内容并提问。任务一开始很简单,例如通过询问图像中是否有圆形或正方形,再到更复杂的任务,例如区分猫和狗。

学生每周都要编写计算机程序来完成任务,而你负责查看学生编写的代码,并运行查看它们的效果如何。

这个学期,一名新生加入了你的班级。他不爱说话,不爱社交,也没有提过什么问题。但是,当他提交自己的第一个任务方案时,你感到有点意外。这名新生编写的代码让人难以理解,你从来都没见过这样的代码。看起来他像是用随机的过滤器对每幅图像进行卷积,然后再用非常奇怪的逻辑来得到最终的答案。

你运行了这段代码,效果非常好。你心想,虽然这个解决方案非同寻常,但只要它有效就足够了。几周过去了,学生们需要完成的任务难度越来越高,你也从这名新生那里得到了越来越复杂的代码。他的代码出色地完成了难度日益增大的任务,但你无法真正理解其中的内容。

期末的时候,你给学生们布置了一项作业,用一组真实的图片来区分猫和狗。结果,没有学生能够在这项任务上达到超过65%的准确率,但是新生编写的代码准确率高达95%,你大吃一惊。你开始在接下来的几天中深入分析这些高深莫测的代码。你给它新的示例,然后进行修改,试着找出影响程序决策的因素,对其进行反向工程。

最终你得出一个非常令人惊讶的结论:代码会检测出狗的标签。如果它能检测到标签,那么它就可以判断对象的下部是否为棕色。如果是,则返回“cat”,否则返回“dog”。如果不能检测到标签,那么它将检查对象的左侧是否比右侧更黄。如果是,则返回“dog”,否则返回“cat”。

你邀请这名新生到办公室,并把研究结果呈给他。你向他询问,是否认为自己真的解决了问题?在长时间的沉默之后,他终于喃喃自语道,他解决了数据集显示的任务,但他并不知道狗长什么样,也不知道狗和猫之间有什么不同……

很明显,他作弊了,因为他解决任务目的和你想要的目的无关。不过,他又没有作弊,因为他的解决方案确实是有效的。然而,其他学生的表现都不怎么样。他们试图通过问题来解决任务,而不是通过原始数据集。虽然,他们的程序运行得并不好,倒也没有犯奇怪的错误。

深度学习的祝福和诅咒

深度学习是一种技术,它使用一种称为梯度反向传播的优化技术来生成“程序”(也称为“神经网络”),就像上面故事中学者学生编写的那些程序一样。这些“程序”和优化技术对世界一无所知,它所关心的只是构建一组转换和条件,将正确的标签分配给数据集中的正确图像。

通过向训练集添加更多的数据,可以消除虚假的偏差,但是,伴随着数百万个参数和数千个条件检查,反向传播生成的“程序”会非常大,非常复杂,因此它们可以锁定更细微偏差的组合。任何通过分配正确标签,来统计优化目标函数的方法都可以使用,不管是否与任务的“语义精神”有关。

这些网络最终能锁定“语义正确”的先验吗?当然可以。但是现在有大量的证据表明,这并不是这些网络分内之事。相反的例子表明,对图像进行非常微小的、无法察觉的修改就可以改变检测结果。

研究人员对训练过的数据集的新示例进行了研究,结果表明,原始数据集之外的泛化要比数据集内的泛化弱得多,因此说明,网络所依赖的给定数据集具有特定的低层特性。在某些情况下,修改单个像素就足以产生一个新的深度网络分类器。

在某种程度上,深度学习最大的优势就是自动创建没有人会想到的特性能力,这同时也是它最大的弱点,因为大多数这些功能至少在语义上看起来,可以说是“可疑的”。

什么时候有意义,什么时候没有意义?

深度学习对于计算机视觉系统来说无疑是一个有趣的补充。我们现在可以相对容易地“训练”探测器来探测那些昂贵且不切实际的物体。我们还可以在一定程度上扩展这些检测器,以使用更多的计算能力。

但我们为这种奢侈付出的代价是高昂的:我们不知道深度学习是如何做出判断,而且我们确实知道,分类的依据很可能与任务的“语义精神”无关。而且,只要输入数据违反训练集中的低水平偏差,检测器就会出现失效。这些失效条件目前尚且不为人知。

因此,在实践中,深度学习对于那些错误不是很严重,并且保证输入不会与训练数据集有很大差异的应用程序非常有用,这些应用能够承受5%以内的错误率就没问题,包括图像搜索、监视、自动化零售,以及几乎所有不是“关键任务”的东西。

具有讽刺意味的是,大多数人认为深度学习是应用领域的一次革命,因为深度学习的决策具有实时性,错误具有重大性,甚至会导致致命的结果,如自动驾驶汽车,自主机器人(例如,最近的研究表明,基于深层神经网络的自主驾驶确实容易受到现实生活中的对抗性攻击)。我只能将这种信念描述为对“不幸”的误解。

一些人对深度学习在医学和诊断中的应用寄予厚望。然而,在这方面也有一些令人担忧的发现,例如,针对一个机构数据的模型未能很好地检测另一个机构数据。这再次印证了一种观点:这些模型获取的数据要比许多研究人员所希望的更浅。

数据比我们想象的要浅

出人意料的是,深度学习教会了我们一些关于视觉数据(通常是高维数据)的东西,这个观点十分有趣:在某种程度上,数据比我们过去认为的要“浅”得多。

似乎有更多的方法来统计地分离标有高级人类类别的可视化数据集,然后有更多的方法来分离这些“语义正确”的数据集。换句话说,这组低水平的图像特征比我们想象的更具“统计意义”。这是深度学习的伟大发现。

如何生成“语义上合理”的方法来分离可视数据集模型的问题仍然存在,事实上,这个问题现在似乎比以前更难回答。

结论

深度学习已经成为计算机视觉系统的重要组成部分。但是传统的计算机视觉并没有走到那一步,而且,它仍然可以用来建造非常强大的探测器。这些人工制作的检测器在某些特定的数据集度量上可能无法实现深度学习的高性能,但是可以保证依赖于输入的“语义相关”特性集。

深度学习提供了统计性能强大的检测器,而且不需要牺牲特征工程,不过仍然需要有大量的标记数据、大量GPU,以及深度学习专家。然而,这些强大的检测器也会遭遇意外的失败,因为它们的适用范围无法轻易地描述(或者更确切地说,根本无法描述)。

需要注意的是,上面的讨论都与“人工智能”中的AI无关。我不认为像深度学习与解决人工智能的问题有任何关系。但我确实认为,将深度学习、特性工程和逻辑推理结合起来,可以在广泛的自动化空间中实现非常有趣和有用的技术能力。

雷锋网注:本文编译自Piekniewski's blog

雷锋网注:【封面图片来源:网站名Google,所有者:Google】

雷锋网版权文章,未经授权禁止转载。详情见转载须知。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33711641/article/details/89572967

智能推荐

JWT(Json Web Token)实现无状态登录_无状态token登录-程序员宅基地

文章浏览阅读685次。1.1.什么是有状态?有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。缺点是什么?服务端保存大量数据,增加服务端压力 服务端保存用户状态,无法进行水平扩展 客户端请求依赖服务.._无状态token登录

SDUT OJ逆置正整数-程序员宅基地

文章浏览阅读293次。SDUT OnlineJudge#include<iostream>using namespace std;int main(){int a,b,c,d;cin>>a;b=a%10;c=a/10%10;d=a/100%10;int key[3];key[0]=b;key[1]=c;key[2]=d;for(int i = 0;i<3;i++){ if(key[i]!=0) { cout<<key[i.

年终奖盲区_年终奖盲区表-程序员宅基地

文章浏览阅读2.2k次。年终奖采用的平均每月的收入来评定缴税级数的,速算扣除数也按照月份计算出来,但是最终减去的也是一个月的速算扣除数。为什么这么做呢,这样的收的税更多啊,年终也是一个月的收入,凭什么减去12*速算扣除数了?这个霸道(不要脸)的说法,我们只能合理避免的这些跨级的区域了,那具体是那些区域呢?可以参考下面的表格:年终奖一列标红的一对便是盲区的上下线,发放年终奖的数额一定一定要避免这个区域,不然公司多花了钱..._年终奖盲区表

matlab 提取struct结构体中某个字段所有变量的值_matlab读取struct类型数据中的值-程序员宅基地

文章浏览阅读7.5k次,点赞5次,收藏19次。matlab结构体struct字段变量值提取_matlab读取struct类型数据中的值

Android fragment的用法_android reader fragment-程序员宅基地

文章浏览阅读4.8k次。1,什么情况下使用fragment通常用来作为一个activity的用户界面的一部分例如, 一个新闻应用可以在屏幕左侧使用一个fragment来展示一个文章的列表,然后在屏幕右侧使用另一个fragment来展示一篇文章 – 2个fragment并排显示在相同的一个activity中,并且每一个fragment拥有它自己的一套生命周期回调方法,并且处理它们自己的用户输_android reader fragment

FFT of waveIn audio signals-程序员宅基地

文章浏览阅读2.8k次。FFT of waveIn audio signalsBy Aqiruse An article on using the Fast Fourier Transform on audio signals. IntroductionThe Fast Fourier Transform (FFT) allows users to view the spectrum content of _fft of wavein audio signals

随便推点

Awesome Mac:收集的非常全面好用的Mac应用程序、软件以及工具_awesomemac-程序员宅基地

文章浏览阅读5.9k次。https://jaywcjlove.github.io/awesome-mac/ 这个仓库主要是收集非常好用的Mac应用程序、软件以及工具,主要面向开发者和设计师。有这个想法是因为我最近发了一篇较为火爆的涨粉儿微信公众号文章《工具武装的前端开发工程师》,于是建了这么一个仓库,持续更新作为补充,搜集更多好用的软件工具。请Star、Pull Request或者使劲搓它 issu_awesomemac

java前端技术---jquery基础详解_简介java中jquery技术-程序员宅基地

文章浏览阅读616次。一.jquery简介 jQuery是一个快速的,简洁的javaScript库,使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互 jQuery 的功能概括1、html 的元素选取2、html的元素操作3、html dom遍历和修改4、js特效和动画效果5、css操作6、html事件操作7、ajax_简介java中jquery技术

Ant Design Table换滚动条的样式_ant design ::-webkit-scrollbar-corner-程序员宅基地

文章浏览阅读1.6w次,点赞5次,收藏19次。我修改的是表格的固定列滚动而产生的滚动条引用Table的组件的css文件中加入下面的样式:.ant-table-body{ &amp;amp;::-webkit-scrollbar { height: 5px; } &amp;amp;::-webkit-scrollbar-thumb { border-radius: 5px; -webkit-box..._ant design ::-webkit-scrollbar-corner

javaWeb毕设分享 健身俱乐部会员管理系统【源码+论文】-程序员宅基地

文章浏览阅读269次。基于JSP的健身俱乐部会员管理系统项目分享:见文末!

论文开题报告怎么写?_开题报告研究难点-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏15次。同学们,是不是又到了一年一度写开题报告的时候呀?是不是还在为不知道论文的开题报告怎么写而苦恼?Take it easy!我带着倾尽我所有开题报告写作经验总结出来的最强保姆级开题报告解说来啦,一定让你脱胎换骨,顺利拿下开题报告这个高塔,你确定还不赶快点赞收藏学起来吗?_开题报告研究难点

原生JS 与 VUE获取父级、子级、兄弟节点的方法 及一些DOM对象的获取_获取子节点的路径 vue-程序员宅基地

文章浏览阅读6k次,点赞4次,收藏17次。原生先获取对象var a = document.getElementById("dom");vue先添加ref <div class="" ref="divBox">获取对象let a = this.$refs.divBox获取父、子、兄弟节点方法var b = a.childNodes; 获取a的全部子节点 var c = a.parentNode; 获取a的父节点var d = a.nextSbiling; 获取a的下一个兄弟节点 var e = a.previ_获取子节点的路径 vue