先给结论:宠物AI摄像头的低功耗,不是某一个芯片或者某一版算法的功劳,而是把“芯片选型、算法裁剪、系统调度”三段拧成一条绳之后才拿得到的结果。我做这块有一段时间了,手头过过不少方案,也踩过很多只有长时间实测才能暴露的坑。今天这篇我就按自己的实战过程,从功耗预算、芯片取舍、算法瘦身,一直讲到休眠状态机和电源域设计,最后再把几个最容易翻车的细节一并交代清楚。
如果你正准备做一款电池供电的宠物AI摄像头,或者手里已经有样机但续航一直不理想,这篇文章应该能帮你省下几个月的试错时间。下面按我的实践顺序展开。
1. 功耗预算怎么算:先定场景再谈芯片
1.1 宠物摄像头比安防摄像头难在哪儿
很多人一上来就问“选哪颗芯片功耗低”,其实这是个伪问题。宠物AI摄像头和门口安防摄像头最大的不同,是供电方式和使用场景。安防摄像头可以有线供电,5V/12V拉到哪里都行;但宠物摄像头要放进猫爬架、狗窝边、墙角这些位置,基本只能靠电池,否则主人不会买一个到处是线的“移动摄像头”。
场景上宠物设备也更苛刻。猫的动作很快,狗拆家可能就几分钟,摄像头必须长期处于“随时可唤醒”的状态,但又不能全时开着Wi-Fi、全时跑AI推理。再加上用户还要远程双向语音、喊猫狗过来,这意味着系统在事件驱动之外,还要支持按时或按需从休眠中快速醒来。结果就是:同样一块5000mAh电池,如果按安防摄像头的“插电+全时录像”思路做,宠物产品一天可能都撑不过去。
所以正确的做法不是先挑芯片,而是先做功耗预算:把你能接受的电池容量、目标续航天数和典型事件频次定下来,反推平均电流上限,再倒逼芯片选型和算法设计。顺序反了,后面全是被动填坑。
1.2 一个算例:5000mAh电池撑七天的平均功耗上限
我们以最常见的锂电池方案来算一下。5000mAh电芯,标称电压3.7V,总能量约18.5Wh。目标续航7天,也就是168小时。那么平均功率上限就是:
18.5Wh ÷ 168h ≈ 110mW。
折算成从电池取用的平均电流,110mW ÷ 3.7V ≈ 30mA。
这个30mA不是瞬时电流,而是整整7天的平均电流。它意味着什么?我举个例子:如果设备全时开着Wi-Fi,哪怕什么都不传,很多Wi-Fi模组的平均电流也能到15-30mA,甚至更高;如果再全时做AI识别,随便就冲到几百毫安。所以必须把“全时”变成“分时”和“事件驱动”,把平均电流压到目标以内。
更细一点算账,日常功耗大概由三个大头组成:
- 待机电流:这是24小时都在消耗的部分。待机电流每多1mA,一天就多吃24mAh,7天就是168mAh。
- 事件处理电流:比如一次PIR触发、一次AI识别、一段短视频本地缓存。假设每天30次事件,每次激活8秒、平均电流450mA,那一天就是30 × 8s × 450mA ≈ 30mAh。这个量级还好,但如果每次事件还要联网传视频,时间拉长到30秒,那就会到100mAh以上。
- 用户主动预览:主人远程打开直播画面,这时候整个链路全开,电流可能到600mA以上。哪怕每天只看5分钟,也要吃掉约50mAh。
把这几项加起来,你会发现一个很反直觉的结论:很多时候续航杀手不是AI推理,而是“没事也醒着”和“醒了之后联网不撒手”。AI推理虽然瞬时功耗高,但只要控制住持续时间,它在总预算里占比并不大。这也是我后面优化顺序的指导思想:先压待机,再压联网,最后优化AI推理时长。
2. 芯片方案选型:谁在待机,谁做AI,谁负责联网
2.1 三条技术路线的取舍
芯片是整个低功耗设计的地基。我做过几个不同方向的方案,主流上可以分成三条路线,各有各的适用位置。
| 路线 | 代表芯片 | 待机/睡眠功耗 | 运行功耗 | AI能力 | 适用场景 |
|---|---|---|---|---|---|
| 单MCU + 云端AI | STM32F103C8T6、ESP32 | MCU深度睡眠可到数µA,Wi-Fi连接待机约1-10mA | 30-200mA | 本地几乎不跑AI,画面或图像传云端 | 不介意云端成本与隐私,网络稳定 |
| MCU + 视觉SoC双芯 | STM32/ESP32 + RV1106/RV1103、君正T40 | 常电MCU数µA,视觉SoC可彻底断电 | SoC运行时300-800mA,NPU推理期间短时偏高 | 0.5-1TOPS级别NPU,可本地跑轻量检测模型 | 电池供电、需要本地AI识别与事件录像 |
| 单颗大算力SoC | RK3588 | 待机功耗高,常开不适合电池 | 2-5W以上 | 6TOPS以上,模型上限高 | 插电式家庭中枢、固定安防摄像头 |
从实际产品形态看,电池版宠物AI摄像头目前最稳妥的是第二条路线:一颗超低功耗MCU常驻,负责睡眠唤醒、RTC计时和粗粒度事件检测;一颗带NPU的视觉SoC平时完全断电,只在确认有事件需要做AI识别时再“临时叫醒”。
很多人会觉得RK3588这类芯片“功能强、什么都能跑”,但低功耗设备的逻辑不是“能不能跑”,而是“不跑的时候能不能睡得够死”。RK3588用来做插电版的家庭AI中心确实香,放到电池设备里常开,光待机就够让续航按天而不是按周来计算了。选型不是选最强的,而是选“在该睡的时候能睡到uA级”的。
2.2 唤醒链路里的芯片分工
在这套双芯方案里,各颗芯片的分工必须非常清楚。
常电路上的MCU(比如STM32F103C8T6最小系统板这类低成本、低功耗MCU)负责三类工作:
- 维护RTC,支持定时唤醒;
- 读取PIR传感器、低分辨率摄像头帧差结果,做“有没有运动”的粗判断;
- 作为系统级电源开关,决定什么时候给视觉SoC、Wi-Fi模块这些大功耗外设上电。
视觉SoC平时是断电状态。一旦MCU判断事件足够“像宠物活动”,再给SoC上电。SoC启动后接管摄像头Sensor,做ISP处理和NPU推理,识别出结果后生成事件信息,再决定是否联网上传。处理完以后,MCU再次把所有非必要模块断电,自己回到深度睡眠。
这套流程里有一个细节特别重要:尽可能不要每次事件都走“冷启动”。因为SoC冷启动往往要几百毫秒甚至更久,等系统起来,猫早就跑了。我见过不少方案在这个地方耗电严重,每次事件都让SoC从零启动,光是启动阶段的大电流就把功耗预算吃掉大半。更合理的做法是:常电路的MCU在事件触发时,先把摄像头Sensor供电打开,抓一帧图放到共享缓存里,再让SoC快速恢复。SoC尽量走suspend/resume的快速链路,而不是每次从头做DDR初始化、挂载文件系统。这一项做到位,事件响应的有效功耗能差出三到五倍。
3. 算法怎么瘦:从全时全帧识别到事件驱动推理
3.1 模型压缩三板斧:量化、剪枝、蒸馏
芯片选完之后,算法就是决定AI功耗的关键。很多人喜欢把训练好的模型直接丢到板子上跑,结果发现延时高、发热大、电池扛不住。实际上,嵌入式AI模型在上板之前,必须做一轮“瘦身”工程。
第一是量化。视觉SoC上的NPU通常原生支持INT8推理,把FP32模型转成INT8后,模型体积直接缩到四分之一,推理速度普遍能提升两三倍。但量化一定要用宠物场景的真实图片做校准集,比如猫在不同光线下的抓拍图、狗在家里跑动的模糊帧。如果用网上随便找的风景图做校准,量化误差会让你在弱光时频繁误报或漏报。
第二是剪枝。模型里很多通道对最终结果贡献很小,尤其是靠近输入层的部分。用结构化剪枝把冗余通道砍掉30%,在多数检测任务上精度损失可以控制在1%以内。剪枝后再做一次微调,把掉点找回来。这一步降低的直接收益不光是计算量,还有NPU在推理时缓存和DDR访问的功耗。
第三是蒸馏。如果剪枝后的轻量模型精度总觉得差口气,可以用大模型当老师来带。比如用YOLOv5m在宠物数据集上先训一版,让它在同样的输入上生成软标签,再用这些软标签去训练YOLOv5s或更轻的检测头。这样小模型能学到比硬标签更丰富的语义信息,精度往往能逼近大模型,同时推理代价小得多。
我自己在RV1106这类0.5TOPS NPU上跑宠物检测时,最终的模型就是从YOLOv5s量化到INT8再剪枝后的版本,体积在1.2MB左右,单次推理耗时个位数毫秒到十几毫秒,NPU并不需要长时间高负荷工作,发热和功耗都很可控。
3.2 帧采样和ROI裁剪,成本最低的省电手段
算法功耗不只看模型本身,还要看“模型被调用的频率”。这是很多团队容易忽略的点。你哪怕有再轻量的模型,如果全时以25fps跑,功耗照样爆炸。所以在算法层面,第一优先级不是优化模型,而是优化输入策略。
我常用的策略分三层:
- 待机监控层:用MCU侧的低分辨率灰度帧,以0.5fps到1fps的帧率做帧差。这一层几乎不消耗什么功耗,MCU本身的电流就很小,但它能挡住大多数“树叶晃动、光影变化、飞虫路过”的无效干扰。
- 事件确认层:帧差触发后,把摄像头Sensor切到稍高的帧率,抓几帧图做ROI提取,把目标区域裁剪出来,只把这块区域送给NPU做一级分类:是人、猫、狗,还是其他。
- 精细识别层:确认是目标宠物后,才运行二级行为模型,比如吃饭、喝水、排泄、磨爪、异常叫声等。行为模型计算量更大,但只在需要的时候跑一两次,而不是全时跑。
ROI裁剪这件事特别容易被低估。假设全画面是1080P,识别时只裁剪出320×320的目标区域,NPU的计算量、DDR带宽和耗时都会明显下降。帧差检测已经在MCU侧给出了目标框,SoC起来以后直接继承这个框,完全不需要对全图做目标检测。这一套流程走下来,真正触发NPU推理的次数可能只有原来“全时全帧检测”的几十分之一。
还有一个算法侧的小技巧:置信度阈值不要设太低。好多误报其实不是模型不行,而是阈值选得太激进,导致一只飞蛾靠近镜头就触发一次事件。每次误触发都有唤醒、推理、缓存、甚至联网动作,一天多十几次假警报,续航立刻打折。合理做法是在夜间和白天分别设置阈值,并用连续两到三帧确认来过滤单帧误检。
3.3 行为识别流程的编排顺序
把整套推理流程落成工程步骤,大概是这样的:
- 常电MCU周期性抓低分辨率帧,做帧差/背景建模,检测画面变化;
- 如果变化超过阈值,认为可能是目标出现,唤醒视觉SoC和Sensor;
- SoC拿到ROI后先跑一个极轻量的目标分类器,判断画面里是不是目标宠物;
- 如果确实是宠物,启用行为模型做精细识别,并把这段事件的关键帧和短视频写入本地缓存;
- 行为命中后,把事件摘要和缩略图传到用户App端;如果用户选择远程预览,再建立视频流;
- 连续N分钟没有新事件,SoC挂起、Wi-Fi休眠、Sensor降帧,回到待机状态。
这里的关键思想是两级甚至三级过滤。第一级过滤用MCU上的传统视觉,成本几乎为零;第二级过滤用轻量分类模型,成本低;第三级才是真正的精细行为识别,成本高但调用少。算法团队的任务不是把单次识别做到极致,而是把高成本操作的调用频次压到最低。这个思路放在任何嵌入式AI场景都成立。
4. 系统级设计:电源域、休眠状态机与固件调度
4.1 五级功耗状态定义
芯片和算法都定好之后,接下来是系统级功耗控制。我不喜欢只笼统地谈“休眠”,因为实际产品里休眠分好几个层级,每个层级的功耗、唤醒时间和可恢复上下文都不一样。我用过一个五级状态模型,从高到低如下:
| 状态 | 运行部件 | 典型功耗量级 | 唤醒到可用时间 | 切换触发条件 |
|---|---|---|---|---|
| ACTIVE | SoC、Sensor、Wi-Fi、NPU全开 | 300-800mA | 立即 | 事件处理、视频预览、固件升级 |
| IDLE | SoC和Sensor待命,外设关断 | 30-80mA | 毫秒级 | 事件处理完毕,短时等待下一个事件 |
| LIGHT_SLEEP | MCU直管,Sensor以低帧率采集 | 2-10mA | 数毫秒 | 空闲阈值到达,比如30秒内无新事件 |
| DEEP_SLEEP | MCU低功耗模式+RTC+PIR | 50-200µA | 数十毫秒 | 长时间无事件,比如夜间无人活动 |
| OFF | 仅PMU静态电流、电量计 | <10µA | 冷启动 | 电池低电或用户关机 |
系统固件要做的就是根据当前时间、用户设置和历史事件概率,动态决定停在哪个状态。比如白天主人上班,家里猫可能活跃,可以停在LIGHT_SLEEP和IDLE之间,响应快一点;深夜如果宠物也在睡,就进入DEEP_SLEEP,把整机电流压到百微安以内。
这个状态机必须结合业务语义,否则很容易变成“定时休眠”一睡了之。我见过一些产品为了省电,给设备设了很短的休眠超时,结果猫经过时设备还在休眠,事件漏拍。温度、时段、用户是否在线观看,都应该参与状态决策。
4.2 电源域划分与外设开关
低功耗系统里,电源域划分比“软件置睡眠位”更硬核。一个基本原则是:不能只依赖芯片内部的power mode,任何不用的外设都必须从源头断电,而不是仅仅让它们进入软件待机。很多外设的待机电流看着很小,但几个叠加起来,会把整机待机电流拉到不可接受的水平。
我的实际划分方式如下:
- 常电域:MCU、RTC(如果有独立RTC芯片)、电量计、PIR传感器、唤醒按键。这一路必须从系统一上电就存在,电流控制在几微安到几十微安。
- 可关断域A:摄像头Sensor、ISP、视觉SoC、DDR。这是系统的“AI计算中心”,功耗大,平时必须彻底断电。
- 可关断域B:Wi-Fi/BLE模块。只在需要联网上报或用户预览时上电,传完立即断。
- 可关断域C:扬声器、麦克风、云台电机、红外补光灯。这路单独控制,防止语音交互或云台转动时干扰到其他域。
每个可关断域前面用一个负载开关或MOS管控制,GPIO给低电平就彻底断电。上电顺序也有讲究:先启动PMU和MCU,等电压稳定后再逐个打开视觉域、连接域、交互域,避免所有大电容同时充电造成电压跌落。掉电顺序则反过来,先关高电流外设,最后让MCU进入深度睡眠。
4.3 软件层配合:RTOS tickless与Linux低功耗框架
软件层面,低功耗设计不只是“调一个sleep函数”那么简单。
如果主控跑的是FreeRTOS这类RTOS,要开启tickless idle模式。否则系统滴答时钟会周期性唤醒CPU,导致MCU根本睡不踏实。另外任务架构要尽量采用事件驱动,不要把传感器轮询做成一个高频任务,而是把PIR、RTC定时、外部中断都映射成唤醒源。
如果视觉SoC跑的是Linux,低功耗优化又是一个纵深话题。简单列几个我常用的抓手:
- cpuidle governor选型,让CPU在空闲时进入较深的idle状态;
- devfreq动态调节DDR和NPU频率,推理时拉高,空闲时拉低;
- 设备树里默认disable掉所有不用的控制器,比如没用到的USB、以太网、MIPI第二路;
- 用suspend-to-RAM而不是真正的power off,保证毫秒级恢复能力;
- 内核日志和用户态服务都尽量精简,避免后台进程定时唤醒系统。
联网策略同样值得单独设计。我的习惯是:平时Wi-Fi进入休眠,设备通过BLE维持一个低频可发现状态;当用户打开App想预览时,通过BLE或云端信令快速唤醒Wi-Fi,建立视频链路。如果产品本身主打Wi-Fi直连,没有BLE,那就让Wi-Fi保持低功耗监听模式,同时把Keep-Alive时间拉长,避免每几十秒醒来灌数据。这块往往是整机平均电流的大头,优化空间相当可观。
5. 实测中踩过的三个坑:发热、漏电、启动浪涌
5.1 NPU满载发热:电池和画质都成了受害者
我第一次把检测模型跑到视觉SoC上时,遇到的最直接问题是发热。NPU连续推理几分钟,芯片表面温度能到七十度以上,而摄像头Sensor就贴在芯片附近,画面开始出现偏红、偏紫的热噪声。更麻烦的是,电池在这种持续高温下容量衰减加快,夏季环境温度高的时候,整机续航肉眼可见地缩水。
后来我做了三件事。第一,限制连续推理时长,改用“脉冲式推理”:识别5秒、暂停10秒,而不是让NPU长时间满载。第二,在固件里给NPU和CPU频率设定上限,牺牲一点单次延时,换整体热功耗可控。第三,硬件上把导热硅垫和外壳散热结构设计进去,热量优先导到机身大面积金属或塑料外壳,而不是让热量在Sensor背面聚集。
这里有个经验判断:发热和功耗是同一件事的两个侧面。如果你的设备在测试中发现某块外壳明显发烫,不用怀疑,设计上一定存在不必要的持续高功耗。找到烫源,通常也就找到了功耗优化的突破口。
5.2 隐藏的静态漏电,让续航直接腰斩
有一版样机,理论待机电流我算好可以到80µA左右,实测却一直是0.8mA附近,差了整整一个数量级。这种“隐性漏电”最坑人,因为芯片手册上每个模块的静态电流明明都达标。
排查方法不复杂,但要有耐心。把万用表串在电池和主板之间测整机电流,然后用跳线逐一短接电源域测试点,把一个域一个域地“隔离”出来。最后发现是摄像头Sensor的reset引脚悬空,芯片内部上拉电阻一直在耗电。为什么选型时没发现?因为开发板上这颗引脚下拉到了GND,而我们自己的板子在画原理图时少画了一个下拉电阻。这个教训让我养成了一个习惯:所有不用或用不到的GPIO,在固件里必须明确配置成确定电平,绝不能靠“默认状态”。
除了GPIO悬空,常见的隐藏漏电源还有:PMU的静态电流比标称高、LDO空载时仍有损耗、电量计分压电阻长期通电、电池保护板自身耗电。这些加起来可能不大,但在“待机目标50µA”这个量级下,每一微安都值得较真。
5.3 上电浪涌导致电池保护板误保护
另一个让我印象很深的坑是:设备在电池仓放了一周后,第一次上电偶尔开不了机,要插一下充电器才能恢复。后来用示波器电流探头抓上电波形才发现,原因不是MCU没跑起来,而是上电瞬间几个电源域的大电容同时充电,瞬时电流尖峰触发了电池保护板的过流保护,供电直接被断开,整机自然起不来。
解决方案是软启动。硬件上在电源入口增加缓启动电路或PTC自恢复保险丝,限制最大浪涌电流;软件上做一个“分时上电”的启动序列:先开PMU等电压稳定,再开MCU,延迟几十毫秒,再开Sensor和SoC,再延迟,最后才开Wi-Fi和补光灯。不要指望一颗SoC的power-on sequence能完成所有外设的上电管理,外部电源时序还是要自己在固件里控制。
这个坑说明,低功耗设计不能只关注稳态,启动瞬间的动态电流同样能决定产品的可靠性。测试时一定要把“电池放置几天后的首次上电”列入常规用例,而不是只在台式电源下测。
5.4 用24小时真实电流曲线验收续航
最后说下验证手段。我很少只看芯片手册里的理论功耗,而是坚持做整机电流采集。测试时用一个能记录电流波形的仪器(joulescope、Nordic PPK2这类都可以,没有的话也可以用电高采样率万用表或电阻采样+示波器),然后跑一个模拟宠物家庭生活的场景脚本:白天每隔一段时间出现一次“宠物活动”,晚上完全安静,中间穿插几次用户远程预览。
把这条电流曲线积分,就能算出平均电流,再结合电池容量估算真实续航。我通常会连续采集至少24小时,因为只测两个小时,很可能错过夜间深度睡眠与白天事件态之间的切换差异。这个“累计平均电流”才是衡量低功耗设计成功与否的唯一标准。
顺着芯片、算法、系统这三个关键词一直做到这里,我发现低功耗设计的本质其实就是一句话:在正确的时间,只给需要工作的模块供电,只做必要的推理,只传必要的数据。功耗预算、芯片选型、算法裁剪、系统调度,都是在往这一句话上靠。我个人的习惯是,每次改版都采集一条24小时真实电流曲线,白天放客厅、晚上放卧室,跑两天再算平均功耗,电脑上算出的理论值永远没有这条曲线来得诚实。如果你正准备做类似产品,建议也把这套流程从头到尾走一遍,很多看似合理的方案,一上电流曲线就露馅了。