☰
ML Kit设备端AI实战:从扫码OCR到姿态检测的落地全攻略
2026/10/12 7:32:29 网站建设 项目流程

搞设备端AI有一段时间了。之前做一个扫码加OCR的需求,第一版直接调云端接口,结果用户在地铁上反复扫不出码、充满电出门不到一小时机身发烫,后台看日志全是网络超时。后来我把识别逻辑全部搬到设备端,问题立刻少了一大半。这章就说清楚:ML Kit到底是什么,哪些能力能直接落地,接的时候真正的坑都在哪里。

ML Kit是Android体系里面向移动端的机器学习SDK合集,它最大的价值不是让开发者自己去训练模型、转换模型、优化推理速度,而是把一堆高频的视觉和自然语言能力封装成现成API,几行代码就能在本地跑推理。对大多数应用来说,用ML Kit做设备端AI,比从零手撸TensorFlow Lite要划算得多,而且它支持模型按需下载、条件更新、边缘缓存,本质上就是给“本地跑模型”这件事做了一个标准化的工程封装。

1. 为什么要在本地跑AI:一场扫码识别的性能对话

1.1 云端AI的“路费”问题

在做设备端改造之前,我的扫码流程是:手机端截取视频帧,送到云端识别,返回结果再渲染到界面。逻辑链路长,问题也集中。

首先是延迟。一次HTTP往返,好网络下200到300毫秒,弱网下没有上限。而扫码是持续帧输入的过程,每一帧都要经历“发送-识别-返回”的完整回路,中间任何一步抖动,用户感知就是取景器里的识别框一直在转圈。

其次是成本和隐私。每一帧图片都要上传,对用户来说是流量开销和隐私风险,对开发者来说是服务器负载和带宽账单。尤其是相机预览的原始帧,分辨率动辄1080p以上,一次上传几百KB很正常,一个月跑下来费用相当可观。更敏感的是,图像数据出设备后就没法保证完全可控,这在涉及证件、票据、人脸等场景里是绕不开的合规问题。

最后是可用性。离线场景直接不可用;弱网场景超时重试会造成识别框闪烁,用户体验非常割裂。这些问题都不是单独某个接口的问题,而是“依赖网络”这个架构选择带来的必然代价。

1.2 设备端换来的三个确定性

把识别放在本机跑,换来的是三个确定性。

第一个是延迟确定性。本地推理没有网络波动,耗时主要取决于SoC算力和模型大小,通常几十到几百毫秒之间,性能曲线非常稳定。在视频流场景下,这种稳定性比绝对速度更重要:稳定的处理间隔才方便做帧率控制、背压管理和交互反馈。

第二个是可用性确定性。设备端推理不依赖网络状态,飞行模式下一样能用。对于扫码、文档识别、动作捕捉这类高频工具型场景,离线可用本身就是产品的一个卖点。

第三个是成本确定性。推理是设备自己算,不消耗服务端资源。当用户规模上来之后,设备端AI能让单用户边际成本趋近于零。尤其是B2B场景,每次识别的云端调用成本积少成多,做成设备端后在规模化阶段优势非常明显。

当然,设备端不等于所有问题都能本地解决。复杂手写体的高精度识别、多语种长文本翻译、跨镜头大场景理解,这些对模型尺寸和算力要求极高,端侧短期内追不上云端。正确做法是端云分工,而不是二选一,这个我在后面会专门展开。

1.3 ML Kit到底帮你干了什么

设备端AI听起来简单,真正落地会发现一堆脏活:模型要适配不同SoC的指令集,推理要兼顾耗电和发热,输入张量要从摄像头帧里高效转换,模型大了还得考虑APK体积和按需下载。这些事每件都不难,但合在一起就非常消耗人力。

ML Kit把这些都封装掉了。它提供的API大致分三层:视觉类API,覆盖条码扫描、文字识别、人脸检测、姿态检测、图像分割等;自然语言类API,覆盖翻译、实体提取、智能回复等;自定义模型托管,允许开发者上传自己的TFLite模型,由SDK负责分发和更新。

如果你自研TFLite方案,从模型格式转换、输入预处理、输出后处理到推理线程管理全都要自己做。而ML Kit把这些变成了配置项:选一个识别器、喂一张图、收一个结果。工程师可以把精力放到业务判断上,而不是被底层推理细节拖住。这个取舍在项目节奏快的团队里非常关键。

