当前位置: 首页 > 编程日记 > 正文

快手王华彦:端上视觉技术的极致效率及其短视频应用实践 | AI ProCon 2019

演讲嘉宾 | 王华彦(快手硅谷Y-tech实验室负责人)

编辑 | Just

出品 | AI科技大本营(ID:rgznai100)

快手用户日均上传1500万个视频,要把这些作品准确的分发给超2亿活跃用户,如果没有强大的AI技术系统去理解视频内容以及用户行为和需求,很难做到。

近日,由新一代人工智能产业技术创新战略联盟(AITISA)指导,鹏城实验室、北京智源人工智能研究院支持,专业中文 IT 技术社区 CSDN 主办的 2019 中国 AI 开发者大会(AI ProCon 2019)在北京举办。在计算机视觉技术专题,快手硅谷Y-tech实验室负责人王华彦讲述了端上视觉技术的极致效率及其短视频应用实践。

他指出了其中面临的技术挑战:第一,不可控的复杂场景和环境;第二,极为有限的移动设备计算资源;第三,由于所有应用有很强的时效性,需要做到快速开发和部署模型。

为了应对这些挑战,他介绍了解决方案和研究方向的三要素:首先是运用高度结构化的模型,并充分利用先验知识;其次,面对计算资源紧缺需要充分发掘各种冗余来提高算法的推理效率;最后,用高度结构化的信息表示提高学习算法利用数据的效率。

王华彦称,他们希望从一个可分解的、结构化的视觉信息表示出发,全面提高现有计算机视觉算法中的数据和计算效率,从提高模型推理效率,以此实现全面的效率提升,赋能短视频应用。

以下为王华彦演讲内容实录,AI科技大本营(ID:rgznai100)整理:

快手成立于2011年,从2013年开始把视频转型为短视频平台,2015年DAU突破1千万,百度和腾讯相继领投快手,2017年DAU突破1亿。在积累了这些资本和流量的优势之后,快手进入了非常高速的发展阶段,今年DAU突破2亿,全资收购A站,并领投了知乎。我们后面的目标是在明年春节之前DAU突破3亿。

快手平台的背后是有一套AI技术支撑,快手从2015年开始大量把AI技术用于各方面的内容生产、内容理解、用户理解、内容推荐、游戏广告,在所有这些落地场景中背后有硬件层、平台层、算法层一整套的AI硬核技术,这些技术会帮助我们用户生产出更多更有趣的内容,帮助平台更好的理解用户每天上传的视频,大家知道每天上传的视频有1500万,如果没有非常强大的系统理解用户行为和需求,就没办法把这些视频准确的分发给用户。

端上视觉技术赋能短视频应⽤

我们介绍几个案例说明端上视觉技术如何赋能短视频应用,快手Y-tech是我们公司专注于端上计算机视觉以及其他AI核心技术的部门。

这两个例子是去年上线的一个快手时光机可以通过现在的样子看到60年后的样子。今年8月份Y-tech北京团队上线了一个快手的娃娃脸,快手娃娃脸是国内首家实现端上实时GAN,从技术的层面讲变老是比较容易的,变年轻是比较难的,跟现实生活是一样的。为什么变老比较容易?它不需要改变整体的形状,只需要在脸上加上一些元素,变年轻需要通过对抗生成网络的技术改变脸部整体的信息。

还有个例子是用户只需要输入一幅图像,可以利用全自动的过程生成右边的视频,以全自动的方式把天空变暗,建筑物里的灯光亮起,大家都开始加班,建筑物上的大屏幕开始播放快手视频,所有这些都是自动实现。当然还有更多的例子,我们可以通过对用户拍摄场景进行很好的理解,然后加入各种各样虚拟元素,使得用户拍出更多更好玩的视频。

所有这些端上视觉短视频的应用场景在技术上的挑战,我们总结为三方面:第一是不可控的复杂场景和环境,比如在短视频应用中手机是拿在用户手里的,想怎么拍就怎么拍,可以横着、倒着、晃动拍,有各种完全没办法事先预料的场景;第二是极为有限的移动设备计算资源,大家知道一般的手机计算能力相对GPU来说是远远不如的,所以给我们的研究工作带来了更多挑战;第三是由于所有应用有很强的时效性,所以看到一个热点应用的时候就需要快速开发和部署模型,这也是短视频所独有的挑战。

