• [其他] 利用边缘检测计算物体面积(1)
    在农业中,通常希望获取不同土地的面积。虽然获取这些土地的面积操作相对容易,但是却涉及高额的费用。另外,如果对于不规则形状的土地,测量土地面积的大小就变得相对困难。幸运的是,有大量以卫星图像的形式公开提供的农场土地数据。如下图所示就是得到的土地的图片。根据这样的图片,应用图像处理算法,就可以计算得到每块土地的面积。我们可以使用导数滤波器,因为它似乎与人类如何区分土地或地块的方式相匹配。当我们观察物体时,我们使用对比度和阴影来确定物体的形状,种类。类似地,可以使用导数滤波器来寻找对比区域。如果像素值与其周围像素之间的差大于阈值,则将其标记为1,否则标记为0。这将创建一个具有选定原始图像边缘的二进制图像。原始图像中存在大量噪点和细节,这可能会降低算法的成功率。建议在应用导数滤波器操作之前,对图像进行模糊滤波去除噪声。我们可以使用任意的模糊滤波器完成图像去噪。由于我们主要目的是消除噪声和微小的细节,同时保留绘图的颜色以用于对比,因此我们使用了4x4的中值滤波器。之后对图像进行灰度化,得到灰度图像以便后续进行边缘检测。具体结果如下图所示。之后尝试了三种边缘检测方法以找到最佳结果。第一种边缘检测滤波器是Sobel滤波器。该滤波器在图像的每个像素上执行梯度检测。内置的Matlab、opencv函数可在水平和垂直方向上执行操作,并将结果组合在一起。具体结果如下所示。通过结果可以知道生成的图像几乎没有噪点。但是,不幸的是将滤波后的图像与原始图像进行比较,可以看出,地块之间的许多分隔线没有被很好地拾取。在农田的颜色与相邻地块差异不大的地区尤其如此。第二种边缘检测方法是Canny过滤器。滤波结果在下面给出,从Canny滤波结果可以看出Canny滤波器检测了了更多的边缘。但是同样存在缺点,这种方式会产生更多的噪声。考虑到Canny算法将通过幅度阈值函数的像素与通过稍低阈值函数的相邻像素合并,这是可以预期的。Canny算法比简单的Sobel滤波器更为复杂。它还取决于事先要进行的高斯平滑。使用中值滤波器可能会阻止最佳结果。第三种滤波器是高斯滤波器的拉普拉斯算子。该滤波器提取的结果如下图所示。通过结果我们可以发现,无论我们使用什么过滤器,都可以看到大多数突出的道路都被检测到了。但是,农田内部的小区域和靠近道路的房屋是否产生的噪声取决于我们选取的滤波器种类。农田图像的这一特征使其非常适合高斯滤波器的拉普拉斯算子。查看测试结果,可以得出一个比较理想的结果。找到的道路数量最多,噪音最小。为了进一步去除图像中的噪声,去除总像素面积小于平均像素面积值的所有白色区域。这个阈值是我们经过多次试验得到的一个经验值。小伙伴也可以尝试其他的阈值。之后对图像进行反转,得到田地的区域。之后对这个结果进行尺寸位4的膨胀运算,结果如下图所示。有了这个图像,计算每个土地的面积就很简单了。Matlab(或OpenCV)的regionprop函数可用于查找每个区域的面积。仍有少量田地不是真正的田地,有些是道路或其他细节。为了减轻这些面积,我们只计算面积大于平均值减去一个标准偏差的区域。然后为每个区上色,并在其位置打印其像素尺寸。结果可以在下图中看到。打印的尺寸是该区域中像素的数值。除非像素和图像尺寸之间存在已知比例,否则这些值将毫无用处。但是,我们知道卫星图(例如Google Maps)往往带有刻度,这就位像素数值提供了意义。结果还是比较满意。该应用程序能够将大多数地块分成自己的特定区域。但是,有一些例外。例如,像素值47,680的大橙色部分将两个区域融合在一起。这可以通过使用膨胀值来解决。要考虑的另一项内容是,道路的扩张确实侵蚀了农场的像素区域。为了获得更准确的农场价值,可能需要将这种侵蚀的结果添加到农场的总面积中。原文地址:https://towardsdatascience.com/finding-land-area-of-farm-plots-using-edge-detection-5b070cc05c5a作者:Tim Chin
  • [技术干货] php图像处理
    使用 PHP 图像处理函数,需要加载 GD 支持库。请确定 php.ini 加载了 GD 库:Window 服务器上:extension = php_gd2.dllLinux 和 Mac 系统上:extension = php_gd2.so使用 gd_info() 函数可以查看当前安装的 GD 库的信息:<?phpvar_dump(gd_info());?>输出大致如下:array(12) {  ["GD Version"]=>  string(26) "bundled (2.1.0 compatible)"  ["FreeType Support"]=>  bool(true)  ["FreeType Linkage"]=>  string(13) "with freetype"  ["T1Lib Support"]=>  bool(false)  ["GIF Read Support"]=>  bool(true)  ["GIF Create Support"]=>  bool(true)  ["JPEG Support"]=>  bool(true)  ["PNG Support"]=>  bool(true)  ["WBMP Support"]=>  bool(true)  ["XPM Support"]=>  bool(false)  ["XBM Support"]=>  bool(true)  ["JIS-mapped Japanese Font Support"]=>  bool(false)}
  • [其他] 两大图像处理库Halcon和Opencv 的对比
    OpenCVHalcon开发语言C++、C#(emgu)、Python、Ruby、MATLAB等语言C,C++,C#,Visual basic和Delphi等语言应用场合侧重计算机视觉领域,侧重研究领域侧重机器视觉领域,侧重应用领域费用免费收费开放性及版本更新速度开源(可看底层源码),版本和功能更新慢商业软件(底层代码封装),版本和功能更新快对使用者的门槛偏科研,有难度,有深度,完全从底层开发,对使用者门槛高,开发效率低,开发慢偏工程应用,使用封装好的功能函数,对使用者门槛低,开发效率高,开发快资料及技术支持资料少。遇到问题,难以获得技术支持资料多。遇到问题,可以及时、有效的获得技术支持Halcon 在工业视觉领域属于经常使用的软件,相对于opencv的开源精神Halcon属于商业非开源项目并且收费。Halcon起源于德国在国内的工业视觉领域市场占用率遥遥领先。作者在使用halcon的过程中也感受了其软件的人性化,有独立的调试编程环境。对应主流的语言C#、C++、VB等工业上常用的语言都能提供流程的调用。Halcon提供的每一年都有升级,在升级的过程中算子的速度更快能达到汇编级别的加速度,对比opencv在总体的算子性能领先程序在五到十年。与此同时Opencv在调试的过程中没有Halcon方便,opencv的使用需要用户有比较好的编程基础,并且图像并不是实时能够观察调整。Halcon:底层功能算法多,运算性能快,开发需要一定软件功底和图像处理理论。快速学习的做法:研究实例、做实战项目。halcon不能提供相应的界面编程需求,需要和vs来构造界面,才能构成一套完整软件。 OpenCV Opencv:计算机图像方面的图像库,开源的,可以用于商用,在很多高校和科研机构使用比较多,更多的人选择它,是为了写自己的算法,其调试不像Halcon那样方便,其项目开发周期也比Halcon要长,所以在工业应用上,还不是太多。 但是,如果你是搞算法的,并且项目周期长,公司不愿意购买/使用商业视觉软件的,可以考虑Opencv;如果你的项目周期短,公司可以承受商业软件的成本,选择Halcon会是比较明智的选择。
  • [其他] 介绍用于图像识别的五大最佳编程语言!
    1.Python 目前,Python被认为一种目前最流行的编程语言。其简单性和多功能性是许多程序员喜欢使用它的一些原因。尽管很简单,但Python是一种可以依赖于执行复杂任务的语言。它可用于创建图像处理和识别功能。Python的普及使其资源非常丰富。它包含几个功能所需的库,其中包括图像识别。最强大和最有效的库之一是Scikit-Learn机器学习库。除了图像识别,这些库还可用于更智能的功能,如人脸识别和运动检测。2. Matlab Matlab是一种独立的编程语言,它有自己的框架和集成开发环境(IDE),具有更强大的工作空间。该编程语言提供了广泛的工具,你可以使用它们轻松处理更多技术编程任务。图像识别和面部处理是Matlab可以处理的一些任务。Matlab提供了一系列用于矩阵计算的内置工具。必须注意的是,图像识别和矩阵计算是齐头并进的。Matlab中可用的一些工具可以执行复杂的图像处理任务,例如裁剪、旋转、掩蔽等。还有一个专用的Matlab代码,用于调用和实现面部识别功能。这个代码使用AT&T数据库。因此,你应该在使用这个代码之前下载AT&T数据库。最先进的人脸识别应用程序是用Matlab编写的。3. C / C ++ / C# 在C系列编程语言方面,你永远不会出错。它们功能强大,可以做任何事情,包括创建图像处理和识别功能。C系列编程语言提供了两种创建图像处理功能的选项。你可以选择从头开始对所有代码进行编码,从而手动编写代码。第二种选择是使用专为这些编程语言设计的现有库。这些库包括OpenGL、EmguCV、OpenCV等等。它们具有用于图像识别的智能图像处理功能。4. Java像C和C ++一样,永远不要低估Java编程语言的强大功能。这种语言足以执行复杂的功能。它可用于创建图像处理和图像识别的应用程序。5. OpenCV工具开源计算机视觉(OpenCV)是一种用于实时处理的高级工具。它也是一种跨平台工具,因此可以集成到任何编程语言中,以执行图像处理和识别功能。它可以与C、C ++、Java、Python和Android编程语言集成。OpenCV提供无专利算法,你可以在没有任何法律限制的情况下使用。它可用于商业和学术目的。它有一个专门的脸部识别器类,你可以用它来试验图像识别功能的能力,没有任何麻烦。该课程附有一个信息丰富的文档,将向你展示如何实现图像识别功能。总体而言,无论使用何种编程语言,OpenCV都是图像识别的首选工具。
  • [其他] 图像识别技术
    分析  图像识别技术是数字图像处理和模式识别技术相结合的产物。数字图象处理是利用计算机或其他数字设备对图像信息进行各种加工和处理,以满足目标识别需求的基础行为。模式识别研究如何用机器来实现人对事物的学习、识别和判断能力,因而是以满足目标识别的判断行为。表达  为了模拟人类图像识别活动,人们提出了不同的图像识别模型。例如,模版匹配模型。这种模型认为,识别图像中的某个物体,必须在过去的经验中有有这个图像对对物体的记忆模式,又叫模板,当前的刺激如果能与大脑中的模板相匹配,这个物体就被识别了。过程  图像识别的基本过程是抽取代表未知样本模式的本质表达形式(如各种特征)和预先存储在机器中的标准模式表达形式的集合(称为字典)逐一匹配,用一定的准则进行判别,在机器存储的标准模式表达形式的集合中,找到最接近输入样本子模式的表达形式,该表达模式对应的类别就是识别结果。因此,图像识别技术是一种从大量信息和数据出发,在已有经验和认识的基础上,利用计算机和数学推理的方法自动完成图像中物体的识别和评价的过程。分类  图像识别过程包括图像采集(特征分析)、图像预处理、特征提取、模式匹配4个环节。
  • [其他] 光学字符识别
    Ⅰ  光学字符识别使用OCR读取设备和智能视觉系统软件,识别可同时被机器和肉眼读取的文本。Ⅱ  OCR所使用的输设备入设备可以是任何一种图像采集设备,如CCD、扫描仪、数字相机等。Ⅲ  通过使用这类采集设备,OCR系统将书写者自己写好的文字作为图像输入到计算机中,然后由计算机去识别。Ⅳ  光学字符识别技术已经广泛应用于各种商业活动,现在又开始应用到自动化任务中。Ⅴ  字符识别处理的信息可分为3大类:文字信息识别、数字信息识别和条形码识别。Ⅵ  文字信息识别对各民族文字书写的或印刷的文本信息进行识别。Ⅶ  如汉字识别,目前已经趋向成熟,并推出很多应用系统。Ⅷ  数字信息数别对阿拉伯数字和少量特殊符号组成的各种编号和统计数据识别。Ⅸ  如邮政编码、汽车牌照、统计报表、财务报表、银行票据等,处理这类信息的核心就是数字识别。ⅩⅠ  常见的应用包括对邮局信件的分拣、车牌号读取、同性证处理等。ⅩⅡ  条形码识别对由一组按特定编码规则排列的宽度不等的多个黑条和空白组成的信息进行识别。ⅩⅢ  根据条形码的维度,通常将条形码分为一维条形码和二维条形码。ⅩⅣ  条形码具有成本低、扫描速度快、识别可靠性高等优点,同时为了克服条形码不能被人工识别的缺点,又在条形码的下方印上数字和字符。ⅩⅤ  成为条形码识别和光学字符识别的双重形式,条形码可以标出物品的生产国、制造厂家、商品名称、生产日期、图书分类号、邮件起止地点等许多信息。ⅩⅥ  因而在商品流通、图书管理、邮政管理、银行系统等许多领域都得到广泛应用。
  • [其他] 图像识别 - 研究现状
    阶段  图像识别的发展经历了三个阶段:文字识别、数字图像处理与识别、物体识别。文字识别的研究是从 1950年开始的,一般是识别字母、数字和符号,从印刷文字识别到手写文字识别, 应用非常广泛。始于  数字图像处理和识别的研究开始于1965年。数字图像与模拟图像相比具有存储,传输方便可压缩、传输过程中不易失真、处理方便等巨大优势,这些都为图像识别技术的发展提供了强大的动力。物体的识别主要指的是对三维世界的客体及环境的感知和认识,属于高级的计算机视觉范畴。它是以数字图像处理与识别为基础的结合人工智能、系统学等学科的研究方向,其研究成果被广泛应用在各种工业及探测机器人上。现代图像识别技术的一个不足就是自适应性能差,一旦目标图像被较强的噪声污染或是目标图像有较大残缺往往就得不出理想的结果。识别方法  图像识别问题的数学本质属于模式空间到类别空间的映射问题。目前,在图像识别的发展中,主要有三种识别方法:统计模式识别、结构模式识别、模糊模式识别。图像分割是图像处理中的一项关键技术,自20世纪70年代,其研究已经有几十年的历史,一直都受到人们的高度重视,至今借助于各种理论提出了数以千计的分割算法,而且这方面的研究仍然在积极地进行着。类型  现有的图像分割的方法有许多种,有阈值分割方法,边缘检测方法,区域提取方法,结合特定理论工具的分割方法等。从图像的类型来分有:灰度图像分割、彩像分割和纹理图像分割等。早在1965年就有人提出了检测边缘算子,使得边缘检测产生了不少经典算法。但在近二十年间,随着基于直方图和小波变换的图像分割方法的研究计算技术、VLSI技术的迅速发展,有关图像处理方面的研究取得了很大的进展。图像分割方法结合了一些特定理论、 方法和工具,如基于数学形态学的图像分割、基于小波变换的分割、基于遗传算法的分割等。
  • [其他] YOLO5- 目标检测 领航者
    首先  这是YOLO家族中,第一个先用PyTorch的原生版本,而非PJ Reddie的Darknet编写的模型。Darknet是一个非常灵活的研究框架,但它并没有考虑到生产环境的构建,而且用户社区也较小。这导致Darknet需要在配置上花费不少功夫,而且生产准备不足。 其次  YOLOv5是在PyTorch中实现的,它受益于成熟的PyTorch生态系统:支持更简单,部署更容易。此外,作为一个更广为人知的研究框架,YOLOv5 的迭代对更广泛的研究社区来说可能更容易。这也使得部署到移动设备上更加简单,因为该模型可以轻松编译成ONNX和CoreML。然后  YOLOv5的速度快得惊人。在YOLOv5 Colab notebook上,运行Tesla P100,我们看到每张图像的推理时间仅需0.007秒,这意味着每秒140帧(FPS)!相比之下,YOLOv4在被转换到相同的Ultralytics PyTorch库后的速度是50FPS。YOLOv5的速度是YOLOv4的2倍还多! 再后  YOLOv5精度超高。在Roboflow对血细胞计数和检测(BCCD)数据集的测试中,只训练了100个epochs就达到了大约0.895的平均精度(mAP)。诚然EfficientDet和YOLOv4的性能相当,但在准确率没有任何损失的情况下,看到如此全面的性能提升是非常罕见的。 最后  YOLOv5的体积很小。具体来说,YOLOv5的权重文件是27兆字节。YOLOv4(采用Darknet架构)的权重文件是244兆。YOLOv5比YOLOv4小了近90%!这意味着YOLOv5可以更容易地部署q到嵌入式设备上,所以Ultralytics也在招iOS开发。
  • [其他] 计算机视觉(CV)
      计算机视觉是一门研究如何使机器“看”的科学,就是指用摄影机和计算机代替人眼对目标进行识别、跟踪和测量等机器视觉的应用,是使用计算机及相关设备对生物视觉的一种模拟,对采集的图片或视频进行处理从而获得相应场景的三维信息,让计算机具有对周围世界的空间物体进行传感、抽象、判断的能力。  计算机视觉在现实场景中应用价值主要体现在可以利用计算机对图像和视频的识别能力,替代部分人力工作,节省人力成本并提升工作效率。传统的计算机视觉基本遵循图像预处理、提取特征、建模、输出的流程,不过利用深度学习,很多问题可以直接采用端到端,从输入到输出一气呵成。(1)研究内容实际应用中采集到的图像的质量通常都没有实验室数据那么理想,光照条件不理想,采集图像模糊等都是实际应用中常见的问题。所以首先需要校正成像过程中,系统引进的光度学和几何学的畸变,抑制和去除成像过程中引进的噪声,这些统称为图像的恢复。对输入的原始图像进行预处理,这一过程利用了大量的图像处理技术和算法,如:图像滤波、图像增强、边缘检测等,以便从图像中抽取诸如角点、边缘、线条、边界以及色彩等关于场景的基本特征;这一过程还包含了各种图像变换(如:校正)、图像纹理检测、图像运动检测等。根据抽取的特征信息把反映三维客体的各个图象基元,如:轮廓、线条、纹理、边缘、边界、物体的各个面等从图象中分离出来,并且建立起各个基元之间的拓朴学上的和几何学上的关系——称之基元的分割和关系的确定。计算机根据事先存贮在数据库中的预知识模型,识别出各个基元或某些基元组合所代表的客观世界中的某些实体——称之为模型匹配,以及根据图象中各基元之间的关系,在预知识的指导下得出图象所代表的实际景物的含义,得出图象的解释或描述。(2)瓶颈目前在实际应用中采集到的数据还是不够理想,光照条件、物体表面光泽、摄像机和空间位置变化都会影响数据质量,虽然可以利用算法弥补,但是很多情况下信息缺失无法利用算法来解决。在一幅或多幅平面图像中提取深度信息或表面倾斜信息并不是件容易的事,尤其是在灰度失真、几何失真还有干扰的情况下求取多幅图像之间的对应特征更是一个难点。除了得到物体的三维信息外,在现实世界里,物体间相互遮挡,自身各部位间的遮挡使得图像分拆更加复杂。预知识设置的不同也使得同样的图像也会产生不同的识别结果,预知识在视觉系统中起着相当重要的作用。在预知识库中存放着各种实际可能遇到的物体的知识模型,和实际景物中各种物体之间的约束关系。计算机的作用是根据被分析的图象中的各基元及其关系,利用预知识作为指导,通过匹配、搜索和推理等手段,最终得到对图象的描述。在整个过程中预知识时刻提供处理的样板和证据,每一步的处理结果随时同预知识进行对比,所以预知识设置会对图像识别结果产生极大影响。
  • [其他] 人工智能 - 图像识别
      企业使用图像识别的各种方式包括:在工厂生产线上进行自动检查,在保险中生成损坏估计,在图像中识别物体,对人员进行计数,控制制造过程,检测诸如顾客进入商店等事件以及生成真实世界的模型。  人工智能技术必须找到一种方法,采用各种人工智能算法可以处理的数字来描述世界。在视觉方面,研究人员发现了如何将一张图片划分成一个像素网格,这样每个像素都可以表示为一个数字。在早期,采用一个数字来描述每个像素的亮度。后来,人们发现可以用三个或更多的数字来描述每个像素中不同颜色的亮度。  20世纪60年代,研究人员开始探索如何使用原始形式的光学字符识别(OCR)技术的软件图像识别功能来识别数字文档中的字符。其他研究人员开始探索基于图像的场景解释技术,试图从二维图像重建三维图像。多年来,这些技术已成为机器视觉行业工具包的一部分。  后来,研究人员发现可以将图像识别组织为一个分层过程,以使其更易于解释日益复杂的现象。例如,黑色和白色像素可能被识别为线条和曲线,而线条和波浪形又被识别为数字的一部分。训练算法来学习基于这些曲线图案而不是每个像素的亮度来解释字符的方法要容易得多。类似地,更容易根据图像是否包含两只眼睛和适当形状的耳朵来确定图像是否是猫,而不是根据每个像素中颜色的原始亮度来确定。  这种处理方式有望推进图像识别领域。然而直到2012年左右,随着AlexNet(一种设计用于支持图像识别的八层卷积神经网络)的发展,研究人员才发现如何扩大这个过程以识别成千上万种不同类型的物体。  诸如AlexNet之类的深度学习技术的优点在于,该模型可以自动学习以不需要人类以编程方式指定每个步骤的方式来执行各种图像识别任务。研究人员指出了如何将神经网络应用于不同类型的问题,该功能也促进了深度学习在其他类型的应用程序中的使用。  如今,图像识别用于识别货架上的产品、图片或视频中的人物,生产流水线上的缺陷以及自动驾驶汽车在街道上遇到的物体。随着冠状病毒疫情的出现,很多企业正在开发应用程序以监视社交距离的规则。  对于企业领导者来说,一个关键的见解是,通常有可能通过在应用程序中使用多种类型的图像识别来创造更多的价值。例如,智能文档处理和文档智能结合了一组人工智能技术,其中包括自然语言处理和机器学习,以捕获难以识别的格式中的数据并将其分类。与光学字符识别(OCR)结合使用,智能文档处理可以分析文档的视觉布局,以确定哪个部分代表产品、发票金额或销售条款,并将该信息提供给其他业务应用程序。  值得注意的是,企业中大多数图像识别应用程序都是高度场景相关的。供应商和研究人员经常宣传新的图像识别改进,例如在识别肿瘤方面击败了医学专家的软件。但是在实践中,仅当图像以正确的角度捕获时,人工智能才可以使用一组特定的设备来处理这些放射线图像,而人类则善于分析从许多不同角度捕获的各种图像。  研究人员还发现,在这些图像识别应用程序的一些实现中也潜藏着偏见。为了减少偏见,专家建议对这些应用程序进行数据训练,这些数据代表将要处理的特定类型的图像。
  • [其他] 多模态学习,带来AI全新应用场景
    新的AI技术发展趋势有哪些?多模态学习技术一定是其中之一。最近,刚刚宣布“自立门户”的微软AI明星产品小冰改名为“红棉小冰”。殊不知2014年诞生的这一个AI对话机器人已经在5年时间里更新到了第七代了,据称能力上正在“无限接近人类”。现在的小冰,不仅是那个会作诗的机器人了,她还会唱歌作曲、阅读朗诵、撰写新闻,甚至去年还办了一个虚拟7位画家的个人画展。多模态识别技术正是小冰越来越像人一样沟通表达的关键之一。多模态技术同样也在视频网站、电商物流、自动驾驶等领域得到广泛。像爱奇艺推出的“只看TA”功能,优酷视频正在使用的视频帧、人脸帧的图向量检索,都离不开多模态识别技术的支持。而像京东淘宝等电商平台的“拍照购”、“拍立淘”的搜索技术背后也都是在计算机视觉技术下,使用了图像、文本和高层语义属性等多模态下的信息融合,才实现高精度的“以图搜图”功能。百度提出的“多模态深度语义理解”,则让AI实现从“看清听清”到“看懂听懂”的进化。可以说,人工智能在通向人的智能的道路上,多模态学习就是一个绕不开的发展方向。因为人类本身就是一个多模态学习的典范。现在,多模态学习技术正在带来众多全新的应用场景。关注AI技术和应用发展趋势的你,想必也想了解下多模态学习的来龙去脉,以及在这些新应用场景中的技术现状与问题。而这些问题也是本文重点探讨的内容。“多模态学习”,正式认识下模态(Modality),虽然不是我们的日常用语,但却十分容易理解。我们每一天都会接触到各种不同来源和形式的信息。正如我们有视觉、听觉、嗅觉和触觉等,那么我们接触的信息就有视频、图像、文字、语音、味道、软硬度等,这每一种信息的形式就可以称作一种模态。模态的范围要比我们的感知能力更宽泛。除了视觉、听觉获得的模态信息,我们也可以利用传感器获得诸如雷达、红外线等不同感应数据的模态信息。此外,模态的类型定义也可以非常宽泛,比如我们可以把两种不同的语言当做是两种模态,把不同结构下采集的数据,也可以当做两种模态。比如,仅仅一个视频内容数据,就是一个高维度、多模态的数据信息,其中包含了标题、简介、评论、字幕等文本信息,也有视频帧的图像、声音,以及连贯动作视频片段的视觉、声音信息。多模态学习,从上世纪70年代就已经起步,几经发展,现在正进入到机器学习特别是深度学习的阶段。通常称为多模态机器学习(Multi-Modal Machine Learning ,MMML),试图通过机器学习的方法实现对多源模态信息进行分析和理解。当前主要热门的研究方向自然是对图像、视频、音频、语义之间的多模态学习。当前,多模态学习主要研究方向有多模态表示学习、模态间映射,多模态对齐、融合、协同学习等。多模态表示学习,研究如何将多个模态数据所蕴含的语义信息数值化为实值向量,通俗理解就是对多个模态的数据进行相关性编码,让不同模态建立起映射关系。按多模态表示共享的方式,主要分为公共表示学习和特异性表示学习,后者由于是分别学习不同模态的特征,可以应用于诸如零次学习、模态间映射、跨模态检索等任务中。模态间映射,研究如何将某一特定模态数据中的信息映射至另一模态。例如,给定一幅图像,通过机器学习得到这副图像的描述,或者给定一段文字,生成一幅匹配的图像。类似于我们学习中遇到的“看图说话”和“以题作画”的问题。模态间映射早已可以应用于语音合成、图像视频描述以及跨模态检索等应用中。此外,多模态对齐,主要研究如何识别不同模态之间的部件、元素的对应关系,以促进学习到的多模态表示更加精确,例如将电影画面、口型、语音、字幕的自动对齐;多模态融合,主要致力于不同模态间的模型与特征的整合,以获得更全面的特征,提高模型鲁棒性,并且保证模型在某些模态缺失时仍能有效工作;而多模态协同学习,主要考虑如何从信息丰富模态上学习的知识迁移到信息匮乏的模态,使各个模态的学习互相辅助。典型的方法包括多模态的零样本学习、领域自适应等。近两年,随着机器学习的模型的飞速进展,多模态学习中出现的映射质量问题、对齐的匹配度量以及融合噪声干扰等问题,都在实现很好的优化解决,为多模态的落地应用做好了准备。多模态学习,正在丰富哪些应用场景?通过以上解释可以知道,其实很多我们熟知的AI技术都可以归类到模态学习当中。比如,像机器翻译,通过输入的一种A语言即时翻译为另一种B语言,其实质就是一种模态之间的映射转化。类似的还有唇读识别和语音翻译,也就是分别将唇部视觉和语音信息转换为文本信息。在图像识别中,会应用到一种“图片语义分割”,即尝试给图片的不同像素区域对应到每一种类型标签,实现视觉和词汇的对应。这就是多模态对齐在空间维度的应用。当然,基于多模态数据的丰富表示以及映射、对齐和融合的应用,可以将目前AI的三种主要感知模态——语音交互、机器视觉、传感器智能进行多模态组合,产生全新的应用场景。在语音交互上,“多模态深度语义理解”技术正在为其带来更深度的应用场景。对于前几年的智能音箱,我们都有这样的感触,那就是语音交互只能完成简单的搜索,一旦多聊几句,就发现机器人要么只有万能的“套路”公式,要么就“答非所问”。这一问题的根源就是人工智能无法更好的理解对话者的深层涵义,也没有灵活的应答机制和内容。此外,也更难理解人的语气、情绪这类情感模态信息,当然因为没有视觉感知,更不可能去理解人的表情、动作、姿态等信息。多模态深度语义理解可以极大改善这类语音交互的语义理解难题。比如,其中一个应用场景是智能汽车的数字座舱,正在从原本单一的车载语音识别,实现融合视觉、语音、车内外场景图像的多模态识别的转变。在实际的语音交互中,车载智能助手不仅可以实现语音的识别,也可以通过摄像头识别人的表情神态、动作,比如识别疲劳驾驶、分心、发热等状况,以进行即时的语音提醒。语音交互也可以更加以人类的自然语言进行交互,而不必要使用生硬的指令型语言。而在以机器视觉为主的应用中,多模态学习技术也带来新的应用可能。以电商平台购物为例,用户的一大痛点就是看到一些“心水”的好物或者同款,但不知道名字,通过拍照识别和检索,将为用户提供最便捷的推荐服务。另外,在电商的智能客服,用户也希望能够通过简单对话或者发送图片、视频的方式处理订单问题。在这些场景中,跨模态检索和映射转化技术就得到了深度应用。比如,在商品推荐和信息流广告中,就需要结合海量商品图像与对应的商品语义属性,学习图像语义特征表达,以提高符合用户需求的商品推荐度。而与智能客服进行的多轮对话中,融入视觉到语言的跨模态转换技术,可以自动实现对用户上传的图片或视频进行自动应答。在传感器智能上,多模态识别技术可以应用到大量的物联网设备场景中。通过在大量的智能设备中增加视觉、温度、湿度和光线传感器,来实现多模态的智能交互。比如在智能空调中,加入语音交互、视觉识别指令,结合传感器判断屋内温度和湿度,可以根据屋内人数、位置等因素来实现更精准的控温方案。而现在更多智能大屏应用,也在将机器视觉、语音交互和一些智能传感器引入到智能硬件中,实现对屋内光线的调节、音量、观看者状态(离得是否太近,是否有未成年人)等因素的智能识别和调节。而近期,华为推出的一款针对办公场景的智慧屏幕,可以根据视频会议中的发言对象进行视角跟踪,将摄像头跟踪、焦点人物识别和身份识别结合起来。正如开始列举的,多模态学习技术更主要的应用还是集中在语音和视觉的多模态识别上。在爱奇艺的“只看TA”的功能中,除了人脸识别要区分是真人还是卡通人物,还要对人体信息,甚至还有微表情、身体语言等识别,多模态技术成为视频场景中不可缺少的技术支撑。而在未来的聊天机器人或者智能助手上,多模态学习将帮助智能机器人综合处理图像、声音和文字信息,同时可以进行综合模态,甚至包括情感等特征信息的输出与表达。技术尚在中途,未来仍需努力不过,我们仍然需要指出的是,尽管多模态学习技术已经有诸多的应用场景,但其技术实现仍然有诸多不足,也会有一些场景仍然是“伪多模态”的技术应用状态,导致一些场景体验仍然不能“尽如人意”。现在的多模态技术的结合多为“松耦合”状态,各个模态可以一起工作,但耦合之下还不够十分紧密。也就是现在更多实现的是两种模态信息的转化和融合。而一旦多种模态数据增加,耦合也会增多,冲突也就会增加,产生各种噪声。比如,对于聊天机器人,如何在回复的声音、文本中增加情感特征,就是一件非常困难的事情。因此,我们遇到的一批智能机器人都很容易是冷冰冰的客服腔调,以致于我们确实不好识别对方是真人还是机器人多模态技术主要还是采用已标注的多模态数据来生成深度学习模型,这导致这些模型在真实场景下的泛化能力受到很大限制。现有的多模态技术更多要与知识图谱结合,融入专家、常识等知识,利用数据和知识的联合来让多模态技术建立其“智能”的作用。此外,正如一位专家指出的,当前的多模态技术还是属于狭隘的单任务学习,整个训练和测试的过程都是在封闭和静态的环境下进行,这就和真实世界中开放动态的应用场景存在一定的差异性。这距离人类在真实场景中的泛化的多模态感知相距甚远。未来为提高多模态的泛化感知能力,可以利用元学习的方式来让模型自己学会如何认知新的多模态知识,实现适用于开放动态场景并具备终生学习能力的多模态模型。而在推动AI的推理能力上,在多模态模型训练的过程中,可以引入自监督、自学习的推理性任务,“强迫”多模态模型进行推理和思考,这也能在一定程度上让机器去慢慢学会推理。通过多模态学习技术实现AI的推理,看起来难度极大,这一假设还需要未来更多实验和验证。总的来说,多模态技术已经在试图“复制”人类在日常生活中的各类场景,尽可能把人类的感知信息进行分析处理和整合,并实现更全面综合的理解,也能结合“数据”和“知识”给出相应的回应。但这距离真正的人类级别的智能还有质的差别。当然,人们对多模态技术的发展前景仍然看好,相比于只侧重单一模态的技术,多模态技术所构建的智能应用场景将更多样化,也与我们普通人期待的智能生活更近一些。更何况,多模态技术仍处在“襁褓状态”,我们应该留给它足够长的成长时间,等待美好发生。
  • [应用开发] mdc300开发yolo3模型目标检测数据后处理
    【操作步骤&问题现象】 我试图修改dto_perception的示例来实现在mdc300上的YOLOv3目标检测,但是对于数据的后处理有一些问题原先的demo是使用ssd模型,我在代码中看到 使用AINeuralNetworkBuffer保存了outputDataVec_【】的数据,然后地址解码数据对于YOLO3输出的三个S ∗ S ∗ 255∗1 网络,怎么处理AINeuralNetworkBuffer打平了的数据呢
  • [其他] yolo1
    由图可见,其进行了二十多次卷积还有四次最大池化,其中3x3卷积用于提取特征,1x1卷积用于压缩特征,最后将图像压缩到7x7xfilter的大小,相当于将整个图像划分为7x7的网格,每个网格负责自己这一块区域的目标检测。整个网络最后利用全连接层使其结果的size为(7x7x30),其中7x7代表的是7x7的网格,30前20个代表的是预测的种类,后10代表两个预测框及其置信度(5x2)。网络部分代码如下:# relu的改进版 def leak_relu(self,x, alpha=0.1): return tf.maximum(alpha * x, x) # 建立网络部分 def _build_net(self): x = tf.placeholder(tf.float32, [None, 448, 448, 3]) with tf.variable_scope('yolo'): # _conv_layer(self, x, num_filters, filter_size, stride,scope) with tf.variable_scope('conv_2'): # (448,448,3)->(224,224,64) net = self._conv_layer(x, 64, 7, 2,'conv_2') # (224,224,64)->(112,112,64) net = self._maxpool_layer(net, 2, 2) with tf.variable_scope('conv_4'): # (112,112,64)->(112,112,192) net = self._conv_layer(net, 192, 3, 1,'conv_4') # (112,112,192)->(56,56,192) net = self._maxpool_layer(net, 2, 2) with tf.variable_scope('conv_6'): # (56,56,128) net = self._conv_layer(net, 128, 1, 1,'conv_6') with tf.variable_scope('conv_7'): # (56,56,256) net = self._conv_layer(net, 256, 3, 1,'conv_7') with tf.variable_scope('conv_8'): # (56,56,256) net = self._conv_layer(net, 256, 1, 1,'conv_8') with tf.variable_scope('conv_9'): # (56,56,512) net = self._conv_layer(net, 512, 3, 1,'conv_9') # (28,28,512) net = self._maxpool_layer(net, 2, 2) with tf.variable_scope('conv_11'): net = self._conv_layer(net, 256, 1, 1,'conv_11') with tf.variable_scope('conv_12'): net = self._conv_layer(net, 512, 3, 1,'conv_12') with tf.variable_scope('conv_13'): net = self._conv_layer(net, 256, 1, 1,'conv_13') with tf.variable_scope('conv_14'): net = self._conv_layer(net, 512, 3, 1,'conv_14') with tf.variable_scope('conv_15'): net = self._conv_layer(net, 256, 1, 1,'conv_15') with tf.variable_scope('conv_16'): net = self._conv_layer(net, 512, 3, 1,'conv_16') with tf.variable_scope('conv_17'): net = self._conv_layer(net, 256, 1, 1,'conv_17') with tf.variable_scope('conv_18'): net = self._conv_layer(net, 512, 3, 1,'conv_18') with tf.variable_scope('conv_19'): net = self._conv_layer(net, 512, 1, 1,'conv_19') with tf.variable_scope('conv_20'): net = self._conv_layer(net, 1024, 3, 1,'conv_20') # (14,14,512) net = self._maxpool_layer(net, 2, 2) with tf.variable_scope('conv_22'): net = self._conv_layer(net, 512, 1, 1,'conv_22') with tf.variable_scope('conv_23'): net = self._conv_layer(net, 1024, 3, 1,'conv_23') with tf.variable_scope('conv_24'): net = self._conv_layer(net, 512, 1, 1,'conv_24') with tf.variable_scope('conv_25'): net = self._conv_layer(net, 1024, 3, 1,'conv_25') with tf.variable_scope('conv_26'): net = self._conv_layer(net, 1024, 3, 1,'conv_26') with tf.variable_scope('conv_28'): # (7,7,1024) net = self._conv_layer(net, 1024, 3, 2,'conv_28') with tf.variable_scope('conv_29'): net = self._conv_layer(net, 1024, 3, 1,'conv_29') with tf.variable_scope('conv_30'): net = self._conv_layer(net, 1024, 3, 1,'conv_30') net = self._flatten(net) # (7x7x512,512) with tf.variable_scope('fc_33'): net = self._fc_layer(net, 512, activation=self.leak_relu,scope='fc_33') with tf.variable_scope('fc_34'): net = self._fc_layer(net, 4096, activation=self.leak_relu,scope='fc_34') with tf.variable_scope('fc_36'): net = self._fc_layer(net, 7*7*30,scope='fc_36') # 其返回了placeholder_x和(7,7,30)net return net,x # 生成卷积层 def _conv_layer(self, x, num_filters, filter_size, stride,scope): # 生成卷积层的weights in_channels = x.get_shape().as_list()[-1] weight = tf.Variable(tf.truncated_normal([filter_size, filter_size, in_channels, num_filters], stddev=0.1),name='weights') # 生成卷积层的bias bias = tf.Variable(tf.zeros([num_filters,]),name='biases') # 计算要padding的量, pad_size = filter_size // 2 pad_mat = np.array([[0, 0], [pad_size, pad_size], [pad_size, pad_size], [0, 0]]) x_pad = tf.pad(x, pad_mat) # 卷积 conv = tf.nn.conv2d(x_pad, weight, strides=[1, stride, stride, 1], padding="VALID",name=scope) # 经过优化后的relu output = self.leak_relu(tf.nn.bias_add(conv, bias)) return output def _fc_layer(self, x, num_out, activation=None,scope=None): # 全连接层 num_in = x.get_shape().as_list()[-1] weight = tf.Variable(tf.truncated_normal([num_in, num_out], stddev=0.1),name='weights') bias = tf.Variable(tf.zeros([num_out,]),name='biases') output = tf.nn.xw_plus_b(x, weight, bias,name=scope) if activation: output = activation(output) return output def _maxpool_layer(self, x, pool_size, stride): # 最大池化 output = tf.nn.max_pool(x, [1, pool_size, pool_size, 1], strides=[1, stride, stride, 1], padding="SAME") return output def _flatten(self, x): """flatten the x""" tran_x = tf.transpose(x, [0, 3, 1, 2]) # channle first mode nums = np.product(x.get_shape().as_list()[1:]) return tf.reshape(tran_x, [-1, nums])  预测结果如下:可见预测结果较差。
  • [其他] 精选目标检测4——yolo3的loss组成详解
    学习前言 只会预测是不够的,对于只有会了训练才能训练出我们自己的模型! 本次教程是基于github中的https://github.com/qqwweee/keras-yolo3。 详解的不是代码,而是训练思路,主要讲的是yolo3需要被减少的loss到底是什么。 当然配合代码观看肯定更容易看懂。 计算loss所需参数 在计算loss的时候,实际上是y\_pre和y\_true之间的对比: y\_pre就是一幅图像经过网络之后的输出,内部含有三个特征层的内容; y\_true就是一个真实图像中,将它的真实框的位置以及框内物体的种类,转化成yolo3网络输出后的格式的值。 实际上y\_pre和y\_true内容的shape都是 (batch\_size,13,13,3,85) (batch\_size,26,26,3,85) (batch\_size,52,52,3,85) 1、y\_pre y\_pre就是一幅图像图像经过网络之后的输出,内部含有三个特征层的内容; 如下是一副图像在model里经过的各种层: ``` def yolo_body(inputs, num_anchors, num_classes): ```   对于yolo3的模型来说,其最后输出的内容就是三个特征层的内容,三个特征层分别对应着图片被分为不同size的网格后,每个网格点上三个先验框对应的位置、置信度及其种类。 对于输出的y1、y2、y3而言,\[…, : 2\]指的是相对于每个网格点的偏移量,\[…, 2: 4\]指的是宽和高,\[…, 4: 5\]指的是该框的置信度,\[…, 5: \]指的是每个种类的预测概率。 现在的y\_pre还是没有解码的,解码了之后才是真实图像上的情况,解码过程比较简单。如果不懂的可以看我另一篇博文睿智的目标检测7——yolo3详解及其预测代码复现 ``` def yolo_head(feats, anchors, num_classes, input_shape, calc_loss=False): ```  2、y\_true y\_true就是一个真实图像中,将它的真实框的位置以及框内物体的种类,转化成yolo3网络输出后的格式的值。 在yolo3中,其使用了一个专门的函数用于处理读取进来的图片的框的真实情况。 ``` def preprocess_true_boxes(true_boxes, input_shape, anchors, num_classes): ``` 其输入为: ``` true_boxes:shape为(m, T, 5)代表m张图T个框的x_min、y_min、x_max、y_max、class_id。 ``` 其实对真实框的处理是将真实框转化成图片中相对网格的xyhw,步骤如下: 1、取框的真实值,获取其框的中心及其宽高,除去input\_shape变成比例的模式。 2、建立全为0的y\_true,y\_true是一个列表,包含三个特征层,shape分别为(m,13,13,3,85),(m,26,26,3,85),(m,52,52,3,85)。 3、对每一张图片处理,将每一张图片中的真实框的wh和先验框的wh对比,计算IOU值,选取其中IOU最高的一个,得到其所属特征层及其网格点的位置,在对应的y\_true中将内容进行保存。 ``` for t, n in enumerate(best_anchor): ``` 对于最后输出的y\_true而言,只有每个图里每个框最对应的位置有数据,其它的地方都为0。 preprocess\_true\_boxes全部的代码如下: ``` def preprocess_true_boxes(true_boxes, input_shape, anchors, num_classes): ``` loss的计算过程 在得到了y\_pre和y\_true后怎么对比呢?不是简单的减一下就可以的呢。 1、利用y\_true取出该特征层中真实存在目标的点的位置(m,13,13,3,1)及其对应的种类(m,13,13,3,80)。 2、将yolo\_outputs的特征层输出进行处理,得到reshape后的预测值y\_pre,shape分别为(m,13,13,3,85),(m,26,26,3,85),(m,52,52,3,85)。还有解码后的xy,wh。 3、获取真实框编码后的值,后面用于计算loss 4、对于每一幅图,计算其中所有真实框与预测框的IOU,取出每个网络点中IOU最大的先验框,如果这个最大的IOU都小于ignore\_thresh,意味着这个网络点内不存在目标,可以被忽略。 5、计算xy和wh上的loss,其计算的是实际上存在目标的,利用第三步真实框编码后的的结果和未处理的预测结果进行对比得到loss。 6、计算置信度的loss,其有两部分构成,第一部分是实际上存在目标的,预测结果中置信度的值与1对比;第二部分是实际上不存在目标的,在第四步中得到其IOU还较大的预测结果中的值与0对比。 7、计算预测种类的loss,其计算的是实际上存在目标的,预测类与真实类的差距。 其实际上计算的总的loss是三个loss的和,这三个loss分别是:     实际存在的框,编码后的结果与预测值的差距。     实际存在的框,预测结果中置信度的值与1对比;实际不存在的框,在上述步骤中,第四步得到其IOU还较大的预测结果中的值与0对比。     实际存在的框,种类预测结果与实际结果的对比。  作者:Bubbliiing 这样就可以计算loss啦,还是很复杂的!不过还是可以理解的!作者太强啦
  • [其他] 新的AI技术发展趋势--多模态学习技术
    新的AI技术发展趋势有哪些?多模态学习技术一定是其中之一。最近,刚刚宣布“自立门户”的微软AI明星产品小冰改名为“红棉小冰”。殊不知2014年诞生的这一个AI对话机器人已经在5年时间里更新到了第七代了,据称能力上正在“无限接近人类”。现在的小冰,不仅是那个会作诗的机器人了,她还会唱歌作曲、阅读朗诵、撰写新闻,甚至去年还办了一个虚拟7位画家的个人画展。多模态识别技术正是小冰越来越像人一样沟通表达的关键之一。多模态技术同样也在视频网站、电商物流、自动驾驶等领域得到广泛。像爱奇艺推出的“只看TA”功能,优酷视频正在使用的视频帧、人脸帧的图向量检索,都离不开多模态识别技术的支持。而像京东淘宝等电商平台的“拍照购”、“拍立淘”的搜索技术背后也都是在计算机视觉技术下,使用了图像、文本和高层语义属性等多模态下的信息融合,才实现高精度的“以图搜图”功能。百度提出的“多模态深度语义理解”,则让AI实现从“看清听清”到“看懂听懂”的进化。可以说,人工智能在通向人的智能的道路上,多模态学习就是一个绕不开的发展方向。因为人类本身就是一个多模态学习的典范。现在,多模态学习技术正在带来众多全新的应用场景。关注AI技术和应用发展趋势的你,想必也想了解下多模态学习的来龙去脉,以及在这些新应用场景中的技术现状与问题。而这些问题也是本文重点探讨的内容。“多模态学习”,正式认识下模态(Modality),虽然不是我们的日常用语,但却十分容易理解。我们每一天都会接触到各种不同来源和形式的信息。正如我们有视觉、听觉、嗅觉和触觉等,那么我们接触的信息就有视频、图像、文字、语音、味道、软硬度等,这每一种信息的形式就可以称作一种模态。模态的范围要比我们的感知能力更宽泛。除了视觉、听觉获得的模态信息,我们也可以利用传感器获得诸如雷达、红外线等不同感应数据的模态信息。此外,模态的类型定义也可以非常宽泛,比如我们可以把两种不同的语言当做是两种模态,把不同结构下采集的数据,也可以当做两种模态。比如,仅仅一个视频内容数据,就是一个高维度、多模态的数据信息,其中包含了标题、简介、评论、字幕等文本信息,也有视频帧的图像、声音,以及连贯动作视频片段的视觉、声音信息。多模态学习,从上世纪70年代就已经起步,几经发展,现在正进入到机器学习特别是深度学习的阶段。通常称为多模态机器学习(Multi-Modal Machine Learning ,MMML),试图通过机器学习的方法实现对多源模态信息进行分析和理解。当前主要热门的研究方向自然是对图像、视频、音频、语义之间的多模态学习。当前,多模态学习主要研究方向有多模态表示学习、模态间映射,多模态对齐、融合、协同学习等。多模态表示学习,研究如何将多个模态数据所蕴含的语义信息数值化为实值向量,通俗理解就是对多个模态的数据进行相关性编码,让不同模态建立起映射关系。按多模态表示共享的方式,主要分为公共表示学习和特异性表示学习,后者由于是分别学习不同模态的特征,可以应用于诸如零次学习、模态间映射、跨模态检索等任务中。模态间映射,研究如何将某一特定模态数据中的信息映射至另一模态。例如,给定一幅图像,通过机器学习得到这副图像的描述,或者给定一段文字,生成一幅匹配的图像。类似于我们学习中遇到的“看图说话”和“以题作画”的问题。模态间映射早已可以应用于语音合成、图像视频描述以及跨模态检索等应用中。此外,多模态对齐,主要研究如何识别不同模态之间的部件、元素的对应关系,以促进学习到的多模态表示更加精确,例如将电影画面、口型、语音、字幕的自动对齐;多模态融合,主要致力于不同模态间的模型与特征的整合,以获得更全面的特征,提高模型鲁棒性,并且保证模型在某些模态缺失时仍能有效工作;而多模态协同学习,主要考虑如何从信息丰富模态上学习的知识迁移到信息匮乏的模态,使各个模态的学习互相辅助。典型的方法包括多模态的零样本学习、领域自适应等。近两年,随着机器学习的模型的飞速进展,多模态学习中出现的映射质量问题、对齐的匹配度量以及融合噪声干扰等问题,都在实现很好的优化解决,为多模态的落地应用做好了准备。多模态学习,正在丰富哪些应用场景?通过以上解释可以知道,其实很多我们熟知的AI技术都可以归类到模态学习当中。比如,像机器翻译,通过输入的一种A语言即时翻译为另一种B语言,其实质就是一种模态之间的映射转化。类似的还有唇读识别和语音翻译,也就是分别将唇部视觉和语音信息转换为文本信息。在图像识别中,会应用到一种“图片语义分割”,即尝试给图片的不同像素区域对应到每一种类型标签,实现视觉和词汇的对应。这就是多模态对齐在空间维度的应用。当然,基于多模态数据的丰富表示以及映射、对齐和融合的应用,可以将目前AI的三种主要感知模态——语音交互、机器视觉、传感器智能进行多模态组合,产生全新的应用场景。在语音交互上,“多模态深度语义理解”技术正在为其带来更深度的应用场景。对于前几年的智能音箱,我们都有这样的感触,那就是语音交互只能完成简单的搜索,一旦多聊几句,就发现机器人要么只有万能的“套路”公式,要么就“答非所问”。这一问题的根源就是人工智能无法更好的理解对话者的深层涵义,也没有灵活的应答机制和内容。此外,也更难理解人的语气、情绪这类情感模态信息,当然因为没有视觉感知,更不可能去理解人的表情、动作、姿态等信息。多模态深度语义理解可以极大改善这类语音交互的语义理解难题。比如,其中一个应用场景是智能汽车的数字座舱,正在从原本单一的车载语音识别,实现融合视觉、语音、车内外场景图像的多模态识别的转变。在实际的语音交互中,车载智能助手不仅可以实现语音的识别,也可以通过摄像头识别人的表情神态、动作,比如识别疲劳驾驶、分心、发热等状况,以进行即时的语音提醒。语音交互也可以更加以人类的自然语言进行交互,而不必要使用生硬的指令型语言。而在以机器视觉为主的应用中,多模态学习技术也带来新的应用可能。以电商平台购物为例,用户的一大痛点就是看到一些“心水”的好物或者同款,但不知道名字,通过拍照识别和检索,将为用户提供最便捷的推荐服务。另外,在电商的智能客服,用户也希望能够通过简单对话或者发送图片、视频的方式处理订单问题。在这些场景中,跨模态检索和映射转化技术就得到了深度应用。比如,在商品推荐和信息流广告中,就需要结合海量商品图像与对应的商品语义属性,学习图像语义特征表达,以提高符合用户需求的商品推荐度。而与智能客服进行的多轮对话中,融入视觉到语言的跨模态转换技术,可以自动实现对用户上传的图片或视频进行自动应答。在传感器智能上,多模态识别技术可以应用到大量的物联网设备场景中。通过在大量的智能设备中增加视觉、温度、湿度和光线传感器,来实现多模态的智能交互。比如在智能空调中,加入语音交互、视觉识别指令,结合传感器判断屋内温度和湿度,可以根据屋内人数、位置等因素来实现更精准的控温方案。而现在更多智能大屏应用,也在将机器视觉、语音交互和一些智能传感器引入到智能硬件中,实现对屋内光线的调节、音量、观看者状态(离得是否太近,是否有未成年人)等因素的智能识别和调节。而近期,华为推出的一款针对办公场景的智慧屏幕,可以根据视频会议中的发言对象进行视角跟踪,将摄像头跟踪、焦点人物识别和身份识别结合起来。正如开始列举的,多模态学习技术更主要的应用还是集中在语音和视觉的多模态识别上。在爱奇艺的“只看TA”的功能中,除了人脸识别要区分是真人还是卡通人物,还要对**信息,甚至还有微表情、身体语言等识别,多模态技术成为视频场景中不可缺少的技术支撑。而在未来的聊天机器人或者智能助手上,多模态学习将帮助智能机器人综合处理图像、声音和文字信息,同时可以进行综合模态,甚至包括情感等特征信息的输出与表达。技术尚在中途,未来仍需努力不过,我们仍然需要指出的是,尽管多模态学习技术已经有诸多的应用场景,但其技术实现仍然有诸多不足,也会有一些场景仍然是“伪多模态”的技术应用状态,导致一些场景体验仍然不能“尽如人意”。现在的多模态技术的结合多为“松耦合”状态,各个模态可以一起工作,但耦合之下还不够十分紧密。也就是现在更多实现的是两种模态信息的转化和融合。而一旦多种模态数据增加,耦合也会增多,冲突也就会增加,产生各种噪声。比如,对于聊天机器人,如何在回复的声音、文本中增加情感特征,就是一件非常困难的事情。因此,我们遇到的一批智能机器人都很容易是冷冰冰的客服腔调,以致于我们确实不好识别对方是真人还是机器人多模态技术主要还是采用已标注的多模态数据来生成深度学习模型,这导致这些模型在真实场景下的泛化能力受到很大限制。现有的多模态技术更多要与知识图谱结合,融入专家、常识等知识,利用数据和知识的联合来让多模态技术建立其“智能”的作用。此外,正如一位专家指出的,当前的多模态技术还是属于狭隘的单任务学习,整个训练和测试的过程都是在封闭和静态的环境下进行,这就和真实世界中开放动态的应用场景存在一定的差异性。这距离人类在真实场景中的泛化的多模态感知相距甚远。未来为提高多模态的泛化感知能力,可以利用元学习的方式来让模型自己学会如何认知新的多模态知识,实现适用于开放动态场景并具备终生学习能力的多模态模型。而在推动AI的推理能力上,在多模态模型训练的过程中,可以引入自监督、自学习的推理性任务,“强迫”多模态模型进行推理和思考,这也能在一定程度上让机器去慢慢学会推理。通过多模态学习技术实现AI的推理,看起来难度极大,这一假设还需要未来更多实验和验证。总的来说,多模态技术已经在试图“复制”人类在日常生活中的各类场景,尽可能把人类的感知信息进行分析处理和整合,并实现更全面综合的理解,也能结合“数据”和“知识”给出相应的回应。但这距离真正的人类级别的智能还有质的差别。当然,人们对多模态技术的发展前景仍然看好,相比于只侧重单一模态的技术,多模态技术所构建的智能应用场景将更多样化,也与我们普通人期待的智能生活更近一些。更何况,多模态技术仍处在“襁褓状态”,我们应该留给它足够长的成长时间,等待美好发生。
总条数:301 到第 页
上滑加载中