2. ML Kit能力地图:每一项API到底适合什么业务

2.1 条码扫描:比ZXing更轻的正确替代

ML Kit的条码扫描API是我用得最频繁的一个能力。它支持一维条码和二维条码,覆盖面非常广,包括QR码、Code 128、EAN-13、UPC-A等常见格式。

我之前的项目里用的是传统扫码库,为了解析二维码要引入一整条自带解码流程的依赖,体积大且部分格式支持不好。换成ML Kit后,依赖体积明显降低,接口也更干净:传给识别器一张图,回调里直接拿到条码内容、格式类型和角点坐标。

实际操作中有个细节:扫描解析的坐标系和画面显示坐标系是分离的。摄像头分析器的输出帧坐标与预览View的坐标需要自己转换,否则识别框会“飘”在错误的位置。常规做法是用矩阵映射,把View上的显示区域映射到分析图像坐标系,我一般是拿识别出的条码角点,经过坐标转换后画在预览层上。

ML Kit条码API的另一个好处是支持多条码同时识别,适用于货架盘点、批量核销这类需要一次解析多个条码的场景。如果做扫码类应用,直接把传统扫码库替换成这条链路,性能和体积都会受益。

2.2 文本识别:OCR能力的分层配置

文本识别是ML Kit里最容易被低估的能力。它分为拉丁字符识别和中文识别两套独立模型,中文识别有专门的依赖项和识别配置,错误地用默认拉丁模型去读中文内容,效果会非常差。

这里要说一个原则:OCR不是“图里所有字都识别出来”就够了,更重要的是结构化输出。ML Kit返回的识别结果自带层级结构,整体文本、文本块、行、元素四级,每一层都有对应的边界框和坐标。这意味着你可以做版式重建、关键词定位、区域过滤这些精细操作,而不是拿到一段散装字符串。

我在票据识别场景中会先做区域预处理,比如只保留规定的票据区域,再进识别器;然后对返回的元素层做后筛选,去掉置信度低于阈值的部分。这套流程下来,准确率提升非常明显。另外,ML Kit中文OCR对打印体的效果已经很实用,但对手写体的支持仍然有限,需要评估业务是否有手写识别需求。

2.3 人脸检测与面部轮廓:比想象中更“低调”

人脸检测在ML Kit里被设计成两个层次:检测人脸位置和检测面部轮廓点。轮廓点数量很多,覆盖眼睛、眉毛、嘴唇、脸部外沿等。注意它不做身份识别,只做特征提取和几何测量。

所以这个API的准确定位是“几何理解”,而不是“人脸比对”。比如眨眼检测可以通过眼部轮廓点的上下距离变化判断;微笑检测可以通过嘴角点相对位置的偏移判断;头部姿态估计可以通过关键点的三维坐标推算。它还支持检测眼睛睁开程度、嘴部状态、左右脸朝向等属性,很多“活体检测”类功能的起点就是这些基础几何判断。

实际项目中我用它做过专注度统计:通过头部姿态角和眼睛开合度,判断视频观看者是否在走神。这套方案完全本地跑,不涉及任何身份识别,所以隐私压力也小。这里要提醒的是,人脸检测对角度变化和遮挡仍然敏感,正脸效果显著好于侧脸,业务设计时不要期待全角度无死角。

2.4 姿态检测:从关键点到业务语义

姿态检测是ML Kit里“炫技感”最强的能力,全身体态以关节关键点坐标输出,支持全身、上半身、下半身等模式。它返回的关键点包含位置坐标和置信度,还提供了较为稳定的跟踪算法,能在帧间关联同一个人的关键点,做动作判断时非常省事。

所谓业务语义,就是把原始坐标翻译成人类能理解的动作。比如检测“是否抬手”:拿肩、肘、腕三个点的坐标计算夹角,夹角的范围可以对应到“手放下”“手平举”“手举起”。再比如健身计数:通过膝关节角度的周期性变化,识别深蹲的起和落。

后面我会给出具体的夹角计算代码。这个能力可以快速落地成健身App的姿势辅助、舞蹈教学的节拍反馈甚至AR试穿的人体锚点。要注意的是它同样有使用边界:多人密集、互相遮挡的场景下识别质量会明显下降。

2.5 语言翻译与其他能力:设备端NLP的小工具箱