为了解决这些挑战,我们的解决方案和研究方向有三个要素:第一是我们运用高度结构化的模型和充分利用先验知识,跟它相对的策略是随便一个什么任务只要知道了这个任务的输入和输出,然后以一种盲目的方式去确定很多数据,训练一个很大的神经网络,业界很多应用场景都是这样用的,但是对于独特的应用场景,我们为了提高效率需要更加高度结构化的模型运用更多的先验知识,不能简单是从输入到输出的网络。

第二是面对计算资源的紧缺需要充分发掘各种冗余来提高算法的推理效率,举个简单的例子,当你看到一个视频的时候,传统方法是每一帧都用同样的网络,每一帧都重复同样的计算,虽然你是在动,但是视频有很大的相似性,每一帧都重复计算就会有很多的冗余。

第三是用高度结构化的信息表示提高学习算法利用数据的效率

关于在复杂环境下运用高度结构化的模型和先验知识进行推理,这里详细讲解一个案例。这是我们今年发表在ICCV的一篇论文,该论文中的场景是从一只手的单幅图像出发,希望得到手的姿势和形状的完整信息,然后用右边这样一个三维网格来表达,从而对它有一个完整理解。

为了解决这样非常困难且有非常多不确定性的任务,我们需要一整套非常结构化的方法,简单介绍一下这个方法。

从左上角开始,首先是从单幅的图像经过一个类似于网络的结构得到二维关键点信息,每个二维关键点都用一个Heat maps表示,然后进入第二个模块,通过迭代回归网络,它的输出就是两部分参数,一部分是摄像机参数,比如从什么样的远近来看这只手,另一部分是网格参数。

再看右下角这部分,从网格参数出发有一个从参数得到完整的手的网格,这些参数控制了手的形状和它的姿势,通过这个参数得到的三维网格再加上相机参数就可以计算很多关于手的特征,有了这些信息之后,训练模型的时候就可以拿这些计算特征和它的真实值相比得到一个函数,比如二维关键点,我们可以得到一个二维关键点位置的准确性的函数,轮廓的信息也可以跟它的真实mask相比得到一个函数。

值得一提的是。还有一部分是关于手的几何约束,三维上手的姿势是不能任意变化的,比如每个手指上的关键点必须在一个平面上,不可能一个关节往这边弯另一个关节往另外一个方向,关键点不在一个平面,这是不可能的。有了所有这些函数,很重要的一条是这里使用的关于手的模型是一个可微分的,这些网格的顶点位置和那边的参数之间是一个很微分的关系,这样我们就可以对整个结构化的模型进行端到端的训练。

刚才提到的第二部分,从关键点到形状参数这样的网络叫做迭代回归网络,这个网络的输入是两部分,一部分从这些二维的关键点位置得到的feature,另一部分是对这些参数的预估值,一开始是一个初始值,每次我们都从feature和初始值出发得到一个修正值,这个修正值会被加到那个初始值上面再使用一次网络(更新),再得到一个修正值,经过几次的修正得到最后的参数值。这样一个推理的过程经过检验比直接从feature出发得到那个参数的最后值的直接网络效率高很多,所以在同样的大小下它的准确性更高。

这是一些结果的事例,最左边的一列是输入的图像,再过来的三列是从这个图像不同角度的得到的手的网格,所以我们是从一个图像可以完整地得到手的三维信息。由于这个方法中使用了大量的先验知识和极核约束,有遮挡的时候网络得到了很好的应用。

下面进入下一个案例,在这些应用中如何适应极为有限的移动设备计算资源,我们将会介绍两个工作,这都是Y-tech西雅图实验室今年发表的。

在移动端部署一个神经网络模型的时候我们关心的通常有三方面,我们不仅要关心结果的准确性,重要的是我们还需要关心计算过程的能耗以及计算过程的时间。

