赞
踩
要求选手通过获取PL端摄像头数据,完成图像预处理,使用提供的模型和CNN加速器进行推理,并将推理结果叠加到原视频流,通过PL端HDMI接口进行输出,最终通过HDMI输出刷新帧率和推理结果刷新速度来进行评分。
以下是一个简单的DVP时序解析模块伪代码:
module dvp_parser (
input PCLK,
input HREF,
input VSYNC,
input [7:0] DATA,
output reg [7:0] image_data,
output reg [15:0] row,
output reg [15:0] col,
output reg frame_valid
);
integer row_counter, col_counter;
reg new_frame;
always @(posedge PCLK) begin
if (VSYNC) begin
row_counter <= 0;
col_counter <= 0;
new_frame <= 1;
end else begin
if (HREF) begin
image_data <= DATA;
col_counter <= col_counter + 1;
end else begin
row_counter <= row_counter + 1;
col_counter <= 0;
end
end
创建叠加模块: 在FPGA设计中,创建一个用于将推理结果叠加到图像上的模块。该模块应具有以下功能:
绘制推理结果: 根据推理结果的类型(例如目标检测、分割或分类),采用不同的绘制方法。以下是一些常见的绘制方法:
在硬件设计中,可以使用专门的图形绘制模块(例如,基于BRAM的画笔),也可以在软件中实现此功能,例如使用OpenCV库。
输出叠加后的视频流: 将叠加后的视频流输出到HDMI显示器或其他输出接口,以便查看效果。这可能需要一个HDMI驱动模块或其他视频输出模块。
测试和验证: 在实际硬件上进行测试,确保推理结果正确叠加到原始视频流上,并能够通过输出接口显示。
以下是一个简单的伪代码,用于将边界框叠加到原始图像上:
void draw_bbox(cv::Mat &image, vector<BBox> bboxes) {
for (const auto &bbox : bboxes) {
// 绘制边界框
cv::rectangle(image, bbox.top_left, bbox.bottom_right, bbox.color, 2);
// 显示类别标签和置信度
std::string label = bbox.label + ": " + std::to_string(bbox.confidence);
int base_line;
cv::Size label_size = cv::getTextSize(label, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &base_line);
cv::putText(image, label, bbox.top_left, cv::FONT_HERSHEY_SIMPLEX, 0.5, bbox.color, 1);
}
}
使用带框架的FPGA AI加速器,虽然比较便利,但是会消耗一定的时间来处理框架开销,会降低加速器性能,影响视频流输出显示的帧率。
因此鼓励选手对AI框架进行深度优化,从而更高效的利用CNN加速器。同时鼓励选手自行设计PL端CNN加速器,以获得更高的帧率输出。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。