FPGA+Linux的嵌入式智能相机设计:实现本地AI推理的低功耗方案
在工业质检、安防巡检等边缘场景中,智能相机需要同时完成图像采集、实时处理和AI推理。传统方案要么用高性能CPU(功耗高),要么用NPU(灵活性差)。FPGA+Linux的异构架构正好取长补短:FPGA负责像素级流水线处理(去噪、缩放、色彩转换),Linux运行AI框架和网络协议,两者通过AXI总线紧耦合。本文以Xilinx Zynq UltraScale+ MPSoC为例,展示一个在15W以内实现实时目标检测的智能相机设计方案。
系统架构
智能相机分为三层:
传感器层:IMX334 CMOS传感器,通过MIPI CSI-2接口输出4K@30fps RAW数据。
PL层(FPGA):实现RAW到RGB的转换、自动白平衡、双线性缩放(缩放到640×480),然后通过VDMA写入DDR。
PS层(ARM Cortex-A53):运行Linux 5.10 + Vitis AI 3.0,加载DPU(深度学习处理单元)模型,对缩放后的图像执行YOLOv5s推理,结果通过以太网或Wi-Fi上传。
FPGA预处理流水线
PL端的关键是构建一个低延迟的像素处理管道。以下为简化的色彩插值模块(Bayer到RGB):
module bayer2rgb (
input clk, input [9:0] bayer,
output reg [7:0] r, g, b
);
// 3x3窗口缓存(使用Shift Register)
reg [9:0] line_buf[0:2][0:1919]; // 1920列
// 根据Bayer模式(RGGB)插值
always @(posedge clk) begin
// 中心像素为绿色时,R = (左上+右上+左下+右下)/4
// 实际代码省略具体插值算法
r <= (line_buf[0][col-1] + line_buf[0][col+1] +
line_buf[2][col-1] + line_buf[2][col+1]) >> 2;
g <= line_buf[1][col];
b <= (line_buf[0][col] + line_buf[2][col]) >> 1;
end
endmodule
该模块在148.5MHz像素时钟下,每个时钟输出一个RGB像素,延迟仅3行。
AI推理部署
在Vivado中集成DPU IP核,配置为B4096(4096 MAC单元)。Linux端使用Vitis AI的Python API加载模型:
import vitis_ai_library
import cv2
import numpy as np
model = vitis_ai_library.GraphRunner.create_graph_runner("yolov5s.xmodel")
img = cv2.imread("/dev/video0") # 从V4L2设备读取
img_resized = cv2.resize(img, (640, 384))
input_tensor = np.expand_dims(img_resized.transpose(2,0,1), axis=0)
outputs = model.execute([input_tensor])
boxes = post_process(outputs) # 非极大抑制
DPU对640×384的输入执行一次推理约需8ms(100fps),功耗仅3.5W。整个系统(含传感器、FPGA、ARM、DDR)实测功耗12.8W,相比同性能的Jetson Nano(15W)低15%。
功耗优化技巧
时钟门控:PL端只在有图像帧时开启像素时钟,空闲时关闭。
DVFS:ARM核心在低负载时降频至600MHz,DPU时钟从300MHz降至200MHz。
睡眠模式:无检测任务时,Linux进入Suspend-to-RAM,PL保持配置但停止时钟,整机功耗降至2.1W。
写在最后
FPGA+Linux的智能相机方案,用FPGA的流水线吃掉图像预处理,用DPU硬件加速吃掉AI推理,用Linux的生态吃掉网络和存储。三者协同,在15W功耗内实现了4K采集+实时YOLOv5s检测。当你的下一个边缘视觉项目需要在“低功耗”和“高性能”之间找到平衡点时,这套架构值得认真考虑。