传统的方法是通过一个剪枝方法来优化这个模型的能耗时间,什么叫剪枝的方法?我们去压缩模型的大小,把模型的大小作为一个直接的目标函数,通过压缩模型的大小间接优化它的能耗以及推理的效率,具体的剪枝方法分为三类,在某一层剪除一些节点,在一个矩阵中把一些元素设为零或者整行整列设为零,或者对这个位置进行量化。

剪枝方法隐含的假设是这里用到的目标函数(也就是模型大小)跟我们的直接目标(运算时间和能耗)有一个严格对等的关系,但这个关系在实际中并不成立,一个更合理的方法并不是用模型大小作为目标,而是直接把能耗和运算时间作为一个目标的优化。

这么做肯定会有困难,问题是可以做成这样的形式,最小化的问题是我们在一个训练集上训练这个模型,底下的约束是我们需要在训练这个模型的同时,使这个模型满足某个能耗的约束,有两个关键的问题是,我们如何看这样的能耗约束以及在这样的约束下如何处理训练的问题。

第一个例子是在底层硬件操作的层面,我们把这样的能耗约束进行一个建模,我们把神经网络中的线性层抽象成一个矩阵乘积形式,分解成两部分,一部分是要进行计算,另一部分是其数据读写,我们把每一步计算和数据的读写都拿出来给一个参数,对整个过程进行建模。

这个工作中我们用了剪除连接关系的方法。建模后发现,约束在现在的硬件实现上表现为分段线性函数,这里有很多参数,取决于硬件和实现的具体环境,这里还有一些取最大和最小的操作,导致它并不是一个线性函数,而是分段线性函数,因为我们的硬件上有一些缓存操作,这就导致当它达到一个缓存最大值时会有非线性表现,这里的β1,β2是缓存大小的函数。

SGD是我们用来训练所有神经网络模型的基本方法,简单描述就是现在有一个约束,所以先用SGD走一步,发现现在不满足约束了,就把它投影到约束里,找一个跟现在最近的地方满足这个约束,再按照SGD的方向走一步再投影回来,是这么一个循环的过程。

这需要解决的一个关键技术问题是如何实现投影的分子,当给定这个约束时,如何从一个不满足约束的地方跳到满足约束的地方。在具体问题中经过一系列的推导,我们发现最后是可以写成线性约束,在每个投影的步骤上只需要满足一个线性约束。

这个问题最后等价于背包问题:我有一个书包,现在有一堆东西,怎么用这个书包拿走价值最大的东西,现在我有一堆神经网络的链接,如何在固定资源下使用更多神经网络链接?

背包的问题是Knapsack,如果不出意外的话没有什么好办法,但是在理论上会有一些实现起来非常复杂的近似的方法,我们用了一个非常简单的方法,先拣值钱的拿,先拿黄金,再拿白银,再拿其他的。

我们比较了三种不同的网络,比较了SSL、MP、EAP这几种现存方法,这个图的横轴是Normalized能耗,竖轴是准确度。蓝色线表现我们在同样的能耗下可以比MP的准确度高1.7%,横过来这个距离表示我们在同样的准确度下可以比EAP多节省30%的能耗。

下面进入第二个例子,通过剪除节点的方式。

剪除节点表现在模型参数上,我们会把模型整行设为零,(2,0)表示矩阵里的非零行的个数。这里需要考虑的主要关系是每个层上面非零节点的个数,用这些东西来表达整个能耗时候并不是一个线性函数,而是双线性函数,因为相邻的层之间有关联,而隔的很远的层之间可能没有关联,把每个相邻的层关联起来的话写出来就是双线性函数。

我们把这个能耗用这样一个双线性函数来建模,把这个模型参数用实测的数据拟合,就可以发现它在两种流行的硬件上都可以拟合得非常好。求解这样一个双线性函数的优化问题也可以有很多不同的方法,比如前面说到投影的SGD的方式,这边论文还介绍了ADM的方式都可以求解这个问题。

看一下结果,我们把这个方法比较了几种现存方法,纵轴是准确率,横轴是能耗,可以看出越往纵深越好,这些方法超出了现有方法。

