1. 项目概述:基于FPGA的铝片表面缺陷检测系统
这个项目实现了一套完整的铝片表面缺陷检测解决方案,采用SoC FPGA平台构建软硬件协同系统。核心功能是通过机器视觉自动识别铝片表面的四种常见缺陷(如划痕、凹陷、污渍和氧化斑点),检测精度达到85%以上。
系统采用SSD-MobileNetV1作为目标检测模型,这是一个专为移动端和嵌入式设备优化的轻量级神经网络架构。整个系统部署在FPGA平台上,充分利用了FPGA的并行计算能力和可编程特性,实现了高效的图像采集、处理和缺陷检测流水线。
提示:选择SSD-MobileNetV1模型是因为它在精度和速度之间取得了良好平衡,特别适合资源受限的嵌入式视觉应用场景。
2. 系统架构设计
2.1 硬件平台选型
本项目采用SoC FPGA作为硬件平台,这种芯片同时包含FPGA可编程逻辑单元和ARM处理器核,完美契合我们的需求:
- PL端(Programmable Logic):负责图像采集和显示的硬件加速
- HPS端(Hard Processor System):运行Linux系统,负责模型推理和系统控制
这种架构的优势在于:
- 图像采集和预处理可以通过硬件逻辑实现,确保实时性
- 复杂的神经网络推理由软件实现,便于开发和调试
- 两者通过高速总线连接,数据交换效率高
2.2 软件架构设计
系统软件部分采用模块化设计,主要包含三个核心组件:
- 图像传输模块:负责PL端和HPS端之间的图像数据传输
- 模型推理模块:加载和运行SSD-MobileNetV1模型
- 系统控制模块:管理整个系统的启动、运行和退出
各模块之间通过共享内存和文件系统进行通信,既保证了数据传输效率,又简化了系统设计。
3. 核心模块实现细节
3.1 图像采集与传输实现
图像采集通路完全在PL端实现,主要包含以下关键组件:
- 虚拟摄像头接口(VCAM):模拟真实工业相机的输出
- DVP_DDR IP核:将图像数据写入DDR3内存
- DDR_VGA IP核:从内存读取处理结果并输出显示
图像传输进程(ssd_transfer)的主要工作流程:
- 通过DVP_DDR IP从VCAM获取图像帧
- 将原始图像数据保存为BMP格式文件(0_image.bmp)
- 设置共享内存标志通知推理进程
- 等待推理完成并读取结果图像(0_image_result.bmp)
- 通过DDR_VGA IP将结果显示输出
注意:选择BMP格式是因为它无压缩、结构简单,适合嵌入式系统快速读写,虽然会占用更多存储空间。
3.2 模型推理模块优化
模型推理是系统的核心,我们针对嵌入式平台做了多项优化:
- 模型量化:将原始FP32模型转换为INT8量化模型,体积缩小4倍,推理速度提升2-3倍
- 内存优化:预先分配所有需要的缓冲区,避免动态内存分配带来的不确定性和碎片
- 多线程设计:分离I/O和计算任务,充分利用多核CPU资源
推理进程(ssd_detection)的工作流程:
- 初始化时加载量化后的.nb模型文件
- 循环检测共享内存中的图像就绪标志
- 读取BMP图像并进行预处理
- 执行模型推理
- 后处理并生成带检测框的结果图像
- 检查退出标志,必要时安全释放资源
3.3 进程间通信机制
系统采用混合通信方案确保高效协同:
| 通信类型 | 实现方式 | 用途 | 性能特点 |
|---|---|---|---|
| 控制信号 | 共享内存寄存器 | 进程同步、状态通知 | 超低延迟(微秒级) |
| 图像数据 | BMP文件 | 传递原始图像和结果 | 中等延迟(毫秒级)但实现简单 |
| 系统管理 | Shell脚本信号 | 启动和退出控制 | 高可靠性 |
这种设计在保证系统响应速度的同时,最大程度降低了实现复杂度。
4. 系统部署与性能优化
4.1 开发环境搭建
本项目使用AIEP开发环境,主要工具链包括:
- Quartus Prime:用于FPGA逻辑设计和综合
- SoC EDS:用于ARM端的软件开发
- PaddleLite:模型转换和推理框架
- 交叉编译工具链:在主机上开发,目标板运行
环境配置关键步骤:
- 安装Quartus Prime和SoC EDS,配置PATH环境变量
- 准备PaddleLite的交叉编译版本
- 设置共享库路径和模型文件位置
- 配置Linux设备树,确保外设驱动正常加载
4.2 性能瓶颈分析与优化
通过性能分析发现系统的主要瓶颈在模型推理环节,占总处理时间的92%。我们采取了以下优化措施:
- 模型量化:使用PaddleSlim工具对模型进行8-bit量化
- 算子融合:合并多个小算子减少内存访问开销
- 内存布局优化:使用NHWC格式更适合ARM NEON加速
- 缓存优化:确保频繁访问的数据在缓存中
优化前后性能对比:
| 指标 | 优化前 | 优化后 | 提升幅度 |
|---|---|---|---|
| 单帧处理时间 | 1200ms | 750ms | 37.5% |
| 内存占用 | 85MB | 52MB | 38.8% |
| 模型大小 | 18MB | 4.5MB | 75% |
4.3 系统稳定性保障
为确保工业环境下的可靠运行,系统实现了多重保护机制:
- 看门狗定时器:监测系统运行状态,异常时自动重启
- 温度监控:防止FPGA过热导致性能下降或损坏
- 电源管理:电压波动时自动调整工作频率
- 错误恢复:关键进程崩溃后自动重新启动
5. 实际应用与效果评估
5.1 测试数据集准备
我们收集了2000张包含四种缺陷的铝片图像构建测试集:
- 划痕:500张,不同长度和深度
- 凹陷:500张,不同直径和深度
- 污渍:500张,不同形状和面积
- 氧化斑点:500张,不同密度和分布
数据集按7:2:1划分为训练集、验证集和测试集,确保模型评估的客观性。
5.2 检测精度评估
使用mAP(mean Average Precision)作为主要评估指标:
| 缺陷类型 | 精确率 | 召回率 | AP |
|---|---|---|---|
| 划痕 | 86.2% | 84.7% | 85.4% |
| 凹陷 | 83.5% | 85.1% | 84.3% |
| 污渍 | 87.8% | 86.3% | 87.0% |
| 氧化斑点 | 84.6% | 83.9% | 84.2% |
| 平均 | 85.5% | 85.0% | 85.2% |
系统整体表现达到了工业应用的基本要求,特别是对污渍类缺陷的检测效果最佳。
5.3 实际产线部署建议
根据项目经验,给出以下部署建议:
- 光照条件:建议使用均匀的漫射光源,避免反光干扰
- 相机安装:保持相机与铝片表面垂直,距离30-50cm为宜
- 传送带速度:根据处理速度调整,确保每片铝板都能被完整拍摄
- 维护周期:建议每季度重新校准一次相机,每年更新一次模型
6. 常见问题与解决方案
6.1 图像采集问题排查
问题1:采集的图像出现条纹噪声
- 可能原因:DDR内存访问冲突
- 解决方案:调整DVP_DDR IP的时序参数,增加等待周期
问题2:图像偶尔丢失几帧
- 可能原因:VCAM输出不稳定
- 解决方案:检查VCAM时钟信号质量,必要时重新生成IP核
6.2 模型推理异常处理
问题1:推理结果明显错误
- 可能原因:模型文件损坏或输入数据格式不符
- 解决方案:验证模型MD5值,检查图像预处理流程
问题2:推理速度突然变慢
- 可能原因:系统温度过高导致CPU降频
- 解决方案:检查散热条件,必要时降低工作频率
6.3 系统稳定性问题
问题1:进程意外终止
- 可能原因:内存不足或被其他进程抢占
- 解决方案:优化内存使用,设置进程优先级
问题2:共享内存不同步
- 可能原因:多进程访问冲突
- 解决方案:实现更精细的读写锁机制
7. 扩展与改进方向
虽然当前系统已经能够满足基本需求,但仍有一些值得改进的地方:
- 模型优化:尝试更轻量级的网络如NanoDet,进一步提升速度
- 硬件加速:将部分计算密集型操作(如NMS)移植到FPGA实现
- 多相机支持:扩展系统架构,支持同时处理多个相机输入
- 在线学习:实现模型参数的在线更新,适应新的缺陷类型
在实际部署中,我们发现铝片表面的反光特性对检测精度影响较大。一个实用的技巧是在预处理阶段增加基于Retinex理论的增强算法,可以显著提升暗区缺陷的检出率。另外,建议定期收集产线上的新样本对模型进行微调,以保持最佳的检测性能。