如果你只用ML Kit做视觉,会错过它另外半边天。它的多语言翻译支持端侧离线翻译,语言包按需下载,下载后不联网也能用中英互译。对于工具类应用里的即时翻译、文本阅读器里的生词解释,这个能力很实用。

实体提取能在设备端从文本里捞出地址、电话、邮件等结构化信息,配合OCR可以做出“拍一张名片然后自动提取联系方式”的完整体验。这类组合用法我强烈推荐:视觉识别和NLP处理都在本机跑,才真正体现出端上AI产品闭环的体验价值。

下面这个表格可以快速帮你判断不同任务该怎么选:

任务ML Kit对应能力端侧处理适合度典型业务场景
扫描二维码/条形码条码扫描极高入园核销、货架盘点、支付
提取图片文字文本识别高(印刷体)票据识别、名片录入、文档扫描
检测人脸位置/特征人脸检测高美颜锚点、注意力分析
全身动作理解姿态检测中高健身计数、体感交互
实时翻译翻译中(受模型体积限制)对话辅助、阅读器翻译
从文本提取实体实体提取高名片结构化、信息抽取
特定领域的图像分类/检测自定义模型视模型而定质检、特殊物品识别

3. 实操接入:一个中文OCR识别链路的完整落地过程

3.1 环境准备与依赖引入

我以实际项目里的体验为例,说明设备端OCR的接入过程。工程环境是Android现代构建体系,使用的相机部分是CameraX的分析器管道。

依赖配置大致如下,这段是基础配置:

// ML Kit基础能力,中文OCR implementation("com.google.mlkit:text-recognition-chinese:16.0.0") // 相机框架CameraX implementation("androidx.camera:camera-core:1.3.4") implementation("androidx.camera:camera-camera2:1.3.4") implementation("androidx.camera:camera-lifecycle:1.3.4") implementation("androidx.camera:camera-view:1.3.4")

我本来也想同时引入通用多语言OCR,后来发现两者模型互相独立,体积是叠加的。如果业务只处理中文,就只引入中文识别依赖,APK能小不少。手机上Flash占用是真实存在的,每一条依赖都对体积负责。

值得一提的版本选择:同类能力在Play服务版和独立版之间是有区别的。基于Play服务的版本由系统自动更新,包体内置模型时机不确定,首次调用可能需要从系统组件里拉取模型;独立版则直接打包进APK,模型文件跟随应用走,在受限环境下更可控。

我从一开始就选了独立版,理由很简单:做设备端AI最在意的就是离线可用和启动可控,Play服务版的“系统自动更新”虽然省APK体积,但和“本机模型一定存在”这个预期是有冲突的。团队可以接受首次加载慢一点,但不能接受模型在系统层面被更新成不兼容版本。

3.2 InputImage:图像输入的正确姿势

ML Kit的识别器统一接收ImageInput类型。你可以从Bitmap、媒体图像、ByteBuffer或文件路径创建InputImage,其中最常见的是从相机分析器的帧创建。

CameraX的分析器回调里拿到的是ImageProxy,注意这里有一个关键操作:用完必须close,否则分析器会停止产生新帧。创建InputImage时还要传旋转角度,这个角度来自相机传感器方向,需要和当前设备方向做匹配。如果角度传错,识别结果会是横着的。

val mediaImage = imageProxy.image val rotation = imageProxy.imageInfo.rotationDegrees val inputImage = mediaImage?.let { InputImage.fromMediaImage(it, rotation) }

此外还有个性能细节:如果预览帧分辨率过高,识别耗时跟着上涨,但识别准确率并不会同比例提升。我习惯在分析器配置里就把帧率降低到5到10FPS,分辨率控制在640480或者1280720级别。OCR场景不需要每一帧都识别,间隔识别配合结果展示就已经足够流畅。

从Bitmap创建的时候也要注意:系统相机拍出的照片动辄4000万像素,直接丢给识别器会触发大量无效计算。我的做法是先进采样压缩到宽边不超过1280的Bitmap,再做识别,整体速度提升非常明显,准确率几乎没有损失。

3.3 TextRecognizer接入与异步回调

中文识别器的创建方式如下:

val recognizer = TextRecognition.getClient( ChineseTextRecognizerOptions.Builder().build() )

接着把InputImage喂给识别器,用异步回调拿结果:

recognizer.process(inputImage) .addOnSuccessListener { result -> val fullText = result.text // 可以按块/行/元素继续拆解 for (block in result.textBlocks) { for (line in block.lines) { for (element in line.elements) { val confidence = element.confidence val box = element.boundingBox // 业务逻辑处理 } } } } .addOnFailureListener { e -> Log.e("OCR", "识别失败", e) }

这里要注意异步回调的线程切换。ML Kit的回调默认跑在主线程,如果拿到结果后要做大量解析,应该再切到后台线程处理,避免卡界面。

文本结构里每一层都有边界框,这意味着你可以做“只识别图片某个区域”的准星式处理。我之前做过一个名片识别功能,就是先把名片区域用矩形框出来,类似取景框,OCR结果的文本块如果中心不在框内就丢弃,这样识别串词率明显下降。这个区域过滤的方式比直接全图识别再后处理要高效得多,强烈建议在做票据、证件、工牌类识别时采用。

另外识别准确率和图像质量强相关。同一张图,正对光源拍和斜拍、模糊和清晰、纯白背景和复杂纹理背景,结果差异非常大。做产品时要把这些预期传达给用户,最好在UI上给出“尽量平拍、光线充足”的引导,而不是让用户觉得App“显示不准”。

3.4 CameraX联动:实时预览与背压处理

整个OCR链路里,最容易出问题的其实是帧消费速度跟不上摄像头生产速度。如果不做背压,分析器回调里的帧会越积越多,内存上涨、帧卡顿、OOM风险都来了。

CameraX本身有背压机制,但我强烈建议显式控制处理频率。我的方案是:在分析器里做一个时间闸门,只有距上次处理超过200毫秒才接受新帧,其余帧直接关闭并丢弃。这样既能保证识别连续性,又不会在设备发热后陷入性能雪崩。

class OcrAnalyzer( private val recognizer: TextRecognizer, private val onResult: (String) -> Unit ) : ImageAnalysis.Analyzer { private var lastProcessTime = 0L override fun analyze(imageProxy: ImageProxy) { val now = System.currentTimeMillis() if (now - lastProcessTime < 200) { imageProxy.close() return } lastProcessTime = now // 创建InputImage并执行识别 // 结束前务必imageProxy.close() } }

摄像头流控制还有一个细节:分析器的输出格式默认是YUV_420_888,不同设备的像素排列差异可能影响识别效果。部分国产设备对YUV转RGBA的处理有兼容性问题,我在测试机群里遇到过识别率忽高忽低的情况,最后是在分析器配置里把输出格式改成RGBA_8888解决的,代价是内存占用略有上升,但稳定度好了很多。

3.5 识别结果筛选与防抖设计

OCR结果天然有抖动问题:同一个画面,不同帧识别出的文字内容可能出现细微差异,尤其是置信度边缘的字词,可能这一帧识别出来,下一帧就漏了。直接拿结果去刷新UI,用户会明显感到文字不停跳动。

我用的防抖策略是“短窗口投票”:连续N帧里,同一文本块出现次数超过阈值才判定为稳定结果。具体到实现,是维护一个最近几帧的文本结果集合,用文本内容做键,在窗口内统计出现频率。

还有一个容易被忽略的点:识别器内部有并发限制,同一个识别器不能同时处理多张图。如果短时间内调用太频繁,会直接抛“任务冲突”异常。所以分析器的背压闸门不仅是性能优化,也是规避并发出错的硬性要求。很多团队上线OCR功能后偶发崩溃,追到头就是这个原因。

4. 从Demo到生产:姿态检测、自定模型与模型托管

4.1 姿态关键点的语义理解

姿态检测API输出的是全身关键点的坐标集合。它把身体拆成三十二个左右的关键点,包含左右肩、肘、腕、髋、膝、踝等,每个点都带x、y、z坐标和置信度。z坐标表示该点相对相机平面的深度信息,做三维姿态判断时非常关键。

在理解这些坐标前,要建立一个观点:关键点坐标是“人体姿态的原始信号”,业务需求必须翻译成可计算的几何关系。比如:

  • 肘关节屈伸:肩-肘-腕三点的夹角
  • 躯干倾斜:肩中点和髋中点连线的倾斜角
  • 左右对称性:左右肩坐标差距

这些几何计算在数学上是初等运算,但工程上有讲究:直接拿原始坐标计算会因为抖动产生明显毛刺,需要做曲线平滑。我的做法是把关键点坐标丢进一个滑动窗口,先取中值再做角度计算。中值滤波比均值滤波更抗离群点,实测在快速动作场景下不会把角度算飞。

4.2 角度计算:用关节夹角做业务判断

这里给一个实际的夹角计算片段,用于判断肘部弯曲程度:

fun calculateAngle( first: PoseLandmark, mid: PoseLandmark, last: PoseLandmark ): Double { val v1 = Pair( first.position.x - mid.position.x, first.position.y - mid.position.y ) val v2 = Pair( last.position.x - mid.position.x, last.position.y - mid.position.y ) val dot = v1.first * v2.first + v1.second * v2.second val mag1 = sqrt(v1.first * v1.first + v1.second * v1.second) val mag2 = sqrt(v2.first * v2.first + v2.second * v2.second) return Math.toDegrees( acos((dot / (mag1 * mag2)).toDouble()) ) }

拿到角度之后,业务判断就可以基于规则做。比如健身动作计数:理论上可以只用一个角度做波峰波谷检测,但实操中我会同时叠加三个约束:目标角度超过阈值、动作持续超过一定帧数、两次动作间隔大于某时长。这样可以有效过滤掉“半程动作”和“抖动误触发”。

这套方案最怕的干扰是侧身和遮挡。侧身时左右关键点会互相重叠,遮挡时置信度骤降,很多误判其实发生在姿态追踪丢失的瞬间,而不是动作判断本身。所以判断逻辑的第一步永远是“相关关键点置信度是否足够”,置信不足直接不计算,而不是拿错误坐标硬算。

4.3 自定义模型:当内置API不够用时的出路

ML Kit不只有现成的识别能力,它也支持自定义TFLite模型。当业务需求是特定的图像分类、物体检测或场景分割,且内置API覆盖不了时,自定义模型是唯一路径。

这里先理清一个概念:ML Kit的自定义模型托管,解决的是“模型怎么分发”的问题,而不是“模型怎么训练”的问题。你在后端训练好一个TFLite模型,可以通过模型托管服务把它下发到设备端,设备端SDK负责下载、缓存和更新。这样可以绕开新版本发版上架的门槛,模型更新秒级生效。

配套能力里我觉得最重要的是条件下载,可以指定只在WiFi环境下下载,或者只在设备空闲时下载。这在模型文件几十MB时非常有意义。我经手的某设备质检项目就用这个能力,业务方每周更新一次不合格品分类模型,模型体积约30MB,只在WiFi下自动拉取,线上体验没有受到任何影响。

自定义模型接入时的推理部分,依然建议直接使用TFLite的Interpreter API,与ML Kit的远程管理配合。简单说,就是ML Kit管“分发到端”,TFLite管“在端上跑”。两步配合起来,一个完整的分发-加载-更新闭环就成型了。

自定模型上线前要做充分的真机推理耗时评测。不同芯片的推理速度差异可能达到两倍以上,这个差异直接影响业务体验。我通常拿中低端设备作为性能基线,如果中低端设备能稳定在30毫秒内完成推理,那全机型覆盖基本就没有悬念。

4.4 模型下发的工程化检查

模型托管不是上传就完事。我建议在实际项目中至少检查以下几项:

第一,模型兼容性。上传的必须是TFLite格式的模型文件,在个别版本上可能会遇到版本兼容问题,所以开发阶段就要和推理引擎版本对齐,避免上线时才暴露。

第二,下载失败重试策略。模型下载可能因为弱网中断。代码里要监听下载失败的状态,设计重试机制和取消条件。

第三,版本回滚。如果线上模型效果明显劣化,要有手段快速回退到旧版本。

我曾经在一次设备端模型迭代中因为没有做版本回滚,导致某个硬件固定识别错误持续了近一周。后来我在下发层加了一个监控:识别结果置信度全局均值如果低于阈值,自动启动回滚流程,问题才彻底解决。

5. 设备端AI的真实战场:内存、发热、兼容与背压

5.1 内存与位图转换的细节

设备端AI最容易踩的坑之一,是“内存好像没怎么用,却莫名其妙被系统回收”。根本原因常常不是推理本身占内存大,而是输入图像的转换链路里堆了太多临时对象。

我见过一个典型场景:从文件读取一张大图,先解码成Bitmap,再通过Canvas缩放,再新建Bitmap给识别器。三个Bitmap同时在内存里,一张两三百万像素的图就能把内存吃掉几十兆。正确做法是用采样解码,或者直接用矩阵变换复用一个Bitmap,避免反复分配。

还有一个细节是Bitmap的像素格式。ML Kit的InputImage.fromBitmap内部会做像素格式转换,如果Bitmap的配置不是ARGB_8888,转换开销更大。我的习惯是统一把送入识别器的Bitmap配置成ARGB_8888,处理复杂度和转换损耗都更可控。

在视频帧处理场景,重复使用同一个Bitmap对象会带来显著收益。摄像头分析器每帧产生新的内存区,如果再把Bitmap复制一遍,那一整条链路都在频繁分配和回收。我的做法是维护一个复用池,帧数据到达时直接写入预分配的缓冲区,用完不释放,下次继续用,实测GC压力降低非常明显。

5.2 发热与掉帧的排查思路

发热的根源是推理占用了太多CPU时间,尤其是大模型和密集调用同时发生时,机身温度迅速上升,接着系统主动降频,推理更慢,形成恶性循环。

所以设备端AI项目的性能基线,不应该只看“单次推理耗时”,还要看“单位时间的推理次数”和“CPU核心的实际占用”。扫码场景5到10FPS就够,OCR场景甚至可以低到2到3FPS,不需要追求每一帧都推理。

我看项目卡顿的第一优先级永远是“推理调用是否均匀分布”,而不是“单次推理是否足够快”。均匀调用能防止CPU在短时间高负载,避免发热和掉帧。实现方式就是前面说的时间闸门加队列调度。

另外建议给分析器设置分辨率上限。CameraX里配置ImageAnalysis的setTargetResolution,把输出控制在1280*720以内,高端机依然保持准确率,低端机的推理耗时却能下降接近一半。这条在测试机群上反复验证过。

5.3 设备兼容差异与系统组件依赖

ML Kit的能力有一些是依附于系统组件的,比如部分API依赖Google Play服务;独立版依赖则完全打包在应用内。这个选择影响设备兼容面,尤其在国内设备生态里,系统组件情况比较复杂。我这边采用独立版之后,兼容性投诉大幅减少,这里再重复一遍我的结论:做设备端AI,可控性优先于体积优化。

还有一个隐蔽问题是相机数据格式兼容。前面提到YUV_420_888在不同设备上处理结果不一致,这是我在多个设备上对比识别结果时发现的。很多低端设备的CameraX实现有细节差异,导致同样的图像数据在不同机型上颜色通道错位,进而影响OCR识别率。测试机型覆盖一定要做起来,特别是中低端设备一定安排。

5.4 真机验证清单

设备端AI的工程验收不能只跑模拟器。模拟器上的CPU指令集和真机差异巨大,推理耗时、内存占用、发热表现都不足为据。我的真机验证清单如下:

  • 识别类功能:覆盖二维码、印刷体中文、票据类版面,分别测弱光、背光、平拍、斜拍
  • 性能类项目:记录中低端机上单次推理耗时、连续识别30分钟后的机身温度、后台切换后再进入的恢复速度
  • 兼容类项目:至少覆盖四五个主流品牌的中低端机型,重点看相机帧格式和模型加载情况
  • 稳定性类项目:长时间运行OCR识别,观察内存抖动和帧丢失比例

这套检查项看起来繁琐,但每次都能在测试阶段抓到线上问题。设备端AI的工程难点从来不在“能不能跑通”,而在“有多少设备能稳定跑”,前置验证做足,线上事故少一大半。

另外,如果你在做跨平台框架应用,也得提前确认ML Kit对应平台的封装方案。虽然SDK本身主要面向原生生态,但跨平台框架基本都有插件或模块,只是能力和更新节奏需要单独评估。我建议核心识别链路仍然用原生实现,UI层交给跨平台框架,这样性能和可控性都更稳妥。

回到开头那个扫码加OCR的项目。现在它的识别全部在端侧完成,飞机高铁上都能用,后台服务只在特殊场景下兜底调用云端模型。用户感知上最明显的变化是“快”和“稳”,这恰好就是设备端AI的价值所在。做移动端AI应用时,把这一层能力用好,产品和体验都能赢得很踏实。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询