追求计算机视觉的极致效率

下面讲一讲Y-tech硅谷实验室现在正在进行和落地的研究工作,分为两部分,总目标是提升计算机视觉算法的效率,效率包含计算资源效率和数据资源效率。

计算资源的效率能够提高是因为有很多冗余的计算,比如对每一帧都用一个模型的话实际是进行了一个冗余的计算;数据资源的效率,在学习知识的时候因为现在的神经网络类似于黑箱子,为了更加形象的说明为什么可以很大程度上提高效率,举个例子。

我们对比了人的认知过程的一些特性和现有神经网络的一些特性,发现人的认知过程是基于一个可分解的结构化表示,这让人类可以用非常高的效率来学习,而且可以进行非常高效的推理。当然这样一个比较并不能简单理解为我们要去模仿人的大脑建造AI,而是我们可以通过人的认知方式的特征出发,通过类比发现现有的AI算法可能存在的局限性,知道可以从哪些方面进行改进。

这里举一个例子,这里有很多关于人的图像,上排是真实图像,下排是一些虚拟图像,假设现在的任务是要从所有图像中如何学习别人的姿势。假设人来看这些图像,我们对于真实图像和虚拟图像的理解方式本质上差不多,比如我们会把它分解为形状和颜色纹理两部分,形状的信息对于我们学习人体姿态知识是有用的,颜色和纹理相对来说是不那么重要的,这样一种分解就可以让人在学习知识时把不同样本之间有用的部分联系起来,把不同样本之间的形状信息联系起来,从而达到非常高效的利用样本的学习方式。

但是现有的神经网络方法在表示视觉信息的时候对于颜色纹理、形状所有东西是混在一起的,因为这样一个特性对真实图像和虚拟图像进行表示时,在特征空间中会match到不同区域,这样的特性导致它没办法把不同样本以合适方式联系在一起,这样就使学习的效率非常低。

困难是由于表示方式造成的,这是我之前在Vicarious AI的工作,我们针对验证码这样一种特殊类型的图像建造了一个把形状和纹理分开表示的模型,这个模型只需虚拟数据就可以训练,比现有最好的神经网络在300倍的数据量下的处理效果要好,这个工作发表在2017年的《科学》杂志。

总结一下前面讲的观点。如果希望像人一样高效的从很少的数据或者虚拟的数据中学习,我们就需要分解的本事,把视觉信息分解为形状轮廓信息和颜色纹理的信息,对于很多任务来说只有形状轮廓是有用的,颜色和纹理不是那么重要,通过把不同属性信息分解出来才能在不同样本中有效建立联系,从而提高学习效率。

进行一个类比的话,我们想要实现像人一样高效的推理也需要一个分解,这是另一个角度,把视觉信息分解为形状、视觉属性和位置运动的信息,这样我们在看见一个运动场景时就不需在每一帧都反复识别不同的运动物体,对已经识别的运动物体,我对它的属性就了解了,只需要用知识判断它如何运动的。

这样具体的想法怎样落地到实践当中?传统的方法是通过单帧人工标注图像来训练一个神经网络,每一帧都用同一个网络,我们的工作是在前面神经网络的基础上出发进行一些结构上的修改,得到一个针对序列的网络,用我们标注的视频来训练这样一个RNN网络,这个网络就会发掘帧间冗余,利用动态信息,部署到视频应用。

简单总结一下Y-tech硅谷实验室的研究内容。我们希望从一个可分解的、结构化的视觉信息表示出发,全面提高现有计算机视觉算法中的数据和计算效率,提高模型推理的效率,以此实现全面的效率提升,赋能短视频应用。

演讲嘉宾简介:

王华彦,斯坦福大学计算机科学博士,师从Daphne Koller教授研究计算机视觉。曾就读于斯坦福大学人工智能实验室,为复杂化的概率图模型开发了高效的推理算法,并将其应用于计算机视觉研究。王博士的研究曾登上行业期刊CACM首页,并在多个顶级会议如CVPR、ICML、ECCV、IJCV、AAAI上发表。王华彦本科和硕士阶段就读于北京大学,师从査红彬教授,也曾参与香港科技大学杨强教授的科研活动。加入快手前,他曾担任Vicarious AI的高级研究员,以极其高效的数据方式,开发高度结构化的模型,解决CAPTCHA和Robotics等现实问题。他在人工智能领域的工作曾发表于美国的《科学》杂志。王博士现在领导快手位于硅谷的Y-tech实验室,在开发高效的人工智能解决方案的同时,也将更多的尖端技术引入快手的移动平台。

(*本文为 AI科技大本营原创文章,转载请微信联系1092722531)


精彩推荐

2019 中国大数据技术大会(BDTC)历经十一载,再度火热来袭!豪华主席阵容及百位技术专家齐聚,15 场精选专题技术和行业论坛,超强干货+技术剖析+行业实践立体解读,深入解析热门技术在行业中的实践落地。【早鸟票】【特惠学生票】限时抢购,扫码了解详情!

相关文章:

tmux简介及安装

tmux是一个开源工具,用于在一个终端窗口中运行多个终端会话。它可以减少过多的打开终端控制台。tmux的源码在 https://github.com/tmux/tmux ,它的License是BSD。tmux可以直接通过sudo apt-get install tmux命令安装(通过sudo apt-get remove tmux移除)…

Swift中依赖注入的解耦策略

原文地址:Dependency Injection Strategies in Swift 简书地址:Swift中依赖注入的解耦策略 今天我们将深入研究Swift中的依赖注入,这是软件开发中最重要的技术之一,也是许多编程语言中使用频繁的概念。 具体来说,我们将…

Eclipse mac 下的快捷键

2019独角兽企业重金招聘Python工程师标准>>> Eclipse,MyEclipse 的preference 在“windows”下边,mac下在左上角苹果图标边上 win下我们都习惯了ctrl c,在Mac 下使用标准键盘变成了win键c 系统的偏好设定 -> 键盘 -> 修饰…

Ubuntu上使终端显示Git分支(oh-my-zsh)

oh-my-zsh是基于Zsh(Zsh是一个Linux用户很少使用的power-shell,这是由于大多数Linux产品安装,以及默认使用bash shell)的功能作了一个扩展,方便插件管理、主体自定义等。oh-my-zsh源码在 https://github.com/robbyrussell/oh-my-zsh &#x…

天哪!我的十一假期被AI操控了

(图片付费下载自视觉中国)导语:这个假期,除了脑海一直在唱歌,庆祝祖国成立的 70 周年,当然也闲不住,要乘机出去浪一浪。目前小长假进度条已经进行到 71.4% 了,有没有发现这个假期与以…

使用SVN+Axure RP 8.0创建团队项目

一、使用到的工具:VisualSVN Server --SVN服务器:https://www.visualsvn.com/server/ Axure RP 8.0 :http://www.downcc.com/soft/103078.html 二、VisualSVN Server 安装以及操作1、安装 : 默认安装即可 2、操作: &a…

no no no.不要使用kill -9.

2019独角兽企业重金招聘Python工程师标准>>> no no no.不要使用kill -9. 它没有给进程留下善后的机会: 1) 关闭socket链接 2) 清理临时文件 3) 将自己将要被销毁的消息通知给子进程 4) 重置自己的终止状态 等等。 通常,应该发送15&#xff0c…

人工智能的“天罗地网”

(图片付费下载自视觉中国)整理 | 弯月编辑 | 郭芮来源 | CSDN(ID:CSDNnews)人工智能(AI)技术正在全球迅速崛起。不断涌现的最新发展令世人瞩目,从以假乱真的深度伪造视频&#xff0c…

Ubuntu下安装Cppcheck源码操作步骤

Cppcheck是用在C、C中对code进行静态检查的工具。它的源码在 https://github.com/danmar/cppcheck 。它的License是GPL-3.0。Cppcheck可以检查不通过编译的文件,执行的检查包括:(1)、自动变量检查;(2)、数组的边界检查;(3)、clas…

用“脸”打卡,抬头就能签到!

