1. 项目概述
在工业质检领域,铝片表面缺陷检测一直是个具有挑战性的任务。传统人工检测方式效率低下且容易漏检,而基于PC的视觉检测系统又存在成本高、功耗大等问题。我们团队基于SoC FPGA平台开发了一套软硬协同的实时检测系统,实现了对铝片表面四种常见缺陷(划痕、凹坑、氧化斑、污渍)的自动化检测,识别精度达到85%以上。
这套系统的核心创新点在于:
- 采用SSD-MobileNetV1轻量化模型,在保证精度的同时降低计算复杂度
- 充分利用FPGA的并行计算能力,实现图像采集和显示的硬件加速
- 通过共享内存和文件缓冲的混合通信机制,实现高效的进程间协同
2. 系统架构设计
2.1 硬件平台选型
我们选择了Xilinx Zynq系列SoC FPGA作为硬件平台,主要基于以下考虑:
- 双核ARM Cortex-A9处理器:满足Linux系统运行和模型推理需求
- 可编程逻辑资源:用于实现图像采集和显示的硬件加速
- DDR3内存控制器:提供高速数据交换通道
- 丰富的外设接口:支持摄像头输入和HDMI输出
提示:在选择FPGA型号时,需要平衡逻辑资源、DSP切片数量和内存带宽。对于1080p图像处理,建议选择至少具有85k逻辑单元和4GB内存的型号。
2.2 软件架构设计
系统采用分层架构设计,自上而下分为:
- 应用层:包含模型推理、图像处理等算法
- 驱动层:实现硬件外设的驱动和控制
- 硬件层:提供基础计算和接口资源
各层之间通过AXI总线进行数据交互,关键设计决策包括:
- 使用VDMA(Video Direct Memory Access)实现图像数据的高效传输
- 采用双缓冲机制避免图像采集和处理的冲突
- 通过Linux内核模块管理PL端的硬件加速器
3. 核心模块实现
3.1 图像采集模块
PL端图像采集通路采用以下设计:
verilog复制module image_capture (
input clk,
input reset_n,
input [23:0] pixel_data,
input pixel_valid,
output reg [31:0] ddr_addr,
output reg [63:0] ddr_data,
output reg ddr_we
);
// 双缓冲控制逻辑
reg buffer_sel;
always @(posedge clk or negedge reset_n) begin
if (!reset_n) begin
buffer_sel <= 0;
ddr_we <= 0;
end else if (pixel_valid) begin
ddr_data <= {16'h0, pixel_data};
ddr_addr <= buffer_sel ? BASE_ADDR_1 : BASE_ADDR_0;
ddr_we <= 1;
if (end_of_frame)
buffer_sel <= ~buffer_sel;
end
end
endmodule
关键参数配置:
- 图像分辨率:1920x1080 @30fps
- 像素格式:RGB888
- DDR带宽:理论峰值1.6GB/s
- 实际传输效率:约1.2GB/s(考虑总线仲裁开销)
3.2 模型推理模块
在HPS端,我们基于PaddleLite框架实现了SSD-MobileNetV1模型的部署:
cpp复制// 模型初始化
paddle::lite_api::MobileConfig config;
config.set_model_from_file("ssd_mobilenet_v1_quant.nb");
config.set_power_mode(LITE_POWER_HIGH);
config.set_threads(2);
auto predictor = paddle::lite_api::CreatePaddlePredictor(config);
// 推理过程
void run_inference(cv::Mat& input) {
auto input_tensor = predictor->GetInput(0);
input_tensor->Resize({1, 3, 300, 300});
// 前处理
cv::Mat resized;
cv::resize(input, resized, cv::Size(300, 300));
float* data = input_tensor->mutable_data<float>();
for (int i = 0; i < 300 * 300; i++) {
data[i] = (resized.at<cv::Vec3b>(i)[0] - 127.5) / 127.5;
data[i + 300*300] = (resized.at<cv::Vec3b>(i)[1] - 127.5) / 127.5;
data[i + 2*300*300] = (resized.at<cv::Vec3b>(i)[2] - 127.5) / 127.5;
}
predictor->Run();
// 后处理
auto output_tensor = predictor->GetOutput(0);
const float* result = output_tensor->data<float>();
process_detection_results(result);
}
模型量化参数:
| 参数 | 原始模型 | 量化模型 | 变化率 |
|---|---|---|---|
| 模型大小 | 18.3MB | 4.7MB | -74.3% |
| 推理时间 | 1200ms | 690ms | -42.5% |
| mAP | 86.7% | 85.5% | -1.2% |
4. 系统集成与优化
4.1 进程间通信设计
系统采用共享内存+文件缓冲的混合通信机制:
-
控制信号:通过System V共享内存传递
- 0x00: 系统状态寄存器
- 0x04: 图像就绪标志
- 0x08: 退出请求标志
-
图像数据:通过BMP文件交换
- /tmp/0_image.bmp: 原始输入图像
- /tmp/0_image_result.bmp: 检测结果图像
通信时序图:
ssd_transfer采集图像并写入BMP文件- 设置共享内存图像就绪标志(0x04=1)
ssd_detection检测到标志后读取文件进行推理- 推理完成后写入结果文件并清除标志
ssd_transfer读取结果文件并输出
4.2 性能优化技巧
通过以下优化手段将系统性能提升了约40%:
-
内存访问优化
- 使用64字节对齐的内存分配
- 启用DMA传输减少CPU干预
- 采用非阻塞IO提高并发性
-
计算加速技巧
- 使用NEON指令集优化图像预处理
- 开启ARM核的硬件浮点单元
- 调整CPU调度策略为性能模式
-
资源管理策略
- 预分配所有内存避免运行时分配
- 使用内存池管理频繁申请释放的小对象
- 设置合理的进程优先级(nice值)
5. 实测结果与分析
5.1 检测精度测试
在包含2000张样本的测试集上,各类缺陷的检测效果:
| 缺陷类型 | 准确率 | 召回率 | F1-score |
|---|---|---|---|
| 划痕 | 87.2% | 83.5% | 85.3% |
| 凹坑 | 84.7% | 86.1% | 85.4% |
| 氧化斑 | 82.3% | 88.6% | 85.3% |
| 污渍 | 89.1% | 81.2% | 85.0% |
5.2 实时性测试
系统在不同分辨率下的性能表现:
| 分辨率 | 帧率(fps) | 单帧延时(ms) | CPU占用率 |
|---|---|---|---|
| 1280x720 | 4.2 | 238 | 78% |
| 1920x1080 | 1.3 | 769 | 92% |
| 640x480 | 12.5 | 80 | 65% |
注意:在实际产线部署时,建议根据检测精度和实时性需求选择合适的分辨率。对于移动速度较快的产线,可以适当降低分辨率换取更高的帧率。
6. 常见问题与解决方案
6.1 图像采集异常
现象:采集到的图像出现条纹或部分缺失
可能原因:
- 摄像头时钟信号不稳定
- DDR内存带宽不足
- 图像传输IP核配置错误
解决方案:
- 检查摄像头时钟信号质量,必要时添加时钟缓冲器
- 优化DDR访问模式,使用突发传输减少开销
- 重新生成IP核,确认参数配置正确
6.2 模型推理速度慢
现象:单帧推理时间超过1秒
可能原因:
- CPU频率被限制
- 内存带宽争抢
- 模型量化参数不理想
解决方案:
- 检查CPU调速器设置:
echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor - 为推理进程分配独立的CPU核:
taskset -c 1 ./ssd_detection - 重新校准量化参数,特别是激活函数的量化范围
6.3 系统稳定性问题
现象:长时间运行后出现进程卡死
可能原因:
- 内存泄漏
- 共享内存同步问题
- 温度过高导致硬件异常
解决方案:
- 使用valgrind工具检测内存泄漏
- 在共享内存访问处添加互斥锁
- 增加散热措施,监控芯片温度
7. 部署与扩展建议
在实际产线部署时,我们总结了以下经验:
-
环境适应性调整
- 针对不同光照条件,建议增加自动白平衡算法
- 对于反光较强的铝片,可考虑添加偏振滤镜
-
系统扩展方向
- 支持多摄像头输入实现全表面覆盖
- 添加网络接口实现远程监控和结果上报
- 集成PLC接口实现与产线控制系统的联动
-
维护建议
- 定期校准摄像头焦距和白平衡
- 建立样本库持续优化模型
- 监控系统资源使用情况,及时处理异常
这套系统经过3个月的实际产线验证,平均检测准确率达到86.7%,误检率低于2%,单台设备可替代2-3名质检工人,投资回报周期约6个月。在后续版本中,我们计划引入更轻量化的YOLOv5n模型,进一步降低计算复杂度,同时增加缺陷分类细粒度,支持更多类型的表面缺陷检测。
