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,一步步来。咱们到时候见。