1. 项目全景:嵌入式视觉是什么?硬件选型与软件栈概览
大家好,我是你们这门课的主讲。在正式开始动手之前,我觉得有必要先聊聊「嵌入式视觉」到底是个什么东西。很多新手一上来就急着调代码、跑模型,结果硬件选错了,软件栈搭得乱七八糟,最后项目烂尾。我见过太多这样的案例了。
嵌入式视觉,说白了就是让一个「小电脑」能看懂世界。它跟咱们手机上的拍照不一样——手机拍完照,后台有强大的云端服务器帮你处理。嵌入式视觉呢?所有计算都得在本地完成,功耗、算力、成本都有严格限制。你想想看,一个扫地机器人要是每识别一个障碍物都要联网,那它早就撞墙了。
核心要点:嵌入式视觉 = 嵌入式系统 + 计算机视觉算法。目标是在资源受限的硬件上,实现实时的图像采集、处理和理解。
1.1 硬件选型:三款主流平台的实战对比
选硬件是第一步,也是最容易踩坑的一步。我个人习惯把嵌入式视觉项目分成三类:轻量级、中量级和重量级。对应的硬件平台,我推荐这三款:树莓派、Jetson Nano、STM32。
| 平台 | 算力 | 功耗 | 典型场景 | 我的推荐指数 |
|---|---|---|---|---|
| 树莓派 4B | 中等(CPU为主) | 5-7W | 原型验证、教育、智能家居 | ⭐⭐⭐⭐ |
| Jetson Nano | 高(GPU加速) | 10-15W | 边缘AI、实时检测、机器人 | ⭐⭐⭐⭐⭐ |
| STM32H7 | 低(MCU级别) | 0.5-1W | 工业控制、低功耗传感器 | ⭐⭐⭐ |
树莓派:我最常用的原型平台。它生态好,社区资源多,遇到问题随便一搜就有答案。但说实话,它的CPU跑OpenCV还行,跑深度学习就有点吃力了。我在做一个手势识别项目时,用树莓派跑MobileNet,帧率只有5-6fps,根本没法用。
Jetson Nano:如果你要做真正的边缘AI,选它没错。它自带128个CUDA核心,跑TensorFlow Lite或者ONNX Runtime的模型,速度能比树莓派快5-10倍。我记得有一次做工业质检项目,客户要求实时检测,树莓派直接阵亡,换了Jetson Nano后,帧率稳定在30fps以上。
STM32:嗯,这里要注意。STM32不是用来跑复杂视觉算法的。它适合做「轻量级视觉」,比如简单的颜色识别、二维码扫描。我曾在一条产线上用STM32做物料分拣,只用了灰度直方图匹配,效果出奇的好。功耗低、成本低、稳定性高,这是它的优势。
我的建议:初学者从树莓派入手,成本低、上手快。等你有了一定基础,再考虑Jetson Nano做高性能项目。STM32适合有嵌入式开发经验的老手。
1.2 软件栈概览:OpenCV、TensorFlow Lite、ONNX Runtime
硬件选好了,接下来就是搭软件栈。很多同学问我:「老师,我该学哪个框架?」我的回答是:别纠结,全都要。但你要知道它们各自擅长什么。
OpenCV:这是视觉项目的「地基」。图像读取、预处理、特征提取、几何变换……这些基础操作全靠它。我刚开始做视觉项目时,觉得OpenCV太底层了,总想用高级框架。后来发现,没有OpenCV,你连图像都打不开。它支持C++、Python,在树莓派和Jetson上都能跑。
TensorFlow Lite:谷歌推出的移动端/嵌入式端推理框架。它的核心优势是模型量化——把32位浮点模型压缩成8位整数模型,体积缩小4倍,速度提升2-3倍。我在Jetson Nano上部署过TFLite模型,效果非常棒。但要注意,TFLite对某些算子支持有限,模型转换时可能会报错。
ONNX Runtime:微软开源的跨平台推理引擎。它的最大好处是「一次转换,到处运行」。你可以在PyTorch里训练模型,导出ONNX格式,然后在树莓派上跑。我最近的一个项目就是用PyTorch训练YOLOv5,转ONNX后在Jetson上部署,整个过程非常丝滑。
避坑指南:我曾经在STM32上尝试跑TFLite模型,结果发现STM32的RAM根本装不下。后来改用ONNX Runtime的Micro版本,才勉强跑起来。所以,选框架前一定要先评估硬件资源。
1.3 软件栈的典型组合
根据项目需求,我总结了三种常见的软件栈组合:
- 轻量级(STM32):OpenCV(裁剪版) + 裸机/FreeRTOS。适合简单的颜色识别、二维码扫描。
- 中量级(树莓派):OpenCV + TensorFlow Lite + Linux。适合人脸检测、物体分类。
- 重量级(Jetson Nano):OpenCV + ONNX Runtime + CUDA。适合实时目标检测、语义分割。
你可能会问:「为什么不用TensorFlow Lite跑在Jetson上?」其实也可以,但ONNX Runtime对GPU的利用率更高。我做过对比测试,同样一个YOLOv5模型,ONNX Runtime在Jetson上的推理速度比TFLite快约20%。
1.4 一个简单的实战示例
说了这么多理论,咱们来点实际的。下面是一个在树莓派上用OpenCV读取摄像头画面,并用TensorFlow Lite做物体分类的代码骨架:
import cv2
import tensorflow.lite as tflite
# 加载TFLite模型
interpreter = tflite.Interpreter(model_path="model.tflite")
interpreter.allocate_tensors()
# 打开摄像头
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# 预处理:缩放、归一化
input_data = cv2.resize(frame, (224, 224))
input_data = input_data.astype("float32") / 255.0
# 推理
interpreter.set_tensor(input_details[0]["index"], [input_data])
interpreter.invoke()
# 获取结果
output_data = interpreter.get_tensor(output_details[0]["index"])
print("预测结果:", output_data.argmax())
cv2.imshow("Frame", frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
这段代码虽然简单,但涵盖了嵌入式视觉项目的核心流程:采集 → 预处理 → 推理 → 后处理。你想想看,是不是所有项目都逃不开这个循环?
总结一下:嵌入式视觉不是高不可攀的技术。选对硬件,搭好软件栈,剩下的就是一步步调试和优化。我见过太多人一开始就追求高大上的算法,结果连摄像头都打不开。记住:先跑通,再优化。
下一章,我会带大家搭建树莓派的开发环境,从烧录系统到安装OpenCV,一步步来。咱们到时候见。