嵌入式AI基础:从系统到芯片再到环境搭建

各位同学,欢迎来到《红外目标检测算法嵌入式移植实战》的第二讲。

今天我们要聊的,是嵌入式AI的“地基”——嵌入式系统、AI芯片选型,还有交叉编译环境。说白了,就是搞清楚你的算法最终要跑在什么样的硬件上,以及怎么让代码在硬件上跑起来。

我个人习惯把这一章叫做“选型与搭台”。台子搭不好,后面的戏就没法唱。咱们一步步来。

嵌入式系统概述:它到底是个啥?

嵌入式系统,你想想看,其实无处不在。你的手机、智能手表、家里的路由器,甚至微波炉的控制面板,都是嵌入式系统。它和我们平时用的电脑(PC)最大的区别在于:专、精、省

  • 专:功能单一,为特定任务设计。比如红外检测,它就专心做检测,不会一边检测一边让你打游戏。
  • 精:资源精确。CPU主频、内存大小、功耗,都是按需配置,不浪费。
  • 省:成本低、功耗低。这是工业产品的命根子。

在嵌入式AI领域,我们面对的往往是资源受限的设备。你可能只有1GB内存,甚至512MB。你的CPU可能只有4个A53核心,主频1.5GHz。嗯,这里要注意,这和你在服务器上跑模型完全是两个世界。

核心观点:嵌入式AI移植的本质,就是一场“戴着镣铐的舞蹈”。你要在有限的算力和存储下,把模型的精度和速度做到极致。

我在项目中遇到过最头疼的事,就是模型在PC上跑得飞快,一上板子就卡成PPT。为什么?因为PC有强大的GPU和无限的内存带宽,而嵌入式设备没有。所以,理解你的目标系统,是第一步。

AI芯片选型:三足鼎立的局面

现在市面上的AI芯片,百花齐放。但如果你做红外目标检测,尤其是要落地到产品上,我个人建议重点关注这三家:NVIDIA Jetson、瑞芯微、地平线

它们代表了三种不同的技术路线,我分别说说我的看法。

1. NVIDIA Jetson:生态王者

Jetson系列,比如Nano、TX2、Xavier NX、Orin,是很多工程师的入门首选。为什么?因为生态太好了。

  • 优势:CUDA生态、TensorRT加速、丰富的社区资源。你几乎能找到所有模型的部署示例。
  • 劣势:贵、功耗高、供货周期长。做消费级产品,成本压力很大。
  • 适用场景:原型验证、高端产品、对功耗不敏感的场合。

我的经验:如果你刚入门,预算充足,先买一块Jetson Nano或者Orin NX。它能让你快速跑通整个流程,建立信心。我曾经用Jetson Nano跑YOLOv5s,在640x480分辨率下,能跑到30FPS。这个性能对于很多红外场景,已经够用了。

2. 瑞芯微:性价比之王

瑞芯微的RK3588、RK3568系列,在安防、门禁、工业相机领域非常流行。它的NPU(神经网络处理器)性能不俗,而且价格亲民。

  • 优势:性价比极高、供货稳定、功耗控制好。RK3588的NPU算力达到6 TOPS,足够跑轻量级模型。
  • 劣势:工具链相对封闭,对模型的支持不如NVIDIA全面。你需要花时间适配。
  • 适用场景:量产产品、成本敏感型项目。

避坑指南:我曾经在RK3588上部署一个自定义的轻量级网络,结果发现NPU不支持某些算子(比如LeakyReLU)。最后不得不修改网络结构,换成ReLU。所以,选型前一定要仔细阅读芯片的算子支持列表。

3. 地平线:国产AI芯片的佼佼者

地平线的征程系列(J2、J3、J5),在自动驾驶和智能座舱领域表现抢眼。它的BPU架构是为AI推理专门设计的。

  • 优势:工具链(如OE包)对模型优化做得很好,支持量化、编译、部署一体化。对Transformer类模型的支持也在快速迭代。
  • 劣势:生态相对封闭,社区资源不如NVIDIA丰富。学习曲线稍陡。
  • 适用场景:车规级产品、对实时性要求极高的场景。

下面这张图,是我自己总结的选型决策流程,你可以参考一下。

AI芯片选型决策流程图 开始选型 预算充足? NVIDIA Jetson 瑞芯微/地平线 看重生态? 看重成本? Jetson Orin 瑞芯微RK3588 地平线J3/J5

交叉编译环境搭建:让代码在目标板上跑起来

好,芯片选好了,接下来就是环境搭建。这里有个概念必须搞清楚:交叉编译

什么意思?你在你的PC(x86架构)上写代码、编译,生成的可执行文件是给目标板(比如ARM架构)用的。这叫交叉编译。你想想看,你的PC是x86,目标板是ARM,指令集都不一样,当然不能直接在PC上编译运行。

搭建交叉编译环境,我一般分三步走:

  1. 安装交叉编译工具链
  2. 配置第三方库(如OpenCV、TensorRT)
  3. 编写CMakeLists.txt并测试

第一步:安装交叉编译工具链

以瑞芯微RK3588为例,它的CPU是ARM Cortex-A76/A55。你需要安装aarch64-linux-gnu-gcc工具链。

# 安装aarch64交叉编译工具链
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

# 验证安装
aarch64-linux-gnu-gcc --version
# 输出类似:aarch64-linux-gnu-gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0

我的习惯:我会在~/toolchains/目录下统一管理所有交叉编译工具链。不同芯片、不同版本的工具链,分文件夹存放。这样不会乱。

第二步:配置第三方库

红外目标检测离不开OpenCV。你需要在目标板上编译OpenCV,或者使用交叉编译的方式在PC上编译好,再拷贝到板子上。

我个人推荐第二种方式,因为板子上的编译速度太慢了。

# 交叉编译OpenCV示例(简化版)
cmake -DCMAKE_SYSTEM_NAME=Linux \
      -DCMAKE_SYSTEM_PROCESSOR=aarch64 \
      -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \
      -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \
      -DCMAKE_INSTALL_PREFIX=./install \
      ../opencv

make -j4
make install

避坑指南:我曾经在交叉编译OpenCV时,忘记关闭WITH_CUDA和WITH_OPENCL选项。结果编译出来的库在板子上运行时报错,说找不到CUDA驱动。嗯,这里要注意,交叉编译时,一定要关闭目标板上没有的硬件加速选项。

第三步:编写CMakeLists.txt并测试

写一个简单的测试程序,验证环境是否正常。

# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(hello_ai)

set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)

find_package(OpenCV REQUIRED)

add_executable(hello_ai main.cpp)
target_link_libraries(hello_ai ${OpenCV_LIBS})
// main.cpp
#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    std::cout << "Hello, Embedded AI!" << std::endl;
    cv::Mat img = cv::Mat::zeros(100, 100, CV_8UC3);
    std::cout << "Image created: " << img.size() << std::endl;
    return 0;
}

编译后,把生成的可执行文件拷贝到板子上,运行:

./hello_ai
# 输出:Hello, Embedded AI!
# 输出:Image created: [100 x 100]

看到这个输出,说明你的交叉编译环境搭建成功了。

小结

这一章,我们聊了嵌入式系统的特点,对比了三家主流AI芯片的优劣,还亲手搭建了交叉编译环境。这些都是后续实战的基础。

记住一句话:选型决定上限,环境决定下限。芯片选错了,后面再怎么优化也白搭;环境没搭好,代码根本跑不起来。

最后送大家一句话:嵌入式AI没有银弹。每一款芯片、每一个框架,都有它的脾气。多动手、多踩坑,你才能真正理解它。


专注资料整理