科技正在飞速改变我们的生活,以前我们上班的时候,脖子上总会挂一个IC卡用来验证身份和签到打卡,后来指纹识别出现了,我们又逐渐习惯了指纹打卡,到如今,随着人脸识别技术的出现,我们开始用“脸”…

OC基础第四讲--字符串、数组、字典、集合的常用方法

OC基础第四讲--字符串、数组、字典、集合的常用方法 字符串、数组、字典、集合有可变和不可变之分。以字符串为例,不可变字符串本身值不能改变,必须要用相应类型来接收返回值;而可变字符串调用相应地方法后,本身会改变&#xff1b…

分类、检测、分割任务均有SOTA表现,ACNet有多强?

(图片付费下载自视觉中国)作者 | 路一直都在来源 | 知乎专栏Abstract本文提出了一种新的自适应连接神经网络(ACNet),从两个方面对传统的卷积神经网络(CNNs)进行了改进。首先,ACNet通过自适应地确定特征节点之间的连接状态&#xf…

CUDA Samples: approximate prior vbox layer

以下CUDA sample是分别用C和CUDA实现的类似prior vbox layer的操作&#xff0c;并对其中使用到的CUDA函数进行了解说&#xff0c;各个文件内容如下&#xff1a;common.hpp:#ifndef FBC_CUDA_TEST_COMMON_HPP_ #define FBC_CUDA_TEST_COMMON_HPP_#include <typeinfo> #inc…

如何成为一名成功的 iOS 程序员?

前言&#xff1a; 编程是一个仅靠兴趣仍不足以抵达成功彼岸的领域。你必须充满激情&#xff0c;并且持之以恒地不断汲取更多有关编程的知识。只是对编程感兴趣还不足以功成名就——众所周知&#xff0c;我们工作起来像疯子。 编程是一个没有极限的职业&#xff0c;所以要成为一…

C#之委托与事件

委托与事件废话一堆&#xff1a;网上关于委托、事件的文章有很多&#xff0c;一千个哈姆雷特就有一千个莎士比亚&#xff0c;以下内容均是本人个人见解。1. 委托1.1 委托的使用这一小章来学习一下怎么简单的使用委托&#xff0c;了解一些基本的知识。这里先看一下其他所要用到的…

24式加速你的Python

作者 | 梁云1991来源 Python与算法之美一、分析代码运行时间第1式&#xff0c;测算代码运行时间平凡方法快捷方法&#xff08;jupyter环境&#xff09;第2式&#xff0c;测算代码多次运行平均时间平凡方法快捷方法&#xff08;jupyter环境&#xff09;第3式&#xff0c;按调用函…

pip、NumPy、Matplotlib在Windows上的安装过程

Windows上Python 3.6.2 64位的安装步骤&#xff1a;1. 从 https://www.python.org/downloads/windows/ 下载Windows x86-64 executable installer(即python-3.6.2-amd64.exe)&#xff1b;2. 直接以管理员身份运行安装&#xff0c;勾选添加到环境变量、pip等即可。可以同时在Wi…

分享:个人是怎么学习新知识的

为什么80%的码农都做不了架构师&#xff1f;>>> 挺多童鞋问我是怎么学习新知识的&#xff0c;干脆写篇文章总结一下&#xff0c;希望对大家有所帮助。对照书、技术博客、极客时间等学习的方式我就不说了。 一、早期 在15年及更早&#xff0c;由于知识储备少&#x…

easyui的datagrid

datagrid数据的绑定方式&#xff1a; 1&#xff09;data 后跟数据行的json串 2&#xff09;url 后跟{"total":,"rows":,"foot":},其中total代码返回总行数&#xff0c;rows为数据行json串 .NET MVC&#xff0c;controll控制类方法中获取datagrid…

线性回归介绍及分别使用最小二乘法和梯度下降法对线性回归C++实现

回归&#xff1a;在这类任务中&#xff0c;计算机程序需要对给定输入预测数值。为了解决这个任务&#xff0c;学习算法需要输出函数f:Rn→R。除了返回结果的形式不一样外&#xff0c;这类问题和分类问题是很像的。这类任务的一个示例是预测投保人的索赔金额(用于设置保险费)&am…

4种最常问的编码算法面试问题,你会吗?

导语&#xff1a;面试是测查和评价人员能力素质的一种考试活动。最常问的编码算法面试问题你知道多少呢&#xff1f;作者 | Rahul Sabnis译者 | 苏本如&#xff0c;编辑 | 刘静来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;在许多采访中&#xff0c;我经常被要求…

[小梅的体验课堂]Microsoft edge canary mac版本体验

简介 华硕微软越来越没有自己的JC了&#xff0c;不经在windows里面加了wsl而且还废弃了自己的老edge浏览器&#xff0c;重新基于chromium内核开发了新的edge浏览器了&#xff0c;不管怎么说mac上又多了一款新的浏览器&#xff0c;对于一个爱好新鲜的我来说那就简单安装体验下 下…

SQL Server用户自定义函数

用户自定义函数不能用于执行一系列改变数据库状态的操作&#xff0c;但它可以像系统 函数一样在查询或存储过程等的程序段中使用&#xff0c;也可以像存储过程一样通过EXECUTE 命令来执行。在 SQL Server 中根据函数返回值形式的不同将用户自 定义函数分为三种类型&#xff1a;…

C++11中std::initializer_list的使用

initializer_list是一种标准库类型&#xff0c;用于表示某种特定类型的值的数组。和vector一样&#xff0c;initializer_list也是一种模板类型&#xff0c;定义initializer_list对象时&#xff0c;必须说明列表中所含元素的类型。和vector不一样的是&#xff0c;initializer_li…

WijmoJS 2019V1正式发布:全新的在线 Demo 系统,助您快速上手,开发无忧

2019独角兽企业重金招聘Python工程师标准>>> 下载WijmoJS 2019 v1 WijmoJS是为企业应用程序开发而推出的一系列包含HTML5和JavaScript的开发控件。其中包含了金融图表、FlexSheet、先进的JavaScript控件&#xff08;Wijmo 5&#xff09;和经典的jQuery小部件&#x…

最后3天,BDTC 2019早鸟票即将售罄,超强阵容及议题抢先曝光!

大会官网&#xff1a;https://t.csdnimg.cn/U1wA2019 年12月5-7 日&#xff0c;由中国计算机学会主办&#xff0c;CCF 大数据专家委员会承办&#xff0c;CSDN、中科天玑数据科技股份有限公司协办的 2019 中国大数据技术大会&#xff0c;将于北京长城饭店隆重举行。届时&#xf…

php_mongo.dll下载(php操作mongoDB需要)

php_mongo.dll下载&#xff08;php操作mongoDB需要&#xff09;如果PHP连接操作mongoDB就必须要加入此扩展&#xff1a;php_mongo.dll&#xff0c;放到你对应php的扩展目录在你的php.ini中加入&#xff1a;extensionphp_mongo.dll重启apache&#xff0c;在phpinfo()中查看是否有…

十大机器智能新型芯片:华为抢占一席,Google占比最多

&#xff08;图片付费下载自视觉中国&#xff09;整理 | 胡巍巍来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;当年&#xff0c;阿基米德爷爷说出“给我一个支点&#xff0c;我就能撬动地球”这句话时&#xff0c;估计没少遭受嘲讽。然而后来的我们&#xff0c;都…

C++/C++11中头文件numeric的使用

<numeric>是C标准程序库中的一个头文件&#xff0c;定义了C STL标准中的基础性的数值算法(均为函数模板)&#xff1a; (1)、accumulate: 以init为初值&#xff0c;对迭代器给出的值序列做累加&#xff0c;返回累加结果值&#xff0c;值类型必须支持””算符。它还有一个…

Spring基础16——使用FactoryBean来创建

1.配置bean的方式 配置bean有三种方式&#xff1a;通过全类名&#xff08;class反射&#xff09;、通过工厂方法&#xff08;静态工厂&实例工厂&#xff09;、通过FactoryBean。前面我们已经一起学习过全类名方式和工厂方法方式&#xff0c;下面通过这篇文章来学习一下Fact…