课程导论与硬件选型:MCU为什么能跑视觉算法?
大家好,欢迎来到《嵌入式视觉算法在MCU上的部署实战》的第一课。
说实话,几年前有人跟我说要在MCU上跑视觉算法,我第一反应是「你疯了吧?」。那时候我手头一个项目,想在STM32F4上做个简单的颜色识别,结果帧率惨不忍睹,内存也捉襟见肘。但这两年,情况完全变了。
MCU跑视觉算法,说白了就是「螺蛳壳里做道场」。你想想看,一个摄像头模组动辄几十万像素,而一颗MCU的RAM可能只有几百KB。这中间的鸿沟怎么填?靠的就是算法裁剪、硬件加速和巧妙的内存管理。
为什么MCU能跑视觉算法?
核心原因有三个:
- 算法轻量化:传统的OpenCV动辄几百兆,但MobileNet、TinyML这类模型只有几十KB。我去年在i.MX RT上部署过一个手势识别模型,量化后只有48KB,跑起来毫无压力。
- 硬件加速单元:现在的MCU普遍集成了DSP、SIMD指令集,甚至NPU。比如ESP32-S3就有向量指令,做卷积运算比纯CPU快5-10倍。
- 内存管理技巧:图像数据不需要全部加载到RAM。你可以用「乒乓缓冲」——一边采集一边处理,内存占用能砍掉一半。
关键认知:MCU跑视觉算法,不是跟PC比性能,而是「够用就好」。一个简单的二维码识别,在MCU上跑30fps,比在树莓派上跑100fps更有意义——因为功耗只有后者的十分之一。
主流MCU平台对比
我这些年用过不少平台,挑三个最有代表性的说说。
| 平台 | 主频 | RAM | Flash | 硬件加速 | 典型功耗 | 适合场景 |
|---|---|---|---|---|---|---|
| STM32F7/H7 | 216-480MHz | 512KB-1MB | 1-2MB | DSP、FPU | 200-500mW | 工业视觉、条码识别 |
| ESP32-S3 | 240MHz | 512KB | 16MB(外挂) | 向量指令、PIE | 80-200mW | IoT视觉、人脸检测 |
| i.MX RT1170 | 1GHz | 2MB | 8MB(内部) | NPU、MIPI CSI | 500mW-1W | 边缘计算、实时识别 |
STM32系列:老牌劲旅
STM32的生态太成熟了。HAL库、CubeMX、各种中间件,上手极快。我最早的项目就是用STM32F767做的——一个工业读码器。当时遇到个坑:DCMI接口的DMA配置不对,图像数据总是错位。后来发现是FIFO阈值设错了,调了一整天。
STM32的优势在于稳定性和工具链。但说实话,它的算力在视觉领域有点「勉强」。跑个30万像素的灰度图还行,要是彩色图加滤波,帧率就掉到个位数了。
我的建议:如果你刚入门,从STM32开始。用OV2640摄像头,做个简单的二值化+轮廓识别,成本低、资料多。等跑通了再升级平台。
ESP32-S3:性价比之王
ESP32-S3让我挺惊喜的。它内置了向量指令集,做矩阵运算效率很高。而且支持PSRAM,可以外挂8MB甚至16MB的RAM——这在MCU里很少见。
我记得有个项目,要在智能门锁上做人脸检测。用ESP32-S3搭配OV2640,跑了个轻量级的MTCNN,帧率能到15fps。关键是整机功耗才150mW,用电池能撑半年。
不过要注意,ESP32的ADC精度一般,而且WiFi/BT同时开的时候,CPU会被抢占。做实时视觉时,最好把无线功能放到另一个核心上。
i.MX RT:性能怪兽
i.MX RT系列是NXP的跨界处理器。说它是MCU吧,主频1GHz;说它是MPU吧,又没有MMU。但跑视觉算法,它确实是最强的。
它内置了NPU,可以硬件加速卷积运算。我测试过,跑MobileNetV2,i.MX RT1170比STM32H7快20倍。而且它有MIPI CSI接口,可以直接接高清摄像头,不用转接。
但代价是功耗和成本。一颗i.MX RT1170要几十块钱,比STM32贵不少。而且它的开发环境相对复杂,MCUXpresso虽然好用,但跟Keil比还是差点意思。
避坑指南:我曾经在i.MX RT上踩过一个坑——它的内部SRAM分成了多个bank,如果DMA和CPU同时访问同一个bank,会触发总线冲突。解决办法是把图像数据放在TCM区域,或者用分散加载文件手动分配内存。
算力与内存的权衡
做嵌入式视觉,本质上就是在算力和内存之间找平衡。我总结了一个「黄金三角」:
- 分辨率:QVGA(320x240)是MCU的甜点。再高的话,内存和算力都扛不住。
- 帧率:10-15fps是实用线。低于5fps,用户体验就很差了。
- 算法复杂度:尽量用量化模型。INT8比FP32快4倍,内存占用只有四分之一。
举个例子。你想做一个人脸检测,用320x240的灰度图,跑一个量化后的MTCNN。模型大小约100KB,运行时内存约200KB。在ESP32-S3上,帧率能到12fps。如果你换成640x480的彩色图,内存直接飙到1.2MB,帧率掉到3fps——这就没法用了。
核心公式:
内存占用 = 图像缓冲区 + 模型参数 + 中间特征图 + 堆栈开销
算力需求 = 图像分辨率 × 算法复杂度 × 帧率
记住这个公式,选型时就不会翻车。
选型决策树
我一般按这个思路选型:
- 先看算法:模型多大?需要多少内存?如果是简单的二值化、边缘检测,STM32就够了。
- 再看帧率:需要实时吗?如果10fps够用,ESP32-S3性价比最高。
- 最后看功耗:电池供电还是插电?电池供电的话,i.MX RT基本不用考虑。
嗯,这里要注意一点:不要只看芯片本身。开发板的价格、调试工具、社区支持都很重要。我见过有人为了省20块钱选了个冷门芯片,结果遇到问题连个问的人都没有,最后项目延期了两个月。
好了,这一课就到这里。下一课我们会深入讲「图像采集与预处理」,包括DCMI接口配置、DMA传输、以及如何用乒乓缓冲提高效率。到时候我会分享一个我踩过的坑——DMA传输完成中断里做图像处理,结果导致帧率下降了一半。想知道为什么吗?下节课见。