边缘侧人工智能指南-全-
边缘侧人工智能指南(全)
原文:
zh.annas-archive.org/md5/b5567729023295fc0b835440f5b6af7e译者:飞龙
序言
在 2022 年,GitHub CEO Thomas Dohmke 说:“我认为向云端转移的速度会如此之快,以至于在短短几年内,我预测你的本地计算机上将不再有代码。”¹ 这本书做得非常好,解释了为什么我和许多其他边缘机器学习领域的人认为他大错特错。
我们开始看到许多实际应用的出现,如高质量语音识别、防火预防和智能家居控制,这些应用仅有可能是因为现在本地设备能够运行先进的机器学习算法。Jenny 和 Dan 撰写了一本精彩的书,不仅解释了为什么将智能添加到边缘应用程序对解决重要问题至关重要,还引导读者逐步设计、实施和测试这类应用程序所需的步骤。
当你第一次接触边缘机器学习项目时,可能会感到相当吓人。这个领域涉及大量行话,变化迅速,并需要来自传统上未能很好整合的嵌入式系统和人工智能等领域的知识。作者们取得的成就是对你在应用上有效工作所需了解的一切的温和而彻底的介绍。由于他们强调来自真实世界的例子和使用简单英语而非数学或代码来解释复杂主题,这使得这本书易于推荐给产品经理、高管、设计师以及工程师。
他们成功地将通过经验获得的许多艰难知识浓缩为将为任何从事这类应用的团队提供重要起步的教训。
他们还设法探讨超出如何构建边缘机器学习应用的实际关注点,并将帮助你理解如何避免你的工作造成伤害。围绕人工智能的伦理问题可能看起来令人不知所措,但作者们成功地将其分解为你可以作为项目规划和测试过程的一部分简单应用的问题。这将帮助项目中的所有利益相关者合作,并希望能避免让计算机在我们生活中拥有更多决策权可能涉及的许多潜在危险。
我已经在边缘机器学习应用上工作了十多年,首先在一家初创公司,然后在谷歌担任技术领导,现在又成为另一家初创公司的创始人,我将要求所有加入我们团队的人阅读这本书。如果你对这一领域有任何兴趣,无论是作为程序员、设计师、经理还是只是关心这个新技术的人,我强烈推荐这本书。我保证阅读它将使你了解许多迷人的想法,并帮助你构建下一代智能设备。
Pete Warden,Useful Sensors Inc. 的首席执行官,TensorFlow Lite for Microcontrollers 的创造者。
¹ 来自GitHub 的 Twitter 账号。
前言
在过去的几年里,一个不断增长的工程师和研究人员社区悄悄地改写了计算机与物理世界互动的规则。结果是一种被称为“边缘人工智能”的技术,它承诺颠覆一个世纪的计算机历史,并触及每个人的生活。
借助一个微小的软件更新,边缘人工智能技术可以赋予廉价、节能的处理器——已经存在于从洗碗机到恒温器的各种设备中——感知和理解世界的能力。我们可以赋予日常物品自己的智能,不再依赖于数据饥渴的集中服务器。下一代工具使得这种魔法变得触手可及,从高中学生到保护研究人员皆可如此。
已经有很多边缘人工智能产品在世界上推出。以下是本书将介绍的一些产品:
-
智能设备通过安装在电力塔上,预测电路故障可能发生的时机,帮助预防由电力传输引起的森林火灾
-
戴在身上的带子能够通过警告来确保消防员在热应激和过度劳累时不会受到威胁
-
提供无需互联网连接的技术的语音用户界面
-
智能项圈能够监测野生大象的活动,帮助研究人员了解它们的行为并保护它们免受冲突的影响
-
野生动物摄像机能够识别特定的动物物种,并帮助科学家了解它们的行为
边缘人工智能技术仍然是新鲜的,这些现有的应用程序只是其可能性的一瞥。随着更多人学习如何使用边缘人工智能,他们将创建解决人类活动各个方面问题的应用程序。
本书的目标是赋予您成为其中一员的能力。 我们希望帮助您基于自己独特的视角创建成功的边缘人工智能产品。
关于本书
本书旨在为工程师、科学家、产品经理和决策者提供指导,他们将推动这场革命。它是对整个领域的高级指南,提供了解决使用边缘人工智能解决现实问题的工作流程和框架。
除其他事项外,我们希望教会您:
-
各种边缘人工智能技术固有的机会、限制和风险
-
使用人工智能和嵌入式机器学习分析问题和设计解决方案的框架
-
一个端到端的实际工作流程,用于成功开发边缘人工智能应用程序
在书的第一部分,初步章节将介绍和讨论关键概念,帮助您了解全局局势。接下来的几章将带您完成实际的流程,帮助您设计和实施自己的应用程序。
在本书的第二部分中,从第十一章开始,我们将通过三个端到端的实例演示如何将您的知识应用于解决科学、工业和消费项目中的实际问题。
到本书结束时,你将自信地通过边缘人工智能的视角看待世界,并拥有一套可靠的工具,可以帮助你构建有效的解决方案。
注意
本书涵盖了许多主题!如果你想了解我们包含的所有内容,请快速查看目录。
期望什么
本书不是一本编程书籍或特定工具的教程,所以不要期望有大量逐行代码解释或使用特定软件的逐步指南。相反,你将学习如何应用通用框架来解决问题,使用最适合工作的工具。
话虽如此,这是一个极大受益于具体、互动示例的主题,可以进行探索、定制和构建。在本书的过程中,我们将提供各种你可以探索的工件——从 Git 仓库到免费在线数据集和示例训练管道。
其中许多内容将托管在Edge Impulse,这是一个用于构建边缘人工智能应用程序的工程工具。¹ 它基于开源技术和标准最佳实践构建,因此即使在不同平台上进行自己的工作,你也能理解这些原则。本书的作者们都是 Edge Impulse 的忠实粉丝——但也许有些偏见,因为他们是建立它的团队的一部分!
注意
为了保证可移植性,机器学习管道的所有工件都可以在 Edge Impulse 中以开放格式导出,包括数据集、机器学习模型以及任何信号处理代码的 C++实现。
你需要已经了解的内容
本书讨论的是在边缘设备上运行的软件构建,因此熟悉嵌入式开发的高级概念将是有帮助的。这可能涉及到资源受限设备,如微控制器或数字信号处理器(DSP),或通用设备,如嵌入式 Linux 计算机。
话虽如此,如果你刚开始接触嵌入式软件,你应该没有困难跟上!我们将保持简单,并在需要时引入新的主题。
此外,并不假设任何特定的知识。由于本书的目标是为整个工程领域提供一个实用的路线图,我们将以高层次涵盖许多主题。如果你对我们提到的任何内容感兴趣——从机器学习的基础知识到机器学习应用设计的基本要素——我们将提供大量我们自己学习中发现有用的资源。
负责、道德和有效的人工智能
构建任何类型的应用程序的最重要部分是确保它在现实世界中正常工作。不幸的是,人工智能应用程序特别容易出现一类问题,使它们在表面上看起来运行良好,而实际上它们却在很多时候以非常有害的方式失败。
避免这类问题将是本书的核心主题——如果不是唯一的核心主题。因为现代 AI 开发是一个迭代过程,仅在工作流的最后测试系统是否有效是不够的。相反,您需要在每一个步骤中考虑潜在的陷阱。您必须理解风险所在,批判性地审查中间结果,并做出考虑到利益相关者需求的知情决策。
在本书的过程中,我们将介绍一个强大的框架,帮助您理解、推理、衡量性能,并基于对构建 AI 应用程序可能出现问题的意识做出决策。这将成为我们整个开发过程的基础,并塑造我们设计应用程序的方式。
这一过程始于项目的最初构思阶段。要构建有效的应用程序,理解我们当前的人工智能方法并不适合某些用例至关重要。在许多情况下,造成的风险——无论是物理、财务还是社会的——都超过了部署 AI 的潜在利益。本书将教您如何识别这些风险,并在探索项目可行性时加以考虑。
作为领域专家,我们有责任确保我们创建的技术得到恰当的使用。没有其他人比我们更适合做这项工作,因此我们有责任做好。本书将帮助您做出正确的决策,创建性能优越、避免伤害并造福更广泛世界的应用程序。
进一步资源
一本涵盖从低级实现到高级设计模式的嵌入式 AI 的书将有整整一整个书架大!与其试图把所有内容塞进一卷书中,您正在阅读的书籍将为整个领域提供详细但高层次的路线图。
为了深入研究与您的特定项目相关的细枝末节,《“学习边缘 AI 技能”》推荐了大量进一步的资源。
本书中使用的约定
本书使用以下排版约定:
斜体
指示新术语、URL、电子邮件地址、文件名和文件扩展名。
常宽
用于程序清单,以及段落中引用程序元素,如变量或函数名,数据库,数据类型,环境变量,语句和关键字。
常宽粗体
显示用户应直接输入的命令或其他文本。
常宽斜体
显示应由用户提供值或根据上下文确定值的文本。
提示
此元素表示提示或建议。
注意
此元素表示一般性说明。
警告
此元素表示警告或注意。
使用代码示例
可以下载补充材料(代码示例、练习等)https://github.com/ai-at-the-edge。
如果您有技术问题或使用代码示例时遇到问题,请发送电子邮件至bookquestions@oreilly.com。
本书的目的是帮助您完成工作。一般情况下,如果本书提供示例代码,您可以在您的程序和文档中使用它。除非您复制了代码的大部分内容,否则无需征得我们的许可。例如,编写一个使用本书多个代码片段的程序无需许可。销售或分发奥莱利书籍中的示例则需要许可。通过引用本书回答问题并引用示例代码无需许可。将本书大量示例代码合并到产品文档中则需要许可。
我们感谢,但通常不需要,署名。署名通常包括标题、作者、出版商和 ISBN。例如:“AI at the Edge by Daniel Situnayake and Jenny Plunkett (O’Reilly)。Copyright 2023 Daniel Situnayake and Jenny Plunkett, 978-1-098-12020-7。”
如果您认为您对代码示例的使用超出了公平使用范围或上述许可,请随时与我们联系permissions@oreilly.com。
致谢
没有大量人员的辛勤工作和支持,这本书将无法问世,对此我们深表感激。
我们荣幸地得到了Pete Warden的序言支持,他不仅是一个具有远见卓识的技术专家,功不可没地推动了这一领域的发展,同时也是一位了不起的人类和伟大的朋友。非常感谢你的支持,Pete!
我们深深感谢Wiebke (Toussaint) Hutiri,她在帮助塑造和提供本书中的负责任 AI 内容方面付出了超乎寻常的努力,包括为"负责任设计与 AI 伦理"贡献了一篇出色的引言。你是你领域的明星。
我们对我们不可思议的技术审阅和顾问小组深表感激,他们的智慧和见解对本书产生了巨大影响。他们是:Alex Elium, Aurélien Geron, Carlos Roberto Lacerda, David J. Groom, Elecia White, Fran Baker, Jen Fox, Leonardo Cavagnis, Mat Kelcey, Pete Warden, Vijay Janapa Reddi, 和 Wiebke (Toussaint) Hutiri。特别感谢 Benjamin Cabé允许我们展示他的人工鼻子项目。任何不准确之处均由作者负责。
我们还要感谢 O'Reilly 的出色团队,特别是 Angela Rufino,在整个写作过程中以最大的理解和关怀指导我们。特别感谢 Elizabeth Faerm, Kristen Brown, Mike Loukides, Nicole Taché, 和 Rebecca Novack。
这本书的存在离不开我们在 Edge Impulse 团队的支持,这是一群无比英勇的明星。特别感谢创始人 Zach Shelby 和 Jan Jongboom,他们相信我们对这本书的愿景,支持我们实现它,并创造了一个可以让思想迸发的空间。对全体团队,包括但不限于:Adam Benzion, Alessandro Grande, Alex Elium, Amir Sherman, Arjan Kamphuis, Artie Beavis, Arun Rajasekaran, Ashvin Roharia, Aurelien Lequertier, Carl Ward, Clinton Oduor, David Schwarz, David Tischler, Dimi Tomov, Dmitry Maslov, Emile Bosch, Eoin Jordan, Evan Rust, Fernando Jiménez Moreno, Francesco Varani, Jed Huang, Jim Edson, Jim van der Voort, Jodie Lane, John Pura, Jorge Silva, Joshua Buck, Juliette Okel, Keelin Murphy, Kirtana Moorthy, Louis Moreau, Louise Paul, Maggi Yang, Mat Kelcey, Mateusz Majchrzycki, Mathijs Baaijens, Mihajlo Raljic, Mike Senese, Mikey Beavis, MJ Lee, Nabil Koroghli, Nick Famighetti, Omar Shrit, Othman Mekhannene, Paige Holvik, Raul James, Raul Vergara, RJ Vissers, Ross Lowe, Sally Atkinson, Saniea Akhtar, Sara Olsson, Sergi Mansilla, Shams Mansoor, Shawn Hanscom, Shawn Hymel, Sheena Patel, Tyler Hoyle, Vojislav Milivojevic, William DeLey, Yan Li, Yana Vibe, 和 Zin Kyaw。你们创造了奇迹。
Jenny 感谢她在德克萨斯州的家人和朋友多年来给予的大力支持,还有她的猫蓝基因和比阿特丽斯作为最好的合作伙伴。她特别感谢她的父亲迈克尔·普朗克特,他鼓励她在奥斯汀德克萨斯大学攻读电气工程,并激发了她对新技术终身的好奇心。
Dan 感谢他的家人和朋友在每次大冒险中的支持。他深深感激 Lauren Ward 在我们所有旅程中的爱和伴侣关系。他还感谢 Minicat 给予他平静的猫咪陪伴,并允许在本书中使用她的照片。
¹ Edge Impulse 在学术论文 “Edge Impulse: An MLOps Platform for Tiny Machine Learning”(S. Hymel 等人,2022 年)中有详细描述。
第一章:简介边缘人工智能
欢迎登上我们的列车!在本章中,我们将全面了解边缘人工智能的世界。我们将定义关键术语,了解“边缘人工智能”与其他人工智能的不同之处,并探讨一些最重要的应用案例。本章的目标是回答以下两个重要问题:
-
那么,边缘人工智能究竟是什么?
-
我为什么需要它?
定义关键术语
每个技术领域都有其自己的术语,边缘人工智能也不例外。事实上,术语边缘人工智能就是两个流行术语的结合,融合成一个强大的术语。它经常与其兄弟姐妹嵌入式机器学习和TinyML一同听到。
在我们继续之前,我们最好花点时间来定义这些术语,并理解它们的含义。因为我们在处理复合术语,让我们首先处理最基本的部分。
嵌入式
“嵌入式”是什么?根据您的背景,这可能是我们试图描述的所有术语中最为熟悉的。嵌入式系统是控制各种物理设备电子元件的计算机,从蓝牙耳机到现代汽车的发动机控制单元。嵌入式软件是在这些系统上运行的软件。图 1-1 展示了嵌入式系统的一些应用场景。

图 1-1。嵌入式系统存在于我们世界的每一个角落,包括家庭和工作场所。
嵌入式系统可以是微小且简单的,比如控制数字手表的微控制器,也可以是庞大而复杂的,比如智能电视内部的嵌入式 Linux 计算机。与笔记本电脑或智能手机等通用计算机不同,嵌入式系统通常用于执行一个特定的、专用的任务。
由于它们驱动了我们大部分现代技术,嵌入式系统非常普及。事实上,仅在 2020 年就有超过 280 亿个微控制器出货¹——这只是嵌入式处理器的一种类型。它们存在于我们的家中、车辆、工厂和城市街道。您可能离嵌入式系统只有几英尺远。
嵌入式系统通常反映其部署环境的限制。例如,许多嵌入式系统需要在电池供电下运行,因此它们设计时考虑了能源效率——可能具有有限的内存或极慢的时钟速率。
嵌入式系统编程是航行在这些限制中的艺术,编写软件以执行所需的任务,同时充分利用有限的资源。这可能非常困难。嵌入式系统工程师是现代世界的默默无闻的英雄。如果你碰巧是其中一位,感谢你的辛勤工作!
边缘(以及物联网)
计算机网络的历史是一场巨大的拉锯战。在最初的系统中——房间大小的个人计算机——计算本质上是集中的。有一台机器,那台机器完成所有的工作。
最终,然而,计算机连接到终端设备(如图 1-2 所示),这些设备接管了它们的一些责任。大部分计算是在中央主机中进行的,但一些简单的任务——比如如何在阴极射线管屏幕上渲染字母——是由终端设备的电子部件完成的。

图 1-2. 主机计算机执行大部分计算,而简单的终端设备处理输入,打印输出并呈现基本图形
随着时间的推移,终端设备变得越来越复杂,接管了以前由中央计算机负责的越来越多的功能。拉锯战开始了!一旦个人电脑发明出来,小型计算机甚至可以在不连接到其他机器的情况下完成有用的工作。绳索已经被拉到了相反的极端——从网络中心到边缘。
互联网的增长,以及 Web 应用程序和服务,使得一些真正酷炫的事情成为可能——从流媒体视频到社交网络。所有这些都依赖于计算机连接到逐渐接管越来越多工作的服务器上。在过去的十年中,我们的大部分计算再次变得集中化——这一次在“云”中。当互联网断开连接时,我们现代的计算机并没有太多用处!
但我们用于工作和娱乐的计算机不是我们唯一连接的设备。事实上,据估计,到 2021 年,有 122 亿个各种各样的物品连接到互联网,²创造和消费数据。这个庞大的物体网络被称为物联网(IoT),包括你能想到的一切:工业传感器、智能冰箱、互联网连接的安全摄像头、个人汽车、运输集装箱、健身追踪器和咖啡机。
Tip
第一台物联网设备于 1982 年被创造出来。卡内基梅隆大学的学生们 将一台可口可乐自动售货机连接到 ARPANET——互联网的早期先驱——以便他们能在不离开实验室的情况下检查它是否空了。
所有这些设备都是包含由嵌入式软件工程师编写的软件运行的嵌入式系统。因为它们位于网络边缘,我们也可以称它们为边缘设备。在边缘设备上执行计算称为边缘计算。
边缘不是一个单一的地方;它更像是一个广阔的区域。位于网络边缘的设备可以彼此通信,它们也可以与远程服务器通信。甚至有些服务器就位于网络边缘。图 1-3 展示了这种情况。

图 1-3. 位于网络边缘的设备可以与云、边缘基础设施以及彼此通信;边缘应用通常跨越该地图内的多个位置(例如,数据可能从装有传感器的物联网设备发送到本地边缘服务器进行处理)。
能够位于网络边缘有一些重要好处。首先,那里是所有数据的来源!边缘设备是我们与互联网和物理世界之间的链接。它们可以使用传感器根据周围发生的情况收集数据,无论是跑步者的心率还是冷饮的温度。它们可以在本地基于这些数据做出决策并将其发送到其他位置。边缘设备可以访问其他人无法接触的数据。
移动电话和平板电脑是边缘设备吗?
作为位于网络边缘的便携式计算机,移动电话、平板电脑甚至个人电脑都是边缘设备。移动电话是最早采用边缘 AI 的平台之一:现代移动电话在许多用途上使用它,从语音激活到智能摄影³。
我们稍后再回到边缘设备(因为它们是本书的焦点)。在此之前,让我们继续定义一些术语。
人工智能
哇!这是一个大问题。人工智能(AI)是一个非常伟大的理念,定义起来非常困难。自从人类存在以来,我们就梦想着创造能帮助我们在生存斗争中的智能实体。在现代社会,我们梦想着机器人助手,他们可以协助我们的冒险:超智能的合成思维体将解决我们所有的问题,奇迹般的企业产品将优化我们的业务流程并保证我们迅速晋升。
但要定义 AI,我们必须定义智能——这事实证明特别困难。什么是智能?是指我们能够说话或思考吗?显然不是——只要问问粘菌(参见图 1-4),这是一种没有中枢神经系统的简单生物体,却能解决迷宫问题。

图 1-4。粘菌是单细胞生物,据记录能够通过生物计算过程解迷宫,以寻找食物,如“粘菌通过梯度化学引诱剂一次通过迷宫”(Andrew Adamatzky,arXiv,2011)
由于这不是一本哲学书籍,我们没有时间充分探讨智能的话题。相反,我们想提出一个简单粗暴的定义:
智能意味着在正确的时间知道该做什么。
这可能经不起学术辩论,但这对我们来说没问题。它给了我们一个探索这个主题的工具。以下是一些根据我们的定义需要智能的任务:
-
当动物出现在画面中时拍照
-
当司机即将撞车时刹车
-
当机器发出异常声音时通知操作员
-
用相关信息回答问题
-
创作音乐表演的伴奏
-
当有人想洗手时打开水龙头
每一个问题都涉及一个动作(打开水龙头)和一个前提条件(当有人想洗手时)。在它们自己的背景下,大多数这些问题听起来相当简单——但正如任何使用过机场洗手间的人知道的那样,它们并不总是易于解决。
对大多数人来说,执行大多数这些任务相当容易。我们是高度有能力的生物,具有通用智能。但较小系统具有狭窄智能也能执行这些任务。拿我们的粘菌来说,它可能不明白为什么要解迷宫,但它肯定能做到。
话虽如此,粘菌不太可能也知道什么时候打开水龙头。一般来说,执行一个单一而紧密范围的任务(比如打开水龙头)要比执行完全不同任务集合要容易得多。
创造一种人工通用智能,相当于人类,将非常困难——正如几十年来不成功的尝试所示。但创建一个像粘菌水平的东西可能要容易得多。例如,理论上防止司机撞车是相当简单的任务。如果你能访问他们当前的速度和离墙的距离,你可以用简单的条件逻辑做到:
current_speed = 10 # In meters per second
distance_from_wall = 50 # In meters
seconds_to_stop = 3 # The minimum time in seconds required to stop the car
safety_buffer = 1 # The safety margin in seconds before hitting the brakes
# Calculate how long we’ve got before we hit the wall
seconds_until_crash = distance_from_wall / current_speed
# Make sure we apply the brakes if we’re likely to crash soon
if seconds_until_crash < seconds_to_stop + safety_buffer:
applyBrakes()
显然,这个简化的例子并未考虑很多因素。但稍微复杂一点,基于这种条件逻辑的现代汽车驾驶辅助系统可以被认为是 AI 的营销策略。⁴
这里有两个要点我们想要表达:第一是智能相当难以定义,许多相当简单的问题需要一定的智能才能解决。第二是实施这种智能的程序不一定需要特别复杂。有时候,粘菌就足够了。
人工智能是什么?简单来说,它是一种基于某种输入做出智能决策的人造系统。创建人工智能的一种方式是利用机器学习。
机器学习
机器学习(ML)的核心概念其实很简单。它是一种通过运行数据通过算法来自动发现世界运作模式的方法。
我们经常听到人工智能和机器学习被互换使用,好像它们是同一回事——但实际上并非如此。人工智能并不总是涉及机器学习,机器学习也不总是涉及人工智能。尽管如此,它们可以很好地配合使用!
介绍机器学习的最佳方式是通过一个例子。想象一下,你正在开发一个健身追踪器——这是一个运动员可以佩戴的小手腕带。它包含一个加速度计,告诉你在某一时刻每个轴(x、y 和 z)上发生了多少加速度——如图 1-5 所示。

图 1-5. 以 6.25 赫兹采样的三轴加速度计输出
为了帮助你的运动员,你想要自动记录他们正在做的活动。例如,一个运动员可能周一跑步一个小时,周二游泳一个小时。
由于我们游泳时的动作与跑步时的动作非常不同,你推测可以根据手腕带加速计的输出区分这些活动。为了收集数据,你向十几名运动员提供了原型手腕带,并让他们执行特定活动——游泳、跑步或什么也不做——同时手腕带记录数据(见图 1-6)。
现在你有了一个数据集,你想要尝试确定一些规则,帮助你理解特定运动员是在游泳、跑步还是放松。一种方法是手动分析和检查数据,看看是否有什么显著特征。也许你注意到跑步涉及某个轴上更快的加速度。你可以利用这些信息编写一些条件逻辑,根据该轴的读数确定活动。
手动分析数据可能会很棘手,通常需要对领域(例如运动过程中的人类运动)有专业知识。与手动分析的替代方法可能是使用机器学习。

图 1-6. 三轴加速度计输出,显示与图 1-5 不同的活动;每种活动可以通过加速度在每个轴上随时间变化的模式来表征。
通过机器学习方法,您将所有运动员的数据输入训练算法。当提供加速计数据和运动员当前执行的活动信息时,算法尽力学习两者之间的映射关系。这种映射称为模型。
希望,如果训练成功,您的新机器学习模型可以接受一个全新的、从未见过的输入——来自特定时间窗口的加速计数据样本——并告诉您运动员正在执行的活动。这个过程被称为推断。
理解新输入的能力被称为泛化。在训练期间,模型已经学习了区分跑步和游泳的特征。然后,您可以在您的健身追踪器中使用该模型来理解新鲜的数据,就像您可能会使用我们之前提到的条件逻辑一样。
存在许多不同的机器学习算法,每种都有其自身的优势和缺点——而机器学习并不总是最适合的工具。本章后面我们将讨论机器学习最有帮助的场景。但一个不错的经验法则是,当我们的数据非常复杂时,机器学习真正发挥作用。
边缘人工智能
恭喜,我们终于谈到了我们的第一个复合流行语!边缘人工智能,不出意外地,是边缘设备和人工智能的结合。
正如我们之前讨论过的,边缘设备是提供我们数字和物理世界之间连接的嵌入式系统。它们通常配备传感器,向它们提供周围环境的信息。这使它们可以访问高频率数据的象征性“消防水龙带”。
我们经常被告知数据是我们现代经济的生命线,贯穿我们的基础设施并使组织能够运转。这确实如此,但并非所有数据都是平等的。从传感器获取的数据往往具有非常高的容量,但信息内容相对较低。
想象一下我们在前一节中描述的基于加速计的手腕传感器。加速计能够每秒进行多次读数。每个单独的读数对当前发生的活动告诉我们很少——只有在成千上万次读数的聚合中,我们才能开始理解正在发生的情况。
通常,物联网设备被视为简单的节点,这些节点从传感器收集数据,然后将其传输到中央位置进行处理。这种方法的问题在于,发送如此大量的低价值信息成本极高。连接费用昂贵,而传输数据则消耗大量能量——这对于使用电池供电的物联网设备来说是一个大问题。
由于这个问题,大多数由物联网传感器收集的数据通常被丢弃了。我们收集了大量的传感器数据,但我们无法对其进行任何处理。
边缘 AI 是解决这个问题的方法。与其将数据发送到远处的某个位置进行处理,不如直接在生成数据的设备上进行处理?现在,我们不再依赖于中央服务器,可以在本地做出决策——无需连接。
如果我们仍然希望向上游服务器或云端报告信息,我们可以传输只有重要信息,而不必发送每个传感器读数。这应该会节省大量成本和能量。
有许多不同的方式可以将智能部署到边缘。图 1-7 显示了从云 AI 到完全设备上的智能的连续体。正如我们将在本书后面看到的那样,边缘 AI 可以分布在整个分布式计算架构中——包括一些节点在边缘,其他节点在本地网关或云中。
正如我们所见,人工智能可以意味着许多不同的东西。它可以非常简单:一点人类洞察力编码在一点简单的条件逻辑中。它也可以非常复杂,基于深度学习的最新发展。
边缘 AI 完全相同。在其最基本的层面上,边缘 AI 是关于在网络边缘,靠近数据生成的地方做出一些决策。但它也可以利用一些非常酷的东西。这使我们很好地过渡到下一节!

图 1-7. 云智能和完全设备智能之间的连续体;这六个级别由《边缘智能:利用边缘计算铺设人工智能的最后一英里》(周等人,《IEEE 会议记录》,2019 年)描述。
嵌入式机器学习和微型机器学习
嵌入式 ML 是在嵌入式系统上运行机器学习模型的艺术和科学。微型机器学习,或 TinyML,⁵ 是在最受限制的嵌入式硬件上执行这一概念——如微控制器、数字信号处理器和小型可编程逻辑器件(FPGA)。
当我们谈论嵌入式 ML 时,通常指的是机器学习推断——即根据加速度计数据猜测物理活动等过程。训练部分通常仍然在传统计算机上进行。
嵌入式系统通常具有有限的内存。这对于运行许多类型的机器学习模型提出了挑战,这些模型通常对只读存储器(ROM)(用于存储模型)和 RAM(用于处理推断期间生成的中间结果)都有很高的要求。
它们在计算能力方面也经常受到限制。由于许多类型的机器学习模型具有相当高的计算密集型,这也可能会引发问题。
幸运的是,在过去几年中,优化方面取得了许多进展,使得在一些非常小型、低功耗的嵌入式系统上运行相当大型和复杂的机器学习模型成为可能。在接下来的几章中,我们将学习一些这些技术!
嵌入式机器学习通常与其值得信赖的伴侣数字信号处理一起部署。在我们继续之前,让我们也来定义这个术语。
数字信号处理
在嵌入式世界中,我们经常处理信号的数字表示。例如,加速度计提供了三个轴上加速度的数字值流,数字麦克风则提供了特定时间声音级别的值流。
数字信号处理(DSP)是使用算法来操作这些数据流的实践。当与嵌入式机器学习配对时,我们经常使用 DSP 来在馈送到机器学习模型之前修改信号。有几个原因我们可能想要这样做:
-
清理噪声信号
-
移除由硬件问题引起的尖峰或异常值
-
从信号中提取最重要的信息
-
将数据从时域转换到频率域⁶
DSP 在嵌入式系统中非常常见,以至于嵌入式芯片通常具有常见 DSP 算法的超快硬件实现,以备不时之需。
现在我们对本书中最重要的术语有了扎实的理解。图 1-8 展示了它们在上下文中的关系。

图 1-8。这个图示显示了边缘人工智能中一些最重要的概念,从最一般的概念到最具体的概念。
在下一节中,我们将深入探讨边缘人工智能的主题,并开始分析其成为如此重要技术的原因。
为什么我们需要边缘人工智能?
想象一下,今天早晨你在南加州沙漠中的乔舒亚树国家公园进行了一次越野跑步。你一路上一直听着音乐,通过不间断的手机蜂窝连接进行流媒体传输。在山间特别美丽的地方,你拍下了一张照片并发送给你的伴侣。几分钟后,你收到了他们的回复。
在一个即使是最偏远的地方也有某种形式数据连接的世界中,为什么我们需要边缘人工智能?如果互联网强大的服务器只隔着一段无线电信号,那么这些能够自主做出决策的小型设备有何意义呢?考虑到增加了所有这些复杂性,我们难道不是让生活变得更加困难吗?
正如你可能猜到的那样,答案是否定的!边缘人工智能解决了一些真实存在的问题,这些问题否则会阻碍我们的技术更好地服务于人类。我们用来解释边缘人工智能好处的最喜欢的框架是一个听起来不礼貌的记忆法:BLERP。
要了解边缘人工智能的好处,只需用 BLERP 记住即可
BLERP?边缘人工智能和视觉联盟的创始人 Jeff Bier,创建了这个优秀的工具来表达边缘人工智能的好处。它由五个词组成:
-
带宽
-
延迟
-
经济学
-
可靠性
-
隐私
拥有了 BLERP,任何人都可以轻松记住和解释边缘人工智能的好处。它也很有用,可以作为一个过滤器,帮助决定边缘人工智能是否适合特定应用。
让我们逐字逐句地分析一下。
带宽
物联网设备通常捕获比它们能传输的带宽还要多的数据。这意味着它们捕获的绝大部分传感器数据甚至都没有被使用——它们只是被丢弃了!想象一下,一个智能传感器监控工业机器的振动,以确定它是否正常运行。它可能使用简单的阈值算法来理解机器何时振动过多或过少,然后通过低带宽无线连接传达这些信息。
这听起来已经很有用了。但是如果你能识别数据中的模式,这些模式能够提示机器可能即将故障呢?如果我们有大量带宽,我们可以将传感器数据发送到云端,并进行某种分析,以了解故障是否即将发生。
然而,在许多情况下,没有足够的带宽或能量预算来发送持续的数据流到云端。这意味着我们将被迫丢弃大部分传感器数据,尽管这些数据包含有用的信号。
带宽限制非常普遍。这不仅仅涉及到可用的连接性,还涉及到电力问题。网络通信通常是嵌入式系统执行的能量消耗最大的任务,这意味着电池寿命往往是限制性的因素。一些机器学习模型可能需要相当大的计算量,但它们往往比传输信号消耗的能量要少。
这就是边缘人工智能的用武之地。如果我们能在物联网设备本身上运行数据分析,而不必上传数据,那么如果分析显示机器即将故障,我们可以使用有限的带宽发送通知。这比试图传输所有数据要可行得多。
当然,设备没有任何网络连接也是非常常见的!在这种情况下,边缘人工智能使得许多之前不可能的用例成为现实。我们稍后会详细讨论这一点。
延迟
数据传输需要时间。即使有大量可用带宽,从设备到互联网服务器的往返时间可能需要数十到数百毫秒。在某些情况下,延迟可以达到分钟、小时或天数——想想卫星通信或存储转发消息。
有些应用程序需要更快的响应。例如,由远程服务器控制移动车辆可能是不切实际的。在车辆导航环境中控制车辆需要方向调整和车辆位置之间的持续反馈。在显著的延迟下,方向调整成为一项主要挑战!
边缘人工智能通过完全消除往返时间来解决这个问题。一个很好的例子是自动驾驶汽车。车辆的人工智能系统在车载计算机上运行。这使得它能够几乎即时地对变化的条件作出反应,比如前方的驾驶员突然刹车。
边缘人工智能作为解决延迟问题的有力工具的一个最具说服力的例子是在机器人空间探索中。火星与地球相距遥远,以光速传播的无线电信号需要数分钟才能到达。更糟糕的是,由于行星的排列方式,直接通信通常是不可能的。这使得控制火星探测器非常困难。NASA 通过使用边缘人工智能来解决这个问题——他们的探测器利用复杂的人工智能系统规划任务、导航环境,并在另一个世界的表面搜索生命。如果你有空,甚至可以通过标记数据来帮助未来的火星探测器导航!
经济学
连通性成本很高。连接的产品使用起来更昂贵,它们依赖的基础设施也会给制造商带来成本压力。所需带宽越大,成本就越高。对于部署在需要通过卫星进行远程长距离连接的偏远地区的设备来说,情况尤为严峻。
通过在设备上处理数据,边缘人工智能系统减少或避免了通过网络传输和在云中处理数据的成本。这可以解锁许多以前无法实现的用例。
在某些情况下,唯一有效的“连接”方式是派遣人员执行某些手动任务。例如,保护研究人员经常使用摄像机陷阱监测偏远地区的野生动物。这些设备在检测到运动时拍摄照片并将其存储到 SD 卡中。通过卫星互联网上传每张照片成本太高,因此研究人员必须前往他们的摄像机陷阱收集图像并清空存储空间。
由于传统的摄像机陷阱是由动作触发的,它们拍摄了许多不必要的照片——可能是由于风中的树枝、路过的徒步者和研究者不感兴趣的生物而触发。但现在一些团队正在使用边缘 AI 仅识别他们关心的动物,这样他们可以丢弃其他图像。这意味着他们不必频繁飞往荒无人烟之地更换 SD 卡。
在其他情况下,连接成本可能并不是一个问题。但是,对于依赖服务器端 AI 的产品来说,维护服务器端基础设施的成本可能会使您的商业模式变得复杂化。如果您必须支持一大批需要“联系家里”的设备来做决策,您可能会被迫采用订阅模式。您还必须承诺长时间维护服务器,有可能导致您的客户在您决定停止服务时拥有“砖头”设备的风险。⁷
不要低估经济影响。通过减少长期支持成本,边缘 AI 使得许多原本不可行的用例成为可能。
可靠性
由设备端 AI 控制的系统比依赖云连接的系统潜在更可靠。当您为设备添加无线连接时,您将增加一个庞大且极其复杂的依赖网络,从链路层通信技术到可能运行应用程序的互联网服务器。
这个谜题的许多部分都超出了您的控制范围,因此即使您做出了所有正确的决定,仍然会面临与构成您分布式计算堆栈的技术相关的可靠性风险。
对于某些应用来说,这可能是可以容忍的。如果您正在构建一个响应语音命令的智能音箱,当用户的家庭互联网连接断开时停止识别命令,用户可能会理解。尽管如此,这仍然可能是一种令人沮丧的体验!
但在其他情况下,安全至关重要。想象一个基于 AI 的系统,监视工业机器以确保其在安全参数内操作。如果互联网断开连接时停止工作,可能会危及人类生命。如果 AI 完全基于设备端,则在连接问题发生时仍然能够正常运行,这样会更安全。
可靠性往往是一种妥协,所需的可靠性水平因用例而异。边缘 AI 可以成为改善产品可靠性的强大工具。虽然 AI 本质上复杂,但它代表了一种不同类型的复杂性,其风险在许多情况下更易于管理。
隐私
在过去几年中,许多人不情愿地接受了便利与隐私之间的折衷。理论上来说,如果我们希望我们的技术产品更智能、更有帮助,我们就必须放弃我们的数据。因为智能产品传统上是在远程服务器上做出决策,它们往往会向云端发送大量的传感器数据流。
对于某些应用来说可能是合适的,例如我们可能不担心物联网恒温器将温度数据报告给远程服务器。⁸ 但对于其他应用来说,隐私是一个巨大的问题。例如,许多人可能会犹豫安装一个能连接到互联网的安全摄像头在他们家中。它可能提供一些令人安心的安全性,但是这种交换——让他们最私密空间的实时视频和音频流被广播到互联网上——似乎不值得。即使摄像头的制造商是完全值得信赖的,数据通过安全漏洞暴露的可能性也总是存在。⁹
边缘人工智能提供了一种替代方案。安全摄像头可以利用一些内置智能在主人不在家时识别到入侵者的存在,并以适当的方式通知主人。当数据在嵌入式系统上处理并且从未传输到云端时,用户的隐私得到了保护,滥用的可能性也降低了。
边缘人工智能能够实现隐私,解锁大量令人兴奋的用例。对于安全、工业、儿童保育、教育和医疗应用来说,这是一个特别重要的因素。事实上,由于这些领域涉及到数据安全的严格法规(或客户期望),最好的隐私产品是那些完全避免收集数据的产品。
使用 BLERP
正如我们将在第二章中看到的,BLERP 可以是理解某个问题是否适合边缘人工智能的便捷工具。并不是每个首字母缩略词的每个字都必须有一个强有力的论证:即使只符合一个或两个标准,如果足够有说服力,也可以证明其用例的合理性。
边缘人工智能的益处
边缘人工智能的独特优势提供了一套新工具,可以应用于全球一些最大的问题。保护、医疗和教育领域的技术人员已经开始利用边缘人工智能产生重大影响。以下是一些我们个人特别激动的例子:
-
智慧公园正在利用运行机器学习模型的项圈更好地理解全球野生动物公园中大象的行为。
-
Izoelektro 的RAM-1利用嵌入式机器学习检测即将发生的电力传输硬件故障,从而帮助防止森林火灾。
-
来自沙特阿拉伯哈利德国王大学的 Mohammed Zubair Shamim 博士正在训练模型,可以利用低成本设备筛选出患有口腔癌等生命威胁性疾病的患者。
-
全球各地的学生正在为其本地产业开发解决方案。来自巴西联邦大学工程学院(UNIFEI)的 João Vitor Yukio Bordin Yamashita,利用嵌入式硬件创建了一个系统,用于识别影响咖啡植物的疾病。
边缘 AI 的特性使其特别适合应用于全球性问题。由于可靠的连接成本高昂且并非普遍可用,许多当前的智能技术只有在工业化、富裕和良好连接的地区才有利用的价值。通过消除对可靠互联网连接的需求,边缘 AI 增加了访问能力,使得能够受益于这些技术的人群更广泛。
当机器学习成为混合中的一部分时,边缘 AI 通常涉及小型模型,这些模型通常快速且廉价地训练。由于也无需维护昂贵的后端服务器基础设施,边缘 AI 使得资源有限的开发者能够为他们更了解的本地市场构建尖端解决方案。想要了解更多这些机会,请观看“TinyML 和发展中国家”,这是 Pete Warden 在 TinyML Kenya 会议上的精彩演讲。
正如我们在“隐私”中所看到的,边缘 AI 还为用户提供了改善隐私的机会。在我们网络化的世界中,许多公司将用户数据视为可被提取和挖掘的宝贵资源。消费者和业主通常需要在使用 AI 产品时牺牲他们的隐私,将他们的数据交给未知的第三方。
使用边缘 AI,数据无需离开设备。这使得用户与产品之间能够建立更加信任的关系,让用户拥有对自己数据的所有权。对于设计服务弱势群体的产品,这一点尤为重要,这些群体可能对看似在收集他们数据的服务持怀疑态度。
正如我们将在后面的部分中看到的,要构建道德 AI 系统必须避免许多潜在的陷阱。尽管如此,这项技术为使世界变得更美好提供了巨大的机会。
注意
如果您考虑使用边缘 AI 来解决您社区的问题,作者们很乐意听取您的想法。我们已经支持了许多有影响力的项目,并希望能够找到更多。请发送电子邮件至hello@edgeaibook.com联系作者。
Edge AI 与普通 AI 的关键区别
边缘 AI 是普通 AI 的一个子集,因此许多相同的原则也适用。尽管如此,在考虑边缘设备上的人工智能时,有一些特别需要考虑的事情。以下是我们的主要观点。
在边缘进行训练是罕见的。
许多 AI 应用程序由机器学习驱动。大多数情况下,机器学习涉及对模型进行训练,以基于一组标记数据进行预测。一旦模型被训练好,就可以用于推理:对未曾见过的数据进行新的预测。
当我们谈论边缘 AI 和机器学习时,通常是在谈论推理。训练模型需要比推理更多的计算和内存,通常需要一个带标签的数据集。在边缘设备上这些东西很难获得,因为设备资源有限,数据原始且未经过滤。
因此,边缘 AI 中使用的模型通常在部署到设备之前进行训练,使用相对强大的计算和经过清洗和标记的数据集——通常是手动完成的。技术上训练机器学习模型在边缘设备上是可能的,但很少见——主要是由于缺乏需要用于训练和评估的带标签数据。
在设备上训练的两种常见的子类型用于任务如在移动电话上的面部或指纹验证,将一组生物特征映射到特定用户。第二种用于预测维护,在这种情况下,设备上的算法学习机器的“正常”状态,以便在状态异常时采取行动。在“设备上训练”主题中将有更多详细信息。
边缘 AI 的重点在于传感器数据
边缘设备的激动人心之处在于它们靠近数据生成的地方。通常,边缘设备配备有传感器,使它们与环境直接连接。边缘 AI 部署的目标是理解这些数据,识别模式,并利用它们做出决策。
由于其特性,传感器数据往往庞大、嘈杂且难以管理。它以高频率到达——潜在地每秒多次。运行边缘 AI 应用程序的嵌入式设备在有限的时间内必须收集这些数据、处理它们、将其馈送到某种 AI 算法中,并根据结果采取行动。这是一个重大挑战,尤其是考虑到大多数嵌入式设备资源有限,无法存储大量数据。
需要处理原始传感器数据的需求使得数字信号处理成为大多数边缘 AI 部署的关键组成部分。在任何有效和高效的实现中,信号处理和 AI 组件必须作为单一系统设计,平衡性能和准确性之间的权衡。
许多传统的机器学习和数据科学工具专注于表格数据,比如公司财务或消费者产品评论。相比之下,边缘 AI 工具专门设计用于处理传感器数据的连续流。这意味着构建边缘 AI 应用程序需要一套全新的技能和技术。
ML 模型可以变得非常小
边缘设备通常设计成成本和功耗限制较高。这意味着它们通常具有比个人电脑或网络服务器慢得多的处理器和较少的内存。
目标设备的约束意味着,在使用机器学习实现边缘 AI 时,机器学习模型必须相当小。在中端微控制器上,可能只有一百千字节左右的 ROM 可用于存储模型,而一些设备则具有更少的内存。由于较大的模型执行时间更长,设备的慢处理器也会推动开发人员部署较小的模型。
缩小模型涉及一些权衡。首先,较大的模型具有更大的学习能力。当你将模型缩小时,它开始失去一些表示其训练数据集的能力,可能不那么准确。因此,开发嵌入式机器学习应用程序的开发人员必须在模型大小和所需精度之间取得平衡。
存在各种技术用于压缩模型,减小其大小以适应更小的硬件,并减少计算时间。这些压缩技术非常有用,但也会影响模型的准确性——有时是以微妙但风险较大的方式。"压缩与优化"将详细讨论这些技术。
尽管如此,并非所有应用程序都需要大而复杂的模型。那些需要的通常是像图像处理这样的内容,因为解释视觉信息涉及很多细微差别。通常,对于简单的数据,几千字节(甚至更少)的模型就足够了。
从反馈中学习是有限的
正如我们将在后面看到的那样,AI 应用是通过一系列迭代的反馈循环构建的。我们做一些工作,测量其表现,然后找出需要改进的地方。
例如,想象一下我们构建了一个健身监控器,可以根据从板载传感器收集的数据估计您的 10K 跑步时间。为了测试它是否工作良好,我们可以等到您真正跑 10K,并查看预测是否正确。如果不正确,我们可以将您的数据添加到我们的训练数据集中,尝试训练一个更好的模型。
如果我们有可靠的互联网连接,这应该不难——我们可以直接将数据上传到我们的服务器上。但边缘 AI 的魔力部分在于我们可以部署智能到连接性有限的设备上。在这种情况下,我们可能没有足够的带宽来上传新的训练数据。在许多情况下,我们甚至可能根本无法上传任何内容。
这对我们的应用程序开发工作流程提出了很大的挑战。当我们在现实世界中的访问有限时,如何确保我们的系统表现良好?当我们几乎无法收集更多数据时,如何改进我们的系统?这是边缘 AI 开发的核心主题,我们将在本书中广泛探讨。
计算是多样化和异构的。
大多数服务器端 AI 应用运行在普通的 x86 处理器上,有些还加入了图形处理单元(GPU)来帮助进行深度学习推理。由于 Arm 最近推出了服务器 CPU 和 Google 的 TPUs(张量处理单元)等异类深度学习加速器的存在,多样性稍有增加,但大部分工作负载仍在相当普通的硬件上运行。
相比之下,嵌入式领域包括令人眼花缭乱的设备类型:
-
包括微小的 8 位芯片和高级的 32 位处理器在内的微控制器。
-
运行嵌入式 Linux 的片上系统(SoC)设备。
-
基于 GPU 技术的通用加速器。
-
现场可编程门阵列(FPGA)。
-
固定架构的加速器,可以高速运行单一模型架构。
每个类别都包括来自许多不同制造商的无数设备,每种设备都有独特的构建工具、编程环境和接口选项。这可能会让人感到非常不知所措。
硬件的多样性意味着可能有多个适合任何给定用例的系统。难点在于选择一个!我们将在本书的过程中解决这个挑战。
“足够好”通常是目标。
对于传统 AI 来说,通常的目标是获取最佳的性能,不管成本如何。在服务器端应用中使用的生产深度学习模型可能达到几千兆字节的大小,并依赖强大的 GPU 计算能力能够及时运行。当计算不是问题时,最准确的模型通常是最佳选择。
边缘 AI 的优势伴随着一些严重的限制。边缘设备的计算能力较弱,通常需要在设备性能和准确性之间进行艰难的选择。
这无疑是一个挑战,但并非障碍。在边缘运行 AI 有着巨大的好处,对于大量使用案例来说,即使牺牲一些准确性,仍然能带来显著优势。甚至一点点设备上的智能也比没有要好得多。
目标是构建能充分利用这种“足够好”性能的应用程序——这是 Alasdair Allan 优雅描述的Capable Computing方法。成功做到这一点的关键是使用工具,帮助我们理解应用程序在现实世界中的性能,考虑到任何性能惩罚后。我们将会详细讨论这个主题。
工具和最佳实践仍在不断发展。
作为一种刚刚开始大规模采用的全新技术,边缘 AI 仍依赖于为大规模服务器端 AI 开发的工具和方法。事实上,大多数 AI 研究仍集中在构建大模型和巨大数据集上。这有几个影响。
首先,正如我们将在第五章中看到的那样,我们经常会使用来自数据科学和机器学习领域的现有开发工具。积极的一面是,这意味着我们可以借鉴一个丰富的已被证明有效的库和框架生态系统。然而,少数现有工具并未优先考虑边缘上重要的事项——如小型模型尺寸、计算效率以及在少量数据上进行训练的能力。我们通常需要额外的工作来实现这些重点。
其次,由于边缘人工智能(edge AI)研究相对较新,我们可能会看到其非常快速的发展。随着这一领域的扩展,越来越多的研究人员和工程师开始关注它,新的提高效率的方法也随之出现——还有构建有效应用程序的最佳实践和技术。这种快速变化的前景使得边缘人工智能成为一个非常令人兴奋的领域。
总结
在本章中,我们探讨了定义边缘人工智能的术语,学习了一种用于推理其好处的便捷工具,探讨了将计算移动到边缘如何增加对技术的访问,并概述了使边缘人工智能不同于传统人工智能的因素。
从下一章开始,我们将处理具体内容。准备好学习今天支持边缘人工智能的用例、设备和算法。
¹ 据Business Wire报道。
² 预计到 2025 年将增长到 270 亿,根据IoT Analytics的数据。
³ 嵌入式工程和移动开发通常是独立的学科。即使在移动设备内部,嵌入式固件和操作系统也与移动应用程序不同。本书侧重于嵌入式工程,因此我们不会过多讨论构建移动应用程序,但我们将涵盖在两种情况下都相关的技术。
⁴ 多年来,人们希望通过工程师手工调整的复杂条件逻辑来实现人工通用智能。结果证明,这比预期的要复杂得多!
⁵ “TinyML”这个术语是 TinyML 基金会的注册商标。
⁶ 这将在“频谱分析”中解释。
⁷ 并非所有的边缘人工智能应用都能免受影响,因为通常需要监控设备并对算法进行更新。尽管如此,在许多情况下,边缘人工智能确实可以减轻维护的负担。
⁸ 即使在这个无伤大雅的例子中,恶意访问你的恒温器数据的人也可以利用它来识别你何时度假,以便闯入你的房子。
⁹ 这种确切的情况在 2022 年曾发生在 Ring 家庭安全系统身上,该系统被发现容易受到攻击(来源于《TechCrunch》,2022 年,《亚马逊的 Ring 悄悄修复了一个使用户摄像头录像面临曝露风险的安全漏洞》)。
第二章:边缘人工智能在现实世界中的应用
我们现在对边缘人工智能的含义以及理论上它为何是一套有用的技术有了基本的了解。在即将到来的章节中,我们将看到这些理论在与现实世界接触时的实际表现。我们将首先检视一些目前已经应用在现场的实际产品。之后,我们将探索边缘人工智能产品的顶级应用领域。最后,我们将更深入地了解使任何产品成功所需的伦理考量。
边缘人工智能的常见应用场景
正如我们在前一章学到的,对于拥有大量传感器数据但缺乏计算或连接能力的设备,边缘人工智能尤其有价值。幸运的是,我们几乎在每个地方都能找到这些条件。
在现代城市中,我们似乎从未离开过电源插座或无线接入点。但即使有高带宽网络连接和可靠电力,限制设备的通信和能耗也有巨大的优势。正如我们在“理解边缘人工智能的好处,只需看一看 BLERP”中所见,追求便携性、可靠性、隐私和成本等可取特性,推动产品开发朝向设计以最小化连接和能耗使用量的设备。
尽管我们看似全球互联网普及,但地球上有很多地方的连接性或电力资源仍然有限。截至目前,地球陆地的 50%相对未受到人类开发。只有极少数地球表面有蜂窝网络或无线覆盖,数十亿人没有可靠的电力访问。
但是,除了明显的偏远地区外,在我们最建设的地区中,还有许多被归类为这一类别的隐蔽角落。在我们现代工业供应链中,有些地方提供硬布线的直流电源是不现实的——这时高效的电池供电设备就成了完美的选择(参见图 2-1)。

图 2-1。地球上许多地方都需要电池供电
同时,传感器变得更便宜、更复杂且更节能。通常,即使是简单的嵌入式设备也配备了功能强大的传感器,但由于数据传输至远程处理系统的挑战,这些传感器往往无法充分利用。例如,想象一下一个基本的健身可穿戴设备,它使用加速度计来计步。即使是这种简单设备可能配备有高灵敏度的多轴加速度计,具有非常高的采样率,能记录最微妙的运动。除非设备软件能够解释这些数据,否则大部分数据都会被丢弃:将原始数据发送到另一台设备进行处理将耗费过多能量。
绿色田野和棕色田野项目
如上所述的条件几乎无限地提供了部署边缘人工智能的机会。从实际角度来看,将这些机会分为两类可能有所帮助:绿色田野和棕色田野。这些术语源自城市规划。绿色田野项目指的是在尚未开发的现场进行的项目,该地仍然是一片草坪绿地。棕色田野项目则是指在已开发的现场进行的项目,可能存在某些现有的遗留基础设施。
在边缘人工智能领域,绿色田野项目是硬件和软件从头设计的项目。由于没有现有的硬件,绿色田野项目可以利用最新和最伟大的计算和传感创新,这些我们将在本章后续学习。开发者有更多自由度设计针对他们正在目标的使用案例的理想解决方案。例如,现代手机被设计为包括专门的低功耗数字信号处理硬件,以便它们可以持续监听唤醒词(例如“OK,Google”或“Hey,Siri”),而不会耗尽电池。硬件选择是基于特定的唤醒词检测算法。
相比之下,棕色田野边缘人工智能项目始于原本设计用于其他目的的现有硬件。开发者必须在现有硬件的限制下工作,以为产品赋予人工智能能力。这种方式减少了开发者的自由,但避免了设计新硬件所带来的重大成本和风险。例如,开发者可以通过利用设备现有的嵌入式处理器的空闲周期,向市场上已有的蓝牙音频耳机添加唤醒词检测功能。甚至可以通过固件更新向现有设备添加这种新功能。
绿色田野项目因为能够将最新的边缘人工智能硬件和算法进行配对,从而推动可能性的极限,因此充满了激情。另一方面,棕色田野项目则能够为现有硬件带来新的能力,让客户感到满意,并充分利用现有设计。
真实世界产品
理解技术的最佳方式是看它在现实世界中的应用。尽管边缘人工智能仍处于初期阶段,但它已经被广泛应用于各种应用和行业中。以下是三个使用边缘人工智能开发的真实系统的简要概述。也许你自己的工作将在本书的未来版本中被介绍!
使用电力线路故障检测预防森林火灾
电力线路横跨广阔的荒野,包括欧洲的古老森林。设备故障可能引发植被火灾。成千上万英里的铁塔和电力线路通常位于非常偏远的地区,电气设备的监测可能会很困难。
Izoelektro 的RAM-1设备利用边缘人工智能来解决这个问题(图 2-2)。一套传感器监测每个电力塔的条件,包括温度、倾斜和电压,并使用深度学习分类模型(第四章)来识别故障可能正在发展的时候。技术人员可以访问塔并在发生任何火灾危险之前进行修复。该设备具有坚固的结构,设计用于经受多年的极端天气条件。

图 2-2. Izoelektro 的 RAM-1 设备(来源:Izoelektro)
在这是边缘人工智能的完美应用的两个主要因素。第一个是荒野地区的连接性不足。实时传输数千个偏远电塔的原始传感器数据将成本高昂。相反,优雅的解决方案是在源头解释传感器数据,并且仅在预测到故障时传输——每月最多大约 250 千字节。设备能够理解哪些数据是需要立即关注的关键数据,在定期批量传输中发送不那么重要的信息。
这种选择性的通信有助于第二个略显反直觉的因素。尽管 RAM-1 安装在电力塔上,但实际上是利用电池供电。这确保了即使电力线路出现故障,它仍然可以继续工作,并且减少了安装的成本和复杂性。由于无线电传输消耗大量能量,RAM-1 避免不必要的传输有助于延长电池寿命。事实上,在边缘人工智能的帮助下,其电池可以持续二十年。
这就是 RAM-1 如何适合 BLERP 模型的方式:
带宽
RAM-1 部署的偏远地区的连接性有限。
延迟
至关重要的是要在故障发生时尽快识别,而不是等待定期数据传输。
经济学
避免不必要的通信可以节省金钱,也意味着设备可以依靠电池供电,从而降低安装成本。
可靠性
依靠电池供电的能力提高了可靠性。
隐私
对于这种使用情况并不是一个主要考虑因素。
保护第一响应者的智能可穿戴设备
他们的工作性质意味着消防员经常暴露在高温下,极端的高温条件可能会严重影响他们的长期健康。事实上,根据 FEMA 消防员在执勤中突发心脏事件是导致死亡的主要原因。
SlateSafety 的BioTrac Band是一款为工人设计的可穿戴设备,如消防员等在极端条件下工作的人士(见图 2-3)。

图 2-3。SlateSafety 的 BioTrac Band(图片来源:SlateSafety)
BioTrac Band 部署在极端环境中,使其成为边缘 AI 的一个极好的用例。
以下是 BioTrac Band 符合 BLERP 模型的情况:
带宽
在消防员工作的极端环境中,连接性有限。
延迟
健康问题是时间关键的,必须立即识别。
经济学
从传感器流式传输原始数据需要昂贵的高带宽连接。
可靠性
即使连接性下降,该设备也能继续警告消防员潜在风险,并且可以长时间运行在小电池上。
隐私
生物信号原始数据可以保留在设备上,只传输关键信息。
使用智能颈圈理解象行为
随着对它们自然栖息地的压力增加,野生大象与人类的接触越来越多。
ElephantEdge 是一个开源项目,旨在创建一个设计用于帮助研究人员了解大象行为的追踪项圈(见图 2-4)。该项圈安装在大象的颈部,利用嵌入式传感器和机器学习模型可以提供有关动物位置、健康和活动的见解。这些数据可以用于科学研究——也可以用于提醒人类动物的存在,以避免冲突。
由于设备安装在一只野生大象身上,更换电池是一项困难的任务!边缘 AI 技术通过减少设备消耗的能量来提供帮助。不再传输大量原始传感器数据,配备机器学习的项圈能够传输关于动物活动的高级信息——例如,是否在行走、进食、饮水或进行其他行为。使其能够做到这一点的模型是由与公共数据集合作的公民科学家社区原型制作的。

图 2-4. OpenCollar Edge 追踪项圈被安装在一只被麻醉的大象身上(来源:IRNAS)
这些低带宽要求意味着项圈可以利用一种名为 LoRa 的极低功耗无线通信技术。该项圈能够与装备有 LoRa 的卫星通信,每天经过一次,发送自上次传输以来动物活动的摘要。这意味着即使在传统连接受限的地方,系统也可以可靠地工作,但电池预计可以持续五年。
下面是 OpenCollar Edge 如何适配 BLERP 模型的情况:
带宽
大象栖息地的连接有限;设备分析能力使得低能耗无线技术的使用成为可能。
延迟
尽管该设备每天只传输一次,但与需要手动下载的传统追踪项圈相比,这已经非常频繁了。
经济学
该设备通过取代繁重的传统大象监测方法来节省成本。
可靠性
不频繁的传输意味着电池可以持续数年,并且使卫星技术在经济上变得可行,增加了覆盖范围。
隐私
直接追踪大象对当地人不像设置摄像头监视动物活动那样具有侵入性,后者是另一种提议的解决方案。
这三个用例只是可能性的一个小样本。在下一节中,我们将讨论一些一般的高级应用类别。
应用类型
在我们现代世界的每个部分都有部署边缘人工智能的机会,从重工业到医疗保健,从农业到艺术。可能性几乎无限!为了更容易讨论,边缘人工智能技术在这些应用中的角色可以分为几个高级别类别:
-
物体跟踪
-
理解和控制系统
-
理解人们和生物
-
生成和转换信号
让我们逐个类别来理解边缘人工智能的应用位置。
物体跟踪
从大型集装箱船到个别米粒,我们的文明依赖于物体从一个地方运输到另一个地方。这可能发生在仓库的受控条件下,物品从存储到装运被小心地移动。它也可能发生在最极端的条件下,例如地球表面上天气系统的运动。
跟踪和解读物体的状态,无论是人造还是自然的,都是边缘人工智能的一个关键应用领域。智能传感器可以帮助将物理世界的状态编码成计算机可以理解的形式,从而使我们更好地协调我们的活动。
表 2-1 讨论了涉及物体跟踪的边缘人工智能用例。
表 2-1. 物体跟踪的边缘人工智能用例
| 应用案例 | 主要传感器 |
|---|---|
| 使用智能包装监控货物运输过程中的损坏 | 加速计、震动、GPS、温度、湿度 |
| 使用嵌入式摄像头计算商店货架上的产品数量,以便在它们用完之前补货 | 视觉 |
| 分析海洋中塑料废物的运动以便清理 | 视觉 |
| 识别和跟踪海上障碍物,帮助船只避免碰撞 | 雷达 |
| 使用地球物理传感器定位埋藏的自然资源 | 电磁、声学 |
物体跟踪的主要优势
目标跟踪通常利用边缘人工智能的连接性和成本相关优势。世界上有许多物体,并不总是在方便的地方。利用低成本、机会主义连接的廉价边缘人工智能传感器,可以提供对供应链中本来过于昂贵而无法监测的间隙的高分辨率可见性。
当然,部署边缘人工智能的确切好处因项目而异。例如,一个使用摄像头监控商店货架存货的系统可能出于隐私考虑使用边缘人工智能。如果使用互联网连接的摄像头监控商店货架,员工可能会感觉自己受到总部的持续监视。但是一个离线工作、仅供商店团队受益的库存跟踪系统可能会成为一个受欢迎的辅助工具。
理解和控制系统
我们现代的世界建立在数百万复杂、互连的系统之上——从生产线到交通网络,从气候控制到智能家电。我们的经济福祉与这些系统密切相关。生产中的故障可能造成巨大的时间和金钱损失,而提高效率则可以大幅节省成本、劳动力和排放。
监测、控制和维护复杂系统是边缘人工智能的一个巨大机遇。在边缘做出迅速可靠的决策可以提高系统的响应能力和弹性,对系统状态的精细洞察可以帮助我们更好地规划未来。
一些涉及理解和控制系统的边缘人工智能应用案例可以在表格 2-2 中找到。
表 2-2. 用于理解和控制系统的边缘人工智能应用案例
| 应用案例 | 主要传感器 |
|---|---|
| 监测油井是否需要维护,避免停机并减少泄漏和溢出 | 加速度计、振动、负载、温度、音频、视觉等 |
| 自动驾驶联合收割机,帮助农民快速收割庄稼 | 视觉、GPS |
| 理解和塑造繁忙高速公路上的交通流动,利用可变速限来保持车辆运行 | 视觉、磁力计 |
| 利用传感器反馈指导机械工具操作 | 加速度计、振动、负载 |
| 使用计算机视觉识别生产线上的缺陷产品,改善质量控制并快速识别问题 | 视觉 |
| 使用机器人吸尘器清洁地毯,为房主节省时间 | 视觉、接近、触摸、电流^(a) |
| 使用机器人在仓库中取货,降低劳动成本和工作场所健康风险 | 视觉、接近、触摸、光 |
| 使用流量分析检测计算机网络中的入侵,自动响应安全威胁 | 网络日志^(b) |
| 根据运动过程中的振动估计车辆轮胎磨损 | 加速度计 |
| ^(a) 分析电机电流可用于识别机器人车轮或清洁工具卡住的情况。^(b) 边缘人工智能并非总是需要传感器数据:任何本地可用的数据流都可以作为算法的输入。 |
这是一个非常庞大的应用类别,包括我们所谓的“未来”中许多事物:自动驾驶车辆、工业机器人和智能工厂。它们的共同点在于使用边缘人工智能来监控复杂系统的状态,并在需要变化时提供反馈和控制。
理解和控制系统的关键好处
自动监控和控制系统的广泛类别,利用了大多数边缘人工智能的优势。对许多商业应用案例来说,经济性和可靠性尤为重要,低带宽、低延迟解决方案的好处进一步证明了其不同于服务器端系统的合理性。
理解人类和生物
生物世界复杂多样,变化迅速。能够实时理解和反应对其具有巨大价值。此类别包括面向人类的技术,如健身追踪手表和教育玩具,以及用于监测自然、农业和微观世界的系统。
这些应用有助于弥合生物学与技术之间的鸿沟,使我们僵硬的计算机系统能够与地球生命的动态灵活世界进行接口交流。随着我们对生物学的理解不断进步,这一领域将继续增长。
Table 2-3 展示了帮助人类与计算机相互理解的边缘人工智能应用实例。
Table 2-3. 人与边缘人工智能应用实例
| 应用案例 | 主要传感器 |
|---|---|
| 在危险环境中警示工人缺少防护装备 | 视觉 |
| 理解人类手势以控制视频游戏 | 视觉、加速度计、雷达 |
| 辨识重症监护病人健康状况恶化并通知医护人员 | 生物信号、医疗设备 |
| 辨识家庭入室贼匪并警报当局 | 视觉、音频、加速度计、磁性传感器 |
| 使用智能手表中的传感器对身体活动进行分类 | 加速度计、GPS、心率 |
| 辨识用户的语音指令并控制家电 | 音频 |
| 计算等待公交车站的人数 | 视觉 |
| 在驾驶员打盹时警告其驾驶车辆 | 视觉 |
我们的世界充满了植物、动物和其他生物。Table 2-4 展示了帮助我们理解这些生物的边缘人工智能应用实例。
Table 2-4. 涉及生物的边缘人工智能应用实例
| 应用案例 | 主要传感器 |
|---|---|
| 通过远程拍摄摄像机发现感兴趣野生动物并通知研究人员 | 视觉、音频 |
| 在无手机信号覆盖的偏远农村地区诊断作物病害 | 视觉、挥发性有机化合物 |
| 辨识海洋哺乳动物发出的声音以追踪它们的活动并了解它们的行为 | 声学 |
| 警示村民正在接近的大象,以避免人类与动物的冲突 | 热成像、视觉 |
| 使用智能项圈对农场动物行为进行分类以了解其健康状况 | 加速度计 |
| 通过监控和控制配备传感器的厨房设备,将食物烹饪至完美 | 视觉、温度、挥发性有机化合物^(a) |
| ^(a) 挥发性有机化合物(VOC)传感器可以检测各种类型的气体。 |
了解人类和生物的关键优势
另一个广泛应用的领域涉及人类和生物,利用了 BLERP 模型的各个方面。尽管如此,这是一个隐私尤为重要的类别。有许多应用在技术上可以使用服务器端 AI 实现,但只有在设备上完成时才会被社会接受。
这种现象最广泛的例子是数字个人助理,如苹果的 Siri 或谷歌的 Google 助手。如前所述,个人助理通过使用设备上的模型不断监听唤醒词来工作。只有在检测到唤醒词之后,才会将任何音频流到云端。如果没有设备上的组件,助手就必须不断地将音频流到服务提供商。这与大多数人对隐私的期望不兼容。
通过将功能移到设备上,并避免数据传输,我们释放了巨大的可能性——尤其是在视觉领域,直到最近,这些领域需要运行在云中的大型模型。
转换信号
对于计算机来说,我们的世界由信号构成:传感器读数的时间序列,每个描述情境或环境的一小部分。我们先前的应用类别主要集中在解释这些信号并相应地响应它们。来自一个或多个传感器的数据被吸收,并构造一个简单的输出,可以促进人类的解释或用作自动系统的控制信号。
这个最终类别有些不同。有时,与其将原始信号转换为即时决策,我们更希望将一个信号转换为另一个信号(表 2-5)。正如在“数字信号处理”中讨论的那样,数字信号处理是嵌入式应用的重要组成部分。在这些用例中,它不仅仅是一个副产品,而是最终目标。
表 2-5. 转换信号的边缘 AI 用例
| 用例 | 信号类型 |
|---|---|
| 过滤背景噪音以改善手机通话质量 | 音频 |
| 从智能手机拍摄的照片中去除噪音 | 视觉 |
| 生成音乐以配合音乐家的练习 | 音频 |
| 在远程工作会议期间模糊视频流的背景 | 视觉 |
| 从文本生成逼真的人类语音 | 音频 |
| 使用智能手机摄像头将一种书面语言翻译成另一种 | 视觉、文本 |
| 将低分辨率音频上采样,使其听起来更好 | 音频 |
| 使用深度学习压缩视频,以便通过低带宽连接传输 | 视频 |
| 为视觉障碍者创建视觉场景的口头表示 | 音频 |
| 为方便笔记而将口头对话转录成文本 | 音频 |
| 使用廉价传感器的数据来模拟昂贵传感器的输出 | 时序数据 |
转换信号的关键优势
由于数字信号随时间变化,该领域的应用通常从边缘 AI 的延迟优势中受益。带宽也特别重要,因为需要访问原始信号;传输转换后的信号通常需要相同或更多的带宽。
另一个转换数据的有趣应用是虚拟传感器的概念。在某些情况下,工程或成本限制可能阻止您为设备配备所有想要的传感器。例如,也许您的设计将受益于一个特别精确的传感器,但是该传感器对于生产使用来说过于昂贵。
要解决这个问题,可能可以创建虚拟传感器——一种提供几乎与真实数据相当的信号流的人工数据流。为此,边缘 AI 算法可以处理其他信号(例如,可以结合来自多个较便宜传感器的读数),并尝试根据它们包含的信息重建所需传感器的信号。
例如,在单眼深度估计中,模型经过训练以估算从简单图像传感器到物体的距离。这通常需要更昂贵的解决方案,如立体摄像机或基于激光的距离传感器。
我们已经探讨了大多数边缘 AI 应用可以归类到的四个高级别类别。随着边缘 AI 技术的不断发展,我们将看到更多潜在的用例开放。但技术可行性并不自动意味着某事是个好主意。在下一节中,我们将讨论负责任设计的重要性,并了解导致边缘 AI 应用可能带来更多害处而不是好处的一些陷阱。
负责任地构建应用程序
本章的第一部分涵盖了一些边缘 AI 最有潜力的应用场景,下一章将提供一个框架来分解问题,并决定是否适合使用边缘 AI 来解决。
但正如我们在“负责任、道德和有效的 AI”中所听到的那样,任何项目在每一步都必须进行分析,以确保其设计和使用是负责任的。这不是一个温暖而模糊的过程,在这个过程中我们给自己一些勾选框就自我表扬,然后继续工作。设计不良的技术产品可能会给产品的最终用户、销售这些产品的企业以及创建这些产品的开发者带来毁灭性的、职业终结性的灾难。
一个例子是优步自动驾驶汽车部门。这家共乘公司积极推动开发自动驾驶汽车,聘请业内知名人士,并投资数十亿美元。在急于在真实街道上测试系统时,公司的安全程序存在缺陷,软件效果不佳,导致一名行人悲剧性死亡。这场灾难导致了优步自动驾驶计划的关闭,数百名员工被裁员,自动驾驶汽车部门被以低价卖给了另一家企业。³
如果建造自动驾驶汽车做得好,可能会导致更安全的道路和减少排放。这似乎是一个高尚的使命。但边缘人工智能的复杂环境可能导致难以避免的潜在风险。考虑到这些风险,一个本意良好的技术项目可能变成致命的雷区。
在优步的案例中,他们的自动驾驶汽车遭遇了机器学习系统极为常见的失效模式:它无法理解其训练数据集中未出现的情况。根据国家运输安全委员会的说法,优步的自动驾驶汽车缺乏“将一个物体分类为行人的能力,除非该物体靠近人行横道”。
有许多因素导致了这样的灾难性失败。开发者的角度来看,把一辆未经过甚至最常见操作条件测试的自动驾驶汽车开上公共道路,显示出了无能和疏忽。在优步的案例中,这直接导致了一个人的死亡和公司部门的失败。我们可能会假设优步自动驾驶软件背后的团队是聪明、能干的人——他们被招募为业界最佳。那么,当构建和部署技术时,这些有能力的人如何会忽略显而易见的问题呢?
不幸的事实是,建造高质量的技术很难,用本质上只能反映部分考虑的技术解决复杂问题更加困难。除了基本的技术挑战之外,作为专业人士,你有责任了解你的技术的局限性,审查你的流程,严格评估你的工作,并在必要时关闭一个项目。一个无意伤害人们的产品是糟糕的产品,无论设计它的团队多么出色。
在商业环境中,你可能会与更关注交付产品而非确保其安全的组织惯性作斗争。但你始终要记住,归根结底,如果忽视你的专业责任,你的生计、声誉和自由都可能受到威胁。更糟糕的是,你可能会造成一个毁了他人生活的产品,并为此终身悔恨。
负责任的设计和人工智能伦理
负责任的设计对于构建有效产品至关重要。为确保它获得应有的介绍,作者邀请了Wiebke(Toussaint)Hutiri,荷兰代尔夫特理工大学 Cyber Physical Intelligence Lab 的博士研究员,撰写了以下部分。Wiebke 在应用机器学习和边缘计算交叉领域进行跨学科研究,专注于设计值得信赖的物联网机器学习系统。
在本章前文中描述的有害 AI 失败已使 AI 伦理成为大多数将 AI 集成到其产品中的公司重要考虑因素。对于开发者来说,伦理道德尽管重要,但往往很难知道伦理是什么以及如何将其付诸实践。审视支持产品开发过程的价值观(见下面的侧栏)是将伦理与边缘 AI 开发实际联系起来的一种方式。以价值观为基础,下一步是实践负责任的设计。
要负责任地设计,开发者需要了解其“建筑”材料的限制并掌握其工具。此外,他们需要测量和评估其产品是否符合他们旨在实现的一系列功能和非功能要求。这就是为什么机器学习不像你之前开发的任何硬件或软件应用程序。在机器学习中,数据既是你的“砖块”,也是你的“温度计”。这对边缘 AI 具有独特的后果。
数据就是你的“砖块”:对于边缘 AI 应用中的机器学习模型来说,你的训练数据就是你的基石。你的数据质量影响你产品的质量。简单地说,如果训练数据中没有某些内容,你就无法预测它。如果某些内容在训练数据中被低估,你就无法可靠地预测它。如果某些内容在训练数据中被高估,你将主要预测它,而不是其他内容。当你考虑代表性时,重要的是考虑不同子组在目标标签上的分布,而不仅仅是子组的代表性。同样重要的是要考虑子组内目标标签的质量,因为标记错误的训练样本将影响你模型的质量。
数据就是你的“温度计”:训练数据是你的砖块,评估数据是“温度计”,用来衡量你的模型。使用不代表应用场景的评估数据,就像使用未校准的温度计测量温度一样。具有高质量的评估数据至关重要。在统计学中,小样本大小需要特殊处理。用于评估机器学习模型的常见指标假定有足够的样本代表性。对于评估数据,重要的是所有类别在标签上的充分代表性,以便你的评估具有统计意义。如果某个类别未在所有目标标签上进行评估,模型的极限就不为人知。
使用数据构建和评估模型有许多含义。例如,数据是历史性的,代表过去而不是未来。数据仅代表时间的一瞬间,而世界在变化。数据特定于其收集的位置和被测量的实体。所有这些都意味着数据只是一个样本,永远不是完整的。不完整的数据是人工智能中偏见和歧视的主要原因,这已经伤害了人们并引起了丑闻。
我们将在第七章深入探讨数据集,从零开始解释所有这些概念。
要减少偏见、避免歧视和评估潜在的不公正,你需要了解设计将被使用的背景:
-
谁将使用你的设计,以及他们将如何使用它?
-
你的设计填补了什么空白?
-
你的设计将在什么环境条件下运行?
-
是否有对手可能试图干扰你产品的运行?
-
如果你的设计不按预期运行会出现什么问题?
比喻地说,你是在一个年降雨 200 天的小镇上用未经烧制的黏土砖建造边缘人工智能吗?还是你已经认真考虑了环境,收集了允许你构建适合环境的结构的训练数据?你的评估数据是一个损坏的设备还是一个精确校准的温度计?
结束这篇关于负责任设计和人工智能伦理的简要介绍时,你可以将一个负责任的开发者看作是善于使用他们的工具将材料打磨成一种形式,以填补利益相关者希望填补的空白,符合所有受项目影响者共同认可的价值观。
开始进行负责任设计很容易。了解你的数据限制。了解你模型的限制。与将使用你产品的人交流。如果你从本节只能学到一点,那就是:KUDOs(了解你的数据,显然)致力于开发负责任的边缘人工智能。
—— Wiebke(图西特)·胡蒂里,代尔夫特技术大学
黑盒子和偏见
边缘人工智能有两个方面特别容易在实践中造成意外伤害:黑盒子和偏见。
“黑盒子”一词是对不透明系统和理解不透明的一种隐喻。数据输入,决策输出,但导致这些决策的过程在其中是不可理解的。这是现代人工智能的一个常见批评,尤其是深度学习模型,因其难以解剖而著名。一些算法,如随机森林,很容易解释——如果你可以访问模型,你可以阅读其内部以理解它为何做出某些决策。但在设备上情况大不相同。
边缘设备通常是隐形的,这是设计上的选择。它们旨在融入我们建筑环境的背景中;它们嵌入在我们的建筑物、产品、车辆和玩具中。它们是真正的黑盒子;它们的内容是看不见的,通常受到多层安全保护以避免详细检查。
一旦部署到边缘设备上的 AI 算法——无论多么简单——对于任何使用它的人来说都是一个黑盒子。如果设备部署在与其原始开发者预期的不同的现实条件中,甚至他们自己对设备行为的原因了解可能也很有限。
这种情况在多个方面都很危险,取决于你是谁。设备的使用者——购买并安装设备的人——现在依赖于一个他们并不完全了解的系统。他们可能信任设备做出正确的决策,但却不能保证这种信任是合理的。
在 Uber 自动驾驶汽车的例子中,测试司机本应能够在危险情况下进行干预。然而,无论其接受过多少培训,人类操作员都不可能可靠地弥补一个有缺陷的自动化系统。依赖人类干预以避免悲剧的实验设计决策是不负责任的。
行人,一个无辜的旁观者,恰好正在过马路,也成为了模型黑盒特性的受害者。如果他们被警告说靠近的车辆是一个不可靠的自动驾驶原型,他们可能不会选择横穿马路。但是边缘 AI 系统隐藏在一个看似普通的车辆内部,没有提供任何内在的警告。行人没有理由认为这辆车不会像人驾驶的车辆一样行驶。
最后,边缘 AI 的黑盒特性为其开发者带来了风险。例如,想象一下,使用边缘 AI 摄像机陷阱来监测一种入侵物种的种群。可能会出现摄像机漏检的情况——每三只入侵动物中就有一只无法被识别。如果摄像机陷阱部署在偏远地区,可能无法验证摄像机的输出与现实的符合性。研究人员将会低估动物种群的数量——但他们无从知晓,因为原始数据可能已不存在。
与服务器端 AI 不同,后者可以与其处理的原始数据一起部署和监控,边缘 AI 通常专门部署在无法捕获原始数据的情况下。在实践中,这意味着有时开发人员无法直接衡量边缘 AI 应用程序在实地运行时是否正常工作。
在实践中,保护研究人员通过存储所有捕捉到的照片,并在收集存储卡时进行手动审核,直到对系统建立信心为止来解决这一难题——但这需要时间和金钱。如果没有等效的机制可以监控一个应用程序,或者在可用预算内实施这样一个机制不可行,可能无法负责地部署应用程序。
黑盒子的危害因偏见而加重。在边缘 AI 系统中,偏见导致系统配备了一个不代表真实世界的应用领域模型。如果开发人员不注意已知的偏见来源,系统很可能会出现偏见。最常见的偏见来源有:
人类偏见
所有人都会因为他们的经验而对某种世界观持有偏见(即不理解行人可能会无视交通规则⁵)。
数据偏见
数据集反映了数据收集过程,而非现实(例如,数据集可能只包含人们在人行横道上穿过街道的示例)。
算法偏见
所有 AI 算法都有固有的局限性⁶,它们的选择和调整可能导致偏见(即所选算法可能在夜间远处行人等小而模糊的对象上表现不佳)。
测试偏见
因为真实世界的测试困难且昂贵,通常只涵盖常见情况,导致测试覆盖率存在偏见(即在人工测试过程中进行详尽测试成本高昂,开发人员希望降低成本,因此并未测试关键场景)。
在 AI 系统中很难避免偏见。虽然我们倾向于将这个术语与蓄意、故意的歧视形式联系在一起(比如在招聘过程中故意的性别歧视),但在技术项目中,偏见最常见的原因是对应用背景理解的缺乏,而这种缺乏则被我们的资源限制所放大。
为了减少偏见,开发团队需要接触相关的领域专家,精心收集数据集(即使不能反映真实世界的确切条件),适合任务的算法,以及足够的真实世界测试预算。事实上,许多开发团队只有在由于偏见导致的昂贵失败经历后才开始注意这些问题。
当与黑盒边缘人工智能产品结合时,偏见会造成危险的局面。正如前文所述,用户很可能会认为系统有效。他们将相信产品能够正确、安全和合理地运行。由于无法检查其运行机制,他们无法自行测试这一假设。责任完全在开发人员身上,他们必须满足并管理用户的期望。
一个成功的 AI 项目必须意识到自己的局限性,并提供必要的结构来保护用户和公众免受其潜在失败的影响。对于产品背后的团队来说,定义产品将运行的参数并确保用户了解这些参数至关重要。
在本书的过程中,我们将学习确保这种意识并阻止不安全项目部署的框架。这是一个持续的过程,必须从概念化运行到生命周期结束。许多项目将陷入伦理泥沼,因为它们真正的效果被揭示出来——但有些项目从一开始就是错误的。
有害而非有益的技术
监控系统在我们现代社会中已经普及,并且公众不经同意就被迫适应它们的存在。将人工智能应用于监控是一个复杂的话题。虽然边缘人工智能潜在地可以用于保护隐私,但也可以用于侵犯人权。
2019 年 11 月,发现一家主要视频监控摄像头供应商 Hikvision 正在推广一款设计用于分类个人种族的监控摄像头,包括维吾尔人,这是中国少数民族,一直受到政府的严厉镇压。纽约时报报道称,中国政府正在试图利用边缘人工智能技术通过外貌识别维吾尔人,并“记录他们的出入以供搜索和审查”。
尽管 Uber 的自动驾驶实验因糟糕的工程而导致悲剧,但据本书作者称,Hikvision 的种族识别技术——他们信仰促进个人自由和平等的民主社会——基本上是错误的。
当系统运行完美时,它旨在强化社会对某个群体的偏见。没有办法限制系统的偏见;事实上,这种偏见作为设计的一部分存在。虽然可以说道德是主观的,不同的社会有不同的价值观,但事实是,数百万维吾尔人被这一系统追踪,并且在没有选择的情况下——如果询问,他们可能会拒绝。
这种明显违反道德期望的行为可能显而易见,但人类心理——天真、傲慢或贪婪——使一群聪明人很容易越过道德边界而不考虑可能造成的伤害。其中一个例子是服务 HireVue。旨在降低面试候选人成本,公司使用 HireVue 的产品来分析候选人回答特定问题的录制视频。该公司声称使用 AI 算法评估候选人在特定角色中成功的可能性。
开发 HireVue 的人天真地没有考虑到人类、数据、算法和测试偏见对他们工作的影响。他们的产品用于在招聘决策中使用音频-视觉信息,不可避免地在制定招聘决策时融入了候选人的语音、口音和外貌。这种歧视的明显风险导致了一场诉讼,并引发了公众的强烈反响,导致 HireVue 不得不取消其产品的某些功能并进行第三方算法审计。
另一个需要考虑的方面是,边缘 AI 技术可能被客户用于设计之外的目的,而这些目的可能是不道德的。例如,考虑一个旨在发现濒危物种的边缘 AI 相机陷阱。虽然用于科学研究,但这种相机陷阱很容易被偷猎者重新利用,作为定位他们想捕捉并在黑市上出售的动物的工具。在设计应用程序时考虑这些潜在的“离标”用途至关重要,因为风险可能非常高,超过产品潜在的好处。
疏忽的成本
使用人工智能的技术通常设计为深度融入我们的世界,塑造我们与家庭、工作场所、企业、政府及彼此之间的日常互动。这意味着这些系统的失败可能对人们产生深远影响。
本书中没有足够空间对这种情况进行详尽讨论,但这里列举了几个例子:
因疏忽而导致的违规行为
医疗硬件可能会误诊患者,影响其治疗。
监控设备可能会导致不同群体的人遭受更多执法行动,导致司法不公。
教育玩具对某些儿童的表现可能更好,而对其他儿童则可能减少学习机会的获取。
安全设备可能由于未经不同用户群体测试而失效,导致身体受伤。
未加保护的设备可能被犯罪分子利用,促进犯罪活动。
故意的伦理违规行为
强大的 AI 监控可能影响个人隐私。
智能传感器可能被偷猎者用来瞄准濒危野生动物。
装备了边缘 AI 的武器可能增加冲突死亡,并扰乱全球权力平衡。
缓解社会危害
本书提供的框架将鼓励您在开发过程中花时间理解您正在构建的东西的社会影响,并基于您的研究结果作出前进/暂停决策。负责任的设计非常依赖于具体的背景,应该系统和持续地减少社会危害,以确保您走在正确的道路上。
构建负责任人工智能应用的最佳实践是组建一个具有技术专长和生活经验多元化观点的产品团队。人类偏见会放大技术偏见,而多元化团队不太可能在他们的集体世界观中存在盲点。如果您的团队很小,重视多样性需要预算时间和金钱,并与更广泛的社区联系,寻找愿意帮助评估您的想法并提供反馈的人,以增加他们的观点。
没有办法对系统的“道德性”进行基准测试。⁷ 相反,我们需要了解支撑系统创建的价值观,包括这些价值观属于谁,以及它们在哪种情境下打算适用。这种意识使我们能够将我们的工作塑造成有益而不是有害的产品。
存在各种公司和服务来帮助指导团队负责任地开发人工智能,或者审计现有的应用程序以防潜在的危害。如果您担心您的工作会被用于有害的“离标使用”,那么您也可以利用一些法律工具。负责任 AI 许可证(RAIL)是设计用来帮助开发人员限制人工智能产品在有害应用中的法律使用的技术许可证。
通过将 RAIL 附加到他们的产品上,开发人员创造了在特定应用列表中阻止其被滥用的法律依据,这可以扩展到包括开发人员希望包括的任何类别。一些默认禁止选项包括监视、犯罪预测和生成虚假照片。当然,这仅能防止那些认为自己受法律协议约束的实体进行的不道德使用。
最后,有许多免费的高质量在线资源可供您了解更多有关道德和负责任人工智能的内容,并评估您正在进行的工作。为了帮助您入门,这里有一个简短的列表:
对于当前人工智能原则的详细高级摘要,我们还建议阅读《“原则性人工智能:伦理和基于权利的方法对人工智能原则的映射”》(J. Fjeld 等,Berkman Klein Center 研究出版物,2020 年)的内容(链接)。
总结
在本章中,我们已经对边缘人工智能如何适应我们的世界有了深入理解。我们了解了顶级应用案例、关键优势以及需要应用的关键伦理考虑。
现在我们准备深入了解一些技术细节。在下一章中,我们将了解使边缘人工智能工作的技术。
¹ 我们将很快了解这些内容,在《“条件和启发式”》(链接)中。
² LoRa 是源自“长距离”一词的商标,因为它设计用于长距离、低功耗通信。
³ 该部门的负责人 Anthony Levandowski 因为盗窃知识产权被判处十八个月监禁,这表明伦理问题是一个系统性问题。
⁴ 正如 Adrien Bibal 等人在《“法律要求对机器学习可解释性的影响”》(链接,arXiv,2020 年)中描述的那样。
⁵ 在美国的许多地区,擅自穿越横道是非法的,在这些地区进行了 Uber 实验。
⁶ 机器学习模型具有称为归纳偏差的属性,反映了它们对世界运作方式的内部假设。选择合适的模型非常重要,因为这种归纳偏差是模型工作所必需的。
⁷ Travis LaCroix 和 Alexandra Sasha Luccioni,《“人工智能伦理的‘基准’的元伦理视角”》(链接),arXiv,2022 年。
第三章:边缘 AI 的硬件
现在是时候了解驱动边缘人工智能应用的设备、算法和优化技术了。本章旨在提供该领域最重要的技术要素的广泛概述。通过本章的学习,您将掌握启动边缘人工智能产品高层规划所需的基本组成部分。
传感器、信号和数据源
传感器是为设备提供测量环境并检测人类输入能力的电子组件。它们从极其简单(可信的旧开关和可变电阻器)到令人惊叹的复杂(光探测与测距[LIDAR]和热成像摄像机)不等。传感器为我们的边缘人工智能设备提供了用于做出决策的数据流。
除传感器外,我们的设备还可以利用其他数据源。这些包括数字设备日志、网络数据包和无线电传输等内容。尽管它们起源不同,这些次要数据流可以像 AI 算法的信息来源一样令人兴奋。
不同的传感器以不同的格式提供数据。边缘人工智能应用中常见几种数据格式可概括如下:
时间序列
时间序列数据表示时间内一个或多个值的变化。时间序列可以包含来自同一个物理传感器的多个值,例如,单个传感器组件可能提供温度和湿度的读数。时间序列数据通常通过以特定速率轮询传感器来收集,例如每秒钟某个固定次数,以产生信号。轮询速率称为采样率或频率。通常,会在固定周期内收集单个读数(称为样本),因此两个样本之间的时间间隔始终相同。
其他时间序列可能是非周期性的,这意味着样本不是以恒定的速率收集的。这种情况可能出现在检测特定事件的传感器中,例如,当物体接近一定距离时切换引脚的接近传感器。在这种情况下,通常会捕获事件发生时的确切时间以及传感器值本身。
时间序列可能代表了摘要信息。例如,时间序列可以包括自上一个值以来发生某事的次数。
时间序列数据是边缘人工智能最常见的传感器数据形式。它特别有趣,因为除了传感器值外,信号还包括有关值的时间信息。这在试图理解情况变化时提供了有用的信息。除时间信息外,时间序列数据之所以有价值,是因为它包含了来自同一传感器的多个读数,减少了瞬时异常读数的影响。
时间序列没有典型的频率——它可以从一天一次采样到每秒数百万次采样。
音频
作为时间序列数据的特例,音频信号表示声波在空气中传播时的振荡。它们通常以非常高的频率捕获——每秒数千次。由于听觉是人类的感觉之一,大量的研究和开发致力于使在边缘设备上处理音频数据变得更加容易。
这些技术包括特殊的信号处理算法,使得处理音频数据更加容易,原始形式通常以极高的频率捕获。正如后文所述,音频信号处理非常普遍,以至于很多嵌入式硬件都内置了高效执行此类处理的功能。
边缘 AI 音频处理最广泛的应用之一是语音检测和分类。尽管如此,音频不一定要在人类听觉的频谱内。边缘 AI 设备使用的传感器可以潜在地捕捉超声(高于人类听觉范围的)和次声(低于人类听觉范围的)数据。
图像
图像是表示传感器采集到的整个场景测量数据,而不是单个点的数据。一些传感器,如摄像头,使用一组微小元素一次性捕获整个场景的数据。其他传感器,如激光雷达(LIDAR),通过机械扫描单个传感器元素在一段时间内横跨场景来构建图像。
图像具有两个或更多维度。在典型情况下,它们可以被视为一个“像素”网格,其中每个像素的值代表空间中相应点的某些场景属性。一个基本示例显示在图 3-1 的左侧。网格的大小(例如,96x96 像素)被称为图像的分辨率。
一个像素可能有多个值或通道。例如,灰度图像每个像素只有一个值,表示像素的明暗程度,而彩色图像每个像素可能有三个值(在 RGB 模型中),代表三种颜色(红色、绿色和蓝色),可以混合表示可见光谱中的任何其他颜色。这种结构显示在图 3-1 的右侧。

图 3-1. 左侧的图表示单通道图像的像素;右侧的图表示三通道图像的结构,如 RGB 照片
作为n维网格的典型图像表示意味着它们包含有关场景中不同方面的相对接近程度的空间信息。这些信息对于理解场景中包含的内容非常有价值。有整个类别的图像处理和计算机视觉算法利用这些信息。
图像不一定要表示可见光,甚至根本不是光。它们可以表示红外光(通常用于测量场景中部分区域的温度),飞行时间(如激光雷达的情况,它测量光线从场景的每个部分反射回来所需的时间),甚至无线电波(考虑由射电望远镜收集的数据,或雷达屏幕上的数据)。
视频
技术上来说,视频是时间序列数据的另一个特殊案例,因其独特的实用性而值得单独分类。视频是一系列图像,每个图像代表某一时间点场景的快照。作为时间序列,视频具有采样率——尽管在视频的情况下,它通常被称为帧率,因为序列中的每个单独图像称为帧。
视频是一种非常丰富的格式——它既包含空间信息(在每一帧内)又包含时间信息(在每一帧之间)。这种丰富性意味着它倾向于占用大量内存,因此通常需要更强大的计算设备。
传感器和信号类型
在市场上有数千种不同类型的传感器。一个良好的分组方式是根据它们的模态。根据卡耐基梅隆大学的定义,模态指的是某事发生或被经历的方式。从人类的视角来看,我们的视觉、听觉或触觉都有不同的模态。
没有严格定义的传感器模态列表,描述它们的最佳方式可能因行业和应用而异。在接下来的部分中,我们将从广义边缘人工智能的角度探讨一些合理的分组:
-
声学和振动
-
视觉和场景
-
运动和位置
-
力和触觉
-
光学、电磁和辐射
-
环境、生物和化学
边缘设备还可以利用许多非传感器数据源——我们也将讨论这些。
声学和振动
“听到”振动的能力使得边缘人工智能设备能够检测到远处运动、振动以及人类和动物的通信效果。这是通过声学传感器完成的,它们测量通过介质传播的振动效应,这些介质可能从空气(如麦克风中的空气)到水(水听器)甚至地面(地听器和地震仪)。

图 3-2。一个表面贴装微机电系统(MEMS)麦克风的 3D 渲染,它存在于许多现代产品中
声学传感器通常提供描述其介质中压力变化的时间序列。声学信号包含各种频率的信息,例如歌声的高音和低音。声学传感器通常在特定频率范围内工作,并且甚至在该范围内也可能对频率没有线性响应。
除了其非线性频率响应之外,声学传感器捕捉高频率的能力取决于其采样率。要准确捕捉高频信号,声学传感器必须具备足够高的采样率。在构建用于声学的边缘 AI 应用时,确保理解您试图测量的信号的特性,并选择适合的传感器硬件。
视觉和场景
在边缘 AI 应用中,通常需要 passively 了解周围的环境,而无需触摸它。用于此任务的最常见传感器是图像传感器,从小型低功耗摄像头(如图 3-3 所示)到超高质量的多兆像素传感器不一而足。如前所述,从图像传感器获得的图像被表示为像素值的数组。

图 3-3。一个微小的图像传感器,这种类型的尺寸可能在嵌入式设备中使用
图像传感器使用传感器元素的网格来捕捉光线。在相机中,场景中的光线通过镜头聚焦到传感器上。相机可以成像的区域称为其视场,它取决于镜头和图像传感器的大小。
图像传感器的一些常见变体:
色彩通道
对于可见光,传感器通常可以以灰度或颜色(红色、绿色和蓝色,即 RGB)捕捉数据。
光谱响应
图像传感器对光的波长敏感,可能超出人类视觉的范围。这甚至可能包括红外辐射,使得被称为热成像相机的传感器能够“看到”热量。
像素大小
较大的传感器可以每像素捕获更多的光线,增加其灵敏度。
传感器分辨率
传感器上的元素越多,它能够捕捉的细节就越丰富。
帧率
传感器能够捕捉图像的频率,通常以每秒帧数表示。
由于有时需要对场景进行照明,常见做法是将图像传感器与光发射器配对——包括可见光和不可见光谱的范围。例如,红外 LED 可以与红外敏感相机配对,用于照亮黑暗场景,而不会用可见光打扰人类或动物。
更大、更高分辨率的传感器通常需要更多能量。高分辨率传感器产生大量数据,在较小的边缘 AI 设备上处理可能会很困难。
一个相对较新的图像传感器群体被称为事件摄像机,工作方式略有不同。它们不是以特定帧率捕获整个视野,而是摄像头中的每个像素单独响应亮度变化,但如果没有发生任何事情,则保持沉默。其结果是一系列单个像素变化的时间序列,比较容易让边缘 AI 设备处理,而不是大量的完整帧序列。
另一种有趣的图像传感器称为距离成像传感器。这些传感器允许设备以三维方式成像其周围环境——通常是通过发射光并测量光线反射回来的时间来实现,这种技术称为“飞行时间”。常见的飞行时间传感器技术称为激光雷达(LIDAR)。激光雷达传感器通过扫描周围的环境,测量光线反射回传感器的量来工作。这使它们能够以三维方式可视化一个区域,如图 3-4 所示。

图 3-4。这张来自PandaSet开源 LIDAR 数据集的图像显示了一个典型的 LIDAR“点云”,在 3D 可视化中,每个点代表激光测量到的距离;右上角的插图显示了同一场景从图像传感器视角的视图。
激光雷达和其他飞行时间传感器通常比标准图像传感器大得多、更复杂、更昂贵和能量密集。它们产生的大量数据可能难以在边缘设备上处理和存储,这也限制了它们的实用性。激光雷达通常用于制图环境——包括帮助自动驾驶车辆导航世界。
雷达,即无线电探测和测距,偶尔也被边缘设备用来理解三维空间中周围物体的位置,潜在地可以达到长距离。与激光雷达类似,雷达也复杂且能量消耗高——但如果您的使用情况需要,它绝对是一个选择。
运动与位置
对于边缘 AI 设备来说,了解它们所处的位置以及可能前往的位置非常有用。幸运的是,有许多不同类型的传感器可以帮助实现这一点。这是一个广泛的类别,从最简单的(机械倾斜开关)到最复杂的(卫星启用的 GPS[全球定位系统])。总体而言,它们使设备能够理解其在世界中的位置和运动。
这是边缘 AI 应用的典型运动和位置传感器列表:
倾斜传感器
一个机械开关,根据其方向是开还是关。超便宜且易于使用。
加速度计
测量物体沿一个或多个轴的加速度(随时间变化的速度变化),通常在高频率下进行。加速度计是运动感测的瑞士军刀,用于识别从智能手表中的体育活动的特征运动到工业设备中的振动(用于预测性维护)。它们还能通过重力的拉力始终知道下方方向。
陀螺仪
测量物体旋转的速率。通常与加速度计配对,以给出物体在三维空间中运动的图像。
旋转或线性编码器
测量轴或轴承(旋转)或线性机制(例如喷墨打印机头部位置)的确切位置。在机器人学中经常用于捕捉机器人的轮子、肢体和其他附属物的位置。
飞行时间
使用电磁发射(光或无线电)测量传感器到其直线视野内任何物体的距离的传感器。
实时定位系统(RTLS)
使用固定位置周围的多个发射器在建筑物或场地中跟踪个别物体(例如仓库中的托盘)位置的系统。
惯性测量单元(IMU)
使用多个传感器近似设备当前位置的系统,基于其从内部参考框架测量的运动(而不是使用 GPS 等外部信号)。
全球定位系统(GPS)
使用卫星的无源系统,以确定设备的位置,精确到几米。需要设备到多个卫星的视线。
运动和位置通常表示为传感器读数的时间序列。考虑到该类别中的传感器类型数量,对于每个成本和能源预算都有选项。通常情况下,需要绝对位置的置信度越高,涉及的成本和复杂性就越大。
力量和触觉
从开关到载荷传感器,力量和触觉传感器帮助边缘人工智能设备测量其环境的物理特性。它们有助于促进用户交互,理解液体和气体的流动,或者测量物体的机械应变。
以下是一些典型的力量和触觉传感器:
按钮和开关
传统开关用作人机交互的简单按钮,同时也作为传感器,提供二进制信号,指示设备何时与某物体碰撞。
电容触摸传感器
测量导电物体(如人类手指)触摸表面的面积。这就是现代触摸屏的工作原理。
应变片和弯曲传感器
测量物体变形程度的传感器,这对于检测物体损坏和制造触觉人机界面设备非常有趣。
载荷传感器
测量施加在它们上面的精确物理负荷量。它们有各种尺寸,从微小的(用于测量小物体的重量)到巨大的(用于测量桥梁和摩天大楼中的应变)。
流量传感器
设计用于测量液体和气体(如管道中的水)的流速。
压力传感器
用于测量气体或液体的压力,无论是环境中的(如大气压力)还是系统内部的(如汽车轮胎内部)。
力和触觉传感器通常简单、能耗低且易于操作。它们的测量结果易于表示为时间序列。在构建触觉用户界面或检测机器人(或其他可以移动的设备)碰撞时特别有用。
光学、电磁和辐射
该类别包括设计用于测量电磁辐射、磁场和高能粒子的传感器,以及测量电流和电压等基本电性质。这听起来可能有些奇特,但它包括像测量光的颜色这样熟悉的事物。
这里是一些典型的光学、电磁和辐射传感器:
光传感器
一类传感器,可以检测人眼可见和不可见的各种波长的光。这对于许多事物都很有用,从测量环境光水平到检测光束被阻断时都适用。
颜色传感器
使用光传感器测量表面的精确颜色,这对识别不同类型的物体很有帮助。
光谱传感器
使用光传感器测量材料对各种波长的光的吸收和反射方式,使得边缘人工智能系统能够洞察它们的组成。
磁强计
测量磁场的强度和方向。磁强计的一个子类是数字罗盘,可以指示北方的方向。
感应式接近传感器
使用电磁场检测附近的金属。常用于交通监控中检测车辆。
电磁场(EMF)计
测量电磁场的强度。这包括工业设备无意中发射的电磁场,或者由无线电发射器故意发射的电磁场。
电流传感器
测量电流通过导体的流动量。这对于监控工业设备很有用,因为电流的波动可以提供有关设备运行情况的信息。
电压传感器
测量物体上的电压量。
半导体探测器
测量电离辐射,由极快速运动的粒子组成,通常由放射性物质衰变产生。
与许多其他传感器一样,该类别通常提供一系列测量。虽然对于测量环境条件非常有用,但在这里描述的传感器也可以在检测有意通过设备产生的排放的安排中发挥作用。例如,光传感器可以与走廊另一侧的光发射器配对,以检测某人是否经过。
环境、生物和化学
包括许多不同类型传感器的宽泛类别;环境、生物和化学传感使得边缘人工智能设备可以嗅探其周围世界的组成。一些常见类型的传感器包括:
温度传感器
测量设备本身或远处红外辐射源的温度。
气体传感器
存在许多不同的传感器来测量不同气体的浓度。常见的气体传感器包括湿度传感器(用于测量水蒸气)、挥发性有机化合物(VOC)传感器(用于测量常见有机化合物的一部分)和二氧化碳传感器。
颗粒物传感器
测量空气样品中微小颗粒的浓度,并广泛用于监测污染水平。
生物信号传感器
涵盖生物体内存在的各种信号范围,例如测量人类心脏(心电图)和大脑(脑电图)的电活动。
化学传感器
存在许多不同的传感器可用于测量特定化学物质的存在或浓度。
这类传感器通常提供一系列时间序列读数。由于它们需要与环境进行化学和物理交互,有时会难以使用,例如通常需要校准以对已知量的化学物质进行校准,有时传感器需要热身时间才能获取可靠的读数。环境传感器随时间可能会逐渐退化并需要更换是很常见的。
其他信号
除了从物理世界收集信号外,许多边缘人工智能设备还可以访问丰富的虚拟数据流。这些数据大致可以分为两组:内省数据,关于设备本身状态的信息;外省数据,关于设备连接的系统和网络的信息。
根据设备的不同,可能会提供各种类型的内部状态。这些可能包括:
设备日志
自设备上电以来跟踪设备的生命周期。这可能提供关于许多不同事物的信息:配置更改、工作周期、中断、错误或您选择记录的其他任何内容。
内部资源利用率
这可能包括可用内存、功耗、时钟速度、操作系统资源以及外设的使用。
通信
设备可以跟踪其物理连接、无线通信、网络配置和活动,以及产生的能量使用情况。
内部传感器
一些设备具有内部传感器;例如,许多系统芯片设备包括温度传感器来监控其 CPU。
内省数据的一个有趣用途是延长电池寿命。锂可充电电池如果持续保持在 100%充电状态可能会损失容量。苹果的 iPhone 使用边缘 AI 功能称为优化电池充电,以避免这个问题。它使用设备上的机器学习模型学习用户的充电习惯,然后利用这个模型最大程度地减少电池充满的时间,同时确保用户需要时电池仍然充好电。
外部数据流,来自设备外部的数据,可能包含丰富的信息。以下是一些可能的来源:
来自连接系统的数据
在网络中部署边缘 AI 设备很常见,邻近设备转发的数据可以作为 AI 算法的输入。例如,物联网网关可以利用边缘 AI 处理并基于其节点收集的数据做出决策。
远程命令
边缘 AI 设备可能会接收来自另一个系统或用户的控制指令。例如,无人机的用户可以请求其移动到三维空间中的特定坐标。
来自 API 的数据
边缘 AI 设备可以向远程服务器请求数据,以供其算法使用。例如,配备边缘 AI 的家庭供暖系统可以向在线 API 请求天气预报数据,并利用这些信息来决定何时开启供暖。
网络数据
这可能包括网络结构、路由信息、网络活动,甚至数据包的内容。
一些最有趣的边缘 AI 系统同时利用所有这些数据流。想象一下,一个农业技术系统帮助农民照顾作物。它可能包括远程田间传感器、连接重要在线数据源(如天气预报或化肥价格)以及农民使用的控制界面。作为边缘 AI 系统,它潜在地可以在没有互联网连接的情况下运行,但如果有互联网连接,它可以利用宝贵的信息。
在更复杂的系统架构中,边缘 AI 还可以与服务器端 AI 很好地配对;我们稍后将在本章学习更多相关内容。
边缘 AI 处理器
边缘 AI 最令人兴奋的部分之一是应用可以利用的庞大而不断增长的硬件阵列。在本节中,我们将探讨硬件的高级类别,并了解每种硬件适合特定的领域。
我们正处于边缘 AI 硬件的寒武纪爆发期,因此自本书出版以来,可能已经有更多选项。从便宜的低功耗微控制器(所谓的“薄边缘”设备)到基于 GPU 的高速加速器和边缘服务器(称为“厚边缘”),开发者可以找到几乎适用于任何应用的硬件。
边缘 AI 硬件架构
硬件系统的架构是其组件相互连接的方式。图 3-5 展示了边缘设备的典型硬件架构。

图 3-5. 边缘设备的架构
设备的核心是应用处理器。这是协调应用程序的通用处理器,并默认运行构成其程序的所有算法和逻辑。
在许多情况下,应用处理器将具有集成的协处理器:内置的额外硬件,高效执行某些计算。例如,许多处理器具有内置的浮点单元(FPU),设计用于快速执行浮点计算。中高端的微控制器越来越多地集成了可加速边缘 AI 相关函数的硬件,如数字信号处理和线性代数。
应用处理器还集成了易失性存储器(如 RAM),在程序执行期间用作工作内存。尽管如此,通常还会有额外的 RAM,它是外部于处理器本身并存在于独立芯片上。
RAM 是非常快速的内存,但它消耗大量能量,并且在设备关闭时其内容会丢失。它非常昂贵,占据大量物理空间,因此通常是非常有限的资源。
应用处理器连接到非易失性存储器,通常称为 ROM(只读存储器)或闪存,² 它可以类似地位于芯片内或芯片外(在图 3-5 中显示为芯片外)。非易失性存储器用于存储不经常更改且在系统关闭时需要保留的内容。这可能包括软件程序、用户配置和机器学习模型。读取速度慢,写入速度极其缓慢。
许多设计还包含离散协处理器。类似于集成协处理器,这些协处理器存在于芯片外,旨在为特定目的执行快速高效的数学运算。与集成协处理器不同,它们位于芯片外。它们可能比应用处理器更强大(也更耗电),例如,低功耗 SoC 可能与强大的 GPU 组合使用。
处理器的外设通过各种标准提供其与世界其他部分的接口。³ 最常见的外设用于连接传感器和网络硬件。
微控制器和数字信号处理器
可以有令人信服的论点认为,微控制器是我们现代世界的基础。它们是从汽车发动机到智能家电的一切的微小廉价计算机。微控制器的生产量惊人;预计 2022 年将有268.9 亿个运输——这相当于地球上每个人的三分之一。
微控制器(MCUs)
微控制器通常被称为 MCUs,即微控制器单元的缩写。
微控制器通常用于单一用途的应用,如控制机械设备。这意味着它们可以比需要运行多个程序的其他类型的计算机简单得多,例如,它们通常不使用操作系统。
相反,它们的软件(称为固件)直接在硬件上运行,并包含驱动任何外设所需的低级指令。⁴ 这可能会使微控制器的软件工程变得非常具有挑战性,但它确实使开发人员在程序运行时对发生的情况有更多的控制。
微控制器的一个显著特点是它们的大部分组件都实现在一块硅片上;这是它们相对低成本的关键。除了处理器外,微控制器通常配备有闪存(用于存储程序和其他有用数据)、RAM(用于在程序执行期间存储状态)以及各种用于通过数字或模拟信号与其他设备(如传感器)通信的技术。
微控制器的世界非常多样化——它们如此宝贵的部分原因是它们可在各种变体中使用,以适应几乎所有可能的情况。在本书的目的下,我们将它们分为三大类:低端、高端和数字信号处理器。
低端 MCUs
许多微控制器单元(MCUs)专为低成本、小尺寸和高能效而设计。这种权衡是它们具有有限的计算资源和能力。以下是一些典型的规格:
-
4 位到 16 位架构
-
<100 MHz 的时钟速度
-
2 KB 到 64 KB 的闪存内存
-
64 字节到 2 KB 的 RAM
-
数字输入和输出
-
电流消耗:运行时单位电流在~1.5–5 伏特之间,单位电流为几毫安,等待输入时的单位电流为微安级别
-
成本:大量采购时每个单位一到两美元
许多今天使用的低端 MCU 基于自 1980 年代以来使用的设计。⁵ 尽管技术不断改进,但始终有简单、低成本和低功耗硬件的需求,因此这些芯片仍然存在。它们在许多行业中极为普遍。
低端 MCU 在边缘 AI 方面有一些显著的劣势。由于缺乏内存和计算能力,它们不适合处理大量数据或复杂信号处理。它们通常没有任何浮点算术的硬件实现,这意味着涉及有理数的计算可能会非常缓慢。这些特性限制了它们能够运行的边缘 AI 算法类型。
低端 MCU 的典型应用利用了它们的优势:高可靠性的汽车和医疗设备,以及低成本的家电、小工具和基础设施。一个流行的低端 MCU 是Atmel 8 位 AVR 平台。尽管它们是 MCU 世界的重要组成部分,但由于计算能力有限,低端 MCU 可能不是你在边缘 AI 应用中的首选目标。
尽管如此,正如我们在本书第一节中提到的那样,边缘 AI 程序并不总是需要大量计算。低端 MCU 完全能够运行复杂的条件逻辑,这可能已经足够你所需。它们还可以作为联网设备网络的一部分,利用边缘 AI —— 例如,低端 MCU 可以捕获传感器数据并将其传递给更复杂的设备进行决策。
高端 MCU
在 MCU 光谱的另一端,今天最强大的微控制器已经具备了足以与上世纪九十年代的个人计算机匹敌的计算能力。在许多情况下,它们仍然能够高效节能。以下是一些典型规格:
-
32 位架构
-
<1000 MHz 时钟速度
-
16 KB 到 2 MB 的闪存
-
2 KB 到 1 MB 的 RAM
-
可选硬件支持更快的数学运算
-
浮点单元(FPU)
-
单指令多数据(SIMD)指令
-
可选多处理器核心
-
数字和模拟输入输出
-
电流消耗:在约 1.5–5 伏特时,从低至几毫安到高达几十毫安;休眠时为微安级
-
成本:每单位从几美元到几十美元不等
高端 MCU 通过更快的时钟速度和 32 位架构显著提高了性能。⁶ 此外,许多 MCU 型号具有硬件支持的一些巧妙技巧,可以增加计算速度。其中之一是 SIMD,允许处理器并行运行多个计算 —— 在运行信号处理和机器学习应用时,这可能非常有帮助。
越来越多的高端 MCU 设计时考虑到边缘 AI 应用。厂商通常提供软件和库,帮助优化设备上高效运行边缘 AI 代码。另一个重要的好处是提供更大量的闪存和 RAM——这对于处理数据和存储大型机器学习模型非常有帮助。
高端 MCU 被广泛应用于从传感和物联网到数字设备、智能家电和可穿戴设备的各种用例中。在撰写本文时,它们代表了嵌入式机器学习的成本、能耗和计算能力的最佳选择。它们具有足够的能力来运行功能强大的深度学习模型——包括可以处理视觉信息的深度学习模型——但它们仍然足够简单,可以非常廉价地嵌入到各种应用中。
基于Arm Cortex-M 核心的微控制器非常受欢迎,例如Nordic nRF52840和STMicroelectronics STM32H743VI。还有基于RISC-V架构的热门选择,例如Expressif ESP32。
随着边缘 AI 的重要性增加,将通用高端微控制器与专为加速深度学习工作负载而设计的专用协处理器配对,正在变得越来越普遍。我们将在“深度学习加速器”中详细介绍这一点。
性能特征
一般的高端微控制器可以几乎实时地处理音频,并且可以以每帧约一秒的速度处理低分辨率视频。
数字信号处理器(DSP)
一个有趣的子类别,DSP 是专门设计为高效转换数字信号的特殊微控制器。它们的架构设计不是为了通用计算,而是尽可能快地运行特定的算法和数学运算,包括乘积累加和傅里叶变换,我们将在第四章中遇到。
幸运的是,这些数学运算中的许多都对边缘 AI 非常有帮助,无论是用于处理数据还是运行机器学习模型。这使得 DSP 成为一个有价值的工具。DSP 的缺点在于它们不是为通用计算而设计的,这意味着它们可能不适合运行应用程序中非边缘 AI 部分的任务。
如今的高端 MCU 通常具备一些 DSP 的特性,例如 SIMD 指令,可以帮助增加信号处理任务的吞吐量——事实上,一些被描述为“数字信号控制器”,以突出这些能力。然而,专用的 DSP 仍然非常有用。例如,许多包含语音助手(如 Google 助手)的智能手机在 DSP 芯片中运行始终开启的关键词识别模型,而不影响电池寿命。
片上系统(SoC)
在微控制器之后,边缘计算的下一个最常见形式是片上系统(SoC)设备。而微控制器是一个经过削减和优化的计算机版本,SoC 设备则试图将整个传统计算机系统的所有功能都压缩到一个芯片中。
不同于微控制器,其软件直接与硬件交互,SoC 设备运行传统操作系统,这些操作系统将大部分硬件抽象化,使开发者完全可以专注于他们的应用程序代码。开发者可以使用与编写服务器和桌面应用程序相同的工具和环境,包括 Python 等高级语言(现代微控制器通常使用 C 或 C++进行编程)。
使用这种易用性有两个成本:效率和复杂性。通常情况下,SoC 比微控制器能耗高得多,这限制了它们的应用领域。它们的能效比仍然比传统的分离外设计算机系统高一个数量级,但在能源使用方面远不及微控制器。这种额外的能源使用可能还会引入热管理问题。
操作系统带来的额外复杂性是 SoC 设备的另一个负担。大量操作系统代码与开发者的应用程序一起运行,这使得在现场保证可靠性变得更加困难。
SoC 往往比微控制器功能更强大,拥有更多特性。以下是一些典型的统计数据:
-
64 位架构
-
1 GHz 的时钟速度
-
多核处理器
-
外部 RAM 和闪存(通常多个千兆字节)
-
2D 或 3D 图形处理单元
-
无线网络
-
高性能数字输入和输出
-
电流消耗:在约 5 伏特下数百毫安
-
成本:每个单位数十美元
性能特征
一般的 SoC 可以以接近实时的方式处理音频和高分辨率视频,使用深度学习技术。
尽管比微控制器效率低得多,SoC 已经带来了革命性的变化。它们允许一台功能强大的通用计算机以极小的形态因子部署。在现代世界中,SoC 无处不在——它们驱动着我们的手机、电视、汽车娱乐系统、工业硬件、安全系统、物联网网关以及几乎所有需要小型计算能力的设备。
它们的强大、灵活性和易用性使它们在边缘人工智能领域尤为重要。开发者可以使用熟悉的工具开发应用程序,这些应用程序运行在 SoC 上,并且拥有足够的内存和处理能力来运行复杂的算法,例如相对较大的深度学习模型。几乎没有哪种边缘人工智能算法不能在 SoC 上运行。易用性使得 SoC 成为原型化边缘人工智能应用程序的绝佳选择,即使最终目标是迁移到更便宜或更高效的硬件上。
知名的 SoC 产品包括高通骁龙和博通 BCM58712,后者被用于树莓派开发板(见侧边栏“Boards and Devices”)。许多流行的 SoC 基于Arm Cortex-A处理器核心。
嵌入式 Linux
Linux 已经成为 SoC 设备非常普遍的操作系统选择。它是开源的,这意味着可以免费使用,并且有很多社区支持。能够使用熟悉的 Unix 开发工具使具有 Unix 经验的人轻松处理嵌入式 Linux 系统。
深度学习加速器
微控制器和 SoC 通常是通用计算机,它们被设计为尽可能灵活。然而,如果你愿意牺牲一些灵活性,设计能够非常快速运行某些操作的集成电路是可能的。
随着深度学习的出现(见“Deep learning”),在嵌入式设备上,半导体公司已经开始生产可以与微控制器和 SoC 配对的加速器,以使深度学习模型运行更快更高效。深度学习的数学基础是线性代数,因此深度学习加速器,也被称为神经处理单元(NPUs),旨在高效执行线性代数运算。
深度学习加速器有各种类型,它们在能源使用和灵活性之间有自己的权衡。在光谱的一端,像Syntiant 的 NDP10x 系列这样的设备具有特定深度学习模型架构的硬件实现(稍后我们将学到更多),可以快速运行,能效极佳。由于算法本身已经融入硅中,这些设备并不十分灵活,但能效非常高。
在光谱的另一端,基于图形处理单元(GPU)技术的设备,如Nvidia 的 Jetson和Google 的 Coral,提供了巨大的灵活性,可以运行基本上任何类型的深度学习模型。这种灵活性的权衡是它们远不及能源效率高。
在这两端之间,有许多不同类型的设备,具有不同程度的灵活性和效率,比如Syntiant 的 NDP120或Arm 的 Ethos-U55设计。
某些类型的加速器使用了传统深度学习数学的替代方法。例如,BrainChip 的 Akida,描述为神经形态处理器,采用脉冲神经网络(见“Compression and optimization”)提供了一组独特的权衡,包括更高的能效。
性能特征
深度学习加速器往往速度极快 —— 您可以期待足够的计算能力以实时处理音频和视频。某些设备甚至可以并行处理多个流。
一般来说,深度学习加速器通常与微控制器或 SoC 配对使用。传统处理器运行应用逻辑,而加速器则运行深度学习工作负载。许多设计将微处理器和加速器合并在一个单一封装中,并提供特殊工具帮助开发人员在它们之间分配处理任务。
初期的深度学习加速器对支持的深度学习模型类型几乎没有选择自由度,但随着领域的成熟,设备变得越来越灵活。我们仍处于非常早期阶段,因此您可以预期随着时间的推移将实现巨大的进步和效率提升。从长远来看,预计能够在微小的电力预算下运行多年的实时视频处理或语言转录,将拥有异常强大的设备。
FPGA 和 ASIC
要获得最佳的性能和效率优势,设计自己的处理器电路是一种选择。这是困难、耗时和昂贵的,因此不容忽视,但对于某些应用可能是有意义的。
可编程门阵列(FPGAs)是可以根据需求重新编程的硅集成电路,用于实现定制的硬件设计。它们允许工程师创建一个实现特定算法尽可能高效的定制处理器设计,然后将其加载到设备上进行部署。设计使用特殊的硬件描述语言(HDL)编写。
专用集成电路(ASICs)是针对特定应用定制的集成电路。与 FPGAs 不同,它们无法重新编程 —— 它们的逻辑被永久写入硅中。您可以购买为特定目的设计的预设计 ASIC,如Himax’s WE-I Plus,或自行设计。
与 ASIC 相比,使用 FPGA 进行开发成本大幅降低,但每个设备的成本更高,以及功耗也更高。公司通常用 FPGA 进行原型设计或小批量生产,而用 ASIC 进行大批量生产。创建 ASIC 的工程成本使它们对大多数公司来说难以企及。
FPGA 开发工具的使用变得更加简单和可访问,但它们在边缘 AI 领域仍然是相对小众的选择。研究人员正在开发能够自动将深度学习模型转换为高效 FPGA 实现的工具,因此随着时间的推移,FPGA 在边缘 AI 中可能会扮演越来越重要的角色。以下是一些当前领域内的有趣项目:
-
谷歌的CFU Playground,帮助开发人员使用 FPGA 创建深度学习加速器
-
Tensil.ai,一款用于 FPGA 的机器学习模型编译器和硬件生成器
边缘服务器
与定制硅相对的另一端,可以在网络边缘运行传统服务器硬件,这些硬件可能与数据中心部署的相同。这些强大的计算机运行全面的服务器操作系统(通常为 Linux 或 Windows),可以像任何其他云服务器一样对待。如果它们具有 AI 特定的加速能力,很可能是通过 GPU 实现的。一些边缘服务器以适合工业环境(如工厂车间)的坚固形式因子出售,而不是数据中心中常见的形式。
边缘服务器的强大意味着它们可以在保持数据在现场的安全、隐私和便利性的同时,提供许多云计算的好处。对于一些应用程序来说,它们可以兼具高性能硬件、低延迟、减少数据泄露风险以及经济使用带宽的优势。
边缘服务器的另一个好处是它们基本上可以被视为标准 IT 基础设施的一部分。这意味着它们可以很好地融入现有 IT 部门的程序和技能。事实上,不久前所有商业计算都是使用本地服务器完成的。边缘计算曾经是每个企业的标准。
边缘服务器有两个主要缺点:它们消耗大量能源,并且体积很大。如果你需要大量计算资源便捷地位于现场,这些权衡可能是值得的。然而,它们通常限于建筑物和工厂等固定位置,那里有多余的空间和可靠的电源供应。
如果全尺寸的边缘服务器对你的应用程序来说感觉过于强大(它们可能确实如此),Linux SoCs 提供了一个很好的折衷方案。作为标准 Linux 盒子,IT 部门可以像对待任何其他服务器一样对待它们——但它们以微小、节能的形式提供。
多设备架构
边缘人工智能应用并不总是直接在承载实际传感器的设备上实现。有时,使用多设备架构是有道理的。例如,安装在货车上的网关设备可能会使用低功耗无线电将来自一组运输托盘的数据报告回来。网关设备对能源使用的约束较少,并能洞察多个托盘的数据,可以运行复杂的边缘人工智能逻辑来做出数据决策。图 3-8 展示了这种情况可能的外观。

图 3-8. 常见的架构涉及多个设备
在异构计算中,情况可能变得更加复杂(见侧栏“异构计算”)。单个设备可能包含多种类型的处理器:例如,一个用于运行应用程序代码,另一个用于运行 ML 算法。完整系统可能由许多设备组成,一些设备有多个处理器,在需要时在许多不同点收集和处理数据,具体取决于需要哪些优势。这种解决方案甚至可能涉及云计算。
一个很好的例子是带有语音助手的智能音箱这种架构类型。通常,它们至少有两个处理器。第一个是低功耗的常开芯片,运行 DSP 和机器学习模型,以便在不消耗太多能量的情况下监听唤醒词。
第二个是应用处理器,当常开芯片检测到唤醒词时被唤醒。应用处理器可能会运行更复杂的模型,以便捕捉任何通过常开芯片的误报。这两个处理器共同可以识别唤醒词,而不会通过流式传输私人对话到云端侵犯用户隐私。
一旦确认唤醒词,应用处理器将音频流式传输到云服务器,进行语音识别和自然语言处理,以生成适当的响应。整体流程如图 3-9 所示。

图 3-9。低功耗处理器旨在尽可能捕捉多个潜在的关键词;应用处理器被唤醒以评估任何可能的匹配,并在确认匹配后调用云网络服务。
在设计系统时,不要害怕考虑使用多个设备来解决不同设备类型所涉及的权衡问题。在一些常见情况下,这可能会很有帮助:
-
监控大量个体实体:如果每个实体都使用高端 AI 能力的硬件,成本可能很高。
-
减少能源消耗:传感器由电池供电,需要长时间工作。
-
保护隐私:直接将数据发送到大型设备或云服务器可能违反隐私规范。
-
与旧设备集成:现有传感器或网关可能会被边缘 AI 设备补充,而不是被替换。
设备和工作负载
了解每种类型的设备的功能非常重要。表 3-1 提供了一个快速参考,帮助您分析哪些设备能够处理哪些数据类型。它显示每种数据类型在给定设备上的支持级别:完全、有限或无。
请注意,每个类别都很广泛,每个个体设备都是独特的。并非所有高端 MCU 都相同。还值得注意的是,技术前沿进展迅速,这个参考资料可能很快就会过时!
Table 3-1. 数据类型和设备
| 设备类型 | 低频时间序列 | 高频时间序列 | 音频 | 低分辨率图像 | 高分辨率图像 | 视频 |
|---|---|---|---|---|---|---|
| 低端 MCU | 有限 | 有限 | 无 | 无 | 无 | 无 |
| 高端 MCU | 全部 | 全部 | 全部 | 全部 | 有限 | 有限 |
| 带加速器的高端 MCU | 全部 | 全部 | 全部 | 全部 | 全部 | 有限 |
| DSP | 全部 | 全部 | 全部 | 全部 | 有限 | 有限 |
| SoC | 全部 | 全部 | 全部 | 全部 | 全部 | 全部 |
| 带加速器的 SoC | 全部 | 全部 | 全部 | 全部 | 全部 | 全部 |
| FPGA/ASIC | 全部 | 全部 | 全部 | 全部 | 全部 | 全部 |
| 边缘服务器 | 全部 | 全部 | 全部 | 全部 | 全部 | 全部 |
| 云端 | 全部 | 全部 | 全部 | 全部 | 全部 | 全部 |
总结
本章介绍了承载边缘人工智能的关键硬件及其获取数据的传感器。在下一章中,我们将了解使其运行的算法。
¹ 根据IEEE 754标准描述。
² 尽管闪存可以重新编程,但在嵌入式环境中仍称为 ROM。
³ 诸如 GPIO、I2C、SPI 和 UART 等外围接口在硬件设计中非常重要,但超出本书的范围。大多数现代嵌入式处理器具有良好的外围支持。
⁴ 固件的另一个特点是,与操作系统不同,固件通常不打算由最终用户修改。
⁵ Intel 8051于 1980 年首次开发,并且至今仍在使用。
⁶ 32 位处理器一次可以处理两倍于 16 位处理器的数据量。这意味着数据处理速度更快。同时支持更大容量的 RAM。
第四章:边缘 AI 算法
在边缘 AI 中,有两类重要的算法:特征工程和人工智能。这两种类型都有许多子类别;在本章中,我们将探讨它们的横截面。
目标是从工程角度提供每种算法类型的概述,突出它们的典型用途、优势、劣势以及在边缘硬件部署中的适用性。这将为您在规划实际项目时提供一个起点,我们将在接下来的章节中详细介绍。
特征工程
在数据科学中,特征工程是将原始数据转化为统计工具可用的输入的过程,用于描述和建模情况和过程。特征工程涉及使用您的领域专业知识来理解原始数据的哪些部分包含相关信息,然后从周围的噪音中提取该信号。
从边缘 AI 的角度来看,特征工程关乎将原始传感器数据转化为可用信息。特征工程做得越好,AI 算法在尝试解释它时就会越轻松。在处理传感器数据时,特征工程自然会利用数字信号处理算法。它还可以涉及将数据切分成可管理的块。
处理数据流
正如我们所见,大多数传感器产生时间序列数据。边缘 AI 应用的目标是获取这些时间序列数据流并理解其含义。
管理流的最常见方法是将时间序列切分成块,通常称为窗口,然后逐个分析这些块。¹ 这会产生一系列结果的时间序列,您可以解释以了解正在发生的事情。图 4-1 显示了如何从数据流中获取窗口。

图 4-1. 时间序列通常被分成称为窗口的块,逐个进行分析
处理单个数据块需要一定时间 — 我们可以称之为系统的延迟。这限制了我们可以多频繁地获取和处理数据窗口的次数。我们可以捕获和处理数据的速率称为系统的帧率,通常以每秒可处理的窗口数来表达。帧可以是顺序的,也可以是重叠的,如 图 4-2 所示。

图 4-2. 根据帧率不同,窗口可能会重叠;对包含事件的数据来说,重叠是有利的,因为这增加了整个事件落入窗口内的机会,而不会被截断。
延迟越低,每个时间段内可以分析的数据窗口就越多。你可以进行的分析越多,结果就越可靠。例如,想象我们正在使用机器学习模型来识别一个命令。如果窗口之间的间隔太大,我们可能会错过口头命令的关键部分,无法识别它(见图 4-3)。

图 4-3. 如果帧率过低,信号的某些部分将不会被处理;如果你试图检测短暂事件,这可能意味着某些事件被忽略了。
窗口大小的选择非常重要。窗口越大,处理其中数据所需的时间越长。然而,较大的窗口包含了关于信号的更多信息——这意味着它们可能会使信号处理和 AI 算法的生活变得更轻松。在开发系统时,窗口大小和帧率之间的权衡是需要探索的重要内容。
如后文所述,有许多不同的 AI 算法,其中一些对窗口大小的敏感性较大。有些算法(通常是那些在信号中维护内部记忆的算法)能够在非常小的窗口大小下工作良好,而其他一些则需要较大的窗口大小才能正确解析信号。算法的选择还会影响延迟,这也限制了窗口大小。这是窗口大小、延迟和算法选择之间复杂的权衡系统。
窗口处理也适用于视频流:在这种情况下,视频的每个“窗口”是一定数量的静态图像——通常是一个,但一些 AI 算法有可能同时分析多个图像。
处理数据流的更复杂技术属于数字信号处理范畴。这些技术可以与窗口处理结合使用,以生成供 AI 算法使用的数据。
数字信号处理算法
有数百种不同的信号处理算法可以帮助消化传感器产生的信号。在本节中,我们将介绍一些对边缘 AI 非常重要的 DSP 算法。
重采样
所有时间序列信号都有一个采样率(也称为频率),通常用每秒数据样本数(Hz)来描述。通常需要改变信号的采样率。例如,如果信号产生的数据比你处理它的速度快,可能需要减少信号的速率(称为降采样)。另一方面,如果要方便地与另一个频率较高的信号一起分析,可能需要增加信号的速率(升采样)。
下采样通过“丢弃”一些样本来实现目标频率。例如,如果你丢弃一个 10 Hz(每秒 10 个样本)信号的每一帧,它将成为一个 5 Hz 信号。然而,由于一种称为混叠的现象,以这种方式减少频率可能会导致输出的失真。为了帮助应对这个问题,在进行下采样之前必须删除一些高频信息。这通过低通滤波器来实现,在下一节中描述。
上采样是反向操作——新样本被创建并插入以增加信号的频率。例如,如果在一个 10 Hz 信号中的每个样本后插入一个额外的样本,它将变成一个 20 Hz 信号。困难的部分是知道要插入什么!在两个样本之间的时间内实际上发生了什么是无法知道的,但是可以使用称为插值的技术来用近似值填补空白。
除了时间序列,图像也可以进行上采样和下采样。在这种情况下,增加或减少的是空间分辨率(每幅图像的像素)。像时间序列重采样一样,图像的调整也需要抗混叠或插值技术。
上采样和下采样都很重要,但在边缘人工智能中更常见的是下采样。传感器通常以固定频率产生输出,将其降采样并获得最适合其信号处理流程的频率,这是很典型的做法。
对于边缘人工智能应用程序,如果您希望将两个具有不同频率的信号合并为单一的时间序列,则上采样大多数情况下是有用的。然而,通过对高频信号进行下采样也可以实现这一点,这可能在计算上更便宜。
滤波
数字滤波器是应用于时间序列信号的函数,以特定的方式转换它。存在许多不同类型的滤波器,它们在为边缘人工智能算法准备数据方面非常有用。
低通滤波器旨在允许信号的低频成分通过,同时去除高频成分。滤波器的截止频率描述了高频信号将受到影响的频率,而频率响应描述了这些信号将受到多大影响。
高通滤波器则是相反的操作,允许高于截止频率的频率通过,并减弱(降低)低于截止频率的频率。带通滤波器结合了两者,允许一定带宽内的频率通过,但减弱带外的频率。
在边缘人工智能中,过滤的目的是隔离信号的有用部分,去除不有助于解决问题的部分。例如,语音识别应用可以使用带通滤波器,允许人类语音正常范围内的频率(125 Hz 至 8 kHz),同时拒绝其他频率的信息。这可以使机器学习模型更容易解释语音,而不会被信号中的其他信息分散注意力。
过滤器可以应用于任何类型的数据。例如,如果将低通滤波器应用于图像,则会产生模糊或平滑效果。如果将高通滤波器应用于同一图像,则会“锐化”细节。
一种低通滤波器是移动平均滤波器。给定一个时间序列,它计算在一定窗口内数值的移动平均。除了平滑数据外,它还能使单个数值代表一段时间内的广泛信息。
如果计算并堆叠几个具有不同窗口长度的移动平均值,则信号的瞬时快照(包含几个不同移动平均值的信息)可以描述信号在时间窗口和多个不同频率上的变化。这对于特征工程是一种有用的技术,因为它意味着 AI 算法可以使用相对较少的数据点观察到广泛时间窗口内的信号变化。
过滤是一种非常常见的信号处理操作。许多嵌入式处理器提供对某些类型的过滤的硬件支持,这样可以减少延迟和能量消耗。
频谱分析
时间序列信号可以称为时间域,表示它代表一组变量随时间变化的方式。使用一些常见的数学工具,可以将时间序列信号转换成频率域。通过转换获得的数值描述了信号在不同频段上的分布情况,形成一个频谱。
通过将信号切片成多个窄窗口,然后将每个窗口转换成频率域,如图 4-5 所示,可以创建一个描述信号频率随时间变化的图谱。这个图谱被称为频谱图,是机器学习模型非常有效的输入。

图 4-5. 同一段音频以时间域(顶部)和频率域(底部)表示的波形
频谱图在现实世界的应用中非常常见,特别是在音频领域。将数据分隔成窗口化的频段使得相对简单的模型可以解释它。² 人们甚至可以通过观察频谱图区分单词之间的差异,有些人甚至已经学会了阅读它们。
许多算法可以将信号从时间域转换到频率域,但最常见的是傅立叶变换。这是一个非常常见的操作,并且通常有硬件支持(或至少优化的实现),可用于在嵌入式设备上执行傅立叶变换。
数字信号处理和时间序列分析有大量的算法和技术;它们是工程和研究的主要领域。关于这些主题的一些重要资源包括:
-
《科学家和工程师的数字信号处理指南》,作者 Steven W. Smith(加利福尼亚技术出版社,1997)
-
《实用时间序列分析》,作者 Aileen Nielsen(O’Reilly,2019)
图像特征检测
一整套信号处理算法专注于从图像中提取有用的特征³。这些传统上被称为计算机视觉算法。一些常见的例子包括:
边缘检测
用于识别图像中的边界(见图 4-6)
角点检测
用于发现图像中具有有趣的二维结构的点
斑点检测
用于识别图像中具有共同特征的区域
脊检测
用于识别图像中的曲线

图 4-6. 边缘检测算法可找出不同颜色或强度区域之间的边界。
图像特征检测将一个复杂的大图像减少为其内部存在的视觉结构的更紧凑表示。这可能使下游操作的任何 AI 算法更容易处理。
在处理图像时,不总是需要进行特征检测。通常情况下,深度学习模型能够学习提取特征的方法,减少了预处理的效用。然而,在使用其他类型的边缘 AI 算法解释图像数据时,执行特征检测仍然很常见。
OpenCV 项目提供了一组用于特征检测(以及其他图像处理任务)的库,可在大多数 SoC 设备上运行。对于微控制器,OpenMV提供了一个开源库,其中包含特征检测算法实现以及专为运行它们而设计的硬件。
结合特征和传感器
没有什么能阻止您将几个不同的特征和信号组合作为 AI 算法的输入。例如,您可以计算时间序列的几个移动平均值,并将它们全部传递给机器学习模型。没有硬性规定,所以可以自由实验,并创意性地处理数据。接下来的章节将提供实验框架。
超越从同一信号中组合特征,传感器融合是将来自多个传感器的数据集成的概念。例如,边缘 AI 健身追踪器可以结合来自加速度计、陀螺仪和心率传感器的信息,试图检测佩戴者正在进行的运动。
在更复杂的边缘 AI 场景中,传感器甚至不需要集成在同一设备上。想象一下智能气候控制系统,利用分布在建筑物各处的温度和占用传感器来优化空调使用。
传感器融合分为三类:
补充
多个传感器结合,以提供比单一传感器更全面的情况理解,例如我们假设的健身追踪器上的各种传感器。
竞争
多个传感器测量相同的事物,以减少错误测量的可能性,例如,多个冗余传感器监测关键设备的温度。
合作
多个传感器的信息结合,形成原本不可得的信号,例如,两个摄像头产生立体图像,提供深度信息。
传感器融合面临的挑战在于如何将可能以不同速率发生的多个信号结合起来。您应考虑以下内容:
-
时间信号的对齐。对于许多算法来说,我们打算融合的所有信号以相同的频率采样,并且值反映出同时测量。这可以通过重新采样来实现,例如,将低频信号上采样,使其具有与要融合的高频信号相同的速率。
-
缩放信号。信号的值必须处于相同的尺度上,以防通常具有较大值的信号压倒通常具有较小值的信号。
-
数值上结合信号。可以使用简单的数学运算(加法、乘法或平均值)或更复杂的算法,如卡尔曼滤波器(稍后介绍)来完成此操作,或者简单地将数据连接在一起,并将其作为单个矩阵传递给算法。
您可以在特征工程的其他阶段之前或之后执行传感器融合。举个任意的例子:如果您打算融合两个时间序列,您可以选择先对其中一个运行低通滤波器,然后将它们缩放到相同的尺度,通过平均值将两者组合,并将组合后的值转换为频域。不要害怕尝试!
现在我们有一些处理数据的重要工具。在下一节中,我们将探讨能帮助我们理解数据的 AI 算法。
人工智能算法
有两种思考 AI 算法的方式。一种是基于功能:它们设计做什么?另一种是基于实施:它们如何工作?这两个方面都很重要。功能对于您正在构建的应用至关重要,而实施在考虑约束时很重要——这通常意味着您的数据集和将要部署到的设备。
功能类型的算法
首先,让我们从功能角度看最重要的算法类型。将您试图解决的问题映射到这些算法类型被称为框架化,我们将深入探讨第六章中的框架化。
分类
分类算法试图解决区分各种类型或类别事物的问题。这可能意味着:
-
带有加速度计的健身监视器分类步行与跑步
-
一个带有图像传感器的安全系统,分类空房间与有人房间
-
一个野生动物摄像机分类四种不同物种的动物
图 4-7 显示一个分类器在基于加速度计收集的数据的基础上用于确定铲车是空闲还是移动。

图 4-7. 一个分类器通常输出包含每个可能类别的概率分布
分类可以根据任务的不同方式进行分类:
二元分类
输入属于两个类别中的一个。
多类分类
输入属于超过两个类别中的一个。
多标签分类
输入属于零个或多个任意数量的类。
最常见的分类形式是二元和多类。使用这些分类形式时,您总是需要至少两个类别。即使只有一件事情是您关心的(例如房间里的一个人),您也需要一个代表您不关心的一切的类别(例如没有人的房间)。多标签分类相对较少见。
回归
回归算法试图提出数字。这可能意味着:
-
一个智能恒温器预测一小时后的温度
-
一个使用摄像头估算食品重量的虚拟秤
-
一个基于声音估算电机转速的虚拟传感器
虚拟传感器,如后两个示例,是回归的一个特别有趣的案例。它们可以使用可用的传感器数据来预测来自不同类型传感器的测量值——而无需实际要求这些传感器存在。
对象检测和分割
物体检测算法获取图像或视频,并识别其中特定物体的位置,通常通过绘制边界框来实现。它们结合分类和回归,识别特定类型的物体并预测它们的数值坐标,正如在图 4-8 中所见。

图 4-8. 物体检测模型的常见输出包括绘制在检测到的物体周围的边界框,每个边界框带有个别的置信度分数。
为特定类型的物体存在专门的物体检测算法。例如,姿势估计模型专门设计用于识别人体部位并确定其在图像中的位置,正如在图 4-9 中所示。

图 4-9. 姿势估计识别人体上的关键点,这些点的位置可以作为其他处理的输入。
分割算法类似于物体检测算法,但它们在像素级别上对图像进行分类。这导致了一个分割地图,正如在图 4-10 中所见,它试图标记输入的区域及其内容。

图 4-10. 这幅街景已经用分割地图标记。不同区域,如人和道路表面,显示为不同的色调。分割算法旨在预测哪些像素属于哪种类型的物体。
这里是一些物体检测和分割的示例用例:
-
一个农场监控器,使用摄像头统计田间动物的数量。
-
一个家庭健身系统,在锻炼期间为人们提供姿势反馈。
-
一个工业摄像头,用于测量容器中填充产品的量。
异常检测
异常检测算法能识别信号偏离其正常行为的情况。它们在许多应用中都很有用:
-
一个工业预测性维护系统,能够通过其电流绘制识别电动机开始故障的情况。
-
一个机器人吸尘器,可以通过加速度计识别其行驶在不寻常表面上的情况。
-
一个追踪摄像头,知道何时有未知的动物经过。
异常检测算法对预测性维护非常有用。当与机器学习模型配对时,它们也非常有帮助。如果机器学习模型面对不在其训练集中的输入,则许多模型将产生虚假的随机结果。
为了避免这种情况,可以将 ML 模型与异常检测算法配对,以便在发现“超出分布”的情况时丢弃其虚假结果。某些类型的模型也可以进行“校准”,使其输出表示真实的概率分布,可以用来识别模型不确定性的时候。
聚类。
聚类算法尝试根据相似性对输入进行分组,并可以识别输入是否与以前看到的不同。它们经常用于边缘 AI 设备需要从环境中学习的情况,包括异常检测应用程序。例如,考虑以下情况:
-
语音助手能够学习其用户的声音特征。
-
预测性维护应用程序学习“正常”操作状态,并能检测其偏离情况。
-
自动售货机可以根据用户以往的选择推荐饮料。
聚类算法可以在部署后实时学习其聚类,或者事先配置好。
降维。
降维算法接收一个信号并生成一个包含等效信息但占用更少空间的表示。两个信号的表示可以很容易地进行比较。以下是一些示例应用:
-
压缩音频,使远程设备传输声音更便宜。
-
指纹识别,确保指纹匹配设备的所有者。
-
人脸识别,在视频中识别个别面孔。
降维通常与其他 AI 算法一起使用,而不是单独使用。例如,它可以与聚类算法结合使用,以识别复杂数据类型(如音频和视频)中的相似信号。
变换。
变换算法接收一个信号并输出另一个信号。以下是一些示例:
-
可识别并消除信号中特定噪音的降噪耳机。
-
汽车倒车摄像头在黑暗或多雨条件下增强图像。
-
语音识别设备接收音频信号并输出转录。
变换算法的输入和输出可能极其不同。在转录的情况下,输入是音频数据流,输出是一系列单词。
组合算法。
在同一个应用程序中混合不同类型的算法没有理由不可行。本节稍后我们将探讨组合算法的技术(见“组合算法”)。
按实施方式分类的算法类型。
通过功能来探索算法帮助我们理解它们的用途,但从工程角度来看,了解这些功能可以以不同的方式实现是很重要的。例如,有几百种不同的构建分类算法的方法,这是由几十年的计算机科学研究得出的。每种方法都有其独特的优势和弱点,这些弱点会因边缘 AI 硬件的限制而放大。
在接下来的部分,我们将探讨边缘 AI 算法实施的最重要方式。请记住,这并不是详尽无遗的清单——我们关注的是边缘 AI,因此我们专注于在设备上运行良好的技术。
条件和启发式
最简单类型的 AI 算法基于条件逻辑:简单的if语句导致决策。让我们回顾一下我们在“人工智能”中探讨过的代码片段:
current_speed = 10 # In meters per second
distance_from_wall = 50 # In meters
seconds_to_stop = 3 # The minimum time in seconds required to stop the car
safety_buffer = 1 # The safety margin in seconds before hitting the brakes
# Calculate how long we’ve got before we hit the wall
seconds_until_crash = distance_from_wall / current_speed
# Make sure we apply the brakes if we’re likely to crash soon
if seconds_until_crash < seconds_to_stop + safety_buffer:
applyBrakes()
这个简单算法使用一些人为定义的值(seconds_to_stop等)进行基本计算,并决定是否刹车。这算得上是 AI 吗?这可能会引发辩论,但答案明确是肯定的。⁴
人工智能的普遍理解是,它是一个创造可以像人类一样思考的机器的追求。工程定义更为现实:AI 允许计算机执行通常需要人类智能的任务。在这种情况下,控制汽车刹车以避免碰撞显然是需要人类智能的任务。20 年前,这被认为是极为令人印象深刻的,但现代车辆中的自动刹车已经成为常见功能。
注意
在你嘲笑if语句可以成为人工智能的想法之前,请考虑一下,决策树——最流行和有效的机器学习算法类别之一——本质上就是if语句。如今,甚至深度学习模型可以作为二元神经网络实现,这本质上也是条件逻辑。智能来自于应用,而不是实现!
我们汽车刹车算法中的条件逻辑实际上是分类的一种实现。给定一个输入(汽车的速度和距离墙壁的距离),算法将情况分类为安全驾驶或即将碰撞。条件逻辑自然用于分类,因为其输出是分类的;一个if语句给出两种可能的输出之一。
条件逻辑与启发式的概念密切相关。启发式是一种手工制定的规则,可以应用于某种情况,以帮助理解或应对它。例如,我们的汽车刹车算法使用的启发式是,如果距离撞墙不足四秒钟,我们应该刹车。
启发式是人类利用领域知识设计的。这种领域知识可以建立在对现实情况收集的数据上。在这方面,我们看似简单的汽车制动算法可能实际上代表了对现实世界的深入和深入的理解。也许seconds_to_stop的值是在进行了数百万美元的碰撞测试后得出的,并且代表了这个常数的理想值。有了这个想法,很容易看出,即使是一个if语句也可以代表大量的人类智慧和知识,被捕捉并蒸馏成简单而优雅的代码。
我们的汽车制动示例非常简单,但是当与信号处理配对时,条件逻辑可以做出一些相当复杂的决策。例如,想象一下,您正在构建一个预测维护系统,该系统旨在基于机器发出的声音警报工人机器的健康状态。也许机器在即将故障时会发出特征性的高音响。如果您捕捉音频并使用傅里叶变换将其转换为频域,您可以使用简单的if语句来确定何时发生这种尖叫声,并通知工人。
除了if语句,您还可以使用更复杂的逻辑根据已知规则解释情况。例如,工业机器可以使用一个手动编码的算法根据内部温度和压力测量来避免损坏,该算法可能会直接计算一个 RPM,使用了被捕捉在代码中的人类洞察力。
如果对您的情况有效,条件逻辑和其他手动编码的算法可以是非常出色的。它易于理解、易于调试和易于测试。不存在未指定行为的风险:代码要么分支一种方式,要么分支另一种方式,并且所有路径都可以通过自动化测试来执行。它运行非常快,并且可以在任何可想象的设备上运行。
启发式方法有两个主要缺点。首先,开发它们可能需要显著的领域知识和编程专业知识。领域知识并非总是可得的——例如,一个小公司可能没有资源进行必要的昂贵研究,以理解系统的基本数学规则。此外,即使拥有领域知识,也不是每个人都具备设计和实现高效代码中的启发式算法所需的专业知识。
第二个大缺点是组合爆炸的概念。在一个情况中存在的变量越多,传统计算机算法对其建模就越困难。国际象棋是一个很好的例子:棋子和可能的移动方式如此之多,以至于决定下一步该做什么需要大量的计算。即使是使用条件逻辑构建的最先进的国际象棋计算机也很容易被专业的人类玩家击败。
一些边缘 AI 问题比象棋游戏复杂得多。例如,想象一下尝试手写条件逻辑,以确定相机图像是否显示橙色或香蕉。通过一些技巧(“黄色代表香蕉,橙色代表橙子”),你可能会成功处理一些类别的图像,但是要使其普遍化超出最简单场景是不可能的。
手写逻辑的一个好的经验法则是,你需要处理的数据值越多,要得到令人满意的解决方案就越困难。幸运的是,当手写方法失败时,有很多算法可以介入。
经典机器学习
机器学习是创建算法的一种特殊方法。启发式算法是通过手写逻辑基于已知规则创建的,而机器学习算法则通过探索大量数据来发现它们自己的规则。
以下描述来自书籍TinyML,介绍了机器学习背后的基本思想:
要创建一个机器学习程序,程序员将数据输入到一种特殊的算法中,并让算法发现规则。这意味着作为程序员,我们可以创建根据复杂数据进行预测的程序,而不必完全理解所有复杂性。机器学习算法根据我们提供的数据建立系统的模型,通过我们称之为训练的过程。该模型是一种计算机程序。我们通过这个模型运行数据来进行预测,这个过程称为推理。
TinyML(O’Reilly, 2019)
机器学习算法可以执行本章前述的所有功能任务,从分类到转换。使用机器学习的关键要求是你有一个数据集。这是一个大量数据的存储,通常在真实条件下收集,用于训练模型。
通常,在开发过程中需要训练机器学习模型的数据是从尽可能多的来源聚合而来。正如我们将在后面章节看到的那样,一个大而多样的数据集对于处理边缘 AI 尤其是机器学习至关重要。
由于机器学习依赖于大数据集,并且由于训练机器学习模型的计算成本高昂,训练部分通常在部署之前进行,推理则发生在边缘。在设备上进行机器学习模型的训练是可能的,但由于缺乏数据和有限的计算量,这是一个挑战。
在边缘 AI 中,有两种主要的方法来处理机器学习数据集:
监督学习
数据集已经被专家标记,以帮助机器学习算法理解它
无监督学习
算法在没有人类帮助的情况下识别数据中的结构
机器学习存在一个与数据集相关的主要缺点。ML 算法完全依赖于它们的训练数据来知道如何响应输入。只要它们接收到与训练数据类似的输入,它们应该能够良好运作。但是,如果它们接收到一个与其训练数据显著不同的输入,即所谓的分布外输入,它们将产生完全无用的输出。
棘手的部分是从输出中没有明显的方法可以告诉一个输入是否是分布外的。这意味着模型总是存在提供无用预测的风险。在处理机器学习时,避免这个问题是一个核心关注点。
有许多不同类型的机器学习算法。经典机器学习包括大多数实际应用中使用的算法,主要例外是深度学习(我们将在下一节中探讨)。
以下是边缘人工智能中最有用的几种经典机器学习算法。标题指示它们是监督还是无监督算法:
回归分析(监督)
学习输入和输出之间的数学关系以预测连续值。易于训练,运行速度快,数据需求低,高度可解释,但只能学习简单系统。
逻辑回归(监督)
作为一种面向分类的回归分析类型,逻辑回归学习输入值与类别输出之间的关系——适用于相对简单的系统。
支持向量机(监督)
使用复杂的数学方法学习比基本回归分析更复杂的关系。数据需求低,运行速度快,能够学习复杂系统,但训练困难且解释性较低。
决策树和随机森林(监督)
使用迭代过程构建一系列if语句以预测输出类别或值。易于训练,运行速度快,高度可解释,可以学习复杂系统,但可能需要大量训练数据。
卡尔曼滤波器(监督)
预测给定测量历史的下一个数据点。可以考虑多个变量以提高精度。通常在设备上训练,数据需求低,运行速度快,易于解释,但只能模拟相对简单的系统。
最近邻(无监督)
根据其与已知数据点的相似性对数据进行分类。通常在设备上训练,数据需求低,易于解释,但只能模拟相对简单的系统,处理大量数据点可能会较慢。
聚类(无监督)
学习通过相似性分组输入,但不需要标签。通常在设备上训练,数据需求低,运行速度快,易于解释,但只能模拟相对简单的系统。
经典机器学习算法是解释特征工程管道输出并基于数据做出决策的一组令人难以置信的工具。它们涵盖了从高效到高度灵活的全谱,并且可以执行许多功能性任务。另一个重要的好处是它们往往是可解释的——很容易理解它们如何做出决策。而且根据算法的不同,数据要求可以相当低(深度学习通常需要非常大的数据集)。
经典机器学习算法的多样池(总共有数百种)对边缘人工智能来说既是一种祝福又是一种诅咒。一方面,有许多适合不同情况的算法,这使得理论上可以找到一个特定用例的理想算法。另一方面,庞大的算法集合可能会难以探索。
虽然像scikit-learn这样的库使得尝试许多不同算法变得简单,但调整每个算法以实现最佳性能以及解释它们的结果既是一门艺术也是一门科学。此外,如果希望部署到微控制器,可能需要编写自己的高效算法实现——目前并没有多少开源版本可用。
经典机器学习算法的一个主要缺点是它们在能够建模系统复杂性方面遇到了相对低的上限。这意味着为了获得最佳结果,它们通常必须与复杂的特征工程配对——这可能是设计复杂且计算成本高昂的。即使进行了特征工程,在某些任务(例如图像数据的分类)中,经典机器学习算法表现不佳。
话虽如此,经典机器学习算法是做出设备端决策的一套奇妙工具。但如果遇到它们的限制,深度学习可能会提供帮助。
深度学习
深度学习是一种专注于神经网络的机器学习类型。这些网络已被证明是非常有效的工具,深度学习已发展成为一个庞大的领域,深度神经网络被应用于许多类型的应用。
注意
本书侧重于从工程视角讨论深度学习算法的重要特性。深度学习的基本机制很有趣,但并非构建边缘人工智能产品所必需的知识。使用现代工具,任何工程师都可以在没有机器学习正式背景的情况下部署深度学习模型。我们将在后续的教程章节中分享一些工具来实现这一点。
深度学习与经典机器学习分享相同的原则。使用数据集训练模型,然后可以在设备上实现推理。模型并非神奇——它只是算法和一组数字的组合,这些数字与输入一起馈送到模型中,以产生期望的输出。
模型中的数字称为权重或参数,它们是在训练过程中生成的。术语神经网络指的是模型将其输入与参数结合的方式,这受到了动物大脑中神经元连接方式的启发。
过去十年中,我们见到的许多人工智能工程的最令人震惊的成就都利用了深度学习模型。以下是一些热门亮点:
-
GPT-3,一个能够生成与人类写作难以区分的书面语言的模型。
-
聚变反应堆控制,使用深度学习控制聚变反应堆内等离子体的形状。
-
DALL•E,一个能够根据文本提示生成逼真图像和抽象艺术的模型。
-
GitHub Copilot,一种通过自动编写代码来帮助软件工程师的软件。
除了花哨的东西,深度学习在我们算法类型子节中的所有任务中表现出色(见“按功能划分的算法类型”)。它已被证明是灵活、适应性强的,是让计算机理解和影响世界的极其有用的工具。
深度学习模型之所以有效,是因为它们作为通用函数逼近器。数学上已经证明,只要你能将某事描述为连续函数,深度学习网络就可以对其建模。这基本上意味着,对于任何显示各种输入和期望输出的数据集,都有一个深度学习模型可以将一个转换为另一个。
这种能力的一个非常令人兴奋的结果是,在训练过程中,深度学习模型可以找出如何进行自己的特征工程。如果需要特殊的转换来帮助解释数据,深度学习模型可以潜在地学会如何做到这一点。这并不是说特征工程变得过时了,但它确实减轻了开发人员确保一切完全正确的负担。
深度学习模型之所以如此擅长逼近函数,是因为它们可以拥有非常大量的参数。每个参数使得模型具有更多的灵活性,从而可以描述稍微复杂一些的函数。
这种属性导致了深度学习模型的两个主要缺点。首先,找到所有这些参数的理想值是一个困难的过程。它涉及用大量数据训练模型。数据通常是一种稀有和宝贵的资源,难以获取且昂贵,因此这可能是一个主要障碍。幸运的是,有许多技术可以帮助充分利用有限的数据——我们将在本书的后面部分涵盖它们。
第二个主要缺点是过拟合的风险。过拟合是指机器学习模型对数据集学习得过于彻底。它完全记忆了数据集,而不是对导致数据输出的一般规则进行建模。这意味着它在未曾见过的数据上表现不佳。
过拟合是所有机器学习模型面临的风险,但对于深度学习模型来说尤为严峻,因为它们可以拥有如此多的参数。每增加一个参数都会使模型稍微具备更多的记忆数据集的能力。
有许多不同类型的深度学习模型。以下是一些在边缘 AI 中最重要的模型:
全连接模型
最简单的深度学习模型类型是全连接模型,由堆叠的神经元层组成。全连接模型的输入直接作为一长串数字进行馈送。全连接模型能够学习任何函数,但对其输入中的空间关系(例如,哪些输入值相邻)大多视而不见。
在嵌入式环境中,这意味着它们对离散值非常有效(例如,如果输入特征是关于时间序列的一组统计数据),但对原始时间序列或图像数据的处理效果则不佳。
全连接模型在嵌入式设备上得到了很好的支持,通常可以使用硬件和软件优化。
卷积模型
卷积模型旨在利用其输入中的空间信息。例如,它们可以学习识别图像中的形状或时间序列传感器数据中的结构。这使得它们在嵌入式应用中非常有用,因为空间信息在我们处理的许多信号中都很重要。
像全连接模型一样,卷积模型在嵌入式设备上得到了很好的支持。
序列模型
序列模型最初是为处理数据序列而设计的,比如时间序列信号或甚至书面语言。为了帮助它们识别时间序列中的长期模式,它们通常包含一些内部的“记忆”。
结果表明,序列模型非常灵活,越来越多的证据表明它们在任何需要空间信息重要的信号上都可以非常有效。许多人认为它们最终会取代卷积模型。
当前,在嵌入式设备上,序列模型的支持程度比卷积模型和全连接模型要差一些;提供优化实现的开源库也比较少。这更多是由于惯性而非技术限制,因此这种情况可能会在接下来的几年内发生变化。
嵌入模型
嵌入模型是预训练的深度学习模型,旨在进行维度降低——它将一个复杂的输入表示为一组更小的数字,以在特定上下文中描述它。它们的使用方式类似于信号处理算法:它们生成可以被另一个机器学习模型解释的特征。
对于许多任务,如图像处理(将混乱的大图像转换为其内容的数值描述)或语音识别(将原始音频转换为其内部语音声音的数值描述),都可以使用嵌入模型。
嵌入模型最常见的用途是迁移学习,这是一种减少训练模型所需数据量的方法。我们稍后会详细了解这个概念。
嵌入模型可以是完全连接的、卷积的或序列模型,因此它们在嵌入式设备上的支持有所不同,但卷积嵌入模型最为常见。
近年来,深度学习模型才被引入到边缘 AI 硬件中。由于它们通常体积大且需要大量计算资源才能运行,高端 MCU 和 SoC 的出现,具有相对强大的处理器和大量的 ROM 和 RAM,使它们能够迈出这一步。
有可能只用几千字节的内存运行一个小型深度学习模型,但对于执行更复杂任务的模型——从音频分类到物体检测——通常需要数十到数百千字节作为最小要求。
这已经令人印象深刻了,因为传统的服务器端机器学习模型大小从几十兆字节到数百兆字节不等。通过巧妙的优化和限制范围,嵌入模型可以做得更小——我们很快将介绍其中的一些技术。
有多种方式可以在嵌入设备上运行深度学习模型。以下是一个快速总结:
解释器
深度学习解释器,例如TensorFlow Lite for Microcontrollers,使用解释器执行存储为文件的模型。它们灵活且易于使用,但会带来一些计算和内存开销,并且不支持每一种模型类型。
代码生成
代码生成工具,例如EON,将训练好的深度学习模型转换为优化的嵌入式源代码。这比基于解释器的方法更高效,且代码易于阅读,因此仍然可以进行调试,但仍不支持每种可能的模型类型。
编译器
类似于microTVM的深度学习编译器接收训练好的模型,并生成优化的字节码,可以嵌入到嵌入式应用程序中。它们生成的实现可以非常高效,但不像实际的源代码那样易于调试和维护。它们可以支持解释器和代码生成未明确支持的模型类型。嵌入式硬件供应商通常会提供定制的解释器或编译器,以协助在其硬件上运行深度学习模型。
手工编码
可以通过手工编写代码实现深度学习网络,将来自训练模型的参数值纳入其中。这是一个困难且耗时的过程,但可以完全控制优化,并支持任何模型类型。
在 SoCs 和微控制器之间,部署深度学习模型的环境差异很大。由于 SoCs 运行完整的现代操作系统,它们也支持大多数用于在服务器上运行深度学习模型的工具。这意味着几乎任何类型的模型都可以在 Linux SoC 上运行。尽管如此,模型的延迟会根据模型的架构和 SoC 的处理器而异。
还有专为 SoC 设备设计的解释器。例如,TensorFlow Lite提供了工具,允许在 SoCs 上更高效地运行深度学习模型——通常是在智能手机上使用的 SoCs。它们包括优化的深度学习操作实现,利用了某些 SoCs 可用的功能,如 GPU。
集成了深度学习加速器的 SoC 是一个特殊情况。通常,硬件供应商会提供特殊的编译器或解释器,允许模型利用硬件加速功能。加速器通常只加速特定操作,因此加速比取决于模型的架构。
由于微控制器不运行完整的操作系统,无法使用标准工具来运行深度学习模型。相反,像 TensorFlow Lite for Microcontrollers 这样的框架提供了模型支持的基准。它们在操作符支持方面通常落后于标准工具,意味着它们无法运行某些模型架构。
运算符和内核
在边缘机器学习中,运算符或内核是用于运行深度学习模型的特定数学操作的实现。这些术语在其他领域,包括深度学习的其他地方,也有不同的含义。
典型的高端微控制器具有诸如 SIMD 指令之类的硬件特性,这将显著提高深度学习模型的性能。TensorFlow Lite for Microcontrollers 包括多个供应商优化实现的操作符,利用这些指令。与 SoCs 一样,基于微控制器的硬件加速器的供应商通常提供自定义编译器或解释器,允许模型在其硬件上运行。
深度学习的核心优势包括其灵活性、减少特征工程的要求以及利用大量数据的能力,因为模型的高参数数量。深度学习以其逼近复杂系统的能力而著称,不仅能进行简单预测,还能执行生成艺术和准确识别图像中物体等任务。深度学习提供了很大的自由度,研究人员仅仅开始探索其潜力。
深度学习的核心缺点包括高数据需求、易于过拟合的倾向、深度学习模型的相对较大尺寸和计算复杂性,以及训练过程的复杂性。此外,深度学习模型往往难以解释——解释为何它们对一个预测优于另一个预测可能具有挑战性。尽管如此,有工具和技术可以帮助减轻大部分这些缺点。
结合算法
单个边缘 AI 应用可以利用多种不同类型的算法。以下是一些典型的使用方式:
集成
集成是一组机器学习模型,它们接收相同的输入。它们的输出在数学上结合以做出决策。由于每个 ML 模型都有其自身的优势和劣势,模型的集成通常比其组成部分更精确。集成的缺点是额外的复杂性、内存和计算资源,以存储和运行多个模型。
级联
级联是一组依次运行的 ML 模型。例如,在装有内置数字助理的手机中,会不断运行一个小型、轻量级模型以检测任何人类语音的迹象。一旦检测到语音,会唤醒一个更大、计算代价更高的模型,以确定说了什么。
级联是节省能量的好方法,因为它们可以避免不必要的计算。在异构计算环境中,可以在不同处理器上运行级联的各个组成部分。
特征提取器
正如我们之前所学到的,嵌入模型接受高维输入(如图像),并将其精炼为一组描述其内容的数字。嵌入模型的输出可以馈送到另一个模型中,该模型设计用于根据嵌入模型对原始输入的描述进行预测。在这种情况下,嵌入模型被用作特征提取器。
如果使用预训练的嵌入模型,这种技术——称为迁移学习——可以大幅减少训练模型所需的数据量。模型不需要学习如何解释原始的高维输入,而只需要学习如何解释特征提取器返回的简单输出。
例如,假设你希望训练一个模型,从照片中识别不同物种的鸟类。与其从头开始训练一个完整的模型,你可以使用预训练的特征提取器的输出作为你的模型的输入。这可以减少所需的数据量和训练时间,以获得良好的结果。
许多预训练的深度学习特征提取器都可以在开源许可证下获得。它们通常用于与图像相关的任务,因为可以预训练大型公共图像数据集。
多模型
多模型是一个单一模型,同时接受多种类型的数据输入。例如,多模型可以同时接受音频和加速度计数据。这种技术可以用作传感器融合的机制,使用单一模型来结合不同的数据类型。
后处理算法
在边缘 AI 设备上,我们通常处理数据流——例如,连续的音频数据时间序列。当我们在这些数据流上运行边缘 AI 算法时,它将产生第二个时间序列,表示随时间变化的算法输出。
这带来了一个问题。我们如何解释这第二个时间序列以做出决策呢?例如,想象我们正在分析音频以检测某人何时说出关键字,以便在产品上触发某些功能。我们*真正想知道的是我们何时听到了这个关键字。
不幸的是,推理结果的时间序列对于此目的并不理想。首先,它包含许多并不代表检测到关键字的事件。为了清理这些数据,我们可以忽略那些其关键字被检测到的置信度低于某个阈值的事件。
其次,模型偶尔(而且短暂地)可能会检测到一个并非实际被说出来的关键字。我们需要过滤掉这些突发事件,以清理我们的输出。这相当于在时间序列上运行低通滤波器。
最后,与其告诉我们每一次关键字何时被说出来,原始时间序列告诉我们的是以一定的频率告诉我们当前是否正在说出关键字。这意味着我们需要进行一些输出门控以获取我们真正想要的信息。
清理完原始输出后,我们现在有一个信号告诉我们关键字何时实际被检测到。这是我们可以在应用逻辑中使用的东西,用来控制我们的设备。
在边缘人工智能应用中,这种后处理非常常见。可以根据具体情况确定使用的后处理算法及其特定参数,例如用于考虑匹配的阈值。像 Edge Impulse 的性能校准(在“性能校准”中有介绍)这样的工具,允许开发人员自动发现适合其应用程序的理想后处理算法。
失效安全设计
边缘人工智能应用中可能会出现许多问题,因此必须始终采取措施来防止意外问题的发生。
例如,想象一个野生动物摄像机,它使用深度学习模型来识别感兴趣动物的照片,并通过卫星连接上传动物的图像。在正常操作下,它可能每天发送几张照片,数据费用不高。
但是在现场,摄像机硬件可能存在物理问题,例如镜头上的污垢或反射,可能导致拍摄的图像与原始训练数据集中的图像非常不同。这些分布外图像可能会导致深度学习模型的未指定行为,这可能意味着模型开始持续报告感兴趣的动物存在。
这些由于分布外输入引起的误报可能导致通过卫星连接上传数百张图像。这不仅会使摄像机变得无用,而且可能导致大量的数据传输费用。
在现实世界的应用中,无法避免像传感器损坏或算法的意外行为等问题。因此,设计应用程序以具备失效安全性至关重要。这意味着如果系统的一部分出现故障,应用程序将最小化损害。
在不同情况下,最佳方法有所不同。例如,对于野生动物摄像机,建议设置一个速率限制,以防止上传过多照片。在其他应用中,你可能选择完全关闭系统,而不是冒着可能引起损害的风险。
构建失效安全的应用程序是负责任的人工智能和良好工程的重要组成部分。这是任何项目开始时都需要考虑的事项。
边缘设备的优化
对于机器学习模型,特别是深度学习模型,通常存在着模型执行任务效果与内存和计算资源消耗之间的权衡。
这种权衡对于边缘人工智能至关重要。边缘设备通常具有计算能力的限制。它们设计用于最小化成本和能源使用,而不是最大化计算能力。同时,它们需要处理实时传感器数据,通常是高频率的,并可能根据数据流中的事件实时作出反应。
更大的机器学习模型往往在复杂任务上表现更好,因为它们有更大的容量——这对学习输入和输出之间复杂关系是有帮助的。这种额外的容量意味着它们可能需要更多的 ROM 和 RAM,并且意味着计算时间更长。额外的计算时间导致更高的功耗,正如我们将在“工作循环”中学到的那样。
在任何应用程序中,找到正确的任务性能和计算性能之间的平衡是至关重要的。这是一个权衡约束条件的问题。一方面,在给定任务中有性能的最低标准。另一方面,硬件选择会对可用内存、延迟和能耗造成硬性限制。
管理这种权衡是边缘 AI 开发中最困难但也是最吸引人的部分之一。这是使这一领域独特有趣的一部分,也是为边缘 AI 重新设计自动机器学习工具(我们将在“自动化机器学习(AutoML)”中学习)的原因之一。
以下是可以帮助我们在尽可能减少计算要求的同时最大化任务性能的因素之一。
算法的选择
每个边缘 AI 算法的内存使用和计算复杂性都有稍微不同的特征。您目标硬件的约束条件应该指导您选择算法。通常,经典机器学习算法比深度学习算法更小更高效。
然而,通常情况下,特征工程算法的计算量远远超过二者,使得在经典机器学习和深度学习之间的选择变得不那么重要。这个规则的例外是图像数据的分析,这通常需要较少的特征工程,但相对较大的深度学习模型。
以下是减少算法选择所需的延迟和内存的常见方法:
-
减少特征工程的复杂性。更多的数学意味着更高的延迟。
-
减少到达 AI 算法的数据量。
-
使用经典机器学习而不是深度学习。
-
在你的设备上,根据哪个运行效率更高,特征工程和机器学习模型之间的复杂性权衡。
-
减少深度学习模型的大小(权重和层数)。
-
选择在您选择的设备上具有加速器支持的模型类型。
压缩和优化
有许多优化技术旨在减少给定算法所需的数据量和计算量。以下是一些最重要的类型:
量化
减少算法或模型所需的内存和计算量的一种方法是降低其数值表示的精度。如在“数值类型是如何表示的?”中提到的,有许多不同的计算数值表示方式——有些比其他更精确。
量化是将一组值的精度降低而保留其重要信息的过程。它既可以用于信号处理算法,也可以用于机器学习模型。对于默认具有 32 位浮点权重的深度学习模型而言,这特别有用。通过将权重减少到 8 位整数,可以将模型减少到原来的四分之一大小,通常不会显著降低准确性。
量化的另一个优势是,执行整数运算的代码比执行浮点运算的代码更快、更便携。这意味着量化在许多设备上可以显著加快速度,并且量化算法可以在缺乏浮点单元的设备上运行。
量化是一种有损优化,通常会降低算法的任务性能。在机器学习模型中,可以通过以较低精度进行训练来减少这种影响,从而使模型学会进行补偿。
操作融合
在操作融合中,使用计算感知算法检查深度学习模型运行时使用的运算符。当某些运算符组合在一起使用时,可以用单个融合实现替换它们,以最大化计算效率。
操作融合是一种无损技术:它提高了计算性能,而不会降低任务性能。缺点是融合实现仅适用于某些运算符的特定组合,因此其影响在很大程度上取决于模型的架构。
修剪
修剪是在训练深度学习模型期间应用的一种有损技术。它强制模型的许多权重为零,从而创建所谓的稀疏模型。理论上,这应该能够加快计算速度,因为任何涉及零权重的乘法将不可避免地得到零。
然而,目前很少有边缘人工智能硬件和软件设计能够利用稀疏权重。未来几年这种情况可能会改变,但目前修剪的主要优势在于稀疏模型更容易压缩,因为它们包含大量相同值的块。这在需要通过空中传送模型时非常有用。
知识蒸馏
知识蒸馏是另一种有损深度学习训练技术,它使得一个大型的“教师”模型能够帮助训练一个更小的“学生”模型以复制其功能。它利用了深度学习模型的权重通常存在大量冗余的事实,这意味着可以找到一个更小但几乎同样有效的等效模型。
知识蒸馏有些繁琐,因此还不是常见的技术,但在未来几年可能会成为最佳实践。
二进制神经网络(BNNs)
BNNs 是深度学习模型,其中每个权重都是一个单一的二进制数。由于计算机上的二进制算术非常快速,二进制神经网络可以运行得非常高效。然而,它们是一种相对较新的技术,用于训练和推断的工具尚未广泛使用。二进制化类似于量化,因此是一种有损技术。
脉冲神经网络(SNNs)
脉冲神经网络是一种人工神经网络,其中网络传输的信号具有时间组件。作为“神经形态”系统,它们设计得更接近生物神经元的工作方式。它们与传统深度学习模型相比有不同的权衡,对某些任务提供了改进的性能和效率。然而,它们需要专门的硬件(加速器形式),以便提供优势。
SNNs 可以直接训练,也可以通过转换过程从传统深度学习模型创建。这个过程可能是有损的。
模型压缩有两个主要的缺点。第一个是运行压缩模型通常需要特定的软件、硬件或二者的组合。这可能限制可以部署压缩模型的设备范围。
第二个缺点更为危险。压缩的有损性质通常导致模型预测性能的微妙下降,很难察觉。精度的降低可能会导致模型在常见情况下表现良好,但在“长尾”少见输入的情况下失去性能。
这个问题可能放大数据集和算法中固有的偏见。例如,如果用于训练 ML 驱动健康可穿戴设备的数据集中,少数群体的示例较少,模型压缩可能导致这些群体的性能下降。由于他们是少数群体,对模型整体准确性的影响可能很难察觉。这使得对数据集中每个子组的系统性能进行评估变得极为重要(见“收集元数据”)。
这个主题有两篇优秀的科学论文,由研究员 Sara Hooker 等人撰写。一篇是“压缩深度神经网络会忘记什么?”,另一篇是“压缩模型中的偏见特征”。
设备上训练
在绝大多数情况下,用于边缘 AI 的机器学习模型在部署到设备之前进行训练。训练需要大量数据,通常用标签进行注释,并涉及大量计算——相当于每个数据点数百或数千次推断。这限制了设备上训练的实用性,因为边缘 AI 应用本质上受到内存、计算、能量和连接性的严格约束。
尽管如此,在一些场景中进行设备上训练是有意义的。以下是一个概述:
预测性维护
在预测性维护中,常见的设备上训练例子是当监测机器是否正常运行时。可以使用代表“正常”状态的数据来训练一个小型的设备上模型。如果机器的信号开始偏离基线,应用程序可以察觉并采取行动。
只有在可以假设异常信号很少,并且在任何给定时刻机器可能正常运行时,这种用例才可能发生。这使得设备能够将正在收集的数据视为具有隐含的“正常”标签。如果异常状态很常见,那么在任何给定时刻假设状态将变得不可能。
个性化
另一个适合设备上训练的例子是当用户被要求故意提供标签时。例如,一些智能手机使用面部识别作为安全方法。用户设置设备时,会被要求注册他们的面部图像。这些面部图像的数值表示被存储。
这些类型的应用通常使用精心设计的嵌入模型,将原始数据转换为其内容的紧凑数值表示。这些嵌入被设计成欧几里得距离⁵ 能够对应于它们之间的相似性。在我们的面部识别示例中,这使得很容易确定新面孔是否与设置期间存储的表示相匹配:计算新面孔与注册面孔之间的距离,如果足够接近则认为是同一人。
这种个性化形式有效的原因是,通常用于确定嵌入相似性的算法可以非常简单;可以是距离计算或最近邻算法。嵌入模型已经完成了所有的繁重工作。
隐性关联
另一个设备上训练的例子是当标签通过关联可用时。例如,电池管理功能如苹果的优化电池充电通过设备上的模型训练来预测用户何时可能在使用他们的设备。一种方法是训练一个预测模型,在给定前几个小时使用记录的情况下,输出在特定时间的使用概率。
在这种情况下,收集和标记训练数据在单个设备上很容易。使用日志在后台收集,根据某些指标(例如屏幕是否被激活)应用标签。时间和日志内容之间的隐含关联允许数据被标记。然后可以训练一个简单的模型。
联邦学习
设备上训练的一个障碍是缺乏训练数据。此外,设备上的数据通常是私密的,用户不希望其被传输。联合学习是一种分布式训练模型的方式,跨多个设备进行,同时保护隐私。部分训练好的模型在设备之间(或者在每个设备与中央服务器之间)传递,而不是传输原始数据。一旦准备就绪,这些部分训练好的模型可以合并并分发回设备。
联合学习看起来很有吸引力,因为它似乎为模型在实地学习和改进提供了一种方式。然而,它也有一些严重的局限性。它需要大量的计算资源和数据传输,这与边缘人工智能的核心优势相抵触。训练过程非常复杂,需要设备端和服务器端的组件,这增加了项目风险。
由于数据未存储在全局,无法验证训练模型在整个部署中的表现良好。从本地设备上传模型存在安全攻击的风险。最重要的是,这并不能解决标签问题。如果没有标记的数据,联合学习就毫无意义。
空中更新
虽然实际上不是一种设备上的训练技术,但在现场更新模型的最常见方式是通过空中更新。可以在实验室中训练新模型,使用从现场收集的数据,并通过固件更新分发到设备上。
这取决于网络通信,并不能解决获取标记数据的问题,但它是随时间保持模型最新的最常见方式。
摘要
现在我们已经了解了使边缘人工智能成为可能的关键 AI 算法,以及运行它们的硬件。下一章将介绍将所有内容整合在一起所需的工具和技能。
¹ 块可以是离散的,重叠的,甚至它们之间有间隙。
² 这是因为图 4-5 中显示的原始音频由 44,100 个样本组成,而相应的频谱图只有 3,960 个元素。更小的输入意味着更小的模型。
³ 在图像处理中,特征是关于图像的特定信息,如某些视觉结构的位置。维基百科页面“特征(计算机视觉)”列出了许多常见的图像特征。
⁴ 有一个广为人知的现象被称为“AI 效应”,即当 AI 研究人员找到让计算机完成某项任务的方法后,批评者不再认为该任务代表智能。
⁵ 嵌入可以被看作是多维空间中的一个坐标。两个嵌入之间的欧氏距离就是这两个坐标之间的距离。
第五章:工具与专业知识
边缘 AI 开发工作流包含许多高度技术化的任务,大多数项目将需要由专家团队集中技能和专业知识。
本章的第一部分是建立团队的指南,这个团队将把您的想法变成现实。即使您仍处于早期阶段,了解重要的技能类型和您可能遇到的挑战也是有帮助的。AI 的核心是自动化人类洞察,因此您团队必须具备正确的洞察力。
本章的第二部分,从“工具”开始,旨在帮助您掌握与边缘 AI 工作相关的关键技术工具。如果您的产品开发早期阶段,您可能希望浏览一些细节,然后在想出一些具体想法并准备好开始时,将本章作为参考。
构建边缘 AI 团队
边缘 AI 是一种真正完整的技术。作为一个话题,它利用从半导体电子学的物理特性到跨设备和云的高级架构工程的所有知识。它需要在人工智能和机器学习的最前沿方法以及裸金属嵌入式软件工程的最可敬技能方面的专业知识。它利用计算机科学和电气工程的整个历史,一脉相承。
世界上没有人在边缘 AI 的每个子领域都拥有深入的专业知识。相反,这个领域核心的人依赖于组建专家网络,他们可以寻求其他拼图片段的洞察。如果你正在开发边缘 AI 产品,你可能需要为自己做同样的事情。
边缘 AI 团队最佳组合是具备广泛的跨学科知识、直接的问题领域工作经验以及习惯于迭代开发流程的团队。到目前为止,表现最佳的产品都来自那些直接面对他们试图解决的问题的团队:他们利用已有的知识来指导他们的边缘 AI 产品。
一个单一团队不需要在边缘 AI 的每个子领域都有专家。绝对最低要求可能只是两个角色:
-
一个领域专家,深入了解待解决问题
-
一位有经验开发类似目标设备的嵌入式工程师
没有理由这两个角色不能由同一个人来担任。然而,如果没有与机器学习或其他人工智能算法的工作经验,他们将不得不非常依赖于专门设计来引导非机器学习专家进行算法创建过程的端到端平台。
提示
如果您是一个没有嵌入式开发经验的独立开发者,您可以通过在目标硬件上构建一些非人工智能项目来提升您的技能。为了让您的生活更轻松,您可以考虑坚持使用 SoC 级硬件,因为嵌入式 Linux 开发比裸金属开发容易得多。如果您使用端到端边缘人工智能平台,部署您的模型应该相对简单。
决心和一些临时的即兴技能可以走得很远:我们已经看到许多科学研究人员用相对简单的嵌入式技能建立自己的 AI 驱动硬件。
虽然许多问题可以由一个小团队解决,但最复杂的问题需要更多的努力。本章的其余部分列出了可能重要的角色和责任,这将帮助你了解你自己团队的需求。它还讨论了边缘人工智能招聘的挑战。
领域专业知识
如我们将在“数据集和领域专业知识”中详细了解的那样,领域专业知识绝对是团队中最重要的组成部分。如果除了领域专业知识和预算之外,您什么都没有,您仍然可以雇用开发人员并建立产品。但是,如果您的团队没有人对您试图解决的问题有深入的理解,您很可能无法解决它。事实上,您可能会尝试解决错误的问题或创建没有人需要的解决方案的机会是相当大的。
在没有领域专业知识的情况下,建立任何质量产品都是困难的,但在没有领域专业知识的情况下建立人工智能产品几乎是不可能的。边缘人工智能的目标是将专家知识提炼成软件,并用它来自动化一个过程。正如我们在本书前面学到的,智能意味着在正确的时间知道正确的事情要做什么。但如果我们自己不知道,我们怎么能构建一个能够做到这一点的系统呢?
如果您自己不是领域专家,您的第一任务是找到一个是的。您的第二个任务是让他们验证您计划构建的解决方案。以下是一些问题可以问他们:
-
您希望解决的问题是否真的存在?
-
如果存在,这是否是一个有用的问题需要解决?
-
是否已经存在解决这个问题的解决方案?
-
您的提议解决方案是否真的有助于解决问题?
-
您的提议解决方案听起来可行吗?
-
如果您构建您的解决方案,领域内的任何人是否愿意购买它?
你应该希望能够向某人提出这些问题,而不必花太多钱:这些是任何真正领域专家在考虑接受工作时会思考的基本问题。即使你不同意,你也应该注意他们的答案。如果一个真正的专家告诉你某事是一个坏主意,那么很可能是有些道理的。
领域专业知识应该是您组织的核心,并成为您核心团队的一部分。您的专家将参与项目的许多方面,使他们成为边缘成员是不可行的。尽管如此,理想的情况是您在组织的每个层次都有领域专家。例如,除了核心专业知识外,您可能还有工程师、董事会成员和顾问,他们都在相关领域有经验。他们的共同见解将帮助您的团队预见和减少风险。
如果你找不到具备所需专业知识的人,你应该在项目启动前中止它。如果没有适当的知识,就无法合乎道德地工作。你的项目可能会违反某个领域的黄金法则,而你却毫无察觉。在你的客户身上测试不合格的功能是不可接受的,正如图 5-1 所明确的那样。在现场性能建立反馈环路非常困难,你很可能不知道出了什么问题。

图 5-1. 使用客户验证您的解决方案是一个糟糕的主意(Twitter,2022)
如果你确信自己有一个好主意,你可能需要花一些时间发展必要的专业知识。
多样性
除了领域专业知识之外,你的团队还应该追求的另一个重要特性是多样性。正如我们在“减少社会伤害”中讨论的那样,防范社会问题的最佳策略之一是建立一个拥有多元视角的团队。
在工作场所多样性方面,将其分为四个核心领域可能会有所帮助:¹
内部
内部多样性反映了一个人出生时不得不面对但并未选择的事物。其中包括年龄、出生国家、种族、族裔、性取向、性别认同、身体能力和人格类型。
外部
外部多样性包括我们在生活中获得的各种因素,不论是受外部因素影响还是出于有意识的选择。一些例子包括社会经济地位、生活经历、教育水平、个人兴趣、家庭状况、所在地和宗教信仰。
组织
组织多样性涉及一个人在组织内的角色。这可能包括他们的工作地点、工作职能、在层级中的级别、薪资水平、资历或雇佣状况。
世界观
世界观多样性与一个人如何看待世界有关。它可以包括伦理框架、政治信仰、宗教信仰、个人哲学和对生活的一般看法。
由于这四个领域的差异,每个人都有不同的经历,使他们的视角独特。这种独特的观点意味着他们会以不同的方式看待同一情况。作为构建技术产品的团队,不同的视角非常宝贵,因为它允许组织从多种不同角度看待问题和提出的解决方案。
这为缺乏多样性的组织提供了显著优势。你将更有能力识别给定情况中的所有细微差别,在制定可能解决方案的空间时有巨大的好处。也许某人的个人经历将转化为一个其他人都没有想到的惊人想法。
更重要的是,多样化的观点将帮助你识别自己产品中的问题。例如,你可能会发现不同的人自然而然地提出评估产品性能的不同标准。有孩子的人更有可能考虑产品在家庭生活中的需求,而有身体残疾的人可能更容易考虑无障碍性。
这并不意味着你的团队成员应该代表这些领域的专家:一个人有残疾并不意味着他们自动成为你的官方无障碍专家,这可能是他们既不想要也没有资格的角色。然而,你的团队拥有多样化的观点意味着他们更有可能考虑到需要引入无障碍专家的必要性。
拥有一个多样化的团队还不够:个人必须愿意分享他们的意见,整个组织必须真正倾听他们。建立这种环境的工作超出了本书的范围,但这方面有大量的文献可供参考。一个好的起点是来自谷歌的心理安全简介,他们发现个人能够自信发言的团队效果更好。
另一个关键点是你应该利用整个组织的各种视角。除了直接参与产品开发的人员外,你应该从每一个可以的人那里获取反馈——从高管到入门级工作人员。这将帮助你避免洞察中的盲点。在许多大型科技公司,员工被鼓励报名测试尚处于开发中的新产品,²这使得开发团队能够获取整个公司的见解。
就像在迭代开发中的所有事情一样,这个过程关键在于建立反馈循环,随着时间的推移帮助改进你的产品。你应该在最早的阶段创建系统,收集你多样化团队的观点,甚至在你还在草拟想法时。
对于一个团队来说,确保包括所有必要的多样化视角并不总是可行的。例如,你可能需要年轻儿童对产品的意见,而这些儿童不太可能是你组织的付费员工!确保这些视角被纳入的方法之一是为在项目期间与这些类型的人进行焦点小组讨论制定预算。
拓宽视野的另一种方式是找到一群多样化的顾问,帮助你做出决策。组建一个结合关键领域专业知识和多样化代表性的顾问委员会,是帮助你做出正确决策的强大工具。他们可以作为审查委员会,帮助你了解是否达成目标或偏离了正确方向。
不管 无论你的团队规模大小,都应该不遗余力地寻求受到你产品影响的人的反馈——这是最具多样性的群体。
利益相关者
你项目的利益相关者包括所有可能受影响的个人和社区。这包括你组织内的人员、客户、系统的最终用户,以及可能受到影响的任何人——无论是直接还是间接的。
要使系统有效,并避免造成伤害,必须考虑利益相关者的需求和价值观。例如,如果你的系统将接触公众成员,那么必须将他们视为利益相关者,并且在设计项目时要考虑到他们。
了解利益相关者的需求和价值观的最佳方式是直接询问他们。他们应该在你的开发工作流程中得到代表,从构思到项目结束。
利益相关者可以使用一个已被广泛认可的工具——利益相关者映射进行识别。你应该确保你的团队中有熟悉此过程的人。
角色与职责
建立一个产品需要一群人,这一章节的下一个部分概述了一些所需的角色。你的项目可能需要的角色在此未列出;这些只是直接参与边缘 AI 工作流程的最常见角色。
小贴士
你无需为每个角色雇佣单独的人。完全有可能同一个人同时在一个项目中扮演多个角色,且在初期,可能所有的原型制作都由一个人完成。
为了便于消化,我们将按类型划分角色。
知识与理解
此类别中的角色对于理解问题并以正确的方式解决它至关重要:
域内专家
在这出戏中扮演重要角色的领域专家带来了对项目领域的深刻理解。虽然产品经理的工作是理解项目如何融入周围的背景(如市场),但领域专家是了解情况科学的人。例如,工业自动化项目可能需要相关工业过程领域的专家,而医疗项目可能需要医学和生物学相关领域的专家。
道德和公平专家
道德和公平的角色是为了避免那些经常导致有害或无效产品的错误类型。他们需要对将用于解决问题的技术有深刻的理解,了解可能出现的各种陷阱,并遵循必须遵循的流程。领域专业知识同样重要,因为道德问题可能与特定领域相关。
计划和执行
这些高级角色在从构思到发布及长期支持的过程中对项目的正确路径起着重要指导作用:
产品经理
产品经理负责对产品做出决策:它应该是什么,它应该做什么,以及它应该为谁服务。他们的工作是深入了解问题和市场,并与技术角色合作,设计和实施有效的解决方案。他们通过影响力领导,将不同的线索汇集在一起,编织出符合正确需求的产品。
项目经理
项目管理角色涉及协调跨团队执行复杂任务。例如,项目经理可能会组织收集数据集,这些数据集将用于构建和创建产品。
程序经理
程序经理协调由多个项目组成的高级战略。例如,一家计划在其业务的多个部分中引入边缘人工智能以节省成本的公司可能会使用程序经理来协调这个过程。
算法开发
这些角色涉及数据集的探索和算法设计,以及系统评估机制的制定。虽然现在这些工作越来越多由非专家用户在端到端平台上完成,但有些坚实的经验仍然可以避免新手错误的产生:
数据科学家
数据科学角色负责收集、维护和理解支持边缘人工智能项目的数据。他们具有数据清洗、分析和特征工程的技能。这一角色经常涵盖机器学习工作,但也可能与之完全不同。
DSP 工程师
DSP 工程师开发和实现 DSP 算法。他们通常在算法开发和低级编程方面具有强大的技能。在大多数边缘人工智能项目中,DSP 非常重要——除了那些将深度学习与图像数据结合的项目,因为图像通常不经过太多处理即输入。
ML 从业者
机器学习从业者花时间尝试使用 ML 解决问题。ML 从业者将尝试用不同类型的学习算法框架化问题。然后,他们将使用数据集,尝试开发解决问题的算法。他们工作的关键部分是确定如何评估算法及其在实验室和现场的表现。
在边缘人工智能项目中,DSP 工程师和 ML 从业者密切合作,因为 DSP 是复杂形式的特征工程,这是 ML 工作流的关键部分。
产品工程
这一系列角色推动产品本身的开发。他们创建硬件和应用代码,并以能够在设备上高效运行的形式实现算法:
硬件工程师
硬件工程师设计驱动产品的硬件。这种设计包括捕获原始数据的传感器以及试图理解数据的处理器,还包括印刷电路板的设计和布局。
硬件工程师与算法开发角色密切合作非常重要,以确保硬件和算法相互支持。这是一个双向的过程:算法设计必须考虑到硬件约束,而硬件设计必须考虑到算法设计。
嵌入式软件工程师
嵌入式软件工程师编写使硬件实现生命的低级代码。他们的代码必须与传感器接口,运行算法,并解释其输出以做出决策。他们实现嵌入式应用程序本身。
嵌入式 ML 工程师
一些嵌入式软件工程师专门专注于机器学习。他们的工作是确保 ML 算法在特定硬件上尽可能高效地运行。他们可能对机器学习背后的数学有深入的了解,并具有低级软件优化经验。他们不一定是数据科学的专家,尽管他们可能能训练简单的 ML 模型。
这是一个非常新的角色,但它与边缘人工智能领域同步增长。
工业设计师
一个工业设计师负责产品的物理设计。这在边缘人工智能领域很重要,因为物理设计决定了传感器数据收集的许多现实情况:将传感器移动到产品的另一个位置可能会完全改变其典型输出,并使数据集立即过时。这意味着工业设计、电子工程和算法开发之间需要进行重要的沟通。
软件工程师
许多项目涉及嵌入空间以外的软件工程。例如,许多边缘 AI 项目涉及服务器端组件。编写这些后端代码需要与开发嵌入式应用程序不同的技能,因此需要不同类型的工程师。
技术服务
这些支持性角色帮助保持开发过程的技术方面运行顺利,并管理工具以保持团队的生产力和安全性:
MLOps 工程师
MLOps 工程师负责构建和维护 MLOps 解决方案,这些解决方案由团队其他成员使用。本质上,这是一个DevOps 角色,但它需要对边缘 AI 工作流程的过程和要求有深刻理解。
安全从业者
这一角色关注团队、数据和产品的安全需求。它既是一个咨询角色——帮助其他角色理解如何在其工作中保持安全——也是一个主动角色,制定措施来帮助降低安全风险。
质量保证工程师
这一角色帮助设计和实施测试计划,让产品经历其全过程,帮助团队了解产品是否达到设计目标。关于质量保证的更多信息,请参见“现实世界测试”。
边缘 AI 的招聘
边缘 AI 开发的一个重要挑战是作为一个非常新的领域,很少有人具有相关工作经验。在撰写本文时,几乎不可能招聘到具有现有边缘 AI 经验的工程师:全球可能只有几百人,大多数人仍在进行他们的第一个激动人心的边缘 AI 项目,并没有足够长的时间来感到不安。
幸运的是,这是一个新领域的事实意味着,即使是经验丰富的工程师,也只有几年的优势。尤其是在边缘 AI 工具化的最新进展方面,特别是端到端平台的形式,极大地降低了进入门槛。边缘 AI 的招聘有两个主要方向需要特定的知识:算法开发和嵌入式工程。
在算法开发的情况下,你可能需要数据科学家和机器学习从业者。一些从业者背景是应用工程,解决行业中的实际问题。其他人可能具有更加学术的背景,研究机器学习背后的原理并提出新技术。
应用从业者在问题框架方面有更多经验,这在边缘 AI 中非常重要。这使得他们成为一个理想选择,特别是作为最初或独立的聘用。尽管如此,学术研究人员仍然可以成为边缘 AI 项目的良好选择。他们可能没有在典型软件开发环境中工作的经验,可能需要更长时间来适应。但是,与应用从业者相比,他们更容易被招聘:他们只是更多。
小贴士
机器学习研究与应用机器学习非常不同,一些机器学习研究人员可能会觉得例行应用现有技术比尝试提出新技术更无聊。确保候选人清楚地了解角色期望,以避免双方的失望非常重要。
数据科学和机器学习领域的一个难点是,不多的人对传感器数据有丰富的经验。虽然视觉是常见的模态,但音频不那么常见,而时间序列传感器数据对大多数从业者来说可能是个谜题:尽管时间序列分析在数据科学中很常见,但通常不是由电子传感器产生的高频时间序列的那种类型。
幸运的是,DSP 工程师与 ML 从业者具有类似的工作流程和工具链,并且他们已经是传感器数据特征工程的专家。DSP 工程师的技能和经验使他们非常适合学习嵌入式机器学习,因此一个潜在的途径是招募 DSP 工程师并让他们学习机器学习的基础知识。由 DSP 工程师和 ML 从业者组成的团队将比任何一种角色单独组成的团队更容易应对挑战。
在嵌入式工程方面,面临的挑战各不相同。虽然与深度学习解释器(或深度学习编译器生成的代码)一起工作通常只是库集成的问题,但嵌入式工程师有时可能需要深入内部来查明问题所在。在这些情况下,对深度学习的一些知识和理解肯定是有帮助的。嵌入式工程师可能还需要负责将模型转换为适合在设备上使用的适当形式,这在一定程度上需要一些机器学习的见解。
嵌入式工程师的另一个常见任务是在软件中实现经典的机器学习模型。目前尚没有一个很好的面向嵌入式的 C++库,但通常很容易将它们移植:高级语言中有简单易懂的参考实现。
不幸的是,找到既有嵌入式工程知识又懂机器学习的工程师在一段时间内将是一个挑战。尽管如此,端到端平台使事情变得容易了许多,最终有经验的嵌入式机器学习工程师的数量会增加。但现在不应该成为阻碍:一位称职的嵌入式工程师应该能够轻松学习今天的工具。
学习边缘人工智能技能
在过去几年里,一些关于边缘人工智能学习的优秀资源已经出现。像大多数领域一样,存在理论和实践两方面。理论内容对于那些希望推动该领域发展的人最为有趣,而实践内容对于那些希望构建产品的人更为有帮助。
警告:不要迷失在细枝末节中。许多希望构建 AI 产品的人最终陷入学习的泥潭中,探索每一个可能的兔子洞,而不是真正着手开始他们的项目。事实是,这是一个庞大的领域,你永远无法全部学习。要以行动为导向,学习足够让你迈出下一步的内容,然后重新评估。成功的硬件产品需要团队,因此弄清楚你需要了解的最少信息,然后引入一些专家。
这里是我们推荐的实践和理论内容。
实践
本书的最后三章从第十一章开始,详细介绍了边缘 AI 工作流程及三个真实用例:野生动物监测、食品质量保证和消费产品。
完成后,这里还有更多内容:
嵌入式机器学习导论(Coursera 课程)
一门旨在实践介绍该主题的高评分在线课程。
带嵌入式机器学习的计算机视觉(Coursera 课程)
第一门课的后续课程,专注于视觉。
规模化应用机器学习(TinyML)(HarvardX 课程)
这一系列课程聚焦于处理嵌入式 ML 所需的应用技能和全局专业知识。
TinyML Cookbook,Gian M. Iodice 著(Packt,2022 年)
一本围绕实用“食谱”展示嵌入式 ML 中各种概念的实用书籍。
TinyML,Pete Warden 和 Daniel Situnayake 著(O’Reilly,2020 年)
一本关于在微控制器上进行嵌入式 ML 的工作介绍,重点放在 TensorFlow Lite for Microcontrollers 上的示例。
设计机器学习系统,Chip Huyen 著(O’Reilly,2022 年)
一本关于机器学习开发工作流程的绝妙书籍,针对服务器端应用,但仍然非常相关。
制作嵌入式系统,Elecia White 著(O’Reilly,2011 年)
开发嵌入式系统的最佳实用入门书籍。
理论
这些内容适合想深入研究嵌入式机器学习理论的人群。请记住,这并非成功产品开发的先决条件——所以不要感到害怕或迷失在学习的兔子洞里。³
微型机器学习(TinyML)(HarvardX 课程)
这一系列课程与前面提到的应用 TinyML(微型机器学习)有重叠之处,但从绝对基础开始,可能不是你想尽快开始构建的必要条件。
The Scientist and Engineer’s Guide to Digital Signal Processing,Steven W. Smith 著(California Technical,1997)
一本真正全面的数字信号处理指南,可以免费获取,也有硬皮书版本。对于任何将与 DSP 算法严肃工作的非 DSP 工程师来说都是一个好资源。
Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow,Aurélien Géron 著(O’Reilly,2022)
一本实用机器学习概念和技能的精彩介绍。对于任何将与 ML 算法一起工作的非 ML 工程师来说都是一个好资源。
Deep Learning with Python,François Chollet 著(Manning,2021)
另一本关于 ML 的绝妙介绍,专注于深度学习算法。
TinyML 基金会(YouTube 频道)
TinyML 基金会定期举办关于嵌入式 ML 的演讲。通常内容高度技术化,反映了研究和工程的前沿。
TinyML 论文和项目(GitHub 仓库)
这个仓库是与该领域相关的论文和资源的宝库。
工具
边缘 AI 的故事是关于工具的故事。在技术方面,大多数用于将人工智能应用于边缘设备的基本组件已经存在了十年以上。然而,这些技术——从功能强大的嵌入式处理器到深度学习模型——在首次可用时往往具有陡峭的学习曲线。
然而,随着时间的推移,我们的全球技术生态系统演变出设计来管理复杂性并改善甚至是最具挑战性技术的可用性的工具。丰富的开源和商业库、框架和产品的组合已经将边缘 AI 带入了普通嵌入式工程师的工具箱。
在过去两三年中,像TensorFlow Lite for Microcontrollers⁴ 这样的库以及像Edge Impulse⁵ 这样的端到端开发平台使得这项技术越过了门槛,实现了大规模采用。
下面的部分将详细介绍我们认为对边缘 AI 最为重要的工具。成功的团队至少应该对它们有所了解。
软件工程
大部分边缘 AI 涉及软件开发,因此现代软件工程工具非常重要。以下是一些关键贡献者。
操作系统
在开发和部署过程中考虑操作系统非常重要。在开发阶段,您选择的操作系统将决定如何轻松地使用构成边缘 AI 生态系统的极其多样化的软件工具集。两种不同的工程传统之间存在一些轻微冲突。
在嵌入式工程中,使用 Windows 作为操作系统是历史上常见的做法,一些嵌入式工具也是基于此假设编写的。相比之下,数据科学和机器学习的工具通常最适合 Unix 兼容环境,如 Linux 或 macOS。
尽管如此,在实践中这并不是一个巨大的问题。团队中并不需要每个成员都能运行所有的工具:例如,机器学习工程师可能会在 Linux 上训练和优化模型,然后将其交给使用 Windows 的嵌入式工程师。此外,有许多混合环境的工具,比如Windows 子系统 for Linux。此外,更近期的嵌入式工具链通常也能在 Unix 环境中正常工作——尽管嵌入式工程师可能仍然更喜欢 Windows 作为熟悉的环境。Edge Impulse 团队的整个团队,包括嵌入式和 ML 工程师,都使用 macOS 和 Linux 虚拟机的组合。
在部署中,操作系统有时会直接用于边缘设备。这些通常是嵌入式 Linux(裁剪版的 Linux,编译用于 SoC 运行)或实时操作系统(RTOS),后者是专门为嵌入式设计的特定操作系统,旨在以最小的开销运行。这两个选项,加上不使用操作系统的选项⁶(对于微控制器来说最常见的情况),都完全兼容边缘人工智能。
编程和脚本语言
边缘人工智能最重要的两种编程语言是 Python 和 C++。Python 目前是机器学习的首选语言,得益于大量开源数学和科学计算库,几乎被机器学习研究社区完全采纳。由于 Python 也是通用软件工程的一流语言,它击败了像 R 这样的领域特定语言。⁷ 最重要的两个深度学习框架 TensorFlow 和 PyTorch 都是用 Python 编写的,我们在“数学和科学计算库”中也会遇到一些不可思议的工具。Python 有它的怪癖,但它是开发边缘人工智能算法(从机器学习到 DSP)的正确语言。
C++(发音为C-plus-plus)是现代嵌入式软件工程中普遍存在的语言。虽然一些嵌入式平台仅支持 C(一种比 C++更简单且具有一些相似特性的语言),但通常用于边缘人工智能的高端嵌入式设备一般都是用 C++编程的。围绕 C++的生态系统提供了许多工具和库,可以使开发变得更加容易,这很幸运——因为对于大多数基于微控制器的系统来说,C++是唯一的选择。
C++ 是一种低级语言,可以对底层硬件进行大量控制。编写优秀的 C++ 代码需要技能,但其速度比使用高级语言如 Python 写的等效代码要快得多。
注意
Python 库中大部分的数学计算实际上是通过 C++ 在底层实现的:Python 代码只是作为一个方便的包装器。这让开发人员获得了最佳的两个世界。
在开发过程中,你也可能会使用诸如 Bash 这样的脚本语言。它们用于链式连接和自动化复杂工具和脚本,帮助构建应用程序并将其部署到设备上。
在目标方面,与微控制器一起工作时几乎总是会使用 C++。运行完整操作系统的 SoC 通常更加灵活 —— 你可能能够运行高级语言如 Python。权衡之处在于它们比较昂贵且消耗的能源比较多,远超小型设备。
由于大多数目标需要 C++,你需要将任何在高级语言(如 Python)中开发的算法移植以部署你的工作。稍后会介绍一些工具,这样做会更容易,但这并不总是一个简单的过程。
依赖管理
现代软件通常有大量依赖项,而 AI 开发将这一点推到了一个新的水平。数据科学和机器学习工具通常需要大量额外的第三方库;安装像 TensorFlow 这样的主要深度学习框架会带来从 Web 服务器到数据库的一切。
在嵌入式方面事情也可以变得复杂,因为信号处理和机器学习算法通常需要复杂、高度优化的数学计算库。此外,嵌入式 C++ 代码的编译和部署通常需要机器上存在一团复杂的依赖关系。
所有这些依赖关系可能是一场绝对的噩梦,管理它们真的是边缘 AI 开发中最具挑战性的部分之一。存在各种技术可以使这一过程更容易,从容器化(参见下一节,“容器化”)到特定语言的环境管理。
对于 Python 来说,其中一个最有帮助的工具称为 Poetry。它旨在简化在单台机器上多个环境中指定、安装和隔离依赖项的过程。⁸ 其他必要的工具包括特定于操作系统的软件包管理系统,如 aptitude(Debian GNU/Linux)和 Homebrew(macOS)。
依赖管理中最糟糕的部分之一出现在尝试将系统的不同部分集成在一起时。例如,使用一个版本的深度学习框架训练的模型可能与稍后发布的推断框架不兼容。这使得在开发过程的早期就对系统进行端到端的测试变得非常重要,以避免后续出现令人不快的意外。
容器化
容器化是使用操作系统级技术在被称为容器的隔离环境中运行软件。从内部看,容器与运行它的机器完全不同。它可以有不同的操作系统和依赖关系,并且对系统资源的访问受限。
边缘人工智能涉及许多不同的工具链,用于从机器学习到嵌入式开发的各种任务。这些工具链通常具有相互不兼容的依赖关系。例如,两个工具链可能需要完全不同版本的语言解释器。容器化是一个强大的工具,可以使这些不兼容的工具链在单个机器上愉快地共存。
容器通常是无状态且高度可移植的。这意味着你可以将整个费力配置的机器——用一种特殊语法描述——视为执行特定任务的命令行程序。你可以将它们串联起来以执行有用的工作,并且可以轻松地在不同的机器上运行它们,形成分布式计算环境。
同样,也可以在嵌入式设备上运行容器,通常在 SoC 上的嵌入式 Linux 中。尽管涉及一些开销,但这可以是将软件及其依赖关系打包为分发包的有趣方式。
容器化最流行的工具是Docker和Kubernetes。Docker 通常用于开发工作站上的本地使用,而 Kubernetes 用于在分布式计算基础设施中运行容器集群。
分布式计算
分布式计算是在不同的机器上运行不同进程的概念,这些机器可以位于全球任何地方,并通过互联网连接。与使用单一的高功率主机和超级计算机相比,这是一种更灵活的计算方法,也是现代大多数计算的架构风格的基础。
分布式计算对边缘人工智能至关重要,原因有很多。首先,边缘人工智能就是分布式计算的一个例子!计算是在数据产生的边缘进行的,结果要么在本地使用,要么通过网络发送。
其次,管理数据集、开发算法和训练机器学习模型可能需要大量的计算和存储资源。这使得分布式计算非常适合这些流程的部分。例如,通常会租用一台高性能的远程服务器来训练深度学习模型,而不是购买和维护办公室里的强大机器。
组织和控制分布式计算基础设施的任务被称为编排。有许多开源编排工具可用,专为不同的任务设计。Kubeflow 是一个为在多台机器上运行机器学习工作负载而设计的编排框架。
云服务提供商
类似于亚马逊网络服务,谷歌云,和微软 Azure等企业提供按需分布式计算资源,供愿意支付费用的任何人使用。这种类型的分布式计算被称为“云计算”,因为计算机网络的图表通常使用云符号表示位于本地网络外的资源。
云服务提供商托管全球大部分的网站。他们负责物理硬件和网络配置,使开发人员能够专注于构建应用程序而不是管理设备。他们大量使用容器化技术,允许许多不同的工作负载共存于同一基础设施上。
对于边缘 AI 项目来说,常见的做法是使用云计算来存储数据集、训练机器学习模型,并提供一个后端,使边缘设备能够发送和接收数据。在某些情况下,例如“级联至云”,运行在云服务器上的 AI 算法与运行在边缘设备上的算法协同工作,以提供服务。
处理数据
数据是边缘 AI 应用的关键组成部分,存在许多用于收集、存储和处理数据的工具。
数据捕获
由于偏远地区通常存在有限的连接性,因此从现场获取数据可能会很困难。两个有用的工具是数据记录器和移动宽带调制解调器。
数据记录器是小型设备,旨在捕获和记录现场传感器收集的数据。它们通常具有大量持久存储空间,用于收集传感器读数,并且可以是电池供电或连接到永久电源。使用数据记录器的好处是可以立即开始收集数据,而无需设计和构建自己的硬件。缺点是数据需要手动收集,即通过物理连接到记录器。
移动宽带调制解调器通过蜂窝网络(尽管也可以通过卫星连接)提供无线互联网连接。它们可以从世界上几乎任何地方传输数据,尽管连接性取决于当地的可用性和条件。它们提供即时数据的便利性。然而,数据费用可能相当昂贵,无线通信消耗大量能源,因此并非在所有情况下都可行。
IoT 设备管理
许多平台用于与 IoT 设备通信、管理其操作并从中收集数据。通常需要将库或 API 集成到您的嵌入式软件中。然后,软件将连接到云服务器,您可以用它来控制设备。
这些平台可以方便地收集传感器数据,特别是在已经使用设备管理软件的现场部署中。
数据存储与管理
当你收集数据集时,你需要一个地方来存储它。这可以简单到存储在硬盘上的逗号分隔文件,或者复杂到专门设计用于存储和查询时间序列数据的时间序列数据库。我们将在 “存储和检索数据” 中涵盖其中一些选项。
数据存储解决方案设计用于各种用途。一些旨在在实时查询数据时极为快速,而其他一些则旨在尽可能防止数据丢失。对于边缘 AI 应用程序,通常是批处理模式处理数据,因此性能通常不是最重要的因素。相反,您应该选择适合您收集的数据类型的简单解决方案。
AI 数据集通常存储在文件系统中,根本不使用任何类型的数据库也很常见。文件系统专为此类数据设计,而类似于 Unix 命令行提供的文件系统工具在有效处理这些数据时非常有用。Python 的科学计算生态系统包括许多工具,非常擅长从磁盘读取数据,并帮助您探索和可视化数据。
虽然并不需要高级数据库,但以正确格式存储数据仍然很重要。正如我们将在 “格式化” 中学到的那样,传感器读数本身应以高效紧凑的二进制表示形式(如 CBOR、NPY 或可能是 TFRecord)存储,后者专为机器学习训练时的高性能而设计。有关读数的元数据应存储在单独的文件(称为清单文件)或简单的数据库中。以这种方式将数据与元数据分开存储,可以使您有效地探索和操作数据集,而无需将大文件全部读入内存。
数据管道
数据管道是一个处理原始数据并将其转换为用于特定任务(例如训练机器学习模型)的过程。这是数据工程师自动化数据清洗和整理等任务的方法。典型的数据管道可能会获取原始传感器数据,对其进行过滤,与其他数据结合,并将其写入正确的格式以进行机器学习模型的训练。
存在许多用于定义数据管道的工具,有些比其他工具更复杂。Edge AI 数据管道往往涉及大量相对简单的数据,因此应避免设计用于处理结构化数据(例如存储在关系数据库中的数据)的工具。与查询能力不同,要寻找高吞吐量和足够的灵活性来运行任意信号处理算法。
许多云提供商在其分布式基础设施中提供运行数据管道的功能。一些边缘 AI 的端到端平台将数据管道作为核心功能,并专门为传感器数据的特性设计。
算法开发
算法开发是大多数工具复杂性所在;为此过程提供了丰富的软件资源。一些软件比其他软件更适合边缘 AI 应用。
数学和科学计算库
Python 社区创造了一些非常出色的软件工程奇迹,以各种开源库的形式进行数学计算和数据分析。其中一些最重要的是:
NumPy 自称为“用 Python 进行科学计算的基础包”,这完全正确。它为大多数基于 Python 的数值计算提供了高性能的支持,并且具有出色的 API,使您可以以最少的努力对大量数字数组执行复杂操作。其文件格式 NPY 是存储传感器数据的便捷方式。
NumPy 对于数组的作用,就像 pandas 对于数据表格一样。它提供了一种几乎神奇直观的语法,用于查询和转换任何可以组织成行和列的信息。Pandas 与 NumPy 兼容,因此您可以使用它来帮助探索您的传感器数据;速度超快。
SciPy 提供了一系列快速实现的算法,这些算法对于科学计算至关重要。它在开发 DSP 算法中被广泛使用,并且是许多其他工具的核心。
使用 NumPy 和 SciPy 构建的 scikit-learn 库提供了大量的机器学习算法实现,以及用于提供经过处理的数据并评估其性能所需的工具。其 API 设计使得可以互换地组合其组件,这意味着可以轻松比较和组合不同的算法。它是 Python 中经典机器学习的黄金标准,即使在使用其他框架训练深度学习模型时,其数据处理和评估工具也经常被使用。
数据可视化
在处理数据时,可视化是一种必不可少的工具——特别是涉及数字信号的数据。图形和图表使我们能够表示和解释数字信息,否则这些信息将难以理解。Python 生态系统中有一些出色的数据可视化库。它们可能非常复杂,尤其是如果您想要超越提供的默认设置来定制可视化效果时,但一旦掌握它们,它们可以迅速将数列转化为清晰的见解。
最常见的两个库是Matplotlib和seaborn。Matplotlib 提供了许多不同的方法来创建数据可视化;它通常用于创建科学出版物中的图表。其语法可能有点具有挑战性,但由于其广泛流行,通常可以通过快速的网络搜索帮助您解决问题。
Seaborn 是建立在 Matplotlib 之上的,旨在简化一些复杂性,使得像图 5-2 中那样的吸引人的可视化更加容易,而不会陷入复杂的 API 中。它专门设计与 pandas 搭配使用。

图 5-2。该图显示了植物测量数据集中各列的范围和均值;这是seaborn 示例画廊中的一个可视化实例。
Seaborn 和 Matplotlib 输出图像文件,但某些可视化库,如Plotly,生成可以动态探索的交互式可视化。
交互式计算环境
边缘 AI 开发涉及许多超出常规软件工程上下文的探索。探索性数据分析、数字信号处理和机器学习都涉及尝试不同的想法并快速可视化结果的工作流程。
存在各种交互式环境来实现这一目的。与仅运行脚本并将结果写入文件或必须构建整个 Web 应用程序以表达信息视觉化不同,交互式计算环境允许代码和可视化并存于同一编辑器中。
Python 代码最重要的交互式环境称为 Jupyter Notebook。在笔记本中,您可以编写和运行 Python 代码,并且代码的输出会显示在旁边。这包括使用诸如 Matplotlib 等库生成的任何可视化效果,如 图 5-3 所示。

图 5-3. 来自 Jupyter Notebook 的截图,显示了丰富文本、代码以及代码的输出;所展示的笔记本来自 TensorFlow Lite for Microcontrollers 的 Hello World 示例
这使您能够构建交互式的动态文档,其中包含算法的实现和运行结果。它们既是实验的交互工具,也是展示您所做工作的文档证据。常见的工作流程是在笔记本中尝试算法,直到找到最佳候选者,然后一旦确认代码运行良好,再将其移植到常规的 Python 脚本中。
Jupyter 可以在本地运行,但也有基于 Jupyter 的托管环境。其中之一是 Google Colab,另一个是 Amazon SageMaker。这两者都可以免费使用,但如果需要额外计算资源则需付费。
另一个常见的交互式计算环境是 MATLAB,它结合了类似的交互式环境和自己的编程语言。在学术界和工程领域很常见,但作为需要付费许可的闭源商业产品,相比于软件工程师而言流行度较低。那些有电子工程背景的人通常熟悉 MATLAB,包括 DSP 工程师。
甚至还有一种专门设计用于边缘 AI 的交互式环境。OpenMV IDE 是由 OpenMV 团队创建的开源产品,支持机器视觉应用的开发。它能够轻松测试和实现解释视觉信息的算法,随后可以部署到 OpenMV 的硬件设备和其他目标上。OpenMV IDE 的独特之处在于,它可以连接到装有摄像头的硬件设备,并实时显示算法运行的结果。
数字信号处理
DSP 算法开发通常在 Python 或 MATLAB 中进行。个别 DSP 工程师通常更喜欢其中的一种环境。
在 Python 中,SciPy 的 scipy.signal 模块提供了许多重要的 DSP 算法的实现。在 MATLAB 中,信号处理 和 图像处理 工具箱非常有帮助。
MATLAB 拥有一些不错的基于 GUI 的工具,可以减少算法开发所需的编程量,但 Python 的优势在于可以直接与用于训练机器学习模型的工具链兼容,而且是免费的。
越来越受欢迎的第三选择是 GNU Octave,旨在成为 MATLAB 的免费开源替代品。
深度学习框架
深度学习工具生态系统主要由两个广受欢迎的开源框架主导,均为用于 Python 编写:TensorFlow,由 Google 创建,以及 PyTorch,由 Meta 创建。⁹ 每个框架最初都是用于内部训练深度学习模型的系统,并反映了各自赞助商的优先事项。
深度学习框架不同于典型的软件库(如 NumPy 或 scikit-learn),它们试图在单一平台下提供整套工具。TensorFlow 和 PyTorch 都包含用于定义和训练机器学习模型、处理数据、协调分布式系统、部署到不同类型计算平台等系统。
示例 5-1. 使用 Keras 定义和训练简单的深度学习模型架构,Keras 是 TensorFlow 的高级 API。
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# Defining the model architecture
model = Sequential()
model.add(Dense(units=64, activation='relu'))
model.add(Dense(units=10, activation='softmax'))
# Setting up the training process
model.compile(loss='categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
# Training the model
model.fit(x_train, y_train, epochs=5, batch_size=32)
# Evaluating the model
loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128)
两者工具的历史使得 TensorFlow 成为工业界的主要框架,而 PyTorch 则是深度学习研究人员首选的工具。¹⁰ 其中很大一部分原因是 TensorFlow 生态系统中有更多模型部署选项可用,对于边缘人工智能尤为重要。
在撰写本文时,优化模型效率并将其部署到边缘设备的工具大多都是为了与 TensorFlow 生态系统集成。TensorFlow 和 PyTorch 在模型存储方面有不同的格式,虽然有转换方式,但并非一蹴而就的过程。¹¹ 这意味着目前从事边缘人工智能的大多数机器学习工程师都使用 TensorFlow。
由于 PyTorch 是研究人员的首选框架,许多最新的模型架构首先以 PyTorch 格式发布。这对于使用 TensorFlow 进行部署的工业开发人员可能会感到沮丧。幸运的是,大多数专注于开发适合边缘部署的更小更高效模型的研究人员都在 TensorFlow 生态系统内进行。在视觉对象检测领域,模型不兼容性最令人沮丧,因为对象检测模型的训练代码往往复杂且难以从一个框架移植到另一个框架。
在撰写本文时,TensorFlow 是边缘人工智能开发的最佳框架选择。使用 PyTorch 的开发者在尝试部署模型时将面临复杂且不可靠的转换过程。随着 PyTorch 生态系统的成熟,未来其如何发展将非常有趣。
模型压缩和优化
边缘设备通常需要小型、高效的模型 —— 特别是在深度学习的背景下,参数数量和计算需求可能会迅速增长。在“压缩和优化”中,我们学习了一些可用于提升模型性能的各种技术。其中一些技术是在训练过程中应用的,而另一些则是在训练后进行的。
压缩和优化工具通常作为深度学习框架的一部分提供,或者由硬件供应商提供,其硬件支持特定的优化。TensorFlow Lite 转换器已成为运算融合和基本量化的事实标准,TensorFlow Lite 模型文件格式在行业内接近成为标准。¹² 同样在 TensorFlow 生态系统中,TensorFlow 模型优化工具包提供了一套开源工具,涵盖了其他类型的优化和压缩。
值得记住的是,大多数优化方法在推断时也需要特定的工具支持,后文将在侧边栏“推断和模型优化”中进行详细讨论。目前,最受支持的优化方法是量化,广泛支持 8 位量化运算符实现。其他技术支持较少,其中稀疏性是一个最大的误导:听起来很引人注目,但目前几乎没有硬件支持它。
实验跟踪
算法开发是一个迭代的、探索性的过程,在项目的过程中,你可能会尝试数百甚至数千次不同的方法来找到一个可以令人满意的解决方案。保持科学性很重要,系统地测试想法,而不是随意进行修改并希望得到最佳结果。为了实现这一点,您需要一种跟踪实验的系统。
一个典型的实验可能涉及采集特定的数据样本,应用特定的 DSP 算法,使用这些特征训练一个具有独特超参数集的机器学习模型,然后在标准测试数据集上测试该模型。这种情况涉及许多变量:样本的选择、DSP 算法、模型及其参数。
实验追踪工具旨在记录运行的实验、变量设置以及结果。它们试图组织起本来可能是不可靠的、非正式的笔记过程,并努力不漏掉任何细节。实验追踪器还可以存储由实验产生的工件:训练脚本、数据集和训练模型。这有助于在后期理解和重现您的工作。
实验追踪器既可以作为开源包,也可以作为托管的商业产品提供。其中一个最简单的选择是TensorBoard,它是 TensorFlow 生态系统的官方部分¹³。TensorBoard 提供了一个简单的 Web 界面,用于可视化和比较训练运行期间收集的日志,并提供了一些非常强大的工具,用于优化和调试训练代码。它对于跟踪基本实验很有用,尽管它并非设计为一个将持续存在项目生命周期的持久性数据存储,且在运行大量试验时表现不佳。
一个更复杂的开源选项是MLflow。它是一个复杂的 Web 应用程序,由一个数据库支持,可以追踪实验,存储训练模型,并打包数据科学代码,以便轻松重现实验。它比 TensorBoard 更适合长期使用,并且可以扩展以跟踪成千上万个实验。它没有 TensorBoard 的优化和调试功能,后者仍然是优化训练计算性能的首选工具。
存在许多商业产品可帮助实验追踪。一个显著的选择是Weights & Biases,它具有简单的 API 和精心设计的 Web 界面(以及许多适合于 MLOps 类别的特性,我们将在“机器学习运营(MLOps)”中探讨)。商业工具的一个好处是你无需托管它们在自己的基础设施上;你只需支付月费,由其他人进行设置和维护,并确保它们的安全性。
自动化机器学习(AutoML)
一旦您开始使用软件跟踪实验,从软件中运行它们也是一种简单的步骤。自动机器学习(AutoML)工具旨在自动化迭代探索设计空间的过程。给定数据集和一些约束条件,它们将设计实验来测试不同变量组合,以尝试找到最佳模型或算法。
这个过程被称为超参数优化¹⁴,它是找到特定数据集最佳模型的一种高效方法。有许多不同的算法指导超参数优化,从简单的网格搜索(逐个尝试每个可能的变量组合)到像Hyperband这样的具名算法,旨在智能控制过程以达到最大效率。
AutoML 并非一个可以为你解决问题的魔法棒。在正确的方式下,仍然需要领域专业知识来框定问题并设置设计空间。AutoML 可以 做的是在你专注于更有生产力的事情时,消除机器学习工作流程中的猜测和单调乏味。
有些 AutoML 系统仅将设计空间作为输入,并输出要运行的实验列表,而其他一些则更进一步走向 MLOps 领域(参见下一节,“机器学习运维(MLOps)”),通过编排使用分布式计算技术运行实验的过程。一种特别复杂的 AutoML 变体是神经架构搜索(NAS),它将机器学习融入到探索设计空间的过程中。
具体而言,我们推荐 Ray Tune 作为一种流行的开源框架,用于超参数调整,能够在您的分布式基础设施中编排运行超参数优化的任务。Weights & Biases 的 Sweeps 是一款商业化的托管产品,帮助编排在您自己的硬件上进行实验。
AutoML 在边缘 AI 方面尤为强大。这是因为为边缘设备设计的模型往往小巧且训练速度快,这使得可以尝试许多不同的选项变得容易。这也特别重要,因为在边缘 AI 中,我们优化的不仅仅是模型准确性:我们还需要找到尽可能小、快速和低功耗的模型。
典型的 AutoML 工具不考虑这些因素,但一些端到端的边缘 AI 平台却考虑到了¹⁵。
机器学习运维(MLOps)
机器学习工作流程涉及许多活动部分,而 MLOps 则是跟踪它们的全部艺术和科学。它涵盖了本章中我们讨论过的许多类型的工具,从数据存储系统到实验跟踪和 AutoML 能力。
作为一个机器学习项目的工程师,无论你是否意识到,你都在进行 MLOps。即使在最简单的项目中,跟踪数据集、训练脚本和当前最佳模型都可能是一个挑战。在更复杂的项目中,每个工作流部分都在不断地根据反馈循环演变,如果没有有效的工具,掌握进展几乎是不可能的。
一个 MLOps 系统可以由各个组件构建:你可以选择一个工具来管理数据集,另一个工具来跟踪实验,以及另一种工具来存储最佳模型。同样常见的是使用综合框架来处理整个过程的每个阶段。还有可能混合使用综合框架和符合特定需求的各种个别工具。
MLOps 是一个包括许多工具类别的广泛领域,其中一些我们在本章前面已经看过。网站ml-ops.org,是理解 MLOps 的好资源,指出 MLOps 包括以下任务:¹⁶
-
数据工程
-
数据、ML 模型和代码的版本控制
-
持续集成和持续交付管道
-
自动化部署和实验
-
模型性能评估
-
在生产中监控模型
由于边缘 AI 是一个新领域,大多数 MLOps 系统设计时假设模型将通过网络服务“服务”,而非部署到边缘设备。边缘 AI 开发的独特性质涉及一些额外任务,包括:
-
从设备和传感器中捕获数据
-
数字信号处理和基于规则的算法
-
估计设备性能¹⁷
-
模型压缩和优化
-
转换和编译以支持边缘设备
-
跟踪当前在现场的模型版本
MLOps 的一个很好的思考方式是将其视为一个“堆栈”:一组软件工具共同工作,以实现边缘 AI 系统的开发、部署和维护。公司 Valohai 提出了一个MLOps 堆栈模板的概念:一个显示 MLOps 堆栈所有组件如何配合的图表。他们最初的堆栈模板基于服务器端上下文,但图 5-4 展示了适应边缘 ML 的思路。

图 5-4. 适用于边缘 ML 的堆栈模板;你需要为每个框框找到一个解决方案,并可能根据特定用例选择其他解决方案。
在开发过程中,你可能选择逐步从各种软件组件中组装你的堆栈。另一方面,你可能受益于与专为边缘 AI 设计的综合 MLOps 平台合作,正如我们在“面向边缘 AI 的端到端平台”中所见。
MLOps 是一个广泛的主题,在一本关于边缘 AI 的书中无法完全覆盖。如果你想深入了解,我们推荐以下资源——需要注意的是,大部分 MLOps 内容是为服务器端模型而非边缘 AI 写的:
-
网站ml-ops.org。
-
介绍 MLOps,作者 Mark Treveil 等人著(O’Reilly,2020)。
-
Google Cloud 对 MLOps 的介绍,一篇优秀的技术文章。
在设备上运行算法
设计算法和训练模型需要一组工具,而在设备上高效运行它们则需要另一组工具。这些包括通用的 C++库和针对特定硬件架构优化的高效实现。
数学和 DSP 库
提供常见数学运算的各种实现,为 DSP 算法和深度学习运算提供功能。从头开始实现这些基本算法将非常耗时。一些显著的例子包括:
硬件设备通常具有改进常见算法性能的功能。这些功能包含在硬件特定的库中,例如为 Arm 的 Cortex-M 和 Cortex-A 硬件提供了许多流行 DSP 算法的优化实现的CMSIS DSP 软件库。
针对深度学习内核也有类似优化的实现,例如CMSIS NN 软件库。许多现代处理器架构,包括微控制器和 SoC,都有相应的等效实现。在选择硬件时,应注意优化内核的可用性,因为它们可能导致延迟大幅(10–100 倍)不同。
机器学习推断
在边缘设备上运行推断的一种方式是编写定制程序,在目标架构上手动优化实现特定的深度学习模型。然而,这将耗费时间且缺乏灵活性:无法将代码重用于新的应用程序或不同的硬件,如果对模型进行任何更改,就必须修改整个程序。
开发人员已经提出了各种解决方案来避免这个问题。¹⁸ 最常见的方法如下:
解释器
解释器(或运行时)是一个程序,它读取描述模型的文件,包括其操作和参数,然后使用一组预先编写的运算符依次执行模型的操作。解释器非常灵活:使用解释器,可以使用相同的几行代码互换地运行任何模型。但这样做会引入一些操作开销,超出模型操作本身所需的范围。解释器消耗额外的 RAM、ROM 和 CPU 周期。
最广泛使用的解释器都来自于 TensorFlow 生态系统。TensorFlow Lite最初是为手机设计的,但在许多流行的 SoC 上也能运行,而TensorFlow Lite for Microcontrollers则非常适合微控制器和 DSP。它们都是用 C++ 实现的,但 TensorFlow Lite 提供了 Python 和 Java 的 API 以便使用。它们都受益于由TensorFlow Lite 转换器提供的操作融合和量化功能。
解释器使用的内核可以根据目标设备进行切换,因此可以在可用时使用高效优化的内核。这些内核已经为几种常见设备和架构提供。
代码生成编译器
采用代码生成方法,一个生成代码的编译器以模型文件作为输入,并将其转换为一个实现模型的程序。对于操作符支持,程序依赖于一个预先编写的操作符库,按正确顺序调用它们并传递适当的参数。
代码生成提供了与基于解释器的方法许多相同的优点,但消除了解释器本身的大部分开销。代码生成甚至可以利用解释器可用的广泛预编写的操作符:例如,Edge Impulse 的EON 编译器兼容 TensorFlow Lite for Microcontrollers 的内核。
字节码编译器
如果编译器了解目标的相关知识,它可以直接生成实现模型的字节码,并在此过程中应用特定于目标的优化。这将导致高效的实现,利用硅片上可用的所有性能增强功能。例如,Synaptics 的TENSAI Flow 神经网络编译器专门设计用于编译模型以部署到 Synaptics Katana Edge AI 处理器。
虚拟机
字节码编译器方法的主要缺点是必须为每个要定位的设备编写一个编译器,而编写编译器是一项困难的任务。为了解决这个问题,一些编译器针对所谓的虚拟机:一个位于硬件之上的抽象层,提供映射到各种低级处理器功能的指令。
抽象层稍微降低了效率,但好处可能会超过缺点——尽管虚拟机仍然需要移植到新处理器上。这种方法被Apache TVM采用,它还使用在设备上运行时,可以迭代测试不同实现以找到最高效的方式。
硬件描述语言
一种新兴的趋势是使用特殊的编译器生成硬件描述语言(HDL),这是描述处理器体系结构并用于编程 FPGA 和 ASIC 的代码。使用这些技术,可以在硬件中直接实现模型,这可以非常高效。
CFU Playground 和 Tensil 都是旨在通过这种方法更容易设计定制加速器的开源工具。
替代方法
一些加速器芯片是使用系统编程的,不在代码和编译的正常工作流程之外。例如,一些具有神经网络核心硬件实现的芯片提供了一个接口,通过这个接口可以将模型的权重直接写入到特殊的内存缓冲区,与任何应用程序代码分开。
设备端学习
正如我们在“On-Device Training”中学到的,深度学习训练的数据和计算需求意味着设备端训练仍然具有有限的实用性。大多数情况下,“设备端训练”意味着一个简单的方法,例如计算嵌入向量之间的距离,例如确定两个指纹的嵌入是否匹配。
真正的深度学习训练在边缘设备上发生的情况非常罕见。如果您确实有具备所需存储和计算能力的设备——通常是 SoC 或移动电话——TensorFlow Lite 提供了一些功能。
问题仍然是很难理解设备端训练的模型是否表现良好。除非有非常充分的理由需要它,否则最好避免设备端深度学习。¹⁹
联邦学习仍然是许多人着迷的话题,但正如我们早前在书中学到的那样,它并不特别适合绝大多数问题。此外,围绕联邦学习的工具仍然比较原始和实验性。²⁰ 许多人觉得被联邦学习吸引,最终浪费时间:一个项目真正需要它的机会非常渺茫。但是,如果你真的有冲动想深入了解,TensorFlow Federated 是一个很好的资源。
嵌入式软件工程和电子学
边缘 AI 是嵌入式软件工程的一个子领域,与电气工程和电子学密切相关。每个领域都涉及大量的工具和技术——我们没有足够的空间在本书中覆盖它们所有。
相反,我们将逐步介绍在边缘开发 AI 时特别重要的部分。
刚刚开始
如果您正在原型化自己的边缘 AI 项目,但没有太多嵌入式经验,Arduino和Arduino Pro产品是一个很好的起点。Arduino 已经创建了一个对初学者来说易于使用但又足够强大以构建真实应用程序的嵌入式开发环境——如果您是一位开始使用边缘设备的 ML 工程师,或者是两个领域的新手,这非常完美。Arduino 团队从一开始就理解了边缘 AI 运动的潜力,并为其增长做出了很多贡献。
嵌入式硬件工具(Embedded hardware tools)
开发嵌入式软件具有挑战性,因为嵌入式设备的特性。当软件运行在一个有限显示其内部状态方式有限的独立设备上时,调试会更加困难。嵌入式程序必须处理从基本的硬件集成(例如需要为传感器等硬件编写自己的驱动程序)到低级通信协议复杂握手的一切。
因此,嵌入式开发需要一些对其他软件工程师来说可能看起来不寻常的工具。其中一些包括:
-
设备编程器(Device programmers),这些是硬件设备,允许开发者向嵌入式设备上传新程序。它们通常是特定于设备的。
-
调试探针(Debug probes),硬件设备,连接到嵌入式处理器并允许在运行时分析程序。它们也是特定于设备的。
-
USB 到 UART 适配器(USB to UART adapters),在开发者工作站和嵌入式设备之间发送和接收任意数据。它们是通用的。
-
多用表(Multimeters),用于测量电压、电流和电阻,可以帮助理解在程序控制下嵌入式电路的状态。
-
示波器(Oscilloscopes),用于测量设备或 PCB 上的信号,以电压随时间的表达方式。
这些工具对于深入、操作和理解嵌入式设备的状态至关重要。例如,要测试程序是否正常运行,您可以在处理器达到特定点时让其切换特定引脚。然后您可以使用多用表来测量引脚是否已切换。另一种常见的与嵌入式设备通信的方式是通过串行(UART)电缆,它可以在相对较低的频率下发送和接收数据,但足以在合理时间内传输传感器数据。
开发板(Development boards)
单独的嵌入式处理器只是包裹在塑料中的一小片砂子。要实际运行它,需要将一小组其他电子组件连接起来。正如我们在“板和设备”中看到的那样,开发板(或开发板)提供了一个方便的即插即用平台,包括嵌入式处理器和各种输入输出,通常还包括一些传感器。
开发板的目标是允许嵌入式工程师评估特定芯片是否适合项目,并允许软件开发在不受硬件开发过程阻碍的情况下继续进行。一旦产品自己的硬件的工作迭代准备好,开发可以转移到那里。但快速原型设计平台(例如Arduino Pro)是个例外,它们设计用于小批量生产设计。
大多数嵌入式处理器家族都有开发板可用。在选择硬件时,建议获取几个不同的开发板进行实验。例如,您可以尝试在几个不同的开发板上运行您的深度学习模型的早期版本,以了解它们的性能差异。
一些端到端平台(参见“端到端平台用于边缘人工智能”)与开发板深度集成,允许您从其传感器捕获数据或部署和评估模型,而无需编写一行代码。这在开发和测试中非常有用。
嵌入式软件工具
对于边缘人工智能的目的,嵌入式软件工程通常指的是 C++开发。这可以在您选择的文本编辑器中完成,但嵌入式处理器供应商通常也会提供他们自己的集成开发环境(IDE),与其硬件完美集成,使上传和调试代码更加简便。
供应商通常会提供 SDK、驱动程序和库,可用于其硬件,以帮助您访问各种处理器功能,但它们的质量不一定很高,通常更像是概念验证而非生产质量的代码。
为了减少需要编写的样板代码量,您可以选择使用实时操作系统(RTOS)。RTOS 提供了简单操作系统的功能,但它作为一堆库代码随您自己的程序一起编译。然后,您可以调用 RTOS API 执行控制外设或执行网络通信等操作。
嵌入式开发经常涉及复杂的工具链:由硬件供应商提供的程序和脚本,用于将代码从文本文件转换为程序,并将其“烧录”到硬件设备上。
工作流程通常如下:
-
对源代码进行更改。
-
运行编译器(由处理器供应商提供)和链接器将您的代码转换为二进制文件。
-
运行脚本将您的代码烧录到嵌入式设备上。
-
使用串行连接与设备通信并测试您的代码。
当您的代码在设备上运行时,您通常可以使用称为调试探针的硬件工具从开发机上检查它。这使您可以像在本地运行代码一样进行调试,设置断点,检查变量并逐步执行代码。
你的代码中有些部分将是通用的 C++代码,可以在开发机上无问题运行,可能以单元测试的形式存在。然而,你也会有大量与处理器特定硬件 API 集成的代码。这些代码无法在开发机上运行——所以你可以选择无所作为,仅在设备上进行测试,或者尝试使用仿真器。
仿真器和模拟器
仿真器 是一种软件,旨在虚拟复制处理器,可以在开发机上运行嵌入式代码,而不必将其烧录到设备上。它永远无法完美地复制真实硬件——例如,它可能无法以与真实硬件上的程序完全相同的速度运行——但它足够接近,成为一个有价值的工具。
如果你需要确定程序运行速度,例如估算 AI 算法的延迟,精确的周期仿真器将允许你确定在真实硬件上运行的时钟周期数。你可以将这个数字除以时钟速率,得到精确的延迟估计。仿真器实际上不会以那样的速度运行,但它将为你提供所需的信息,以便创建估计。
模拟 是使用软件模拟整个设备的过程,包括模拟处理器以及它可能连接的所有其他设备,包括传感器和通信硬件。一些模拟器甚至可以表示多处理器板或整个互连设备网络。
并非所有处理器都有仿真器,但Renode是一种功能强大的仿真和模拟环境,支持许多常见的处理器架构,而Arm 虚拟硬件则允许你在云中仿真 Arm 处理器。
嵌入式 Linux
到目前为止,我们提到的大多数专用嵌入式工具都是为微控制器和其他裸金属设备设计的。SoC 和边缘服务器则是另一回事:具有足够的计算能力和内存来托管全功能操作系统,SoC 开发与个人计算机和 Web 服务器的开发更加相似。这是它们的主要优势之一:开发人员不需要那么多专门的技能。
典型的 SoC 将运行 Linux 发行版,并具备所有相关工具和库的帮助。编程可以使用几乎任何语言进行,与其他平台一样存在权衡:低级语言如 C++快速高效,而高级语言如 Python 灵活易用。
谷歌提供了一个TensorFlow Lite 运行时,为一些流行平台预构建,你可以直接使用 Python 计算库:例如,你可以在应用程序中使用 SciPy 的数字信号处理函数。
嵌入式 Linux 设备甚至可以利用容器化进行部署:嵌入式应用程序可以打包为 Linux 容器,使其易于安装和使用。
在 SoCs 中,通常使用现成的板卡进行生产安装是相对常见的。存在许多设计和销售基于 SoC 的平台的供应商,这些平台设计用于特定应用程序。例如,你可以购买设计用于工业部署的耐用外壳的设备。要部署,只需连接所需的传感器并安装你的应用程序。
在处理 SoCs 时的一个挑战是,尽管使用了熟悉的 Linux 环境,预构建的软件包并不总是可用的。你可能需要习惯于从源代码构建库来使你的应用程序工作,这有时可能会有点复杂。
当与具有完整操作系统的设备一起工作时,考虑安全性是很重要的。运行在 SoC 上的嵌入式 Linux 需要像网络中的任何其他机器一样严格锁定,以避免成为攻击的矢量。不安全的物联网设备因易受黑客攻击而臭名昭著,并被用于攻击其他系统。
自动化硬件测试
现代软件工程的最佳实践鼓励使用持续集成测试:每个代码变更都通过一套自动化测试进行测试。创建嵌入式应用程序的自动化测试可能很困难,因为与硬件交互的代码只能在目标设备上测试,而不能在开发机器上测试。
然而,嵌入式设备很容易陷入无法运行测试的状态。例如,如果程序崩溃,则可能无法在不物理干预的情况下重新启动设备。同样,上传新固件可能需要物理干预。
为了解决这个问题,开发人员构建了可以与嵌入式设备交互以便于更轻松测试的自动化硬件测试系统。这些系统是软件和硬件的组合,可以执行诸如刷新新代码、在测试之间对设备进行电源循环,甚至向 I/O 端口或传感器提供输入等操作。
自动化硬件测试系统通常是定制构建的。它们围绕一个主机系统(可能是嵌入式设备本身)构建,该系统连接团队使用的持续集成工具,并连接到打算运行代码的设备。
如果需要测试与传感器的集成,例如应该检测关键词的麦克风,主机系统甚至可能配备可以按需发出关键词的扬声器。
边缘 AI 的端到端平台
在理想的情况下,任何具备某个领域专业知识的团队都能够捕捉其知识并将其部署为边缘 AI。深入了解诸如医疗保健、农业、制造业和消费技术等多个领域的人士应能利用他们所知,构建出令人惊叹的 AI 驱动产品。
不幸的是,由于涉及太多的组成部分和学习内容,边缘 AI 开发过程很容易让人感到不知所措。工作流程的大部分精力都集中在非领域知识上,而是集中在构建跨多个前沿领域的复杂产品所需的神秘工程技能,包括机器学习、数字信号处理以及嵌入式硬件上的低级软件工程。
在早期阶段,只有少数偶然具备所有必要技能的技术人员能够使用边缘 AI 技术。然而,过去几年中,涌现出了一个充满活力的工具生态系统,旨在降低准入门槛,使没有机器学习或嵌入式系统背景的人们也能构建出新的优秀产品。
端到端边缘 AI 平台旨在协助开发者完成应用程序开发的整个过程:收集、管理和探索数据集;执行特征工程和数字信号处理;训练机器学习模型;优化嵌入式硬件的算法;生成高效的低级代码;部署到嵌入式系统;并评估在实际数据上的系统性能。这个流程在 图 5-5 中有所总结。

图 5-5. 使用端到端平台的一个主要优势在于它包含了迭代、数据驱动反馈循环所需的所有组件;话虽如此,最灵活的平台提供了与外部工具集成的接口(图片由 Edge Impulse Inc. 提供)。
端到端平台旨在将 MLOps 原则应用到创建将在嵌入式设备上运行的算法的特定过程中。作为高度集成的工具,它们能够减少开发过程中的大部分摩擦:不再需要花费大量时间让工具链的不同部分协同工作,全面的流程视角提供了有益的指导,大幅降低了风险暴露。
例如,端到端平台可以分析数据集,以帮助用户选择最适合的 ML 模型类型,或者提供关于设备性能的估算,以帮助开发者选择算法或嵌入式处理器。平台可能执行 AutoML,目的是在特定设备上找到信号处理和模型的最佳组合,以及在最大指定延迟或有限功耗预算内进行优化。²¹ 通常有各种预优化的可部署算法或架构可供选择,适用于各种处理器。
平台还可以帮助团队协作。例如,基于云的边缘 AI 平台可以充当团队数据集和工作流工件的中央存储库。API 和可配置的 ML 管道允许团队自动化常规任务:例如,每当有新数据可用时,可以训练、测试和部署模型的新版本。可视化和低代码用户界面使得任何团队成员都能贡献见解,而不仅仅是那些具备现有数据科学或嵌入式工程技能的人。
云端平台还允许开发人员受益于分布式计算,而无需管理自己的系统。例如,数据处理和模型训练可能在由平台管理而非用户管理的强大云服务器上进行。这简化了运行 AutoML 的过程,其中实验可以并行运行,如图 5-6 所示。

图 5-6. 使用 Edge Impulse 的 EON Tuner 进行的 AutoML 扫描;通过端到端平台,信号处理和机器学习算法的优化可以手牵手进行,包括对设备延迟和内存使用的估计。
最佳端到端平台专注于缩短边缘 AI 工作流中所有反馈环路。它们使快速迭代成为可能,在开发和测试之间来回移动的开销最小化。这样一来,建立成功产品变得更加容易,因为您能够立即检测并在任何问题上进行调整。
传统上,首次在设备上运行算法——使用真实传感器数据——是一个棘手的过程。一些端到端平台为流行的开发板提供预构建的固件,使您能够捕获传感器数据,并在不编写任何代码的情况下部署和测试模型。这使您能够关闭模型开发和实际测试之间的循环。
端到端平台提供的另一个重要优势是能够方便地尝试各种硬件,以找到最合适的解决方案。同一个模型可以通过几次点击以优化的形式部署到多种微控制器、SoC 和 ML 加速器中,使开发团队能够比较性能并确定适合其应用程序的正确选择。手工完成这一过程可能需要数周时间。
AI 生态系统建立在开源工具之上,良好的端到端平台将允许您根据需要继续使用它们;它们将在整个工作流程中与行业标准技术集成,并且不会依赖供应商锁定以保持您作为客户。您应该能够轻松导出您的数据、模型和训练代码,并且可以简单地创建混合 MLOps 堆栈,以整合多个解决方案的部分。
到这一步,值得注意的是,本书的作者丹尼尔和珍妮是Edge Impulse的设计和开发团队成员,这是一个极其流行的端到端边缘人工智能开发平台。当推荐者对推荐物有既得利益时,采纳建议就显得尤为重要!因为我们从事端到端工具的开发,所以我们能推荐的选择也是有限的。
希望这本书的历史能够给予一些安心。书中的一位作者丹尼尔曾是TinyML的共同作者,这本书帮助更广泛的读者了解嵌入式机器学习领域。TinyML介绍了使用开源工具构建边缘人工智能软件的过程。虽然有大约 500 页,但它仅涵盖了基础知识,并依赖于读者学习 Python 和 C++。直接使用低级工具并不是一个高效的方法。
编写TinyML激发了两位作者尝试为开发者简化生活。丹尼尔随后加入 Edge Impulse 担任创始工程师,他受到公司 CEO 演示的启发,在不到十分钟内构建和部署了一个用于活动分类的深度学习模型。TinyML的另一位共同作者皮特·沃登正致力于通过尽可能紧密地集成传感器和机器学习来简化机器学习部署。
概要
我们现在已经接触到成功的边缘人工智能项目所需的人员、技能和工具。从下一章开始,我们将通过迭代开发工作流程,探索真实团队用于构建应用程序的旅程。
¹ 请参阅“四种多样性类型是什么?”以获取有关四个核心领域的更多信息。
² 这是“吃自己的狗食”战略的一部分,详见“真实世界测试”。
³ 记住,学习的最佳方式是实践!不要陷入先学习所有理论的常见陷阱。这个领域发展如此迅速,你永远无法希望掌握所有知识。
⁴ 由当时在 Google 的 Pete Warden 创建,他还友好地为本书写了序言。
⁵ 这让本书的作者们印象深刻,足以让我们离开 Google 和 Arm 的工作来投身其中。
⁶ 也称为“裸机”。
⁷ 一种用于统计计算的流行语言,通常不用于数据分析之外的目的。
⁸ 最常见的 Python 依赖管理工具是 pip 和 Conda; Poetry 是一个相对较新的工具,但非常推荐使用。
⁹ 早期称为 Facebook 时。
¹⁰ 两个框架的历史和比较非常有趣,AssemblyAI 的这篇精彩博客文章 很好地总结了这一点。
¹¹ 事实上,即使对于经验丰富的开发者来说,这也可能是一场绝对的噩梦。
¹² 还有其他格式在使用,比如 ONNX,但 TensorFlow Lite 格式目前是最流行的。
¹³ TensorBoard 可同时与 TensorFlow 和 PyTorch 配合使用。
¹⁴ 或超参数调整。
¹⁵ 在“边缘 AI 的端到端平台”(#end_to_end_platforms) 中首次引入。
¹⁶ 在 ml-ops.org 的ML 运维现状中列出。
¹⁷ 包括模型质量和计算性能两方面。
¹⁸ Pete Warden 写了一篇优秀的博客文章,详细介绍了这一领域的技术挑战。
¹⁹ Pete Warden 的博客文章,“为什么边缘计算的培训不足?”(oreil.ly/vo7-R) 很好地阐明了这个主题。
²⁰ 尽管随着时间的推移它无疑会得到改善。
²¹ Kanav Anand 等人的论文,“深度学习中的黑魔法:人类技能如何影响网络训练”(oreil.ly/-TlS9) (arXiv, 2020),显示出先前经验在手动调整机器学习模型时对性能有显著影响,这表明了自动化机器学习工具的价值。
²² Pete Warden 等人的论文,“机器学习传感器”(oreil.ly/xOtDp), arXiv, 2022。
第六章:理解和框架问题
接下来的五章提供了使用边缘人工智能的路线图。我们将建立以下最佳实践:
-
通过边缘人工智能的视角查看您想解决的问题
-
构建允许您训练模型和评估算法的数据集
-
设计利用边缘人工智能技术的应用程序
-
通过迭代过程开发有效的应用程序
-
测试边缘人工智能应用程序、部署它们并在现场进行监控
特别是对于本章,我们将首先介绍边缘人工智能项目的高级通用工作流程。这应该让您对如何将所有内容整合在一起有所了解。之后,我们将学习如何评估项目,以确保它们适合边缘人工智能,然后逐步介绍为解决特定问题而选择哪种类型的算法和硬件,以及开始考虑规划我们的实施。
边缘人工智能工作流程
与任何复杂的工程项目一样,典型的边缘人工智能项目涉及多条并行运行的工作轨道。图 6-1 将它们放在了背景中。

图 6-1. 边缘人工智能工作流程,分为“发现”和“测试与迭代”阶段
这个过程大致可以分为两个部分——在图表中标记为发现和测试与迭代。第一部分,发现,涉及深入了解您试图解决的问题、您可用的资源以及可能解决方案的空间。这是您进行前期工作的阶段,找出您想要实现的(以及现实可行的)目标。
第二部分,测试与迭代,是一个持续的改进过程,从初始原型到生产就绪应用程序。它跨越开发之前和之后的时间——在机器学习中,您的应用程序永远不会真正完成,而是需要在部署到现场后进行监控、支持和迭代。这种持续改进同时发生在项目的所有部分——应用程序、数据集、算法和硬件之间。
在这个过程中最重要的部分是反馈循环(参见图 6-2),它实现了持续改进。您在项目的不同方面之间创建的反馈越多,项目的成功可能性就越大。例如,您的模型在不同类型数据上的性能结果可以反馈到数据收集过程中,帮助您构建一个涵盖潜在输入空间的多样且代表性数据集。
在接下来的几章中,我们将覆盖整个工作流程。发现阶段在第六章、第七章和第八章中表示,而测试和迭代阶段——包括部署和支持——在第九章和第十章中进行讨论。

图 6-2. 可能的应用程序、数据集、算法和硬件之间的几个反馈循环示例;这四个部分将随着项目的进展而改变和发展,一个方面的任何变化都需要在另一个方面得到体现。
提示
对于任何技术项目的成功(甚至可以说是任何项目的成功),管理风险是至关重要的任务。边缘 AI 项目由于其硬件和软件的结合以及对复杂算法和数据驱动开发的依赖,具有独特的风险性。
在工作流的每个阶段,我们将学习可以帮助您将风险降至最低并提高成功机会的技术。
边缘 AI 工作流中的责任 AI
正如我们所学到的,AI 应用程序特别容易传播社会危害。在现实世界中可能导致意外低性能的许多问题类型。这使得对潜在风险及其可能导致伤害的可能性进行仔细分析成为边缘 AI 开发工作流程的关键部分。
在项目开始时进行一次单独的道德审查或在项目结束时进行最终审查是不够的。由于项目过程中将会出现新信息,并且将会做出许多具有下游影响的决策,风险分析需要在整个过程中的每个阶段都进行,以便在需要时进行及时调整。
在本书中,我们将在整个过程的每一步中反思道德设计。您不应将其视为可选的额外部分——这是必要的核心工程和产品管理工作的一部分,对于项目的成功至关重要。与边缘 AI 合作的团队的噩梦情景是,在系统部署到生产后才发现问题。没有人希望对产品召回或实际造成伤害负责。
在开发过程中通过考虑社会因素进行风险分析,我们将最大化在生产之前识别挑战的能力,并提高我们工作的质量。
我需要边缘 AI 吗?
人工智能和边缘计算都是复杂的技术,每一个都涉及整个考虑领域。与其中任何一个合作都涉及在能力和复杂性之间进行权衡。对于许多项目来说,复杂性的负担可能超过与它们合作带来的能力优势。
有了这个想法,对于任何潜在的应用程序,了解风险是否值得回报非常重要。答案在很大程度上取决于上下文,包括诸如:
-
应用程序的具体要求
-
将构建它的团队的技能
-
用于工程、数据收集和长期支持的可用预算
-
可用于交付的时间量
在接下来的几节中,我们将详细讨论我们需要问的问题,以便决定项目是否适合边缘 AI 技术。这是一个很好的开始练习,因为它还将为项目发现阶段的许多其他必要考虑提供启示。
警告
虽然尝试寻找边缘 AI 的新机会可能会令人兴奋,但重要的是要开放思维地解决问题,不要假设技术解决方案是正确答案。与其从一开始就试图将边缘 AI 应用于问题中,不如专注于理解问题并设计正确的解决方案来解决它。这个解决方案可能涉及边缘 AI,也可能不涉及。
描述问题
描述问题是确定边缘 AI 是否适合解决问题的第一步。您应该试图用几句话和要点总结问题—保持简短并言之有物。一个好的描述应包括:
-
场景的高层次摘要,包括任何现有的解决方案
-
当前面临的问题
-
必须解决的约束条件
在 “深入了解:使用追踪摄像头发现稀有野生动物” 中,我们讨论了边缘 AI 在野生动物监测中的可能应用。以下是我们可能捕捉到的一个用例问题描述示例。
您的问题描述的确切格式并不像内容那样重要。通过捕捉确切的问题和约束条件,我们可以在评估可能的解决方案时考虑它们。
我需要部署到边缘吗?
到了这本书的这一点,我们对章节 “理解边缘 AI 的好处,只需 BLERP” 中的模型非常熟悉,用于表达边缘 AI 的好处:
-
带宽
-
延迟
-
经济学
-
可靠性
-
隐私
BLERP 是帮助我们分析问题描述并评估其是否可能从边缘架构中受益的完美工具。做到这一点的好方法是为每个 BLERP 术语创建要点。
为了说明,让我们来探讨 带宽:
-
由于成本原因,追踪摄像头无法获得大量带宽。这使得在设备上处理工作变得非常重要。
-
如果我们可以在设备上分析照片,我们可以将生成的信息(比原始图像小得多)发送到云端。
-
这可以帮助避免进入现场收集存储卡的昂贵旅行。
通过思考每个条款的潜在影响,我们开始了解 BLERP 对这个问题的重要性。一旦您完成头脑风暴和总结,您将得到类似下一个 BLERP 分析的内容,取自“深入探讨:使用摄像机监测稀有野生动物”。
在这种情况下,跨多个 BLERP 条款部署边缘可能有明显的好处。在其他情况下,这可能不那么明显——例如,可能并非在每个条款下都有好处。但这并不一定意味着边缘部署不适合。只要在任何一个类别中存在足够强大的好处,都值得进一步考虑。
在边缘上表现不佳的事物
在某些情况下,您可能会发现您的问题并不完全适合 BLERP。以下是描述另一个问题的示例。
从描述中可以清楚地看出,这里有一些值得解决的问题:基于成像数据诊断医疗状况对医生来说是一项挑战,患者可能会根据设备或专家的可用性等待诊断结果。也许人工智能可以帮助医生分析图像。
然而,我们需要回答的问题是,是否使用边缘计算来解决这个问题是一个好问题。为了解决这个问题,让我们尝试通过 BLERP(显示在侧边栏中)进行一些潜在好处的头脑风暴。
从表面上看,这些听起来都是令人信服的理由。然而,如果我们深入挖掘一下,很明显大多数这些好处都是可以在不使用边缘计算的情况下实现的。因为成像设备位于医院内部,将分析移到潜在资源受限的“边缘”设备上并没有太大好处。相反,我们可以使用标准计算机,无论是连接到医院网络还是云中。¹ 隐私问题可以通过诸如联邦学习等技术来解决,而无需使用任何与边缘人工智能特别相关的工具。
在这种情况下,一个事实是——已经有可靠的网络连接可用,这使得使用边缘计算变得不必要。但为什么不使用呢?在边缘运行计算是否会有所不同?
边缘计算的缺点
尽管边缘计算在与人工智能结合使用时可能会带来巨大的好处,但在过去十年中,大多数计算已经转移到云端的原因有很多很好的理由。如果 BLERP 框架没有强调在边缘上进行工作的一些非常好的理由,那么您最好还是在云服务器上进行信息处理。
以下是使边缘应用程序具有挑战性的一些因素:
开发复杂性
编写和维护嵌入式应用程序非常困难,尤其是在较小的目标设备上。您的嵌入式代码越简单越好。即使需要嵌入式设备来收集数据,将更复杂的应用逻辑托管在云端可能也是明智的选择,以简化工程流程。
人员配备
嵌入式开发需要非常具体的技能,虽然云应用可以由多种工程师构建和维护,但寻找嵌入式工程人才可能更加困难。如果您的组织无法获得嵌入式工程人才,将计算资源留在云端可能更为稳妥。
计算资源有限
即使是最强大的边缘设备也远不及具备 GPU 访问权限的强大云服务器。某些应用程序需要大量计算资源,而在现场提供这种计算资源可能并不现实——例如,某些语言模型的大小达到了几个 GB,需要 GPU 才能实现低延迟。
部署复杂性
如果计划在部署后更新应用程序,边缘计算可能会带来一些问题。更新边缘固件可能存在风险——设备可能会因为某个 bug 或不当时的停电而"变砖"。管理安装在设备群中的应用程序版本也可能面临挑战。尽管可以克服这些挑战,但需要投入工程时间。将应用逻辑托管在云端可能更简单,更新起来也更轻松。
硬件和支持成本
部署和支持边缘设备网络可能成本高昂。如果需要带有机器学习工作负载加速功能的高端设备,或者定制用于特定目的的硬件,成本可能会进一步增加。根据应用的不同,使用性能较低的设备收集数据并将其发送到云端进行处理可能更为经济。
灵活性
如果您希望运行的工作负载超出了边缘硬件的能力,或者应用程序发生了重大变化,可能需要购买新硬件来替换旧设备。相比之下,云工作负载可以通过点击按钮进行扩展和修改。
安全性
允许物理访问 AI 算法实现存在一定的安全风险。在某些情况下,云计算可以帮助降低这种风险。本书后面将详细介绍安全性问题。
正如我们在“多设备架构”中看到的,可以将计算分配给边缘设备和云端。这可以是一种有益的方式,特别是当设备部署在可靠连接和电源可用的受控环境中,如家庭或工厂。例如,智能音箱可以通过在边缘进行唤醒词检测来保护隐私,同时仍然从强大的云服务器中获得运行大型、高度复杂的转录和自然语言处理模型的好处。在工业环境中,边缘计算机视觉系统可以在调用云模型之前以极低的延迟识别潜在的制造缺陷,并确定适当的响应。
我需要机器学习吗?
正如我们在第一章中学到的,AI 并不总是需要机器学习。作为一个类别,ML 算法具有各种优点和缺点,使它们在某些应用中非常理想,但在其他应用中的效用有限。
警告
在开发过程的早期阶段识别出你的用例是否适合 ML 非常重要。基于 ML 的项目涉及的工作流程大不相同,这将影响你的时间表和预算。
对于给定的边缘 AI 问题,通常需要在机器学习解决方案和基于规则或启发式解决方案之间做出选择。正如我们在“条件和启发式”中学到的,基于规则的系统是由人类使用领域知识设计的。它们可以利用从基本算术到极其复杂的物理方程的任何东西。以下是边缘设备中应用启发式算法的一些例子:
-
水壶在温度达到沸点时自动关闭
-
糖尿病胰岛素泵根据血糖水平分配精确剂量的泵
-
使用传统计算机视觉(参见“图像特征检测”)的驾驶辅助功能,用于识别车道标记并使汽车在其间居中。
-
自动驾驶系统在国际航线上飞行的大型喷气飞机
-
前往火星的太空火箭的导航系统
这些例子从简单到复杂不等,都依赖于领域知识。例如,胰岛素泵的算法基于人类血糖调节系统的知识,而太空火箭的导航系统则基于物理学、空气动力学(至少在部分旅程中)以及车辆的操作特性。
在每种情况下,所涉及的系统都受到严格的规则约束。这些规则可能很复杂,它们的发现可能已经花费了数千年的人类历史,但归根结底,工程师们可以用数学公式相对准确地描述它们。
通常,数字信号处理算法与基于规则的系统结合使用。一点处理可以大有作为,使得可以使用简单的规则对输入做出反应。例如,驾驶辅助功能可能使用 DSP 来进行图像特征检测,将复杂图像转化为表示车道标记的简单向量集。这使得更容易确定是否向左或向右转动汽车。
基于规则系统的优点在于其限制完全可知,这意味着可以证明它们何时有效。启发式算法基于一个被充分理解的系统。可以建立算法在设计模型的基础规则方面的数学正确性。这使它们可靠、可信且安全。
小贴士
如果您的问题有基于规则的解决方案,几乎可以肯定选择它。许多问题可以通过规则和启发式方法以优雅的方式解决,并且它们比机器学习的替代方法更容易开发、支持和解释。它们在计算能力方面要求也通常较低。
ML 听起来很令人兴奋,但在没有明确需求的情况下使用它是有风险的。启发式算法是将人类送上月球的原因之一;你的问题很可能比那还要简单。
不幸的是,并非所有问题都可以通过基于规则的算法解决。回到“条件和启发式”,我们遇到了它们的两个主要弱点:
规则困难到不能被发现。
例如,可能需要大量的研究和开发来发现您复杂、嘈杂、高频传感器数据背后的算法系统。即使可能可以数学描述系统,但在您的预算和时间框架内可能无法达到。
大量变量问题。
例如,可能有太多输入使得基于规则系统变得不可行。这在图像数据中是一个常见问题,它们维度极高且噪声也非常严重。很难编写描述狗外观的方程式。
对于非平凡问题,良好实施的基于规则的算法可能依赖于广泛的研究、领域知识和相关工程技能。这些并不总是适用于给定项目。启发式的弱点为 ML 提供了发光的机会。
使用 ML 的理由
虽然基于规则系统通常依赖于它们与之交互的过程的科学理解,但机器学习算法可以通过暴露于数据本身来学习变量之间的关系的近似值。
这肯定可以让生活更加轻松。以下是一些情况,考虑尝试 ML 可能是有道理的顺序:
-
您的情况和数据过于复杂或噪声过多,无法用传统方法建模。
-
需要进行太多的基础研究才能找到基于规则的解决方案。
-
你没有必要实现基于规则的系统所需的领域专业知识。²
如果你发现自己处于这些情况之一,机器学习可以帮助很大。下面的侧边栏提供了一个很好的例子。
事实证明,复杂、嘈杂的数据非常普遍。实际上,大多数现实世界的数据有点混乱!机器学习特别是深度学习模型的优势之一在于,如果提供足够的数据,它们可以学习适应噪声。在训练过程中,模型的参数被调整,以便从数据中滤除噪声,留下重要信息——这些信息可以用来做出决策。
另外,机器学习模型在识别其训练数据中存在的隐藏模式方面表现出色。对于人眼来说是看不见的关系,或者对我们的手工编码规则来说太复杂的关系,在机器学习模型提供足够的训练数据后,可以变得非常清晰。
这些优点使得当面对描述不清晰关系的大量嘈杂数据时,机器学习成为一个不错的选择。然而,机器学习对数据的使用也可能带来一些风险。
机器学习的缺点
从工程角度看,机器学习存在三个主要缺点:数据需求、可解释性和偏见。
众所周知,今天的机器学习非常依赖数据。³通常需要大量数据来训练和测试机器学习系统。找到足够的数据并确保其质量是机器学习面临的最大挑战和开支。
数据可能看似充裕——毕竟,我们有填满了几十年物联网传感器数据的“数据仓库”和“数据湖”吗?不幸的是,原始数据并不够。大多数今天的机器学习技术需要经过标记的数据,意味着它已被标记为描述其含义的信息。这一繁琐的任务通常由人类完成,这使其昂贵且风险高(因为容易出错)。
另外,机器学习模型只能理解它们之前见过的情况。这使得数据集高度依赖于上下文。如果用不同品牌的数据来训练一个特定类型传感器收集的数据集,模型可能表现不佳。一个国家的典型家庭物品数据集在试图识别另一个国家的物品时可能毫无帮助。
研究正在进行中以减轻这些问题,并取得了令人惊讶的进展,但事实仍然是,机器学习通常需要大量数据。我们将在下一章更多地了解这个主题。
机器学习的第二个重大缺点,可解释性,已经在“可解释性和解释性”中提到。虽然有一些高度可解释的机器学习模型,但模型越复杂,确定其作出预测的确切原因就越具挑战性。
这个问题的加剧是因为许多类型的机器学习模型源自统计学,它们并不给出确定性的答案。向基于规则的系统提问,它会给出一个明确的、坚定的回应,其内部运作可以进行双重检查和审查。向深度学习模型提出同样的问题,你会得到一个模糊的概率分布,显示出潜在的答案。追溯答案回到系统,你将遇到一团人类理解力无法及的线性代数混乱。
由于它们的概率性质,机器学习模型在处理模糊情况和非明显规则方面表现出色。不幸的是,这也意味着它们的输出具有相同的特性,这对许多应用程序来说是一个挑战。
例如,在医疗技术、汽车和航空航天等领域驱动安全相关设备的代码通常被期望(通过最佳实践和政府监管)是可以证明正确的。使用概率模型很难达到这个标准,因为其内部规则只能通过探索和实验得知。
机器学习的第三个重大缺点,偏见,是前两个挑战的直接结果。我们在“黑盒子和偏见”中遇到了这个问题。当我们创建机器学习模型时,我们依赖于数据集来训练它们并验证它们的性能。我们的目标是生成一个在现实世界中表现良好的模型。然而,现实世界是一个庞大的地方,在有限的数据集中捕捉到其可能的变化是非常具有挑战性的。
如果我们的数据集只包含所有可能性的一个子集,我们的模型可能无法正确执行其他情况。更糟糕的是,因为在我们的数据集中没有这些其他可能性的任何示例,我们将不知道这实际上是一个问题。我们的模型可能看起来运行良好,实际上却存在重大问题。
更为严重的是,我们的模型不一定会告诉我们它何时遇到麻烦。⁴ 相反,它只会尽力猜测 —— 这可能是灾难性的错误。没有数据来测试它,也没有轻松的方法来分析模型的内部规则并理解可能存在的不足,我们将无法知道是否出现问题,除非我们的应用程序失败。
由于我们永远无法希望在我们的数据集中抽样整个世界,偏见是不可避免的。然而,通过严格理解我们的应用程序,我们可以管理这种风险。然而,在某些情况下,偏见的后果可能非常严重,以至于应用程序根本不适合使用 ML。许多社会所持的价值观认为,不适合将 ML 用于做出某些生死决策,例如由自主武器系统使用所导致的决策。类似地,关于将机器学习用于自动化司法决定(包括判决)的争论也很多。
知道何时使用 ML
有一句关于解决问题的常见说法:“如果你只有一把锤子,那一切看起来都像钉子。”机器学习比最闪亮的锤子更加令人兴奋,人们常常试图无处不用它。然而,其复杂性、局限性和固有风险使其在许多情况下并不是一个好选择。Edge Impulse 的首席 ML 工程师 Mat Kelcey 喜欢说“最好的 ML 就是没有 ML”。
使用传统算法解决问题并不丢人。正如我们在“人工智能”章节中所看到的,AI 中的智能来自于“在正确的时间知道做正确的事情”。对于你的用户来说,这种知识是嵌入在if语句形式中还是深度学习模型中并不重要。
基于这一点,这里有一个检查清单,可以帮助您决定 ML 是否适合您的应用程序:
-
不存在现有的基于规则的解决方案,并且您没有资源去发现一个。
-
您可以访问高质量的数据集或者在预算范围内收集一个。
-
您的系统可以设计为利用模糊的概率预测。
-
您不需要解释系统决策背后的确切逻辑。
-
您的系统不会受到其训练数据之外的输入的影响。
-
你的应用程序可以容忍一定程度的不确定性。
机器学习模型永远不完美。我们之所以使用它们,是因为相比人类智能,它们既便宜又能很好地扩展。一个很大的折衷是,它们可能以出乎意料的方式失败。使用 ML 的决定是关于“它是否足够好?”和“我们能处理它可能产生的错误类型吗?”的问题。
实践练习
以下是可能需要使用边缘 AI 的三种场景。针对每一种场景,提出一个问题描述,然后决定是否应该应用边缘计算、机器学习或两者兼而有之。您可能需要进行一些在线研究以充分理解每个场景:
情景 1:施肥应用
一个农产品生产者希望通过减少对农作物施肥的金额和减少环境影响来节省资金。他们不希望简单地在整个田地喷洒肥料,而是希望确定田地中最需要施肥的区域(例如,由于土壤质量的变化),并专门在那些区域施肥。他们可以通过视觉检查生长中的植物来了解是否需要施肥。
场景 2:酒店服务
酒店传统上在白天清洁客房,因为客人可能在外面。然而,如果客人仍然在房间里,他们可能不希望被打扰。一家酒店连锁店希望知道任何客人是否在特定房间内,这样他们的清洁人员就不必敲门,可能会打扰他们。
场景 3:轮胎寿命
车胎会随着时间的推移而磨损,某些类型的磨损可能表明存在机械问题。这种磨损通常在定期维护期间被发现。汽车制造商希望他们的汽车能够自动识别某些类型的轮胎磨损,以便他们可以更早地发现问题。
对于任何这些提示,都没有正确或错误的答案;它们只是提供了一个机会来应用我们迄今为止学到的分析技术。
确定可行性
所以,你有一个边缘人工智能项目的想法?你的第一个目标应该是确定它的可行性。有很多事情需要考虑。也许你的项目最好使用服务器端的人工智能,或者也许你的解决方案需要机器学习,但收集数据集并不可行。另外,也许它正是完美的选择!
第一步是尝试为你问题描述中的问题提出一个理想的解决方案。如果你试着忘记技术上的限制,高层次地思考,系统应该做什么?
先入为主的观念
我们理想解决方案的目的是给我们一个瞄准的目标。如果我们通过认为可行的想法来限制我们的创意搜索,我们可能会错过那些并不立即显而易见但很有前景的解决方案。通过保持理想,我们确保不限制自己的创造力。
理想的解决方案还帮助我们避免使用某种技术的诱惑,因为我们对它感到兴奋。这是一个非常常见的陷阱:我们刚刚了解了一些令人着迷的新技术,并一直在寻找一个试用它的借口——因此我们忽视了另一种本应带来更好结果的方法。
一旦我们有了一个理想的解决方案,我们可以从几个角度考虑可行性:
-
道德:是否应该这样做?
-
商业:做这件事是否有价值?
-
数据集:我们有原材料吗?
-
技术:是否可以实现?
对于整体可行性来说,项目需要在所有这四个方面找到最佳点。让我们逐一探讨每个角度,使用一个示例应用来说明。在现实世界中,我们会根据详细的问题描述来制定理想解决方案。为了简化,我们将使用这个简化的陈述。
我们的解决方案无需基于 AI,甚至不一定使用技术。根据具体情境,最佳系统可能是一个人类安保团队。在我们的可行性调查过程中,我们将开始确定合适的人类与技术能力结合的方式,以优雅地解决问题。
道德可行性
道德审查是任何可行性分析中最重要的部分之一。由于未考虑技术风险而导致的项目失败可能会浪费大量资金,但由道德问题导致的损害潜力是不可估量的——它很容易会让一家公司声誉扫地,触发惩罚性的监管措施,并直接对人类造成伤害。
“负责任地构建应用程序”介绍了一些可能影响 AI 产品的道德问题。作为可行性分析的一部分,严格探讨和记录可能由您的应用程序引发的任何潜在道德问题至关重要。除了产品本身外,理解来自开发过程的潜在风险也同样重要:数据收集、部署和支持。
这一过程需要您团队的全面参与——由您的道德和领域专家驱动。“多样性”章节中的内容强调了从多个视角获得意见的重要性。
一些关键问题需要问:
-
解决方案可能会对谁造成伤害? 例如:一些产品(如 AI 武器)旨在直接造成伤害,而其他产品可能通过间接方式或由于与人类利益相关者的疏忽接触而造成伤害。
-
是否可以在不侵犯个人或社区权利的情况下获取所需数据? 例如:有些数据集可能无法在不侵犯用户隐私的情况下收集。
-
是否可能在不损害或侵犯利益相关者权利的情况下测试产品? 例如:一个提供医疗建议的应用,在测试过程中,如果提供的建议不可靠,可能会造成伤害。
-
是否已记录潜在风险?如何进行缓解? 例如:如果一个应用程序产生不正确的预测,可能会造成哪些潜在伤害?
-
应用程序是否适用于所有潜在用户? 例如:一个与安全相关的语音检测应用可能对具有地方口音的讲话者效果不佳。
很难理解项目间接伤害潜力。例如,如果由于人工智能项目而岗位岌岌可危,或者在利润与环境影响之间存在权衡取舍怎么办?拥有广泛的专家顾问团队将帮助您驾驭这些微妙之处。
道德伦理关乎人与过程。减少意外伦理问题风险的一种方法是确保伦理审查由来自不同人群代表性的多样化群体进行,包括专业人士,他们在人工智能系统伦理评估方面具有直接专业知识。
除了您自己的团队,该团队还应包括受产品潜在影响的利益相关者的代表,如“利益相关者”中所述。
虽然可行性分析始于理解道德可行性,但您的长期目标应该是在产品概念化、开发、部署和支持过程中实现持续的伦理审查。在这个阶段进行的工作将通过整个产品生命周期提供帮助。
商业可行性
组织问题对项目可行性的影响有两个主要方面。首先,为了使人工智能应用成功,它需要提供明显的好处。在商业背景下,这可能是给客户、管理人员或财务报表带来的好处。在科学背景下,这可能意味着在相同预算下完成更多工作。在任何项目初期,确保如果成功,提议的工作将实际增加真正价值是至关重要的。
其次,组织面临实际限制,这限制了人工智能应用的开发。例如,可能没有足够的预算来收集足够规模的数据集来训练有效的机器学习模型。其他常见的限制包括时间、专业知识和利益相关者的长期支持。
证明好处
证明(和展示)边缘人工智能应用的一个特别有效的方式是所谓的绿野仙踪原型。在绿野仙踪的故事中,主角仙人掌最初被介绍为一个令人印象深刻的超自然存在。然而,后来揭示他只是一个普通人,隐藏在幕布后面,远程控制幻象。
在绿野仙踪原型中,会制作一个人工智能产品的模拟版本。它在表面上是功能性的,但实际上其功能受隐藏的人类行为控制。可以让利益相关者测试和体验这个模拟产品,使人们对它在现实世界中的运作方式有所感觉,并与其他选项进行比较。
这可能是一个非常有帮助的练习。即使在项目的技术部分之外,也可以探索、分析和完善用户体验。如果体验令人印象深刻,这将极大地帮助说服利益相关者认为项目是值得的。如果甚至在人为形式下也无法正常工作,这是一个很好的信号,表明您应该重新审视。
要使任何评估成功,重要的是获得利益相关者对“好”的定义的一致意见。在我们的仓库示例中,这可能意味着设定单个警卫响应入侵所需的最短时间。在测试期间,我们设置了帮助我们监控这些指标的仪器,部署了应用的基线版本(例如,虚假的奥兹巫师应用程序),然后进行评估。
在这个过程中,测试 当前 解决方案以及提议的解决方案非常重要。这将清楚地表明所评估的解决方案是否真正有益。这是在开发过程中检查的重要事项,而不仅仅是在开始阶段。
既然我们已经为“好”设定了具体的阈值,甚至可能证明当前解决方案已足够满足利益相关者的需求,这样组织就可以通过不采纳基于 AI 的解决方案来节省费用。但如果我们证明有益处,项目就可以自信地继续进行。
理解限制条件
当然,除了奥兹巫师原型之外,组织确定新项目的风险、回报和效益的方式有很多种。AI 项目并没有不同,确保您的想法与您所在组织的需求相符将对确保其成功至关重要。
其中一部分是确定您的组织限制条件,并确保它们不会造成任何问题。开发 AI 应用程序时的一些主要限制条件包括:
专业技能
尽管 AI 工程变得越来越容易接触,但在开始之前拥有经验丰富的 AI 专家将有助于降低项目风险。确保您需要的技能在您手边是可用的。
时间表
AI 开发是一个数据驱动的迭代过程,比传统软件工程更具挑战性。确保您有足够的余地处理意外情况,例如在过程的后期发现需要收集更多数据。
预算
AI 开发的三个最昂贵的部分是工资、数据收集和现场测试。如果您是个人或小型组织,训练的计算时间可能会变得显著——尽管通常不会超过几千美元,因为边缘 AI 模型往往很小。
长期支持
正如我们将在第十章中看到的那样,AI 应用需要长期支持才能保持有效性。随着世界的变化,ML 模型和硬编码规则将需要更新和精炼。如果你的项目将会部署超过几个月,了解你的组织是否能够负担得起(并愿意)支持它非常重要。
你是你组织工作方式的专家,你有责任了解它是否能够支持你希望开发的项目。
数据集可行性
除了技术可行性外,边缘 AI 应用开发受到可用数据的限制。机器学习以数据需求大而闻名,但即使是手工编码的基于规则的方法,也需要大量数据来开发和测试。⁶
数据收集困难、耗时且昂贵,因此在可行性评估阶段了解项目的数据需求是具有挑战性但至关重要的。理解数据可行性有两个步骤:
-
估算解决问题所需的数据量
-
理解你是否能够获得足够的数据
这两个主题都在第七章中有详细讲解。正如我们将要看到的,理解数据需求涉及研究和工程工作。这意味着在项目中投入大量时间之前,你不会知道你的实际数据需求。
在这个阶段,只要有一个大概的想法就可以了,也许基于你通过研究发现的一些先例(正如我们将在第七章中发现的那样)。如果看起来你没有足够的数据,你的项目可能就不可行。在早期阶段排除这一点是至关重要的,以避免开发工作的浪费。
数据问题是 ML 项目失败的主要原因之一,因此如果在可行性检查的这部分中看到负面信号,不要只是抱着侥幸心理希望一切顺利。
技术可行性
在第三章和第四章中,我们详细介绍了边缘 AI 最重要的技术。这些材料将是你在尝试理解你的想法的可行性时的一个重要资源。
第一步是将你的想法映射到边缘 AI 概念和方法论中。以下是本书早期出现的一些关键点:
传感器
如何收集你需要的数据?
数据格式
你的传感器将输出什么样的信号?
特征工程
处理原始信号的可用选项有哪些?
处理器
你需要根据成本和能源使用来预算多少计算能力?
连接性
你可以使用哪种类型的通信方式?
问题类型
你是否需要执行分类、回归或其他操作?
基于规则或 ML
是否需要使用机器学习,还是可以采用基于规则或启发式方法?
ML 算法的选择
经典机器学习是否足够,还是需要深度学习模型?
应用架构
您是否需要单个边缘设备,还是需要更复杂的安排?
最后,也是最重要的是,您需要考虑人类因素。您最终的解决方案将是由人和技术共同组成的系统,共同工作。任何技术决策都需要通过人的视角来看待。
到目前为止,现在尝试明确回答所有这些问题还为时过早。相反,理解地去构思几个可能的解决方案是有意义的:先从四五个初步的想法开始,如果容易的话可以捕捉更多。这些想法不必完全深思熟虑,但应该试图捕捉上述的一些要素。
在我们仓库安全环境中的一个示例显示在以下侧边栏中。
框定问题
为了全面探索任何 AI 解决方案的技术要求,我们需要能够框定我们的问题,即用我们可用的工具来表达我们的问题。在 “算法类型按功能” 中,我们遇到了一系列有用的技术:
-
分类
-
回归
-
目标检测和分割
-
异常检测
-
聚类
-
维度缩减
-
转换
要解决任何问题,我们首先需要将其分解为可以使用这些技术解决的块。一个给定的问题可能需要多种技术来解决。例如,识别未经授权地点的入侵者可能需要同时进行目标检测(用于发现人)和异常检测(用于识别人员在夜间悄悄绕过仓库通道时的异常行为)。
每种技术可能需要不同类型的算法:例如,目标检测可能需要深度学习模型,而异常检测则可以使用经典机器学习。通过将问题分解为这些技术,我们可以更好地理解必须完成的工作的计算负担,这将有助于构思解决方案并帮助确定我们的硬件选择。
任何给定的问题通常可以按多种方式分解(或框定),每种方式都有自己的技术要求。例如,还可能通过降维来发现仓库中的入侵者:我们可以使用嵌入模型描述视野中的任何人员,然后将其嵌入与数据库进行比较,从而识别非员工进入仓库的情况。
这与基于目标检测的系统的技术、数据、业务和道德考虑不同。因此,框定为我们提供了另一个工具,可以探索可能解决方案的空间,并找到适合我们独特需求的东西。
设备能力和解决方案选择
对于每个边缘 AI 项目,都有不计其数的硬件选项。例如,我们的仓库安全头脑风暴产生的解决方案可以使用 MCU,在边缘服务器上或在云中实施。每个单独的解决方案都有自己巨大的硬件选择空间——例如,对于基于 MCU 的项目,我们必须从包括数十个硅厂商的列表中选择硬件,每个硅厂商都有数十种芯片,所有这些都可以以无数种方式配置。
从可行性的角度来看,我们需要了解这些硬件选项中哪些是合理的,考虑到我们问题描述中所描述的约束条件。约束条件可能包括成本、内部专业知识、现有的棕地(“绿地和棕地项目”)系统或供应链考虑因素。捕捉这些约束条件将缩小硬件选项的空间和可能解决方案的空间。
在应用约束之后,我们可能会发现没有符合条件的解决方案。例如,在一个棕地项目中,唯一可用的硬件可能没有足够的内存来运行具有适当性能的物体检测模型。
表格 3-1 提供了一个参考,可帮助您了解您的应用是否在可行性范围内,适合您可用的硬件选项。请记住,如果需要更多灵活性,您始终可以将您的应用程序分布在多种设备类型上。我们将在“架构设计”中深入讨论这一点。
做出最终决定
在这一点上,我们已经从道德、商业、数据集和技术的角度审查了我们项目的可行性。我们应该有足够的信息来做出决策。如果我们头脑风暴中的任何解决方案看起来都不合适,我们接下来的步骤应该如下:
-
使用我们在审查过程中确定的新约束条件更新问题描述。
-
执行新的解决方案头脑风暴,提出一组新的可能解决方案,考虑我们新确定的约束条件。
-
经过我们的新解决方案的同样可行性审查流程。
就像 AI 中的一切一样,这可能是一个迭代的过程。为了澄清您对约束条件的理解并得出一个有效的解决方案,您可能需要多次重复这些步骤。值得耐心等待,并愿意重新审视您的假设。最终,您可能会得到一个潜在的解决方案,即使它并不是您最初设想的那种。
话虽如此,在某些情况下,您可能根本找不到解决问题的好的边缘 AI 解决方案。如果发生这种情况,请注意原因。也许是出于道德考虑,表明该项目在道德上风险太大而无法考虑。或者,它们可能纯粹是技术性的——这可能意味着在未来某个时间点,随着新硬件和技术的出现,该项目可能变得可行。
无论如何,即使你没有能够找到一个有前景的解决方案,从可行性的角度来探索解决方案空间的过程将是非常有教育意义的。现在,你很可能对这个问题领域,从 AI 的角度来看,比其他任何人都了解得更多了。
如果一个解决方案未通过可行性测试,请抵制继续尝试的诱惑。如果你已经证明这太冒险,试图开发这个项目将导致时间浪费和潜在的危害。
提示
即使知道某个问题没有合理的边缘 AI 解决方案也是有价值的信息;意识到这一点本身就是一种竞争优势。你可能会看到其他组织在追求这个问题上浪费时间,但你将有信心知道他们的努力将会失败,并且你将会在其他方面取得更好的结果。
如果你已经达到这一点,你的项目看起来是可行的,恭喜——现在是时候开始将其变为现实了。
规划边缘 AI 项目
边缘 AI 的开发是一个多阶段的过程,涉及迭代开发和潜在无限的任务(如数据收集,作为一个过程永远不会真正完成)。因此,在开发解决方案之前制定计划非常重要。
在“边缘 AI 工作流程”中,我们看到了各种工作流程阶段及其如何通过多种反馈循环相连接。作为一个迭代过程,你可以在每个部分花费任意长的时间。规划的两个最重要的方面是:
-
定义可接受的性能
-
理解时间和资源约束
定义可接受的性能
你的规划过程的第一个阶段应该是制定一套具体的标准,以确定你的系统的可接受性能会是怎样的。这必须与利益相关者和伦理分析一起进行,因为性能不佳的系统可能会在这些方面造成风险。
在开发过程中,你的任务是通过迭代过程直到满足关于可接受性能的目标。一旦达到这些目标,你的利益相关者可以自信地签署该项目,知道它运行得足够好。你的目标应该设置得现实——它们需要是可实现的,但也应该以项目能够真正提供价值的方式设置。
我们将学习一些关键的性能指标在“有用的指标”。
理解时间和资源约束
理解你拥有的时间和资源约束非常重要,这些资源包括资金、专业知识和硬件。估算开发时间非常困难,尤其是在 AI 项目中更是如此。
由于人工智能开发的迭代性质,传统的瀑布式开发模型将无法很好地运作。相反,您需要在前进的过程中理解和管理风险。一个好的方法是尽快实现端到端的工作能力。
您可以对整个系统及其各个组件进行迭代。您的第一个版本可能是一个“绿野仙踪”原型,使用现成的硬件和简单的逻辑。您可以在此基础上进行迭代,训练一个简单的机器学习模型来取代“绿野仙踪”组件,然后创建一个定制硬件设计。
在整个过程中的每个阶段,您的整个系统都应进行端到端测试,以确定是否符合您定义的性能标准。这样做的一个好处是,它消除了您可能会把所有时间都花在项目的一个阶段上——例如,训练一个模型——而没有留足够的时间进行其他工作的风险。另一个好处是,有时您可能会发现,比您最初设想的更简单的系统已经足以满足您的性能目标。
当我们到达第九章时,我们将更深入地讨论规划的主题。
总结
现在我们了解了适用于边缘人工智能项目的一般工作流程,并学习了如何评估问题并生成有希望的解决方案。
在下一章中,我们将继续进行边缘人工智能工作流程的第一部分——收集有效数据集。
¹ 尽管可以认为医院网络上的计算机是边缘设备的一种形式,但许多大型医院拥有现场数据中心,不受边缘计算的典型约束。
² 如我们将看到的那样,领域专业知识在训练和评估机器学习模型中仍然至关重要。然而,基于机器学习的方法潜在地使具有特定问题领域知识的专家能够在不需要在其他领域(如信号处理)寻求过多外部帮助的情况下获得良好的结果。
³ 减少机器学习算法数据需求的努力是机器学习研究中最重要和最吸引人的方向之一。
⁴ 有些技术可以帮助解决这个问题,比如在“异常检测”中提到的技术,尽管它们可能会带来额外的复杂性负担。
⁵ 正如 Bhavik N. Patel 等人在“人工智能与胸部 X 射线诊断的人机合作”中记录的那样(2019 年国家医学图书馆)。
⁶ 即使您正在复制来自教科书的众所周知的算法,您仍然需要通过它来确保您的应用程序能够端到端运行。
第七章:如何构建数据集
数据集是任何边缘 AI 项目的基础。有了一个优秀的数据集,从选择正确的算法到理解硬件要求和评估真实世界性能,工作流中的每个任务都变得更容易,风险也更小。
数据集在机器学习项目中至关重要,数据直接用于模型训练。然而,即使你的边缘 AI 应用程序不需要机器学习,数据仍然至关重要。数据集在选择有效的信号处理技术、设计启发式算法以及在真实条件下测试应用程序时是必需的。
收集数据集通常是任何边缘 AI 项目中最困难、耗时和昂贵的部分。这也是你可能会犯严重且难以检测到的错误,从而使项目注定失败的最有可能的地方。本章旨在介绍当今构建边缘 AI 数据集的最佳实践。这可能是本书中最重要的部分。
数据集是什么样子?
每个数据集由许多单独的项目组成,称为记录,每个记录包含一个或多个信息片段,称为特征。每个特征可能是完全不同的数据类型:数字、时间序列、图像和文本都很常见。这种结构如图 7-1 所示。

图 7-1. 一个数据集包含许多记录,每个记录可能包含许多特征;特征可以具有不同的数据类型。
对于数据集的这些组成部分,有许多不同的名称。记录通常被称为行、样本、项目、示例或实例。特征也被称为列或字段。¹
许多数据集还包含标签,这是一种特殊的特征,指示训练于该数据集的模型的期望输出。例如,分类器返回的类别或对象检测模型返回的边界框。
数据集通常包含一种称为元数据的内容。这是描述数据本身的特殊数据。例如,记录可能包含元数据,指示其特征所收集的传感器型号,捕获的精确日期和时间,或组成其特征之一的信号的采样率。
提示
数据集可以以许多不同的方式存储:在文件系统、数据库、云中,甚至是文件柜和纸箱中。
数据集的结构在开发过程中经常会大幅度演变。这可能包括其记录和特征表示的变化。例如,想象一下,你正在构建来自工业机器振动数据的数据集,因为你希望训练一个分类器来区分不同的操作状态。
可以从 10 台不同的机器上捕获 24 小时的数据来开始。在这种情况下,每条记录代表了特定机器的特定时间段。接下来,您可以将这些记录分割成对应于不同操作状态的部分,并添加适当的标签。接着,您可能会对每条记录进行特征工程,创建可以输入到机器学习模型中的额外特征。
理想的数据集
理想的数据集具备以下特性:
相关性
您的数据集应包含对您正在尝试解决的问题有用的信息。例如,如果您正在构建一个系统,该系统使用心率传感器数据来估计运动表现,您将需要一个包括心率传感器数据和某种性能指标的数据集。如果您计划使用特定类型的传感器,通常重要的是您的数据集是使用类似设备收集的。如果您正在尝试解决分类问题,重要的是您的数据集包含关于您关心的类别的区分信息。
代表性
要具有代表性,数据集必须包括关于可能在现实世界中遇到的所有不同类型条件的信息。例如,在用于健康监测应用的数据集中,需要包含来自足够广泛的个体的数据,以涵盖可能使用该应用程序的所有不同类型的人群。代表性不足的数据集会导致偏见,如在“黑匣子和偏见”中所述。
平衡性
除了仅仅具有代表性外,理想的数据集还包含了来自所有相关类型条件的良好平衡信息。许多类型的机器学习算法在使用平衡数据集时效果最佳,包括深度学习模型。
例如,在美国,有 76%的通勤者使用汽车上下班,而只有 10%的通勤者使用自行车。²如果我们要训练一个模型来计算穿过城市的车辆数量,使用相等量的汽车和自行车数据是很重要的——尽管自行车只占少数。否则,模型可能会更擅长识别汽车而不是自行车。这是偏见进入系统的另一种常见方式。
可靠性
理想的数据集应该保持持续的准确性。它应尽可能少地包含错误,即使有错误,也应均匀地分布在数据中,而不是集中在某些类别中。³ 如果数据中存在噪音(这在传感器应用中很常见),则应该是与真实世界条件下存在的相同类型和大小的噪音。例如,我们可能希望使用音乐样本数据集来训练一个分类模型,以识别不同的音乐流派。在我们的数据集中,每个样本都正确标记了流派,并且样本包含与预期的真实世界条件中相似数量的背景噪音。
良好格式化的
同一数据可以以许多不同的方式进行格式化。例如,图像可以以无限种不同的格式、分辨率和色彩深度表示。在理想的数据集中,数据以最适合您使用的方式进行格式化。至少,数据集在其样本中应具有一致的格式。
良好记录的
理解数据集的来源、采集方式以及所有字段的含义至关重要。如果没有这些信息,您将无法确定数据集是否符合您的需求。例如,假设您希望使用来自互联网的传感器数据集。没有良好的文档,您将无法确定数据的相关性:它可能来自与您打算使用的传感器不等效的传感器。
适当大小的
机器学习模型可以学习几乎任何系统中的隐藏规则,只要它提供足够的数据。例如,您可能希望使用加速度计数据来训练一个模型来识别不同类型的网球击球方式。如果数据集仅包含每种击球方式的少数样本,模型可能难以学习每种击球方式的一般表现。为了概括,可能需要更多的每种击球类型的样本——数量越多越好。
然而,更大的数据集会导致更长的训练时间,并且从技术角度来看,处理起来更加困难。此外,不同的问题需要不同数量的数据来解决,因此对于每个项目来说,进一步收集数据会遭遇收益递减的情况。您的目标应该是收集足够的数据来解决您的问题。
如果您主要用数据集进行测试(而不是训练模型),您可以使用较小的数据集,但重要的是数据集足够大,以代表性和平衡性。
正如您可能预期的那样,创建一个具有所有这些理想特性的数据集是棘手的。在构建数据集时,您可能需要进行一些工作来使其符合要求。
评估数据集
在实验室中构建和测试边缘 AI 系统需要一种类型的数据集,而在真实世界条件下评估其性能可能需要另一种。第十章将介绍几种评估边缘 AI 系统的方法,并解释如何收集任务所需的正确类型的数据。
每个 AI 项目都涉及将领域专业知识从人类思维中提炼到计算机系统中的过程。构建数据集的过程是这项工作的主要部分。它必须以谨慎、目的明确和深思熟虑的方式进行。好消息是,如果你做对了,成功的机会将大大增加。
数据集和领域专业知识
领域专家,也称为主题专家(SMEs),是那些对你试图解决的问题有深入了解的人。无论是什么领域,总有些人对其进行了深入的研究、经验积累并彻底了解该主题。
在解决问题领域中,将领域专业知识视为与处理 AI 算法、信号处理、嵌入式工程或硬件设计所需知识可能不同是很重要的。虽然领域专家可能也具备这些领域的技能,但某人是机器学习专家并不意味着他们自动具备设计 AI 系统解决任何问题的资格。
举例来说,想象一下,你正在为医疗市场构建一款边缘 AI 产品。除了硬件和软件工程师以及精通构建 AI 应用的人员⁴,你的团队还需要包括真正理解你试图解决的医疗问题的领域专家。否则,你将面临建造一个不符合预期工作方式的产品的风险。
数据集和领域专家密切相关。每个 AI 产品都反映了用于开发、训练和测试它的数据集。当产品使用机器学习时,算法直接由数据决定。但即使是手工编码的算法,其表现也取决于用于测试它们的数据。
这意味着你整个项目的结果由你数据集的质量决定。此外,你组织中唯一有资格理解这种质量的人就是你的领域专家。他们对你试图解决的问题的深刻了解必须指导数据集的构建和策划。无论你团队中有多少有才华的数据科学专家,如果他们没有对手头问题的适当见解,他们的技能都将是多余的。
本质上,你的数据集在你的产品和组织中作为领域专业知识的主要向量。由于它是使用领域专家的知识构建的,最终它成为了他们知识的数字形式表现——几乎像一个应用程序编程接口(API),提供对他们捕获的见解的访问。
这种编码知识将被您团队的其他成员用来帮助构建您的应用程序。例如,负责您算法的工程师将使用数据集来调整或训练它们,而负责测试您应用程序的人将使用它来确保它在您需要的所有情况下都能正常运行。
所有这些都使得您必须有足够的领域专业知识。此外,由于您的领域专家不一定是构建和评估数据集的专家,您将需要他们与具有数据科学技能的团队成员密切合作。合作建立有效的数据集是必要的。
但是如果您没有获得领域专业知识怎么办?答案很坦率,也许会不受欢迎。如果您的团队在您的问题领域缺乏专业知识,那么试图构建一个产品将是不负责任的。您不仅缺乏构建有效产品的知识,还缺乏理解是否构建了一个无效产品的洞察力。
数据、伦理和负责任的人工智能
您的数据集的质量将比任何其他因素更多地塑造您的应用程序的社会影响。不管您如何用心去调查围绕您的项目的伦理问题,并设计一个既有利于人又安全的应用程序,您的数据集的限制将决定您理解和避免无意伤害的能力。
从负责任的人工智能的角度来看,您的数据集提供了两个核心要素:
-
您试图创建的算法系统的原始构建材料
-
理解系统性能的最有力工具
您的数据集是您的系统旨在与之交互的真实世界情况的唯一详细表现。您整个应用程序开发反馈循环都受它的调节。作为原始的构建材料,如果您的数据集在任何方面有所不足,将不可避免地导致您的系统表现不佳。更糟糕的是,同样的缺陷将影响您理解—甚至注意到—系统性能不佳的能力。
对于边缘人工智能项目来说,尤其如此,因为它们的边缘部署性质意味着很难在现场捕捉关于它们在进行中的表现的信息。您的数据集往往代表了您唯一的机会来以真正的精度评估您的模型性能。
有了这个想法,花足够的时间确保这一部分做得正确至关重要。
这场悲剧突显了数据集构建中最大的挑战之一。现实世界的变化多种多样到近乎荒谬的程度。有着接近无限种类的人类、自行车、塑料袋、道路和光照条件。一个数据集不可能捕获到所有这些事物的可能组合。
此外,有许多可能的变体组合,即使领域专家也可能不了解其中一些。例如,即使是城市交通专家被要求识别自动驾驶数据集中需要包含的关键对象,他们可能没有考虑到包裹着塑料袋的自行车的情况。
最小化未知因素
正如唐纳德·拉姆斯菲尔德(Donald Rumsfeld)臭名昭著的一句话中所说,在数据集创建中存在“已知未知”和“未知的未知”。建立有效数据集的唯一方法是尽量减少这两者。有两种主要方法可以做到这一点。
第一种,也是最有效的方法是限制模型将要交互的情境范围。一个通用的自动驾驶系统可能被视为数据集构建的噩梦场景。自动驾驶汽车必须在杂乱的现实中穿行,从城市街道到乡村道路,几乎遇到任何可以想象到的情况。你不可能构建一个代表所有这些多样性的数据集。
相比之下,考虑一个受限于高尔夫球场内驾驶的自动驾驶高尔夫车。虽然它仍然可能在球场上遇到自行车,但这种可能性很小——因此,可能更容易构建一个代表正常使用情况下的典型环境的数据集。对于自动驾驶汽车来说,限制范围的原则可能会指导您将车辆操作限制在算法训练的地理区域内。
第二种避免未知因素的方法是提高你的领域专业知识。对于一个情境有更多专业知识可用,可能会减少“未知的未知”。如果 Uber 雇用了更有效的城市交通专家小组来帮助构建和评估他们的数据集,他们可能会避免一场悲剧。
在实际层面上,我们也可以从这一见解中得出一个明确的规则:我们不应在缺乏领域专业知识的情况下为真实世界的应用构建边缘 AI 应用程序。没有领域专业知识,领域的“未知的未知”规模是不受限制的。几乎可以保证我们会遇到它们。
确保领域专业知识
现在存在的惊人工具大大降低了训练机器学习模型的门槛。不幸的是,这种情况会诱使开发人员在缺乏领域专业知识的领域构建应用程序。
在 COVID-19 大流行期间,成千上万的研究人员和工程师设计了项目,旨在使用医学影像诊断感染。2021 年发表在自然机器智能(5)上的综述识别了 2,212 项此类研究。其中只有 62 项通过了质量审查,没有一个模型被推荐用于潜在的临床使用。发现的主要问题如果能应用临床和机器学习领域的专业知识可能本可以解决。
学术界的同行评审系统为分析和批评试图用 AI 解决问题提供了机制。然而,在工业界没有这样的系统。模型部署在黑盒系统内部,没有随附的文档,并允许与真实世界系统直接交互而无监控。这极大地增加了灾难性问题进入生产的可能性。
我们在边缘 AI 领域工作的人有责任为保证适当的质量建立系统,既在组织内部又通过组织间的协作。重点放在数据集质量和相应的领域知识部署在任何严肃努力的核心。
数据中心化机器学习
传统上,机器学习从业者专注于选择最佳的特征工程和学习算法组合,以在特定任务上获得良好性能。在这个框架中,数据集被认为是固定的元素,很少在基本清理之外进行操作。它们提供输入和正确性参考,但不被视为需要调整和微调的东西。
近年来,越来越多的人意识到数据集不应被视为静态对象。数据集的构成对于训练在其上的模型性能有很大影响,从业者已经开始修改数据集以在任务上获得更好的性能。
这种新的思维方式被称为“数据中心化机器学习”。在数据中心化的工作流中,更加注重改进数据集的质量,而不是调整算法参数。
数据中心化的机器学习遵循古老的计算原则“垃圾进,垃圾出”——即如果提供的输入质量低劣,期望计算机程序做出良好决策是不合理的。
数据中心化的工作流和工具帮助开发人员了解其数据的质量及如何解决其中的问题。这可能包括:
-
修复或删除错误标记的样本
-
移除异常值
-
添加特定数据以改善表示
-
重新取样数据以改善平衡
-
添加和移除数据以解决漂移问题
承认所有这些任务都需要领域知识是很重要的。在某些方面,向数据为中心的机器学习的转变是承认领域知识在从机器学习系统中获得满意性能方面的重要性。
注意
漂移是指现实世界随时间变化的概念。数据集和模型必须不断更新以应对这一变化。我们将在本章稍后详细讨论漂移。
数据为中心的方法认为数据集是需要定期维护的活体实体。这种维护是值得的,因为它既减少了训练有效模型所需的算法工作量,又减少了所需的数据量。一个质量高的数据集与较少样本通常比一个具有更多样本的低质量数据集优越。
成功的现实项目通常将数据为中心的方法与自动发现有效算法参数的现代工具结合起来(例如我们在“自动化机器学习(AutoML)”中了解到的 AutoML 系统)。在提供高质量数据的情况下,这些工具可以很好地探索设计空间,并提出有效的模型。
这本书推荐的方法是这样的。它赋予领域专家专注于反映其专业领域的数据,同时将算法调优的苦力工作交给自动化系统。这些自动化系统依赖高质量的数据来评估模型,并选择最适合任务的模型。通过专注于数据集的质量,开发者同时改进了系统的原始输入和评估机制。
估算数据需求
在边缘 AI 项目的初始阶段,人们经常问的最常见问题是:“我需要多少数据?”不幸的是,这并不是一个简单的问题。数据需求因项目而异巨大。
通常,机器学习项目的数据需求远高于仅依赖信号处理、启发式和其他手工编码算法的项目。在这些情况下,您主要将数据用于测试——因此,虽然您仍需要足够的数据以保证数据集的代表性,但不需要像许多机器学习算法所需的大量每种类型条件的示例。
理解问题的数据需求最佳方法是寻找先例。是否有解决这类问题的示例,可以让您对所需数据量有所了解?
在这方面,网络是您的最佳伙伴。快速搜索将找到科学论文、基准测试、开源项目和技术博客文章,这些资源可以提供大量见解。例如,网站 Papers with Code 有一个“最新技术”部分,列出了各种任务的基准数据集以及它们随时间的性能。
如果我们正在开发一个关键词识别应用程序,我们可以查看Google 语音命令数据集的结果,在撰写本文时,其准确率已达到 98.37%。深入研究数据集本身告诉我们,该任务涉及对 10 个关键词进行分类,数据集中每个关键词有 1.5-4k 次语音发声。如果我们的任务足够相似,这些数字可以给我们一个大致需要多少数据的估计。
另一个好主意是探索您的问题领域中专门设计用于少量数据工作的工具。深度学习模型可能尤其对数据需求严苛:是否有经典的机器学习替代方案可以适应您的用例?如果您的问题需要深度学习,是否有任何预训练的特征提取器可用于通过迁移学习适应您的用例,或者您是否可以使用现有数据集训练一个?
例如,在关键词识别领域,哈佛研究人员的一篇论文“任何语言的少样本关键词识别”(Mazumder 等人,2021 年)提供了证据,表明关键词识别模型只需五个示例和一个大得多的数据集来验证其性能。
表 7-1 提供了一些常见任务训练机器学习模型所需数据量的相对指标。
表 7-1. 常见任务的数据需求
| 任务 | 相对数据需求 | 备注 |
|---|---|---|
| 时间序列分类 | 低 | 数字信号处理可以完成大部分繁重工作,使得这一任务更容易训练。 |
| 时间序列回归 | 中等 | 由于更精细的标签,这比分类更具挑战性。 |
| 非语音音频分类 | 中等 | 需要多样化的数据来考虑背景噪声和环境声学的多样性。 |
| 语音音频分类 | 低或高 | 通常需要大量数据,但新的少样本技术可以减少这一需求。 |
| 在可见光谱中的图像分类 | 低 | 使用在公共数据集上训练过的模型进行迁移学习使得这一任务相对简单。 |
| 在可见光谱中的目标检测 | 中等 | 虽然可以进行迁移学习,但这比分类更具挑战性。 |
| 非可见光谱的视觉模型 | 高 | 通常不提供迁移学习,增加了数据需求。 |
记住,即使是这些相对需求也是非常粗略的——它们可能因项目而异,这就是为什么很难给出确切的数量。随着新的工具和技术的出现,数据需求将继续发展。任务越常见,就越有可能有信号处理或学习技术可以帮助减少数据需求。
在机器学习中最大的数据集是用于从头开始训练语言模型的大规模文本数据集。这通常不是边缘 AI 中必须处理的任务,这限制了我们需要处理的数据集的上限。
一个估算数据需求的实用工作流程
在我们的初步研究之后,下一步是找出工具并开始做一些实验。我们的核心任务是了解在足够的数据情况下,我们选择的特征工程和机器学习流程能否达到足够好的结果。
这项任务自然成为应用开发迭代方法的一部分,我们将在第九章中更详细地介绍。现在,我们将以高层次概述相关任务。
注意
为我们的项目定义“足够好的结果”是一个重要的步骤,将在“方案范围”中探讨。
这里是估算数据需求的基本过程:
-
捕捉和细化一个小数据集。为了有效地估算数据需求,这个数据集应该满足本章前面描述的理想数据集的所有要求,除了适当的大小。本章的其余部分将帮助您了解将其整理成良好形状所需的过程。
-
根据你对潜在模型类型的研究,选择一个候选模型。从最简单且合理的模型开始是个好主意,因为简单的模型通常最容易训练。不要陷入只想尝试热门新技术而不排除简单且优雅替代方案的陷阱。
-
将数据集分成多个大小相同的块。每个块应该具有接近原始数据集的平衡和分布。为了实现这一点,您应该使用分层随机抽样。⁶ 开始时大约有八个块。
-
在数据集的一个块上训练一个简单的模型,并记录结果的性能指标。使用超参数优化工具可能会有所帮助,正如在“自动化机器学习(AutoML)”中描述的那样,以排除超参数选择的影响。
-
将另一个块添加到您的训练数据中,这样它现在由两个块的数据组成。再次从头开始训练同样的模型(如果决定使用超参数优化,则继续使用),并再次记录指标。
-
继续这个过程,添加一块数据,训练模型,收集性能指标,直到使用整个数据集。
-
在图表上绘制性能指标。它会看起来像图 7-2 中的一个图表。

图 7-2. 每个图表显示性能指标(在本例中为准确性)随记录数的变化。左侧的图表显示添加更多数据可能会导致更好的性能的情况。右侧的图表显示平台期:添加更多相同类型的数据不太可能导致性能显著改善。
在两个图表中,我们可以看到每次添加更多数据时模型的性能都会提高。通过观察曲线的形状,我们可以理解新样本对性能的影响。在左侧的图表中,曲线表明如果我们继续添加数据,性能很可能会继续提高。趋势线提供了一个大致估算所需数据量的方式。
在右侧的图表中,我们可以看到模型已经达到了性能平台期。添加更多相同类型的数据不太可能产生任何效果。在这种情况下,也许值得测试不同的机器学习模型或算法,或者尝试改进我们的特征工程。您还可以考虑通过提高数据集的方式来改进,而不仅仅是增加其大小:也许它包含了大量可以减少的噪声。
当然,这种技术完全依赖于我们数据集是“理想的”这一假设。实际情况是,您的数据集可能存在问题,而您的特征工程和机器学习算法的限制可能会导致随着数据的增加,实际性能无法与趋势线匹配。然而,获得一个大致的数字仍然是有用的——它可以帮助您计划收集更多数据的工作量。
这种技术 不 会告诉您您的数据集是否具有代表性、平衡或可靠性。这些部分完全取决于您自己。
获取您手上的数据
构建高质量数据集的挑战的一大部分是数据来源本身。以下是一些典型的获取数据的方式:⁷
-
从头开始收集全新的数据集
-
将数据收集外包给另一个团队或第三方
-
使用来自公共数据集的数据
-
从合作伙伴或合作者处重新利用现有数据
-
从内部数据存储重新利用现有数据
-
从先前成功的 AI 项目中重用数据
正如您所见,有多种潜在的选择。然而,对于特定的项目来说,不太可能所有这些选择都可用。例如,如果这是您的第一个边缘 AI 项目,您可能没有任何现有数据可重新利用。
每个数据源代表两个重要事物之间的不同权衡:质量问题的风险和努力(转化为成本)。图 7-3 显示了它们的比较情况。

图 7-3. 按质量风险和努力/成本组织的数据源。
你对数据收集过程的控制越多,就越能保证质量。到目前为止,最佳选择是能够重复使用你过去成功使用过的数据(6)。如果你有幸能够选择这个选项,你已经知道数据的质量,不需要投入太多精力才能重复使用——只要它保持相关性。
组织通常会有现有的数据存储,可以重新用于 AI 项目(5)。在这些情况下,有可能了解数据的质量,因为它是在内部收集的。然而,可能需要一些工作将其整理成 AI 项目所需的形式。例如,制造商可能已经使用现有的物联网系统收集机器数据。在这种情况下,了解数据的来源和收集技术有助于降低风险。然而,这些数据可能并非现成可用,通常需要进行一些清理。现有数据通常缺乏标签,添加标签的成本较高。
数据往往可以从合作伙伴组织或合作者处获得(4)。在这种情况下,由于其他人已经收集了数据,无法保证质量——可能需要进行一些清理才能使其可用。
对公共数据集(3)也是如此,这些数据集通常用于学术研究。公共数据集的优势在于经过多人审核,可能有有用的基准可用,但它们往往要么由低质量数据源拼凑而成且包含大量错误,要么非常小。可能需要进行大量清理才能使用,且可能存在未记录或明显的偏见。⁸
将数据收集外包给你组织中的另一个团队或第三方公司(2)可能是可行的——存在一些公司专门提供数据收集和标记的服务。虽然理论上你对数据收集过程有很大控制权,但仍存在显著风险,因为很难保证第三方会遵循正确的程序。这通常是一种昂贵的方法。
最低风险的方法是亲自动手收集数据(1)。当设计数据集和算法的人与领导数据收集工作的人是同一批人时,误解或未检测到的错误的风险将被最小化(假设他们具备必要的领域知识来做好这项工作)。不幸的是,这也是最昂贵的方法。
捕捉边缘数据的独特挑战
使用情况越普遍,您可能越有可能找到易于访问的经过质量审核的数据集。这对许多边缘应用来说是个难题,因为有大量的利基用例和外来传感器。此外,商业实体不倾向于共享其数据集,因为它们代表潜在的竞争优势。
如果您需要收集自己的数据,那么需要解决一些具体的挑战:
连通性和带宽
在带宽和连接性有限的应用中经常使用边缘计算。这意味着在现场收集数据可能会很困难。例如,如果您正在为监控农场动物移动而建立一个 AI 摄像头,您可能希望从田野中收集动物的图像。然而,由于许多农场的偏远位置和缺乏连接性,这可能是不可能的。
要解决这个问题,您可以临时在现场安装网络硬件(例如,在偏远地区可能会使用卫星连接)—或者依赖于sneakernet功能。⁹ 这非常昂贵,但可能只需要在项目开始阶段暂时完成。
棕地硬件
正如我们在“绿地和棕地项目”中学到的那样,将边缘 AI 应用部署到现有硬件上是相当普遍的。不幸的是,该硬件并不总是设计用于数据收集。为了成功进行数据收集,棕地硬件需要足够的内存来存储样本,足够的网络能力来上传它们,并且足够的能源预算来允许该过程频繁发生。
要解决这个问题,暂时在现场安装更适合收集数据挑战的新硬件可能是有意义的。专用的工业数据记录仪专为此目的而设计,而像Arduino Pro这样的工业级快速物联网开发平台也很方便使用。
绿地硬件
如果边缘 AI 项目涉及创建新硬件,则可能要过一段时间才能获得可用的工作硬件。这可能是一个重大挑战,因为在硬件开发过程中与数据集和算法开发并行进行非常重要。甚至在完成一些算法开发之前,很难知道需要什么样的硬件。
在这种情况下,尽快获取一些代表性数据非常重要。类似于棕地案例,可能有必要使用快速的物联网开发平台开始收集数据,即使在生产硬件准备好之前也是如此。
传感器差异
有时,目前在现场可用的传感器硬件可能与您计划在新设备中使用的硬件不完全相同。在某些情况下,甚至传感器的放置位置可能有足够的不同,会引起问题。
如果你怀疑传感器差异可能是一个挑战,你应尽早评估传感器数据并确定其是否足够不同以造成问题。如果是这样,你可以使用与处理不充分的既有硬件类似的方法推荐的方法。
标记
在处理边缘 AI 数据时,最大的挑战之一是标签的可用性。例如,假设你正在收集农场动物耳标上的加速度计数据,目标是对其在进食、行走和睡眠之间的时间分配进行分类。即使在收集原始传感器数据相对容易的情况下,将这些数据与动物的实际活动相关联可能是具有挑战性的。如果你已经能够使用数据识别动物的活动,那么你的项目可能就没有必要了!
为了解决这个问题,你可以尝试收集在设计设备正常操作期间可能不可用的额外数据。例如,在初始数据收集期间,你可以选择同时收集加速度计数据和显示动物活动的摄像机视频,并为两者都标记时间戳。然后,你可以使用视频来帮助标记数据。
存储和检索数据
当你开始收集数据时,你需要一个地方来存储它。你还需要一个机制,将数据从设备传输到数据存储中,并从数据存储传输到你的训练和测试基础设施。
存储需求因预期数据集大小而大不相同。数据量越大,解决方案就需要越复杂。尽管如此,边缘 AI 数据集通常相对较小,不太可能需要设计用于大规模操作的技术。
在选择解决方案时,最好选择尽可能简单的解决方案。如果你处理的数据量可以轻松适应单台工作站,那么没有必要投资于高级技术。对于便利性而言,你对数据的直接访问越便捷,探索和实验的效果就越好,所以从便捷性的角度来看,最理想的选择总是你的本地文件系统。
表 7-2 提供了各种数据存储解决方案的快速参考,以及每种解决方案的优势和劣势。
表 7-2. 数据存储解决方案
| 存储类型 | 优势 | 劣势 |
|---|---|---|
| 本地文件系统 | 快速、简单且易于操作 | 没有 API、没有备份、没有分布式训练;最大容量仅为几 TB |
| 网络或云文件系统 | 可供多台机器访问;可以存储大规模数据集 | 比本地文件系统慢;挂载设置复杂 |
| 云对象存储 | 读写数据的简单 API;可以实现大规模存储 | 必须下载数据才能使用 |
| 特征存储 | 数据可以进行版本控制和跟踪;可以存储元数据;可以查询数据 | 必须下载数据才能使用;比简单存储更复杂且更昂贵 |
| 端到端平台 | 特别为边缘 AI 设计;内置数据探索工具;与数据捕获、训练和测试紧密集成 | 比简单存储更昂贵 |
存储在本地文件系统上的数据非常容易使用,并且可以非常快速地访问。即使在使用复杂的云存储时,数据通常也会在训练模型之前复制到本地文件系统。
但是,在没有备份的情况下将所有宝贵数据存储在单台机器上是有风险的。如果数据需要多人访问,这也很不方便。网络共享,包括基于云的文件系统——如 Amazon FSx、Azure Files 和 Google Cloud Filestore——可以解决这个问题。但是,要访问它们相对复杂——它们必须作为驱动器挂载在操作系统中。
云对象存储服务——如 Amazon S3、Azure Blob Storage 和 Google Cloud Storage——提供了 HTTP API,使得数据的进出变得更加简单。这些 API 甚至可以被嵌入式设备使用,从边缘上传数据,假设硬件足够能力。然而,它们的访问速度比驱动器挂载慢,因此通常在使用之前会将数据下载到本地磁盘。
特征存储是数据集存储的一个相对新的趋势。它们旨在提供简单的数据访问和存储 API,以及数据版本控制和查询数据等附加功能。主要提供者的特征存储包括 Amazon SageMaker Feature Store、Azure Databricks Feature Store 和 Google Cloud Vertex AI Feature Store。你还可以在自己的基础设施上托管开源等价物,如 Feast。
现在有几个专门设计用于创建边缘 AI 应用程序的端到端平台。其中一些包括他们自己的数据存储解决方案。这些通常相当于特征存储,但其设计专门用于边缘 AI 项目。它们可能包括用于探索和理解传感器数据的工具,或者提供与嵌入式软件开发工具的集成点。它们被设计为与深度学习工作流程的其他阶段紧密集成。我们在“工具”章节中学到了更多关于这些工具的信息。
将数据存入存储中
如果你正在为一个项目捕获传感器数据,那么如何将其存储到你的数据存储中?答案取决于你的具体情况:
现场连接良好
如果你有足够的连接性、带宽和能量直接从边缘设备发送数据,你可以将数据直接推送到 API 中。如果你使用的是为边缘 AI 专门设计的端到端平台,并且其 API 专门设计用于设备上使用,则这样做最容易。
另一个很好的选择是使用物联网平台。您可以使用其专门构建的 API 将数据上传到平台,然后使用另一个系统将数据从物联网平台复制到您的数据集中。
直接从嵌入式设备上传数据到云对象存储不是一个好主意。因为这些 API 并不是为嵌入式使用设计的,它们倾向于使用效率低下的数据结构,而它们的客户端库可能无法适应小型目标。在使用嵌入式 Linux 设备时,这个问题较小,因为它们具有更大的功能和对完整操作系统的访问权限。
现场连接性差或无连接性
如果您缺乏良好的连接性,或者能量预算不足以从网络边缘发送数据,您可能需要安装一些硬件,允许数据在边缘存储并定期收集。
这可能意味着修改您现有的硬件以增加数据存储。这也可能意味着添加另一个独立系统,放置在附近,能够接收并存储由生成数据的设备产生的数据。这个独立系统可以配备更好的连接性,或者可以定期物理收集数据。
收集元数据
正如我们之前学到的,理想的数据集需要有良好的文档记录。在设计数据收集系统时,您应该确保尽可能多地捕获有关数据收集环境的上下文信息。
此附加信息,即元数据,可以与传感器数据本身一起包含在您的数据集中。它可能包括诸如:
-
捕获数据的日期和时间
-
收集数据的具体设备
-
使用传感器的确切型号
-
设备在数据收集站点上的位置
-
与数据收集相关的任何人员
元数据可以涉及整个数据集,其任何子集,或者单个记录本身。文章“数据集数据表”(Gebru 等人,2018)定义了一种收集描述数据集及其记录子集的文档的标准。尽管这非常有价值且应被视为最佳实践,但在更结构化、粒度更细和可机器读取的基础上收集元数据也具有重大好处。
在许多情况下,您将收集与个体实体相关的数据样本。例如,您可能正在监测特定机器的振动,捕获特定人类发言的关键词样本,或者记录个体农场动物的生物信号数据。
在这些情况下,关键是尽可能多地捕获有关每个单独实体的相关元数据。例如对于一台机器,您可能会捕获:
-
精确的制造和型号
-
机器的生产周期
-
机器安装的地点
-
机器正在使用的工作
对于一个说关键词的人,您可能会尝试捕捉可能影响其语音的任何可想象的属性。例如:
-
身体特征,例如年龄、性别或医疗条件
-
文化特征,例如口音、种族或国籍
-
个人特征,例如职业或收入水平
您应该将这些元数据附加到与之相关的各个样本上。这将允许您根据元数据将您的数据集分成子组。您可以利用这种能力来深入理解两件事:
-
在算法开发过程中,您将了解您的数据集的组成以及您缺少代表性和平衡的地方。
-
在评估您的系统时,您将了解到在数据集的子组中,您的模型存在的弱点。
例如,想象一下,您正在训练一个检测机器故障的模型。通过分析您的元数据,您可能会发现您的大多数数据样本来自特定生产批次的机器。在这种情况下,您可能希望收集来自其他生产批次的数据,以改善数据集的代表性。
在另一种情况下,您可能会使用关键词数据集来评估关键词检测模型。通过交叉引用模型在不同数据样本上的表现与样本的元数据,您可能会发现模型在来自年长者的样本上表现更好。在这种情况下,您可能希望收集更多来自年轻说话者的训练数据,以改善性能。
通过这种方式,元数据有助于降低风险。如果没有样本级元数据,您将对数据集的构成和模型在其中不同组别的表现方式一无所知。当您掌握了关于数据来源的详细信息时,您能够构建更好的产品。
确保数据质量
在本章的早些时候,我们列出了理想数据集应具备的属性:
-
相关
-
代表性
-
平衡的
-
可靠的
-
格式良好
-
良好文档化
-
适当大小的
正如我们在“数据中心机器学习”中学到的,高质量的数据集既减少了所需数据量,又减少了算法选择对创建有效系统的影响。当机器学习系统使用良好的数据进行训练和评估时,它们更容易获得有用的结果。
但是,了解数据集质量的最佳方法是什么?事实上,这归结于领域专业知识。如果您对解决的问题领域有深刻的见解,您将能够利用这些见解来帮助评估您的数据。
确保代表性数据集
数据集最重要的属性是其代表性。这是因为 AI 算法的目标是模拟真实世界的情况以做出决策。它学习真实世界的唯一机制就是用于训练或设计它的数据集。这意味着如果数据集不具代表性,生成的算法将无法真实反映现实世界。
例如,想象一下,您正在构建一个 AI 系统来帮助识别不同类型的植物病害,使用患病植物的照片。如果您的数据集中没有正确植物的照片或适当的症状,无论其算法多么复杂,您设计的 AI 系统都无法有效。
更糟糕的是,由于数据集还用于评估系统的性能,我们在部署模型到现场之前甚至不知道存在问题。¹¹
这就是领域专业知识的作用所在。如果您是植物疾病的专家,您可以利用自己的知识帮助理解数据集是否代表了真实世界的情况。例如,也许您的数据集缺少受到您希望识别的疾病影响的某些植物物种的照片。
元数据对此过程非常有帮助。如果您的数据集包含指示每张照片中植物物种的元数据,领域专家可以简单地查看物种列表,并立即注意到是否有物种缺失。
另一个使用元数据的有用方法是绘制特定元数据属性在数据中的分布图。例如,您可以选择绘制属于每种物种的样本数量。如果这种分布与现实世界的条件不合理,您可能需要收集更多数据。例如,您可能从一种物种中获得的记录要比另一种物种多得多,如图 7-4 所示。

图 7-4。该数据集中某些物种的记录明显多于其他物种。这可能会导致公平性问题;例如,您的算法在物种 B 上的表现可能远远优于物种 F。
除了整体数据集外,重要的是在各个标签中保持代表性。例如,您应确保在试图识别的每一类植物病害中,每种受影响的物种都有同等好的代表性。
如果您的数据集代表个体实体,还应检查确保数据集在这些实体方面平衡。例如,可能某种植物的所有照片来自一个植株,而另一种植物的照片则来自多个植株。
领域专家应该能够帮助确定以这种方式探索的数据轴。但如果没有足够的元数据怎么办?当使用未专门收集为特定项目的数据时,这种情况非常常见。在这种情况下,您将不得不对数据集进行系统性审查。
通过抽样审查数据
数据质量审查的挑战在于,特别是在伴随的元数据有限的情况下,往往无法逐个样本地审查每个数据。数据集可能非常庞大,领域专家的时间宝贵(也很昂贵)。
幸运的是,抽样为我们提供了一种审查数据的方法,而无需检查每一个项目。对于给定的数据集,记录的足够大的随机样本将具有与更大数据集几乎相同的表示和平衡。这个较小的样本可以被领域专家彻底检查,以了解整个数据集的质量。
棘手的部分在于确定样本需要多大。它必须足够大,以有合理的概率包含我们关心的特征,但又小到可以在合理的时间内审查。
例如,想象一下我们的领域专家正在尝试确定数据集是否包含足够数量的某种植物物种的实例。为了做到这一点,他们可以计算数据样本中该植物物种的实例数量,并计算该物种与其他物种实例之间的比率。但是,需要多大的样本量才能使我们假设样本和整个数据集之间的植物物种比率是等价的呢?
实际上有一个公式可以用来估计样本大小。它看起来像这样:
在这个公式中,误差边界 表示我们愿意容忍的样本比率与整个数据集比率之间的差异量。通常将其设置为 5%,这意味着我们可以接受我们样本中的比率比整个数据集中的比率高出或低出 2.5%。
Z 分数表达了我们的置信水平,或者说我们需要确信得到的数字实际上会在我们误差边界的范围内。一个合理的置信水平是 95%,这将给我们一个 Z 分数为 1.96,¹² 假设数据集的大小是典型的(超过几万个样本)。
最后,标准偏差表示我们期望数据变化的程度。由于没有办法预先知道这个值,我们可以安全地将其设为 0.5,这样可以最大化样本量。
如果我们将所有这些都整合在一起,我们将得到以下结果:
由于没有部分样本的概念,我们可以将样本量四舍五入至 385。这告诉我们,我们需要随机抽样 385 个项目,以确保我们有 95%的置信度,认为一个物种与另一个物种的比率与我们在随机样本中看到的值相差不超过 5%。
结果表明,这个数字在数据集大小方面并没有太大的变化,至少对于机器学习相关的数据集来说是这样。它对误差边界的变化最为敏感:如果您只希望有 1%的误差边界,那么您将需要审查一个包含 9,604 个项目的样本。Qualtrics 提供了一个方便的在线计算器,使实验变得容易。
所有这些都表明,通常随机选择你的数据集中的几百个样本应该足够了。¹³ 这应该是一个可以审查的管理数量,并且还会为您提供一些关于数据集是否具有可接受质量的合理见解。
当然,这假设您正在寻找的子组足够大,可以适应误差边界。例如,如果植物物种占数据的不到 5%,那么在 385 个项目的样本中,我们不太可能找到它。然而,如果您正在寻找代表少数的子组,这仍然是一个有用的结果:它将指导您添加更多数据,最终使得该组在随机抽样中可检测。
标签噪声
超越典型性,数据集质量问题的另一个主要来源是所谓的标签噪声。标签为我们提供了我们试图用 AI 预测的数值。例如,如果我们正在训练植物病害分类器,一张不健康植物的照片可能会被标记为确切的病害。不过,标签不一定是类别,例如,如果我们正在解决一个回归问题,我们期望数据标记为我们试图预测的数字。
不幸的是,附加到数据的标签并不总是正确的。由于大多数数据都是由人类标记的,错误往往会悄然而入。这些错误可能相当显著。麻省理工学院的一个研究团队发现,在一组常用的公共数据集中,平均有 3.4%的样本标记错误¹⁴—他们甚至建立了一个网站来展示这些错误。
标签噪声并非完全是灾难性的。机器学习模型在学习如何应对噪声方面表现得相当不错。但它确实会产生显著影响,¹⁵ 而为了最大限度地提高模型性能,清理嘈杂的标签可能是值得尝试的。边缘 AI 的约束已经在模型性能上投入了很多。清理嘈杂的标签可能会带来比花更多时间在算法设计或模型优化上更高的回报。
识别标签噪声的最简单方法是审查数据的随机样本,但对于大型数据集来说,这就像在干草堆里寻找针一样困难。与随机抽样不同,更明智的做法是更智能地聚焦搜索。
一个好的方法是在一个类内寻找异常值。如果一个样本被错误分类,它可能与其误标记的类中的其他成员显著不同。对于简单的数据,可以使用标准的数据科学工具来轻松实现。对于像图像或音频这样的高维数据,这可能会更具挑战性。
Edge Impulse 使用的端到端边缘 AI 平台对这个问题有一个有趣的解决方案。Edge Impulse 的特征探索器使用无监督降维算法将复杂数据投影到简化的二维空间,其中的接近性与相似性相关。这种方法使得可以轻松发现异常值,如图 7-5 中所示。

图 7-5. 每个点代表数据的一个样本,点与点之间的距离代表它们的相似性。异常值,例如用箭头标出的那些,是不寻常的样本。当样本出现在属于其他类别的样本附近时,值得调查,看看它们是否被误标记了。
另一种寻找嘈杂类标签的简单方法是假设一个训练在数据上的模型对分类嘈杂样本的置信度较低。如果训练样本按照训练模型在分配类别时的置信度排序,很可能误标记的样本会出现在列表的底部。
在除分类之外的问题数据集中,标签噪声看起来有所不同。例如,回归数据集中的标签噪声包括目标值中的误差,而在物体检测或分割数据集中的标签噪声意味着边界框或分割图与它们应该围绕的对象不匹配。
标签噪声的检测和缓解是一个持续研究的领域。如果你有一个特别嘈杂的数据集,深入科学文献可能会有所帮助——在Google 学术中快速搜索“label noise”会对你有所裨益。
避免标签噪声
标签噪声通常是由于在数据标记过程中的人为错误导致的。人类在进行数据标记等重复性任务时并不擅长产生可靠的结果,即使他们有正确的知识也是如此。此外,有时从数据中并不清楚正确的标签应该是什么。例如,即使是医疗专家在判断一张诊断图像是否显示疾病时也不总是一致的。
在许多情况下,标签错误是对标签任务理解不足的结果。在需要大量标签工作的项目中,提供一个“评分员指南”是很重要的:一本为数据标记者准备的手册。该指南应包括清晰说明准则的示例。在项目的过程中,可以更新任何有趣或不明确的示例。
为了最大限度减少人为错误的影响,使用多个标注者可能是有用的。如果标注者在标签上存在分歧,可以将样本标记为需要进一步检查。如果对于某个样本没有明确的答案,可以使用投票系统来得出确定的标签,或者可以拒绝该样本。正确的操作方式将根据项目的不同而异,并需要应用领域专业知识。
常见的数据错误
表示和平衡问题是大的结构性问题,反映了数据集设计的方式,而标签噪声是影响个别样本的收集过程的结果。与标签噪声类似,还有许多常见错误可能会影响到边缘 AI 项目中的数据。以下是一些在边缘 AI 项目中常见的问题:
标签噪声
正如在“标签噪声”中详细描述的那样,由于人为或机器错误,数据标签的问题是常见的。
缺失值
由于各种原因,数据集中的某些记录可能会缺少某些特征的值。例如,数据收集脚本中的错误可能导致值未被写入正确的位置。这种情况非常普遍,而最重要的数据准备任务之一就是找出处理缺失值的最佳方法。
传感器问题
传感器的技术问题可能会导致主要的数据质量问题。影响传感器的常见问题包括过多的噪声、不正确的校准、影响传感器读数的环境条件变化,以及随时间推移导致数值变化的退化。
不正确的值
有时数据集中的值不反映实际测量的内容。例如,传输过程中可能会使读数损坏。
异常值
异常值是远超出预期范围的值。有时异常值可能是自然的,但通常它们是传感器问题或环境条件意外变化的症状。
不一致的缩放
同一个值可以在数字系统中以多种不同的方式表示。例如,温度读数可以是摄氏度或华氏度,传感器值可能已经标准化或未标准化。如果对同一特征的值使用了不同的缩放,比如将两个数据集的数据合并,就会出现问题。
不一致的表示
除了缩放之外,表示方法还有很多其他的变化方式。例如,一个数据点可以被存储为 0 到 1 之间的 16 位浮点值,或者是 0 到 255 之间的 8 位整数。彩色图像中的像素顺序可以是红色、绿色、蓝色,或者是蓝色、绿色、红色。音频文件可以被压缩为 MP3 格式,也可以存在为一组样本的原始缓冲区。不一致的表示方法可能会导致许多困难。重要的是要充分记录这些内容,也许甚至要附加在每个样本中的元数据中。
意外的比率
不一致表示的一个特别讨厌的子类型是采样率不一致。例如,数据集可能包含以 8 kHz(每秒 8000 次)采集的样本和以 16 kHz 采集的样本。如果它们没有被不同处理,它们看起来将包含非常不同的值。当采样率和比特深度的变化结合在一起时尤为糟糕——一眼看去,很难区分 8 kHz 16 位样本和 16 kHz 8 位样本!
不安全的数据
如果你正在从现场收集数据,确保有安全的机制来收集和传输数据至关重要。例如,你可以使用加密方式签名样本,以确保它们在存储之前没有被篡改。如果攻击者能够篡改你的数据,他们可以直接影响最终的算法,从而扭曲你的系统使其偏向他们的利益。
几乎每个人工智能项目都需要处理这些类型错误的工作。在“数据清洗”中,我们将介绍一些用于解决这些问题的方法。
漂移和变化
万物皆变,无一物常存。
爱菲索斯的赫拉克利特,公元前 535-475 年
数据集只是时间的一个快照:它代表了在收集期间系统的状态。由于现实世界随时间而变化,即使是最高质量的数据集也可能变得有些陈旧。这种变化过程以几个术语来描述,包括漂移、概念漂移和变化。
当发生漂移时,数据集不再代表实际系统的当前状态。这意味着使用该数据集开发的任何模型或算法都是基于对系统的错误理解,并且一旦部署后可能表现不佳。
漂移可以以几种不同的方式发生。让我们在一个捕捉工业机器振动的数据集的背景下探讨这些方式:
突然变化
有时候现实世界的条件会突然改变。例如,工人可能会将振动传感器移动到机器的不同部位,从而突然改变了其所感知到的运动特性。
逐渐变化
信号可能会随时间逐渐变化。例如,机器的运动部件随着时间逐渐磨损,慢慢改变其振动的特性。
周期性变化
变化往往会以循环或季节性的形式发生。例如,机器的振动可能会随其所处位置的环境温度变化而变化,而这种温度在夏季和冬季之间会有所不同。
因为变化是不可避免的,漂移是人工智能项目面临的最常见问题之一。它可以发生在从物理配置(如传感器的放置位置)到文化演变(如语言和发音逐渐变化)的任何方面。
管理漂移需要随时间更新您的数据集,我们将在“随时间构建数据集”中更详细地讨论。它还需要监控您模型在实际场景中的性能,这将在接下来的章节中涉及。
由于漂移的存在,边缘人工智能项目永远不会真正“完成” —— 它几乎总是需要在监控或维护方面进行持续努力。
错误的不均匀分布
正如我们所见,数据集可能存在许多不同类型的错误。为了获得高质量的数据集,您需要追踪错误并确保它们保持在可接受的水平内。然而,重要的不仅仅是测量错误的存在或缺失,还要考虑它们如何影响数据的不同子集。
例如,假设您正在解决一个具有 10 个类别的平衡数据集的分类问题。通过抽样估计,您的数据集中大约有 1% 的标签噪声:即每 100 个数据样本中有一个标记错误。从算法的角度来看,这可能是可以接受的。也许您已经在数据上训练了一个机器学习模型,并且根据其准确性来看,它似乎是有效的。
但是,如果这 1% 的错误标签并不均匀(或对称地)分布在数据集中,而是不对称地集中在单一类别中呢?在这个类别中,而不是每 100 个样本中有一个标记错误,而是每10个数据项中有一个可能会被错误标记。这可能足以严重影响您模型在这一类别的性能。更糟糕的是,它将影响您测量该类别性能的能力,就像您对其他类别的测量方式一样。
错误也可能在不一定是类别的子群体之间不对称。例如,也许您的数据集包含从三种不同车型收集的数据。如果其中一种车型安装的传感器有问题,那么这些车型的数据可能包含错误。这比错误在类别之间不对称更危险,因为使用标准性能指标来检测其影响要困难得多。
不对称的错误可能会导致算法中的偏差,因为它们对某些子群体的系统性能影响更大。在查找数据中的错误时,您应特别注意考虑来自数据子群体的错误率,即使总体错误水平看似可接受。通常情况下,领域专业知识在确定子群体及其最佳检查方法方面将非常有帮助。
准备数据
从原始数据到高质量数据集的过程是一条漫长的道路,包含许多步骤。在接下来的部分,我们将沿着这条道路前行,开始理解这个过程。以下是我们沿途的站点:
-
标注
-
格式化
-
清洗
-
特征工程
-
划分
-
数据增强
其中一项,特征工程,实际上是我们将在第九章中涵盖的算法开发工作的一部分。然而,它在这里值得一提,因为它的结果在优化数据集的过程中如何使用。
我们的旅程里程碑假设您已经收集了一些初始原始数据。您可能还没有完全代表性或平衡的数据集,但您已经有了一个坚实的开始。数据准备过程将指导您在成长和改进数据集的过程中。
标记
典型的边缘 AI 数据集反映了一组原始输入(例如一些时间序列传感器数据)与这些输入含义的映射。我们的任务通常是构建或训练一系列算法系统,能够自动执行这种映射:当提供一组原始输入时,它告诉我们这些输入的含义。然后,我们的应用程序可以利用这个假设的含义来做出智能决策。
在大多数数据集中,这种含义的描述以标签的形式呈现。正如我们所见,创建可靠的算法需要高质量的标签。数据可以通过几种不同的方式进行标记,任何项目可能会结合使用其中的几种方式:
使用特征进行标记
一些数据集使用它们自己的特征进行标记。例如,想象我们正在构建一个虚拟传感器系统——该系统使用几个廉价传感器的信号来预测一个昂贵但成本高昂的传感器的输出。在这种情况下,我们的数据集需要包含来自廉价传感器和昂贵传感器的读数。昂贵传感器的读数将用作标签。
在用作标签之前,特征可能会经过处理。例如,想象我们希望训练一个机器学习模型,根据传感器数据预测是白天还是黑夜。我们可以使用数据集中每行的时间戳,以及数据收集地点的当地日出和日落信息,来确定数据是在白天还是黑夜捕获的。
手动标记
大多数数据集是由人类有意标记的。对于某些数据集来说,这很容易:如果样本是在特定事件期间收集的,它们的标签可能是显而易见的。例如,想象你正在收集车辆的振动数据集,并将其标记为“移动”或“空闲”。在这种情况下,如果你当时坐在车里,你已经知道每个样本应该如何标记。
在其他情况下,标记可能是一个繁琐的手动过程,其中人类需要查看以前未标记的数据集中的每条记录,并确定正确的标签应该是什么。这个过程可能很具挑战性:例如,可能需要一些培训或技能来确定应用正确的标签。在某些情况下,即使是经过良好培训的专家也可能很难就正确的标签达成一致——医学影像数据经常面临这个问题。
即使任务很简单,人类也会自然而然地犯错误。手动标记是数据集质量问题最常见的原因之一。它也是最难检测和纠正的,因此值得确保您做对了。
自动标注
根据您的数据集,可能可以自动应用标签。例如,想象一下您计划训练一个微型的设备上机器学习模型,可以从照片中识别不同物种的动物。您可能已经可以访问一个大型,高度准确的机器学习模型,能够执行此任务,但太大而无法安装在嵌入式设备上。您可以潜在地使用这个大型模型自动标记您的数据集,避免人力劳动的需要。
这种方法可以节省大量时间,但并非总是可行。即使可行,假设自动化系统会出现一些错误并需要一些流程来识别和修正它们也是明智的。
值得记住的是,大型现有模型的标签与您试图训练的模型之间通常存在差异。例如,想象一下您正在构建一个识别野生动物声音的系统。您的目标是部署一个能够识别声音是由鸟类还是哺乳动物发出的微型模型。如果您的大型模型设计用于识别单个物种,那么您将不得不将每个物种映射到“鸟类”或“哺乳动物”标签之一。
辅助标注
可以设计一种混合方法,介于手动和自动化标注之间,既能提供直接的人类洞察力,又能自动完成繁琐的任务。例如,假设你被要求在图像数据集中的特定对象周围绘制边界框。在辅助标注系统中,计算机视觉模型可能会突出显示每个图像中感兴趣的区域,以便您检查并决定哪些需要绘制边界框。
并非所有问题都需要标签。
根据您试图解决的问题,您甚至可能不需要标签 — 尽管大多数情况下您会需要。
在“经典机器学习”中,我们遇到了监督和无监督学习的概念。在监督学习中,机器学习算法学习预测给定一组输入数据的标签。在无监督学习中,模型学习数据的表示,可以在某些其他任务中使用。
无监督算法不需要标签。例如,想象一下我们正在为异常检测训练聚类算法。[¹⁶] 该算法不需要标记数据;它只是尝试学习未标记数据的固有属性。在这种情况下,可以说标签是隐含的:因为聚类算法必须在表示正常(非异常)值的数据上进行训练,因此您的训练数据集必须经过精心策划,以确保它仅包含非异常值。
如果您怀疑可能能够使用无监督算法解决问题,应该在流程的早期阶段尝试一下。您可能会发现可以不用标记太多数据,这将大大节省成本、时间和风险。然而,大多数问题可能最终需要使用监督学习。
即使使用无监督算法,通常也很重要拥有一些标记数据用于测试。例如,如果解决异常检测问题,需要获取一些正常值和异常值的示例。这些示例需要标记,以便用于评估模型的性能。
半监督学习和主动学习算法
标记是数据集收集中最昂贵和耗时的方面之一。这意味着通常可以访问大量未标记的数据和少量已标记的数据。许多对边缘人工智能感兴趣的组织可能拥有长时间收集的物联网数据存储。这些数据虽然丰富,但却是未标记的。
半监督学习和主动学习是两种旨在帮助利用这类数据的技术。这两者背后的概念是,模型部分训练于一个小的标记数据集上,可以用来帮助标记更多的数据。
半监督学习,如图 7-6 所示,从一个大的未标记数据集开始。首先,从这个数据集中选择一个小的子集进行标记,并在这些标记记录上训练模型。然后,该模型用于对一批未标记记录进行预测。这些预测结果用于标记数据。其中一些可能是错误的,但没关系。

图 7-6. 半监督学习。
然后,这些新标记的记录与原始标记数据合并,并使用所有这些数据训练新模型¹⁷。新模型应该至少比旧模型好一点,即使它是在旧模型帮助标记数据的基础上训练的。然后重复此过程,逐渐标记更多数据,直到模型足够用于生产。
第二种技术,主动学习,有些不同。该过程,如图 7-7 所示,以同样的方式开始,即一个初始模型在可用的少量标记数据上进行训练。然而,下一步不同。模型不是自动标记随机样本数据,而是帮助选择数据集中看起来最有用的一组记录进行标记。然后请领域专家标记这些样本,并训练一个新模型利用它们。

图 7-7. 主动学习。
选择过程旨在通过识别未标记样本中包含的最有助于模型学习的信息来最大化信息增益。两种最常见的选择策略称为不确定性采样和多样性采样,可以单独或组合使用。
不确定性采样基于置信度。如果初始模型在分类记录时显得自信,那么可以假设从该记录中无法获取更多信息用于训练。如果模型对特定记录不自信,这表明模型没有见过许多类似样本,并且不知道如何处理它。这些样本对我们来说标记和添加到数据集中是最有影响力的。
多样性采样涉及使用统计技术来理解哪些样本最能代表数据的基本分布。例如,我们可能会尝试找到一种方法来量化任意两个样本之间的相似性。为了选择要标记的新样本,我们会寻找那些与我们现有已标记数据集中的样本看起来最不同的样本。
整个过程——选择少量样本进行标记,将新样本与现有标记样本一起添加到训练数据中,并重新训练模型——将根据需要重复多次,以获得性能良好的模型。
尽管这些技术相对较新,但它们非常有效。关于“标注工具”的部分提供了一些示例,可以帮助您使用它们。
也就是说,主动学习工具是标记过程中偏见的潜在来源。为了评估它们,建议将它们的结果与随机选择的样本的结果进行比较(而不是由您的主动学习工作流程选择的样本)。这将帮助您更好地了解您的主动学习过程正在创建的模型类型。
标签偏见
在“标签噪音”中,我们讨论了标签噪音在数据集中的重要问题。标签噪音的一个主要来源是标记过程中的偏见。当这种情况发生时,数据集反映的是进行标记的人和工具的偏见,而不是反映您试图建模的潜在情况。
这只是标记过程中偏见可能影响数据集质量的一种方式。不幸的是,这些类型的问题几乎不可避免。此外,由于数据集是评估系统的最强大工具,因此系统中可能存在的任何偏见可能难以检测。
避免标签质量问题的最佳方法是制定严格的评估标签正确性的程序。这可能包括:
-
利用在主题方面拥有深厚经验的合法领域专家
-
遵循由领域专家建立的详细标记协议
-
依赖多个标注者可以相互检查工作
-
评估你标记数据样本的质量
这将增加标注过程的成本和复杂性。如果生成高质量数据集的成本超出预算承受范围,你的项目可能无法实现。与其发布一个有害系统到生产环境,还不如终止项目。
标注偏见不仅仅存在于手动标记的数据中。如果你使用自动系统帮助标记数据,系统中存在的任何偏见也会反映在你的数据集中。例如,想象一下,你正在使用一个大型预训练模型的输出来帮助标记新数据集中的记录,以训练边缘 AI 模型。如果大型模型在数据集的所有子组中表现不均匀,你的标签也会反映出这些偏见。
标记工具
有几种不同类别的工具可以帮助标记数据。最佳选择将根据项目而异:
-
注释工具
-
众包标注
-
辅助和自动标注
-
半监督学习和主动学习
让我们依次探讨每一个。
注释工具
如果你的数据需要人工标注或评估,他们将需要使用某种工具。例如,想象你正在构建一个包含任何动物的照片数据集。你可能需要某种用户界面来显示每张照片,并允许领域专家指定他们看到的动物。
这些工具的复杂性将根据数据的不同而变化。用于图像分类数据集的标注界面将相对简单;它只需显示照片并允许用户指定标签。用于对象检测数据集的界面将需要更复杂:用户将需要绘制围绕他们关心的对象的边界框。
更奇特的数据类型,例如时间序列传感器数据,可能需要更复杂的工具,可以帮助以领域专家能理解的方式可视化数据。
注释工具在与传感器数据集交互中几乎是不可或缺的要求。它们不仅用于标注,还用于可视化和编辑现有的标签,因为评估标签是过程的重要组成部分。
注释工具有开源和商业软件两种。一些需要注意的事项包括:
-
支持你正在处理的数据类型
-
支持你试图解决的问题(例如,分类与回归)
-
协作功能,以便多人可以共同进行标注
-
自动化和本节后面解释的其他功能
众包标注
一个团队通常会有更多需要标注的数据,超出他们内部能够处理的范围。在这种情况下,使用众包标注工具可能会很有用。这些工具允许您定义一个标注任务,然后招募公众成员来帮助完成。帮助标注数据的人可以得到一定的经济补偿,每标注一个样本可能会得到一小笔钱,或者他们可能是志愿者。
众包标注的一大优势在于它可以帮助您快速标注大量数据集,否则可能需要耗费极长的时间。然而,由于标注过程依赖于接受过最低培训的公众成员,您不能依赖任何领域专业知识。
这可能会使一些任务变得不可达:例如,任何需要复杂技术知识的任务。即使是简单的任务,您最终可能会遇到比由领域专家标注数据时更多的质量问题。此外,清晰定义任务的工作量很大,以至于公众成员能够理解。为了取得好的结果,您需要教育标注人员如何准确完成任务。
除了质量问题,还存在机密性问题:如果您的数据集包含敏感、私密或专有信息,众包可能不是一个选项。此外,众包数据集有可能会受到恶意行为者的操控。
辅助和自动化标注
辅助和自动化标注工具使用某种形式的自动化来帮助人类(无论是领域专家还是众包标注人员)快速标注大量数据。在简单的情况下,这可能涉及使用基本信号处理算法来帮助突出感兴趣的区域或建议标签。更复杂的工具可能使用机器学习模型来辅助。以下示例的辅助标注工具来自 Edge Impulse。
首先,这个目标检测标注工具使得在一系列图像中绘制边界框更容易。它使用物体跟踪算法来识别后续帧中已标记的物体,如图 7-8 所示。

图 7-8. 在 Edge Impulse 中用于标注的物体跟踪;标记的汽车在连续的帧之间被追踪。
在标注工具的更复杂示例中,Edge Impulse Studio 中的数据探索器使用聚类算法来帮助可视化数据,相似的样本会靠近彼此,让用户能够基于相邻的样本快速标注样本。这显示在图 7-9 中。

图 7-9. Edge Impulse 中数据浏览器用于标记关键词识别数据集的截图。
最后,可以使用完整预训练模型来帮助自动标记数据。例如,图 7-10 展示了使用在公共数据集上预训练的对象检测模型来标记 80 种已知对象类别的实例。
辅助标记可以通过将工作从人工标记者转移至自动化系统来节省时间和精力。然而,由于自动化系统不太可能完美无缺,不能单独使用——必须有人类“在其中”,以确保质量良好。

图 7-10. 可以使用预训练模型自动标记数据,正如 Edge Impulse 中的这一屏幕截图所示。
半监督和主动学习
正如讨论中提到的“半监督和主动学习算法”,存在各种技术可以通过使用部分训练模型来帮助减少标记数据集的负担。这些方法类似于辅助标记,但尤其令人兴奋的是它们可以智能地减少需要进行的标记量。例如,主动学习工具可能建议手动标记数据的一个小子集,以便为其余数据准确提供自动标签。
这两种技术都涉及标记数据子集、训练模型,然后确定下一批数据的标签的迭代过程。经过多次迭代,您将获得一个有效的数据集。
主动学习的一个有趣变体可以在Edge Impulse Studio 的数据浏览器中找到。数据浏览器可以使用部分训练模型来帮助可视化未标记的数据集作为聚类。¹⁸ 这些聚类可用于引导标记过程,确保聚类是明显的,并且每个聚类至少包含一些标记样本。图 7-11 展示了基于部分训练模型对数据集进行聚类的情况。

图 7-11. 根据部分训练模型的输出对数据进行聚类;该可视化可以通过引导标记或识别模糊样本来改善数据质量。
正如我们所见,数据标记对 AI 系统的质量有重大影响。虽然有复杂的工具可用来减少所需的工作量,但标记通常会占据 AI 项目花费的大部分时间。
格式化
几乎无限种格式可以用来存储磁盘上的数据。这些范围从简单的二进制表示到专门设计用于训练机器学习模型的特殊格式。
数据准备过程的一部分是将来自不同来源的数据汇集在一起,并确保以方便的方式格式化。例如,您可能需要从物联网平台提取传感器数据,并将其写入二进制格式,以便为模型训练做准备。
每种数据格式都有不同的优缺点。以下是一些常见的变体:
文本格式
类似 CSV(逗号分隔值)和 JSON(JavaScript 对象表示法)的格式将数据存储为文本。例如,CSV 格式将数据存储为以分隔符分隔的文本,通常是逗号(因此得名)或制表符。它非常容易处理,因为您可以使用任何文本编辑器读取和编辑值。然而,文本格式非常低效——文件占用的空间比二进制格式大,并且需要更多的计算开销来访问和处理。
CSV 和 JSON 文件适用于可以完全读入内存的小数据集,但对于必须从磁盘读取的大数据集,最好先将数据转换为二进制格式。
图像和音频文件
图像和音频是常见的数据类型,并有它们自己的典型格式(如 JPEG 图像和 WAV 音频文件)。将图像和音频数据集存储为独立的文件在磁盘上是相当常见的。虽然这不是可能的最快解决方案,在许多情况下这已经足够了。以这种方式存储的数据集有利于易于阅读和修改,而无需任何特殊工具。它们通常与清单文件一起使用(参见提示“清单文件”)。
一些特殊类型的数据,如医疗成像,有其自己的特殊格式,可以编码元数据,如位置和方向。
直接访问二进制格式
二进制数据格式指的是以其本机形式(二进制位序列)存储数据,而不是编码为二级格式(如文本格式)。例如,在二进制格式中,数字1337会直接存储在内存中作为二进制值10100111001。在文本格式中,由于文本编码的开销,同样的数字可能会以更大的值表示。例如,在名为 UTF-8 的文本编码中,数字1337会以比特位00110001001100110011001100110111表示。
在直接访问二进制格式中,许多数据记录存储在单个二进制文件中。文件还包含元数据,使得读取它的程序可以理解记录中每个字段的含义。该格式设计成数据集中的任何记录都可以在常数时间内访问。
一些常见的直接访问二进制格式包括 NPY(由 Python 数学计算库 NumPy 使用)和 Apache Parquet。不同的格式有不同的性能权衡,因此选择适合特定情况的格式非常有用。
顺序二进制格式
顺序二进制格式(例如 TFRecord)旨在最大化某些任务(例如训练机器学习模型)的效率。它们以特定的、预设的顺序提供快速访问。
顺序格式可以非常紧凑且读取速度快。然而,它们不像其他数据格式那样易于探索。通常,在训练机器学习模型之前,将数据集转换为顺序格式将作为最后一步进行。它们只在大型数据集中真正使用,其中效率节省显著降低了成本。
清单文件
清单文件是一种特殊文件,用作数据集其余部分的索引。例如,图像数据集的清单文件可以列出所有预期在训练期间使用的图像文件的名称。清单文件的常见格式是 CSV。
由于基于文本的清单文件简单且易于使用,这是跟踪数据的便捷方式。创建数据集样本就像随机选择清单文件中的一些行一样简单。
您的数据集通常会在其旅程中占据几种不同的格式。例如,您可能从几个不同的来源获取数据,可能是混合的基于文本和二进制格式。然后,您可以选择将数据聚合在一起并将其存储在直接访问的二进制格式中,然后进行清理和处理。最后,在某些情况下,您可能会选择将相同的数据集转换为顺序二进制格式以进行训练。
数据清洗
当您开始将数据集整合到一个通用格式中时,您需要确保其包含的所有值都符合质量一致的标准。在“常见数据错误”中,我们遇到了您将在数据集中看到的主要问题类型。
在收集和整理数据集的任何步骤中,都可能出现错误。以下是不同阶段出现的一些错误示例:
-
由于故障硬件引起的原始传感器数据中的异常值
-
从不同设备聚合数据时的数据格式不一致
-
由于多个来源的数据连接问题导致的缺失值
-
由于特征工程中的错误而导致的不正确值
清理数据集是一个涉及多个步骤的过程:
-
使用抽样审计数据以识别错误类型(您可以使用“通过抽样审查数据”中讨论的相同方法来抽样)
-
编写代码以修复或避免您注意到的错误类型
-
评估结果以证明问题已经被解决
-
自动化步骤 2,以便您可以修复整个数据集,并将相同的修复方法应用于将来添加的任何新样本。
除非您的数据集非常小(例如,小于 1GB),否则通常应该对数据样本进行操作而不是整个数据集。由于处理大型数据集需要大量时间,使用样本将减少在识别问题、修复问题和评估修复方案之间的反馈循环时间。
一旦您在数据样本上找到满意的修复方法,您可以自信地将修复方法应用于整个数据集。尽管如此,最后一步还是评估整个数据集以确保没有漏掉的问题是一个好主意。
审计您的数据集
在“常见数据错误”中列出的问题通常是您会遇到的问题类型。但是,如何确定数据集中存在哪些错误呢?
识别数据清洁问题的最强大工具是允许您将数据集(或其代表样本)视为摘要的工具。这可能意味着创建一个表格,显示特定字段的描述统计和存在的类型。这也可能意味着绘制图表中数值的分布,以便领域专家评估分布是否符合预期。
Python 库pandas是探索和总结数据集的绝佳工具。一旦加载到 pandas 数据结构中,即DataFrame,数据集的值可以进行总结。例如,以下命令打印了时间序列值的统计摘要:
>>> frame.describe()
value
count 365.000000
mean 0.508583
std 0.135374
min 0.211555
25% 0.435804
50% 0.503813
75% 0.570967
max 1.500000
通过查看统计数据,我们可以看到此时间序列的值集中在 0.5 左右,标准差为 0.13。我们可以利用领域专业知识来判断这些值是否合理。
更好的是,Python 库Matplotlib允许我们可视化我们的数据。例如,我们可以轻松打印一个直方图来显示我们的数据框架:
plt.hist(frame['value'])
plt.show()
结果图显示在图 7-12 中。传感器读数明显形成了正态分布。

图 7-12。一个示例数据集中数值的直方图。
从直方图中,我们可以看到数据大部分集中在 0.5 左右,但是有一些点的数值约为 1.5。领域专家可以解释这一点,以了解分布是否合适。例如,可能是传感器问题导致一些异常值,这些值并不反映准确的读数。一旦我们确定了问题,我们可以深入挖掘以确定适当的修复方法。
使用常见的数据科学工具(例如 Python 和 R 生态系统中的工具)可以以无限的方式总结数据。在进行边缘 AI 项目的工程师或数据科学家必须能够与领域专家合作,帮助探索数据并识别错误。
修正问题
一旦在数据集中发现错误,您将需要采取一些行动。您能够采取的具体行动取决于您发现的错误类型以及您正在收集数据的整体上下文。
这些是处理错误时您可以使用的主要方法:
-
修正值
-
替换值
-
排除记录
另外,一旦解决了数据集中的任何问题,您可能需要解决导致上游问题的问题。
修正值
在某些情况下,可能可以完全修复错误。以下是一些例子:
-
数据格式不一致可能通过转换为正确的格式来解决。
-
如果数据可从其他来源获取,则可以发现并填充缺失值。
-
由于功能工程代码中的错误导致的故障值可以被修复。
通常,只有在原始原始数据仍然可用的情况下,才能完全修复错误。在某些情况下,您仍然可能找不到正确的值。例如,如果一些数据错误地以过低的频率捕获,则将无法恢复原始信号,只能近似。
替换值
如果无法修复错误,仍可能替换为合理值。以下是此类事件发生的一些例子:
-
缺失值可以用整个数据集中该字段的均值替换。
-
异常值可能会被裁剪或调整到合理的值。
-
可以对低频或低分辨率数据进行插值以近似更高的细节。
替代使您能够利用记录,即使其中一些信息是缺失的。然而,作为交换,这将为您的数据集引入一些噪音。一些机器学习算法擅长容忍噪音,但保留的信息是否值得增加的噪音,这是一个基于应用的判断调用。
排除记录
在某些情况下,错误可能是无法挽救的,这将需要您从数据集中丢弃受影响的记录。以下是一些例子:
-
缺失值可能导致记录无法使用。
-
来自故障传感器的数据可能无法修复。
-
一些记录可能来自未达到数据安全标准的来源。
不仅仅是删除有问题的记录,标记它们为有问题的是个好主意,但是把它们存档起来。这样有助于跟踪出现的问题类型和受影响的记录类型。
解决错误的正确方式完全取决于数据集和应用的上下文。为了获得良好的结果,应同时应用领域专业知识和数据科学经验。
评估和自动化
在修复数据样本或子集中的错误后,应进行另一次审计。这将有助于捕获您的努力可能无意中引入的任何问题,以及可能被您修复的问题掩盖的问题。例如,您可能仅移除数据集中最严重的异常值,却发现仍存在其他较小但仍值得关注的异常值。
在验证了对子集的修复后,可以将修复应用到整个数据集中。对于大型数据集,您需要将此过程自动化作为数据流程的一部分(参见“数据流水线”)。对更多数据集进行基于抽样的审计,直到您确信问题已得到充分解决。
提示
保留原始未改进的数据集副本,以便在需要时可以回滚。这将帮助您在实验时不必担心犯错和数据丢失。
重要的是要追踪受错误影响的记录类型。错误可能会不成比例地影响数据的某些子组。例如,假设您正在对传感器数据进行分类模型训练。您可能会发现某些传感器读数存在严重问题,需要丢弃相关记录。如果这些问题影响某个类别比其他类别更多,可能会影响分类器的性能。
在此基础上,您应确保在应用任何修复后,数据集仍然具有良好的质量标准(正如我们在“确保数据质量”中探讨的那样)。
要记录数据集中各种类型错误的普遍程度。如果坏记录的比例很高,可能值得在花费大量时间修复损坏之前,尝试修复任何上游原因。
随着数据集的增长,可能会出现新问题。为了帮助识别任何问题,根据您的初始评估创建自动断言是一个好主意。例如,如果您通过删除极端异常值来改进数据集,应该创建一个自动化测试来证明数据集具有预期的变化量。每次添加新记录时运行此测试,以确保捕捉任何新问题。
解决平衡问题
到目前为止,我们讨论了如何修复数据集中值的错误。然而,数据集最常见的问题之一是不平衡:各子组的记录数量不均衡。在“确保代表性数据集”中,我们以显示植物疾病图像的数据集为例。在这种情况下,如果数据集中显示某种植物物种图像的数量比其他植物物种多,则可能被认为是不平衡的。
在数据集中解决平衡问题的最佳方法是为低估的子组收集更多数据。例如,我们可以回到现场为低估的植物物种收集更多图像。然而,这并不总是可行的。
如果你必须应付,你可以通过过采样低估的组来潜在地解决平衡问题。为此,你可以复制这些组的一些记录,直到所有子组具有相同数量的记录。你还可以通过欠采样过度表现的组来丢弃它们的一些记录。
在构建用于训练机器学习模型的数据集时,这种技术可能很有用。由于模型的学习通常是通过整个数据集的聚合损失值来指导的,如果某个子组被低估,它对模型学习的影响就不大。通过采样平衡各个子组的数量可以有所帮助。
然而,如果你的数据量不足以真实反映受影响子组的真实方差,过采样并不能帮助你。例如,如果我们植物数据集中的某个物种仅由单一植物的图像表示,过采样可能不会导致一个表现良好的模型——因为在现实世界中,各个个体植物之间存在大量变化。
你在使用过采样数据评估系统时也应该小心。你的评估结果对于你过采样的子组会更不可靠。
一种与过采样等效的技术是在训练过程中对子组进行加权。在这种技术中,每个子组被分配一个权重,该权重控制其对训练或评估过程的贡献。可以为子组分配权重以纠正任何平衡问题。例如,一个低估的子组可能被赋予比高估子组更高的权重。
有些数据集天然存在不平衡。例如,在对象识别数据集中,包含对象的图像区域通常比不包含对象的区域要小。
在这些情况下,当重新采样可能无效时,通常使用加权来增加低估数据对模型训练的贡献。
特征工程
大多数边缘 AI 项目都会涉及一些特征工程工作(参见“特征工程”)。这可能只是简单地缩放特征(见侧边栏“特征缩放”)——或者可能涉及极其复杂的 DSP 算法。
由于机器学习模型和其他决策算法是在特征上运行而不是原始数据上运行的,特征工程是数据集准备的重要部分。特征工程将由我们在第九章中遇到的迭代应用开发工作流指导,但在数据集准备阶段建立特征的基线将是必要的。
进行一些初步的特征工程将使您能够按特征而不是仅仅原始数据的方式探索和理解数据集。在此阶段进行特征工程的一些其他重要原因包括:
-
缩放值以便作为机器学习模型的输入
-
合并值(参见“合并特征和传感器”),也许进行传感器融合
-
预先计算 DSP 算法以加快训练速度¹⁹
几乎可以肯定的是,您将希望在开发过程中的某个时候迭代特征工程 — 但您越早开始这项工作,效果会更好。
分割您的数据
如我们所见,AI 项目的工作流程涉及算法开发和评估的迭代过程。基于我们即将详细展开的原因,重要的是为数据集设计结构,使其适应这种迭代工作流程。
典型情况下,通过将数据集分为三部分来完成此过程:训练、验证和测试。²⁰ 每个分割的用途如下:
训练
训练分割直接用于开发算法,通常是通过训练机器学习模型来完成。
验证
验证分割用于在迭代开发过程中评估模型。每次开发新迭代时,都会根据验证数据集检查性能。
测试
测试分割“被保留” — 直到项目最后阶段才使用。它用于最终验证模型是否能够在以前未接触过的数据上表现良好。
我们使用单独的分割来检测过拟合。如“深度学习”所讨论的那样,过拟合是指模型在某个特定数据集上学习如何得出正确答案,但这种学习方式并不能泛化到新数据上。
为了识别过拟合,我们可以首先用训练分割训练模型。然后可以测量模型在训练数据和验证数据上的性能。例如,我们可以计算分类模型在每个分割上的准确率:
Training accuracy: 95%
Validation accuracy: 94%
如果这些数字相似,我们知道我们的模型能够利用从训练分割中学到的知识对未见数据做出准确预测。这正是我们想要的 — 能够泛化的能力。然而,如果模型在验证分割上表现较差,这表明模型对训练分割过拟合。它能够在之前见过的数据上表现良好,但在新数据上表现不佳:
Training accuracy: 95%
Validation accuracy: 76%
在验证分割上准确率显著低时,清楚地表明模型在未见数据上表现不佳。这是模型应该改进的强烈信号。
但如果验证分割可以帮助我们检测过拟合,为什么我们还需要测试分割?这是机器学习迭代开发中一个非常有趣的现象。正如我们所知,我们的迭代工作流程包括对算法进行一轮更改,然后在验证分割上测试它们,然后再进行更多的算法更改,试图提高性能。
当我们不断微调和更改我们的模型,以试图在验证分割上取得更好的性能时,我们可能会调整模型到一种碰巧在训练和验证数据上工作良好的程度,但在未见数据上表现不佳。
在这种情况下,即使模型并没有直接在验证数据上进行训练,模型也已经对验证数据过拟合。通过我们的迭代过程,关于验证分割的信息已经“泄漏”到模型中:我们反复修改它,这些修改是根据验证分割中的数据得出的,导致了过拟合。
这种现象意味着我们不能完全信任验证分割给我们的信号。幸运的是,测试分割为我们提供了解决这个问题的方法。通过将测试分割保留到我们的过程的最后阶段,当所有迭代都完成时,我们可以得到一个清晰的信号,告诉我们我们的模型真的在未见数据上工作。
数据如何分割?
数据通常通过随机抽样按比例进行分割。一个常见的标准是首先将数据按 80/20 分割,其中 20%成为测试分割。然后将 80%分割为 80/20,其中 80%成为训练分割,20%成为验证分割。这在图 7-13 中显示。

图 7-13。数据集被分割为用于训练、测试和验证的块。
根据您的数据集,使用较少量的数据进行验证和测试分割可能是合理的,保留更多数据用于训练。关键是,每个分割点都是整个数据集的代表样本。如果您的数据方差较低,这可能通过相对较小的样本来实现。
每个数据分割点也应在整个数据集的平衡和多样性方面具有代表性。例如,植物疾病分类数据集的训练、验证和测试分割点应该在不同类型植物疾病之间保持大致相同的平衡。
如果数据集平衡且子组与总样本数的比率较低,则可以通过随机抽样简单实现。然而,如果存在许多不同的子组,或者某些子组少数代表,执行分层抽样可能是一个好主意。在这种技术中,针对每个子组单独执行分割,然后合并。这意味着每个分割点将具有与整体数据集相同的平衡。一个简单的例子在图 7-14 中显示。

图 7-14. 当数据集分割时,分层抽样可以帮助保留子群体的分布。
分割数据时的陷阱
错误地分割数据将使你无法测量你的应用在未见数据上的表现,这可能导致在现实世界中表现不佳。以下是一些常见的要避免的错误:
精心策划的分割
验证和测试分割应该是整体数据集的代表性样本。手动选择每个分割中包含的记录是大忌。例如,想象一下,你决定将你认为最具挑战性的记录放在训练分割中——理论上这会帮助你的模型学习。
如果这些记录没有包含在测试分割中,你将无法真正了解模型在其上的表现。另一方面,如果你将所有最具挑战性的记录都放在测试分割中,你的模型将无法从它们的训练中受益。
决定哪些记录进入每个分割是随机抽样算法的工作,而不是你手动完成的事情。Python 库 scikit-learn 提供了一套很好的工具来执行数据集分割。
平衡和代表性问题
正如前面讨论的,每个分割具有相同的平衡和代表性非常重要。这适用于分类问题的类别和“非官方”子群体。例如,如果你的数据来自多种不同类型的传感器,你应该考虑执行分层抽样,以确保每个分割中包含来自每种传感器类型的适当比例的数据。
预测过去
对于在时间序列数据上执行预测的模型,情况会变得更加复杂。在现实世界中,我们始终试图基于过去来预测未来。这意味着为了准确评估时间序列模型,我们需要确保它是在较早的值上进行训练,并在稍后的值上进行测试(和验证)。否则,我们可能只是训练了一个可以基于当前值预测过去值的模型——这可能不是我们的初衷。在处理时间序列时,数据沿时间线向后的这种“泄漏”值得在任何时候都要考虑。
重复值
在处理大量数据时,记录很容易出现重复。你的原始数据中可能有重复,或者在分割数据的过程中可能会悄悄插入。任何分割之间的重复都会影响你测量过拟合能力的能力,因此应该避免。
分割变更
如果你尝试使用测试数据集的性能比较多种方法,重要的是每次都使用相同的测试分割。如果每次使用不同的样本集,你将无法确定哪个模型更好——任何变化可能仅仅是分割差异的结果。
增强的测试数据
如果您正在执行数据增强(我们将在下一节学习),只应增强您的训练数据。增强您的验证和测试拆分将削弱它们对真实世界性能的洞察力:您希望它们由纯粹的真实世界数据组成。如果您在增强数据上评估模型,您将无法保证它在非增强数据上的工作效果。
数据增强
数据增强是一种旨在帮助充分利用有限数据的技术。它通过向数据集引入模拟自然界中存在的类型变化的随机人工变化来工作。
例如,可以通过修改图像的亮度和对比度、旋转、放大特定区域或以上任意组合来增强图像 — 如图 7-15 所示。
任何类型的数据都可以增强。例如,可以将背景噪声混合到音频中,时间序列可以以许多不同的方式进行转换。增强可以在特征工程之前和之后进行。常见的增强包括:
添加性
整合其他信号,例如来自现实世界的随机噪声或背景噪声
减法
移除或模糊值,或移除时间或频率带的块
几何
旋转、移位、压缩、拉伸或以其他方式空间操作信号
基于过滤器的
通过随机量增加和减少单个值的特性

图 7-15。作者的猫以多种不同的方式增强。
增强增加了训练数据的变化量。这可以有助于模型泛化。由于存在大量随机变化,模型被迫学习一般的基础关系,而不是完全记忆整个数据集(这将导致过拟合)。
数据增强只应用于数据集的训练拆分非常重要。增强的记录不应包含在验证或测试数据中,因为目标是评估模型在真实数据上的表现。
数据增强通常是通过库完成的 — 大多数机器学习框架提供了一些内置的数据增强功能,并且许多数据增强协议已经在科学文献中记录并作为开源代码提供。
增强可以通过在线或离线方式进行。在在线增强中,每次在训练过程中使用记录时都会应用随机变化。这非常好,因为它会导致大量的随机变化。然而,一些增强可能计算成本高昂,因此可能会显著减慢训练速度。
在离线增强中,每条记录都会随机更改特定次数,并将更改后的版本保存为更大的增强数据集。然后使用这个增强数据集来训练模型。由于增强是提前完成的,训练过程速度更快。然而,在使用离线增强时引入的变化较少,因为每条记录创建的变体是有限的(通常是有限的)。
应用于数据集的增强类型可以多种多样,不同的变体可能导致模型表现更好或更差。这意味着增强方案的设计必须成为整体迭代开发工作流程的一部分。这也是为什么增强您的验证或测试数据集是个坏主意的原因之一。如果您这样做了,那么对增强方案的任何更改也会改变您的验证或测试数据。这将阻止您对比不同模型在相同数据集上的性能。
设计适当的增强集是需要领域专业知识的任务。例如,专家应该根据应用程序的背景了解最佳的背景噪声类型以混合到音频数据集中。
数据管道
在本章的过程中,我们遇到了一系列应用于数据的任务和考虑因素:
-
捕获
-
存储
-
评估
-
标记
-
格式化
-
审计
-
清洗
-
采样
-
特征工程
-
分割
-
增强
无论您以何种顺序执行这些任务,这一系列任务都可以被视为数据管道。您的数据管道始于现场,数据由传感器和应用程序生成。然后将数据带入您的内部系统,在那里它被存储、连接、标记、检查和处理以保证质量,并准备用于训练和评估 AI 应用程序。一个简单的数据管道如图 7-16 所示。

图 7-16. 用于捕获和处理数据的基本数据管道;每个项目都有一个不同的数据管道,它们的复杂程度可以大不相同。
您应将您的数据管道视为基础设施的重要组成部分。它应该由干净、设计良好的代码实现,并且有良好的文档、版本控制,包括运行它所需的依赖信息。
对数据管道的任何更改都可能对数据集产生重大的下游影响,因此您必须确切了解在初始开发和未来期间正在进行的工作。
噩梦般的情景是,导致数据集创建的过程丢失,因为数据管道未记录或无法再运行。正如我们之前所看到的,数据集代表了领域专业知识的精髓,可以用来创建算法的工件。
如果用于创建该数据集的过程没有记录,那么将不再能够理解其构建中所涉及的决策或工程。这将极大地增加调试导致的 AI 系统问题的难度,并使得即使新数据可用,系统改进也非常困难。
在边缘人工智能中,高度复杂的传感器数据很常见,因此良好跟踪数据管道尤为重要。不幸的是,这种噩梦情景非常普遍!直到最近,随着 MLOps 实践的兴起,从业者们才开始像它们应得的那样重视数据管道。
MLOps,即机器学习运营,是与机器学习项目的操作管理相关的工程领域。我们将在第九章和第十章中全面探讨它。考虑 MLOps 的最重要原因之一是,通过添加新数据和训练更好的模型,可以不断改进 ML 应用程序。这是我们对抗生产 ML 项目的重大敌人——数据漂移的最重要工具。
随着时间的推移构建数据集
正如我们在“漂移与偏移”中所看到的,现实世界随时间变化——通常是相当快速的。由于我们的数据集只是时间片段的一个快照,它最终将不再具有代表性。使用陈旧、过时的数据集开发的任何算法将在实地中失效。
抵御数据漂移是你始终应该收集更多数据的一个强有力原因。有了持续涓涓细流的新数据,你可以确保训练和部署最新模型,在实际世界中表现良好。
边缘 AI 算法通常部署到必须容忍较差连接的设备上。这意味着很难测量部署在实地操作设备上的性能。这提供了持续收集数据的另一个关键好处²²。有了新鲜数据,你可以了解到同样算法在实际操作中设备的性能。如果性能开始下降,可能需要更换这些设备。如果没有新鲜数据,你将无法知晓这一点。
除了漂移,拥有更多数据几乎总是有益的。更多数据意味着数据集中更自然的变化,这意味着更能够推广到真实世界条件的优秀模型。
从数据中心的机器学习角度来看,数据收集本身应该是我们迭代开发反馈循环的一部分。如果我们意识到我们的应用程序或模型在某些方面表现不佳,我们可以识别出不同类型的额外数据,以帮助改进它。如果我们有一个良好的系统来持续改进我们的数据集,我们就可以关闭反馈循环,并构建更有效的应用程序。
精心设计的数据管道是实现数据集持续增长的关键工具。如果您有一个可重复运行新数据的管道,将大大减少添加新记录到数据集中所涉及的摩擦。没有可靠的管道,添加新数据可能会过于风险——无法保证它会与原始数据集一致。
摘要
创建数据集是边缘人工智能项目从一开始就持续进行的过程,并且从未真正结束。在现代的数据中心工作流程中,数据集将随着您应用程序的设计和需求的演变而发展。它会随着项目中每一步的迭代而改变。
我们将在 第九章 中了解数据集在应用程序开发过程中的角色。在 第八章 中,我们将专注于应用程序的设计方式。
¹ 请记住,数据集级别的样本与任意数字信号中的样本不是同一回事。一个数据集级别的样本(也称为记录)可能包含一个由多个样本组成的特征。作为一个多学科领域,边缘人工智能有很多这些令人困惑的术语冲突!
² 根据 Statista 2022 全球消费者调查。
³ 参见 “错误的不均匀分布”。
⁴ 第九章 将更多地讨论构建边缘人工智能产品所需的团队构成。
⁵ Michael Roberts 等人,“使用胸部 X 射线和 CT 扫描检测和预后 COVID-19 的机器学习常见问题和建议”,Nat Mach Intell 3(2021): 199–217,https://doi.org/10.1038/s42256-021-00307-0。
⁶ 这个术语在 “数据如何分割?” 中有解释。
⁷ 此外,您可能会发现自己正在结合两个或更多来源的数据。
⁸ 话虽如此,即使是混乱的公共数据集在评估算法时也可能会有所帮助——它们可以成为有趣角落案例的良好来源。
⁹ 将数据通过携带存储设备从一个地方传输到另一个地方的古老做法。参见这篇Wikipedia 文章。
¹⁰ 在 Sim2Real 项目中,使用合成数据进行训练,并使用真实世界数据进行测试。
¹¹ 在这种情况下,我们的领域可能是字面意义上的,而不是比喻性的!
¹² Z 分数可以在维基百科托管的表格中查找。
¹³ 为了确保样本是真正随机的,使用类似NumPy提供的采样工具是个好主意。
¹⁴ Curtis G. Northcutt 等人的文章,“Pervasive Label Errors in Test Sets Destabilize Machine Learning Benchmarks”,arXiv,2021 年,https://oreil.ly/Zrcu1。
¹⁵ 要了解标签噪声的影响,可以查看 Görkem Algan 和 Ilkay Ulusoy 的文章,“Label Noise Types and Their Effects on Deep Learning”,arXiv,2020 年,https://oreil.ly/1LZKl。
¹⁶ 参见“异常检测”。
¹⁷ 我们还可以使用某些机制,在训练期间给手动标记的项目更多的权重。
¹⁸ 激活来自模型末端的一层,作为嵌入。
¹⁹ 在训练期间,机器学习模型将多次接触整个数据集。预计算和缓存 DSP 结果可以避免重复在相同数据上运行 DSP 算法,从而节省大量不必要的时间。
²⁰ 有些人可能对这些使用略有不同的术语,但其背后的最佳实践是普遍适用的。
²¹ 由于您的测试分割应该是整个数据集的随机样本,所以很难出去收集一个新的。如果您的测试分割是在其余数据之后收集的,可能代表了略有不同的条件,这会影响您评估的能力。
²² 这假定数据可以以某种方式收集,以避免部署设备面临的连接问题。
第八章:设计边缘人工智能应用
应用程序的设计和开发是将边缘人工智能的所有线索编织在一起的地方。这需要理解我们迄今讨论过的一切,包括问题框架、数据集收集、技术选择以及负责任的人工智能。这些还需要在相关领域设计产品所需的技能和知识,并在软件和硬件上实现设计。
在本章中,我们将详细介绍设计边缘人工智能应用程序的过程,并学习一些在真实应用中使用的最重要的设计模式,这些模式可以应用到您自己的工作中。通过本章的学习,您将对边缘人工智能产品设计的要求感到满意,并准备好开始创建您自己的产品。
设计边缘人工智能应用程序有两个主要部分:产品或解决方案本身以及使其工作的技术架构。这两个部分是相互依存的。产品设计将影响所需的技术架构,而技术的限制将影响设计。
此外,整个设计和实施过程都受到产品部署的现实情况的影响。随着数据的收集、尝试不同方法和在实际条件下测试解决方案,您的设计将需要流动地发展。
这种动态系统需要一个迭代的设计过程,其中解决方案是逐步尝试、调整和改进的。规划这一过程的最佳方式包括对你试图解决的问题以及潜在解决方案空间的深入理解。
硬件产品设计和嵌入式软件架构本身就是一个重要的课题。在本书中,我们将专注于与边缘人工智能相关的设计考虑。
产品与体验设计
边缘人工智能产品的目标是解决特定问题。大多数现实世界的问题都有几个组成部分,所有这些部分都必须被考虑在内,才能认为问题已经“解决”:
问题本身
产品如何解决基本问题
人的因素
产品如何满足其用户的期望
更广泛的背景
产品如何符合我们世界的现实情况
为了说明这一点,让我们考虑一个假设的例子。
让我们考虑两种不同的方法来解决跟踪举重锻炼的问题。记住,我们需要解决三个问题:问题本身、人的因素和更广泛的背景。
在我们的第一个解决方案中,运动员佩戴一款配有加速度计的智能手表。每组开始前,他们使用硬件按钮在手表上输入运动类型,并注明所举重量。在进行每组训练时,手表通过 AI 算法来追踪完成的次数,根据加速度计的数据判断何时完成一次重复动作。训练结束后,这些信息会同步到一个移动应用程序供查看。
这是否解决了问题本身?技术上来说,是的——系统允许运动员在没有笔记本的情况下跟踪他们的举重训练。从更广泛的角度来看,这个解决方案似乎也是可以接受的:健身可穿戴设备普及、价格实惠、设计实用,并在社会上被广泛接受。
然而,当考虑到人的因素时,这种设计看起来就没那么吸引人了。我们的设计要求运动员在每组训练之间向他们的智能手表输入一个重量数字。这是否比使用纸质笔记本更优越,令人怀疑。事实上,许多人发现在进行中期训练时与智能设备界面进行交互是很令人沮丧的。
让我们考虑另一个解决方案。能够理解运动员正在进行的动作以及他们所使用的重量,而无需手动输入数据,这将是非常好的。为了实现这一点,我们可以使用一台小型的电池供电摄像头,可以放置在运动员前面的地板上。它将使用计算机视觉技术来计算使用的重量并确定正在进行的动作。
从问题的根本来看,这听起来很棒——它会消除活动跟踪需要使用笔记本的必要性。从人类的角度来看,这是体验的真正改进:运动员可以专注于他们的锻炼,而不必在流程中与智能设备或笔记本交互。
不幸的是,从更广泛的背景来看,这个解决方案可能并不是一个好的选择。许多人在公共健身房进行锻炼,那里有隐私的期望。其他健身房用户不太可能在他们的锻炼期间被智能摄像头“拍摄”而感到舒适。虽然边缘 AI 摄像头可以通过不存储任何视频镜头轻松保护隐私,但向其他健身房用户解释这一点可能会很困难。在被认为是可接受的社会背景下,对于部署一个有效的设计可能会带来困难。
正如我们所见,你的设计必须考虑问题的每个方面是至关重要的。边缘 AI 可以克服许多挑战,但在许多情况下,可用性问题或更广泛的人类背景可能会抵消其好处。
设计原则
设计的一个良好方法是通过一套原则来提供对我们的批判性思维结构的支持。Capital One 的机器学习体验设计副总裁 Ovetta Sampson 撰写了一套专门适用于设计中 AI 使用的原则。她自己的话:
在 AI 时代,速度、规模和恐惧可以同时成为我们设计产品的组成部分,我们必须将设计从名词转变为一种非常有意图的动词。我们正在进入一个全新的世界。这个世界要求设计师承担更大的责任,对我们设计的智能产品产生的结果、引发的行为以及对人类的影响负责。
Ovetta Sampson
Sampson 受德国设计师 Dieter Rams 早期一套原则的启发,撰写了她的十大原则,以下包括我们对每一点的解释:
优秀的设计解决复杂问题。
在具有巨大力量但有限资源的时代,我们应专注于解决重要的问题。
优秀的设计促进健康关系。
用户存在于与其他人和其他产品的关系网络中,我们的设计应考虑到这一点。
优秀的设计要求可塑性。
AI 能够提供令人难以置信的定制功能,我们应利用它来构建更可靠地为我们设计的人群工作的更好产品。
优秀的设计使理解公司和服务我产品的公司更容易。
设计应基于对个体用户需求的准确理解,而不是市场部门的需求。
优秀的设计承认偏见。
偏见始终存在,设计师必须有意识地努力减少它,并公开产品的局限性。
优秀的设计防止不诚实。
设计师必须诚实地面对其产品可能带来的负面影响,以避免出现这种情况。
优秀的设计期待意外后果。
AI 系统中的意外后果可能系统地伤害人们,优秀的设计必须承认并绕过这一事实。
优秀的设计促进公平。
AI 可能无意中放大不公平和不正义,但精心设计的 AI 系统可以抵消这种影响。
优秀的设计考虑其对一个联结的生态系统的影响。
AI 部署的人类背景极其复杂多样,优秀的设计必须反映这一点。
优秀的设计有意地将秩序带入混乱中。
AI 产品应使我们的世界更易理解和应对,而不是使其比现在更混乱。
Sampson 的原文提供了对每个原则的更深入解释。
这些原则基于这样一个认知:AI 通过规模获得其力量。以前需要人类监督的功能现在可以完全自动化。相关成本的降低意味着这些功能将变得更加普遍,并且对其影响也将比以往更大。
同时,AI 系统的特性意味着由单一工程团队创建的单一实现可能会被数百万完全不同的人广泛使用。这意味着系统中的任何缺陷也会被放大,影响到我们人口的大部分。
在实际操作中:一个差劲的医生可能会在他们的职业生涯中伤害数千名患者,而一个糟糕的医疗 AI 系统可能会伤害数百万人。扩展有害系统的风险是我们在设计边缘 AI 产品时需要如此小心的原因,也是使得像桑普森的原则如此宝贵的原因。
解决方案的范围
软件或硬件行业的任何人都可以证明,估算实施产品或功能所需工作量是非常具有挑战性的。同样,人工智能(AI)和机器学习(ML)的开发本质上是不可预测的。高质量数据集的需求和算法开发过程的探索性质使得准确预计项目需要的时间非常困难。
算法开发自然会影响硬件和软件需求。例如,机器学习从业者可能会确定,深度学习模型需要达到一定的大小才能产生可接受的结果。模型的大小将限制其可以部署到的设备类型。这意味着可能需要在进行部分算法开发工作后才能开始硬件开发过程。
AI 开发的额外变量意味着对整个开发过程的正确假设更加困难。很容易低估所需工作量,或者在大量时间和金钱投入后,发现原始计划不足以支撑项目进展,从而不得不重新开始。
AI 开发的性质使得“瀑布”开发模型非常危险。假设你的初始假设总是成立是非常危险的。如果在最后一刻发现美丽的硬件无法运行所需的模型,开发成本将会非常高昂。
那么,如何避免这类问题,并更容易地交付能正常工作的产品呢?关键是限制你的范围。虽然 AI 非常令人兴奋,对于新的应用来说天空是极限,但如果你在一开始就避免野心勃勃,避免犯错误会更容易。
自动驾驶汽车的现实是这一原则的绝佳展示。在 2010 年代中期,许多技术专家认为完全自动化的自动驾驶汽车就在眼前。深度学习革命解锁了巨大进展,车辆的能力从最早的原型跃进了一大步。一个自动驾驶的世界似乎近在咫尺。
不幸的是,虽然已经证明可以制造出一个通常能够做正确事情的自动驾驶汽车,但是在与普通公众进行高速交互时,通常并不被认为是可接受的。提高可靠性的最后几个百分点变得越来越难解决。虽然我们很可能会在某个时候看到自动驾驶汽车,但它们还需要几年的时间。
虽然自动驾驶汽车已经停滞不前,但一个相关但更少雄心勃勃的技术集已经变得非常成功,它们现在至少在三分之一的新车辆中存在。高级驾驶辅助系统,或者 ADAS,是一类旨在帮助人类驾驶员在道路上更轻松的技术。它们包括自适应巡航控制、车道居中和碰撞避免等功能。
ADAS 功能,作为边缘人工智能的一个经典应用案例,旨在帮助处理特定的、个别的任务。它们减轻了驾驶员的心理和体力负担,并帮助提高道路安全性。虽然它们的野心不及自动驾驶系统,但它们更有限的范围使它们能够更加成功。
例如,许多现代汽车配备了自适应巡航控制系统,可以在高速公路上接管加速、制动和车道居中。因为系统只需在这种受限环境下工作,所以建造具有 100%可靠性的系统要容易得多。虽然在城市街道上完全不起作用,但这没关系:高速公路驾驶占据了任何长途旅行中最多的时间,所以从驾驶者的角度来看,它几乎和自动驾驶汽车一样好。
通过解决有限的范围,ADAS 系统在今天的车辆中能够获得比自动驾驶系统更多的效用。更重要的是,开发和部署 ADAS 系统的公司能够在真实世界条件下逐步积累他们的专业知识和见解。他们可以在积极参与市场的同时不断改进他们的产品,逐步接近自动驾驶汽车的梦想。
对于任何边缘人工智能产品来说,这种方法是明智的。不要从一开始就追求宏大的理念,而是试图找出小而有用的步骤,这些步骤仍然能够提供真正的价值。确定最小可行产品:一个简单而可实现的好处,确实对用户有帮助。构建一些东西出来,看看它在现实世界中的表现,并从中迭代。
这里有一个具体的例子。想象一下,你正在为一个生产线建立一个质量控制系统。今天,所有的质量检查都是手工完成的。时间和成本的限制使得不可能检查每一个物品,因此只检查随机样本——这意味着一些缺陷可能会通过。
您的长期目标可能是使用边缘 AI 视觉系统自动检查每个项目,确保捕捉所有有缺陷的产品,并节省检查成本。然而,在项目初期可能不清楚是否可以实现这一目标。您的数据集可能没有每种可能缺陷的示例,使得您的系统难以测试。没有办法在不尝试的情况下知道它是否会工作,但失败可能会很昂贵。
让我们退一步,思考问题的范围。虽然捕捉每一个缺陷可能是一个很大的挑战,但能够捕捉一些缺陷仍然会比目前的情况有所改善,因为我们知道一些缺陷会通过检查。
训练模型以至少在某些时候检测一种特定类型的缺陷(而不是所有可能的缺陷)可能相对简单。如果与当前的手工检查过程结合使用,训练用于捕捉一种缺陷类型的模型仍然可以为工厂提供实际好处。它们虽然不能减少检查成本,但仍然能够捕捉更多的缺陷,并提高产品的平均质量。
通过将范围限制在可实现的范围内,您能够在极大降低风险的同时提供即时价值。在此成功的基础上,没有什么能阻止您对解决方案进行迭代,并逐步实现最初设想的宏伟目标。更好的是,您可能会发现,初始系统提供的价值已足够,无需进一步开发。
设定设计目标
在“规划边缘 AI 项目”中,我们了解到需要为我们的应用开发过程设定具体的目标。主要有三种类型的目标:系统目标,反映系统整体性能的目标;技术目标,反映算法元素内部功能的目标;以及您希望系统遵守的价值观。
要有效,目标必须得到利益相关者和领域专家的设计输入(参见“在边缘 AI 团队构建”)。您需要努力确定项目的最小可行性能特征。这些标准将用于评估项目在系统和技术层面的成功。在可能的情况下,它们应该可以使用领域的标准度量指标量化,以便您可以具体衡量您的进展。
设定系统目标的最佳方法是采用评估优先方法。
系统目标
边缘 AI 系统很少作为解决问题的首选和唯一解决方案开发。大多数情况下,已经存在解决方案。当我们开发 AI 应用程序时,重要的是我们花时间将我们的解决方案与现有解决方案进行比较,而不仅仅是与自身比较。如果我们只是把我们的系统与自身比较,我们几乎可以保证在开发过程中会看到改进。但要知道我们确实有比其他解决方案更好的解决方案,我们需要与它们进行比较。
这就是为什么“先评估”方法对开发如此有力。在这种方法中,开发过程的第一步是提出一组足够一般的评估指标,以便评估解决问题的任何潜在解决方案的性能——无论是 AI 还是其他。
例如,想象一下,你正在开发一个边缘 AI 应用程序,帮助零售员工知道何时货架为空,需要补货。一种方法是专注于涉及的技术。作为目标,你可能决定你的系统必须能够以 90%的准确率预测何时需要补货。
这听起来很不错:90%的准确率意味着模型在识别货架为空时正确的次数是 10 次中的 9 次,这似乎是合理的。但这个指标只告诉我们算法的原始性能;它并没有给我们任何关于我们的系统是否真正有帮助的见解。它也无法与当前解决方案进行比较:很可能一个员工已经可以在没有任何 AI 帮助的情况下 100%准确地判断货架是否为空或已满!
与其专注于技术指标,不如退一步看看更大的图景。我们系统的真正目标是使零售员工能够保证商店的货架始终有货,以便顾客有足够的产品可以购买。有了这个目标,我们可以选择一个更有意义的指标。一个更好的指标可能是给定货架被产品供应的时间比例。¹作为目标,我们可以说,平均而言,给定货架应该有 90%的时间是有货的。
我们可以将我们当前的系统——员工的手动工作——与我们的目标进行比较。虽然员工很容易确定某个货架是否为空,但他们大部分时间可能非常忙,没有时间检查商店的每个角落,确保每个货架都有货。这可能导致平均库存率为 70%。
现在,我们知道我们当前解决方案的基准性能(70%),以及我们的目标(90%)。这 20%的差距是我们的 AI 解决方案需要帮助弥补的部分。了解当前解决方案及其需要改进的方面可以指导我们的产品设计和开发过程。例如,由于我们知道问题源于员工忙于检查整个商店,我们可能会将设计重点放在确保他们能够在其他职责中轻松接收到空货架通知上。由于我们有一个方便的成功度量标准,我们可以在一些货架上部署一个初始系统,并轻松理解其有效性。
总是有可能通过指标提供的洞见来重新审视我们的假设,并决定以不同的方式解决问题,也许完全不包括 AI。例如,也许修改人员排班来解决问题最终可能更便宜,而不是在每个商店都实施边缘 AI 系统。尽管这是一个非技术性的解决方案,但它对于以评估优先的开发方法仍然是一个胜利。
记住“你就是你所衡量的东西”是很重要的——这意味着您用来量化目标的指标将对您最终选择的方向产生巨大影响。如果您测量的是错误的事物,您将最终浪费时间、金钱和机会,甚至可能使情况变得更糟。如果您能够识别出需要衡量和改进的正确事物,迭代开发的力量意味着您可以产生非凡的影响。
技术目标
尽管系统性目标对确保您正在构建正确的东西至关重要,但系统的技术方面也需要有其自己的一套目标。例如,了解 AI 算法当前和目标性能将帮助您将开发工作重点放在适当的领域。
例如,想象你正在为智能家居设备开发关键词识别模型。对于关键词识别模型,性能通常以误接受率和误拒绝率的组合来表达:这两个数字共同描述模型犯错的可能性。为了确保产品质量,您可以与利益相关者和交互设计师决定将误接受率控制在低于 5%、误拒绝率控制在低于 1%。这些数字将成为您的目标。
下一个任务是确定测试工作的机制。没有一种坚实的目标,提供任何好处,除非你能够测量你朝着这个目标的进展。通常,测试依赖于测试数据集,但在测试数据集上的表现与实际运行中始终存在差异,通常是在理想条件下收集的。
最可靠的指标来自于部署在生产环境中的系统。在这个阶段,确定哪些指标将在实地中可用非常有价值。由于现实世界的数据往往不带标签,因此要衡量实际性能通常是具有挑战性的。如果您难以确定如何在现场测量应用程序的性能,重新考虑项目可能是值得的:没有指标,您将无法知道它是否有效。
您可能正在利用人工智能改进现有系统,在某些情况下,您可能已经有一些用于衡量当前系统的评估指标。无论哪种情况,使用相同的指标来评估当前系统以及拟议的 AI 替代方案都是个好主意。拥有一个标杆来衡量总是很有帮助的。
鉴于人工智能开发的迭代性质,您还应考虑您可用的时间。您的目标应该是提高系统的性能,直到达到您已确定的最低可行性能水平。如果进展停滞不前,您需要决定是尝试不同的方法,还是完全放弃项目。沿途制定性能里程碑可能是有意义的,这样您可以跟踪项目的进展,并确信项目在推进中。
基于价值观的设计目标
要构建一个负责任的应用程序,您需要创建代表您希望您的解决方案体现的价值观的设计目标。例如,假设您正在构建一个医学诊断系统。医学专家可能会认为,将具有低于某个阈值的诊断准确度的解决方案投放市场是不负责任的。
因此,您应当与利益相关者和领域专家一致确定产品的最低性能要求。您可以利用这一最低性能来制定一组明确的推进或放弃标准,用于控制项目的发布。
对于价值观不总能达成一致,这也是为何与多元化和代表性强的利益相关者合作如此重要的原因。由于不同群体的人往往有不同的价值观,您达成的共识可能只在特定情境下适用,例如大多数利益相关者所属的文化。如果无法就适当的价值观达成一致,这可能表明您的项目存在伦理风险。
在开发工作流程中,测量和记录描述系统性能的指标至关重要。这些数据将帮助您做出推进或放弃的决策。推动项目完成往往面临着重大的组织和人际压力。记录指标并确定质量的明确书面标准,使您能够将决策脱离个人,纳入组织的流程之中。
这些标准应该延伸到现场部署。能够监控性能并在实际环境中如果系统表现不佳可能终止部署是至关重要的。由于现场可用的度量标准通常比开发阶段可用的更有限,监控可能是一个挑战。关于这个话题,第十章中会详细讨论。
长期支持目标
设计过程中另一个关键部分是长期支持计划。大多数 AI 部署在现场部署后需要观察和维护。漂移是不可避免的,随时间推移会导致性能下降。您选择的应用程序和硬件理想情况下应该能够报告一些指标,以帮助您了解漂移发生的速率。
这些见解将帮助您判断何时需要收集更多数据并训练新模型。您的设计目标应包括长期支持产品的目标。关于这个话题,第十章中有更多内容。
架构设计
边缘 AI 系统的架构是其组件部分如何组合以创建有效解决方案的方式。任何给定系统都有许多可能的架构方式。每种架构都有其独特的权衡。系统架构师的任务是分析情况并选择最大化技术优势的架构。
本章的下一节将阐述边缘 AI 应用系统架构的基础知识。软件和硬件架构是一个广泛的话题,因此我们将专注于与边缘 AI 相关的部分。我们将建立一个坚实的基础,并提供一套设计模式,可用于解决许多不同的问题。
硬件、软件和服务
边缘人工智能应用由三个主要组件组成:硬件、软件和服务。
硬件包括边缘设备本身,其处理器、内存和传感器——我们在第三章中已经遇到的大量多样性。它还包括设备的供电方式以及它们与更广泛世界的通信方式。
软件是赋予系统生命的魔力。它始于允许软件与硬件本身(包括传感器、外围设备和网络设备)进行接口的低级驱动程序。它涵盖了所有可能在设备上运行的信号处理和 AI 算法。最重要的是,它包括解释由 AI 算法输出的信号并确定如何对其进行操作的所有应用逻辑。
服务是边缘 AI 系统可以接口的外部系统。它们可能包括通信网络、无线系统、物联网管理平台、Web API 和云应用:任何位于边缘系统外部并通过某种渠道进行通信的东西。这可能是您自己的基础设施,也可能由第三方提供。
有效的边缘 AI 架构涉及将这三个组件以创造性方式结合起来,以在给定情况下提供最佳的权衡平衡。这需要对问题、约束和领域有深入的理解。这就是为什么在设计过程的这个阶段开始之前进行全面探索非常重要的原因。
您对情况的理解将影响您对硬件、软件和服务的使用。例如,连接性较差的环境可能会迫使您专注于高性能硬件,并且无法享受某些服务的好处。紧密约束的旧设施(参见“绿地和旧地项目”)硬件平台可能会鼓励您在软件使用上更具创造性。对复杂软件和大型模型的需求可能会导致云 AI 服务在您特定应用中发挥重要作用。
在边缘 AI 架构中一些重要的概念我们已经遇到,包括异构计算(参见“异构计算”)和多设备架构(参见“多设备架构”)。这些是我们将遇到的一些最常见架构的关键组成部分。
基本应用架构
简单总是一个不错的选择,你应该始终从能够应付的最简单架构开始。图 8-1 显示了典型边缘 AI 应用的结构。
架构的核心是应用循环。这是一系列重复步骤,用于捕捉和处理信号,运行 AI 算法,解释其输出,并使用结果做出决策和触发操作。这是一个循环,因为这些步骤会反复运行,设备会不断地接收传感器数据流。

图 8-1. 边缘 AI 应用架构
应用循环由设备固件或操作系统部分支持。² 这些组件在硬件和软件之间提供了一层抽象。它们通常提供便捷的 API,应用循环可以用来控制硬件。典型任务包括从传感器读取数据,发送和接收通信,以及控制连接的设备(如灯光、扬声器和执行器)。
正如我们在 “异构计算” 中看到的那样,许多设备具有多个处理器。在我们的图表中,硬件 API 块表示允许在所选处理器上执行计算的抽象层。例如,深度学习模型的操作可以在单独的神经网络核心上进行,以提高速度和效率。
注意
在我们继续之前,回顾一下 “边缘 AI 硬件架构” 也可能是有帮助的,以便记住边缘 AI 硬件的结构方式。
基本流程
在最基本的应用中,有一个软件流水线,全部运行在一个设备上,接收传感器数据,进行处理并做出决策。这在 图 8-2 中有所展示。

图 8-2. 基本边缘 AI 应用流程
许多成功的应用程序使用这种流程,这应该是您开发软件架构时的起点。通常,流程中的 AI 算法是一个单独的机器学习模型。例如,智能安全摄像头可能使用这种流程——使用训练用于检测人员的视觉模型——作为触发器发送警报。图 8-3 显示了带有现实世界步骤叠加的相同图表。

图 8-3. 应用于智能摄像头设计的基本流程
集成流程
另一种常见的方法是使用一组算法或模型,如 “组合算法” 中所述。在这种情况下,相同的传感器数据被输入到多个模型中,这些模型生成相同类型的输出,并将它们的结果组合起来。可能看起来像 图 8-4。

图 8-4. 一个集成流程
在一个集成系统中,通常所有算法都产生相同类型的输出。例如,您可以创建三种不同类型的图像分类器的集成系统,每种分类器都经过训练以预测图像中是否存在人物。通过组合三种不同类型算法的输出,您可以平均每种算法的优缺点,希望得到比任何单个算法都更少偏见的输出。
并行流程
还可以组合执行不同功能的算法。例如,您可以将分类模型与异常检测模型结合起来。异常检测模型的输出被应用程序用于理解输入数据何时超出分布范围,因此分类器不能信任。

图 8-5. 并行流程
在并行流程中(参见图 8-5),模型的输出可以在后处理步骤或业务逻辑中合并。例如,如果一个模型的输出用于调节另一个模型的输出(例如我们的分类和异常检测示例中),这种调节可能在后处理步骤中完成。如果多个模型的输出用于驱动业务逻辑决策,则模型的输出将在那里汇集。
并行模型并不一定意味着并行处理(如多任务处理)。许多嵌入式处理器无法进行多线程计算,因此每添加一个模型到管道中可能会增加应用程序的总体延迟和能耗。
串行流程
在串行运行模型也可以非常有用。如在图 8-6 中所示的流程中,一个算法的输出被馈送到另一个算法,无论是否经过后处理。

图 8-6. 串行流程
当您想要使用一个模型从原始输入中提取特征,然后使用另一个模型理解特征变化时,串行流程非常方便。例如,您可以使用姿势估计模型从照片中识别人的手臂和腿的位置,然后将这些位置传递给分类模型以确定他们正在做哪种瑜伽姿势。
级联流程
另一种巧妙地使用算法的方法是在级联内部使用。级联流程如图 8-7 所示。

图 8-7. 级联流程
级联流程旨在最小化推断运行的延迟和能耗成本。例如,想象一个电池供电设备中的始终开启的关键词检测系统。用于关键词检测的模型可能相对较大和复杂,这意味着始终运行它会迅速耗尽电池。
相反,我们可以运行一个更小、更简单的模型,仅用于检测语音。这是我们级联的第一层。检测到语音后,输入会传递到级联的第二层,即完整的关键词检测模型。由于完整的关键词检测模型运行较少,能量得以节省。
级联可以具有任意数量的层。根据应用程序的不同,级联中的每一层可能还具有其独立的信号处理算法。在某些情况下,达到级联的某个阶段甚至可能触发从另一个源获取数据,例如提供更好信号但使用更多能量的高质量麦克风。
通常情况下,调整级联中较早的模型以获得高召回率是有意义的(见“精确度和召回率”),这意味着在决定某物是否潜在匹配时会保守一些。这种配置仍将节约能源,相比于单一大模型,但会降低早期模型的准确性风险,从而避免丢弃有效输入。
传感器融合流
到目前为止,我们见过的所有架构都是处理单一输入的。在传感器融合流程中,正如在图 8-8 中所示的那样,来自多个传感器的输入被馈送到同一个 AI 算法中。

图 8-8. 传感器融合流
如果使用不同类型的传感器,则每种传感器通常需要其自己的信号处理形式,以创建 AI 算法使用的特征。尽管如此,也有纯信号处理的传感器融合方法。
传感器融合的一个经典示例是在睡眠监测可穿戴设备中,通过心率、体温和运动传感器的信号融合,以精确预测用户的睡眠阶段。传感器融合还可以与本章中见过的任何其他流程结合使用。
复杂应用架构和设计模式
基本应用架构可以与硬件架构的变化结合,以产生提供有价值好处的更复杂系统。这些经过验证的设计模式可以应用于许多不同的项目。
异构级联
在异构硬件架构中(参见“异构计算”),单个设备内可用多个处理器或协处理器。例如,单个设备可以同时具备节能的中端 MCU 和更强大但功耗更高的高端 MCU。
这种类型的硬件可以与级联流程中编写的软件结合使用(见图 8-9),以实现异构级联。级联的前几层在低端处理器上运行,从而增强节能效果。后续层涉及更复杂的算法,因此在高端处理器上运行。在任何给定时刻,只有一个处理器处于开启状态并消耗大量能量。
不同类型的硬件越来越多地包括为高效运行深度学习模型而设计的加速器。这些硬件可以非常适合运行级联的各个阶段。这种方法在许多关键词识别应用中被使用。

图 8-9. 异构级联
多设备级联
如图 8-10 所示,级联可以跨越多个设备。例如,智能传感器可能会使用简单的机器学习模型检查数据。如果检测到特定状态,它可能会唤醒一个更强大的网关设备,该设备可以更彻底地分析数据。

图 8-10. 多设备级联
第二阶段设备可以使用第一阶段传输的数据,也可以使用自己的传感器捕获新数据。这些设备可能在物理上是不同的,如智能传感器和网关设备。它们也可以作为同一物理产品内的独立 PCB 组合在一起。
在某些情况下,完全分开的产品可以组成级联。例如,廉价的现成摄像陷阱(使用红外传感器检测到运动后拍摄照片)可以作为级联的第一阶段,随后唤醒与相同存储设备连接的强大 SoC,根据其内容选择保留或删除照片。
云端级联
在带宽不是问题的地方,级联可以跨越设备和云端。这是智能音箱中的典型模式,配备了数字助理,使用始终开启的关键词检测模型尽可能低延迟地在设备上检测关键词。一旦检测到关键词,它们将后续音频直接流向云端,在那里,一个庞大而复杂的模型(过大以至于无法部署到边缘设备)转录和解释用户的语音。
在图 8-11 中展示了一个复杂的四阶级级联,利用了多个设备上的模型以及云计算。听起来可能有些复杂,但这与现代手机使用的流程相似。
前三个阶段发生在设备上,跨越两个不同的处理器:低功耗始终开启处理器和深度学习加速器。当低功耗处理器上的模型检测到语音时,会唤醒更强大的处理器,用于寻找关键词。如果检测到关键词,设备上的转录模型会尝试将后续音频转换为文本。一旦转录完成,文本被发送到云端,在那里使用大型自然语言处理模型确定其含义并作出响应。
这里的重要折衷在于能量、带宽和隐私,以及云系统的长期维护需求。作为交换,我们可以使用在设备上无法放置的或出于安全考虑不想本地部署的过大模型。重要的是确保这些回报是值得的,因为作为交换,我们正在放弃大部分边缘 AI 的优势。

图 8-11. 用于关键词检测的云端级联
智能网关
有时,AI 逻辑可能位于边缘附近,但不是在网络的实际叶节点上。例如,物联网传感器网络可以收集有关工厂运行的许多不同类型的数据。没有一个单独的传感器可以访问所有数据,但它们都将其发送回网关设备。
通过在网关设备上运行边缘 AI 算法,可以一起分析所有数据,这可能会更深入地了解整个系统的操作。通过在网关进行处理,传感器可以保持小巧、廉价和高效。它们只需捕获和转发数据;网关可以处理智能功能。
人在回路
在某些情况下,允许 AI 算法无约束地做出决策可能并不一定安全。这通常是指糟糕决策风险极其严重的情况。以下是一些鲜明的例子:
-
医疗应用,一个错误的诊断或糟糕的操作程序可能会危及生命
-
有潜力造成伤害的大型机械,如自动驾驶汽车或工厂设备
-
安全和国防应用,可能导致故意伤害的地方
也有许多更微妙的例子。例如,如果 AI 用于执行体育规则——也许分析视频镜头以检测犯规行为——模型中的偏差可能导致对参与者的不公平对待。
这些挑战意味着通常需要设计一个需要人类监督操作的系统。这可以通过不同的方式实现。在一种人在回路架构模型中,人直接参与每一个决策。例如,医疗诊断设备可能会指示患者患有某种疾病,但仍需要医生解释信息并根据自己的判断作出最终决定。
在另一种模型中,人类作为被动观察者,除非他们认为有必要干预。例如,虽然自动驾驶汽车可以自由移动,但驾驶员仍需注意路况,并准备随时接管驾驶。在这种情况下,自动驾驶汽车通常使用 AI 系统来检测驾驶员未注意的情况,以防止其忽视责任。值得注意的是,围绕这种模型是否有效存在重大争议。如果不需要互动,人类往往会失去注意力,这可能会损害他们干预的能力。
在第三种模型中,没有直接的人类监督,但算法决策的样本会发送给人类审计员进行检查。整个过程会被监控以确保可靠性,但在特定活动期间无人能够实时干预。这种方法在应用的长期监控中至关重要,并且将在第十章进一步讨论。
使用设计模式进行工作
现在我们已经遇到了各种设计模式,它们应该为你的项目提供一些很好的起点。当然,现实情况并不总是能完美地映射到教科书模式上。不要害怕调整这些想法,以适应你个人情况的需求。
正如我们所学到的,边缘人工智能工作流本质上是迭代的。使用设计模式时采用迭代方法是有帮助的。以下是你可以遵循的逐步工作流程:
-
确保你花了一些时间探索你的数据集,并理解你可能需要使用的算法类型。
-
从你能使用的最简单的设计模式开始:通常会是图 8-2,特别是在处理单一设备时。
-
尝试将你的问题映射到这个模式上;撰写一些文件来描述它,包括图表,并列出其优缺点。
-
在开发过程中开始迭代,牢记选择的设计模式。
-
如果看起来可能需要更复杂的东西,请跳到你能接受的下一个最简单的模式。
-
继续迭代和调整,直到找到一个可行的方案。
不要被诱导去选择一个比你所需更复杂的设计模式。额外的复杂性会拖慢你的开发过程,并创建额外的约束,迫使你朝某个特定路径前进。所有这些都会带来风险,而在人工智能项目中成功的最重要方法是将风险降到最低。
设计选择的会计处理
我们针对特定问题提出的设计受我们个人看法的影响,这意味着它们可能会微妙地编码我们自己(或我们团队的)偏见。此外,架构本身具有固有的偏见。架构代表了一系列妥协,这些妥协指导了解决方案的结果朝某个方向发展。这并不一定是故意的;当我们从众多选项中选择一个特定的选项时,这就会发生。
有三种主要类别的偏见,它们源于设计过程(而非数据集):
产品偏见
产品代表对问题的特定解决方案。根据其性质,它代表了对问题解决方式的看法。它体现了随着这种看法而来的限制和权衡。所有这些都是不可避免的,但重要的是我们承认这导致了偏见。
例如,想象我们正在构建一个智能家居恒温器,它可以根据用户活动预测调整温度的最佳时机。我们可能需要在一个基本架构和一个智能网关架构之间做选择:基本架构包含一个装有高分辨率传感器和强大处理器的单一设备,或者智能网关架构,其中每个房间安装了廉价的低分辨率远程传感器,并通过无线与执行处理的中央枢纽通信。
这些权衡指导我们的产品朝着首选解决方案发展。具有有限视野但传感器优越的系统,很可能在开放式房屋或小公寓中效果更好。具有远程传感器的系统可能在有多个不同房间的房屋中效果更好。
由于每个产品设计都是为特定目的创建的,因此选择最适合解决您正在解决的问题的设计非常重要。如果您正在设计智能家居产品,您可能需要进行一些研究,了解您的目标客户所住房屋的风格。这可以指导您的设计过程,并帮助您选择合适的架构。
算法偏见
算法本身具有固有偏见。与架构一样,每个 AI 算法的设计体现了对广泛问题的特定解决方案。数学家和计算机科学家努力寻找通用工作的算法,适用于许多不同类型的输入,但实际上每种算法都有适合某些问题而不适合其他问题的基本假设。
例如,我们可能正在尝试设计一种农业产品,该产品使用目标检测来计算农场中的动物数量。有许多不同风格的目标检测算法可供选择。其中一种风格是单次检测器(SSD),³ 它使用深度学习模型来预测感兴趣物品周围的精确边界框。另一种风格是更快对象,更多对象(FOMO),⁴ 它使用更简单、更快速的方法来识别对象的中心,但不会绘制边界框。
可以使用任何算法构建有效的产品。尽管如此,不同的算法会做出不同的选择,这些选择将在产品的性能中显而易见。例如,由于它们的损失函数构造方式,SSD 模型更擅长识别较大的物体而不是较小的物体。在生产中,这可能导致产品在放置在较小的田地中效果更好,因为动物更接近并占据更多的图像框架。相比之下,当对象的中心不太靠近时,FOMO 效果最好。这意味着当动物更分散时,它可能效果最好。
与产品偏见一样,选择算法时考虑最终部署的情况非常重要。如果产品将用于大田间的羊群计数,FOMO 可能是正确的选择。如果产品将用于牛舍内的牛计数,SSD 可能是更好的选择。无论哪种情况,您都应确保产品在上市前经过充分测试。
在这里,你的数据集也会影响你的决策。正如我们所见,确保你的数据集代表真实世界条件非常重要。如果你的数据集充分代表了产品在实际使用中可能遇到的情况,“现场”,你将不会被算法偏差所惊讶。如果你的数据集不具有代表性,偏差将是无法检测的,并且你可能发现你的系统表现不佳。
缓解算法偏差的一个有趣方式是使用集成方法,如“组合算法”中所述。使用多种算法的集成将平滑极端情况,使你接近理想的方法。集成方法通常在机器学习竞赛中获胜,目标是在未知数据集上获得高性能。尽管如此,这并不意味着集成方法免于偏差。而且,因为它们涉及运行多个算法,这在边缘设备上可能成本过高。
部署偏差
当一个系统被部署在其设计目的之外时,就会出现这种类型的偏差。一个为解决特定问题而创建的产品在不同上下文中没有被设计的保证。不管开发人员如何努力减少偏差;当应用于与其设计用途不同的情境时,一切打破先前的假设。
例如,考虑一个设计用于监测患者生物信号并预测特定健康状况可能发生的医疗设备。该设备经过精心设计,其固有的权衡与其设计用于预测的健康状况非常匹配。它使用的算法是基于高质量、代表性数据集从具有相同病症的患者中收集而选定的。
该设备在设计用于的病患上可能表现良好。但是,如果医生试图使用它来预测一个呈现类似但细微差异的相关病症呢?
由于产品是围绕原始病症设计的,没有办法在没有大量新数据的广泛测试下知道它在新病症上的工作情况。即使看似对某些患者有效,可能会有其他患者出现悄无声息的失败,危及其生命。医生的偏见,即假设条件足够相似以使产品继续工作,反映在结果中:患者的健康可能会受到威胁。
为了最小化部署偏差,重要的是你的产品使用者理解其设计限制,并且负责任地避免误用。在生死攸关的情况下,例如医疗设备,其中一些可能甚至会被立法规定:设备可能会因具备特定条件而获得法律批准使用,并且没有其他条件,只能由持牌医疗专业人员使用。
公开关于产品运行的信息有巨大的好处。例如,您可以选择分享有关用于创建产品的数据集的关键事实,或者关于您的产品在各种情景下表现的统计数据。这样,用户就可以了解产品的确切性质和局限性,从而更不容易在错误的环境中错误地部署它。
有些产品如此容易被不适当地部署,以至于最好留在草图阶段。例如,2022 年俄罗斯入侵乌克兰导致一些评论员呼吁更多开发自主武器系统⁵。然而,无论是政府还是恐怖组织,不可避免的滥用潜力,无论是在战场上还是在战场外,已经促使许多 AI 从业者承诺不参与致命 AI 的工作。您可以在 stopkillerrobots.org 上自己做出这个承诺。
设计成果
将设计过程看作是产生的工件,这是非常有帮助的。以下三个侧栏阐述了与设计过程的初步探索相关的最常见的注释和文档。
我们开始的过程是理解问题并提出一些潜在解决方案。
我们的下一步是确定可行的解决方案类型。
一旦我们有了我们认为可行的解决方案,我们可以开始创建设计。
摘要
由于设计和开发过程在项目进行中是迭代的,所以这些文件都应被视为活动文档——您可以在进展过程中创建新的更新版本。
一旦您有了所有这些材料的早期版本,您可以进行审查,并确保产品看起来仍然可行,并在可接受的风险门槛内。如果情况看起来不错,那么现在是进行积极开发的时候了。
¹ 一个更高级的度量标准可能涉及商店收入,假设更高的收入更好——但这个指标受到更多因素的影响,因此是衡量我们系统有效性的一种更嘈杂的方式。
² 系统使用固件还是操作系统取决于硬件和应用程序,如 “边缘 AI 处理器” 中讨论的那样。
³ 请参见 Wei Lu 等人的 “SSD: 单次多框检测器”,arXiv, 2016 年。
⁴ 请参见 Louis Moreau 和 Mat Kelcey 的 “宣布 FOMO(更快的对象,更多的对象)”,Edge Impulse 博客,2022 年 3 月 28 日。
⁵ 如 Melissa Heikkilä在 “为什么军事 AI 初创公司的业务正在蓬勃发展” 中所述,MIT Technology Review, 2022 年 7 月 7 日。
第九章:开发边缘 AI 应用
开发边缘 AI 应用是一项重大任务。在本章中,我们将熟悉这个迭代开发模型,该模型有助于在真实项目中成功部署边缘 AI。
边缘 AI 开发的迭代工作流程
开发成功应用的过程基本上是简单的:从小处开始,进行增量变更,测量您的进展,并在达到目标时停止。当您引入组成边缘 AI 技术的大量移动部件时,复杂性就会出现。本书的本节旨在提供一个具体的过程,您可以通过该过程最大化成功的机会。
正如我们在“边缘 AI 工作流”中听到的,该工作流背后的核心理念是反馈环的力量。我们的目标是在过程的各个阶段之间创建反馈循环,从而不断改进对问题、解决方案以及最佳匹配方法的理解(如图 9-1 所示)。
尽管这是一个迭代过程,但其中某些部分比其他部分更具迭代性。我们最早处理的步骤——探索、目标设定和引导启动——是我们在进行前期规划时要弄清楚我们想要做什么以及如何可能去做的部分。它们首先在前期规划中出现,然后在定期重新评估中出现,随着新信息的到来:也许是在初始部署之后,或者是当大量新数据显现出来时。

图 9-1. 反馈环是边缘 AI 工作流的核心,最初在“边缘 AI 工作流”中介绍。
工作流程的中间部分,在测试和迭代部分,更加彻底地进行迭代。它们是开发、测试和改进的紧密螺旋的一部分,旨在朝着您设定的任何目标逐步靠近。您可以将它们看作是四个相互影响、朝向满足您需求的并行开发轨道。
部署和支持部分也是迭代的,但与核心部分相比速度较慢。这是它们自身的特性:一旦部署并交付给用户使用,系统的开发注定会放缓。然而,这是最关键的反馈开始到来的阶段,也是你的系统必须开始适应不断变化的现实世界环境的阶段。你越早部署并获取到这些洞察力,效果就会越好。
本章的下一节将详细讲解工作流中的每个主题,并概述一些关键活动和概念。
探索
探索是我们开始理解我们试图做什么的方式。它包括我们在第六章中学到的许多工作类型,并包括以下主要任务:
-
描述你试图解决的问题(参见“描述问题”)
-
确定是否需要边缘 AI(参见“我需要部署到边缘吗?”和“我需要机器学习吗?”)
-
弄清项目是否可行(参见“确定可行性”)
-
通过将问题映射到已知方法来定义问题(参见“定义问题”)
-
分析你提出的解决方案可能存在的风险、危害和意外后果(参见“道德可行性”)
-
绘制利益相关者并了解他们的需求和期望(参见“利益相关者”)
-
进行初步数据探索
最后一步在很大程度上取决于你是否有能力此时收集数据集,即使是一个小型和有限的数据集。强烈建议在尝试确定可行性时手头有一些数据:数据在 AI 项目中代表了很大的风险,尽早开始理解它非常关键。
至少应该了解到收集足够数据的难度有多大。这可能是你面临的主要挑战之一,在发现无法获取数据之前进行大量工作是灾难性的。
如果目前无法开始数据探索,应尽早进行。
目标设定
目标设定是我们试图描述我们的目标所在的地方。在第 6 和第八章中我们看到了各种目标设定活动。
这一过程包括以下关键组成部分:
-
确定在部署前后将使用的评估指标(参见“设定设计目标”)
-
为你的设计设定系统性目标(参见“系统性目标”)
-
为你的实施设定技术目标(参见“技术目标”)
-
与利益相关者达成价值共识(参见“利益相关者”)
-
创建基于价值观的框架来解释进展(参见“基于价值观的设计目标”)
-
设置评估项目的审查委员会(参见“多样性”)
-
设计测试算法和应用程序的方案
-
规划长期支持目标
-
决定如何决定是否中止项目
目标必须是可衡量的才有意义,因此其中许多项目依赖于具有有效测试和评估系统的过程。这将在第十章中深入讨论。
停止项目
边缘人工智能(Edge AI)是一项风险较高的业务,很大一部分项目无法投入生产。这是很自然的,因为开发过程的重要部分是要了解是否真的可以利用现有资源来解决问题。
然而,当我们对一个项目投入了个人、财务和组织资源时,很难判断何时退出。这就是为什么在项目开始时就确立您的最低可行性能特征至关重要的原因。您需要为每种类型的目标(系统性的、技术性的和伦理性的)确定这些最低标准。例如,如果您的系统一旦部署就没有您期望的业务影响,那么拥有高性能算法(按照技术指标)也是无济于事的。
失败是发现和创新迭代过程中的关键部分,特别是涉及人工智能时。重要的是,在投入过多资源之前,识别出开发方向不起作用的时机:尽早失败,快速失败。如果您能早期识别出一个无效的努力,您可以迅速改变目标,避免花费过多时间。
因此,为您的项目设定里程碑和“继续/中止”标准至关重要。在设计和开发的每个阶段,您都应该准备好衡量当前状态,并决定当前方法是否有效,或者是时候尝试其他方法。在早期设定目标阶段写下这些里程碑是个好主意,因为这将迫使您从早期就对项目进行批判性思考。随着进展,您可以随时重新评估您的目标。
有些问题是棘手的,特别是在数据不足时。在这些情况下,您可能不得不做出终止项目的艰难决定。为了避免被这种情况出其不意地打击,您应该在开始之前就了解时间和金钱预算,并制定达到一定进展所愿意投入的限制。如果您看起来还不够接近,您可以做出停止的决定。与其花费整个预算最后一无所获,还不如在半途中停止一个无果的项目并重新规划。
启动引导
启动引导(Bootstrapping)是我们从理解问题到第一次迭代解决方案的过程。它涉及到与数据亲密接触并开始构建的过程,这些主题我们在第七章和您正在阅读的本章中都有涉及。关键任务包括:
-
收集最小数据集(见“估计数据需求”)
-
初步尝试确定硬件要求(见“设备能力与解决方案选择”)
-
开发最简单可能的初始算法
-
构建最简单可能的端到端应用程序(见图 8-1)
-
进行一些初步的实地测试和评估(见第十章)
-
对早期原型进行负责任的人工智能审查
我们之前遇到过一些这些概念,但这是我们第一次将整个工作应用程序的所有组件集成在一起。
为何引导启动有益
引导启动的目标是快速获得至少有些类似原型的东西,即使它非常有限、不完整并且做出了一些错误的假设。但是,如果可以单独开发组件并在最后将它们集成在一起,为什么要浪费时间在低质量的原型上呢?
纸上谈兵和体验一个实际的技术产品之间存在巨大差异,尤其是当技术设计用于与物理世界互动时。通过迅速实现一个端到端的原型,你将为自己、团队和利益相关者提供机会,让他们尝试并理解它如何解决你试图解决的问题,并在很早之前识别出许多潜在问题。
迭代开发的核心是测试你的假设:迅速确定某个决策是否正确,以便有时间进行调整。你可以(并且必须)在系统的各个组件上进行这样的操作,但对于像边缘人工智能产品这样复杂的东西,你确实需要看到所有部分一起运作。在任何复杂系统中都存在新兴现象和反馈循环,只有在看到它与现实世界互动之后,你才能真正理解它的工作方式。
早期测试的巨大好处不言而喻,能够在产品尚未完全准备好之前进行全面演示也具有巨大的说服力,无论是对利益相关者、潜在客户还是你自己的团队。这可能是解锁完成项目所需的支持和资源的关键。另一方面,如果你发现早期演示并没有说服任何人,这是一个很好的信号,表明你可能需要重新审视设计。
你并不总能在早期阶段创建完整的端到端流程。没关系:你仍然可以从集成系统的任何组件中获益。不过,如果一个项目本质上在最后阶段才能整合,那么它带来的风险程度就要高得多。
开发基准算法
在“系统目标”中,我们了解到需要采用评估为先的方法,不断测量我们系统的性能,并与基线进行比较。在许多情况下,有一个现有的非人工智能系统,我们可以测量和比较其性能。无论哪种方式,一旦我们开始开发我们的算法,我们应该立即建立算法性能的基线,以便努力超越它。
要帮助说明这一概念,让我们想象我们正在建立一个系统,以减少生产线上巧克力质量检查所需的时间。我们的宏伟想法是,我们可以训练一个深度学习视觉模型,识别个别巧克力中的特定缺陷,并实时向生产线上的工人提供反馈。
首先要做的是建立我们当前的性能基线。也许质量控制目前是由员工手动完成的,每盒巧克力需要 30 秒。与相关利益相关者一起,我们可能决定我们的目标是将时间缩短到最多 10 秒。
我们的第一个算法——以及支持它的硬件和软件——应该尽可能简单地朝着这个目标前进。例如,与其训练一个复杂的深度学习模型(这将需要收集大量数据集,耗费时间和金钱)来识别许多不同类型的故障,也许我们可以使用一些更简单的计算机视觉技术(如在“图像特征检测”中)来识别单一类型的故障的特征。
这种更简单的算法将更容易作为基本原型实现。然后,我们可以在生产线上尝试它。例如,我们可以设置系统,在质量控制工作的员工发现一个巧克力盒有非常具体的缺陷时发出警报。虽然信息有限,但这些额外的信息可能仍然会让员工的生活更轻松,并节省几秒钟的时间。
现在我们已经使用简单实现的算法基线,我们知道我们必须超越它。在某些情况下,简单的基线可能证明足够有效,这可能会改变我们对必要性的看法。例如,如果节省了足够的时间,放弃收集训练深度学习模型所需的大数据集的开支可能是合理的:我们的利益相关者可能对简单基线的性能非常满意,或者至少是其更精细化的版本。
建立一个简单基线算法的方法有助于防止我们过度设计,即投入大量资源开发复杂解决方案来解决尚未被证明为必要的问题。它还为我们的基于评估的方法提供了坚实的起点,迫使我们建立进行现实评估所需的流程,并允许我们测量相对于现有系统的改进速度。
一个基线还可以帮助确定所需的架构。例如,如果基线能处理大部分输入,最佳整体解决方案可能是一个简单的算法来覆盖大多数输入,再结合一个能够处理更具挑战性输入的复杂 ML 模型级联。
我们的第一台硬件
能够评估我们基线算法通常意味着我们已经得到了硬件设计的初始迭代。此时的目标应该是创建一个可部署的东西,这样我们就可以在实地测试它。然而,这并不意味着它必须满足与我们最终产品相同的要求。
计算机硬件的种类可以从通用型到特定应用型。在一个极端,现代个人电脑设计成能够运行几乎任何软件,并且可以与你能想象到的任何硬件集成。在另一个极端,一个基于定制微控制器的板子可能被设计成用于特定产品内的单一功能。
越是通用和功能强大的硬件,开发起来就越容易。这个原则意味着在更强大的系统上(如运行 Linux 的 SoC 开发板(见“片上系统”))原型化通常比在你的团队自行设计的小型、低功耗、特定应用的设备上要快得多。
有了这个想法,通常最好在更通用、功能更强大的硬件上实现产品的第一次迭代,即使这可能会牺牲一些设计目标。例如,可以很容易地在一个 Linux SoC 板上使用一些快速而简陋的 Python 脚本实现我们的巧克力质量控制系统的第一次迭代。
该板子可能比我们长期解决方案中负担得起的要昂贵和耗电,但对于初始原型来说,仍能完成任务——并且开发时间只需一小部分。一旦在更通用的硬件上验证了概念,你将有足够的信心投资于设计一个更小、更高效设备以及调整算法以适应。
负责任的 AI 审查
部署和测试我们应用程序的第一个端到端原型,使我们能够开始衡量性能,并更好地想象最终版本在实地的工作方式。这还需要我们进行一些初步的算法开发,通常涉及进一步理解我们的数据集及其限制。
所有这些新发现的额外信息可以帮助我们测试我们在确定道德可行性(如在“道德可行性”中)和陈述基于价值的设计目标(见“基于价值的设计目标”)时所做的一些假设。你应该采取系统化的方法来利用初步测试结果来探索所有这些假设。
例如,在我们为巧克力工厂的质量控制系统设计的情况下,我们可能假设我们的系统能够通过允许员工在相同的时间内完成更多工作来减轻员工的负担。然而,通过探索原型系统的反馈,我们可能会发现系统通过提供信息而不是创建压倒性体验增加了员工的压力,导致了疲劳。这一发现可能会影响我们产品的设计:我们可能决定探索在不造成员工过度负担的情况下如何为他们提供信息的方法。
采用评估优先方法,我们能够收集关于系统性能的关键指标,并根据我们的目标和价值观进行分析。例如,从公平性的角度来看,我们的系统能够对所有员工都运行良好非常重要。通过评估指标,我们可能会发现系统对某些员工的表现优于其他员工(例如,可能提供对某些人难以看清的视觉反馈)。为了捕捉这种洞察力,从一开始就测量和收集相关数据非常重要。
测试与迭代
现在我们处于工作流程的核心部分,我们的初步实施通过多次迭代逐步改进。有四个主要的关注领域:应用程序、数据集、算法和硬件。这些在 图 9-2 中显示。

图 9-2. 工作流程中测试与迭代部分包括四个关注领域:应用程序、数据集、算法和硬件
这些事物各自都是项目的重要组成部分。你可以把它们想象成四个并行发展的兄弟姐妹,相互影响,在环境的反馈中不断地变化。这个环境就是我们工作中有意创建的评估驱动反馈循环。
这四个组成部分共同推进,各自以自己的速度前进,有时受到实际情况的限制,有时受到彼此的影响。例如,数据集收集可能是一个费时的过程,也许需要一段时间才能使数据集足够大,以便训练机器学习模型达到可接受的性能水平。在等待期间,对物理硬件和应用程序代码的工作可能会继续不停。
项目的各个组成部分并没有任何特定的顺序或层次,开发也不是一个轮流进行工作的过程,其中对一个组件进行工作,然后对下一个组件进行工作。相反,开发是并行进行的,通常由不同的工程师或整个团队在每个线程上工作。团队必须定期同步,分享他们当前的进展,并预测是否有任何即将出现的需要解决的障碍。
成功开发的关键在于在每个项目线程和阶段(开发、部署和支持)之间建立反馈循环。
反馈循环
在图 9-3 中可视化的 AI 开发经典视图展示了一个简单的逐步反馈循环,从数据收集开始,以部署到设备结束。这是一个诱人的想法,因为它提供了一个易于理解的信息流通过系统的视图。

图 9-3. 诱人的是将 AI 开发的反馈循环视为一个逐步过程,这是将线性工作流程变为迭代的结果。
然而,正如我们在“边缘 AI 工作流”中所学到的,事实上系统的每个组件之间存在着相互作用。它们之间的动态关系不容易用基本图表来表达。图 9-4 展示了更加真实的系统表达。

图 9-4. 实际上,AI 开发涉及一个相互反馈的组件网络。
在管理项目时,关键在于确保反馈在整个过程中自由流动,从任意一点到另一点。例如,数据集可能有一些方面(例如原始数据中特定频段的能量),这些方面会影响硬件设计(因为硬件必须能够以足够高的速率进行采样以表示该频率)。反之亦然:如果硬件受限于包括某些传感器,则数据集必须反映这些传感器能够捕捉到的内容。
一些反馈循环比其他的更容易建立。例如,数据集与硬件之间的反馈循环可以通过负责的团队定期交流来创建。另一方面,根据应用程序的不同,将设备部署到现场并进行监控可能非常昂贵。因此,存在各种工具以模拟或近似地“闭合循环”,正如我们将在“性能校准”中讨论的那样。
以下是开发过程中一些最重要的反馈循环:
算法和数据集
算法对数据的要求各不相同。如果有大量数据可用,可以使用多种不同的算法。如果数据较少,则较少的算法能够很好地工作。如果希望使用特定属性的某种算法,则必须收集适当的数据集。
算法和硬件设计
在一个全新项目中,所选算法可能会决定硬件的选择,因为某些硬件可能需要高效运行算法。在既有项目中,现有硬件的约束将限制算法的选择。
算法和现场性能
所选算法将会影响现场的性能——例如,一个更大的机器学习模型可能会提供更好的结果。反过来,现场所需的性能水平可能会推动算法的选择。
数据集和硬件设计
硬件设计通常会影响数据集,因为它可能决定哪些传感器可用于收集数据。或者,如果已有特定数据集,则其所代表的数据类型或来源可能会影响硬件设计。例如,确保使用完全相同型号的传感器可能会很有帮助。
数据集和现场性能
如果现实世界中的表现不佳,可能需要收集更多数据,根据系统存在不足的领域进行引导。如果只有有限的数据可用,可能会迫使您接受比其他情况下更低的现实世界性能。
相反,如果现场性能受限或存在偏差,这将影响您随时间收集的数据和训练的模型。例如,如果大多数使用您产品的人属于某一特定群体,您可能会开始过度拟合其需求的性能。
实践中的迭代
迭代的基本思想是您改变某些东西,衡量其对您的目标的影响,然后决定下一步该做什么。在 AI 开发中,这种技术的经典示例是训练机器学习模型时的典型迭代过程。
-
获得一些数据并将其分割为训练、验证和测试数据集。
-
在训练数据集上训练一个大型模型,目标是过度拟合数据。²
-
在验证数据集上测量性能。
-
调整设置以提高验证性能:添加更多数据、添加正则化或调整模型的类型和大小。
-
再次训练并测量性能。
-
一旦模型在验证数据集上表现足够好,就可以在测试数据集上尝试它。
-
如果工作良好,那很好。如果表现不佳,请将其丢弃并从头开始。
边缘 AI 项目的流程类似,但还包括拼图的硬件和应用部分。例如,您可能会利用类似上述流程的有效算法,然后尝试将其部署到您选择的硬件上,并以实际的方式(例如潜在用户)进行测试。如果有效,很好。如果不起作用,则必须进行更改。
关键在于确保您进行快速测试和迭代。如果您在每次迭代中花费很长时间,那么进行回归(改进变差或某些内容不符合,就像一个太大而不适合可用硬件的模型一样)的惩罚将更大,因为您可能已经浪费了很多时间走向一个无效的路线。
如果您进行快速迭代,每次变更都很小并且立即进行测试,您将永远不会浪费太多时间陷入开发的兔子洞,最终发现与系统其他部分不兼容。
当您有足够大的数据集时,训练一个模型可能需要很长时间(数小时、数天,甚至数周——尽管边缘 AI 的小型模型通常不会花费那么长时间)。当您在一个 48 小时的训练过程结束时,却意识到在您的代码中犯了一个错误,导致生成的模型无用,这真是一场噩梦。
为了缩短每次迭代所需的时间,最好从数据集的子集开始整个过程。例如,您可以从一个 10%分层样本开始(参见图 7-14)。一旦您开始看到这个子集有希望的结果,您可以逐步在将来的迭代中添加更多数据以提高模型的性能。
小贴士
工具可以帮助您完全避免其中的一些问题。例如,专为边缘 AI 设计的自动 ML 工具(参见“自动化机器学习(AutoML)”)可以考虑到硬件约束,以便您永远不会超出规格的风险。
请记住,您不仅会迭代您的模型:您会改变和改进设计的每个部分,从硬件到应用代码。为了了解您的性能如何改变,您需要使用正确的度量标准和评估程序——稍后在“评估边缘 AI 系统”中进行介绍。
在设计过程中设定的目标(参见“技术目标”)将帮助您理解何时停止迭代,无论是因为您不再接近目标,还是因为您已经超越了它。
迭代工作流自然而然地会生成大量的产物:数据集、模型、训练脚本以及它们所带来的所有依赖项。跟踪这些内容非常重要,否则将难以理解您的结果并在未来重现您的工作。正如我们在“机器学习运营(MLOps)”中学到的,MLOps 提供了一个可靠的框架来做这件事。
更新您的计划
在项目进行过程中,您对所要解决的问题及应用的方法的理解可能会发生显著变化。有时候会明显感觉到一个目标是不现实的、误导的或者与解决核心问题无关。如果情况是这样的话,毋需犹豫,将您的利益相关者聚集在一起,重新评估您的目标。
话虽如此,不应期望目标经常变动。相反,如果需要进行调整,您的项目的要求和规格可以根据现有的目标进行调整。
例如,想象一下,您正在设计一款智能门锁,该门锁使用图像传感器和面部识别来控制进入建筑物。项目的目标是实现接近于0%的误接受率。在开发过程中,您意识到仅仅使用视觉技术是无法达到这一目标的。您与利益相关者合作,更新项目范围,允许增加额外的传感器以提高系统的可靠性。
您应该将这种发现视为迭代开发过程的自然组成部分。如果您意识到应该稍作调整,不要惊慌——这个过程的目的是让您能够进行调整,从而最终获得成功的产品。
当然,在设计过程中,如果您能够识别出一些可能的风险因素,并制定好应急计划,那就太好了。例如,您可能在设计阶段预测到,仅仅依靠视觉技术可能不足以确保低误接受率,因此提出了一些潜在的替代方案。
警告
确保所有目标和方向的变更都得到所有利益相关者的同意,并向参与项目的所有人清晰地传达,并仔细记录以供将来参考。期望差异可能导致重大的问题,但这是很容易避免的。
道德人工智能审查
正如我们所见,项目在迭代开发过程中可能会发生严重的方向变化。这意味着您的迭代过程需要定期对您的工作进行道德审查。您应该调查的事项包括:
-
项目是否按照设计过程中设定的关键性能指标进展顺利(见“基于价值的设计目标”)?如果没有,可能需要采取新的方法。
-
您的道德可行性研究(见“道德可行性”)是否仍然相关,或者您的项目已经发生了变化,需要更新?
-
您是否还拥有足够的数据集和领域专业知识来开始这个项目(见“数据、伦理和负责任的人工智能”)?
-
您的利益相关者是否同意您正在取得进展,或者是否存在任何顾虑?
在这个阶段进行某种形式的第三方伦理审查是一个很好的主意,除了你自己团队进行的伦理分析。在迭代开发期间发现潜在的伦理问题要好得多,因为在这时候仍然可以改变方向,而不是在开发结束或产品已经发货后。
部署
迭代开发、部署和支持之间没有明确的界限。相反,项目逐渐向满足其目标发展,直到在某个特定的时刻——希望是在过程的早期——项目的软件部分部署到硬件上,并且硬件放置在现场。这个渐进的过程显示在图 9-5 中(如图 6-1 和 9-2 所示)。

图 9-5。工作流程中的测试和迭代部分逐渐从纯开发发展为开发、部署和支持的混合;反馈循环始终保持
在边缘 AI 的背景下,部署可以意味着两种情况之一:
-
将软件部署到硬件设备上
-
把一组硬件设备部署到现实世界中
在任何情况下,早期和频繁地部署是正确的做法。在第一种情况下,它确保您始终在构建良好协同工作的硬件和软件。在第二种情况下,它确保您将项目开发过程与实际性能之间建立反馈循环。部署绝不能被视为“最后一英里”操作,仅在发布前发生。相反,它是您开发过程的关键部分。
边缘系统的分布式特性非常适合这种方法。通常可以一次性地逐步推出几台设备,仔细控制它们部署的确切位置以及谁将与它们交互。这意味着您可以运送运行原型应用程序的原型设备,并获得实际性能数据,同时将相关风险降到最低。
接近部署的最佳方式是制定一个经过深思熟虑的部署计划。涉及的步骤在“部署边缘 AI 应用”中有详细记录。
支持
边缘 AI 项目永远不会真正“完成”。相反,它逐渐进入生命周期的另一个阶段,重点是监控和维护其性能。
这项工作是由于我们在“漂移和变化”中学到的漂移所必需的。因为世界不断变化,几乎不可避免地会导致基于 AI 的产品随时间失效。这使得持续维护是必要的:更新软件以使其与环境中正在发生的变化保持同步。
对边缘 AI 应用的支持在第十章中有详细介绍。支持与评估密切相关,因为评估指标是帮助您了解性能或环境变化的关键。
概要
现在我们对整个开发工作流程有了高层次的视图。虽然这是一个很好的总体路线图,但具体的旅程细节将因项目而异。
然而,每个项目共享的一个需求是仔细的部署、评估和支持。这些是我们将在下一章中讨论的主题。
¹ 一本评价极高的涵盖该主题的书是《用 Python 从零开始的数据科学原理》(链接,作者 Joel Grus,O’Reilly 出版,2019 年)。
² 通过旨在过拟合数据,我们可以证明模型具有足够的代表性来对数据进行建模,并且我们的训练流程实际上是有效的。
第十章:评估、部署和支持边缘 AI 应用
这是本书的最后一个理论章节,我们将涵盖评估、部署和支持边缘 AI 应用的过程。这三件事密切相关,并且在迭代项目中它们在整个开发工作流程中同时进行。
评估边缘 AI 系统
评估是成功项目的关键。事实上,没有评估,您无法真正知道您的项目是否成功。虽然它恰好在本书的末尾出现,但它是开发过程中始终存在的事物。甚至可能在开发之前就开始,当您量化希望通过边缘 AI 改进的现有流程的性能时。
请记住,在整个过程中,评估需要与利益相关者和最终用户的参与进行。不同的利益相关者可能具有冲突的评估标准,这取决于他们的个人视角。解决这些冲突的方法是评估的重要部分。
以下是需要进行评估的一些阶段:
检查现有解决方案
大多数时候,我们正在开发边缘 AI 系统来取代我们认为可以更好的传统系统。这使得在流程开始阶段了解现有系统的实际表现非常重要。我们的开发过程的目标将是超越它,而我们无法超越我们没有测量过的东西。
即使没有现有解决方案,构思一个简单的基准也是一个好主意,我们可以力求超越它(正如我们在“开发基准算法”中所见)。这为我们的工作带来了方向和视角,有时,简单的基准最终成为最佳选择。
探索潜在算法
在项目探索阶段,评估是至关重要的,当我们开始了解数据集并尝试不同类型的算法时。这是我们开始专注于看起来有前途的方法的方式。在此阶段,快速方便的评估有助于我们快速进展。
在迭代开发期间
迭代开发过程由评估驱动:我们创建一个解决方案,评估它,并使用评估结果进行调整,以便我们的下一个迭代更好。有许多不同的评估系统正在开发中,我们将在“评估系统的方法”中了解其中一些。
优化前后
当我们部署到边缘设备时,通常需要应用丢失优化技术,以使算法适应我们的内存或延迟约束(见“压缩与优化”)。在优化之前和之后评估性能非常重要,以确定发生了多少损失。即使您认为应用的优化技术不会丢失数据,也应该进行评估——以防优化过程中出现错误导致某种程度的降级。
在真实硬件上
有许多原因会导致您的应用在部署到真实硬件后表现不同。例如,生产硬件的传感器与最初收集数据集时的传感器可能有所不同。或者,在构建用于真实硬件的程序时,与在开发机器上运行时可能有所不同。在部署之前和之后进行评估非常重要,这样您就可以了解是否有任何影响。
在有限的部署期间
通过分阶段部署您的系统总是一个好主意,这样您可以逐步推出系统,以便在扩展之前发现任何问题。这是另一个评估的关键时刻,因为您需要一种方法来衡量系统是否如预期运行。
持续的部署后期
在部署后应持续监控性能,这自然需要进行评估。有关此阶段的更多详细信息,请参阅“部署后监控”。
评估与负责任的设计
道德 AI 严重依赖于评估。例如,要检测偏见,理解系统在不同类型输入上的表现至关重要。通过在每个阶段进行评估,可以使您的团队了解到道德关注点可能出现的地方。
评估系统的方法
评估边缘 AI 系统有许多方法,在开发过程的不同阶段,不同的机制都会显得重要。它们都需要不同的时间和投入,这可能适用于短期、紧密的反馈循环,也可能适用于更长、更广泛的循环。
以下是一些关键方法。
评估各个单独的组件
系统由许多较小的组件组成,评估每个组件的方式各不相同。例如,您的算法流水线可能包括以下内容:
-
窗口化
-
降采样
-
数字信号处理
-
机器学习
-
后处理
-
基于规则的算法
每个这些运动部件都会有自己的评估工具,相关领域的专家会了解如何使用它们。在构建一系列共同工作以提供结果的步骤流水线时,这种评估至关重要。如果你设置了评估系统中各个组件的机制,你将更容易找出任何系统问题的原因。这也将帮助你单独迭代特定组件,因为它们可能由不同的团队拥有。
评估集成系统
光知道系统的各个部分能够共同工作还不够,你还需要了解它们作为一个整体是否能够正确运行。否则,新出现的系统性问题可能会影响你的应用表现良好。
例如,你可能有一个机器学习模型和后处理算法,当单独测试时似乎运行良好。然而,当它们链接在一起时,你可能会发现它们表现不佳。
真正理解系统性能需要结合组件级测试和系统性测试。测试集成系统将告诉你系统是否表现不佳,但单独测试是不会提供太多解释的。
模拟真实世界的测试
在许多情况下,用于训练的数据集并不真实:它们可能代表一组理想的条件,可能是在实验室中收集的,或者经过精心清理,以呈现最佳的训练数据集。在这样的数据集上进行评估可能会导致误导性的结果。要真正了解性能,有必要在真实世界中测试这些东西。
如果我们能够在点击按钮的同时将所有工作都投入生产中进行测试,那将是很好的。但嵌入式开发的现实情况使这一点不可能。与网络软件工程相比,推送嵌入式应用程序上线需要更多的时间、金钱和风险。这意味着在这方面,嵌入式开发在开发和真实世界性能之间的反馈循环效果不佳。
解决这个问题的一个方法是在开发过程中尽可能地模拟真实世界的条件,以便能够在接近实时的环境中测试算法或应用的变更。这可能涉及收集反映你预期见到的真实世界条件类型的数据集,然后通过完全集成的应用程序构建来运行它。
例如,想象你正在开发一款健身追踪可穿戴设备。可以使用从真实用户身上捕获的数据流进行测试,这些用户戴着只含有传感器的虚拟设备。数据需要由专家进行标记,以便用于评估。
如果真实世界数据难以获取,也可以使用合成数据。可以通过将传统训练数据集的样本层叠在背景噪声样本上,并应用增强来增加数据的差异性,来构建逼真的数据流。这是 Edge Impulse 性能校准功能的一个选项,详见“性能校准”。
在 Amazon 的Alexa 认证过程中,模拟真实世界测试的一个显著例子是硬件产品集成 Alexa 必须符合其关键词识别系统性能的最低标准。性能评估是通过播放来自距离设备一定距离的扬声器的音频剪辑来进行的,且在不同条件下进行。设备必须成功识别包含关键词的剪辑并在不包含关键词时避免激活才能通过。
真实世界测试
尽早在真实世界中开始测试系统是最佳选择:尽早拥有硬件时,如果可能的话,甚至在此之前。¹ 真实世界测试主要有两种类型:
-
质量保证测试,您故意让产品进行测试以试图识别任何问题
-
用户可用性测试,允许用户自然地与产品进行交互,以了解其工作效果如何
真实世界测试比某些评估类型更慢更昂贵,但对产品开发至关重要。这也比将产品推向市场然后意识到其无法工作要便宜得多。
质量保证测试
质量保证(QA)是一种系统性的方法,用于探索产品并理解其是否达到适当的质量水平——通常基于产品的设计目标(参见“设置设计目标”)。在开发过程中,QA 工程师设计并实施策略,以行使产品的功能,并试图理解其效果和整体适用性。
QA 是一个拥有自己领域专家的重要领域,对于构建良好产品的过程至关重要。这是一个超出本书范围探讨的大领域,但以下是 QA 专业人员在边缘 AI 项目中的一些重要作用方式:
-
获取原型并尝试发现问题
-
在开发过程中测试单独的组件(例如,关键词识别算法)
-
设计系统和流程,用于在整个工作流程中测试产品
-
认证产品是否达到其设计目标
一旦确定设计目标,QA 过程就会开始,因为负责 QA 角色的人需要为其设计测试系统。理想情况下,QA 将在开发过程中作为评估每个迭代工作的一部分的程序的一部分进行。
用户可用性测试
虽然质量保证(QA)测试专注于有意识地尝试寻找问题,但可用性测试则是观察产品的自然使用,并利用观察结果指导改进。
可用性测试与真实用户一起进行。他们可以是公众成员、潜在客户,或者是您团队或组织内部的人员。关键是他们以一种真实的方式与您的产品互动。
一些可用性测试是在研究中进行的,这些研究会引入人员到一个受控环境,并鼓励他们以特定方式与产品进行交互。其他类型的测试则更自然:例如,测试版测试涉及向用户提供产品的早期版本,让他们可以带走使用一段时间,并提供反馈意见。
最佳计划会因情况而异,但通常可用性研究会在开发过程的早期进行,需要集中的输入以帮助引导项目,而测试则会在稍后进行,当产品接近完成并需要更一般的概述时。
一种有趣的可用性测试类型被称为“dogfooding”(源自“吃自家的狗粮”概念)。这是指组织成员使用他们自己的预发布硬件来理解其可用性并生成反馈。
可用性测试也是一个拥有自己领域专家的领域。这是最昂贵的测试类型,但也是最有价值的:你可以看到你的系统在接近现实情况下的表现。
监控已部署系统
一旦系统部署后,了解其性能至关重要。正如我们将在“部署后监控”中看到的,这可能极具挑战性。
有用的度量指标
任何类型的定量评估都会产生度量指标:代表产品或组件性能某一方面的关键数字。收集正确的度量非常重要:俗话说,“你衡量的就是你的成果”,如果你选择了错误的价值观,你的迭代过程将朝错误的方向发展。
幸运的是,有很多标准的度量指标与边缘 AI 系统相关;它们对于在连接领域工作的人来说可能很熟悉。以下是一些最重要的指标。
算法性能
这些度量在理解 AI 算法性能方面非常有用。它们通常根据算法类型而变化(如“功能算法类型”所述)。
损失
损失是衡量模型预测正确性的一种方式。损失分数越高,预测越不准确。损失指标的确切含义由损失函数决定。不同类型问题有标准的损失函数,或者您可以自行设计。损失在某些机器学习模型(如深度学习)的训练过程中被计算和使用。
可以计算单个预测的损失,但通常会计算整个数据集的平均损失。例如,您可以计算验证数据集上的平均损失。
损失没有单位,因此只能相对于自身而言。这使得它成为衡量模型在训练过程中性能变化的好指标,但如果您试图了解模型在现实世界中的工作原理,则不是特别有帮助的度量标准。
在优化机器学习模型的过程中使用损失函数时,重要的是优化损失的改进对应于其他指标的改进。损失函数应根据您尝试解决的问题选择(大多数常见问题有标准损失函数),您的指标应基于相同的问题选择。如果两者不一致,您将得到一个无法解决正确问题的模型。
准确率
分类是一种常见任务,有几种不同的指标用于表达分类器的性能。准确率是其中最简单且最为人熟知的:它只是在给定数据集上正确分类的百分比。
准确率是一种快速了解模型性能的合理方式,但作为单一数值,它掩盖了很多背景信息。例如,单一准确率数值无法告诉我们数据集中各个类别的表现如何。在平衡数据集上的 90%准确率指标听起来令人印象深刻,但在非平衡数据集上(可能包含 90%的一个类别和 10%的另一个类别)可能意味着模型很差劲。
因此,最好将准确率与捕捉更多细微差别的其他指标结合使用,或者至少为每个类别单独计算准确率。
混淆矩阵
混淆矩阵是理解模型表现的强大工具。它是一个简单的表格,显示了如何分类个体样本的方式。例如,图 10-1 显示了来自 Edge Impulse 的截图。

图 10-1. 显示关键词检测模型结果的混淆矩阵
在图 10-1 中,行标题“NO”、“NOISE”和“YES”代表数据集中三类样本。它们与同名的列标题对应,后者表示分类器识别出的三类。每个单元格中的百分比表示数据集类别(由行标题指示)被分类器识别为特定类别(由列标题指示)的样本比例。
例如,我们可以看到,96.3%的“NO”的实例被正确分类为“NO”,而其中 3.7%被错误分类为“YES”。这种分类结果能帮助我们了解我们的分类器在不同类别间的表现。这比单一的准确度指标更有趣,因为它帮助我们开始了解我们的模型在哪些地方存在问题。
精度和召回率
从混淆矩阵中单个类的角度来看,分类器可能犯的错误有两种不同类型。这两种都是误认身份的情况。
在第一种情况下,一个真正属于该类的成员被误认为属于另一个类。例如,一个用于鸟类识别的智能摄像头可能会误将一只鸟误认为叶子,完全错过了鸟类。
在第二种情况下,一个属于不同类别的成员被误认为属于我们关心的类别。例如,我们可能会将一片叶子误认为鸟类。
精度和召回率提供了描述这些错误发生频率的方法。精度告诉我们,我们的模型多频繁地将一片无趣的叶子误认为可爱的鸟类,而召回率描述了我们的模型多频繁地错过本应该识别的鸟类:
每个数据集类别都有自己的精度和召回率,但它们也可以表示为所有类别的平均值。这是一个很好的指标,因为它能让我们了解模型犯了哪些类型的错误。(参见 2)
精确率和召回率都表示为介于 0 和 1 之间的数字,其中 1 表示完美,0 表示完全错误。它们通常存在权衡:通过增加一个可以减少另一个。这使它们成为调整的重要指标。
正负率
- 召回率的另一个名称是真正率,或者 TPR。它是正确识别正例的速率。还有另外三个缩写,涵盖分类器混淆矩阵中的其他错误可能性。假正率(FPR)表示负例(不属于我们关注类别的项目)被错误地标识为我们关心的事物的频率。
相反,真负率(TNR)描述了正确忽略负例的频率。最后,假负率(FNR)描述了属于我们关心的类别的样本被错误地忽略的频率。³
这些率都是表达系统区分类别能力的不同方式。它们可以进行折衷以确定与 “置信阈值” 中描述的方式相同的性能。
F1 分数和 MCC
有时候,使用单一统计量来描述分类器的性能是很有用的:例如,当比较类似的模型时。这样一个统计量是F1 分数,它是通过精确率和召回率分数的调和平均值得到的单一数字:
尽管方便,F1 分数也有一些局限性。它不包含有关真负例的任何信息——这意味着它不适合用于不平衡的类,因为如果每个类中的项目数量不同,各类之间的 F1 分数将无法比较。
出于这个原因,另一个被称为马修斯相关系数 (MCC)的指标可能是更好的选择。它包含混淆矩阵中的所有方格,因此是模型质量的更好整体指标。
尽管 MCC 更好,但它仍然有其局限性。将整个混淆矩阵转换为单个数字会削弱我们考虑每个单元格的能力。正如我们在“置信阈值”中看到的,每个应用在精确率和召回率之间都有稍微不同的理想平衡。F1 和 MCC 分数使我们无法单独考虑它们——因此,如果我们比较多个模型,我们将无法看到它们之间的某些差异。
ROC 和 AUC
正如我们所学到的,通过改变置信阈值可以改变分类器的性能。可以使用接收者操作特征曲线或ROC 曲线来可视化这种影响,如图 10-2 所示。
由于置信阈值可以用来在真正率(TPR)和假正率(FPR)之间进行权衡,ROC 曲线在任一轴上绘制它们之一。为了计算曲线,需要计算一系列不同置信阈值的 TPR 和 FPR。
该图表非常有用,因为它描述了调整分类器所有选项的情况。我们可以选择曲线上的一个点,该点代表基于我们应用程序需求的权衡。然后,我们将使用相应的置信阈值来控制模型的输出。

图 10-2. 使用 Matplotlib 绘制的 ROC 曲线
我们还可以使用 ROC 曲线来创建一个单一的度量,描述基于模型获得特定答案正确的概率。它通过计算曲线下面积(AUC,在图 10-2 中可见)获得,并且其值从 0 到 1。AUC 为 1 的模型完全正确地预测每个预测结果,而 AUC 为 0.5 的模型有 50/50 的几率预测正确类别。⁴
ROC 是有用的,但它仍然是一个单一统计量,代表一组复杂的行为。因此,如果我们试图了解我们的模型在不同情况下的表现,它仍然没有帮助。在这种情况下,ROC 曲线和混淆矩阵的组合将为我们提供许多有用的见解。
错误度量标准
分类器只是一种模型类型。另一种主要类别,回归模型,有其自己的一组常见度量标准。由于回归模型旨在预测数值,因此理解其性能的最佳方法是使用度量标准,比较其输出值与数据样本标记的值之间的差异。
这里是用于回归模型的一些顶级错误度量标准:
平均绝对误差(MAE)
这个简单的度量标准由误差的平均值组成,其中误差定义为预测值与实际值之间的差异。其计算方法如下:
例如,假设我们已经训练了一个回归模型,用于预测从照片中的苹果的重量。假设苹果的重量以克为单位。在测试模型后,我们计算出一个 MAE 为 10。这意味着平均而言,预测的重量与实际重量相差 10 克。
这种简单性使得 MAE 非常有用。但是,还有一些替代方法可以帮助揭示不同类型的误差。
均方误差(MSE)
均方误差(MSE)与 MAE 非常相似——只是在求和之前将误差平方化:
由于我们对误差进行了平方处理,MSE 将始终为正值或零——而大误差将会对其值产生更大影响。这是有帮助的,因为大误差通常比小误差更糟糕,但可能会因 MAE 的简单计算而被欺骗性地抹平。
根均方误差(RMSE)
MSE 的缺点在于,由于它基于平方值,因此比 MAE 更难以解释,后者是以原始单位提供的。通过计算 MSE 的平方根,即 RMSE,我们可以用与标签相同的术语表达它:
RMSE 具有与 MSE 相同的好处,但更容易解释。不足之处在于,它稍微更复杂一些。
与分类度量标准一样,将模型的性能表达为单一值可能存在风险。您的数据集可能包含不同子群体,它们的性能不同。我们将在“评估技术”中讨论处理此问题的一些策略。
均值平均精度
均值平均精度,或 mAP,是用于表达目标检测模型性能的一个相当复杂的度量标准。目标检测模型试图在图像中绘制围绕任何对象的边界框;mAP 考虑了预测边界框与实际边界框的重叠程度——无论是在给定图像内还是跨数据集。它将这一情况与置信区间之类的东西结合起来,以得出一个分数。⁵
mAP 的主要缺点是,虽然它基于框的区域,但它不考虑框的数量。 这意味着即使模型预测了多个框,而实际上只需要一个框,它也可以在 mAP 上得分良好。 尽管如此,它已经成为评估对象检测模型的标准方法。
提示
sklearn.metrics 库包含大多数上述指标的实现,以及更多。 探索与指标相关的文献,以确定用于您任务的理想指标是值得的。
计算性能和硬件性能
边缘人工智能几乎总是涉及管理算法性能和计算性能之间的平衡。 虽然算法性能指标告诉我们算法执行工作的效果如何,但计算和硬件性能指标告诉我们算法运行的速度以及在过程中消耗了哪些资源。
在这些指标的指导下,我们可以在算法复杂性和计算资源之间进行明智的权衡。 例如,给定硬件上特定应用程序所需的延迟可能会影响可以使用的深度学习模型的大小。
以下指标帮助我们了解计算任务的规模以及它对我们硬件的负担。
记忆
内存使用包括 RAM 和 ROM,它们具有相当不同的属性。 ROM 是长期存储算法的地方,包括任何机器学习模型的参数。 RAM 是程序在运行时的工作内存。 任何边缘设备的 RAM 和 ROM(或磁盘空间)都有硬性限制,因此重要的是确保您的算法适合所提供的资源。
算法无法孤立运行; 它必须存在于某种程序中。 程序的其余部分也占用内存 - 因此在考虑 RAM 和 ROM 使用时,您也需要考虑应用程序的其余部分。 在大多数情况下,您最终将得到一个需要您的算法遵循的 RAM 和 ROM 预算,以使其适合应用程序的其余部分。
例如,假设您正在将边缘人工智能添加到一个旧系统中。 您可以分析现有应用程序使用的内存,并决定剩余多少用于新算法。 类似地,在新系统中,您将不得不决定您的 ROM 和 RAM 中有多少预算用于算法与应用程序其他部分。
测量应用程序的 RAM 和 ROM 使用情况并不简单。 在理论上,ROM 看起来相对容易:理论上,嵌入式工程师可以编译一个包含您的算法的简单程序,然后查看输出以确定其大小。 但实际上,您的应用程序所需的依赖项与您的算法所需的依赖项可能会有重叠。 这意味着您的算法在固件的 ROM 使用上可能比看起来少得多。
这意味着估计算法 ROM 使用的最可靠方法是构建完整的应用程序,分别带有和不带有它们。差异告诉你使用了多少 ROM。
深度学习模型往往很大,因此你可能需要缩小模型的大小以适应 ROM 预算。在花费大量时间优化应用程序的其余部分之前,尝试量化你的模型总是一个好主意——由此导致的精度降低通常非常小。
测量 RAM 使用情况要更具挑战性。首先,通常你需要运行算法来确定它。其次,如果你的程序使用的 RAM 过多,可能实际上无法运行。第三,在运行设备上确定 RAM 使用情况将需要某种测试程序或调试器。
测量特定算法 RAM 使用的一个好方法是使用测试程序。该程序首先应该用特定的标记值填充整个内存。然后你可以运行你的算法。运行后,你应该迭代设备的内存并检查其中多少仍然填充有标记值。这个“高水位线”将为你提供内存使用的估计——尽管它不会告诉你最坏情况下的内存使用情况,这可能更高。⁶
你可以潜在地使用这种技术与模拟器估计 RAM 使用,而无需部署到实际设备上。这在开发过程中很方便,并且是某些端到端平台(如 Edge Impulse)中使用的方法。
在带操作系统的设备上,测量 RAM 和 ROM 的使用情况要容易得多,因为你可以直接查询操作系统获取指标。
浮点运算(FLOPs)
浮点运算是涉及两个浮点数的单个计算,而 FLOPS——或每秒浮点运算次数——被用作计算能力的度量。
总的 FLOPs 数量有时用来描述计算一个深度学习模型推断所需的工作量。对于服务器端模型来说,这是有道理的,因为计算通常在浮点算术中进行。
鉴于模型的 FLOPs 和处理器的 FLOPS(并忽略令人困惑的缩写),理论上应该能够估计模型的延迟。然而,许多边缘模型是量化的,因此使用整数运算,使得原始模型的 FLOPs 变得不那么相关。此外,嵌入式处理器的制造商通常不报告 FLOPS(或 IOPS,整数等效)。最后,计算模型的 FLOPs 并不总是直截了当的。
总体而言,所有这些使得 FLOPs 在确定边缘 AI 性能方面的用途有限。尽管如此,在遇到时还是值得一提。
延迟
在边缘 AI 的背景下,延迟是运行算法所有部分的总时间。例如,捕获音频窗口、降低采样率、运行 DSP 算法、将结果输入深度学习模型、执行模型并处理输出可能需要 100 毫秒。延迟通常以毫秒或每秒帧数来指定,后者主要用于视觉应用。
延迟取决于所使用的算法、可用的优化以及硬件本身。更快的硬件和更好的优化(例如,描述在“数学和 DSP 库”中的库中提供的优化)会导致较低的延迟——一般来说,机器学习模型越小、越简单,延迟越低。
一些应用程序需要低延迟。例如,如果一个应用程序需要实时响应用户输入,则需要以低延迟运行。在其他情况下,延迟并不那么重要:也许应用程序的响应可以是异步的,不必快速发生。
在某些情况下,低延迟意味着更好的算法性能。例如,一个关键词检测模型每秒运行多次比每秒运行一次更有机会检测到关键词。
测量延迟通常需要访问设备,除非有周期精确的模拟可用(参见“仿真器和模拟器”)。然而,有一些方法可以通过在硬件上对类似工作负载进行基准测试来估算深度学习模型的性能。⁷
占空比
嵌入式应用通常需要限制能源使用,以保护电池寿命。它们通过在接收新数据时定期执行计算,然后在等待下一批数据到达时进入低功耗睡眠模式来实现这一点。
处理器的唤醒/睡眠模式称为其占空比。例如,处理器可能每 200 毫秒唤醒一次以读取某些传感器数据,花费 10 毫秒这样做。然后它可能花费 50 毫秒使用边缘 AI 算法处理数据,然后回到睡眠状态。
在这种情况下,处理器每 200 毫秒唤醒 60 毫秒。在每秒钟中,它将花费 350 毫秒唤醒和处理数据。这将给它一个以百分比表示的占空比,为 35%。
占空比对于确定嵌入式系统的功耗非常重要,因为它决定了处理器消耗的能量。
能源
电池寿命是嵌入式应用中的一个常见问题,因此确定设备的能耗非常重要。它以电流来衡量,通常用毫安(缩写为 mA,也称为毫安)来表示。
嵌入式系统中的每个组件的电流消耗各不相同,这取决于其使用方式。例如,处理器根据当前启用的功能使用的电流多少不等,而传感器在进行测量时可能会消耗更多电流。
因此,在典型使用情况下测量能耗是非常重要的。可能需要长时间监控设备以确定其实际能耗,这可以通过特殊工具如电流监控器或数据记录器来完成。
电池容量以毫安时(mAh)来衡量,表示电池可以支持 1 毫安电流的时间。例如,一块 2,000mAh 的电池可以为 100mA 的设备供电 20 小时。
对于处理器来说,能耗与工作周期紧密相关,后者是延迟的函数。这意味着低延迟算法可以节省能量,因此在设计算法和应用程序时考虑能量使用是非常重要的。
热量
电子元件会产生热量作为废热,这在某些应用中很重要:处理器在计算过程中可能会变热,如果热量无处释放,可能会出现问题。此外,一些元件有最低操作温度要求。
热能以摄氏度来衡量。大多数元件的数据表将提供其操作范围。一些处理器,主要是 SOC,具有内置温度传感器,并且如果它们开始变热可以自动调节性能。MCU 通常没有这种功能,因此如果要监测它们的温度,则需要自行安装传感器。
处理器的工作周期越低,产生的废热能量就越少。这意味着延迟是限制热量排放的工具。
评估技术
评估使用了一套技术工具,其中一些我们之前见过,另一些是新的。以下是最重要的项目:
训练、验证和测试数据集分割
正如我们在“数据分割”中学到的,将数据集划分成部分来证明模型在以前未见数据上的表现是至关重要的。大部分评估工作应在验证数据集上完成。
为了保持其价值,只有当你认为已经完成时才应使用你的测试数据集。如果在测试你的测试数据集时发现模型不起作用,你将不得不放弃并从头开始:否则,你会因为调整模型直到在测试数据集上表现良好而在真实数据上表现不佳而面临过拟合的风险。
当然,你可以在开发过程的任何时候捕获更多数据。在可能的情况下,应尽量不断增加整个数据集的样本,以提高训练和评估模型的能力。
交叉验证
将数据拆分用于评估的一个缺点是,模型的表现只能与其训练数据集中的数据一样好。我们之前在“交叉验证”中遇到的交叉验证试图解决这个问题,允许从业者在同一数据集上训练多个模型并比较它们的性能。
要开始,将训练数据集分成训练部分和验证部分。使用训练部分训练模型,然后在验证部分上进行测试。记录度量标准,然后重新组合数据并随机拆分。在新的训练拆分上训练第二个模型,然后在新的验证拆分上评估。这个过程可以任意次数重复——可能是数十次。
该过程的结果是一系列模型,每个模型都在数据的不同子集上进行了训练和验证。可以分析这些模型的度量标准,以了解模型质量是否严重依赖于数据的组成。希望每个模型的表现相似。如果是这样,可以选择表现最佳的模型,并在最终测试中针对测试数据集进行审查。
最常见的交叉验证类型被称为 k 折交叉验证。有关该过程的信息可以在scikit-learn 文档中找到。
分析子组
我们在“算法性能”中学到的度量标准可以针对整个数据集、一个拆分或任意数据子组进行计算。这是一个非常强大的工具,特别适用于理解算法公平性。
想象一下,您正在构建一个计算机视觉应用程序来识别不同类型的车辆:汽车、卡车和 SUV。您可以为每个类别计算算法性能度量,这些度量将告诉您该算法在识别每种类型车辆时的表现如何。
不过,通过一些额外信息,您可以超越这一点。例如,如果您的数据集包含每张照片中车辆制造商的元数据,您可以计算每个子组的度量标准。然后,您可以进行分析,确保您的模型对每个子组的表现都同样出色:例如,您可能会发现您的模型在特定品牌的汽车上表现不佳,此时您可以尝试收集更多该品牌的照片以扩充训练数据集。
模型本身并不关心车辆的制造商,只关心高级类型(汽车、卡车或 SUV)。尽管如此,您仍然可以使用关于制造商的信息来更好地评估您的系统。您可以想象,当使用几乎任何数据集进行机器学习公平性研究时,这种类型的技术是多么有用。
度量和分布
数据集中的子群体通常分布不均匀。 例如,假设您正在训练一个分类器以区分类别 A、B 和 C。 您的数据集可能有 60%的样本属于类 A,20%属于类 B,20%属于类 C。
您用于评估的指标应对所有这些类别中的问题都敏感。 例如,准确性指标可能在所有类别中都为 60%。 但是,这个单一数字不能告诉您模型是否正确地获取了所有 A 类,而未获取 B 或 C 类的任何一个。
理解您的指标是否合适的一种方法是通过“评估”一个返回故意糟糕结果且符合数据底层分布的虚假模型。 例如,您可以创建一个随机分类器,将随机的 60%的示例分类为 A,20%为 B,20%为 C。 通过评估这个随机分类器的输出,您可以了解您选择的指标如何传达模型性能的不足。
使用多种指标
对于一个项目,可以测量许多不同的指标。 例如,您可以确定在测试数据集上的准确性、计算延迟和内存使用的数字。 构建有效解决方案通常意味着在多个指标之间取得平衡。 例如,我们可以选择使用一个更简单的模型来减少延迟,但这可能会导致准确性下降。
这些个别指标可能都很重要,但并不总是同等重要。 例如,对于需要高速运行的项目,您可能会将延迟放在准确性之上。 在具有多个子集的数据集中,您可能更关心一个子集的性能而不是另一个。
不同指标的总体权重——您对它们的个别关注程度——是您需要与利益相关者一起确定的事情。
合成测试数据
数据通常难以获得,特别是如果您希望在罕见和不寻常的输入上测试系统。 例如,异常检测系统可能被设计用于捕获实际世界中从未记录过的灾难性故障。
避免这个问题的一种方法是生成合成数据。 合成数据是任何一种人工创建的数据。 这可能意味着取一个真实数据集并扭曲其样本以创建新的数据,或者可能意味着使用某种算法过程生成全新的输入。 例如,我们可以生成一组旨在模拟灾难性故障的输入,以测试我们的异常检测系统。
合成数据可能是一个有用的概念。 它潜在地使您能够获得大量可用于测试或甚至训练模型的标记数据。 但是,并非所有数据都可以伪造,完全依赖合成数据是有风险的,特别是对于评估。
评估与负责任人工智能
适当的评估是我们负责任地开发 AI 应用的核心工具之一。如果您能够对应用进行良好评估,就能了解它们在现场和数据集中不同子群体中的表现可能如何。评估得越好,将来在生产中遇到问题的风险就越小。
负责任的设计涉及评估问题解决方案在其环境背景中的匹配性。任何评估的效果取决于您对问题及其操作环境的理解。这就是为什么在评估过程中引入领域专家和利益相关者如此重要的原因。
评估也是迭代开发工作流程的核心。这几乎可以保证,如果您的评估工作不好,您将得不到一个好的产品。您应确保充分重视评估,值得让您的利益相关者、领域专家和咨询委员会多加关注,以确保捕捉尽可能多的细节。
您可能已经注意到,许多评估技术完全依赖于您的数据集。这使得构建您的数据集对于道德 AI 开发至关重要(参见“数据、伦理与负责任 AI”)。在现场进行评估是缓慢且成本高昂的,因此数据集是一种至关重要的工具。
尽管如此,在真实环境中、与真实用户交互时,评估的需求是不可避免的。仅仅通过测试数据来量化算法性能是不够的。关键是要理解整个系统在实际情况下以及与将要使用它的人群之间的工作方式。您需要尽早将这些内容融入工作流程中。
我们已经涵盖了评估模型前部署的部分内容。接下来我们将在“后部署监控”中探讨后部署评估的工具。
部署边缘 AI 应用
正如我们在“部署”中提到的,部署最好被视为项目结束时的一个持续过程,而不是单一事件。然而,每次将您的系统的新迭代与现实世界接触时,都存在潜在的重大风险——以及宝贵的新学习。重要的是建立一个能够考虑到这一点的流程。
例如,想象一下您正在部署一款新版本的羊活动分类模型。它可能会产生错误的预测,如果不能迅速识别出来,可能会对农业操作造成负面影响。但这也可能揭示出可以应用到下一轮设计中的新见解——前提是能够捕捉到这些见解。
为确保部署顺利进行、最小化风险并最大化利益,您应该开发并记录一个有意识的过程,以便每次都能遵循。这些任务的所有权很重要;它们应该由您团队的成员跟踪,通常是负责产品开发和运营的人员。
接下来,我们将查看一些您可能包括的关键任务。
部署前任务
在部署之前应考虑执行的任务。这些任务应由技术专家的指导、利益相关者的见解以及领域专家的专业知识指导:
确定目标
每次部署都应有清晰的书面目标。例如,您可能会部署更多设备以扩展系统,或者将最新版本的软件部署到已经部署在现场的硬件集。
为了更好地管理风险并提高您测量性能的能力,您应该尽量限制每次部署的目标数量。像任何实验一样,您调整的输入变量越多,就越难理解导致输出变化的原因。
识别关键指标
要理解部署的影响,您需要跟踪描述系统操作的指标。这些指标应包括性能指标(如果可用),以及能够突出任何变化的一般数字—例如输入和输出的分布。
您将使用这些指标来理解您部署的任何变化,并确定您的目标是否已经达到。
性能分析
在部署软件或硬件的新迭代之前,您需要充分了解其可能的性能表现,并且这种性能是否对运行在生产环境中的系统可接受。在实验室中有各种方法来估算性能(其中一种方法在“性能校准”中讨论)—在部署到实地之前,您应该尽可能利用这些方法。
如果一个迭代在实验室中表现不佳,那么在实地环境中也不太可能表现良好。此外,在真实世界的背景下,由于标记数据稀缺,测量性能可能会更加困难,因此您应该充分利用每一种预部署测试机制。
记录可能的风险
每次您将新迭代推向生产环境,都存在一定的风险。在部署之前,重要的是尝试识别可能的风险,了解它们的影响,并考虑如何减轻或恢复这些风险。
如果情况变得糟糕,您可能需要暂停部署或关闭项目以避免造成损害。基于风险,您应该制定一套终止标准(参见“终止标准”),这将帮助您确定何时作出决策。
确定恢复计划
如果由于部署而发生了不良后果,您需要制定一个恢复计划。这可能意味着回滚到系统的早期版本,或者修复由您正在交互的过程中造成的一些损害。
提前准备将使您能够更冒险而不担心灾难。您应该为应对所有已识别可能风险的后果制定计划。
这可能涉及利用您设计的应用程序中的优雅降级策略(参见“优雅降级”)。
部署设计
根据您的目标,您需要设计一个部署工作的策略。例如,您可能需要决定部署哪个软件和硬件版本,部署多少设备以及部署到哪些具体位置。您还需要找出任何必要的自动化措施,以减少部署时间并确保设备间的一致性。IoT 设备管理平台可能在这方面有所帮助。
例如,如果您在世界各地的多个工厂中有设备,您可能会决定将最新软件部署到一个工厂进行测试,以隔离任何风险。或者,您可以在每个工厂部署几台设备,以获取在各种背景下性能表现的横截面视图。最佳策略取决于您的具体情况,找到答案将需要商业和领域专业知识。
如果计划进行广泛部署,进行分阶段的推出总是个好主意:从小部分设备开始,看看情况如何,然后分批次部署其余设备。这将使风险降到最低,并在出现问题时更容易恢复。
检查与价值观的一致性
任何您发布的软件或硬件都必须经过详细审查,以发现潜在的道德问题。分析自上次部署以来所做的任何更改非常重要,以防引入新的问题。此外,您的部署计划本身也应该经过道德分析,并结合领域专业知识。
例如,如果计划进行分阶段推出,值得考虑的是推出是否正在代表用户的典型群体进行。如果在推出的初始阶段没有代表某些用户群体的情况,您可能会错过影响这些群体的问题。
沟通计划
在部署之前、期间和之后,向生产系统通报任何变更至关重要。通过创建沟通计划,您可以确保这一点有效实施。您的目标应该是确保所有可能受到部署影响的人,包括在风险文档中捕捉到的任何潜在意外问题,都知道计划行动、其风险以及可能需要扮演的任何角色。这包括利益相关者和您开发团队的成员。
通信应该是双向的,因为您可能不了解可能影响部署计划的因素。例如,您可能会发现与计划部署时间重叠并影响您试图测量的指标的预定活动。
决策是否前进
一旦所有适当的文档都被汇编好,最后一步是审查并做出是否前进的决策。您可能会确定风险水平过高,或者某些混淆因素意味着应该延迟部署。否则,您可能会决定继续前进。
决策是否前进的重要性在于需要来自利益相关者、领域专家以及您的技术团队的输入,因为他们都对可能被忽视的潜在问题有深入了解。
部署中期任务
在部署过程中,除了部署机制本身,您还应考虑以下任务:
双向沟通
您应根据预部署任务中制定的计划,与可能受部署影响的任何人进行清晰沟通。这包括倾听部署期间可能发生并被旁边工作人员注意到的任何潜在问题。
分阶段推出
为了将风险降至最低,部署应该分阶段进行,而不是一次性全部完成。协调这种分阶段推出是一项重要任务。最重要的方面是跟踪在哪里部署了什么,并监控每个阶段可能如何影响您正在跟踪的指标。
在某些情况下,您可能已经在现场使用无法更新的设备。例如,它们可能无法进行固件更新。如果是这种情况,您需要非常小心地跟踪哪些设备使用了哪个固件版本和算法。
监控指标
您需要在部署期间跟踪所有关键指标,并准备在事情进展不顺利时停止或回滚流程。根据预部署工作,您应该了解您所监测的指标预期会如何变化。如果观察到不同的情况,暂停部署并调查发生了什么是一个好主意。如果看起来发生了有害事件,您应该回滚到之前的状态并修复问题。
提示
负责任的人工智能工作流程的核心目标之一是防止造成任何伤害。您的工作之一是预见可能的伤害,并创建一个设计来防止其发生。虽然可能会发生意外事件,但未预料到的伤害事件意味着您的伦理审查流程存在缺陷。
后部署任务
在完成分阶段部署后工作并不会立即结束。以下是之后可能需要处理的一些任务:
沟通状态
根据您的沟通计划,您应确保所有受影响者在部署完成后得到更新的状态。他们还应该有一个清晰、持续开放的渠道,通过该渠道可以提醒您观察到系统中的任何意外变化。
部署后监控
在部署结束后一段时间内继续监控系统是明智的。可能会有一些延迟出现的效果。理想情况下,这些类型的风险在风险文档过程中已经得到了识别,并得到了领域专家的帮助。关于监控的更多信息将在“部署后监控”中提供。
部署报告
部署后,您应该编写一份总结报告,其中包括您的原始计划、实际发生的事情以及所采取的任何行动。这份报告将有助于指导未来的部署,并可以与您的利益相关者共享。
这可能听起来很繁忙,但通过系统化地进行部署并记录所做的每一步,您将更少遭受意外问题的困扰。通过多次部署同一项目,您将开始发展出一个需要最少工作并由一套坚实文档描述的高效系统。这个系统将是项目持续支持的重要组成部分。
支持边缘人工智能应用程序
部署标志着项目支持阶段的开始。所有技术项目都需要长期支持。从边缘人工智能的角度来看,支持包括随时间跟踪系统的性能。如果发现性能变化,可以采取行动,从更新算法到终止部署。
从伦理角度来看,项目得到良好支持是很重要的。如果一个项目被放弃,或者没有得到适当的监控而被随意进行,可能会造成伤害。漂移(如在“漂移和变化”中看到的)可以将一个方便的小工具变成一个危险的陷阱。如果您不能承诺对项目进行适当的长期支持,那么最好不要首先启动它。
由于边缘人工智能存在时间不长,支持是工作流程中工具和最佳实践方面最不发达的组成部分。一些来自服务器端人工智能的最佳实践可以应用于边缘问题,但其中许多则不行。本章的其余部分将探讨这一领域的挑战和机遇。
部署后的监控
长期支持的第一步是监控。一旦您的硬件原型被部署,您就需要开始收集它们操作情况的数据。这可能是一个巨大的挑战,因为有时甚至与设备没有连接。
以下是一些可能的情景:
-
部署设备具有良好的互联网连接,因此可以从现场收集统计数据和数据样本。例如,连接的家用电器可以使用家庭 WiFi 发送大量数据。
-
有足够的有限连接性以获取基本统计数据和指标,但不足以对数据进行采样。例如,部署在偏远油井上的智能传感器可以通过 LoRaWAN 发送少量数据字节,LoRaWAN 是一种用于远距离、低功耗无线通信的技术。
-
没有互联网连接,但用户反馈是可用的。例如,智能野生动物摄像机的用户可以提供有关其是否拍摄到正确动物的反馈。
-
没有互联网连接,也没有用户反馈可用。
如您所见,各种应用程序之间的连接性和获取反馈的能力可能有很大差异。理想情况下,至少应有一定的连接性:在根本无法收集任何反馈的情境中部署,您应该三思,因为这意味着您将完全不知道系统的表现如何。
假设您有一些反馈机制,目标应该是收集关于正在发生的情况尽可能多的信息。
部署系统的反馈类型
服务器端机器学习应用程序相对容易。由于它们的所有输入数据都在服务器上可用,因此可以将其记录和存储以供以后分析。例如,想象一个服务器端应用程序,使用计算机视觉从照片中识别特定产品。
由于它位于服务器上,拥有有效的无限存储空间来保留人们上传的照片记录。这意味着开发人员可以浏览和分析模型的预测,确定其是否有效,甚至标记数据并用于训练。
有些应用程序甚至更容易:这些应用程序内置了成功的度量标准。例如,如果您开发了一个推荐用户可能喜欢的产品的算法,您可以通过统计推荐产品被购买的频率来衡量其效果。
这些紧密的反馈循环允许在算法和应用设计上进行迭代和快速改进。但在边缘上并非如此简单。我们通常缺乏对结果的直接洞察力——尽管并非总是如此。我们还没有能力记录模型的输入。由于缺乏即时反馈,我们必须想出一些聪明的方法来理解发生了什么。
数据样本
在理想情况下,我们可以收集原始输入的样本并将其发送回服务器进行存储。这仅在星星完美对齐时才可能:我们需要能源可用性、连接性和带宽的完美组合,以及隐私不重要的用例。
例如,想象一下,我们构建了一个低功耗传感器,设计用于监测货物在运输过程中的处理方式。为了节省能量和成本,它可能缺乏在运输过程中存储或传输数据的能力。这意味着它无法发送原始输入的样本进行分析。
另一个例子,想象一下,我们构建了一个家庭安全摄像头,它使用深度学习模型进行人员检测。如果产品被市场宣传为使用边缘人工智能来保护隐私,那么捕获其输入的样本将是不可行的。
然而,肯定存在足够的能量和连接性的情况,可以发送数据样本。即使资源稀缺,您仍然可以找到方法使其发挥作用。
有些应用程序可以通过采样有限数量的数据创建反馈循环。与其尝试将每个输入都发送到服务器,它们会选择特定的实例。这可以是随机的(例如,每千个中的一个),也可以是周期性的(例如,每天一次),或者可以基于一些智能标准。一个有趣的方法是识别算法对输入感到不确定的时候,例如分类器的类别都不满足置信阈值时,并发送这些输入。因为它们是模型似乎在努力处理的部分,它们可能是最有用的进行分析的部分。
例如,一个成功的边缘人工智能驱动的追踪摄像机通过卫星连接将动物的缩略图发送回服务器。发送完整图像将会太昂贵,但缩略图仍然可以提供有价值的场地信息。
如果降采样后的数据仍然太重,您可能会选择只发送数据的部分。例如,您可以发送灰度图像而不是彩色图像。发送输入的聚合统计数据也可能很有趣:例如,您可以发送时间序列的周期移动平均值而不是整个时间序列。这有助于检测漂移。
通常,您的算法会在将数据馈送到模型之前使用一系列固定的信号处理算法。在这种情况下,由于您了解信号处理算法的行为方式,直接发送处理后的数据通常是可以接受的。处理后的数据通常更小,因此更容易传输。
一旦完全投入生产,您可能无法传输大量数据,但这不应妨碍您在部署的初始阶段访问真实世界的数据。例如,您可能决定在部署的头几个月内支付一些昂贵的连接费用(例如通过蜂窝或卫星调制解调器),以便收集反馈并用于改进系统。
另一种获取数据的替代方法是通过sneakernet——让设备将数据记录到本地存储,然后定期出去取回。与支付昂贵的连接费用一样,这可能无法在整个部署中扩展使用,但对于某些设备或特定时间段来说,这是可行的。
分布变化
正如我们在“漂移和变化”中所学到的,真实世界随时间变化——但我们的数据集只代表一个快照。如果我们的数据集不再代表性,我们就有问题,需要及时了解。
最佳方法是收集一个代表当前条件的新数据集,然后将其与我们现有的数据集进行比较。不幸的是,收集和标记数据集非常费时,正如我们所见,从现场发送实际数据样本并不常见。
相反,我们需要某种机制来理解真实世界的数据是否仍然类似于我们的数据集:是否其分布已经改变。如果我们看到分布变化超过一点点,很可能发生了一些漂移,我们需要加以考虑。
识别漂移的最简单方法是计算我们数据集的摘要统计信息,在设备上计算相同的统计信息,然后进行比较。摘要统计信息是代表一组测量值的数值总结。例如,您可以计算特定传感器读数的均值、中位数、标准偏差、峰度或偏度。⁸ 您甚至可以查看多个传感器读数之间的相关性程度。如果您的数据集与设备在现场收集的数据值不同,可能存在问题。
摘要统计只能识别分布中最简单的变化。还有一些更复杂的统计测试可以分析来自两个群体的样本,并确定它们之间的差异程度。这些算法的一些示例可以在Alibi Detect的文档中找到,这是一个用于漂移检测(以及其他用途)的开源库。不幸的是,许多这些方法在处理诸如图像和音频频谱图等高维数据时存在困难。
我们在撰写本文时仍需大量工作来了解在边缘设备上使用最佳漂移检测方法。如今,漂移检测通常通过异常检测算法实现(如在“异常检测”中所见)。异常检测模型在训练数据集上进行训练,然后在每个新输入上设备上运行。如果大部分输入被分类为异常,可能存在漂移。端到端平台通常具有一些功能,可以帮助处理这些情况。
监控输入数据(例如传感器收集的图像、时间序列或音频)和分类器生成的概率分布等算法输出的分布变化可能是有趣的。输出中的分布变化可能是漂移的下游迹象。例如,实际数据中的类别平衡可能不同。这可能是您应该改进数据集的迹象。
此外,输出分布的变化可以通知您算法或应用代码中的错误和漏洞。例如,如果您注意到更新后您的模型始终预测相同的类别,可能是引入了错误。问题通常比这更为微妙,但跟踪输入和输出的分布总是明智的做法。
有两种方式可以利用关于潜在分布变化的信息。如果您可以访问某些连接性,您可能能够将分布数据传输到中央服务器进行监控和分析。这将允许您至少在一定程度上与生产过程中发生的情况保持反馈循环。
如果您完全没有任何连接性,您仍然可能利用分布变化的措施来控制应用逻辑。例如,您可能选择拒绝任何不符合预期分布的输入。这可以帮助防止您的应用基于其算法未设计或训练的输入做出决策。
如果您注意到分布变化,通常最佳的做法是收集更多的训练数据,并用它来改进您的算法。我们将在“改进现有应用”中更深入地了解这个工作流程。
应用指标
除了模型的原始输入和输出之外,通过存储或传输一些日志来跟踪应用程序的活动是一个好主意。这可能包括以下内容:
系统日志
例如,设备启动时长、运行时间、功耗和电池寿命
用户活动
包括用户执行的操作、按下的按钮或输入的数据
设备操作
设备自动执行的操作,例如根据算法决策生成输出
回到“人工智能”,我们决定智能的定义是“在正确的时间做正确的事情”。应用指标帮助我们了解系统在部署后是否符合这一说法。通过检查不同类型事件之间的关系,我们可以尝试确定设备是否按照我们预期的方式使用。如果没有,则可能存在问题。
例如,假设我们建立了一台边缘 AI 微波炉,可以使用计算机视觉确定菜肴的最佳烹饪时间。我们对应用程序日志的分析可能显示,用户通常会比估计的烹饪时间略长地运行微波炉。这表明我们的应用程序可能表现不佳,需要进一步调查。
如果您能够从中央服务器访问多台设备的日志,您可以进行跨设备的高级分析。但是根据您的连接级别,您可能无法传输完整的日志集,甚至根本无法传输任何日志。但是,您可能能够发送某种形式的摘要统计数据,描述日志中发生的情况。
例如,您可能提前决定是否值得知道用户是否超过推荐的微波使用时间。然后,您可以将该特定信息发送回进行分析,而无需上传整套日志。
如果无法上传任何数据,您始终可以在设备上记录日志:通过收集设备并物理下载可能会获得它。压缩日志以便在设备上存储或使传输更容易可能会有所帮助。
结果
大多数边缘 AI 系统的目标超出了设备本身的发生。例如,产品可能设计用于降低工业流程的成本,鼓励用户保持健康,或者提高农产品的质量。
有了这个想法,跟踪系统与之交互的任何过程的结果是至关重要的。这将帮助您了解您的项目是否产生了有益的效果。
测量和解释结果对结果的影响需要深入的领域专业知识。该过程需要在系统部署之前开始:您需要测量系统当前的结果,以便有比较的对象。这应该已经是项目初始阶段的一部分。
作为分阶段部署的一部分,您还可以监控结果。如果您在某些地方部署而在其他地方不部署,您希望能够测量结果的差异:还没有进行部署的地方将充当对照组。不过,您应确保考虑到可能导致不同位置之间差异的任何其他因素。
结果的好处在于,一旦部署后,您无需访问设备即可进行测量。不利之处在于,部署与结果之间通常存在延迟,这可能导致反馈循环效果较差。同时,更难考虑外部因素的影响。
用户报告
如果用户与您的产品互动,或者它所影响的系统,您可以潜在地对他们进行调查以获取反馈。这可以是一个很好的反馈来源,因为用户通常是第一批注意到任何好处或问题的人。
重要的是以结构化的方式收集用户反馈,并认识到有许多因素可能导致个人对同一情况得出不同结论。因此,来自许多人的汇总反馈可能比来自少数人的反馈更可靠且更具操作性。如果您没有收集用户反馈的经验,与具有该领域专业知识的专家合作是一个好主意。
值得注意的是,用户并不总是诚实的。员工可能会对重要项目提供负面反馈感到不适,或者他们可能会发现自己处于一种抵制部署的动机下:例如,如果他们觉得项目对他们的工作产生了不良影响。这些都是完全合理和可以理解的原因,因此敏感地对待这些情况至关重要。
改进实时应用
迭代开发过程在部署后并未结束,但肯定会发生变化。一旦您的设备投入生产使用,您在进行修改时将会失去一些灵活性。根据您的项目,可能会有技术约束阻止您在应用程序部署后更新。即使具备进行更改的能力,您可能也需要保守行事,以避免破坏用户体验。
利用反馈解决问题
在监控期间收集的反馈类型(参见“部署后监控”)可以很好地用于识别和解决问题。反馈有多种类型,每种类型都专注于解决方案的不同方面:
-
数据样本为我们提供了解实时数据演变状态的视角。
-
分布变化还可以提供关于实际数据的洞察,并且它们还可以帮助我们识别算法流水线内部的问题(通过监控输出分布)。
-
应用程序指标为我们提供了在技术层面上理解系统高级运行情况的方式。
-
结果帮助我们全面了解系统的行为方式——以及它是否在解决它旨在解决的问题。
-
用户报告进一步证明了我们产品的整体健康和实用性。
通过收集跨所有这些轴线的反馈,你应该能够追踪到任何问题的原因。例如,你的结果数据可能表明系统在试图解决的问题上没有产生积极影响。为了调查,你可以查看输入和输出分布的变化。如果输入分布与你的数据集中相同,但输出分布与开发过程中观察到的不同,可能是你的算法在设备上的实施存在问题。
观察你正在监测的方面随时间的变化非常重要。你可能会发现,由于季节性(见“表达和时间”),输入分布存在周期性变化,这需要考虑到你的应用程序中。
随着时间的推移优化算法
所有环境都会发生漂移,你几乎肯定需要随着时间的推移来改进你的系统以跟上。此外,由于边缘 AI 领域仍在快速发展,新的算法方法可能会在你的部署过程中变得可用。
改进你的算法任务只是你熟悉的开发工作流程的延伸。这是一个由数据驱动的迭代过程。希望通过部署到现场,你已经对真实世界中存在的条件有了更好的理解。例如,监测模型输出分布的差异可能提醒你,在现场存在与你的数据集不同的类平衡。
即使你没有获得这样的信息,你的预部署评估也有望告诉你系统性能的薄弱点。例如,也许你的应用程序在整体人群的某些子群体中表现不佳。
你可以利用这些信息来改善你的数据集。如果幸运的话,你可能能够直接从现场获取数据——尽管这可能受到技术或法律障碍的限制。⁹ 至少,你希望能够意识到需要改进的部分:也许你可以从更好的多样性中获益,或者通过增加特定类别的示例数量来改进。
同样适用于算法。如果你认为另一个算法可能效果更好,你可以像在初始开发过程中一样探索它的潜力。不同之处在于,你现在有一个实时的生产系统可以进行比较。你甚至可以选择在不同设备上部署两个不同版本的算法,以收集关于哪个算法表现更好的数据。
一旦您拥有了改进的算法或应用,您就需要部署它。就像边缘人工智能中的大多数事物一样,这并不总是听起来那么简单。
支持多个部署的算法
部署服务器端代码可能只需按下一个按钮,最新版本即可立即供所有用户使用。不幸的是,边缘部署要复杂得多。
人工智能通常被部署到边缘以解决连接性和带宽的挑战。这些挑战可能使部署变得棘手。在多设备部署中,可能不可能同时将应用程序的最新版本推送到每个边缘设备。即使有足够的带宽,某些设备可能不可用:已关机或离线。在某些情况下,出于设计或意外原因,没有办法更新已经部署在现场的设备。
边缘人工智能应用程序的开发和部署方式加剧了情况。在迭代工作流程中的分阶段部署自然会导致在现场出现许多不同的硬件和软件组合,甚至在初始推出后,新设备进入现场时的硬件和软件版本可能比已有的更新。
这意味着在某个时刻,您可能会在生产中拥有一系列应用程序版本。事实上,可能会有几个实体具有不同的版本:
-
设备硬件本身
-
设备上运行的应用固件
-
固件内的算法实现或模型
-
用于训练任何机器学习模型的数据集
-
设备连接到的任何后端 Web 服务
由于不太可能同时更新所有这些内容,因此在任何给定时刻可能在现场部署的工件组合数量巨大。跟踪它们非常重要。如果不清楚在哪里部署了什么,您将失去调试系统的能力。如果每个设备都具有不同的组件混合,而您不确定它们是什么,要找出性能问题的根本原因就非常困难。
为了进行调试和追溯,您需要一个系统来跟踪每个组件在特定位置部署的版本。例如,您可以维护一个数据库,每次更新固件或创建新的硬件迭代时都保持最新。这种功能可以由物联网设备管理软件提供。
在监控指标时,您需要将它们与设备管理平台中的记录关联起来,以便了解哪些组件可能需要关注。
同时管理多个不同版本可能是一场噩梦,因此,您有兴趣尝试限制当前使用的组合。如果您的设备连接到后端,强制实施相对统一的一种方法是要求最低固件版本。缺点是这可能会影响系统的稳健性和可用性。
道德与长期支持
世界和我们的应用程序不断发展,因此,长时间以来从道德角度分析我们的系统至关重要。
以下是可以长期影响部署的一些道德问题。
性能下降
本章介绍了一些技术,用于随着时间的推移监控和改善性能,这些技术在漂移发生时自然会下降。不幸的是,现实是大多数部署都有有限的有用生命。在某一时刻,要么漂移过大无法克服,要么预算不允许必要的维护。
例如,想象一个旨在识别制造缺陷的系统。随着时间的推移,制造过程的变化可能会产生不同类型的缺陷。如果系统没有更新,新缺陷就不会被发现——可能导致安全隐患。
机器学习模型并不一定知道是否输入了它未经过训练的处理输入。相反,它将继续产生可能完全错误的输出。如果有人依赖您的应用程序执行正确的操作,这可能是灾难性的。如果不再支持硬件,可能没有办法知道存在问题——除了造成一些伤害的事实。
这引发了一个问题:那些已超过其有用寿命的项目会怎么样?事实是,仅仅放弃一个项目在伦理上是不可接受的。相反,您需要计划在项目变得不可行时将会发生什么。一个负责任的设计涵盖了项目的整个生命周期,从摇篮到坟墓。
对于边缘 AI 项目,这包括硬件组件。例如,您可能需要计划处理硬件设备中包含的有害材料,如锂电池。您的硬件可持续吗,还是会带来自身的问题?
新信息
部署后,可能会出现新的事实,这可能导致对项目进行道德重新评估。以下是一些例子:
-
发现可能对公平性有害的算法限制
-
发现可能被利用的安全漏洞
-
对问题理解的改进揭示了应用程序中的缺陷
-
边缘 AI 技术的改进使得当前应用过时
-
问题领域的变化使当前应用程序过时
人工智能是一个快速发展的领域,发现现有算法和技术存在问题是很常见的。例如,对抗攻击使攻击者能够通过精心构造的输入来操纵机器学习模型,以获得他们期望的输出。通常会发现新的对抗攻击,并且在防御措施被发明和打败之间存在一场小规模的武器竞赛。
还经常发现 AI 技术中的缺陷,可能导致性能受损。例如,《“压缩深度神经网络会忘记什么?”》(Hooker 等人,2021)展示了流行的模型压缩技术如何导致少数类性能损失。随着我们对技术局限性的了解加深,我们可能会发现我们当前部署的系统存在缺陷,使其不适合继续使用。
有时,新的发现会使现有技术过时。在某些情境下,继续使用旧技术可能被视为不道德。例如,假设您有一种医学诊断产品,能以 20%的假阴性率检测出致命疾病。如果竞争团队创建了一个假阴性率为 10%的系统,那些使用您的系统而不是他们的系统的人可能面临更高的死亡风险,因为他们的疾病更不容易被检测到。您可能需要考虑是否继续推广您的产品是否符合伦理。
在某些情况下,新的领域专业知识可能会显露出系统不适用的情况。例如,对人体生理学有更深入的理解可能表明先前足够的健身可穿戴设备实际上给运动员提供了错误的建议。
文化规范的演变
社会变化迅速,您可能会发现先前部署的应用程序逐渐超出了可接受的标准。例如,消费者对隐私的期望随时间而变化。今天,消费者接受智能扬声器将录音的对话音频发送到云端进行处理,因为历史上没有其他方法能进行准确的语音识别。
然而,随着设备上的转录变得更加普及,消费者可能会逐渐期待这种方式,并认为服务器端转录是一种过时的概念,违反了他们对隐私保护的期望。
值得注意的是,这种现象也可能反向发生:先前不可接受的概念,如家庭私人区域内的智能摄像头,随着我们向图像数据永不离开设备的系统迈进,可能会变得被容忍。
作为项目的管理者,您应该与领域专家合作,了解文化规范并确保您的应用程序不会违反这些规范。
法律标准的变化
法律标准往往与文化规范同步。例如,随着网络隐私期望的发展,像欧盟的《通用数据保护条例》(来源)等法律被制定出来,以规范公司处理私人信息的方式。
无论你所处的领域是什么,都应该与领域专家合作,了解你的法律义务,并确保你在处理时符合道德标准。
警告
记住,法律和道德并不一定相同。在某些情况下,你可能在法律上被要求做与你的道德标准不兼容的事情。例如,一些公司受到政府的压力,要求交出加密用户数据的密钥(来源)。设计应用程序时请牢记这一点。
What Comes Next
我们关于长期支持的讨论结束了本书的最后理论部分。恭喜你走到了这一步!
在接下来的三章中,我们将看到我们学到的一切实际应用。每一章都提供了边缘 AI 工作流程在实际用例中的端到端应用,从一个想法开始,到最终产品。
我们希望这些章节既具有信息性又富有启发性。通过本书的学习,你将准备好在实践中应用这些原则。
¹ 如果你可以在官方硬件准备好之前先部署到开发板,你应该这么做。
² 谷歌的机器学习入门课程中对精确率和召回率有很好的解释(来源)。
³ 正面一词通常用接受替代,负面则用拒绝替代。
⁴ AUC 为 0 意味着模型每次预测都是错误的,这对于二元分类器来说意味着你可以简单地翻转预测来获得完美的性能。如果这种情况发生,通常意味着你在某个地方搞错了标签!
⁵ 文章“mAP (mean Average Precision) Might Confuse You!”中对 mAP 有很好的解释(来源),作者是 Shivy Yohanandan。
⁶ 实际上有三种 RAM 的用途:数据 RAM(或全局 RAM)、堆栈 RAM 和堆 RAM。数据 RAM 的使用在编译时确定,而堆栈和堆的使用在程序运行时可以改变。一些嵌入式程序故意只使用数据 RAM,以避免任何意外。堆栈和堆都需要单独的高水位测试。
⁷ Edge Impulse 使用这种方法在模型开发期间提供延迟估算。
⁸ 这些只是一些摘要统计数据;还有更多选择。
⁹ 如果你预期希望从现场收集数据,这需要成为你产品服务条款的一部分,并且你必须验证客户已同意此条款。
第十一章:使用案例:野生动物监测
现在我们理解了为边缘应用开发机器学习模型的基础知识,我们将首先介绍与野生动物保护和监测相关的使用案例领域。我们将通过本书中第九章中概述的开发工作流程来探讨每个使用案例章节中可能遇到的问题及其相关解决方案。
全球威胁物种的迅速减少是由于各种人类文明影响以及环境原因或灾害。这种减少的主要驱动因素是栖息地的丧失、退化和碎片化¹。这些驱动因素的原因是人类活动,如城市化、农业和资源开采。由于这种减少,许多物种面临灭绝的风险。
越来越多的人工智能和边缘人工智能应用正在开发中,旨在帮助保护野生动物。这些应用程序涵盖从早期检测非法野生动物贸易到监测濒危物种和自动识别偷猎者的各个方面。正如本书中先前讨论的那样,边缘人工智能用于在设备上本地处理数据,而不是在云端处理。这对于野生动物保护至关重要,因为它可以用于在无需互联网连接的偏远地区处理数据。这意味着数据可以快速处理,无需昂贵的基础设施,有助于防止未来的偷猎,从而保护我们星球上最脆弱的物种。
当负责任地使用边缘人工智能时,它可以并且将会对社会和我们的星球产生极其积极的影响。然而,技术和人工智能的作用取决于它们的开发者。因此,它们可以用于善良之用,有时也可能被用于有害和不道德的目的。因此,如何开发和使用它们至关重要,以确保它们的利益大于风险。联合国²和各大科技公司如谷歌³、微软⁴等正在创建倡议,利用他们的资源为社会和环境做出贡献。
一个这样的利用人工智能的例子是一种众所周知和深受研究的保护、识别、监测和追踪濒危物种的方法,摄像机陷阱。摄像机陷阱是一个强大的工具,可以用于各种野生动物保护研究和监测目的。它可以用于监测濒危物种、研究动物行为,并评估人类活动对野生动物的影响。这种方法还可以用于检测和跟踪偷猎者,以及监测濒危物种的健康和行为。摄像机陷阱通常与 DNA 分析等其他方法结合使用,以更全面地了解区域内的情况。
什么是摄像机陷阱?
摄像机陷阱是一种远程激活的摄像机,用于拍摄动物在其自然栖息地中的照片。摄像机通常由红外(IR)传感器触发,该传感器由动物的运动触发。
摄像机陷阱通常局限于地面上的一个固定位置;摄像机陷阱特别适用于大型地栖动物。因此,这种方法对地球物种的一小部分特别有效,因为摄像机陷阱不适用于水下应用、飞行中的鸟类、迅速移动的小昆虫等。
问题探索
“野生动物保护”这一术语对于本章来说涉及的概念过于宽泛,对于仅用一个机器学习模型来解决的问题也过于庞大,因此,对于本书的目的,我们将专注于保护IUCN 濒危物种红色名录中特定动物物种的野生动物保护。
我们还需要探索我们试图解决的问题的难度:什么是成本、旅行、实施、基础设施或政府限制,这些将阻碍为非营利目的创建机器学习模型?
解决方案探索
由于濒危物种在自由漫游,白天或夜晚很难被人眼观察到。摄像机陷阱是特别有用的工具,因为它们允许人类在不干扰其自然栖息地的情况下跟踪、计数和识别濒危动物及/或动物的威胁。摄像机陷阱最终允许动物被监视,从而可以在不大幅度影响它们的行为、移动、环境、食物来源等情况下远程保护它们。
保护这些濒危野生动物物种的一个重要步骤是为它们的人类监护人提供可行的信息。这可以采取许多不同的形式。从目标上来看,我们既可以生成一个能够识别对这些特定物种构成威胁并警示人类威胁位置的机器学习模型,也可以识别、计数和/或跟踪动物的位置。这两种方法都达到了同样的目标,为人们提供必要的信息以保护濒危物种。然而,它们需要不同的机器学习类别组合和传感器输入来解决。
目标设定
盗猎是非法捕猎、杀戮或困禁动物。盗猎者通常以其肉、角、象牙或皮毛为目标瞄准稀有或濒危动物。盗猎是一个严重的问题,威胁着许多野生动物物种的生存。摄像机陷阱可通过帮助追踪盗猎者的活动并提供用于起诉的证据来减少盗猎。摄像机陷阱还可以通过让盗猎者意识到自己被监视来阻止盗猎:
在偏远地区使用相机陷阱有望帮助保护区管理人员提高在其保护景观中检测非法人类活动的率,并通过提供适当的支持证据提高逮捕和起诉的率。⁵
生物保护 文章
相机陷阱也是研究、保护和监测濒危物种的重要工具。它们使研究人员能够在不干扰动物的情况下收集关于动物生态和行为的数据。这些信息可以用来设计保护濒危物种及其栖息地的保护计划。由于相机陷阱数据的广泛获取并不特定于某一物种,这些触发运动可能来自多种不同的物种。⁶
解决方案设计
为了避免通过创建一个用于监视濒危物种的相机陷阱系统的机器学习模型而产生许多伦理困境,我们可以通过追踪及监控其环境中的其他入侵物种来促进濒危物种的保护和福利。通过在设备环境中使用相机陷阱监测入侵动物的位置和数量,并将这些信息传达给环境的人类监护者,可以促进濒危动物的保护:当地资源及非自然物种入侵或非自然捕食者将减少,从而使濒危动物种群得以恢复和茁壮成长。
在本书中,我们选择设计和实施一种低成本、高效且易于培训的相机陷阱,以监测您选择的一种入侵动物物种。然而,保护和监测陷阱并不总是需要基于相机的解决方案,通过使用本章和整本书中提出的原则和设计工作流程,可以实施许多其他类型的机器学习模型和应用于保护和监测目的,包括使用音频数据来分类动物呼叫或鸟类叫声,水下音频/雷达来监听海洋声音并跟踪和识别鲸类,等等。
现有的解决方案有哪些?
自 1990 年代以来,相机陷阱已被广泛用于商业和保护/监测目的。通过在相机设置上集成运动传感器,当检测到任何运动时,室外野生动物相机将被触发,从相机固定位置的视角获得数千张图片,持续数天或数月。
由于设备本身的网络能力曾经过于耗电,无法集成到远程场地设备中,研究人员需要进入设备所在环境手动检索相机的图像,这有时是一个劳动密集型的任务,取决于相机在野外放置的位置以及位置的偏远程度。一旦图像被检索出来,研究人员需要几周甚至几个月的时间用训练有素的眼睛手动筛查图像,以找到其中的目标物种。
将 AI 整合到相机设备本身中后,研究人员现在能够显著减少定位目标动物/物种所需的时间,因为设备现在在触发移动传感器后捕获的每张图像都有动物出现的概率读数。只有概率最高的图像才会通过网络发送到研究人员的实验室,消除了人类需要亲自进入野外检索相机图像的需求(考虑到环境可能是一个潜在的危险任务),并减少了筛选捕获图像所需的人工工时。
已经有专门用于相机陷阱的具体 AI 工具,从自动检测未标记图像或视频数据流中特定对象到用于后处理、跟踪和计数物种的数据摄入工具。这些工具对研究人员非常有价值,由于相机陷阱是一个经过深入研究和广泛适用的方法,因此有大量这些解决方案可用;只需进行简单的网络搜索就可以帮助您找到所有这些预构建解决方案。这些预构建设备各有其优缺点,考虑到尚无可能有一个单一模型能够在我们星球上所有环境中识别和跟踪所有生物物种,我们在本章节不会过多深入讨论这些现有解决方案,而是会通过设计和部署我们自己的相机陷阱来介绍这个过程。
解决方案设计方法
我们可以采用多种不同方式来解决我们的问题陈述,并针对每种方法列出以下的优缺点:
识别濒危动物。
如果有足够大的数据集可用,或者有足够的公开可用的动物标记图像,那么训练/测试数据集将很容易整理,随后的模型在设备环境中将具有足够高的准确性。然而,以这种方式框定问题可能会让偷猎者和其他人类威胁轻易地创建出一种本质上是极其精确的狩猎工具,尤其是取决于用于设备所在环境的数据质量。
识别濒危动物的侵入性捕食者。
在研究充分的环境中,通常有大量针对全球各地不同地区的入侵物种的公开数据,包括入侵性捕食者、植物和其他野生动物;这类问题及其解决方案通常对于试图增加濒危动物繁衍成功机会的人们非常有益,因为人类可以利用陷阱数据来发现并清除入侵威胁。
然而,确定在任何给定时间内濒危动物环境中可能出现哪种入侵物种可能是困难的,对动物有害的入侵物种可能是从人类到其他动物或入侵性有毒植物的任何威胁。因此,这里的问题陈述可能有点过于宽泛,无法从各个方面保护濒危动物。
这种方法的另一个缺点是,它要求模型创建者意识到,入侵物种模型仅在被识别的物种确实是目标区域中已验证的入侵物种的环境中才是有用和道德的。这需要机器学习模型开发者方面的诚意努力,以确保其模型的创建确实是在其目标区域中入侵物种的真实情况,并且要求开发者努力限制模型分发到实际上并非入侵性的区域。
此解决方案还要求最终用户确保模型不被用于过度捕猎已识别的威胁,并且符合该地区的狩猎规则和季节性法规以及适用的植物采集/收获/去除规则。
识别偷猎者及其相关威胁。
人类/人物图像识别方法或甚至是人/物体检测模型已经是机器学习模型开发中一个广泛成熟的领域。许多数据集已经存在,用于在低功率和高计算能力计算机上识别摄像头镜头中的人类。然而,与解决此问题相关的许多道德和安全义务。模型开发者必须确保在训练和测试集中使用的数据代表使用情境,并且在版权/公平使用法律下被允许使用。
结果模型还必须仅用于二元分类:是(相机镜头的框架中有人)或否(图像中没有人)。这类似于人体物体检测。这需要开发方面的良好诚意,以确保面部数据、生物特征数据和其他识别信息不被使用或收集。开发者还需确保模型遵守适用于部署模型的地区的众多隐私和数据法律。
识别其他入侵物种。
这种方法在确定哪些其他物种可能对您选择的环境中的濒危物种构成威胁方面提供了许多选项。从植物、昆虫到其他动物,这种模型类型的变化是无穷无尽的,并且全部有助于保护和确保您指定的濒危物种的生存。然而,与尝试识别濒危动物的捕食者时遇到的类似的缺点也是存在的。
在每种方法类型及其产生的解决方案方面都存在许多利弊;你需要使用自己的探索方法为你选择的解决方案制定利弊列表!一个好的第一步是与各种利益相关者和具有你问题及其解决方案的第一手经验的人进行头脑风暴。除了这些利弊外,我们还需要考虑许多因素,以确保负责任的设计,这些我们将在本章后面讨论。
设计考虑因素
为了实现支持研究我们选择的野生物种的研究人员,和/或识别和跟踪对我们选择的地区的濒危物种构成威胁的入侵物种的总体目标,从技术角度来看,我们可以使用各种数据源,包括不同类型的传感器和相机(参见表 11-1)。
表 11-1. 实现各种野生动物保护目标的传感器
| 目标 | 传感器 |
|---|---|
| 统计野生环境中的大象数量 | 相机 |
| 根据其呼叫声识别鸟类 | 麦克风 |
| 在海洋中聆听鲸鱼的呼叫声 | 麦克风,HARPs(高频声学记录装置)^(a) |
| 在环境中监测威胁(盗猎者,枪声等) | 麦克风 |
| 追踪和识别盗猎者 | 相机,麦克风 |
| 控制和跟踪常见的外来物种 / 入侵物种 | 相机,麦克风,加速计,多普勒雷达 |
| ^(a) 参见 NOAA 渔业文章,《太平洋群岛的被动声学》](https://oreil.ly/d-yVo)。 |
在所有前述的用例中,典型的机器学习方法,分类,被用来;或通过上传一个包含您希望在设备上的新的、看不见的传感器数据输入流中发现的信息的机器学习–训练数据集来实现。要了解各种机器学习算法,请参阅“功能类型的算法类型”。
在选择您的野生动物监测目标和用例时,您还需要考虑如何轻松收集用于训练机器学习模型的大型、强大且高质量的数据集。正如我们在前几章中发现的(特别是在第七章中),您的模型只能与输入数据的质量一样好。例如,如果您希望创建一个识别稀有和濒危鸟类鸣叫的模型,则可能无法获得足够大的数据集来成功训练高度准确的分类模型。
参考“数据集收集”。幸运的是,在互联网时代和广泛可用的研究数据集和合作项目中,模型开发人员能够使用和获取许多现有的图像数据库,以识别特定动物物种,或者下载各种传感器或音频数据集,包括动物鸣叫、语音、环境化学足迹等。“获取数据”讨论了这种数据集收集方法的一些利弊。
同样,考虑设备的位置以及所需环境的传感器:
-
初始数据收集阶段的设备位置
-
设备部署后的位置
-
设备位置的平均天气条件
-
电池供电 vs USB 供电 vs 永久电源线
-
环境要求(例如水、雾、泥土和其他环境因素)可能会阻碍传感器的正常使用或损坏设备
设备可能位于非常偏远的野外;根据用例,它可能需要更多或更少的处理能力,因此需要更多的电池。设备也可以固定在永久电源线上,或者可以是超低功耗,因此可以使用每年或每几年只需更换一次的电池。对于特定的用例或目标环境,永久电源线可能不可行。
还要考虑将模型推理结果返回到某些云平台。根据选择的网络协议类型,这种通信可能会受到能源和功率限制,并且会影响设备在无需人为干预、更换电池等情况下在现场运行的时间长短。如果设备一直在移动,模型需要如何调整以在所有这些环境和情况中工作良好?
环境影响
请重新阅读“负责任地构建应用程序”,然后返回本节。我们将讨论解决方案环境影响的具体考虑因素。
模型开发人员还需要考虑他们的设备将如何直接影响其所放置的环境。例如,如果你把一个大型设备放在雨林中只是为了追踪人类活动,那么无论在物理设备上使用了什么措施和附件,该设备很可能本质上是具有侵入性的;然而,我们需要考虑多少动物或濒危物种有可能会因此设备及其推断数据而得到拯救,并权衡利弊。
还需要考虑的其他注意事项和问题包括:
-
目标生物是否本身对安装环境具有入侵性?
-
设备在环境中会有侵入性吗?设备锚定可能会无意中对其他物种、虫子、细菌等产生负面影响。
-
需要多少人来在环境中进行物理安装设备?安装后会产生什么样的旅行和安装足迹?(人类垃圾、足迹、破坏其他动物栖息地等)
-
设备在识别目标物种后如何警示用户或云系统?
-
设备放置在哪里,人类需要多频繁地物理穿越到设备位置?
我们还需要确保设备不会发出不自然或非本地环境的光线、声音、噪音和化学物质。这些因素可能会导致您试图追踪的动物行为异常,从而扭曲您的数据和推理结果。
警告!相机陷阱可能会被动物听到和看到⁷
相机陷阱的开发者需要考虑设备在动物环境中可能具有的以下侵入方式:
-
听觉侵入
-
嗅觉侵入
-
学习关联
-
视觉(白天)
-
视觉(夜间)
从环境影响的另一个角度看,如果用于侦测偷猎活动,相机陷阱可能引起伦理困境,并可能对我们试图保护的土地上的当地人造成直接负面影响。有报道称,反偷猎行动已被政府用来排除传统上生活和采集食物的当地少数民族。
任何设计用于惩罚人员的人工智能都存在高滥用风险,因为它可能被用于模型开发者未曾预料的方式,例如,部落被驱逐出其村庄,政府安置“反偷猎者”摄像头以确保他们不会返回,或者威权政权将其用于对付叛乱分子。西方组织提供这种能力也会引起多年来发生过的有害技术转移的回响。⁸
引导启动
对于本章,我们将实施一个解决方案,旨在“识别濒危动物的入侵捕食者”(参见“解决方案设计方法”),并设计一个模型来检测和分类动物Callosciurus finlaysonii(芬利松松鼠),俗称“泰国松鼠”,根据2022 年 8 月 2 日欧盟列表在荷兰被认定为入侵物种。本章的作者是荷兰的居民,因此选择了荷兰认证的入侵物种作为此用例的示例。一旦我们收集到了目标捕捉动物的数据集,我们还将添加另一类不包括Callosciurus finlaysonii的一般环境图像数据。这两类数据将使我们的图像分类机器学习模型能够识别摄像头在环境中因移动而触发的时刻:摄像头拍摄一张图像,训练好的机器学习模型推断并确定Callosciurus finlaysonii在环境中的位置。如果结果图像包含我们的入侵物种,将通过我们选择的网络连接发送给人类或云端进一步处理。
根据荷兰政府和欧盟:
在意大利,泰国松鼠(Callosciurus finlaysonii)啃食树皮,增加了真菌和无脊椎动物感染的几率。在其原产地范围内,泰国松鼠被认为是鸟类蛋的常见捕食者,但在引入区域没有关于这种影响的信息。从树皮上啃食对生态系统服务有负面影响,这对个别树木和整个生产林业都可能具有重要意义。树皮的剥离还可能导致次生污染,例如真菌。这导致在意大利有被砍伐的树木[⁹]。
定义您的机器学习类别
表 11-2 展示了用例、传感器和数据输入类型以及机器学习分类的潜在组合,用于收集和标记训练和测试数据集。用例及其相关的类别标签对于我们在本章中使用的机器学习算法类型(特别是“分类”)非常重要。更多信息,请参见“分类”。
Table 11-2. 各种用例的机器学习分类
| 用例 | 训练数据 | 类别标签 |
|---|---|---|
| 摄像机陷阱 | 图像 | 目标动物、背景环境(有或无其他动物) |
| 音频陷阱 | 麦克风数据 | 目标动物呼叫、环境背景噪音、“其他”动物呼叫(非目标动物呼叫) |
| 动物目标检测 | 图像(带有边界框) | 目标动物 |
| 运动陷阱 | 加速度计、雷达或其他空间信号 | 所需动物的运动 |
| 化学诱捕 | 气体信号 | 环境环境,目标物种化学特征 |
在本章中,我们将选择并建立传统的摄像机陷阱用例,用于机器学习图像分类,使用迁移学习技术回答问题,“我的目标动物是否出现在摄像机的视野中?”我们项目的机器学习类别将是“目标动物”和“背景环境(有或没有其他动物)”,或者更简单地说,“未知”。
数据集收集
要获取干净、稳健和有用数据集的技术和具体信息,请参阅“获取数据”的方法。您还可以利用各种策略从多个来源收集数据,以为您的用例创建独特的数据集:
-
结合公共研究数据集
-
将来自多个公共数据集的无动物出现环境图像与标记的目标陷阱动物图像数据集结合起来
-
使用现有的大规模图像数据集,如 COCO(常见上下文中的常见对象)
获取公开可用的图像数据集
您始终可以使用看似不相关来源的数据集;例如,如果您的目标入侵物种生活在葡萄牙,但在那个环境中缺乏标记的目标物种图像数据集,您可以找到其他葡萄牙物种的研究数据集,并将其数据用作您的训练/测试数据集中的“非目标入侵物种”。您的目标入侵物种甚至可能存在于这些图像中,您的模型在训练后可以识别,而不会被原始数据集开发者知晓!
Edge Impulse
Edge Impulse Studio 是一个免费提供的基于云的平台,包含所有工具和代码,用于整个端到端机器学习流程,包括收集和标记高质量的训练/测试数据集,使用各种数字信号处理技术提取数据的最重要特征,设计和训练您的机器学习模型,测试和验证模型的真实世界性能/准确性,并使用易于使用的 Edge Impulse SDK 在各种库格式中部署模型。在本章及本书后续用例章节中,我们将使用 Edge Impulse Studio 来减少我们的模型开发时间以及我们需要编写的代码量,以实现完整的边缘机器学习模型开发流程和随后的部署。
要进一步证明为何使用 Edge Impulse 进行边缘机器学习模型开发,请查看“边缘 AI 的端到端平台”。
要跟随本章节的其余说明,您需要创建一个免费的 Edge Impulse 账户。
公共项目
本书每个用例章节都包含一个书面教程,以演示和实现所描述用例的完整端到端机器学习模型。但如果您只想直奔主题,查看作者为本章节开发的确切数据和模型的最终状态,可以访问本章节的公共Edge Impulse 项目。
您还可以通过选择 Edge Impulse 页面右上角的克隆按钮直接克隆此项目,包括所有原始训练和测试数据、中间模型信息、训练后模型结果以及所有部署选项(参见图 11-1)。

图 11-1. 克隆 Edge Impulse 公共项目
选择您的硬件和传感器
在本书中,我们尽可能地保持设备的中立性,但我们还需要讨论如何使用现成、易于使用的开发套件来创建此用例的解决方案,因为我们假设本章节中概述的教程很可能用于道德、非营利目的,这意味着读者可能会受到嵌入式工程资金、资源、开发人员等的限制。因此,本书旨在尽可能地使硬件选择变得简单、经济和易于获取。
为了快速简便地进行数据摄入和部署,而无需编写任何代码,我们将同时使用 Edge Impulse WebAssembly 库和移动客户端将新数据摄入并将训练后的模型部署到移动电话。对于其他同样简便的部署设备,Edge Impulse 提供了大量官方支持的平台,从 MCU 到 GPU,其中所有平台都包括可供您使用的开源预写固件。如果您有一台未列为 Edge Impulse 官方支持平台的设备,仍然可以使用该设备,但您需要将部署的 C++ 库和您设备的驱动代码集成到您的应用程序代码中,就像在典型的嵌入式固件开发工作流中一样。
平台选择对本书来说并不重要,因为我们试图确保几乎任何物理设备平台都能实际解决每个用例章节(除了任何内存或延迟限制)。您可以使用树莓派和各种传感器配置解决所有用例章节,并实现本文所讨论的相同目标。
然而,根据使用案例的目标,选择树莓派将迫使您考虑必要的高耗电需求以使树莓派正常运行,但与此相反,这种设备选择可能成本更低且大大减少总软件开发时间(对于单个现场单位而言;当然,如果需要大量相同设备,则树莓派+传感器/摄像头配置可能比 MCU/集成传感器/摄像头解决方案更昂贵,例如)。
硬件配置
对于您的主要边缘设备和附加摄像头配件,有无限组合可供选择。在本章中,我们将保持设备不可知性,但假设我们的目标设备类似于OpenMV Cam H7 Plus(带 RGB 集成摄像头)。
这种通用设置已经暗示了一些限制:我们的摄像陷阱只能在白天可靠工作;输入帧图像的质量可能太低,无法准确识别目标动物的所有实例,如果动物距离镜头太远;您的设备可能会因电池消耗过高而无法长时间无人看管地在野外生存;如果您试图使用灰度捕捉具有特定颜色的动物,则输入图像可能会产生不准确的预测。¹⁰
以下是一些其他摄像头附件选项和要考虑的要求清单,以提高特定环境、使用案例、项目预算等方面的野生动物监测模型的准确性:
-
高质量摄像头
-
低质量摄像头
-
红外线、热成像摄像头
-
灰度与彩色(RGB)输入
-
镜头焦距
-
输入图像像素密度
数据收集
使用 Edge Impulse,您可以在项目中上传和标记数据的多种选项:
网页上传工具允许您直接从计算机上传文件到您的 Edge Impulse 项目中,支持多种文件格式。您还可以根据文件名自动为您的样本标记。
CLI 上传工具允许您从计算机的命令行终端直接上传文件到 Edge Impulse 项目,支持多种文件格式和输入选项。您还可以根据文件名自动为您的样本标记。
编写数据收集脚本,通过简单调用摄入 API,连接您的平台到 Edge Impulse 项目。使用您选择的脚本语言,您可以设置定时器和触发器,以便自动上传图像到您的项目,使用您的Edge Impulse 项目 API 密钥。
直接从您的云数据存储桶中提取数据,并在您的 Edge Impulse 项目中自动触发响应(此功能特别适用于使用主动学习策略随时间改进模型)。
关于 Edge Impulse 数据采集格式的更多细节可以在Edge Impulse API 参考文档中查看。
将您的设备直接连接到 Edge Impulse 进行数据收集
有多种方法可以直接从您选择的平台上传数据到您的 Edge Impulse 项目。
如果您选择的设备平台得到官方支持,您可以根据Edge Impulse 开发板文档中找到的您目标设备的固件更新指南进行操作。
如果您选择的设备平台未经官方支持,请参考开发平台移植指南,将 Edge Impulse 的摄取 API完全集成到您的嵌入式设备固件中(请注意,移植通常耗时且大多数项目不必要,除非您希望您的目标出现在Edge Impulse 社区论坛页面上),或者使用Edge Impulse CLI 串行数据转发器,快速轻松地通过串行端口或 WebUSB 将数据注入到您的 Edge Impulse 项目中。
您还可以使用手机或计算机直接从设备上的摄像头上传新图像;通过项目的设备标签查看所有设备连接选项(参见图 11-2)。

图 11-2. 设备标签中的“收集数据”视图
iNaturalist
由于大多数人可能没有大量入侵物种图像数据集可供使用,因此我们需要通过第二种数据收集形式来开始我们的入侵动物图像数据集。在本教程中,我们将不会在野外设置设备来收集动物的新的未标记的原始图像,而是将使用社区中已经标记了我们目标物种名称的图像。使用iNaturalist,我们将查询他们的数据库以获取包含我们识别的物种图像的数据集,查询此物种名称,并下载具有 iNatural 图像 ID 和每个文件下载的摄影师用户名的数据集。
您将需要一个 iNaturalist 帐户登录iNaturalist 导出网站,并处理以下查询。
首先,我们将查询我们期望的捕捉动物物种名称,并在 iNaturalist 中检索一个包含以下列的 CSV 文件:id、user_login、quality_grade、license、url、image_url(见示例 11-1 和图 11-3)。
示例 11-1. 查询 Callosciurus finlaysonii
q=Callosciurus+finlaysonii&search_on=names&has%5B%5D=photos
&quality_grade=any&identifications=any

图 11-3. 选择用于 CSV 文件的列
我们还需要一个图像数据集,其中包括“未知”物种的图像或荷兰环境中不包括Callosciurus finlaysonii(或任何动物)的图像。这些“未知”数据将帮助我们训练模型,更准确地预测我们的设备是否拍摄/捕捉到了我们设置的目标动物。使用以下列在 iNaturalist 中查询此类数据:id、user_login、quality_grade、license、url、image_url(参见示例 11-2 和图 11-4)。
示例 11-2. 查询荷兰地区 ID 7506(荷兰)的未标记图像
search_on=place&has[]=photos&quality_grade=any&identifications=any
&iconic_taxa[]=unknown&place_id=7506

图 11-4. 选择用于 CSV 文件的列
下载从上述查询中生成的 CSV 文件,并将文件保存到您的计算机上。
现在,使用我们生成的 CSV 文件,使用 示例 11-3 中的 Python 代码下载和保存 iNaturalist 查询的图像到您的计算机,同时也将下载的文件归因于原始 iNaturalist 上传者的用户名。运行脚本两次,一次用于您的陷阱动物图像,另一次用于“未知”图像。将这些文件保存在两个不同的目录中,例如 /unknown/ 和 /animal/(参见 示例 11-3)。
如果您还没有安装 requests 包,您可能需要通过 pip 安装它:python -m pip install requests。
示例 11-3. 从 iNaturalist 下载图像的 Python 代码
import csv
from pathlib import Path
import requests
directory = Path("unknown") # Replace directory name, "unknown" or "animal"
directory.mkdir(parents=True, exist_ok=True)
with open("observations-xxx.csv") as f: # Replace csv filename
reader = csv.reader(f)
next(reader, None) # skip header row
for data in reader:
# filename is constructed as id.user_login.extension
id_, user_login, url = data[0], data[1], data[5]
extension = Path(url).suffix
path = directory / f"{id_}.{user_login}{extension}"
img = requests.get(url).content
path.write_bytes(img)
如果您想要删除图像 URL 中的查询参数(如上文所述),请将 Path(url).suffix 替换为 Path(url.split("?")[0]).suffix。
根据您的 iNaturalist 查询结果的大小和条目数量,此脚本的运行时间可能会有所不同。对于此用例,建议将 iNaturalist 查询结果限制在 4,000 条以下。您可以通过更改查询设置,仅包括研究质量的图像、来自特定地点 ID 的图像等方式,减少 iNaturalist 查询的输出。您可以通过访问 iNaturalist 网站,在 Identify 搜索栏的 Place 文本框中输入一个位置,然后在按下 Go 后,Place ID 值将在 URL 中显示。例如,纽约市的地点 ID 是 674:https://www.inaturalist.org/observations/identify?place_id=674。
数据集限制
即使从 iNaturalist 获取了一个强大的数据集,仍然会出现许多限制。当摄像机记录到未标记动物的多次检测时,无法确定这些图像是代表多个移动个体还是一个个体重复进入摄像头视野区域。¹¹
iNaturalist 也倾向于选择在图像框架内部接近/大的动物图像。这种动物图像的偏差可能会降低实际世界中生成的机器学习模型的准确性,因为近距离的图像倾向于不包括周围环境的大背景,导致模型期望每个动物都靠近摄像头镜头。
为了抵消这种偏差,可能需要采取“主动学习”方法来随着时间的推移改进模型——即,最初部署次优模型以捕捉目标生物的新图像,直接将这些新图像存储在设备上或上传到云存储桶,然后确认图像中的动物位置,标记并将其上传到我们项目的原始训练数据集,最后重新训练模型并重新部署到设备上。
数据集许可和法律义务
在创建 Edge Impulse 帐户时,每位 Edge Impulse 用户必须遵守以下使用条款、许可证和政策:
假设您遵守上述规则和条件,一旦您将模型创建并部署到设备上,您无需订阅或支付费用;截至撰写本书时(2022 年),所有免费的 Edge Impulse 用户都可以免费将其模型分发并部署到无数的生产设备上。如果您的数据原本是您自己的,您在整个边缘 AI 模型的生命周期中都保留您的知识产权。
如果您使用从第三方网站(如 iNaturalist)下载的数据集,则需要确保您获取的数据可以重新分发或用于商业用途。有关 iNaturalist 使用条款的更多详细信息可以在其网站上查看。
对于任何其他数据集,请确保您在合法、公正和道德的基础上获取、分发和使用数据。许多数据集收集网站会使用像知识共享、Apache 等许可证。在用于边缘机器学习模型训练和测试的目的时,您需要在使用这些数据集时做出最佳判断。如果有任何疑问,请通过电子邮件联系数据集所有者或数据收集网站支持团队,以获取有关数据使用要求、归属义务和法律澄清的更多信息。
清理您的数据集
因为我们已经从 iNaturalist 下载了我们的图像数据集,并已经使用与其关联的机器学习类别标记了我们的图像,所以在将图像上传到 Edge Impulse 项目之前,我们无需进行太多的数据集清理工作。
然而,如果您有一小部分标记图像的数据集和一大部分关联但未标记的图像数据集,Edge Impulse 提供名为“数据浏览器”的工具,允许您使用预训练模型(参见图 11-5),先前训练过的 impulse 或您的预处理块来批量标记训练或测试数据集中的未标记图像。当然,如果您尚未在数据的较小子集上训练模型,则此工具将无法工作,例如,像 MobileNetV2 那样,唯一的物种名称并未预先训练在现有的 ImageNet 上。您还可以选择两种不同类型的降维技术,t-SNE(适用于较小的数据集)和 PCA(适用于任何数据集大小)。

图 11-5. Edge Impulse Studio 数据浏览器
将数据上传到 Edge Impulse
根据 iNaturalist Python 数据下载脚本,将图像上传到您的 Edge Impulse 项目(参见图 11-6),使用 Edge Impulse 项目的网页 GUI,或使用以下Edge Impulse CLI 上传工具命令,确保将 [your-api-key] 替换为您的 Edge Impulse 项目的 API 密钥,[label] 替换为“unknown”或陷阱动物的名称,[directory] 替换为您在 iNaturalist Python 脚本中指定的文件目录:
$ edge-impulse-uploader --api-key [your-api-key] --label [label] \
--category split .[directory]/*

图 11-6. 将现有数据集上传到 Edge Impulse 网页上传工具
网页 GUI 和上传 CLI 都允许您将上传的图像自动分割为训练和测试数据集,按 80/20 的比例分割(大多数机器学习项目的良好比例)。
DSP 和机器学习工作流程
现在,我们已将所有图像上传到我们的训练和测试数据集中,我们需要使用数字信号处理(DSP)方法提取我们原始数据的最重要特征,然后训练我们的机器学习模型以识别图像提取特征中的模式。Edge Impulse 将 DSP 和 ML 训练工作流程称为“脉冲设计”。
您的 Edge Impulse 项目的“脉冲设计”选项卡允许您查看和创建全面的端到端机器学习流水线的图形简单概述。最左边是原始数据块,Edge Impulse Studio 将摄取并预处理您的数据;在我们的情况下,对于图像,它将规范化所有图像,使它们具有相同的尺寸,并且如果尺寸不是正方形,则会通过您选择的方法裁剪图像。
接下来是 DSP 块,我们将通过开源数字信号处理脚本提取图像的最重要特征。一旦生成了我们数据的特征,学习块将根据我们期望的架构和配置设置来训练我们的神经网络。
最后,我们可以查看部署输出信息,包括我们希望我们训练过的机器学习模型分类的期望类别。
在 Edge Impulse 项目中,设置您的“Impulse design”选项卡与 Figure 11-7 相同,或通过从各种块弹出窗口中选择来进行设置,然后点击保存脉冲:
图像数据
-
图像宽度:160
-
图像高度:160
-
调整模式:适合最短轴
处理块
- 图像
学习块
- 迁移学习(图像)

图 11-7. 脉冲设计选项卡配置
数字信号处理块
在本章介绍的项目中,我们将使用 Edge Impulse Studio 默认包含的 Image DSP 算法。我们在“Impulse design”选项卡上选择的这个图像处理块是预先编写的,并可以在平台上免费使用和部署。图像块中使用的代码可以在Edge Impulse GitHub 仓库“processing-blocks”中找到。您还可以在“Image feature detection”中了解更多有关 Spectral Analysis 算法的详细信息。
如果您想要为 Edge Impulse Studio 编写自己的定制 DSP 块,可以通过遵循Edge Impulse 自定义处理块教程使用您选择的语言轻松完成。
然而,如果您决定为应用程序编写自己定制的 DSP 处理块,请注意,您需要编写相应的 C++实现,以便您的模型部署按预期工作在 Edge Impulse SDK 中。在 Edge Impulse Studio 中使用现成的 DSP 块是一个重要优势,因为它可以从数据收集到特征提取再到部署的整个开发时间——您不需要在应用程序端编写任何自定义的 C++代码;一切都已经集成在部署库中,准备好进行编译。
在导航侧边栏的图像选项卡中,将颜色深度保持 RGB,并点击“保存参数”。现在,选择“生成特征”以创建“Feature explorer”的视图(见 Figure 11-8)。

图 11-8. 图像 DSP 块和特征探索器
机器学习块
现在我们准备训练我们的边缘机器学习模型了!在 Edge Impulse 中有多种训练模型的方式,最简单的是可视(或 Web GUI)编辑模式。但是,如果您是机器学习工程师、专家,或者已经具有使用 TensorFlow/Keras 编码的经验,那么您也可以在 Edge Impulse Studio 中的本地或专家模式中编辑您的迁移学习块。
我们可以从“转移学习”选项卡设置项目的神经网络架构和其他训练配置设置。
视觉模式
配置和设置我们的机器学习训练设置和神经网络架构的最简单方法是通过 Edge Impulse 的视觉模式,或者在导航栏中选择“冲动设计”下的“转移学习”选项卡时的默认视图。保存带有转移学习块的冲动时,默认应用以下设置(参见图 Figure 11-9);如果您的项目中这些设置不同,请复制这些设置到您的转移学习块配置中:
-
训练周期数:100
-
学习率:0.0005
-
验证集大小:20%
-
自动平衡数据集:未选中
-
数据增强:未选中
-
神经网络架构:MobileNetV2 96x96 0.35(最终层:16 个神经元,0.1 的丢弃率)

图 11-9. 默认迁移学习神经网络设置
一旦您输入了这些设置,您只需点击“开始训练”,在神经网络架构配置下方生成您的训练作业,将其发送到 Edge Impulse 服务器上。生成的作业将会精确地训练您的模型,就像在本地计算机上运行 TensorFlow/Keras 脚本一样。通过使用 Edge Impulse,我们无需使用本地计算机的资源,而是利用 Edge Impulse 免费为所有开发者提供的云计算时间。根据您的数据集大小,此训练步骤可能需要一些时间,此时您可以选择“训练输出”视图上的铃铛图标,在作业完成时收到电子邮件通知,并查看训练结果的输出(参见图 11-10 和 11-11)。

图 11-10. 训练作业通知铃铛图标

图 11-11. 配置作业通知设置
当您的模型训练完成后,您可以在“模型 > 最后训练性能”视图中查看迁移学习结果(参见图 Figure 11-12)。

图 11-12. 默认块配置的迁移学习结果(准确率为 76.3%)
考虑到到目前为止我们所做的一切仅仅是上传了训练和测试数据集,用图像 DSP 块提取了最重要的特征,并使用了默认的块配置设置进行了模型训练,而没有编写任何代码,这些结果还是相当不错的!76.3% 的结果是一个相当不错的初始准确率,考虑到我们对神经网络架构、DSP 块等并没有进行任何自定义配置来适应我们的特定用例。然而,通过使用 Edge Impulse 提供的其他工具,如 EON 调谐器,我们可以进一步提高模型的准确性,下一节将对此进行描述。
专家模式
您是机器学习工程师,或者已经知道如何在 Python 中编写 TensorFlow/Keras 代码吗?在 Edge Impulse 中使用专家模式选项,通过点击“神经网络设置”右侧的三点下拉按钮,可以上传您自己的代码或本地编辑现有的块代码,选择“切换到专家(Keras)模式”或“本地编辑块”。
EON 调谐器
自动机器学习工具是有价值的工具,可以自动选择和应用最佳的机器学习算法来处理您的数据,并自动调整您的机器学习模型的参数,从而进一步提高其在边缘设备上的性能。Edge Impulse Studio 在您的项目中提供了一个名为 EON 调谐器的自动机器学习工具。EON 调谐器将并行评估许多候选模型架构和 DSP 块(根据您的目标设备和延迟要求进行选择),以帮助您找到最适合您的机器学习应用的性能最佳架构。
在您的 Edge Impulse 项目的 EON 调谐器选项卡中,配置如 图 11-13 所示的设置。
从 EON 调谐器的配置下拉设置中选择以下选项:
-
数据集类别:视觉
-
目标设备:Cortex-M7(或任何其他支持的平台;如果您不使用官方支持的平台,请选择硬件内部结构与您的设备最相似的平台)
-
推断时间(毫秒):100

图 11-13. EON 调谐器配置设置
然后点击“启动 EON 调谐器”,如 图 11-14 所示。

图 11-14. 启动 EON 调谐器
将 EON 调谐器的结果与默认的边缘脉冲项目中包含的默认图像分类块进行比较,我们可以看到它们之间存在显著差异。通过自动机器学习工具,我们可以更快速、更高效地确定适合我们用例的更佳性能的神经网络架构、DSP 块、参数等。
图 11-15 展示了使用图像 RGB DSP 块和原始“迁移学习”神经网络块的默认块结果,其中 MobileNetV2 96x96 0.35(最终层:16 个神经元,0.1 的丢弃率),100 个训练周期和 0.0005 的学习率。

图 11-15. 使用 EON 调谐器块配置的迁移学习结果(准确率 89.5%)
一旦 EON 调谐器自动机器学习作业完成,我们可以看到结果。对于图 11-16 中显示的 EON 调谐器结果,第一个结果达到了 90%的准确率;然而,由于 RAM 和 ROM 都超出了我们目标硬件规格,我们将选择第二个最佳选项,准确率为 89%。

图 11-16. EON 调谐器结果矩阵(不超过目标 RAM 的最佳结果为 89%准确率)
基于这些结果,我们肯定希望使用 EON 调谐器为我们的用例自动生成的块更新主块信息。在最佳准确率配置旁边,点击选择按钮并更新主模型,如图 11-17 所示。

图 11-17. 使用 EON 调谐器更新主模型
等待 Studio 在您的项目中更新“脉冲设计”块(参见图 11-18),然后点击“迁移学习”,查看您更新的训练模型结果、准确率和延迟计算,如图 11-19 所示。

图 11-18. EON 调谐器神经网络设置

图 11-19. 使用 EON 调谐器更新的主迁移学习模型
测试模型
Edge Impulse 提供多种类型的测试和验证工具,以增加您对训练的机器学习模型或脉冲在实际环境准确性的信心。在完成训练脉冲后,您可以访问项目导航栏上的“实时分类”和“模型测试”选项卡。
测试您的音频模型与性能校准
如果您开发了一个音频陷阱,如“深入探讨:利用 Lacuna Space 进行鸟类声音分类演示”所述,则还可以在您的 Edge Impulse 项目中使用性能校准模型测试和真实世界性能调谐器。
实时分类
从“实时分类”选项卡,您可以测试来自测试数据集的单个测试样本与您训练的模型,或者连接您的设备实时录制新图像和测试样本,然后查看图像的提取特征和结果分类结果和推理预测(参见图 11-20)。

图 11-20. 实时分类
通过安装的 Edge Impulse 设备固件或通过 Edge Impulse CLI 数据转发器将官方支持的设备连接到“实时分类”选项卡;例如,连接 Arduino Nano 33 BLE Sense 到您的项目,在设备的环境中通过以下 CLI 命令拍摄新的测试图像:edge-impulse-daemon。按照 CLI 提示连接您的设备到项目并记录新样本。
或者在“分类现有测试样本”中加载现有的测试数据集图像,以查看该样本的提取特征及您训练模型的预测结果(如图 11-21 所示)。

图 11-21. 实时分类结果
模型测试
您还可以通过导航到您项目的“模型测试”选项卡,对您的测试数据集进行批量分类,与您训练的模型进行对比(参见图 11-23)。从这里,您可以选择“全部分类”按钮,自动收集测试数据的推理结果和模型预测,并呈现在一个长表格中。您还可以通过单击“设置置信阈值”的三个点下拉按钮在此设置模型推理结果的置信阈值(如图 11-22 所示)。阈值分数决定了对训练的神经网络信任程度。如果置信评分低于您设定的值,样本将被标记为“不确定”。您可以使用带有“不确定”标记的推理结果,通过“主动学习”模型开发策略进一步提高模型的准确性;上传这些不确定图像,标记它们,重新训练您的模型,并重新部署到您的边缘设备!查看图 11-23 以获取模型测试结果。

图 11-22. 设置置信阈值

图 11-23. 模型测试选项卡结果
本地测试您的模型
您还可以下载所有中间块结果和训练模型信息,通过任何您希望的方法在本地测试您的模型——例如,使用 Python 脚本进行测试,如您通常为 TensorFlow/Keras 工作流程所做。导航到您的 Edge Impulse 项目的仪表板,查看所有可用的块输出文件,如图 11-24 所示。

图 11-24. 下载块输出
部署
恭喜!您刚刚完成了收集和标记训练和测试数据集,使用 DSP 块提取数据特征,设计和训练机器学习模型,并使用测试数据集测试模型的过程。现在我们已经拥有了在边缘设备上进行推理所需的所有代码和模型信息,我们需要将预构建的二进制文件刷入设备,或者将 C++库集成到我们的嵌入式应用程序代码中。
选择您的 Edge Impulse 项目的部署选项卡,并按照下一节中的多个部署选项的步骤之一来在边缘设备上运行您训练好的机器学习模型。
创建库
为了简化开发体验,Edge Impulse 提供了许多预写的代码示例,用于将部署的模型集成到嵌入式应用固件中。使用官方支持的开发板将允许最快的部署和最少的开发时间,因为您可以将预构建的固件应用程序拖放到开发板上,或者从Edge Impulse GitHub 组织克隆板的开源固件存储库,该存储库包含开始嵌入式应用程序开发和调试过程所需的所有设备固件和驱动程序。
如果您将模型部署到“非官方支持”的平台,有许多资源可帮助您将 Edge Impulse SDK 集成到您的应用程序代码中,无论库部署选项如何:
多数使用“非官方支持”的设备的项目,将使用位于项目部署选项卡“创建库”视图下的 C++库选项部署(见图 11-25)。该 C++库是可移植的,没有外部依赖,并且可以使用任何现代 C++编译器进行编译。
自定义处理块
如果你决定在你的 Edge Impulse Studio 项目中使用自定义的 DSP 块,你需要编写 DSP 块的等效 C++实现,并将其集成到 Edge Impulse SDK 代码中。更多信息可以在Edge Impulse 文档中找到。

图 11-25. 创建一个开源库
手机和电脑
通过单击 Edge Impulse 的“计算机”和“手机”部署选项,快速将您的模型部署到边缘。这些部署选项利用一个开源移动客户端固件,为您训练的脉冲构建一个 WebAssembly 库,可以直接从手机或计算机上的摄像头对全新数据进行分类。如果您在训练/测试数据集中使用默认/集成传感器类型,则此选项非常适合快速模型原型设计和测试,因为您不需要为此部署选项编写任何代码。
对于这个项目,因为我们的训练和测试数据只是图像,我们可以使用手机上的摄像头直接在边缘上测试我们的模型,通过手机的网络浏览器缓存和集成摄像头数据(参见图 11-26)。

图 11-26. 直接运行您的脉冲(手机和电脑)
从您项目的部署选项卡中选择“计算机”或“手机”图标,然后点击生成。如果您使用的是手机,请使用手机摄像头扫描生成的 QR 码,并在手机的网络浏览器中打开 URL。允许移动客户端访问您手机的摄像头,并等待项目生成。现在,您可以在手机上直接查看您的训练相机陷阱模型在边缘上运行,并打印您的推理结果!在图 11-27 中查看结果。

图 11-27. 在手机部署上运行的相机陷阱模型
预构建二进制刷写
从部署选项卡中,在“生成固件”下选择您的官方支持的 Edge Impulse 开发平台,然后选择生成。您还可以选择使用 EON 编译器,它使您可以使用 25-55%更少的 RAM 和高达 35%更少的闪存来运行神经网络,同时保持与 TensorFlow Lite for Microcontrollers 相同的准确性,详见¹²。
然后,按照部署选项中显示的说明,通过拖放或刷写生成的固件应用程序到您的官方支持平台。关于刷写预构建二进制文件的更深入说明可以在您选择的开发平台的Edge Impulse 文档中找到。
对于这个项目,我们将选择“OpenMV Library”部署选项,在OpenMV Cam H7 Plus上运行我们的训练模型,如前文所示图 11-25。
按照 Edge Impulse 网站上的 OpenMV 部署文档 的说明下载并安装软件先决条件。然后将您的模型固件的下载 ZIP 文件解压并将 labels.txt 和 trained.tflite 文件拖放或复制到您插入的 OpenMV Cam H7 Plus 的文件系统中。在 OpenMV IDE 中打开 ei_image_classification.py 脚本。通过 USB 图标连接到您的 OpenMV Cam 板并运行 Python 脚本,在串行终端视图中查看在边缘上运行的模型推断结果,如 图 11-28 所示。

图 11-28. OpenMV IDE 模型部署到 OpenMV Cam H7 Plus
脉冲运行者
您还可以使用 Edge Impulse CLI 通过 USB 串行连接到您选择的官方支持平台下载、部署和运行您的模型。或者使用 Edge Impulse Linux runner 在 Raspberry Pi 4 或其他 Linux 设备上下载、部署和运行 Edge Impulse 模型。
GitHub 源代码
本章中使用的应用程序源代码,包括来自公共 Edge Impulse 项目 的部署库和完成的应用程序代码,可在 GitHub 仓库 上查看和下载。
迭代和反馈循环
现在您已经将第一次迭代的野生动物监测模型部署到边缘设备,您可能对结果感到满意,并停止在这里进行开发。然而,如果您希望进一步迭代您的模型并随着时间或新获得的设备升级进一步提高准确性,例如,有许多适应和变体需要考虑和改进这个项目:
-
为不同动物添加更多的机器学习类别到您的模型中。
-
创建用于入侵植物物种的相机陷阱而不是动物:用于当地园艺/觅食等目的。
-
使用不同的传感器实现相同的目标 —— 即,使用气体传感器进行野生动物保护陷阱,或将相机训练数据输入从标记图像转换为物种目标检测的边界框(参见 “对象检测和分割”)。
-
使用同样的模型实现不同的目标或将其放置在不同的环境中,以改进“未知”类别。
-
利用多种传感器的组合进一步提高模型的准确性 —— 即,相机 + 音频输入,音频 + 气体输入等。
您还可以在 Edge Impulse 中创建多个项目,为多个设备位置创建多个不同的机器学习模型,并对其他捕捉动物进行分类。例如,您可以在初始数据集中为多个动物物种使用相同的撒哈拉沙漠模型,并仅替换主要物种,然后重新训练和部署。这允许您在另一个环境中使用与您用于一个环境相同的模型配置。
AI for Good
本书始终强调了在道德上使用所描述的机器学习工具和知识的重要性。许多公司已经开始将“技术为善”理念付诸实践——从 Edge Impulse 到 Google,已经建立了许多环境/野生动物保护的努力和承诺:
-
Edge Impulse 的承诺 给地球 1% 的贡献
-
Google, “鲸鱼歌谣”故事
-
Microsoft, AI for Good
相关作品
正如本章所述,摄像陷阱和保护陷阱已经成为研究和道德狩猎实践中已知并广泛采用的设备。接下来的章节描述了关于道德摄像陷阱的各种设备、数据集、研究文章和书籍,用于解决各种濒危物种减少和保护现有种群的问题。
本书还在每页脚注中注明了本章节中摄像陷阱的各种应用、方法、设备和引用的来源,包括研究和商业采用。
数据集
在互联网上有许多现有的数据集和数据集收集平台可供此类用例使用。通过简单的谷歌搜索可以找到许多结果;然而,以下是几个适用于我们用例的数据收集平台和研究数据集:
再次强调,请确保您在使用每个数据集时都是出于道德目的,并确保您的模型的目标物种在设备安装的位置/地区中不被视为濒危或受威胁。
研究
-
Ahumada, Jorge A. 等人 Wildlife Insights: A Platform to Maximize the Potential of Camera Trap and Other Passive Sensor Wildlife Data for the Planet. 剑桥大学出版社, 2019.
-
Apps, Peter, 和 John Weldon McNutt. “摄像机陷阱是否适用?摄像机陷阱性能的严格、可重复和真实测试”。Wiley Online Library, 2018 年。
-
Fischer, Johannes H. 等人。“用于鉴定、年龄鉴定、性别鉴定和研究婆罗洲冠雉的摄像机陷阱研究的潜在价值”。ResearchGate,2017 年。
-
Jang, Woohyuk, 和 Eui Chul Lee。“包括外观相似亚种的多类鹦鹉图像分类”。MDPI,2021 年 11 月 5 日。
-
O’Brien, Timothy G., 和 Margaret F. Kinnaird。一图胜千言:摄像机陷阱在鸟类研究中的应用。Cambridge University Press,2008 年。
-
O’Connell, Allan F. 等人,编辑。Camera Traps in Animal Ecology: Methods and Analyses。Springer Tokyo, 2011 年。
-
Rovero, Francesco 等人。“哪种摄像机陷阱类型和数量我需要?” Hystrix 24 (2013 年)。
-
Shepley, Andrew 等人。“使用公共数据源在摄像机陷阱图像中进行自动位置不变动物检测”。ResearchGate,2021 年。
¹ 查看国家野生生物联合会的文章,“栖息地丧失”。
² 查看网站,“联合国 AI for Good”。
³ 查看谷歌的网站,“AI for Social Good”。
⁴ 查看微软的网站,“AI for Good”。
⁵ 阿布·纳瑟·莫辛·侯赛因等人,“评估摄像机陷阱作为提高热带保护区野生动物犯罪检测率工具的效力”,《生物保护》201 (2016): 314–19。
⁶ 来自阿布·纳瑟·莫辛·侯赛因等人的文章,《全球摄像机陷阱数据中的穿山甲:生态监测的意义》Conservation 201 (2016): 314–19。
⁷ 查看保罗·D·米克等人的文章,“动物能听到和看到摄像机陷阱”。
⁸ 查看《卫报》的这篇文章:“报告澄清世界自然基金会未参与保护区护林员暴力行为”。
⁹ 《泰国松鼠》,荷兰食品安全局,2022 年。
¹⁰ 这篇文章提供了一些更多信息:Fischer 等人,“用于鉴别、年龄、性别和研究婆罗洲六鸡的摄像机陷阱研究的潜在价值”。
¹¹ 查看 Neil A. Gilbert 等人的文章,“基于摄像机陷阱数据的未标记动物丰富度估计”。
¹² 查看 Jan Jongboom 的博客文章,“介绍 EON:神经网络内存减少 55% 和 ROM 减少 35%”(Edge Impulse,2020)。
¹³ 查看 Aurelien Lequertier 等人的博客文章:“利用 Lacuna Space 和 The Things Network 在偏远地区进行鸟类分类”,Edge Impulse,2021。
第十二章:用例:食品质量保证
工业边缘人工智能用于食品质量保证,可以自动检测和修正食品缺陷,预防食品变质。通过训练机器学习模型来识别食品图像中或来自各种工业传感器中指示缺陷的模式来实现。然后将模型部署到边缘设备(如摄像头),以实时自动检测和修正缺陷。这有助于确保食品质量最高,并最小化浪费。
通过使用边缘人工智能,可以通过更有效地监控和管理食品生产和分配来预防食品浪费。例如,如果食品变质,可以使用边缘人工智能跟踪问题并采取纠正措施。在本章中,我们将讨论各种使用边缘人工智能进行食品质量保证的方法,它们的相关传感器和设备配置,以及我们选择的方法和用例解决方案的深入教程。
探索问题
“食品质量保证”这个术语在这一章节中涉及的概念过于宽泛,只依靠一个机器学习模型无法解决这样一个庞大的问题;因此,在本书中,我们将侧重于在家庭厨房环境、食品产品制造线或杂货店的冷藏货架上预防和减少食品浪费方面的食品质量保证。
防止食品浪费可以采取多种形式。从目标的角度来看,我们可以生成一个机器学习模型,可以识别食物何时即将变质或已经变质,或者可以创建一个模型,识别食品制造环境或产品处理不当的因素,这些因素会导致食源性疾病的发生。这两种方法都达到了相同的目标,即预防和减少食品浪费,但可能需要不同的机器学习分类和传感器输入的组合来解决。
在智能工厂中部署边缘人工智能设备还可以提高生产率和改善质量。将人工智能引入制造过程可以帮助减少错误并节省时间和金钱。通过使用连接到云端的智能手机,质量控制人员可以从任何地方监控制造过程。通过应用机器学习算法,制造商可以立即检测到错误。¹
探索解决方案
工业 4.0,或称为“第四次工业革命”的口头术语,概念化了由于日益增长的互联和智能自动化在 21 世纪引起的技术、行业和社会模式和过程的迅速变化。²
工业 4.0 的主要趋势
-
智能工厂
-
预测性维护
-
3D 打印
-
智能传感器(农业和食品行业)
边缘人工智能在食品质量保证中的应用越来越广泛,因为人工智能可以帮助检查食品中的污染物、测试食品的质量,甚至在问题发生之前预测食品安全问题。食品质量保证是一个确保我们消费的食品安全和高质量的过程。这个过程包括多种步骤,如检查食品中的污染物、测试食品的质量,以及保持清洁和安全的食品处理实践。通过遵循这些步骤,我们可以帮助确保我们食用的食品安全且质量良好。
我们可以通过思考和研究现有的问题和导致食品变质、过敏原、交叉污染制造过程等因素来直观地思考如何将边缘人工智能和机器学习应用于食品质量保证问题。通过深入研究这些现有的研究领域和行业,将出现许多与传感器和机械设备相关的问题。通过简单地利用现有的传感器或向现有的机械结构添加一个小型的、微创的微控制器,我们可以识别已建立数据集和传感器配置中的新模式,甚至通过称为“传感器融合”的概念创建全新的传感器(“虚拟传感器”)(参见“组合特征和传感器”)。
目标设定
食品安全很重要,因为它有助于确保我们消费的食物不含有害污染物。这些污染物可以来自多种来源,包括细菌、病毒和化学物质。通过遵循食品安全准则,我们可以帮助减少因食用受污染食物而患上食源性疾病的风险。
食品变质的因素
有许多因素可能导致食品变质,包括细菌、病毒、真菌、化学物质和其他各种环境因素,包括:
-
外部热/冷
-
内部温度
-
氧气
-
盐
-
湿度
-
废物暴露
-
湿气
-
光线
-
原生动物
人工智能工具在食品质量保证中非常重要,以确保食品生产线上的工人健康和消费者购买的食品产品的安全,同时减少整体食品浪费并减少气候变化和对环境的负面影响。食品质量保证边缘人工智能还代表了一个探索其他有意义社会影响领域的机会,例如帮助那些有食物过敏的人确定哪些食物根据他们自己的个性化过敏矩阵是安全的或不安全的。
解决方案设计
在本书中,我们选择设计和实施一种低成本、高效、易于训练的食品质量保证边缘 AI 模型,以减少食品浪费,该模型使用带有气体传感器附件的微控制器。然而,检测食品变质的边缘 AI 模型不仅需要使用气体传感器。通过本章和整本书提出的原则和设计工作流程,可以实现许多其他类型的机器学习模型和应用,用于食品质量保证,包括使用摄像头图像输入来监控食品安全法规和设备,使用各种环境传感器识别各种食源性疾病或过敏原,等等。
已经存在哪些解决方案?
食品质量保证一直是许多公司的首要任务;对于依赖易变食品产品在售出之前或变质或变味之前出售的杂货店,任何能够帮助提高利润并减少食品浪费的技术或解决方案都是高价值的投资。Uber 也已经开始利用 AI 的进展来避免食品配送损失,例如Michelangelo,Uber 的机器学习平台。这一模型预测餐食的预计送达时间,并通过实时反馈和估算计算过程的每一部分,帮助送餐司机和餐厅将 Uber Eats 用户的订单从餐厅厨房送到他们的家。
地方政府也对每天浪费的食物数量的预防和减少有很大的利益。联合国粮食及农业组织估计,全球每年浪费了 13 亿吨食物,几乎是所有生产的三分之一。这足以喂养超过 8.15 亿人,四倍于实际需求。
食品质量保证的概念和 AI 解决方案也被应用于帮助那些患有各种食物相关过敏的人。全球最小、最快的消费者食物过敏原传感器,Allergy Amulet,允许最终用户收集他们食物的样本,并在几秒钟内接收到是否存在食物过敏原的报告。
解决方案设计方法
我们可以通过多种不同的方法来解决我们的问题陈述,以下是其中几种方法的描述:
检测食品变质,无论是消费者还是工业用途。
气体传感器是一种可以检测空气中各种气体存在的设备。它通常用于工业环境中监测危险气体。然而,它也可以用于检测肉类、鱼类或其他特别臭气/气体食品产品即将变质的时候。结合边缘 AI,食品变质设备是工业和家庭环境中减少食物浪费和预防食源性疾病的重要工具。
在冰箱内或食品生产线上安装气体传感器使得 AI 设备用户能尽快了解他们食品的变质状态。传感器可以通过检测空气中的二氧化碳、氨气或其他食物变质时产生的气体水平来工作。通过及早检测这些气体,传感器可以提醒用户或工厂工人在食物污染其他产品之前处理食物。
监测食品安全合规性
在食品行业中,安全与合规是首要任务,并常受到地方政府的监管。确保食品包装线上所有工人穿着适当的食品安全服装,如白大褂、头罩、护目镜和手套,是保护最终消费者的一种方式。计算机视觉模型可以用来跟踪这些信息并识别任何异常。此外,也可以使用音频数据来侦听可能表明食品制备过程存在问题的异常声音。
除了监测适当的生产线服装外,还可以开发模型来跟踪洗手过程,以确保所有工人遵循正确的安全和健康协议。这可以通过音频或其他传感器数据完成。通过跟踪这些数据点,我们可以帮助确保食品制造过程的安全和高效。
监测食品生产质量控制
食品掺假和消费者误导是现代社会不幸的现实。例如,用廉价或低质量的油掺假会严重影响产品中的油质量;在橄榄油中,最常见的掺假品是葵花籽油、玉米油、椰子油和榛子油。为了应对这一问题,在加工的这一部分使用电子鼻检测技术在质量检查方面是一项重大突破。⁵
我们还可以监测食品在整个生产流水线上的温度,从生产到包装到最终的货架存放,或从交付车到顾客手中等等。监测冰箱和冰柜的温度变化以及它们对产品质量的影响(冰晶数量、冷冻烧伤等)以及食物的腐败状态,如是否超过保质期或是否已腐烂,都非常重要。通过实施这些各种质量控制措施,我们可以帮助确保我们消费的食品具有最高可能的质量。
检测交叉污染和食物过敏原
坚果和面筋等过敏原可能导致某些人严重反应,甚至死亡。工厂机器有时会出故障,金属碎片可能会进入食物中。人类对食物的处理也可能引入细菌等污染物。检测食品是否与过敏原接触的方法有几种。首先是检查是否有任何污染的迹象。可以通过观察食物的颜色、质地或气味是否发生变化来进行检查。如果食品的外观或气味与最初包装时不同,可能存在污染。(参见 6)
那么我们如何检测这些潜在问题呢?有几种方法。首先,我们可以查找食物中过敏原的迹象。例如,如果食品成分中列出了坚果或面筋,我们知道它们可能存在于食物中。我们还可以查找金属污染的迹象,如食物中的小金属碎片。最后,我们可以查找人类污染的迹象,如缺少手套或其他保护装备。
先前描述的任何一个用例解决方法都可以帮助确保我们食用的食品安全无污染,促进本章节的用例目标,减少食品浪费,确保总体食品质量,并提高消费者和生产线工人的福祉。
设计考虑因素
为了实现防止和减少食品浪费,提高食品生产/储存质量控制和安全问题的总体目标,在技术上,我们可以利用各种数据源,包括许多不同类型的传感器和摄像头(见表 12-1),以达成类似的目标(减少食品浪费和提高食品安全)。
表 12-1. 完成各种食品质量保证目标的传感器
| 目标 | 传感器 |
|---|---|
| 发现食品包装泄漏 | 气体、湿度、水位、摄像头 |
| 检查食品是否含有污染物或异物 | 摄像头 |
| 食品熟度和质量控制 | 摄像头、温度、气体 |
| 检测食物变质 | 环境、化学、摄像头 |
| 识别食物过敏原 | 环境、化学、气体 |
| 人类食品安全设备/服装识别 | 摄像头、音频 |
| 检测包装过期日期 | 摄像头 |
| 包装线交叉污染 | 摄像头、化学传感器、热像仪、X 射线、红外线、气体 |
在选择您的食品质量保证目标和使用案例时,您还需要考虑如何轻松收集用于训练机器学习模型的大型、健壮和高质量数据集。正如我们在前几章中发现的那样(尤其是在第七章中),您的模型的好坏取决于输入数据的质量。如果您希望创建一个模型来识别特定工厂中的食品安全服装和设备,您可能无法获得足够大的数据集,从而无法在第一次尝试时成功训练高度准确的分类模型。当然,借助“主动学习”等技术,可以将次优的准确率模型部署到您的工厂,并随着新的摄入数据和设备位置的其他环境背景信息,逐步改进模型。
同样,考虑设备的安装位置以及各种传感器和设备的要求:
-
初始数据收集阶段的设备位置。
-
部署后的设备位置。
-
电池供电与 USB 供电与永久电力线供电。
-
环境要求(即水、雾、灰尘和其他可能影响传感器正常使用或破坏设备的环境因素)。
-
传感器需要多久更换一次:它是否有退化寿命周期?
-
传感器是否需要始终开启以实现标称操作参数(即气体传感器烧入规格)?
-
传感器需要多长时间才能达到标称记录状态、温度升温时间等。
环境和社会影响
随着世界人口的增长,我们生产的食品浪费也在增加。据估计,全球生产的食物中超过三分之一被浪费。这意味着每年有 130 亿吨食物被浪费!这不仅是资源的巨大浪费,而且对环境影响巨大。⁷
食品浪费是温室气体排放的主要来源之一。当食物在垃圾填埋场腐烂时,会释放甲烷,这是一种比二氧化碳更强效的气体。减少食品浪费是减少我们对地球影响并减少全球气候变化发展的最简单和最有效的方法之一。⁸
除了环境效益外,减少食品浪费还能对我们的健康产生积极影响。及早发现食品变质或疾病可能消除食物中毒、沙门氏菌和其他食源性疾病的爆发。而减少食物过敏原和交叉污染将改善患有致命食物过敏的人们的生活。
在食品生产线上增加食品安全和质量有利于工人的身体安全和最终消费者的整体健康。质量控制检查员在确保我们所食用食品安全且高质量方面发挥着至关重要的作用。当尽快发现食品质量问题时,我们可以通过识别和清除食物过敏原来减少所有资源的浪费,从而挽救生命。
启动引导
与本章中 Benjamin Cabé的“构建人工鼻子”类似,本章将深入探讨食品质量保证的端到端解决方案,特别是通过识别和分类鲑鱼片的购买日期(希望是新鲜的)与变质情况,从而减少食品浪费。一旦我们收集了带有“变质”和“购买日期/新鲜”气体传感器数据样本的数据集,还将收集第三类数据,即我们环境的“环境”环境,以确保我们训练的机器学习模型能够区分靠近设备时鱼类新鲜度变化时产生的气体数据。
这三类将使我们的分类机器学习模型能够识别出食品质量用例中的鱼类种类。边缘设备从目标边缘平台上的气体传感器连续获取原始样本,并经过训练的机器学习模型推断并确定靠近设备的鲑鱼片是否接近其原始购买日期或者已经变质。如果推测结果和气体信号数据表明鲑鱼片已经变质,将通过网络连接发送或者在设备上存储供人类或云端进一步处理。
定义您的机器学习类别
Table 12-2 显示了使用案例、传感器和数据输入类型的潜在组合,以及用于收集和标记训练和测试数据集的机器学习类别。这些使用案例及其相关的类标签对我们在本章中使用的机器学习算法类型“分类”至关重要。您可以在“分类”中了解更多信息。
Table 12-2. 食品质量用例的机器学习类别
| 使用案例 | 训练数据 | 类标签 |
|---|---|---|
| 食品变质检测 | 气体 | 变质、新鲜、环境 |
| 食品安全服装检测 | 图像(带有边界框) | 安全服装或个人防护装备(PPE) |
| 检测包装过期日期 | 图像(带有边界框) | 过期日期 |
| 检测食品包装漏水 | 水位、湿度、湿度 | 正常、漏水 |
| 食品成熟度/质量控制 | 温度、气体 | 成熟、未熟、过熟、环境 |
在本章中,我们将选择并构建一个食品变质检测的使用案例,利用机器学习传感器数据分类,我们项目的机器学习类别将是“变质”,“购买日期”和“环境”。
数据集收集
要获取有关如何收集干净、健壮和有用数据集的技术和具体信息,请参阅 “获取数据”。您还可以利用各种策略,从多个来源收集数据,以创建自己独特的用例数据集:
-
结合公共研究数据集
-
使用来自像 Kaggle 这样的社区驱动数据收集网站的现有传感器数据集
-
征集同事的帮助,为您的合作 Edge Impulse 项目收集样本
Edge Impulse
如 “Edge Impulse” 中描述的,您将需要创建一个 免费的 Edge Impulse 账户 来按照本章节中描述的指南操作。
要进一步验证在边缘机器学习模型开发中使用 Edge Impulse 的理由,请查看 “端到端平台用于边缘 AI”。
Edge Impulse 公开项目
本章的公开 Edge Impulse 项目 可供使用。
选择您的硬件和传感器
在本书中,我们尽量保持设备无关性,但我们也需要讨论如何使用现成易用的开发工具包来创建这种使用案例的解决方案。因此,本书旨在尽可能地简化硬件选择,使其变得简单、经济和易于访问。
因为 Edge Impulse 已经提供了大量官方支持的开发平台,具有各种集成传感器驱动程序和开源固件,为了这个项目的简单性和我们食品质量保证气体传感器数据的收集,我们将使用 Arduino Nicla Sense ME 上的 Bosch BME688 气体传感器。
硬件配置
Arduino Nicla Sense ME 上的 BME688 气体传感器可以检测到揮發性有機化合物(VOCs)、揮發性硫化合物(VSCs)以及其他气体,如一氧化碳和氢,范围在每十亿份之一(ppb)。
以下是一些其他传感器类型的列表,可以考虑用来改进您特定环境、使用案例、项目预算等食品质量保证模型的准确性:
-
其他气体:氨、甲烷、氧气、CO[2] 等
-
温度
-
压力
-
湿度
-
雷达
-
空气质量
传感器融合
传感器融合是嵌入式系统中的一种流行技术,您可以将来自不同传感器的数据结合起来,以获得更全面或更准确的设备周围世界的视图。更多关于在 “组合特征和传感器” 中组合多个传感器的信息。
数据收集
使用 Edge Impulse,有许多选项可用于上传和标记数据到你的项目;许多常见的数据摄取工具已在“数据收集”中描述过。接下来的章节将讨论我们将在本章中用于食品质量保证的特定数据收集工具。
数据摄取固件
为了从我们的 Arduino Nicla Sense ME 摄取数据,我们需要从Arduino CLI将一个数据摄取的代码烧录到我们的设备上。
然后,使用Edge Impulse CLI,我们将连接我们的设备到我们的项目,并开始从 Nicla Sense 板上的气体传感器录制新的数据样本。
首先,在你的电脑上创建一个新目录,food,并创建一个名为food.ino的新文件,其中包含示例 12-1 中显示的代码。
示例 12-1. Arduino 草图,将 Nicla Sense 的气体数据写入串行终端
/**
* Configure the sample frequency. This is the frequency used to send the data
* to the studio regardless of the frequency used to sample the data from the
* sensor. This differs per sensors, and can be modified in the API of the sensor
*/
#define FREQUENCY_HZ 10
/* Include ----------------------------------------------------------------- */
#include "Arduino_BHY2.h"
/* Constants --------------------------------------------------------------- */
#define INTERVAL_MS (1000 / FREQUENCY_HZ)
#define CONVERT_G_TO_MS2 9.80665f
/* Forward declarations ---------------------------------------------------- */
void ei_printf(const char *format, ...);
/* Private variables ------------------------------------------------------- */
static unsigned long last_interval_ms = 0;
Sensor gas(SENSOR_ID_GAS);
void setup() {
/* Init serial */
Serial.begin(115200);
Serial.println("Edge Impulse sensor data ingestion\r\n");
/* Init & start gas sensor */
BHY2.begin(NICLA_I2C);
gas.begin();
}
void loop() {
BHY2.update();
delay(INTERVAL_MS);
ei_printf("%.2f", gas.value());
ei_printf("\r\n");
}
/**
* @brief Printf function uses vsnprintf and output using Arduino Serial
*
* @param[in] format Variable argument list
*/
void ei_printf(const char *format, ...)
{
static char print_buf[1024] = { 0 };
va_list args;
va_start(args, format);
int r = vsnprintf(print_buf, sizeof(print_buf), format, args);
va_end(args);
if (r > 0) {
Serial.write(print_buf);
}
}
使用Arduino CLI,编译并上传你的代码到 Arduino Nicla Sense ME 板,如示例 12-2 所示。
示例 12-2. Arduino CLI 命令
$ cd food
$ arduino-cli core install arduino:mbed_nicla
$ arduino-cli lib install Arduino_BHY2
$ arduino-cli lib install ArduinoBLE
$ arduino-cli compile --fqbn arduino:mbed_nicla:nicla_sense --output-dir . --verbose
$ arduino-cli upload --fqbn arduino:mbed_nicla:nicla_sense --input-dir . --verbose
将数据上传到 Edge Impulse
现在我们已经将数据摄取的代码烧录到 Nicla Sense 板上,使用 Edge Impulse CLI(edge-impulse-data-forwarder),登录你的项目并连接你的设备,将从你计算机的串口摄取的数据导入到你的 Edge Impulse 项目(见示例 12-3)。
示例 12-3. 将 Nicla Sense 连接到你的 Edge Impulse 项目
$ edge-impulse-data-forwarder
Edge Impulse data forwarder v1.16.0
Endpoints:
Websocket: wss://remote-mgmt.edgeimpulse.com
API: https://studio.edgeimpulse.com
Ingestion: https://ingestion.edgeimpulse.com
? Which device do you want to connect to? /dev/tty.usbmodemE53378312 (Arduino)
[SER] Connecting to /dev/tty.usbmodemE53378312
[SER] Serial is connected (E5:33:78:31)
[WS ] Connecting to wss://remote-mgmt.edgeimpulse.com
[WS ] Connected to wss://remote-mgmt.edgeimpulse.com
? To which project do you want to connect this device?
AI at the Edge / Use Case: Food Quality Assuran [SER] Detecting data frequency...
[SER] Detected data frequency: 10Hz
? 1 sensor axes detected (example values: [9513]). What do you want to call them?
Separate the names with ',': gas
? What name do you want to give this device? Nicla Sense
[WS ] Device "Nicla Sense" is now connected to project "Use Case: Food Quality
Assurance"
[WS ] Go to https://studio.edgeimpulse.com/studio/115652/acquisition/training
to build your machine learning model!
现在,将你的 Nicla Sense ME 放置在你的腐烂或新鲜(购买日期)食物附近(在这种情况下是鲑鱼),或者放在你房间的环境中。
从你的项目的“数据采集”选项卡下,设置以下设置在“记录新数据”下,然后点击“开始采样”。这将通过串行连接告诉你的 Nicla Sense 板开始录制从板载 BME688 气体传感器获取的 20 分钟(1,200,000 毫秒)数据(见图 12-1)。确保输入设备当前录制配置的相应样本标签:
标签
腐烂的、购买日期或环境
样本长度(毫秒)
1200000
传感器
带有 1 个轴(气体)的传感器
频率
10Hz

图 12-1. 数据采集:记录新数据
重复这个过程,直到你的每个机器学习类别的训练数据集和测试数据集之间至少有 20 至 60 分钟的数据(总计)。
使用浏览器自动化进行自动采样
你可以在你的网页浏览器的开发者控制台中轻松地通过 JavaScript 调用来创建一个自动化,以自动重新点击 Edge Impulse 项目中的“开始采样”按钮,每 22 分钟(或 1,320,000 毫秒)一次:
const delay = ms => new Promise(res => setTimeout(res, ms));
while(1) {
document.getElementById("input-start-sampling").click();
await delay(1320000);
};
清理你的数据集
查看提供在“清理数据集”的提示,然后返回到本章。
由于我们将气体传感器样本记录在 20 分钟的长度中,为了更清楚地查看每个样本的内容,我们将样本分割为多个 30,000 ms 的子样本(在这种情况下是 29,880 ms)。在“数据采集”选项卡中,选择样本的三点下拉菜单,然后点击“分割样本”(见图 12-2)。

图 12-2. 数据采集:样本下拉菜单
从“分割样本”视图中,您可以放置大约 30,000 ms 长度的四个子样本;点击“+ 添加样本”以添加更多的分割段,然后点击“分割”(见图 12-3)。
您还可以通过在样本名称旁边的下拉菜单中选择“裁剪样本”选项来裁剪您的样本,如图 12-4 所示。

图 12-3. 数据采集:分割样本

图 12-4. 数据采集:裁剪样本
数据集许可和法律义务
请查看“数据集许可和法律义务”以确定您数据集的许可和法律义务。由于我们直接上传和使用从我们家庭和个人 Nicla Sense 设备通过计算机串口收集的数据,因此我们不需要审查任何数据集许可或法律方面的问题。
然而,如果您同时使用来自公共来源的气体数据或其他传感器数据以及来自设备如 Arduino Nicla Sense ME 的自有气体数据,则在将数据上传到您的训练/测试数据集并使用从该数据训练的结果模型之前,务必审慎查明数据使用规则和归属要求。
DSP 和机器学习工作流程
现在我们已经将所有图像上传到我们的训练和测试数据集中,我们需要使用数字信号处理(DSP)方法提取原始数据的最重要特征,然后训练我们的机器学习模型来识别传感器数据提取特征中的模式。Edge Impulse 将 DSP 和 ML 训练工作流程称为“脉冲设计”。
您的 Edge Impulse 项目的“脉冲设计”选项卡允许您查看和创建全面端到端机器学习管道的图形简单概述。最左侧是原始数据块,Edge Impulse Studio 将摄入和预处理您的数据,并设置您的窗口增加和大小。如果您上传了从以不同频率记录的设备中获取的样本数据,您还可以从此视图对时间序列数据进行下采样或上采样。
接下来是 DSP 模块,我们将通过开源数字信号处理脚本 Flatten 提取我们的气体数据的最重要特征。一旦生成了数据的特征,学习模块将根据我们的所需架构和配置设置训练我们的神经网络。最后,我们可以查看部署输出信息,包括我们希望训练的机器学习模型分类的所需类别,“购买日期”,“损坏”,和“环境”。
在您的 Edge Impulse 项目中,通过选择“脉冲设计”选项卡与图 12-5 中的相同方式进行设置,或通过从各块弹出窗口中选择设置,然后点击“保存脉冲”:
时间序列数据
-
窗口大小:10000 毫秒。
-
窗口增加:500 毫秒。
-
频率(Hz):10
-
零填充数据:已检查 [x]
处理模块
- 展开
学习模块
- 分类(Keras)

图 12-5. 脉冲设计配置
数字信号处理模块
在本章介绍的项目中,我们将使用 Edge Impulse Studio 中默认包含的数字信号处理算法;此展开处理模块预先编写,并可在平台上免费使用和部署。展开模块中使用的代码可以在Edge Impulse GitHub 代码库“processing-blocks”中找到。您还可以在“数字信号处理算法”中了解更多关于各种数字信号处理算法的详细信息。
如果您熟悉编写自己的数字信号处理代码或希望使用自定义的 DSP 模块,请查阅提供的详细信息“数字信号处理模块”。
通过从导航栏中选择展开标签并选择与图 12-6 中显示的相同参数,或通过编辑各复选框和文本输入选择参数,设置您的展开模块,然后点击“保存参数”。
缩放
- 缩放轴:0.001
方法
-
平均值:已检查 [x]
-
最小值:已检查 [x]
-
最大值:已检查 [x]
-
均方根:已检查 [x]
-
标准偏差:已检查 [x]
-
偏度:未检查 [ ]
-
峰度:未检查 [ ]

图 12-6. 展开模块参数配置
现在,点击“生成特征”以查看您数据的特征浏览器(见图 12-7)。

图 12-7. 展开模块特征浏览器
机器学习模块
我们现在准备训练我们的边缘机器学习模型!在 Edge Impulse 中训练模型有多种方式,其中最简单的是可视(或 Web GUI)编辑模式。但是,如果您是机器学习工程师、专家或已经具备使用 TensorFlow/Keras 编码的经验,则还可以在 Edge Impulse Studio 中本地或专家模式中编辑您的迁移学习块。
我们可以在“NN 分类器”选项卡中设置项目的神经网络架构和其他训练配置设置。
可视模式
配置和设置我们的机器学习训练设置和神经网络架构的最简单方法是通过 Edge Impulse 的可视模式,或者在导航栏中选择“脉冲设计”下的“NN 分类器”选项卡时的默认视图(见图 12-8)。将这些设置复制到您的神经网络分类器块配置中,然后点击“开始训练”:
-
训练周期数:50
-
学习率:0.0005
-
验证集大小:20%
-
自动平衡数据集:未选中 [ ]
-
神经网络架构:
-
稠密层(8 个神经元)
-
稠密层(4 个神经元)
-
Flatten 层
-

图 12-8. 神经网络设置
稠密层是全连接层,是神经网络层的最简单形式。我们将其用于从 Flatten DSP 块的输出处理数据。Flatten 层将多维数据转换为单一维度。在返回之前,您需要将卷积层的数据展平。您可以在Edge Impulse 文档中了解更多关于神经网络架构配置的信息。一旦模型训练完成,您可以在“模型:最后训练表现”视图中查看迁移学习结果(见图 12-9)。

图 12-9. 模型:最后训练表现
你已经知道如何在 Python 中编写 TensorFlow/Keras 代码了吗?在 Edge Impulse 中使用“专家模式”选项,通过选择“神经网络设置”块标题右侧的三点下拉按钮来上传您自己的代码或本地编辑现有的块代码(见图 12-10)。

图 12-10. 专家模式编辑器
测试模型
Edge Impulse 中所有模型测试特性的详细描述和说明可以在“测试模型”中找到。
实时分类
从“实时分类”选项卡中,您可以直接测试从连接的 Arduino Nicla Sense ME 获取的单个测试样本(见图 12-11 和 12-12)。连接说明在示例 12-3 中描述。

图 12-11. 使用 Arduino Nicla Sense ME 的实时分类

图 12-12. 带有未标记测试结果的实时分类
或者在“分类现有测试样本”中加载现有的测试数据集图像,以查看该样本的提取特征和您训练模型的预测结果,如图 12-13 所示。

图 12-13. 使用现有标记测试结果的实时分类
模型测试
您还可以通过导航到项目的“模型测试”选项卡来批量对您的测试数据集进行分类,并使用您训练模型的结果。了解更多关于该选项卡的信息,请参阅“模型测试”。
选择“全部分类”以获取您训练模型在测试数据集样本上推断结果的矩阵(参见图 12-14)。

图 12-14. 模型测试结果
部署
恭喜!你刚刚完成了收集和标记训练与测试数据集,通过 DSP 模块提取数据特征,设计和训练机器学习模型,并使用测试数据集测试模型。现在我们已经拥有了在边缘设备上推断所需的所有代码和模型信息,我们需要将预构建的二进制文件刷入设备,或者将 C++ 库集成到我们的嵌入式应用代码中。
选择您 Edge Impulse 项目的部署选项卡,并按照下一节中的一个部署选项的步骤来运行您训练的机器学习模型在您的边缘设备上。还有许多其他部署选项可供选择,其中一些已在“部署”中描述过。
预构建二进制文件刷写
在部署选项卡中,选择您正式支持的 Edge Impulse 开发平台下的“构建固件”,然后选择“构建”。您还可以选择打开/关闭 EON 编译器。¹⁰
然后,根据部署选项卡中点击“构建”后显示的说明,将生成的固件应用程序拖放或刷写到您正式支持的平台上。有关在您选择的开发平台上刷写预构建二进制文件的详细说明,请参阅Edge Impulse 文档。
对于这个项目,我们将选择“Arduino 库”部署选项,以在Arduino Nicla Sense ME上运行我们的训练模型(如图 12-15 所示)。
根据Edge Impulse 网站上的 Arduino 部署文档中的说明,下载并安装软件前提条件。
首先,将下载的 Arduino 库 ZIP 文件导入到 Arduino IDE 中(参见 图 12-16)。

图 12-15. Arduino 库部署选项

图 12-16. Arduino IDE:导入 ZIP 库文件
然后,在 Arduino IDE 中打开已部署 Edge Impulse Arduino 库的 Nicla Sense 示例(参见 图 12-17)。

图 12-17. Arduino IDE:选择 Nicla Sense
现在将 nicla_sense_fusion.ino 草图文件保存到计算机的某个位置(参见 图 12-18)。

图 12-18. Arduino IDE:保存 nicla_sense_fusion.ino 草图
要么直接从 Arduino IDE 编译并闪存到 Nicla Sense,要么在命令行终端中导航到计算机上存储草图的目录,并运行 Arduino CLI 命令,如 示例 12-4 所示。
示例 12-4. Arduino CLI 命令,用于闪存推理草图
$ cd nicla_sense_fusion
$ arduino-cli compile --fqbn arduino:mbed_nicla:nicla_sense --output-dir . --verbose
$ arduino-cli upload --fqbn arduino:mbed_nicla:nicla_sense --input-dir . --verbose
在串行终端上以波特率 115,200 查看直接在 Arduino Nicla Sense ME 上运行的食品质量保证模型推理结果(参见 图 12-19)。

图 12-19. Arduino Nicla Sense ME 训练模型推理结果
GitHub 源代码
本章中使用的完整应用程序源代码,包括公共 Edge Impulse 项目 中部署的库和完成的应用程序代码,可供查看和下载在 GitHub。
迭代和反馈循环
现在您已经部署了食品质量保证模型的第一次迭代,可能对结果感到满意,并决定在此结束开发。但是,如果您希望进一步迭代模型并随时间或新获取的设备升级进一步提高准确性,例如,这个项目有许多适应和改进的变体可供考虑:
-
为模型添加更多机器学习类别,用于不同类型的食品。
-
创建一个设备外壳,确保食品污染物不会影响气体传感器的读数。
-
添加机器学习类别,专门识别食品过期日期后的天数。
-
使用传感器融合将其他传感器轴如温度或湿度添加到输入训练/测试数据样本中(参见 “传感器融合”)。
-
并行或在附近设备上运行多个食品质量保证模型,以实现不相关但类似的目标,例如食品变质和过敏原检测。
相关工作
正如本章所述,边缘 AI 是一种新兴技术,广泛应用于从生产线到消费者过敏原检测器的各种食品质量保证设备中。接下来的章节描述了边缘 AI 在食品质量保证中的各种设备、数据集、研究文章和书籍。
本书还记录了各种应用、方法、设备来源和各章节中关于食品质量保证机器学习模型和方法的商业采纳的引用脚注。
研究
-
Banús, Núria 等人的 “深度学习用于热成型食品包装质量控制”。《科学报告》,2021。
-
Gerina, Federica 等人的 “通过空气质量传感器数据识别烹饪活动以支持食物日记”。SpringerOpen,2020。
-
Hassoun, Abdo 等人的 “食品质量 4.0:从传统方法到数字化自动化分析”。《食品工程杂志》,2023。
-
Hemamalini, V. 等人的 “利用高效图像分割和基于机器学习的系统进行食品质量检验和分级”。《食品质量杂志》,2022。
-
Ishangulyyev, Rovshen 等人的 “理解食物损失和浪费——为什么我们会损失和浪费食物?”,国家医学图书馆,2019。
-
Iymen, Gokce 等人的 “基于人工智能的黄油变异识别作为检测食品掺假的模型研究”。《食品工程杂志》,2020。
-
Jathar, Jayant 等人的 “利用人工智能进行食品质量保证:一篇综述文章”,ResearchGate,2021。
-
Kaya, Aydin 和 Ali Seydi Keçeli 的 “传感器故障可容忍的基于机器学习的食品质量预测模型”,ResearchGate,2020。
-
Kumar, G. Arun 的 “基于 Arduino 传感器的食品变质检测方法”。《国际工程与应用科学技术杂志》,2020。
-
Nturambirwe, Jean 等人的 “利用短波红外高光谱成像学学习苹果潜在瘀伤损伤分类”,MDPI,2021。
-
Rady, Ahmed 等人的 “当使用近红外光谱法鉴别不同含过敏原粉末食品时,光强度、传感器高度和光谱预处理方法的影响”,国家医学图书馆,2019。
-
Sonwani, Ekta 等人的 “食品变质检测和分析的人工智能方法”,国家医学图书馆,2021。
-
Watson, Nicholas J. 等人的 “智能传感器支持可持续食品和饮料制造”。Frontiers in Sustainable Systems,2021。
新闻和其他文章
¹ 查看 IBM 文章,“什么是工业 4.0?:工业 4.0 技术如何改变制造业”(https://oreil.ly/ZMhe7)。
² 参见维基百科条目“第四次工业革命”。
³ Pini Mandel, “将人工智能应用于杂货过道”, 食品物流, 2021。
⁴ 粮食损失和浪费数据库。
⁵ Ilker Koksal, “利用人工智能提高食品质量”, 福布斯, 2021。
⁶ Nicholas J. Watson 等,“可持续食品和饮料制造的智能传感器”, 可持续食品系统前沿。
⁷ 查看联合国粮食及农业组织网站。
⁸ 查看美国农业部文章,“粮食浪费及其与温室气体和气候变化的关联”(https://oreil.ly/AMnGh)。
⁹ 查看博世关于 BME688 传感器的文章。
¹⁰ 查看 Jan Jongboom 的博客文章,“介绍 EON:神经网络内存减少达 55%,ROM 减少达 35%”(https://oreil.ly/B6Df7), Edge Impulse, 2020。
第十三章:用例:消费产品
边缘机器学习用于消费电子产品和产品,使设备能够基于数据做出决策,而无需将该数据发送到云端。这可以节省时间和带宽,并且在数据敏感且需要保密时使用。边缘机器学习还可以用于消费者任务,如面部识别、物体检测、语音识别和传感器分类。通过在设备上摄取的消费者数据中分析和识别模式,然后再将其发送到云端进行进一步处理之前,产品可以快速适应用户的需求:展示所需的产品使用情况,向用户提供定制的产品警报等等。
通过使用边缘人工智能,消费产品可以与并利用车载传感器的数据进行几乎无限量的用例集成。例如,自行车可以分析骑行者周围的环境,获取交通信息和影响骑行质量的环境数据,而智能冰箱可以自动检测产品几乎用完并将其添加到购买清单中。在本章中,我们将集思广益,探讨使用边缘人工智能处理消费产品的各种方法、相关的传感器和设备配置,并深入教程展示我们选择的方法和用例解决方案。
探索问题
许多消费者技术产品已经不断连接到互联网,如智能家居设备、安全摄像头、可穿戴设备、自动驾驶车辆和无人机。这些设备需要处理大量数据,或者将这些大量数据发送到云平台进行远程处理。边缘机器学习使得这些消费产品能够快速响应环境变化,例如设备已经摄入的大量传感器数据,而无需将其发送到云端进行进一步处理,通常这需要大量时间、电池使用、带宽消耗等。
根据本书学习的技术,为了开发面向终端消费电子产品的边缘机器学习模型是一个极其广泛的任务。为了缩小我们的焦点,我们将讨论多个总体目标,然后深入探讨其中一个实施的例子。一个关于消费者的总体目标的例子是某种方式安抚宠物的产品。从目标角度来看,我们既可以生成一个机器学习模型,分析宠物的水碗并在水快用完时提醒主人,也可以将设备集成到宠物项圈中,检测特定类型的烦扰噪音或声音,然后提供舒缓反馈。这两种方法都实现了同样的目标,通过终端产品设备来安抚宠物,但每种方法可能需要不同的机器学习类和传感器输入组合来解决。
目标设定
利用边缘人工智能技术创建有用和高效的消费产品是有益的,因为世界正在发展。消费者将开始期望他们的技术变得越来越智能,但不侵犯他们的数据隐私权。消费产品几乎可以无限地将其板载传感器数据与边缘机器学习模型集成起来。通过将这些板载传感器获得的智能带到边缘人工智能中,消费产品可以实现更好的整体性能、增加的电池续航时间(根据使用案例),以及总体增加的最终用户满意度和用户友好性/可访问性。
解决方案设计
在本章中,我们选择为自行车监测设备设计和实施一个低成本、高效和易于训练的边缘人工智能模型,其具备一个板载加速计传感器。然而,用于检测危险和监测骑行者安全的边缘人工智能模型并不仅限于使用加速计。通过本章及本书中介绍的原则和设计工作流程,还可以为自行车监测设备实施许多其他类型的机器学习模型和应用,包括使用摄像头图像输入来监视周围环境信息和潜在的碰撞/交通事故,通过传入音频信号数据识别碰撞等。
已有哪些解决方案?
市场上已经存在许多智能、边缘人工智能消费产品,或者最近从原型阶段推出。像June Oven和Haier Series 6这样的智能厨房电器配备了能帮助您从餐饮计划到清洁等方面的人工智能技术。全球的手机用户通过 Apple Watch、Samsung Smartwatch 或 Fitbit 等 AI 可穿戴设备被锁定在他们选择的硬件生态系统中。
健康设备越来越多地为最终用户开发;Oura Ring配备有传感器,可跟踪您的睡眠、活动和整体健康状况,帮助您更好地了解日常习惯。许多消费技术产品的未来将包括集成板载传感器和实时边缘人工智能推理,这提高了这些产品的性能、有用性和对最终消费者的吸引力,同时减少其能耗。
解决方案设计方法
我们可以通过许多不同的方法来解决我们的问题陈述,并设计一个解决方案,以下是其中一些描述:
宠物安抚器和监视器
作为宠物主人,了解宠物的生命体征和整体健康状况非常重要。通过使用边缘 AI 设备监测宠物的生命体征,您可以及时发现宠物健康或行为的任何变化,并采取适当的措施。有多种传感器输入可供选择,帮助您监测宠物的生命体征,包括摄像头传感器和智能水碗。您还可以使用 AI 动力项圈跟踪宠物的位置和活动水平。这些智能宠物产品可以帮助缓解我们对宠物健康和幸福的焦虑,并给我们带来安心感。
自行车监控器
许多形式的交通工具正在整合边缘 AI 技术,包括自行车,制造商提供各种功能,使通勤更安全和更愉快。通过配备传感器的自行车或附加消费者产品,数据收集的潜力巨大。配备各种传感器配置,自行车可以实时收集地形、天气和交通状况的数据,从而更全面地了解地面和骑行者周围环境的情况。
此外,自行车可以配备传感器,检测是否以不安全或非法的方式骑行,如穿行交通或逆向行驶。还可以集成其他传感器组合,以实现自动防盗检测,从而使骑行体验在城市中心内外更安全。最后,配备后视摄像头或雷达传感器的自行车还可以检测骑行者身后的交通情况,通过提醒用户让路、加速或减速,潜在地避免事故,依赖于来车的动作/信息或视觉障碍¹。
儿童玩具
有三类结合边缘 AI 技术的互动儿童玩具:教育、情感响应、或监测儿童及其环境的健康与安全。教育玩具旨在帮助儿童学习新技能或知识。它们通常采用教育游戏或拼图的形式,可以帮助儿童练习如数数、形状和颜色等技能。情感响应玩具旨在与儿童互动并对其情绪做出响应。这些玩具可以监听音频线索,如尖叫或哭泣声,并且可能识别面部表情或其他与儿童情绪状态相关的视觉线索。安全和健康监测玩具旨在帮助保护儿童的安全和健康。例如,这些玩具可以检测手指即将触摸到热炉灶,或者监测儿童的心率和呼吸。有些玩具甚至配备了 GPS 追踪功能,以防儿童走失,进一步提高了家长的安全感。
然而,边缘人工智能技术的进步要求在与儿童互动的任何玩具、设备或服务中推广非常合理和道德的 AI 使用准则。不幸的是,随着 AI 技术变得越来越复杂,监管变得越来越困难,AI 被用来利用儿童、他们的情感和个人数据的可能性也增加了²。AI 技术的监管是一个复杂的问题,在本章中我们不会详细讨论;然而,许多政府机构和公司正在研究和政策制定这一确切领域,因为这并非易事³。鉴于 AI 技术对儿童使用不当可能造成的潜在危害,有必要采取某种形式的监管⁴。
家电
边缘人工智能启用的家电,如冰箱,可以检测食物是否即将用尽,并自动订购更多,这样你再也不用担心牛奶会用完了。它们还可以跟踪你的饮食习惯,使你了解营养摄入,甚至为你完美地烹饪食物。
但不仅仅是冰箱变得更智能。有各种智能烹饪设备,利用计算机视觉和其他传感器输入来进行视觉大小估算⁵和自动温度控制,完美地烹饪食物。咖啡机利用边缘机器学习根据用户的偏好个性化咖啡。甚至洗衣机也利用机器学习识别不同类型的衣物,并根据推理结果调整洗涤和干燥周期。
先前描述的任何一个用例解决方案都是促进本章设计道德和有价值的消费者产品的消费产品,并确保道德和负责任地使用有关最终用户的数据。
设计考虑
为了实现设计有用、道德和可访问的消费者边缘人工智能产品的总体目标,从技术的角度来看,我们可以使用多种数据源,包括许多不同类型的传感器和摄像头,以实现类似的目标(见表 13-1)。
表 13-1. 每种用例可以使用哪些传感器?
| 目标 | 传感器 |
|---|---|
| 自行车手崩溃/盗窃检测器 | 加速度计、音频、雷达、摄像头 |
| 宠物安抚器 | 摄像头、音频、雷达 |
| AI 动力烤箱 | 红外摄像头、温度、气体 |
| 健康监测可穿戴设备 | PPG、心率、心电图、温度、水/汗水水平 |
| 家庭安全和自动化 | 摄像头、音频 |
| 机器人儿童玩具 | 摄像头、音频、加速度计、陀螺仪、雷达 |
| 自动洗衣机 | 摄像头、化学物质、气体、颜色、光强度 |
“获取数据的方法”讨论了进一步的传感器数据收集和数据集收集方法。
此外,在设计过程和头脑风暴会议期间,请考虑以下要点:
-
产品的最终用户是谁?
-
产品的主要利益相关者是谁?
-
这款产品如何可能被恶意或不道德地使用?
-
数据存储在哪里?推理结果是否被发送回云平台?
-
消费者/最终用户如何被告知传感器数据的处理方式,无论是在设备上还是在云端或网络连接中?
环境和社会影响
尽管边缘 AI 在消费技术中的进步可以使我们的生活更加便捷,但它也带来了自己的问题,包括大部分人群无法使用或使用有限,使一部分最终用户无法充分享受边缘 AI 技术的进步。制造商试图缓解这些问题的一种方式是制造更加用户友好和可访问的设备。一个例子是,一些公司现在制造的设备可以减少家务劳动的负担。这些设备可以帮助老年人或残疾人完成可能难以完成的任务,如清洁或烹饪。这不仅有助于使他们的生活更加便捷,还可以帮助预防事故或受伤。公司还努力通过提前提醒客户潜在的问题或设备可能需要的维修来减少技术或一般废物。这不仅有助于保持设备的良好工作状态,还可以帮助防止儿童与设备互动时可能发生的伤害。
自助启动
本用例章节将深入探讨一个端到端的解决方案,用于创建消费者产品边缘 AI 模型,特别是与一款将通过交通和碰撞警报监视和保护骑自行车者的设备相关的模型。为了创建我们的初始自行车监控模型,我们将从边缘设备的加速度传感器中收集“空闲”、“突然停止”和“正常”机器学习类的样本。
这三类将使我们的分类机器学习模型能够实时识别自行车手正在经历的运动事件类型。边缘设备从加速度计获取连续的原始样本,并且训练好的机器学习模型推断和确定设备检测到的运动是否空闲、执行转弯、经历突然停止(可能是事故的指示),或者在不平坦的地形上行驶。对于结果预测结果、异常分数和加速度计信号数据,如果设备确定异常分数高,或者发生突然停止,这些信息将立即通过音频输出通知或 LED 警告通知设备最终用户,并且数据也将通过网络连接发送或本地存储,以供人类或云端进一步处理。
定义您的机器学习类别
表 13-2 展示了用例、传感器和数据输入类型的潜在组合,以及我们在本章中使用的机器学习类别,用于收集和标记训练和测试数据集。用例及其相关的类别标签对于我们在本章中使用的机器学习算法(特别是“分类”和“异常检测”)非常重要。您可以在 “分类” 和 “异常检测” 中了解更多关于这些算法的信息。
表 13-2. 自行车安全用例的机器学习类别
| 用例 | 训练数据 | 类别标签 |
|---|---|---|
| 检测自行车事故 | 加速度计 | 正常、异常(或已存在的指定“事故”标签) |
| 监视来车 | 摄像头(带有边界框) | 汽车、自行车、摩托车、其他交通对象 |
| 监视自行车手的盲点 | 雷达 | 正常、靠近自行车手的物体 |
| 监听汽车警报、碰撞和其他交通声音 | 音频 | 背景噪音、汽车警报、车祸、汽车鸣笛、人声/喊叫 |
在本章中,我们将选择并建立消费者自行车监控设备用例,用于机器学习传感器数据分类,我们项目的初始机器学习类别将是“空闲”、“突然停止”和“正常”,涉及“检测自行车事故”的最终用例目标。然而,因为您可能不想特别遇到自行车事故来记录和上传这些数据样本,我们将使用机器学习技术分类和异常检测来实现这个用例目标。
数据集收集
要了解如何收集干净、健壮和有用的数据集的技术性和具体信息,请参阅 “获取数据”。您还可以利用各种策略,从多个来源收集数据,为您的用例创建独特的数据集:
-
结合公共研究数据集
-
使用来自 Kaggle 等社区驱动的数据收集网站的现有传感器数据集
-
寻求同事帮助,为您的合作 Edge Impulse 项目收集样本
Edge Impulse
如“Edge Impulse”所述,您需要创建一个免费的 Edge Impulse 账户以按照本章描述的说明操作。
要进一步证明使用 Edge Impulse 进行边缘机器学习模型开发的理由,请查阅“面向边缘 AI 的端到端平台”。
Edge Impulse 公共项目
本书的每个用例章节都包含一个书面教程,演示并完成描述用例的完整端到端机器学习模型。但是,如果您只想直奔主题,查看作者为该章节开发的确切数据和模型的最终状态,可以通过导航到本章节的公共Edge Impulse 项目来实现。
您还可以通过选择 Edge Impulse 页面右上角的克隆按钮直接克隆此项目,包括所有原始训练和测试数据、中间模型信息、最终训练模型结果以及所有部署选项(见图 13-1)。

图 13-1. 克隆 Edge Impulse 公共项目
选择您的硬件和传感器
在本书中,我们尽可能保持设备无关性,但我们也需要讨论如何使用现成易用的开发套件来创建此用例的解决方案。因此,本书旨在尽可能使硬件选择变得简单、经济和易获得。
由于 Edge Impulse 已经提供了大量官方支持的开发平台,配备各种集成传感器驱动程序和开源固件,为了这个项目的简便性和我们的自行车消费产品用例中加速计数据的收集,我们将使用我们的配备 Edge Impulse 移动客户端的手机和Nordic Semi Thingy:53,以及nRF Edge Impulse 移动电话应用程序进行数据摄入和模型部署的组合。
但是,如果您没有本章描述的确切硬件,您可以参考Edge Impulse 文档,寻找其他适用于各种官方支持传感器的适当板卡,以便轻松进行数据摄入和部署。或者您可以自行携带开发平台和传感器组合,一旦为初始传感器数据摄入创建了运行设备固件(最简单的方法是使用Edge Impulse 数据转发器),继续按照本章说明操作。
硬件配置
Nordic Semi Thingy:53 设备上的加速度计惯性测量单元(IMU)和/或您的手机内部的 IMU 将用于检测自行车上的运动事件,固定在自行车前把手上。
以下是一些其他传感器类型的列表,以提高您的消费者自行车监控模型的准确性,以适应您特定的环境、用例、项目预算等因素:
-
陀螺仪
-
红外线、夜视或热成像摄像头
-
雷达
-
音频
数据采集
使用 Edge Impulse,有许多选项可用于将数据上传和标记到您的项目中;许多最常见的数据摄取工具已在“数据采集”中介绍过。接下来的章节将讨论我们将在这一章节中用于消费者产品自行车监控用例的具体数据收集工具。
数据摄取固件
要从我们的 Thingy:53 设备摄取数据,我们需要按照文档中的说明刷新 Edge Impulse 固件到我们的设备上。然后,使用Edge Impulse CLI或者 nRF Edge Impulse 手机应用程序(参见“nRF Edge Impulse 手机应用程序”),我们将连接我们的设备到我们的项目,并开始从 Thingy:53 设备或手机上记录新的加速度计数据样本。
手机
上传新的加速度计数据的最简单方法之一是直接将您的手机连接到 Edge Impulse 项目,并从手机的集成 IMU 记录加速度计数据。您可以在Edge Impulse 文档中找到连接您的手机的说明(参见图 13-2)。

图 13-2. 将手机连接到 Edge Impulse 项目
nRF Edge Impulse 手机应用程序
首先,为您的iPhone或Android 手机下载并安装 Nordic nRF Edge Impulse 应用程序。然后,按照 Edge Impulse 文档中的说明使用您的 Edge Impulse 账户登录 nRF Edge Impulse 应用程序,并将您的 Thingy:53 连接到您的项目中。
要录制并上传新的数据样本到您的项目中,请点击应用程序右上角的“+”按钮。选择您的传感器,输入样本标签,选择样本长度和频率,然后选择开始采样(见图 13-3)。

图 13-3. nRF Edge Impulse 手机应用程序数据采集
继续在您的自行车上收集所有三种机器学习类别,“空闲”、“突然停止”和“正常”。在收集数据时,请注意周围环境的安全!
清理您的数据集
请查看“清洁数据集”中提供的提示,然后返回到本章。
因为我们记录的气体传感器样本长度为 30 秒(30,000 毫秒),我们将把样本分割成多个 10 秒(10,000 毫秒)长的子样本。从“数据采集”选项卡中,选择一个样本的三点下拉菜单,然后点击“分割样本”。你可以在分割样本视图中放入大约 10,000 毫秒长的三个子样本;点击“+添加段”按钮以添加更多的分割段,然后点击“分割”(见图 13-4)。

图 13-4. 数据采集:分割样本
你还可以通过在样本名称旁边的下拉菜单中选择“裁剪样本”选项,如“清洁数据集”中所述。
数据集许可和法律义务
请查阅“数据集许可和法律义务”,以确定你的数据集的许可和法律义务。由于我们直接上传和使用了我们从家中和个人手机或 Nordic Thingy:53 设备(通过计算机的串行端口或Nordic nRF Edge Impulse 手机应用)收集的数据,因此我们不需要审查任何数据集许可或法律问题。
然而,如果你除了来自你的手机或 Nordic Thingy:53 等设备的自有数据外,还使用了来自公开数据集的加速度计数据或其他类型的传感器数据,请在将数据上传到训练/测试数据集并使用从这些数据中得出的训练模型之前,进行尽职调查,确定数据使用规则和归属要求。
DSP 和机器学习工作流程
现在,我们已经将所有的加速度计运动样本上传到我们的训练和测试数据集中,我们需要使用数字信号处理(DSP)方法提取我们原始数据的最重要特征,然后训练我们的机器学习模型来识别传感器数据提取特征中的模式。Edge Impulse 将 DSP 和 ML 训练工作流程称为“脉冲设计”。
你的 Edge Impulse 项目的“脉冲设计”选项卡允许你查看和创建全端到端机器学习流水线的图形简要概述。最左侧是原始数据块,Edge Impulse Studio 将摄入和预处理你的数据,并设置窗口增长和大小。如果你上传了在设备上以不同频率记录加速度计数据的样本数据,你也可以从这个视图中对时间序列数据进行下采样或上采样。
接下来是 DSP 块,我们将通过开源数字信号处理脚本“谱分析”提取我们加速度计数据的最重要特征。一旦生成数据特征,学习块将根据我们所需的架构和配置设置训练我们的神经网络。最后,我们可以看到部署输出信息,包括我们希望我们训练好的机器学习模型分类的期望类别:空闲、突然停止和正常。
在您的 Edge Impulse 项目中,设置您的“脉冲设计”选项卡与 图 13-5 中相同,或通过选择各种块弹出窗口中列出的方式设置,然后点击“保存脉冲”:
时间序列数据
-
窗口大小:5000 毫秒。
-
窗口增加:250 毫秒。
-
频率(Hz):62.5
-
零填充数据:已选中 [x]
处理块
- 谱分析
学习块
-
分类(Keras)
-
异常检测(K-Means)

图 13-5. 脉冲设计配置
数字信号处理块
对于本章介绍的项目,我们将使用默认包含在 Edge Impulse Studio 中的数字信号处理算法;该谱分析处理块预先编写并可在平台上免费使用和免费部署。谱分析块中使用的代码可以在 Edge Impulse GitHub 仓库“processing-blocks” 中找到。您还可以在 “谱分析” 中了解有关谱分析算法的具体信息。
如果您熟悉编写自己的数字信号处理代码或希望使用自定义的 DSP 块,请查看 “数字信号处理块” 中提供的详细信息。
通过从导航栏中选择“谱特征”选项卡并选择与 图 13-6 中相同的参数设置,或者按照以下列出的方式通过编辑各种复选框和文本输入设置您的谱分析块:
过滤器
-
缩放轴:1
-
类型:无
谱功率
-
FFT 长度:16
-
对频谱取对数?:已选中 [x]
-
FFT 帧重叠?:已选中 [x]

图 13-6. 谱特征块参数
现在点击“保存参数”。为了使用 Edge Impulse 中可用的高级异常检测功能,请在“生成特征”视图上选中“计算特征重要性”复选框(参见 图 13-7)。

图 13-7. 生成带特征重要性的特征
现在,点击“生成特征”以查看您数据的特征探索器和特征重要性列表(参见 图 13-8)。

图 13-8. 谱特征块:特征探索器
机器学习块
我们现在准备训练我们的边缘机器学习模型!在 Edge Impulse 中有多种训练模型的方式,最简单的是可视化(或 web GUI)编辑模式。然而,如果您是机器学习工程师、专家,或者已经具有使用 TensorFlow/Keras 进行编码的经验,那么您还可以在 Edge Impulse Studio 中本地或专家模式中编辑您的迁移学习块。
我们可以从 NN 分类器选项卡设置项目的神经网络架构和其他训练配置设置。
可视化模式
配置和设置我们的机器学习训练设置和神经网络架构的最简单方法是通过 Edge Impulse 可视化模式或导航栏中“NN 分类器”选项卡下“脉冲设计”默认视图(见图 13-9)。将这些设置复制到您的神经网络分类器块配置中,然后单击“开始训练”:
-
训练周期数量:30
-
学习率:0.0005
-
验证集大小:20%
-
自动平衡数据集:未选中 [ ]
-
神经网络架构:
-
稠密层 (20 个神经元)
-
稠密层 (10 个神经元)
-
您可以在Edge Impulse 文档中了解更多有关神经架构配置的信息。一旦您的模型训练完成,您可以在“模型:最后训练性能”视图中查看迁移学习结果(见图 13-10)。
有关在本地或专家模式中编辑神经网络块的更多信息,请参阅第十一章和第十二章(特别是“机器学习块”一节)。

图 13-9. 神经网络设置

图 13-10. 模型:最后训练性能
异常检测
神经网络在模式识别方面表现出色,但在面对新的、未见过的数据时会遇到困难。这是因为它们只是针对特定数据集进行训练,所以如果您给它们一些新的东西,它们将无法正确分类它。⁷
了解本章中使用的异常检测技术在“异常检测”一节中的更多信息。
从导航栏中选择“异常检测”选项卡,然后单击“选择建议的轴”按钮,自动选择我们用例的建议特征重要性轴(见图 13-11)。

图 13-11. 异常检测:选择建议的轴
然后单击“开始训练”,查看生成的“异常探测器”(如图 13-12 所示)。

图 13-12. 异常检测:异常探测器
模型测试
Edge Impulse 中所有模型测试功能的深入详细描述和说明都在“测试模型”中提供。
实时分类
在“实时分类”选项卡中,你可以直接从连接的 Nordic Thingy:53 测试单个测试样本(见图 13-13 和图 13-14)。连接说明详见“数据摄取固件”。

图 13-13. 使用 Nordic Thingy:53 进行实时分类

图 13-14. 未标记测试结果的实时分类
或加载“分类现有测试样本”中的现有测试数据集图像,以查看该样本提取的特征及您训练模型的预测结果,如图 13-15 所示。

图 13-15. 使用预先存在的标记测试结果进行实时分类
模型测试
你还可以通过转到你项目的“模型测试”选项卡来批量对你的测试数据集进行分类。在“模型测试”中了解更多关于此选项卡的信息。
选择“全部分类”,可以获得你训练模型在测试数据集样本上推理结果的矩阵(见图 13-16)。

图 13-16. 模型测试选项卡结果
注意
虽然此处的模型测试结果选项卡在实际应用中看起来不太乐观,因为我们只上传了几分钟的训练数据,但随着上传的数据越多,模型在实际世界和我们的测试数据集上的表现会越好。你可以在第 9 章中了解更多关于改进模型并实现消费产品生产就绪模型的信息。
部署
恭喜!你刚刚完成了收集和标记训练和测试数据集,通过 DSP 模块提取数据特征,设计和训练机器学习模型,并使用测试数据集测试模型。现在我们已经获得在边缘设备上推断所需的所有代码和模型信息,需要将预构建的二进制文件烧录到设备上,或将 C++库集成到嵌入式应用程序代码中。
选择 Edge Impulse 项目的部署选项卡,并按照下一节中的多种部署选项的步骤运行您的训练机器学习模型在边缘设备上。还有许多其他部署选项可供选择,其中一些已在“部署”中描述过。
预构建二进制文件烧录
从部署选项卡中,在“构建固件”下选择您官方支持的 Edge Impulse 开发平台,然后选择构建。您还可以选择开启/关闭 EON 编译器。⁸
然后,按照部署选项卡中点击“构建”后显示的说明,将生成的固件应用程序拖放或刷入您官方支持的平台上。可以在Edge Impulse 文档中找到有关刷写预构建二进制文件的更详细说明。
GitHub 源代码
本章使用的完整应用程序源代码,包括来自公共Edge Impulse 项目的部署库和完成的应用程序代码,可供查看和下载GitHub 存储库。
迭代和反馈循环
现在您已经部署了食品质量保证模型的第一次迭代,也许您对结果感到满意,并在此结束开发。然而,如果您希望进一步迭代您的模型,并随时间或新获得的设备升级进一步提高准确性,例如,有许多适应和变体可以考虑和改进这个项目:
-
重新设计设备,使其对碰撞更敏感(用更敏感的传感器或更高端的 CPU 替换本指南中使用的硬件)。
-
利用积极学习策略来改进本模型中使用的算法、DSP 和机器学习神经网络。在第九章和第十章中还描述了更多策略。
-
上传更多现有模型类的训练和测试数据,并创建新的类来训练您的模型。
-
定期评估设备性能,并根据时间做出改进;你的模型只能与训练数据记录的位置/环境一样好。
-
自行车的车把上可以安装摄像头而不是加速计。
-
将安装在自行车上的设备位置从车把移到头部,并观察设备的表现。
相关作品
正如本章所述,边缘人工智能是一种新兴技术,广泛应用于各种消费产品,从监测孩子健康的玩具,到监测即将到来的交通和潜在事故的自行车,再到自动烹饪您的食物至完美熟度的家用电器。接下来的章节描述了关于消费产品边缘人工智能的各种新闻文章、产品、研究文章和书籍。
本书还在每一页的脚注中注明了各种应用、方法、设备以及来自各种研究和消费产品的引用。
研究
-
数字儿童游戏:保护儿童免受人工智能影响,联合国新闻,2021 年。
-
WEF 儿童人工智能,世界经济论坛,2022 年。
-
儿童数据的良好治理,联合国儿童基金会。
-
“通过儿童权利视角审视人工智能技术”。欧盟科技中心,2022 年。
-
Fosch-Villaronga, E.等人的文章,“玩具故事还是儿童故事?将儿童及其权利置于人工智能革命的前沿”。SpringerLink,2021 年。
-
Morra, Lia 等人的文章,“消费电子产品中的人工智能”。IEEE,2020 年。
-
Sane, Tanmay U.等人的文章,“农作物收获机器人中的人工智能和深度学习应用:一项调查”。IEEE,2021 年。
-
Mohanty, Saraju P.的文章,“智能消费电子产品的人工智能:在边缘还是云端?” IEEE 消费电子杂志,2019 年。
-
Go, Hanyoung 等人的文章,“旅游和酒店业机器人的机器学习:交互技术接受模型(iTAM)——尖端”。Emerald Insight,2020 年。
-
Xu, Tiantian 等人的文章,“基于物联网的边缘计算共享单车系统需求预测的混合机器学习模型”。IEEE,2020 年。
-
自行车后视雷达,Edge Impulse。
-
Silva, Mateus C.等人的文章,“可穿戴边缘人工智能在生态环境中的应用”。MDPI,2021 年。
-
Kakadiya, Rutvik 等人的文章,“基于智能监控的 AI 自动抢劫/盗窃检测”。IEEE,2019 年。
-
Ogu, Reginald Ekene 等人的文章,“利用物联网的人工智能进行高级计量基础设施异常检测”。ResearchGate,2021 年。
新闻和其他文章
-
“人工智能在消费品公司中的潜力”。Deloitte,2022 年。
-
“消费品:通过边缘人工智能增加产品创新和收入”。Gartner,2021 年。
-
“与边缘人工智能创新”。Gartner,2019 年。
-
“边缘机器学习:从 PoC 到真实世界的 AI 应用”。Strong,2021 年。
-
“杜卡迪和联想继续合作引领摩托 GP 创新”。BusinessWire,2022 年。
¹ 查看 Edge Impulse 的文章,“自行车后视雷达”。
² 参见联合国新闻的文章,“数字儿童游戏:保护儿童免受人工智能影响”。
³ 查看联合国儿童基金会的文章,“儿童数据的良好治理”。
⁴ 查看来自世界经济论坛的“儿童的人工智能”。
⁵ 查看 Edge Impulse 博客的“使用 Edge Impulse 中的视觉回归从照片估算重量”。
⁶ 查看来自世界经济论坛的“儿童的人工智能”。
⁷ 查看来自 Edge Impulse 的文章“异常检测(K-Means)”。
⁸ 查看 Edge Impulse 博客的“介绍 EON:神经网络内存减少高达 55%,ROM 减少 35%”。


浙公网安备 33010602011771号