精华内容
下载资源
问答
  • 于广编著的《修炼Java开发技术:在架构体验设计模式和算法之美》介绍了Java算法、设计模式和架构的核心知识,语言通俗易懂;全书精心筛选了Java开发技术最具代表性、最典型的知识点;采用了理论加实践的教学方法,...
  • AI技术在智能海报设计中的应用

    千次阅读 2018-12-28 11:38:19
    在视觉设计领域设计师们往往会因为一些简单需求付出相当多的时间,比如修改文案内容,设计简单的海报版式,针对不同机型、展位的多尺寸拓展等。这些工作需要耗费大量的时间、人力成本(5~6张/人日),但对设计师...

    背景

    在视觉设计领域中,设计师们往往会因为一些简单需求付出相当多的时间,比如修改文案内容,设计简单的海报版式,针对不同机型、展位的多尺寸拓展等。这些工作需要耗费大量的时间、人力成本(5~6张/人日),但对设计师的进步成长起到的作用却非常有限。另一方面,精准营销是未来的大趋势,在大流量背景下,首页的海报资源展位需要展示“千人千面”的效果,这对海报的生产效率也提出了非常高的要求。所以,我们美团外卖技术团队尝试结合AI技术,来协助设计师避免这种低收益、高重复的任务,同时低成本、高效率、高质量地完成海报图片的生成。本文以Banner(横版海报)为例,介绍我们在海报设计与AI技术结合方面所进行的一些探索和研究。

    分析

    什么是Banner的设计过程?我们尝试总结了对Banner设计的理解,Banner的设计过程是一系列的具备某种特征属性的素材图层的有序叠加过程。这里的特征属性既包括颜色、形状、纹理、主题等视觉属性,也包括位置、大小、贴边等空间属性。在这个过程中,哪些环节可以被机器算法所探索呢?文献[1]研究了如何调整图像的颜色分布,使杂志封面的视觉效果更加符合人眼的视觉特性;文献[2]以此为基础,引入了基于显著性识别的图像裁剪,并使用优化方法来解决布局问题。阿里巴巴的鹿班系统在去年双十一当天,生成1.7亿张Banner;京东内部也在孵化玲珑和莎士比亚系统,更加智能地设计文案和Banner。

    图1 封面配色&布局设计[2]

    在设计领域的一些子问题上,可以用算法来挖掘出数据背后的规律(如图1所示)。那么,能否构建一个完整的学习算法和处理系统,统一解决Banner设计中所有的子问题(配色、布局、搭配、生成)呢?

    技术方案

    素材图层是Banner的基础元素,其本身可以被特征化,同时组成Banner的若干元素间的叠加顺序可以被序列化,因此,算法实际是在学习“在什么时候,选择某种素材,放在哪里”。

    图2 流程框架

    如图2所示,为了解决这个问题,我们设计规划器、优化器、生成器来共同构建海报设计的学习与生产过程。其中:

    1. 规划器从数据中学习设计师对不同风格下的设计习惯与规律;
    2. 优化器基于美学质量和设计原则,对前者的输出结果做精细化调整;
    3. 最后,由生成器选取/生成素材并渲染成图;
    4. 素材库作为这三个环节的基础,负责素材管理和素材标签化。

    素材库

    如何提取素材图片的特征属性,这是比较典型的分类问题。在计算机视觉领域,传统方案是提取图像的颜色、梯度等低级语义特征[3],结合传统的分类器(LR、SVM等)来实现分类。近年来,基于深度学习的方法因为能表达更为复杂的语义特征,逐渐成为主流方法[4]。如图3所示我们提取传统的低级语义特征,以及基于CNN的高级语义特征,来共同完成素材特征属性提取。

    图3 素材库-特征提取

    规划器

    完成素材的数据化工作后,怎样学习Banner的设计过程?

    作为一种生成模型,对抗生成网络(GAN)[5]在近年广为应用,其优势是可以端到端地训练图像生成模型,但在我们的应用场景下,GAN存在以下两个问题:

    1. GAN的过程更像是“黑盒”的过程:输入方面,虽然Conditional-GAN之类的方法可以实现某种程度有条件地可控生成,但对于Banner设计任务来说,其输入信息(文案、目标风格、主体信息)仍然过于复杂;
    2. 输出方面,GAN直接生成源数据(即图像),但非常缺乏解释性。我们需要的是更加直观、更有解释性的信息,比如素材的类型、颜色、轮廓、位置等。

    在上文中有提到,Banner设计过程是素材图层依次叠加的过程。因此,我们可以用序列生成模型来拟合这个过程[6]。在建模过程中,我们把素材视作词汇(Word),海报视作句子(Sentence),词汇索引视为离散化的特征索引,素材叠加顺序就可以视为句子中的词顺序[7]。

    图4 规划器-序列生成

    图4是我们使用的序列生成模型,输入主体信息和目标风格,输出素材特征的序列。为了增强预测过程中多条路径结果的多样性,我们在监督性地训练每个时刻的输出之外,还引入了评估整个序列合理性的Object loss。如图5所示,借鉴SeqGAN的思想,Object loss可以由判别器来提供[8]。

    图5 SeqGAN[8]

    优化器

    规划器预测素材的量化特征,为了确保最终成图符合美学标准,需要一个后处理的过程(图6)。我们用优化器来解决这个问题。从本质上讲,这是一个优化过程。通过和设计师们的沟通,我们设计了一些基于常规设计理念和美学标准的目标函数,动作集合包括移动、缩放、亮度调整等,结合优化方法,提升Banner的视觉效果。

    图6 优化器

    生成器

    优化后的素材特征序列,通过生成器来渲染成图。如图7所示,对于素材库检索不到符合某种特征属性的素材的情况,我们设计了图像风格迁移的方法来实现图像特征迁移。这里的特征可以是颜色、形状、纹理等低级特征,也可以是某种语义化的视觉风格特征,对后者来说,可以将源图像的内容Content和目标图像的风格Style在某种特征空间(CNN中的某一层)里做融合,实现风格迁移[9,10]。

    图7 素材生成

    应用场景及功能拓展

    “千人千面”的精准营销是未来营销策略的趋势,这对商品素材的丰富性提出了非常高的要求;从为商家赋能的角度来说,也需要为商家提供更多样的海报版式,这也要求系统具备海报风格的快速学习能力和拓展能力。对此,在常规设计风格的研究之外,我们从以下3个方面做了一些拓展研究。

    主体图片加工

    商品素材的丰富度与美学质量是精细化营销及海报美学质量非常重要的一环。其中最核心的要求是图像分割的能力[11,12]。以全卷积网络(FCN)为基础,如图8所示,我们采取以下几个在目标分割领域常见的技巧,来实现商品图片的目标分割:

    1. Encoder-Decoder结构
    2. 空洞卷积
    3. 多尺度特征融合
    4. Two-Stage微调网络

    图8 图像语义分割&抠图(结构图部分参考DeepLab v3+[12])

    这种基于语义分割方法的结果,在专业设计师人工评审质量的过程中,发现主体边缘有时会出现明显的锯齿感。经过分析,我们认为有以下两个原因:

    1. 语义分割模型把问题建模为一个“像素级分类过程”,每一个像素的类别都天然地被假设为“非此即彼”,大多数的Segmentation模型都采用Cross-Entropy作为损失函数;
    2. 因此,无论是从模型结构(CNN)还是从损失函数的角度来说,分割模型会更倾向于全局信息从而丢弃局部结构信息,导致只能得到边缘比较粗糙的分割结果。

    为此,如图8所示,我们在图像分割的输出结果之外,结合了Image Matting方法:

    1. 对分割模型的输出结果做形态学变换,生成三值Trimap,分别表示前景区、背景区、未知区;
    2. 应用常规的Matting方法,比如Bayesian、Close-Form等,以原图像和Trimap图像为输入,输出前景图的Alpha通道;
    3. Matting可以使前景主体的边缘更加平滑,视觉质量更高(图9)。

    图9 商品主体抠图

    另外,基于图像美学质量评分模型,我们会优先选择质量分高的图片作为主体素材来源。对中低分的图片,未来可以考虑借鉴Cycle-GAN[13]的思想,设计基于半监督和GAN的图像增强网络,美化后再经过图像分割产生主体素材。

    海报模板拓展

    上述的常规设计风格的学习属于一种广义的设计风格,需要设计师先期投入很多精力做风格划分以及数据收集、处理。为了快速适配热点场景,我们借鉴图像检索技术(如图10所示),提取素材图片的CNN特征及颜色特征,使用欧式距离来度量素材相似度,这能节省人工打标签的成本,实现基于固定模板的自动拓展及生成(海报临摹)。

    图10 素材图像检索与模板拓展

    多分辨率拓展

    在日常工作中,设计师在设计出Banner后,往往要花费很长时间对不同展位、不同版本、不同机型做多尺寸适配(如图11所示)。能否用算法来协助人工提效?在素材已经确定,并且相互的位置关系近乎确定的条件下做多分辨率适配,这本质上是一个优化问题,我们在上文布局优化器的基础上,增加元素的局部相对位置与全局绝对位置的拓扑关系作为目标函数。目前,系统支持在某个固定宽高比±30%范围内的任意分辨率适配,未来会进一步扩大适配范围。

    图11 多分辨率拓展

    总结

    目前,我们的Banner智能设计系统为钻展(外卖首页广告位)、商家店铺装修等业务提供稳定的设计能力;素材加工等子能力也在为外卖、闪购等商品图片提供技术支持。后续我们会从扩展常规设计风格、语义相关的颜色及素材挖掘、自动解析数据、构建自评估学习闭环等方面继续研究,进一步提高算法的设计能力和适用性,尽可能协助设计师提高效率,降低高重复性工作的时间和经济成本。

    参考文献

    [1] A. Jahanian, J. Liu, D. Tretter, Q. Lin, E. O’Brien-Strain, S. Lee, N. Lyons, and J. P. Allebach. “Automatic Design of Colors for Magazine Covers”. In Proc. IS&T/SPIE Electronic Imaging, International Society for Optics and Photonics, 2013
    [2] X. Y. Yang, T. Mei, Y. Q. Xu, Y. Rui, S. P. Li. “Automatic Generation of Visual-Textual Presentation Layout”. ACM Transactions on Multimedia Computing, Communications, and Applications, 2017
    [3] David G. Lowe. “Distinctive Image Features from Scale-Invariant Keypoints”. International journal of computer vision, 2004
    [4] Alex Krizhevsky, Ilya Sutskever, Geoffrey E. Hinton. “ImageNet Classification with Deep Convolutional Neural Networks”. NIPS, 2012
    [5] I. Goodfellow, J. Pouget-Abadie, M. Mirza, B. Xu, D. Warde-Farley, S. Ozair, A. Courville, Y. Bengio. “Generative Adversarial Networks”. NIPS, 2014
    [6] K. Kawakami. “Supervised Sequence Labelling with Recurrent Neural Networks”. Studies in Computational Intelligence, 2008
    [7] T. Mikolov. “Statistical Language Models based on Neural Networks”. 2012
    [8] L. Yu, W. Zhang, J. Wang, Y. Yu. “SeqGAN: Sequence Generative Adversarial Nets with Policy Gradient”. AAAI, 2017
    [9] L.A. Gatys, A.S. Ecker, M. Bethge. “Image Style Transfer Using Convolutional Neural Networks”. CVPR, 2016
    [10] Y. Li, M.Y. Liu, X. Li, M.H. Yang, J. Kautz. “A Closed-form Solution to Photorealistic Image Stylization”. ECCV, 2018
    [11] J. Long, E. Shelhamer, T. Darrell. “Fully Convolutional Networks for Semantic Segmentation”. CVPR, 2015
    [12] L.C. Chen, Y. Zhu, G. Papandreou, F. Schroff, H. Adam. “Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation”. ECCV, 2018
    [13] J.Y. Zhu, T. Park, P. Isola, A. A. Efros. “Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks”. ICCV, 2017

    作者简介

    晓星,2017年6月加入美团,目前主要负责美团外卖图像内容挖掘、增强、生成方面的相关工作,致力于图像相关技术的积累及落地。

    展开全文
  • Java几种保障线程安全的设计技术

    万次阅读 2020-09-02 11:09:49
    说明:以下我主要从面向对象设计的角度出发介绍几种保障线程安全的设计技术,这些技术可以使得我们在不必借助同步锁的情况下保障线程安全,这就避免锁可能导致的问题及其资源的开销。 文章目录一、变量定义为局部...


    说明:以下我主要从面向对象设计的角度出发介绍几种保障线程安全的设计技术,这些技术可以
    使得我们在不必借助同步锁的情况下保障线程安全,这就避免锁可能导致的问题及其资源的开销。

        开篇先说一下,什么时候才会出现线程安全问题 ?也就是线程安全问题发生是哪三个条件 ?

    条件一:存在共享变量(允许多个线程同时去操作的变量);
    条件二:得是在多线程的环境下。其中客户端访问服务端天生就是多线程环境;
    条件三:存在多个线程操作共享变量时涉及到存储的过程,也就是改变共享变量的状态

          举一个是线程安全的存在共享数据并且是多线程环境的例子:Spring中的 bean 就是这样的,我们都知道 bean 有且只有一个,还是在服务端,是一个天然的多线程环境,还是被多个线程所共享的。那么它为什么还是线程安全的呢 ?

          我的理解是 bean 中没有涉及到数据的存储过程。SpringMVC层的 Controller 注入 Spring 层的 Service ,Service 又注入 Mybatis 的 Dao ,Dao 的 mapper 里面的 Sql 语句,这时才去数据库操作数据。整个过程中只有在数据库中才涉及到了数据的存储。 bean 虽然是在多线程的环境和是共享的数据,但是它没有涉及数据的存储,所以它是线程安全的。

    回到主题:保障线程安全的设计技术,正片开始

    一、变量定义为局部变量

    JVM里规定,Java运行数据区划分为以下五部分(对JVM不太了解的朋友,可以看看我的这系列文章):

    线程私有:Java虚拟机栈、本地方法栈、程序计数器
    线程共享:堆空间、方法区(非堆)

    1、Java虚拟机栈:

          栈空间(Stack Space)为线程的执行准备一段固定大小的存储空间,每个线程都有独立的线程栈空间,创建线程时就为线程分配栈空间。

          在线程栈中每调用一个方法就给方法分配一个栈帧,栈帧用于存储方法的局部变量、操作数栈、方法返回地址、动态链接、还有一些附加信息。即局部变量存储在栈空间中,基本类型变量也是存储在栈空间中,引用类型变量值也是存储在栈空间中,引用的对象存储在堆中。由于Java虚拟机栈是相互独立的,一个线程不能访问另外一个线程的栈空间,因此线程对局部变量以及只能通过当前线程的局部变量才能访问的对象进行的操作具有固定的线程安全性

    2、堆空间

          堆空间(Heap Space)用于存储对象的。是在JVM启动时分配的一段可以动态扩容的内存空间。创建对象时在堆空间中给对象分配存储空间,实例变量就是存储在堆空间中的,堆空间是多个线程之间可以共享的空间,因此实例变量可以被多个线程共享。多个线程同时操作实例变量可能存在线程安全问题。
    但是堆空间也不是吃素的,JVM在堆空间中开辟了一共占堆空间 1% 的内存大小的 TLAB 区域,创建线程时就会给该线程分配一段TLAB这个区域的一小部分,这样每一个线程都私有了一份TLAB,这样在对堆空间变量的引用时就是独立的了,因为每一个线程的的TLAB区域是私有的。

    3、方法区(非堆)

          方法区空间(Non-Heap Space)用于存储常量、类的元数据、JIT编译的热点代码等,非堆空间也是在JVM启动时分配的一段可以动态扩容的存储空间。类的元数据包括静态变量、类有哪些方法、属性及这些方法的元数据(方法名、参数、返回值等)。非堆空间也是多个线程可以共享的,因此访问非堆空间中的静态变量也可能存在线程安全问题。

    总结:堆空间和方法区空间是线程共享的空间,即实例变量与静态变量是线程可以共享的,可能存在线程安全问题。栈空间是线程私有的存储空间,局部变量存储在栈空间中,局部变量具有固定的线程安全性

    所以我们在开发过程中定义变量时,能够定义为局部变量的变量就尽量定义为局部变量,而不要定义为全局变量

    主要有以下两个角度去分析一下原因:

          (1)就像上面所说的,局部变量是在方法内部定义的,方法在调用时是会被压入Java虚拟机栈的局部变量表中,而栈是不会涉及垃圾回收的,没有引用就是直接出栈了,这样就会提高性能,减少垃圾回收的成本。

          (2)当定义为局部变量,JVM在进行逃逸分析后。假如是未逃逸状态的话,有可能就会采用栈上分配策略,栈上分配对象的话,用完就直接销毁,这样也不会涉及垃圾回收(注意:Java虚拟机栈是不用垃圾回收的,垃圾回收主要是在堆空间,方法区一般是不会进行垃圾回收的,因为它的回收效率是极低的)

    之前写过一篇逃逸分析,栈上分配的文章,可以看看

    二、无状态(数据)对象

          对象就是数据及对数据操作的封装,对象所包含的数据称为对象的状态(State),实例变量与静态变量称为状态变量。

          如果一个类的同一个实例被多个线程共享并不会使这些线程存储共享的状态,那么该类的实例就称为无状态对象(Stateless Object)。反之如果一个类的实例被多个线程共享会使这些线程存在共享状态,那么该类的实例称为有状态对象。

          实际上无状态对象就是不包含任何实例变量(数据)也不包含任何静态变量的对象。线程安全问题的前提是多个线程存在共享的数据,实现线程安全的一种办法就是避免在多个线程之间共享数据,使用无状态对象就是这种方法。

    简单理解就是:创建对象,但是对象里面不去申明共享数据(无状态),那么就是不会存在线程安全问题。

    三、不可变对象(final)

    1、不可变对象是指一经创建它的状态就保持不变的对象,不可变对象具有固有的线程安全性。当不可变对象实体的状态发生变化时,系统会创建一个新的不可变对象,就如 String 字符串对象。所以 String 是不可以动态扩容和去修改的(只会去新建一个新的 String 对象)
    在这里插入图片描述

    2、自定义一个不可变对象需要满足以下条件:

    (1)类本身使用final修饰,防止通过创建子类来改变它的定义;
    (2)所有的字段都是 final 修饰的,final 字段在创建对象时必须显示初始化并且不能被修改;
    (3)如果字段引用了其他状态可变的对象(集合、数组),则这些字段必须是private私有的。
    在这里插入图片描述
    3、关于final 关键字的拓展:

          (1)被 final 修饰的对象,在类加载阶段是直接在链接阶段中准备阶段就是被显示初始化了,它与static 修饰的对象是在同一阶段被加载的。

          (2)假如被final 修饰的变量,被频繁更改,那么就会不断地创建新的对象,这样就会额外的增加垃圾回收的频率,影响性能。

          (3)但是从另一个层面来说,使用final 还会降低垃圾回收,怎么说呢?我们都知道堆中有年轻代和老年代,当用年轻代中 用final 修饰的变量被老年代所引用,这个引用时间一般都会很长,因为 final 修饰的对象是随着 JVM 启动而启动,销毁而销毁的。所以一直引用着老年代的对象,那么老年代的对象就不会被垃圾回收掉,这样就降低了垃圾回收的频率。但是又拿来了一个问题,垃圾一直回收不到,内存报 OOM 的概率就提升了。所以没有好坏之分,分析问题要全面均衡一下。

    4、不可变对象主要的应用场景:

    (1)被建模对象的状态变化不频繁,比如说,一个数字变量、一个字符串变量…
    (2)同时对一组相关数据进行写操作(一次性写入),可以应用不可变对象,既可以保障原子性也可以避免锁的使用
    (3)使用不可变对象作为安全可靠的 Map 的键(key),HashMap 键值对的存储位置与键的 hashCode() 有关,如果键的内部状态发生了变化会导致键的哈希码不同,可能会影响键值对的存储位置。如果HashMap的键是一个不可变对象,则 hashCode()方法的返回值恒定,存储位置是固定的。

    四、构建线程私有对象

          我们可以选择不共享非线程安全的对象,对于非线程安全的对象,每个线程都创建一个该对象的实例(也就是说,谁是不安全的对象,就给每一个线程都私有分配一份),各个线程线程访问各自创建的实例,一个线程不能访问另外一个线程创建的实例。

          这种各个线程创建各自的实例,一个实例只能被一个线程访问的对象就称为线程特有对象。线程特有对象既保障了对非线程安全对象的访问的线程安全,又避免了锁的开销。线程特有对象也具有固有的线程安全性。

          ThreadLocal < T > 类 相当于线程访问其特有对象的代理,即各个线程通过 ThreadLocal 对象可以创建并访问各自的线程特有对象,泛型T指定了线程特有对象的类型。一个线程可以使用不同的ThreadLocal实例来创建并访问不同的线程特有对象。ThreadLocal就是为每一线程创建一个特有的副本,以此来做到数据不共享,保证线程安全问题。

    在这里插入图片描述
          ThreadLocal实例为每个访问它的线程都关联了一个该线程特有的对象,ThreadLocal实例都有当前线程与特有实例之间的一个关联。相当于一个 Map 的键值对,key 是一个不一样的线程,value 是当前线程特有的一些对象。

    五、装饰器模式

    1、装饰器模式可以用来实现线程安全,基本思想是为非线程安全的对象创建一个相应的线程安全的外包装对象,客户端代码不直接访问非线程安全的对象而是访问它的外包装对象。外包装对象与非线程安全的对象具有相同的接口,即外包装对象的使用方式与非线程安全对象的使用方式相同,而外包装对象内部通常会借助,以线程安全的方式调用相应的非线程安全对象的方法。
    相当于是使用外包装对象(加锁使其是线程安全的)去包裹非线程安全的对象。

    2、装饰器模式举例:在java.util.Collections工具类中提供了一组synchronizedXXX(xxx)可以把非线程安全的xxx集合转换为线程安全的集合,它就是采用了这种装饰器模式。这个方法返回值就是指定集合的外包装对象,这类集合又称为同步集合。

    3、另外说一下:Collection 是List 和Set 的父接口(和 Map 接口是同一级别的),Collections 是集合(List 、Set、Map)的一个工具类。

    在这里插入图片描述
    Collections 是一个工具类,调用非线程安全集合的方法,加锁实现这个集合的线程安全。

    SynchronizedList 的部分源码如下:

    在这里插入图片描述

    3、使用装饰器模式的一个好处:就是实现关注点分离,在这种设计中,实现同一组功能的对象的两个版本:非线程安全的对象与线程安全的对象。对于非线程安全的在设计时只关注要实现的功能,对于线程安全的版本只关注线程安全性。

    六、总结五种方式实现线程安全

    1、定义局部变量:这样做到在栈(各线程独有一份)上使用;

    2、使用无状态对象:这个更狠,直接在对象里不定义数据(状态),其实这样很多时候是很难做到的;

    3、使用不可变对象(final关键字):定义为不可变对象,这样多个线程只是取数据,而不修改数据;

    4、创建线程特有对象:多线程不是抢资源吗,那就每一个线程都自己拥有一份,谁也不抢谁的;

    5、使用装饰者模式:用一个外包装对象去包装非线程安全的对象,这样就实现了共享的是线程安全的对象。

                                                                                                    -END-


    有用点个关注,手留余香!😗 😗 😗

    展开全文
  • 语音识别系统增加图像识别技术设计来源:电子技术应用 作者:重庆大学通信工程学院 叶凌峡摘要:采用机器视觉对语音对象进行跟踪,利用说话人正常发音时,嘴部的开合状况提取语速信息,实时调整语音识别的工作...

    语音识别系统中增加图像识别技术的设计

    来源:电子技术应用  作者:重庆大学通信工程学院 叶凌峡

    摘要:采用机器视觉对语音对象进行跟踪,利用说话人正常发音时,嘴部的开合状况提取语速信息,实时调整语音识别的工作速度,匹配语音韵律,将有效提高语音识别准确性。讨论了系统的设计原理和实现技术,着重介绍了对应辅助图像识别的设计分析。

    关键词:语音识别 机器视觉 图像识别

    语音识别是机器自动语音识别(automatic speech recognition by machine)的简称。

    语音识别技术关系到多学科的研究领域,不同领域中的研究成果都对语音识别的发展作出了贡献。让机器识别语音的困难在某种程度上就像一个外语不好的人听外围人讲话一样,它与说话人、说话速度、说话内容、环境条件有关。语音信号本身的特点造成了语音识别的困难。这些特点包括多变性、动态性、瞬时性和连续性等。

    计算机语音识别的过程与人对语音识别处理过程基本上是一致的。目前主流的语音识别技术是基于统计模式识别的基本理论。一个完整的语音识别系统可大致分为三部分:

    (1)语音特征提取:其目的是从语音波形中提取出随时间变化的语音特征序列。

    (2)声学模型与模式匹配(识别算法):声学模型通常将获取的语音特征通过学习算法产生。在识别时将输入的语音特征与声学模型(模式)进行匹配、比较,得到最佳的识别结果。

    (3)语言模型与语言处理:语言模型包括由识别语音命令构成的语法网络或由统计方法构成的语言模型,语言处理可以进行语法、语义分析。对小词表语音识别系统,通常不需要语言处理部分。

        声学模型是识别系统的底层模型,并且是语音识别系统中最关系的一部分。声学模型的目的是提供一种有效的方法,计算语音的特征矢量序列和每个发音模板之间的距离。声学模型的设计与语言发音特点密切相关。声学模型单元大小(字发音模型、半音字模型或音素模型)对语音训练数据量大小、系统识别率以及灵活性有较大的影响。必须根据不同的语言的特点、识别系统词汇量的大小决定识别单元的大小。    由于有了种种困难,语音识别技术通常根据使用中的限制性要求,构建成不同类型的系统,通常包括三类。其一为限制用户的说话方式,这又可以分为孤立词语音识别系统(isolate-word speech recognition system)、连接词语音识别系统(connected-words speech recognition system)、连续语音识别系统(continue speech recopnition system)和即兴口语语音识别系统(spontaneous speech recognition system)。其二为限制用户的用词范围。第三种为限制系统的用户对象。    采用语速作为系统的第二信息渠道,一旦系统跟踪到了目标的语还,在协助语音识别的同时还能够有效地排除与语音信息不同步的外界噪声,因此系统能够获得更好的识别性能。    2.2.2 图像处理算法设计

    语言模型对中、大词汇量的语音识别系统特别重要。当分类发生错误时可以根据语言学模型、语法结构、语义学进行判断纠正,特别是一些同音字则必须通过上下文结构才能确定词义。语言学理论包括语义结构、语法规则、语言的数学描述模型等有关方面。目前比较成功的语言模型通常是采用统计语法的语言模型与基于规则语法结构命令的语言模型。语法结构可以限定不同词之间的相互连接关系,减少了识别系统的搜索空间,这有利于提高系统的识别。

    语音识别过程实际上是一种认识过程。就像人们听语音时,并不把语音和语言的语法结构、语义结构分开。因为当语音发音模糊时人们可以用这些和知识来指导对语言的理解过程,但是对机器来说,识别系统也要利用这些知识,只是如何有效地描述这些语法和语义还有困难:

    (1)小词汇量语音识别系统:包括几十个词的语音识别系统。

    (2)中等词汇量的语音识别系统:通常包括几百个词至上千个词的识别系统。

    (3)大词汇量语音识别系统:通常包括几千至几万个词的语音识别系统。

    这些不同的限制也确定了语音识别系统的困难度。

    1 增加图像识别设计的目的

    如今的语音识别技术正在逐渐成熟,许多语音识别技术都已经能够达到很高的识别率了,不过当识别率到了一定的程度后,再提高就很困难,此时需要采用其他技术来协助语音的识别。

    目前的语音识别系统由于采用单一传感器(声音传感器)进行工作,在进行语音识别时,不可能对捕获的语音信息进行细分,只能采用定速率跟踪识别,将语音信息与系统库中的模板进行匹配判断。如果捕获信息的速率与存储在系统库中的模板相关不多,则能正常工作,否则将会出现误判。然而现实生活中,人们说话不可能总保持相同的速率,而是不断变化的,这势必造成了语音识别系统的误差增多,以致降低语音识别系统的实用性。

    人们在进行语音交流时,在捕获语音信息的同时,也在获取其他的信息以帮助理解,例如表情、神态等信息。如果得不到相关信息,人们相互之间也会产生误解,例如当两个人在相隔较远距离时,由于不能清楚对方的表情、神态,经常会出现理解错误的情况发生。可见使用单一的信息渠道的确会增加理解难度,因此有必要考虑增加信息渠道来解决这个问题。这就是增加图像识别功能的原因。

    对于语音识别系统,如果能像人一样判断语言对象的喜、怒、哀、乐,当然是最好的,但这势必大大增加图像识别的工作量,甚至超过语音识别的成本,不太合理。并且,由于技术的原因,还不能使机器有像人一样的视觉能力,要让机器能够准确识别出人的各种表情还达不到,所以此种方案是不可取的。进一步分析知道,语音识别系统受语速的影响是很大的。人在正常讲话时,嘴的开合状态都是大同小异的,如果让机器只对嘴的开合两种情况进行判断和实时跟踪,得出讲话人的语速信息,是能够做到的。所以仅仅需要机器识别出人说话的速度,以此来调整语音识别的匹配速度,从而适合语音韵律,自然有利于系统的语音识别能力,提高识别的准确性。通过语速对语音识别系统的帮助,将为语音系统提供另一条实用的信息渠道。

    2 实现的技术及方法

    2.1 系统总体设计概述

    语音系统采集说话人(语言对象)的两路信息,一路由声音传感器取得,一路由摄像设备取得。摄像设备取得人的嘴型变化后,将之转化为语速信息送到语音识别器与采集到的语音进行匹配识别,自动调节识别速度,更好地完成语音识别工作。系统的工作流程如图1。

    2.2 辅助图像识别设计

    捕获语言对象的说话速率是保证整个系统良好工作的关键。为了实现此目的,使用基于机器视觉的人嘴部状态检测方法来设计。由于对图像的识别精度要求不高,可以选择灰度图像以提高运算速度。在速度允许的情况下,彩色图像的识别精度会更高。

    2.2.1 流程分析

    整个辅助图像识别设计的目的就是通过机器视觉进行图像采集、图像处理,提取出说话人的语速信息供语音系统使用。

    以灰度图像为例,其图像处理过程如图2。

    对于彩色图像,特征量会更多一些,也就更复杂一些,但其基本步骤都是先完成图像数字化,再进行图像特片提取,最后进行图像识别和理解。

    当完成图像处理后,比较模块将这一帧图像与上一帧图像的数据进行对比,判断出变化,从而统计出语速信息,最后输出给语音识别器进行匹配工作。

    (1)图像分割

    经过对人脸RGB像素的分析,发现人脸图像中的R、G两分量符合二维高斯分布。因此,可通过这两个分量确定人脸的位置。在人脸定位的基础上,根据人的嘴部处于人脸下半部分的特片,比较容易确定出嘴部的大致位置,它为嘴部精确定位提供了基本条件,如图3所示。

    (2)图像特征的提取

    根据系统要求,灰度图像可以满足需要,但由于嘴唇与皮肤的灰度差别不大,而且灰度信息更容量受到光照条件、人脸的运动和旋转变化等影响,使人脸图像中嘴唇区域边缘不明显,特别是当嘴唇内部的阴影区域与牙齿交替出现时,嘴唇的边缘变得更加模糊,所以利用唇色和肤色的灰度及边缘信息分割不能达到很高的准确度。若要提高对嘴部状况的识别准确度,可以利用彩色信息来对人嘴的形状、位置进行确定。

    研究发现,嘴唇的主要颜色特征是唇色相对肤色颜色较红,而且归一化RGB颜色对光照、人脸运动和旋转具有不变性。因此利用颜色信息,采用模式分类技术分割嘴唇区域,可以克服灰度图像本身固有的缺点。由于Fisher线性分类器能够最大限度地分开两类,且其学习是离线处理,减少了计算量,因此可采用Fisher线性分类器进行嘴唇区域分割。

    人嘴在说话与正常情况下的外形有明显的区别。说话时嘴部张开较大,而正常情况下,嘴部基本闭合(图4)。因此,可以利用这些特征进行嘴部状态的检测。研究中发现,嘴部区域的最大宽度Wmax、最大高度Hmax能够表征嘴部的张开程度,应取为特征值;上嘴唇与下嘴唇之间的高度Hmin在说话不说话时也有明显不同,应取为特征值。将以上三个特征值组成一组向量,即可描述出不同状态下的嘴部几何特片,如图5所示。

    将获得的能够描述人的嘴部区域几何形状特征参数组成一个特征向量Zui,即可作为下一步判别分类的输入向量:Zui=(Wmax,Hmax,Hmin)。

    在进行识别时只要确定两个状态“开”、“合”即可。在实际中由于发音时不同的语音会导致嘴的开合程度不一,所以对“开”(Hmin>0)的区分会很多种情况,必然会极大地增加运算存储量。相对而言,嘴的“闭合”状态一般只有一种模式(Hmin=0),因此可以只确定说话人嘴的“闭合”状态,其他状态都判为“开”,这样将方便处理。

    (3)图像识别理解

    由于对识别精度要求不高,既可以采用传统的统计模式识别方法,也可以采用较热门的神经网络识别方法;但由于系统对实时要求较高,而神经网络识别方法运行速度成问题,因此不建议采用神经网络识别方法。

    2.3 语速信息的提取

    选用合适的捕获频率不断采集说话人的图像,用当前帧的数据与上一帧数据进行比较,根据其变化的频率就可以推算出语速信息。实际情况中,所求的语速信息不需要太精确就能够达到一般要求。

    3 应用展望

    语音识别是一种赋能技术,现有的很多人机交互界面都可能通过补充语音识别功能而得到改善。语音识别技术可以把费脑、费力、费时的机器操作变成一件很容易且有趣味性的事情,在许多“手忙”、“手不能用”、“手所不能及”、“懒得动手”的场景中,包括像驾驶室、一些危险的工业场合、家电控制等方面,高识别率的语音识别系统将会更加方便人的工作和生活。

    由于知识层次和知识领域的差异,现实生活中有相当一部分人很难享受到现代化生活带来的便利,包括信息服务和其他各类先进设备可提供的帮助。高识别率语音识别技术有助于改善这种情况,使社会各个阶层更多的人享受到更多的社会信息资源和现代化服务,提高整个社会的信息化程度和现代化速度。

    高识别率语音识别技术还将推出机器人智能技术的发展,由于机器人本来就要配置视觉系统,本方案很容易实现,提高了人与机器交互的能力。另外高识别率语音识别技术在语音录入系统、会议实时记录及同声翻译、记者采访设备等方向有着广阔的应用前景。

    展开全文
  • 接着上篇继续讲,接下来主要介绍交易总体设计技术要点设计,对于电商台来说,交易系统是核心的核心,一开始就需要围绕高性能,高可用,和高扩展三个方面来重点设计。本篇主要介绍高性能设计。 对于高性能的...

    接着上篇继续讲,接下来主要介绍交易总体设计的技术要点设计,对于电商中台来说,交易系统是核心中的核心,一开始就需要围绕高性能,高可用,和高扩展三个方面来重点设计。本篇主要介绍高性能设计。

    对于高性能的定义,通常可以理解为系统/服务接口响应时间低(rt)且并发量(qps,tps)高. 提高性能的主要策略有:选择合理的分布式事务处理机制,数据库的分库分表,读写分离,异步化,缓存,复杂查询走搜索。

    选择合理的分布式事务处理机制

    交易业务要求订单,库存,优惠券,红包,支付等数据要强一致,如何保证这些数据之间的一致性是必须要解决的问题,也就是分布式事务的场景。

    业界分布式事务的选择方案非常多,每种方案之间的差异性非常大。让我们大概看一下几种常见的方案和其特点:

    2PC: 二阶段提交协议,最大几个问题是事务管理器(协调者)和资源管理器(参与者)之间的调用是同步阻塞的,如果在一次事务中只有部分资源管理器进行了commit操作,其他超时或者没有成功,会导致数据的不一致性。

    3PC: 三阶段提交协议,是对2PC的改进版本,引入了超时机制,极大的降低了同步阻塞,preCommit 阶段协调者和参与者出现通信问题后,仍然会出现数据不一致性的问题。

    TCC: 其实也是2PC的改进版本,TCC将事务参与者从数据库本身提升到了业务服务粒度,让每个业务单元实现try,confirm,cancel三个接口,协调者在调用完try接口会,根据返回接口调用confirm还是cancel,其最大问题是业务侵入性非常强,2PC的单点问题,超时问题也都存在,并且需要业务单元考虑各种异常情况,没法利用数据库的事务机制。

    阿里GTS: GTS通过将事务协调器集群化的方式解决了单点问题,但这也带来了另外一个问题,原来本地化的协调者变成了要网络通信的云协调者,如果不是在同一个数据中心,要跨越公网或者专有网络,性能损耗比较大,此外GTS支持的服务框架也是有限的,如果不支持也需要实现类似于TCC的业务接口。

    SAGA: 在微服务架构下,关注的人越来越多了,但saga早在1987年就提出来了,基本核心思想Saga是一系列本地交易,每笔事务都会更新单个服务中的数据。第一个事务由系统外部请求启动,然后每个后续步骤由前一个事件完成而触发。其最常见的两种实现方式如下:

    1.事件/编排:没有中央协调器,每个服务产生并聆听其他服务的事件,然后采取对应的处理动作。通常会使用消息中间件来实现。

    1. 命令/协调:中央协调器负责集中处理事件的决策和业务逻辑排序。因引入协调器模式比较重,目前没有好的框架。

    对saga要详细理解可以自行google,baidu.

    事务消息最终一致性方案:利用消息中间件的事务性消息/两阶段消息来实现,流程如下:
    在这里插入图片描述

    这种模式对业务的侵入性比较比较低,利用消息中间件,性能上有非常好的保障,此外即使遇上网络超时等问题,通过消息中间件的超时回调功能最终都能保证数据的最终一致性。因此我们也选择了这种方案作为我们的实现。以简化的确认下单时序来说明这个场景:
    在这里插入图片描述

    通过时序图可以看出,通过事务消息的2阶段提交和消息的超时回调极大的提升了各个业务数据的一致性,已经是非常不错的方案了,但仔细分析这个图,你还是能发现在极端场景还是有缺点,看个明显的问题:

    库存回滚失败:在本地事务回滚的情况下,调用库存系统回滚库存超时或者发生异常,库存数据将会出现不一致情况。对于这种情况需要通过离线或者实时的库存对账系统专门来解决。针对这个问题我们后面可以写一篇文章单独讨论了。

    数据库的分库分表

    对交易来说,数据量最大的是交易主表和子表,这两个表的数据也是随着业务量增长最快的,需要在一开始,就要考虑分库分表策略,不然等到业务发展到一定量再来调整,会非常痛苦,你会从前到后修改一边,还要迁移数据。对于这块我们总结了一些比较实用的策略,如下:

    用商家id取模作为分库分表的字段:这种策略比较适合平台性的公司,如果淘宝,天猫和拼多多。 但对于一些非常大的商家来说,还是会发生数据倾斜的情况。

    用买家id取模作为分库分表的字段:这种策略比较试用于自营性的平台,像京东这样的。

    自定义分库分表的规则: 大部分的情况,通过上面两种策略就能满足,如果你的业务非常特殊,比如要按照年月日之类的分,那就需要自己写分库分表规则函数来做了。

    分库分表的总原则是:利用交易常用的字段作为分库分表的字段,可以联合使用,库和表的数量支持后期修改,对应用代码透明,后期数据库扩容,上层应用无感知,至多调整一下分库分表规则。目前我们利用的是开源mycat来做这块,这块好用的还真不多,很多需要自己做额外工作。

    读写分离

    读写分离不太适用交易的场景,特别是在并发量非常高的时候,数据库的主备之间通常存在几ms的延迟,搞不好会造成很大的故障。但是为了节省成本,把备库的资源利用起来,对于一些规则确定不会造成问题的查询可以走备库,如:对交易完成数据的查询,对实时性要求不是非常高的运营管理系统和客服系统的查询,都可以切到备库查询。 读写分离也是需要提前考虑,在一开始就需要制定出规范,明确使用不当的后果。现在很多分库分表的框架都可以做到对应用透明的主备读写比例的调整,但业务代码必须要评估哪些场景是不能走备库读的。

    异步化

    对于核心系统异步化的重要性和带来的好处不用多说,但什么样的场景需要异步化了,就交易来说,像扣减库存,优惠券使用,支付这些核心链路是不能异步化处理,能异步化处理的是在交易时刻就不需要立刻确定的场景。如创建物流订单,佣金计算等。异步化的总体概览图如下:

    在这里插入图片描述
    总体原则就是将不在交易核心链路的部分,尽量异步化去处理。

    异步化常用的手段就是消息机制和分布式定时任务。

    消息机制:首先需要标准化交易事件消息,如交易创建,确认,支付完成等。来看一个样例代码片段:

    在这里插入图片描述
    不要每个交易事件,都单独搞个事件对象。发消息到消息中间件时,每个event为一个messageType,同一个topic,为了下游系统只订阅自己感兴趣的少部分数据,可以利用消息中间件的tags之类的机制进行订阅消息过滤。

    分布式定时任务:支付超时关闭交易,失败重试,异常交易扫描这些场景适应定时任务,延迟在分钟级别,这块选用开源界比较优秀的框架就可以了,没有必要自己搞。

    异步化带来的好处主要是:

    将交易系统和非核心系统解耦,从而确保交易的稳定性和响应时间。

    帮下游系统削峰,很多下游系统的容量是非常小的,在大促这样的高峰期间,是没有足够的资源跟上交易的处理速度的,消息中间件集群,会起到非常好的缓冲削峰作用,下游系统按照自己的速度消费就可以了,如果下游消费太慢会出现消息堆积,但消息集群本身就是耐堆积的。

    缓存

    缓存适用于读多写少的场景,但交易是以写为主的场景。所以交易数据本身是没有缓存需求的,但通过前面的核心链路分析可以看出,像交易依赖的商品,优惠,用户这些信息如果直接走DB, 会非常慢,而这些数据是读多写少,是非常适合使用缓存,提高性能的。交易团队需要通过依赖调用关系分析,推动依赖的上下游系统的技术团队,使用缓存技术,做性能提升和可靠性保障。常用的缓存策略有前置缓存和后置缓存。

    前置缓存:

    在这里插入图片描述

    优点:即使业务系统挂了,也没有啥影响,

    缺点:后期升级比较麻烦,必须通知依赖client的应用都强制升级。

    后者缓存:

    在这里插入图片描述

    优缺点正好和前置缓存相反。

    在实际使用中,如果为了保障非常高的可用性,可以两者结合使用,通过动态配置开关做切换,在client层的代码做一下路由切换处理。

    复杂查询走搜索

    成熟的电商系统,都有自己单独统一的搜索平台,选择什么样的索引构建方式,完全取决于业务上要多实时的查到最新的数据,目前主流的搜索框架,支持dump DB 和 api 直接推送两种模式。在我们自己的实践中,认为交易数据的实时性非常高,需要在1秒之内完成数据索引的构建。

    在这里插入图片描述

    在接受交易事情消息上可以利用批量投递的策略,提升处理能力,。

    这块需要特别注意的是消息集群到交易索引的构建系统消息在处理上会出现乱序的问题,必须要通过业务字段做先后次序处理,忽略过期的数据,一般都用业务发生时间bizTime.

    在推送索引这块可以利用聚合缓存策略, 减少推送索引的频率,很多搜索框架都对每次推送数据的大小,每秒的推送次数都有限制,需要利用聚合缓存策略来适应选择的搜索框架,总的来说就是不能推的太快,也不来太慢,还要保证所有的索引构建完成在业务允许的范围(1s)之内。

    搜索框架的选型非常多:开源的有ElasticSearch,lucene,nutch,solr,solandra. 商业产品的每个云平台都有搜索产品提供,默认推荐 elasticsearch, 如果对搜索结果准确性和智能化程度比较高,使用商业化云产品。

    这次就先写这么多,后面接着讲高可用和高扩展的技术要点设计。

    对这块有兴趣的欢迎交流技术方案和产品玩法。
    更多文章欢迎访问 http://www.apexyun.com/
    联系邮箱:public@space-explore.com

    (未经同意,请勿转载)

    展开全文
  • 微信技术总监分享架构设计高清完整PDF版

    万次下载 热门讨论 2012-05-15 09:17:26
    技术架构上,微信是如何做到的?日前,在腾讯大讲堂在中山大学校园宣讲活动上,腾讯广研助理总经理、微信技术总监周颢在两小时的演讲揭开了微信背后的秘密。
  • 技术是对设计思想的实现,一种设计思想可以有多种实现方式 设计研究的就是 如何处理 对象 以及 对象之间(相互利用)的关系 设计的一个目标是,尽量使每个对象独立发展互不影响,即对象之间解耦合 从...
  • 本章在考试一般出现3个选择题。 考点1:路由器技术指标 考点2:网络系统分层设计(上下级之比、核心层设计) 考点3:交换机技术指标(总带宽计算方法) 考点4:网络服务器性能(系统高可用性) 二、基于网络...
  • EDA技术在数字电路设计中的应用

    千次阅读 2008-01-17 16:11:00
    2006-05-11 22:30:30 EDA技术在数字电路设计中的应用 E.1数字系统的层次化结构设计前面介绍的组合逻辑电路和时序逻辑电路的设计都是属于功能部件的设计。功能部件设计是建立在真值表,特性表,状态转换图...
  • 流水线技术在高速数字电路设计中的应用 来源:电子开发网 作者:肖良军 时间:2007-09-04 发布人:谭欣 摘要:流水线技术是设计高速...同时,对流水线技术中引入寄存器事项也作了较全面的阐述。 1 前言 数字信号处
  • 防火墙技术及其在校园网设计方案 作 者 李 旭一. 网络安全技术 目前,各种网络安全技术在不断涌现,但最常用的技术就是防火墙技术。 防火墙系统是一种网络安全部件,它可以是硬件,也可以是软件,也可能是...
  • 技术方案设计规范

    千次阅读 2018-09-08 17:25:54
    这个文档用于描述方案的详细设计,包含但不仅限于对架构图的影响、关键系统功能的实现方式(功能维度和非功能维度   背景介绍 简单文字介绍 + tapd链接   架构变更 业务用例图 需要体现本次需要公司对...
  • jsp几乎没有自动生成的方法,否则,你设计的工作量会远远大于实际编码的工作量,所以,我建议b/s开发界面部分通过界面设计引入,然后,手写完成。目前比较好的做jsp开发的工具我认为是:ibm的wsad,或者采用...
  • 技术博客园系统开发设计总结

    千次阅读 2016-12-29 15:04:41
    经过一个月的时间,完成“技术博客园”的开发设计,在该系统开发过程,重新领会了软件设计的思想以及软件开发的根本。 写此博客进行总结这段时间的得失。   技术博客园Github链接:技术博客园  技术博客园...
  • from gensim.models import Word2Vec path = random_walk(header_table, iter_count=2, step=3) model = Word2Vec(path, min_count=2) def choose_similarity_user(self, user, user_list, user_num): ...
  • 需求分析及技术方案设计

    千次阅读 2018-07-17 12:17:40
    2、统计出符合条件的session,访问时长在1s~3s、4s~6s、7s~9s、10s~30s、30s~60s、1m~3m、3m~10m、10m~30m、30m以上各个范围内的session占比;访问步长在1~3、4~6、7~9、10~30、30~60、60以上各个范围内的session...
  • API Gateway技术设计

    千次阅读 2017-08-04 14:45:07
    一,API Gateway架构设计 服务网关是微服务架构一个不可或缺的部分。通过服务网关统一向外系统提供REST API的过程,除了具备服务路由、均衡负载功能之外,它还具备了权限控制等功能。Spring Cloud Netflix...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 132,684
精华内容 53,073
关键字:

技术中设计