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

AI不止能美颜,美妆迁移这样做 | 赠书

本文内容节选自《深度学习之人脸图像处理:核心算法与案例实践》,作者言有三。

美颜和美妆是人脸中很常见的技术,在网络直播以及平常的社交生活中都有很多应用场景。本文重点介绍的是人脸妆造迁移的核心技术及其相关资源。

想要了解关于深度学习的更多干货知识,关注AI科技大本营并评论分享你对本文的学习心得或人脸图像实践的见解,我们将从中选出10条优质评论,各送出《深度学习之人脸图像处理:核心算法与案例实践》一本+作者精心准备的AI专业版学习扑克牌一副。活动截止时间为8月8日晚8点

什么是人脸妆造迁移

所谓妆造迁移算法,指的是将一张人像的妆容迁移到任意一张人像照片中,这是美颜算法中比较复杂的技术,示意图如下:

图(a)是原图,图(b)是妆造风格图,图(c)就是将图(b)中的妆造迁移到图(a)中。

下面我们就来剖析传统的妆造迁移算法和基于深度学习的妆造迁移算法。

传统妆造迁移算法

根据对数据集要求的不同可以分为两类,第一类是需要成对的妆造前后的图作为训练集,即有监督的模型;第二类则不需要成对的妆造前后对比图作为训练集,即无监督的模型。

2.1 基于梯度约束和成对数据的算法

基于成对图的算法,它需要同一个人脸图像妆造前后的对比图作为训练集,对数据集的要求很高,以《Example-Based Cosmetic Transfer》算法为例。

假如A和A*是成对的无妆造和有妆造的图,B是需要进行妆造迁移的图,B*是最终的效果,如下图所示:

该方法通常包括3个步骤:

第一步是面部区域定位和对齐。首先需要完成人脸的检测,眉毛和睫毛,嘴唇等需要妆容迁移的区域的检测,对妆造迁移算法会产生干扰的固有皮肤特征,如雀斑、痣或瑕疵的去除。然后需要对面部几何形状进行变形,获得标准的正脸,从而使得所有的操作可以在该空间中进行。

第二步是妆容映射(cosmetic map)算法。该算法中将人脸图像分解为颜色和光照两部分的乘积,通过计算一个妆造前后的光照密度对比图cp来完成迁移,计算方法如下:

其中ap*就是妆造后图像,ap就是妆造前的图像。得到cp后使用一个加权操作将该对比图应用到图B中,即:

γ是一个加权系数,越大则迁移效果越明显。

第三步是外观修正。上式只有当样例图和目标图有完全相同的几何结构和光照,并且精确对齐时才能成立,而这基本上是不可能的,因此还需要对它进行局部几何变换修正,即将样例图的二阶laplacian信息映射到目标图中,其估计方法如下:

由于右边是确定的值,β是一个权重参数,所以我们只需要对bp进行更新使其满足上式,这通过iterative Gauss-Seidel solver算法来实现。

对于眼睛和睫毛部分,可以使用更加复杂的变换,睫毛和眉毛的浓妆效果需要更精细的处理,包括毛发的长度、颜色和密度。

该方法有几个重大的局限性:

(1) 要求肤色相近,背景单一,这限制了应用场景。

(2) 无法适应比较大的几何变换。

(3) 需要成对的妆造对比图进行训练,获取这样的数据需要很高的成本。

2.2 基于物理模型和非成对数据的算法

成对的妆造对比图获取代价高昂,《Digital Face Makeup by Example》方法则提出了人脸分层模型,不需成对的样本图,只需要输入两张图片,一张是目标图片I,一张是参考的样例化妆图片ε,其流程如下图。

该方法主要分为四步。

第一步:将I和ε进行人脸对齐。因为我们是在像素点级别进行迁移,所以人脸的对齐是很有必要的。文中人脸对齐采用了薄板样条函数(Thin Plate Spline,简称TPS), 这是一种在图像配准中很常见的插值方法。文中使用了ASM算法来定位关键点,为了提高准确性还进行了人工调整,并增加了十个额头控制点,最终得到了83个关键点。

第二步:对I和ε分别进行分解。文中将图片转换到CIELAB颜色空间,然后对图像进行了分层建模。L层被认为是光照层(lightness layer),可以被分解为粗粒度脸部结构层(Face Structure)和细粒度皮肤细节层(Skin Detail),具体的实现其实就是将lightness layer执行一个边缘保持的滤波操作(edge-preserving smoothing)得到large-scale layer,然后将lightness layer减去large-scale layer得到detail layer。剩下的两个通道a*和b*则被认为是颜色层。

第三步:将分解后的图像进行不同的处理,两幅皮肤细节层(Skin Detail)直接相加,颜色层使用一个alpha blending进行融合,对人脸结构中的高光和阴影部分则使用梯度进行迁移。

第四步:将得到的三部分组合到一起。注意到嘴唇化妆和脸部是很不一样的。在物理化妆中,嘴唇上的化妆品(如口红)通常会保留或突出嘴唇的质感,而不是像在面部皮肤上那样隐藏,处理方法是对原始图I中的每一个像素,从妆造图中搜索匹配的像素进行替换,此时会同时用到L通道的像素值和空间位置信息。

该方法原理清晰,不需要使用成对的数据,且不需要进行训练,但是需要输入图和妆造图进行精确的对齐,这限制了该类方法的实用性。实际上,传统的妆造迁移算法都无法避免这样的问题,它们对输入图的姿态以及光照非常敏感。

[1] Tong W S, Tang C K, Brown M S, et al. Example-based cosmetic transfer[C]//15th Pacific Conference on Computer Graphics and Applications (PG'07). IEEE, 2007: 211-218.

[2] Guo D, Sim T. Digital face makeup by example[C]//2009 IEEE Conference on Computer Vision and Pattern Recognition. IEEE, 2009: 73-79.

深度学习妆造迁移算法

深度学习算法利用深度学习技术来自动完成妆造迁移,框架流程都更加简单,是当前主流的研究思路,目前主要包括基于数据库匹配的算法和基于GAN等生成式模型的算法。

3.1 基于匹配的妆造算法

论文《Makeup like a superstar: Deep localized makeup transfer network》主要是对人像进行五官分析,获取肤色,眉毛颜色,唇色等信息后,进行不同妆容的最佳匹配推荐,最后上妆,其算法的完整流程如下图:

风格推荐是从已上妆人脸数据库中挑选与当前素颜人脸最相近的图片。具体方法是使用一个人脸识别网络,选取该网络输出的人脸特征的欧氏距离最小者作为推荐结果。

然后是人脸分割,主要是进行五官提取,采用全卷积图像分割网络完成。对于已上妆数据集中的眼影部分妆造,素颜图片没有对应的原则,则根据眉眼特征点定位给出眼影区域。由于妆容分割的前景部分相对于背景更重要,网络对这两部分的损失进行了加权。

最后是妆容迁移,妆容包括粉底(对应面部),唇彩(对应双唇),眼影(对应双眼)。

粉底迁移和唇彩迁移的原理类似,需要考虑颜色和纹理,文中利用了风格化网络来实现,使用参考图和目标图的Gram矩阵作为损失函数,风格化网络直接参考Gaty等人提出的模型。

而眼影的迁移略有不同,因为它不是直接改变双眼像素,而是要给眼睛部位添加眼影,必须同时考虑眼睛的形状和颜色。考虑到参考图的眼睛掩膜和内容图的眼睛掩膜,两者具有不同的大小和形状,但是经过变形到目标图中后,两者具有相同的大小和形状。眼影迁移就是要将参考图掩膜处的眼影特征迁移到目标图中,因此实现不在原图中,而是在特征空间中进行约束,这里使用了conv1_1的特征,完整的优化目标如下:

其中A是结果图,R是参考图,sr是参考图的掩膜,sb是经过仿射变换后的待上妆图的掩膜,它们的尺度大小相等。sr'和sb'是sr和sb的卷积结果图,因为卷积降低了维度,所以通常来说就是一个比例缩放。因此上面的代表的是结果图掩膜部分,代表的是参考图掩膜部分,P表示人脸分割网络模型,提取出特征后最小化两者之间的L2损失。

为了让结果更好,还添加了全微分(total variance)损失和全图的结构损失,通过更改其中的权重变量,可以控制妆造的程度,比如让眼影变得更深。

3.2 基于GAN的妆造迁移算法

以商汤提出的BeautyGAN为代表,它输入两张人脸图片,一张无妆图,一张有妆图,模型输出换妆之后的结果,即一张上妆图和一张卸妆图。

BeautyGAN采用了经典的图像翻译结构,生成器G包括两个输入,分别是无妆图Isrc、有妆图Iref,通过编码器(encoder)、若干个残差模块(residual blocks)、解码器(decoder)组成的生成器G 得到两个输出,分别是上妆图IBsrc、卸妆图IAref,结构示意图如下图。

BeautyGAN使用了两个判别器DA和DB,其中DA用于区分真假无妆图,DB用于区分真假有妆图。

除了基本的GAN损失之外,BeautyGAN包含了3个重要的损失,分别是循环一致性损失Cycle consistency loss,感知Perceptual loss,妆造损失Makeup loss,前两者是全局损失,最后一个是局部损失。

为了消除迁移细节的瑕疵,将上妆图IBsrc和卸妆图IAref再次输入给G,重新执行一次卸妆和上妆,得到两张重建图Iresrc和卸妆图Ireref,此时通过循环损失(cycle consistency loss)约束一张图经过两次G变换后与对应的原始图相同。因为生成器的输入包含了一对图,所以与CycleGAN的不同之处在于这里使用了同一个生成器G,该损失用于维持图像的背景信息,具体的损失定义与CycleGAN相同,不再赘述。

上妆和卸妆不能改变原始的人物身份信息,这可以通过基于VGG模型的Perceptual loss进行约束,定义如下:

其中Cl,Hl,Wl分别是网络第l层的通道数,特征图高度和宽度。

为了更加精确的控制局部区域的妆造效果,BeautyGAN训练了一个语义分割网络提取人脸不同区域的掩膜(mask),使得无妆图和有妆图在脸部、眼部、嘴部三个区域需满足妆造损失(makeup loss),妆造损失通过直方图匹配实现,其中一个区域的损失定义如下:

item可以分别表示脸部、眼部、嘴部三个区域,HM是一个直方图匹配操作,M就是图对应的掩膜,表示逐个像素相乘。

整个makeup损失定义如下:

完整的BeautyGAN生成器损失为:

下面就是一些效果图:

[3] Liu S, Ou X, Qian R, et al. Makeup like a superstar: Deep localized makeup transfer network[J]. arXiv preprint arXiv:1604.07102, 2016.

[4] Li T, Qian R, Dong C, et al. Beautygan: Instance-level facial makeup transfer with deep generative adversarial network[C]//Proceedings of the 26th ACM international conference on Multimedia. 2018: 645-653.


展望

由于GAN等技术的成熟,人脸的妆造迁移算法得到了长足的进步,不过在实际落地中仍然会面临着一些难题,如大姿态和大表情的妆造迁移问题,后续的一些研究者们也基于此做出了一些工作,比如Pose-Robust Spatial-Aware GAN[5]。

该方法包括三个模块,即Makeup Distillation Network (MDNet),Attentive Makeup Morphing (AMM) module以及De- makeup Re-makeup Network (DRNet)。

Makeup distillation network是一个编码器模块,它从参考的妆造图y中提取特征Vy,然后使用1×1卷积变换为两个矩阵γ和β, 它们是大小都为1×H×W的特征图,它编码了从内在的面部特征,比如面部形状,眼睛大小到与化妆相关的特征,比如唇彩,眼影之间的关系。

原图像同样会经过Makeup distillation network得到特征Vx,但是因为原图像和妆造图有很大的表情和姿态差异,所以γ和β不能直接应用于Vx得到最终妆造结果,而Attentive makeup morphing module这个模块则在原图和参考图的逐像素差异的约束下计算出变形矩阵A,它的大小是HW×HW,这两个attention矩阵用于将γ和β进行变形得到γ’和β’,使其可以用于原图。

变形矩阵A的计算考虑了两方面的信息,第一个是Makeup distillation network提取的特征V,大小是C×H×W,第二个是几何信息P,这是为了保证x和y的妆造像素位置的对应,它的每一个特征图的元素计算了与68个人脸关键点的位置差,因此大小是136×H×W,P的计算如下,其中分别表示取x和y坐标,即第i个人脸关键点。

A的计算如下:

其中mxi表示原图像x的第i个像素的人脸分割掩膜结果,myj表示妆造图y的第j个像素的人脸分割掩膜结果,当两者同属于某一个语义区域比如嘴唇时,I(mxi=myi)等于1,否则为0。

得到A之后,就可以对γ和β进行变换,计算方法如下:

之后将γ'和β'沿着通道维度扩充后得到,它们的大小都是C×H×W。

De-makeup & Re-makeup network是一个编解码结构,编码器部分与Makeup distillation network是相同的结构,不过不共享参数。提取出来的特征与矩阵进行仿射变换得到,计算方式如下:

Vx'作为De-makeup & Re-makeup network的解码器部分的输入,完成妆造迁移。

下面展示了一些和BeautyGAN的对比结果,证明大姿态下的优势。

[6] Jiang W, Liu S, Gao C, et al. PSGAN: Pose-Robust Spatial-Aware GAN for Customizable Makeup Transfer[J]. arXiv preprint arXiv:1909.06956, 2019.

人脸妆造数据集

研究人脸化妆问题自然需要相应的数据集,而且抗妆造干扰的人脸识别也是一种具有挑战性的问题,具有较大的研究意义,下面我们简单介绍一下已有的妆造数据集。

5.1. 妆造数据集

数据集地址:http://www.antitza.com/makeup-datasets.html。

发布于2012年,这是一个女性面部化妆数据集,可用于研究化妆对面部识别的影响。总共包括4个子数据集:

YMU(YouTube化妆):这是从YouTube视频化妆教程中获取的面部图像,YouTube网址为http://www.antitza.com/URLs_YMU.txt。

VMU(虚拟化妆):这是将从FRGC数据库中采集的高加索女性受试者的面部图像,使用

公开的软件来合成的虚拟化妆样本,软件来自www.taaz.com。

MIW:从互联网获得有化妆和没有化妆的受试者的前后对比面部图像。

MIFS:化妆诱导面部欺骗数据集:这是从YouTube化妆视频教程的107个化妆视频中获取。每一组包含3张图片,其中一张图片是目标的化妆前的主体图像,一个是化妆后的,另一个是其他人化同样的妆试图进行欺骗的图片。

2. 妆造迁移数据集

数据集地址:http://liusi-group.com/projects/BeautyGAN。

发布于2018年,包括3834张女性人脸图,其中1115张无妆造人脸,2719张有妆造人脸。妆造类型包括不同程度的烟熏妆(smoky-eyes makeup style)、华丽妆(flashy makeup style)、复古妆(Retro makeup style)、韩式妆(Korean makeup style)及日式妆(Japanese makeup style)。

福利

以上内容更详细的介绍请参见《深度学习之人脸图像处理:核心算法与案例实践》,这是一本讲述在人脸各个方向中的深度学习算法的书籍,同时配套有大量实战案例。

➤章节目录

第1章 人脸图像和特征基础

第2章 深度学习基础

第3章 人脸数据集

第4章 人脸检测

第5章 人脸关键点检测

第6章 人脸识别

第7章 人脸属性识别

第8章 人脸属性分割

第9章 人脸美颜和美妆

第10章 人脸三维重建

第11章 人脸属性编辑

➤获取方式

在文末留言自己在对本文的学习心得或人脸图像实践的见解,我们将选取10条优质留言分别赠送此书1本+作者精心准备的AI专业版学习扑克牌一副(共10份),活动截止时间为8月8日晚8点。感兴趣的读者也可以通过扫描下方二维码进行购买。

相关文章:

ASP.Net中自定义Http处理及应用之HttpModule篇

HttpHandler实现了类似于ISAPI Extention的功能,他处理请求(Request)的信息和发送响应(Response)。HttpHandler功能的实现通过实现IHttpHandler接口来达到。而HttpModule实现了类似于ISAPI Filter的功能。 HttpModule的实现HttpModules实现了类似于ISAPI Filter的功…

未处理的异常导致基于 ASP.NET 的应用程序意外退出

问题具体见:http://q.cnblogs.com/q/34874/ 相应站点的w3wp.exe 会意外终止 EventLog中的信息: An unhandled exception occurred and the process was terminated. Application ID: DefaultDomain Process ID: 43644 Exception: System.Runtime.Seri…

Git 执行更改

Jerry 克隆库&#xff0c;他决定实现基本字符串操作。于是&#xff0c;他创建文件string.c&#xff0c;在添加内容到 string.c 会这个样子。 #include <stdio.h> int my_strlen(char *s) { char *p s; while (*p) p; return (p - s); } int main(void) { int i; char *s…

静态属性和静态方法2 - C++快速入门22

静态属性和静态方法2 让编程改变世界 Change the world by program 静态方法 嗯&#xff0c;还是静态方法&#xff1f;&#xff01;这阵子有鱼油表示对该方法的特色还是有点云里雾里还有那个神神兮兮的this指针。。。 所以小甲鱼保持务必让你彻底领悟的精神继续和大家探讨&…

浅析.Net共享程序集编程

作者&#xff1a;宋华 赛迪网Net结构里的程序集Assembly是自我描述的安装单元&#xff0c;它在应用程序域(AppDomain)中运行。您必须首先将程序集加载到应用程序域中&#xff0c;然后才能运行该应用程序&#xff0c;并且&#xff0c;同一程序集可以加载到多个应用程序域中&a…

“崩溃!我再也不搞 AI 了”谷歌 AI 专家:别让你的方法打败你!

今天&#xff0c;想跟大家聊聊 Python 人工智能。最近几年&#xff0c;我看过市面上很多 Python和人工智能的教程&#xff0c;基本都是先介绍Python基本语法、dict、tuple 等基本库的使用&#xff0c;最后学习机器学习、深度学习的常用算法......但我与 Google 人工智能开发专家…

Spring MVC 相关资料整理

来源于&#xff1a;http://www.cnblogs.com/ylhssn/p/4062757.html 1、概述 Spring MVC是一种基于Java实现MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;即使用了MVC架构模式的思想&#xff0c;将web层进行解耦&#xff0c;基于请求-响应模型帮助我们简化日常web系统的…

Wireless-N Configuration

Wireless-N Configuration/Zh CnContents [hide]1 关于Wireless N的一般信息2 基本设置2.1 20 MHz vs 40 MHz2.1.1 2.4GHz频段的描述2.1.2 2.4GHz频段表2.2 无线安全设置2.3 高级设置3 Problems and Resolution3.1 Actual Speeds3.2 Testing3.3 Device Drivers4 Device Specifi…

为.Net程序集添加资源

作者&#xff1a;宋华 本文选自&#xff1a;赛迪网 2002年12月06日 在.Net结构中&#xff0c;程序集Assembly(也称着程序集或托管Dll)是自我描述的安装单元&#xff0c;它可以只包括一个PE&#xff08;可移植可执行&#xff09;格式的Dll或exe文件&#xff0c;也可以由多…

这5个 AI 用例,转变了传统商务沟通

作者&#xff5c;Lanre Onibalusi译者 |天道酬勤&#xff0c;责编 | 晋兆雨封图 | CSDN 付费下载自视觉中国很少有人会想到这样一种情景&#xff1a;世界上几乎有一半的国家处于封锁状态&#xff08;可能长达数周或几个月&#xff09;&#xff0c;并且大多数人的工作能力也受到…

cocos2dx 3.x(动态改变精灵的背景图片)

//更换精灵CCSprite的图片有两种方式。 //直接通过图片更换 //使用setTexture(CCTexture2D*)函数&#xff0c;可以重新设置精灵类的纹理图片。 // auto bg Sprite::create(); Texture2D* texture Director::getInstance()->getTextureCache()->addImage("bg2.png&…

如何在.NET中创建服务型组件

作者&#xff1a;张劲松 本文选自&#xff1a;赛迪网 2002年12月03日 对于在WINDOWS上作过一些开发的程序员来说&#xff0c;COM&#xff0b;应该是不会感到陌生的吧。COM&#xff0b;代表了Microsoft在COM技术平台上的最高水平&#xff0c;也是Microsoft藉以和J2EE抗衡的…

flex viewstack的简单应用

1 Flex API里面介绍viewstack&#xff1a; MX ViewStack 导航器容器由一组彼此上下堆叠的子容器组成&#xff0c;其中一次只可以显示一个子容器。选择另一个子容器后&#xff0c;它将显示在原来子容器的位置处&#xff0c;所以看起来好像此子容器替换了原来的子容器。…

在线等:“实习拿到两个不太好的offer,去腾讯还是去阿里?”

“你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间&#xff0c;这是我们最战战兢兢的心情。但是显然&#xff0c;有些人体会不了。这份行业数据&#xff0c;让笔者“柠檬”了。1疫情下&#xff0c;有的公司宣布破产有的公司增长413%疫情期间&#xff0c;人工智能的价值…

如何成功地在亚洲植入敏捷和DevOps

\关键要点\\首先要植入西方文化的要素。\\t使用价值流映射有助于打破文化障碍。\\t让上层管理者参与进来。\\t黑客节&#xff08;Hackfest&#xff09;将有助于减少前置期时间。\\t理解文化差异的影响。\\\我读过的一篇文章说Scrum并不适合于亚洲。作者所说的非常正确&#xff…

浅析.Net下的AppDomain编程

作者&#xff1a;宋华 发文时间&#xff1a;2002 我们知道&#xff0c;进程是操作系统用于隔离众多正在运行的应用程序的机制。在&#xff0e;Net之前&#xff0c;每一个应用程序被加载到单独的进程中&#xff0c;并为该进程指定私有的虚拟内存。进程不能直接访问物理内存&…

AI 医生正式上岗了?AI 医疗结合迎爆发点!

作者 | 硬核云顶宫责编 | 晋兆雨封图 | CSDN 付费下载自视觉中国这些年&#xff0c;人工智能应用于医学界是非常热的话题。在医学三大杂志——新英格兰医学杂志、柳叶刀、JAMA上&#xff0c;AI与医疗相结合的论文&#xff0c;占比越来越高。其中最明显的趋势是将医生从繁重的诊…

Android之解析Android Map地图返回的Json数据

先上一下需要解析的Json数据&#xff1a;{"results" : [{"address_components" : [{"long_name" : "荔湾区","short_name" : "荔湾区","types" : [ "sublocality", "political" ]}…

9成P2P平台面临出局,千亿资本何去何从?

【阅读原文】作者&#xff1a;楠沨据研究院数据中心统计&#xff0c;截至2016年10月底&#xff0c;我国 P2P贷款余额已经攀升至7,470亿元左右&#xff0c;环比增长6.0%。进入10月份百强榜的平台&#xff0c;其贷款余额总计3,275亿元&#xff0c;占到整个行业的44%&#xff1b;榜…

关于Transformer,那些的你不知道的事

作者 | 小莫来源 | 阿泽的学习笔记&#xff08;ID: aze_learning&#xff09;引言本博客主要是本人在学习 Transformer 时的「所遇、所思、所解」&#xff0c;通过以 「十六连弹」 的方式帮助大家更好的理解该问题。十六连弹为什么要有 Transformer?Transformer 作用是什么&am…

用ASP.NET上传大文件

作者&#xff1a;思归 微软MVP http://blog.joycode.com/saucer/我们在上传大文件时都遇到过这样或那样的问题。设置很大的maxRequestLength值并不能完全解决问题&#xff0c;因为ASP.NET会block直到把整个文件载入内存后&#xff0c;再加以处理。实际上&#xff0c;如果…

中国最齐全的主要电子商务网站(B2C)

中国最齐全的主要电子商务网站(B2C)------[连载之电子商务网站架构]访问量超过100万的电子商务网站技术架构版本&#xff1a;V1出处&#xff1a;http://jimmyli.blog.51cto.com/ 我站在巨人肩膀上Jimmy Li作者&#xff1a;Jimmy Li关键词&#xff1a;中国 电子商务 网站 B2C连接…

怎么安装MYSQL5.0的JDBC驱动

1、下载mysql for jdbc driver. http://dev.mysql.com/downloads/connector/j/3.1.htmlMySQL Connector/J is distributed as a .zip or .tar.gz archive containing the sources and class files as well as a class-file only "binary" .jar archive named "…

ASP.NET中的事务处理和异常处理

刘彦青编译 来自&#xff1a;yesky 使用SQL-Transaction类和.NET提供的异常处理机制&#xff0c;我们就能够以一种可靠的方式处理数据库运行中的问题和发现系统异常。这篇小文章将解释事务处理和异常处理的概念和用法。 什么是事务&#xff1f; 事务处理是由以一个单一的…

2020年AI产业报告:100个岗位抢1个人,计算机视觉成最大缺口

“你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间&#xff0c;这是我们最战战兢兢的心情。但是显然&#xff0c;有些人体会不了。这份行业数据&#xff0c;让笔者“柠檬”了。1疫情下&#xff0c;有的公司宣布破产有的公司增长413%疫情期间&#xff0c;人工智能的价值…

.NET Winform也能画出类似QQ、飞信这样的窗口风格和控件效果

MPN企业宝智能升级程序界面采用.NET的Winform技术&#xff0c;并没有延续企业宝主程序的绘制界面技术——WPF。直接采用Winform实现类似QQ和飞信的窗口风格比较困难&#xff0c;WPF好在还有一个Blend设计工具&#xff0c;而Winform只能靠自己一个一个像素去对齐、去仔细看&…

【转】HashMap、TreeMap、Hashtable、HashSet和ConcurrentHashMap区别

转自&#xff1a;http://blog.csdn.net/paincupid/article/details/47746341 一、HashMap和TreeMap区别 1.HashMap是基于散列表实现的&#xff0c;时间复杂度平均能达到O(1)。 TreeMap基于红黑树&#xff08;一种自平衡二叉查找树&#xff09;实现的&#xff0c;时间复杂度平均…

ASP.NET实现数据图表

作者&#xff1a;马金虎 来自&#xff1a;yesky 在ASP中插入图表&#xff0c;常用的方法是使用MSChart控件。那么在ASP.NET是否也是这样呢?答案是不可以的。 我们知道ASP.NET是一种编译语言&#xff0c;当客户端第一次调用ASP.NET页面的时候&#xff0c;其实是经过了一种…

Struts2基础(1)_MVC

2019独角兽企业重金招聘Python工程师标准>>> Struts2是有传统的Struts1和WebWork两个经典MVC框架发展起来&#xff0c;无论从Struts2的设计角度或则实际项目中的易用性来开&#xff0c;它都是一个非常优秀的MVC框架。 MVC的理解&#xff1a;MVC思想将应用中各组件按…

我发现了个Python黑魔法,执行任意代码都会自动念上一段「平安经」

来源 | Python编程时光最近的"平安经"可谓是引起了不小的风波啊。作为一个正儿八经的程序员&#xff0c;最害怕的就是自己的代码上线出现各种各样的 BUG。为此&#xff0c;明哥今天分享一个 Python 的黑魔法&#xff0c;教你如何在你执行任意 Python 代码前&#xff…