利用DNNDK作AI DPU硬核加速-FPGA大赛获奖实例分析

这个项目是通过小车上安放Ultra96和摄像头,在行进过程中摄像头所摄入的目标和道路边缘进行识别,并通过WIFI完成与远端主机的通信与控制。
Ultra96板通过USB摄像头采集图像信号,利用Ultra96强大的DNNDK IP神经网络处理能力进行目标识别。利用DNNDK 的 SSD神经网络硬件加速方案和先进的剪枝技术,在计算机上进行模型的选择、训练和验证。然后运用DNNDK IP将深度模型的浮点权值转换为定点操作运算,在性能下降不多的情况下极大地加快了计算速度。
为了让小车行驶在道路上,需要从所摄入的道路图像中提取出道路边缘。基于嵌入的OpenCV 库,为加快运行速度,采用掩模mask提取图像中有用的部分,改进图像边缘处理算法Canny,再进行高斯去噪、膨胀算法、霍夫变换、角度过滤和平均值等一系列处理后生成车道线roadline。基于SSD 识别分类模型IP 核和车道线算法模型roadline分别识别出道路车、摩托车和人这些敏感目标和道路车道线,将识别结果显示在图像上,通过VDMA IP核输出到LCD显示器上。同时利用Ultra96自带的WIFI进行与主机侧的通信,上传图像信息和识别结果,接收控制信号。本方案利用了FGPA的SSD核、roadline IP核、VDMA IP核、DPU IP核,极大地加快了识别和显示处理速度,致力于搭建汽车辅助驾驶的低成本试验平台。

系统框架图

在这里插入图片描述

用vivado设计带有DPU核的硬件平台

在这里插入图片描述
在这里插入图片描述
将ZYNQ出来的复位信号pl_clk0经过复位模块重新生成给各个模块的复位信号,其负责初始化DPU寄存器的数据线M_AXI_HPM0_LPD也进行了重生。
时钟模块输入100M, 输出为325M和650M。仅有一个DPU,也就仅有一个中断信号。

在这里插入图片描述
在这里插入图片描述

建立Ultra96设备树

system-user.dtsi位于/
project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi.
在这里插入图片描述

软件编制流程

在这里插入图片描述

深度学习DPU启动镜像文件生成流程

使用petalinux定制linux os
 添加vivado输出的板级支持信息,即hdf和bit文件
 配置congfig参数,如rootfs从sd卡启动、设备树、支持uvc驱动等
 添加dpu驱动和opencv
 dpu中断信号的处理
使用dnndk x64端对下载到的caffe模型进行压缩和编译
 下载合适的ssd模型,并使用python对其进行测试
 使用caffefrozen工具将caffe模型中的权值固化到模型中
 使用decent工具对模型进行定点化压缩, 产生量化描述文件deploy.prototxt和量化模型参数文件deploy.caffemodel。
在这里插入图片描述
详细petalinux镜像生成过程请参照本人的另一篇博客
(9条消息)使用vivado2019.2和petalinux 2019.2制作带无线wifi的ultra96v2的BSP软件包_u010879745的博客-CSDN博客 https://blog.csdn.net/u010879745/article/details/105395896

定点量化模型生成流程

DECENT吸收浮点模型作为输入,进行预处理归一化,量化权重和偏置。
3.2 SSD与YOLO算法比较
我们当初在SSD与YOLO中根据实际运行速度做出选择,与大多数人选择YOLO不同,我们选择了SSD,因为SSD的运行速度和小目标检测比较精确,这对于行车中检测人和动物这种小动物是非常有益的。
下面这里仅给出算法比较,限于篇幅不详细介绍算法,感兴趣者可百度。
在这里插入图片描述

SSD与YOLO模型原理

上面是SSD模型,下面是Yolo模型,可以明显看到SSD利用了多尺度的特征图做检测。SSD采用VGG16作为基础模型,然后在VGG16的基础上新增了卷积层来获得更多的特征图以用于检测。SSD与Faster R-CNN有同样的准确度,并且与Yolo具有同样较快地检测速度。SSD的数据扩增技术很重要,对于mAP的提升很大。
SSD不像Yolo那样在全连接层之后做检测。其实采用卷积直接做检测只是SSD相比Yolo的其中一个不同点,另外还有两个重要的改变,一是SSD提取了不同尺度的特征图来做检测,大尺度特征图(较靠前的特征图)可以用来检测小物体,而小尺度特征图(较靠后的特征图)用来检测大物体;二是SSD采用了不同尺度和长宽比的先验框(Prior boxes, Default boxes,在Faster R-CNN中叫做锚,Anchors)。Yolo算法缺点是难以检测小目标,而且定位不准,但是这几点重要改进使得SSD在一定程度上克服这些缺点,同时又保持了较快的速度。
3.3 核心应用代码
我们这里不介绍SSD核心算法代码,一是内容过于庞大,二是网上已经有相当多的论述,也不是我们的首创。下面仅就我们的应用代码做个介绍。
在这里插入图片描述

Ultra96开发板C++应用程序

C++主程序
在这里插入图片描述
输入信号为摄像头时,将输入的参数0通过atoi(str.c_str())语句转化为VideoCapture可以接受的数据类型,打开摄像头,并设置图形分辨率。

头文件
在这里插入图片描述
设置车道线mask,以提高车道线程序运行速度
在这里插入图片描述
设置线程
设置多线程,可以加快并行处理速度
在这里插入图片描述
开读取帧线程、SSD深度学习线程和显示线程。
在这里插入图片描述
调用SSD DPU深度学习模块
下面这条语句是关键的调用SSD语句,result为获得的SSD算法分析结果。
result = dpu_model_->run(image)
在这里插入图片描述
画分类框和车道线
根据SSD分类结果,画出分类框,调用车道线程序,并保存视频文件。
在这里插入图片描述
车道线模块
下面这段模块实现车道线的黄色增强、高斯去噪、膨胀算法、霍夫变换、角度过滤和取平均值等功能
在这里插入图片描述
实物图
在这里插入图片描述
在这里插入图片描述
效果图
可实时识别出车、摩托车和行人,满足AI处理要求。
在这里插入图片描述

发布了34 篇原创文章 · 获赞 1 · 访问量 4234

猜你喜欢

转载自blog.csdn.net/u010879745/article/details/105398188