嗨,在这个项目中,我想向您展示如何构建一个基于 FPGA 加速 Yolov3 网络的披萨切片角度计算器。披萨配料由 Yolov3 网络分析。根据 Yolo 输出,计算出意大利辣香肠热图。此热图用于计算将比萨饼切成两半的完美角度。最佳切割角度的结果投影在披萨附近。Avnet 的 Ultra96-V2 板用于所有计算。GoPro Hero 相机用于从意大利辣香肠比萨饼中捕捉图像。相机和投影仪连接到 Ultra96-V2 板。我使用了定制的 HDMI 板,但您可以使用 USB 网络摄像头进行图像捕捉。来自相机的传入图像会调整大小,这是通过可编程逻辑 (PL) 加速器完成的。Yolov3对象检测网络,DPU ) 执行比萨饼和意大利辣香肠检测。#projectofthemonth
项目文档分为“入门”、“从数据集到DPU精灵”和“切片器程序”三个部分。“入门”部分描述了在 Ultra96V2 板上运行基于 Yolo 的披萨切片机所需的步骤。“从数据集到 DPU elf”一节描述了从自定义数据集到 DPU elf 文件的整个开发过程。该项目的这一部分最耗时,因为赛灵思文档和示例仅涵盖了整个开发过程的一部分。目前,这部分正在建设中,但结合项目源代码,它是您自定义 Xilinx DPU 项目的良好起点。就在这个项目在 hackster 上发布前几个小时,LogicTronix 发布了这个教程,其中涵盖了 Yolov3 到 DPU 精灵编译的某些部分。最后但同样重要的是,您可以在“切片器程序”部分找到实现 Pizza 切片器应用程序的 Python 代码的详细描述。
遗憾的是,Xilinx 的 Zoo 模型没有提供用于比萨检测的预训练网络,所以我不得不从头开始构建网络。下图显示了在 Xilinx DPU 上运行 Yolo 网络所需的步骤。
详细的工作流程:
最后一部分解释了 Pizza Slicer 代码。该程序是用python3编写的,并使用jupyter notebook来控制程序。源代码
前三个单元格涵盖了所有 Python 导入和 FPGA/DPU 文件加载。
生成切片蒙版。找到最佳角度的问题以几何方式解决。我使用了 180 个蒙版,将 320 x 320 的图像分成两部分。注释代码,启用绘制切片 mak 的 matplotlib 图。
为 Yolov3 网络加载锚点。Yolov3 使用一组固定的锚点来生成边界框。这些锚点用于评估函数。
评估函数将 Yolov3 输出转换为框、类和分数。这是必需的,因为所有其他步骤都需要边界框格式的输出。
用于相机输入和投影仪输出的 HDMI 设置。该代码与 PYNQ HDMI 接口兼容。此时可以设置自定义输入/输出。
第一步中裁剪来自相机的输入图像,以选择感兴趣区域 (ROI)。我的 GoPro 摄像机输出 720p 图像,因此 ROI 设置为 440 x 440 像素,裁剪是在软件中完成的。如果您的相机没有固定在投影仪上,并且需要进行一些调整以使比萨饼适合 ROI 中间,这将非常有用。ROI 图像数据被传输到 FPGA 图像缩放器,数据传输由一些 DMA 任务完成。为了启用从 python 内存到 PL 内存的数据传输,使用了 pynq.buffer。PL 图像缩放器的输出用作 DPU 输入。PL resizer 的源代码来自这个PYNQ-Helloworld GitHub repo. PL resizer 可以处理自定义输入/输出图像,输入/输出图像的设置可以通过寄存器进行设置。必须设置四个寄存器值: 0x10:输入图像高度;0x18 输入图像宽度;0x20 输出图像高度;0x28 输出图像宽度
DPU init 和 DPU Task 启动。评估函数将原始 Yolov3 网络输出转换为边界框格式。
评估函数的输出被传递到排序过程。重复的比萨检测被删除,只使用比萨的最高置信度。如果置信度高于 0.5,则使用 Pepperoni 检测。
基于排序过程,在 320 x320 uint8 数组中绘制了一个虚拟披萨。边界框坐标用于在边界框内绘制一个椭圆。椭圆的内部用 1 填充,外部用 0 填充。每个意大利辣香肠近似值都添加到 320 x 320 基本数组中。基本数组元素是一个披萨边界框近似。披萨基数组之外的意大利辣香肠检测将被忽略。结果是一个意大利辣香肠热图。
意大利辣香肠热图,覆盖意大利辣香肠切片也被模拟(较亮的区域)。这就是为什么使用对象检测网络而不是分割网络的原因之一。使用目标检测网络和椭圆区域近似覆盖意大利辣香肠可以进行模拟。
3D 意大利辣香肠热图,重叠的意大利辣香肠区域被绘制为尖峰。该图非常清楚地显示了在椭圆区域近似和层添加之后如何组合热图数据。
在计算意大利辣香肠热图后,必须定义最佳切割角度。这个问题是通过对意大利辣香肠热图应用蒙版来解决的。掩码将热图值的一半设置为零。应用掩码后,所有元素都被汇总。该值与原始意大利辣香肠热图中的所有元素的一半进行比较。二分搜索算法试图最小化从掩码总和到半热图总和的差异。我使用了我们只需要从 0 到 180 度搜索的事实,因为掩码围绕数组的中心旋转。这种搜索非常有效,并且极大地减少了计算次数。
3D 最佳切割角度的可视化
在最后一步中,计算“Cut Here”的输出图像和切割箭头。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !