永利yl23411|官方网站|欢迎您

永利yl23411|官方网站
专注电子产品研发外包服务 基于客户要求的个性化设计
021-51360000

嵌入式人工智能指南

浏览数:46 

在过去的几年里,随着传感器和MCU价格的暴跌和出货量的暴涨,越来越多的公司试图通过将传感器驱动的嵌入式AI添加到他们的产品中来获取优势。


汽车行业正引领着这一趋势--现在平均每辆非自动车都有100个传感器,将数据发送到30-50个微控制器上,这些微控制器每天运行约1m行代码,每辆车每天产生1TB的数据。豪华车的数量可能是其两倍,而自主汽车则会更大幅度地增加传感器数量。


但这不仅仅是汽车的趋势。工业设备正变得越来越 "聪明",旋转式、往复式和其他类型设备的制造商急于增加用于状态监测和预测性维护的功能,而从牙刷、吸尘器到健身监视器等一系列新的消费产品也在增加仪表和 "智能"。


实时、边缘和合理的价位

这些应用的共同点是需要使用实时的、流式的、复杂的传感器数据--加速度计、振动、声音、电信号和生物识别信号--来寻找特定事件和条件的特征,或检测异常,并在设备上本地完成:用符合产品价位的微控制器上的固件中运行的代码。


当着手打造具有这类传感器驱动的智能产品时,有三大挑战需要克服。

当使用带有嵌入式AI的传感器时,同时面临的挑战。

目标和背景的变化


实时检测

限制因素 -- -- 尺寸、重量、功耗、价格。

首先是变异。


现实世界的数据是嘈杂的,充满了变异--这意味着你要找的东西在不同的情况下可能会显得不同。你会面临目标的变异(想在可穿戴设备中检测仰卧起坐?你首先会碰到的是,人们做这些动作的方式都略有不同,有无数的变化)。) 但你也会面临背景的变化(工业设备上的振动传感器也会接收到附近设备传递给结构的振动)。背景变化有时和目标变化一样重要,所以你要收集尽可能多的背景中的例子和反例子。


二是固件中的实时检测。


需要能够在本地完成检测,为用户提供 "实时 "的体验,或者在机器中引发时间敏感的控制响应,这增加了问题的复杂性。


第三是约束--物理的、功率的、经济的。


如果有无限的计算能力,很多问题就会简单很多。但现实世界的产品必须在外形尺寸、重量、功耗和成本约束的组合下交付。


传统工程VS机器学习

要在必要的约束条件下,同时完成所有这些工作,克服变异,在边缘实时完成困难的检测,一点也不容易。但随着现代工具的发展,包括对信号进行机器学习的新选择(如Reality AI),它正变得越来越容易。


当然,用Matlab等工具构建的传统工程模型是创建本地可嵌入检测代码的可行选择。Matlab有一个非常强大的信号处理工具箱,在真正知道自己在做什么的工程师手中,可以用来创建高度复杂但计算紧凑的检测模型。


为什么要使用机器学习?

但机器学习越来越成为人们的首选工具。为什么要这样做呢?


首先,针对信号问题和嵌入式部署进行优化的更复杂的机器学习工具可以从研发周期中缩短几个月甚至几年。它们可以快速获得答案,快速生成可嵌入的代码,让产品开发人员专注于他们的功能,而不是检测的数学。


但更重要的是,它们往往可以完成传统工程模型无法实现的检测。他们通过更有效地利用数据来克服变异来实现这一点。传统的工程方法通常会基于物理模型,使用数据来估计参数,而机器学习方法可以独立于这些模型进行学习。它们学习如何直接从原始数据中检测签名,并使用机器学习的力学(数学)来区分目标和非目标,而不依赖于物理学。


对不同的问题采取不同的方法

同样重要的是,对于这种复杂的数据,有几种不同的机器学习方法。最受媒体关注的是 "深度学习",这是一种使用卷积和/或循环神经网络层来学习如何从大量数据中准确预测的机器学习方法。深度学习在很多用例中都非常成功,但它也有缺点--特别是它需要非常大的数据集来进行训练,而且对于部署来说,它通常需要专门的硬件($$$)。如果你的部署面临成本、规模或功率限制,其他方法,比如我们在Reality AI采取的方法,可能更合适。


构建具有嵌入式AI的产品时,需要记住三件事

如果你想在嵌入式系统中使用机器学习,有三件事你应该了解。


1. 使用丰富的数据,而不是糟糕的数据。最好的机器学习方法在信息丰富的数据下效果最好。确保你捕捉到的是你需要的东西。


2. 这一切都是关于特征。一旦你有了好的数据,你选择采用的特征作为机器学习模型的输入,将远比你使用哪种算法更重要。


3. 做好妥协和权衡的准备。你收集数据的采样率和决策窗口的大小将驱动你选择的控制器对内存和时钟速度的大部分要求。但它们也会影响检测精度。一定要实验一下精度、采样率、窗口大小和计算强度之间的关系。市场上最好的机器学习工具会让你轻松做到这一点。


机器学习:实验室与现实世界

不久前,TechCrunch刊登了一篇报道,报道了卡内基梅隆大学的研究表明,"超频智能手表传感器使用振动来感知手势、物体和位置"。CMU人机交互研究所的这些人显然修改了一个智能手表操作系统,以捕获4千赫的加速度计波形(大多数可穿戴设备的捕获率高达0.1千赫),并发现有了更多的数据,你可以检测更多的东西。 他们可以检测到特定的手势,甚至可以根据人体的振动来判断一个人在触摸或拿着什么样的东西。 (那是电动牙刷、订书机,还是行驶中的汽车方向盘?")


"咄!"

对于我们这些在这个领域工作的人来说,包括卡内基梅隆的人,这并不是什么大的启示。"咄!当然,你可以!"   这是对许多人已经知道和正在研究的东西的一个很好但有限的学术确认。 然而,TechCrunch却以典型的无语方式,把它当成新闻来报道。 显然,该记者并不知道有许多商用产品可以进行手势识别(其中有来自Thalmic Labs的Myo,使用其专有硬件,或者其他大约20个提供智能手表工具的产品)。 看来他也完全不知道市面上有哪些识别非常细微的振动和加速度计的工具箱,可以在嘈杂复杂的环境中检测机器状况(比如我们自己的Reality AI for Industrial Equipment Monitoring),或者检测可穿戴设备中的用户活动和环境(Reality AI for Consumer Products)。


但我的目的并不是要为懒惰的报告而发泄酸楚。   相反,我想用这个案例来说明关于使用机器学习为现实世界做产品的一些关键问题。泛化与过度训练,以及实验室试验(比如那个研究)和现实世界部署之间的区别。


泛化与过度训练(Generalization and Overtraining)

泛化指的是使用机器学习建立的分类器或检测器正确识别原始训练集中未包含的例子的能力。过度训练指的是一个分类器已经学会了以较高的准确率识别它所训练的特定例子,但在它以前没有见过的类似例子上表现不佳。过度训练的分类器已经把训练集学得 "太好 "了--实际上是记住了训练例子的具体内容,却没有能力在野外再次发现类似的例子。在实验室里,当你试图确定某样东西是否可以被检测到时,这是好的,但一个过度训练的分类器在现实世界中永远不会有用。


通常情况下,防止过度训练的最好办法是使用一个训练集,尽可能多地捕捉目标和环境中的预期变化。例如,如果你想检测某类机器何时表现出特定的状况,就在你的训练数据中包含许多该类机器表现出该状况的例子,并在一系列工作条件、负载等情况下表现出该状况。



检测过度训练和预测泛化

可以检测过度训练,估计机器学习分类器或检测器的泛化程度。 在Reality AI,我们常用的诊断方法是K-fold验证,由我们的工具常规生成。


K-fold验证涉及到重复1)随机选择一部分训练数据(比如10%),2)对剩余部分(90%)进行训练,3)使用90%的训练模型对保持数据进行分类,4)记录结果。   一般来说,留出的数据不重叠,因此,例如,对于10%的留出数据,将完成10次独立试验。 搁置可以在各组之间进行平衡,验证可以在多个运行中进行平均,但关键是在每次迭代中,分类器都要在不属于其训练的数据上进行测试。 准确率几乎肯定会低于你将模型应用于训练数据所计算出的结果(这个数据我们称为 "类分离",而不是准确率),但它将更好地预测分类器在野外的表现--至少在你的训练集与真实世界相似的程度上。


与直觉相反的是,类分离较弱的分类器在K-fold中往往能保持更好的表现。 在训练数据上近乎完美的准确率在K倍中急剧下降,而稍弱的分类器却能保持出色的泛化性能,这种情况并不少见。 而这不正是你真正要追求的吗? 在真实世界中对新的观测值有更好的表现?


获得高等级的分离,但K-fold很低?你的模型已经被过度训练,泛化能力很差。   回到画板上。 也许选择一个不那么激进的机器学习模型,或者重新审视你的特征选择。 现实中AI会自动做到这一点。


不过要小心,因为反之则不然。 一个好的K-fold并不能保证一个可部署的分类器。 唯一能确定你在实验室里漏掉了什么的方法就是在野外测试。 不完美? 没问题:收集更多的训练数据,捕捉更多的变化不足的例子。 一个好的开发工具(比如我们的)会让你很容易支持分类器的快速、迭代改进。


实验室实验与真实世界产品的对比

像CMU的这项研究这样的实验室实验不需要太在意通用性--它们的构造是为了说明一个非常具体的观点,证明一个概念,然后继续前进。另一方面,真实世界的产品必须在各种不可预见的情况下执行有用的功能。对于现实世界产品中使用的机器学习分类器来说,泛化能力至关重要。


但这不是唯一的事情。部署方面的考虑也很重要。它可以在云中运行,还是注定要在处理器、内存和/或功率受限的环境中运行?致CMU的人--祝愿超频智能手表的电池续航能力能够达到可接受的水平!)。该解决方案的计算密集度如何,能否在目标环境中以可用的内存和处理周期运行? 可以接受的响应时间或延迟是多少?这些问题必须考虑到产品设计中,以及支持该产品的机器学习模型的选择中。


Reality AI等工具可以提供帮助。研发工程师使用Reality AI工具为现实世界的产品(包括可穿戴设备和机器)创建基于机器学习的信号分类器和检测器,并可以探索采样率、计算强度和精度之间的联系。他们可以训练新的模型,并运行k-fold诊断(包括其他),以防范过度训练和可预测性的泛化。 而当他们完成后,他们可以部署到云端,或者导出代码,为他们特定的嵌入式环境进行编译。


创建真实世界产品的研发工程师并不奢望有受控的环境--过度训练会导致产品失败。实验室实验不面对这个现实。TechCrunch记者也没有。

如何利用机器学习取得成功

在Reality AI,我们看到很多机器学习项目都没有取得成果,或者处于脱轨的边缘。通常情况下,我们的工具和结构化的方法可以帮助我们,但有时却不能。


以下是机器学习成功的3个方法。


第1条:获取地面真相。

机器学习不是魔杖,也不是靠心灵感应来工作。   算法需要数据和例子来说明它正在试图检测的东西,以及它不试图检测的东西的例子,这样它才能分辨出区别。   这对于 "监督学习 "算法尤其如此,算法必须在足够数量的例子上进行训练,才能产生结果。 但它也适用于 "无监督学习 "算法,这种算法试图在不被提前告知的情况下发现数据中的隐藏关系,也是如此。 如果数据中不存在感兴趣的关系,任何算法都不会发现它们。


第二条:对数据进行策划。

数据应该是干净的、经过精心策划的。 意思是说,要想得到最好的结果,必须对数据的质量有信心。在监督学习的情况下,训练数据中的错误分类尤其具有破坏性--一些算法(比如我们的算法)可以补偿训练数据中偶尔出现的错误分类,但普遍存在的问题很难克服。


第三条:不要过度训练。

过度训练是指机器学习模型可以非常准确地预测训练实例,但却不能泛化到新的数据中,导致现场表现不佳。通常情况下,这是由于数据太少,或者数据太过单一(即不能真实反映部署中会出现的自然变化和混杂因素),但也可能是由于模型调优不当造成的。


过度训练尤其有害,因为它会导致错误的乐观和过早的部署,导致一个明显的失败,而这是可以轻易避免的。在Reality AI,我们的AI工程师会监督和检查客户的模型配置,以防止这种不必要的陷阱。


举个例子。 AI在机器健康和预防性维护方面的应用


(为了保护没有经验的人,名称和细节都已更改。)


例如,我们最近有一个客户试图为一个制冷剂压缩机建立一个机器健康监测系统。 这些压缩机被安装在一个极少发生泄漏的系统中,他们试图提前检测出管路中的制冷剂是否已经下降到了使压缩机处于危险的程度--在它造成损坏、过热或通过其他机制关闭之前。 他们试图通过振动数据来实现这一目标,使用一个安装在设备上的包含多轴加速度传感器的小型设备。


理想情况下,该客户会在已知条件下用同一个加速度计收集各种数据:包括压缩机在一系列正常负载条件下运行的许多例子,以及压缩机在类似的各种负载下在不利的低制冷剂条件下运行的许多例子。然后,他们就可以放心地使用我们的算法和工具,这些数据包含了相关运行状态的广泛代表性,包括随着负荷和不可控环境因素变化而出现的正常变化。它还将包含一系列不同的背景噪声和足够的样本,从而使传感器和测量噪声也得到很好的体现。


但他们所拥有的只是在实验室中收集到的正常压缩机的10秒数据和低制冷剂的10秒数据。 这可能足以让工程师开始了解这两种状态的差异--而在实验室工作的人类工程师可能会利用他或她关于现场条件的领域知识开始推断如何在一般情况下检测这些差异。 但机器学习算法只知道它看到的东西。   它会在训练实例之间进行完美的分离,显示出100%的分类准确率,但这个结果永远不会推广到现实世界。为了考虑所有可能的操作变化,最可靠的方法是在数据中包含正常和不正常的全部条件的例子,这样算法就可以通过例子学习,并将自己调整到最稳健的决策标准。


现实中的人工智能工具通过使用各种方法进行特征发现和模型选择来自动做到这一点。为了帮助检测和避免过度训练,我们的工具还用 "K-fold validation "来测试模型,这个过程会反复进行再训练,但会保留一部分训练数据进行测试。 这就模拟了模型在现场的表现,当它试图在新的观测值上进行操作时,它并没有训练过。 K-fold准确率几乎永远不会像训练分离准确率那样高,但它是可能的真实世界性能的更好指标--至少在训练数据具有代表性的程度上是如此。

嵌入式软件的机器学习并不像你想象的那么难。

机器学习很难。在处理周期、内存和功率都很紧缺的嵌入式环境中编程真的很难。将机器学习部署到嵌入式目标上,嗯......除了最简单的场景外,这几乎是不可能的......直到现在。


新的现代工具,包括我们来自Reality AI的工具,正在使在嵌入式解决方案中使用高度复杂的机器学习模型成为可能,这是前所未有的。但也有一些重要的考虑因素。


机器学习模块是否经过彻底的测试和验证?

对于有经验的嵌入式工程师来说,毋庸置疑,将任何代码模块提交到嵌入式系统产品中的决定必须是谨慎而慎重的。推送到产品中的固件必须是稳固的,可靠的。通常情况下,如果更新是可行的,那么产品在更新之间会有很长的寿命。而且希望它们能够开箱即用。在基于机器学习的分类器或检测器模块的情况下,通常的验证问题适用,但我们在其他地方谈到的注意事项适用于黑桃。特别是,系统是否已经被训练和测试 足够大的各种真实世界的数据 给予信心,它将保持, 无监督的野生。


错误结果的风险和权衡是什么?如果你知道机器学习模型的结果是有用的,但并不完美,是否可以教育客户在已知的限制内工作?用例的安全性是否至关重要,如果是,有哪些故障安全备份?


测试和验证在一个易于使用的沙盒环境中完成会更好。 例如,我们的工具可以让用户在分类器离开安全的云端之前,就可以对任意数量的数据进行实验、再训练和测试。我们甚至还支持通过云端API进行 "实时 "测试,因此客户在投入资源将分类器或检测器模块推送到固件和客户设备之前,就可以放心地对其进行测试和鉴定。


它会转化为您的嵌入式硬件吗?

处理速度、内存、能源使用、物理尺寸、成本、部署时间:所有这些都是嵌入式处理系统设计中至关重要的平衡要素。部署分类器和执行操作所需的资源--通常是在关键的实时延迟限制内--将决定你的设计成败。像深度学习这样的机器学习方法是非常强大的,但只有当你的设计中有空间、功率和预算来支持其相当密集的要求时才会如此。其他方法可以在执行时简化为标准信号处理或线性方程类型的操作序列,像我们的方法,可能不太通用,但可以舒适地在廉价的微控制器上实时运行。


不要忘记数学:现在在大型桌面或云端系统上用高精度、浮点工具开发检测器和分类器是很容易和自然的。确保动态范围和精度足以在,低位深度、浮点平台上重现类似的性能,也会对可嵌入算法产生显著的限制。


重要的是要知道需求是什么,因为把昂贵的研发工作花在一个不可能在目标系统中部署的项目上是没有意义的。


是否有一个早期反馈机制?

你的探测器看起来足够好,可以发布,但它是否完美?迭代是完善AI分类器和探测器的关键。设计者能不能接触到野外的真实情况?能否与一个或多个友好客户建立一个试点,既能让你在真实环境中对系统进行量化验证,更好的是,能获得可能导致问题的数据和信号,以便将其纳入未来的训练集?记住,大多数机器学习都是数据驱动的。尽管你已经分析了问题,并在实验室里合成了各种各样的测试向量,但你永远不会覆盖所有可能的变化。希望你会发现初切的分类器或检测器是稳健的,并且能完成它的工作。但很少有好的计划能在与敌人的第一次接触中存活下来,拥有哪怕是一两个真实客户的数据,也会很快引入没有人完全计划好的情况、噪音、系统性错误和边缘情况。


你能以多快的速度做出改进反应?

大多数运送带有嵌入式软件的产品的公司都有一个漫长而(故意)繁琐的审查和质量控制过程,以便让新代码引入生产。你不能搞砸了,所以验证、演练和其他流程步骤必然要花费时间和金钱--以确保只有高质量的产品才会被淘汰。当然这与你快速、迭代的产品改进所需要的正好相反。







Baidu
sogou