0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

请问如何FPGA上使用SVM进行图像处理呢?

OpenFPGA 来源:OpenFPGA 2024-03-18 11:28 次阅读

SVM简介

面部识别是一个经常讨论的计算机科学话题,并且由于计算机处理能力的指数级增长而成为人们高度关注的话题。面部识别在机器人、生物安全和汽车工业等许多领域都有广泛的应用,涉及对输入图像应用数学算法,提取不同的特征,表明所提供的图片中是否存在人脸。方向梯度直方图(HOG)是一种传统算法,用于提取图像特征,例如像素方向,并且可以与线性支持向量机(SVM)一起使用来将输入图像识别为人脸或不是人脸。

894d4d2c-e4c6-11ee-a297-92fbcf53809c.jpg

我们将使用下面图像作为参考和测试:

895c16ea-e4c6-11ee-a297-92fbcf53809c.png

图像处理

卷积

两个函数的卷积是一种重要的数学运算,在信号处理中广泛应用。在计算机图形和图像处理领域,我们通常使用离散函数(例如图像)并应用离散形式的卷积来消除高频噪声、锐化细节或检测边缘。

卷积是对两个信号 f 和 g 的数学运算,定义为:

898fa5d2-e4c6-11ee-a297-92fbcf53809c.png

在图像领域,我们可以将卷积想象为单个像素与其相邻像素之间的关系。这种关系主要应用搜索颜色变化、亮度差异和像素周期性等独特特征检测。

下图说明了使用小型 3 x 3 内核的卷积滤波器。滤波器被定义为一个矩阵,其中中心项对中心像素进行加权,其他项定义相邻像素的权重。我们也可以说 3×3 核的半径为 1,因为在卷积过程中只考虑“一环”邻域。在图像边界要定义卷积的行为,其中内核映射到图像外部未定义的值。

899a19b8-e4c6-11ee-a297-92fbcf53809c.png

使用 3 x 3 窗口和 3 x 3 内核的卷积运算可以定义如下:

staticintconvolve(unsignedintwindow[3][3],intkernel[3][3])
{
intresult=0;

for(inti=0;i< 3; i++) {
        for (int j = 0; j < 3; j++) {
            result+= window[i][j] * kernel[i][j];
        }
    }

    return result;
}

为了对整个图像进行卷积运算,可以应用滑动窗口技术。从第一个像素开始,每 8 个临近像素被分组为一个方形窗口,窗口内的输入像素与内核进行卷积,产生一个像素值放置在输出图像中。重复此步骤直到图像结束。

899e7562-e4c6-11ee-a297-92fbcf53809c.png

Sobel-索贝尔

边缘检测是检测灰度图像中不连续性的最常见方法。边缘被定义为位于两个区域之间的特定边界上的一组连接的像素。

如果输入图像是彩色图像,则在应用卷积运算之前,将其转换为灰度图像。

假设每个像素都使用 32 位无符号整数表示,则 RGB 转换为灰度的代码如下所示:

#defineR(pixel)(((pixel)>>16)&0xFF)
#defineG(pixel)(((pixel)>>8)&0xFF)
#defineB(pixel)(((pixel))&0xFF)

floatrgb2gray(unsignedintpixel)
{
return(R(pixel)*0.2989+G(pixel)*0.5870+B(pixel)*0.1440);
}

运行后,测试图像将如下所示:

89a995a0-e4c6-11ee-a297-92fbcf53809c.png

Sobel 算子是边缘检测中最常用的算子之一。Sobel 算子使用两个 3×3 内核与原始图像进行卷积来计算导数的近似值 - 一个用于水平变化,另一个用于垂直变化。如果我们将 A 定义为源图像,G x和 G y是两个图像,每个点分别包含水平和垂直导数近似值,则计算如下:

89c1dfc0-e4c6-11ee-a297-92fbcf53809c.png

通过前面的卷积函数,我们可以使用以下代码计算输出图像:

intdx=convolve(window,kernel_x);
intdy=convolve(window,kernel_y);

其中窗口定义为 3 x 3 滑动窗口,内核是 Sobel 算子使用的内核:

staticintkernel_x[3][3]={
{1,2,1},
{0,0,0},
{-1,-2,-1}
};

staticintkernel_y[3][3]={
{1,0,-1},
{2,0,-2},
{1,0,-1}
};

卷积计算后得到的图像如下:

89c5be60-e4c6-11ee-a297-92fbcf53809c.png

正如所看到的,垂直和水平细节得到增强并且更易于观察。尽管它有帮助,但我们需要一个更独特的特征图像,仅代表边缘。

下一步将组合这两个图像并获得双向变化图。我们可以通过计算每个像素值的大小或强度以及当前像素与边缘线中的另一个像素链接的方向或角度来做到这一点。

在图像中的每个点,可以使用以下方法组合所得的近似值来给出幅度:

89e80ef2-e4c6-11ee-a297-92fbcf53809c.png

以及使用的角度:

89f7af06-e4c6-11ee-a297-92fbcf53809c.png

squareroot 和 atan2 函数都已在 HLS 命名空间中实现:

unsignedintmagnitude=hls::sqrt(dx*dx+dy*dy);
intangle=hls::atan2(dx,dy);

结果是:

8a006ff6-e4c6-11ee-a297-92fbcf53809c.png 幅度 8a15781a-e4c6-11ee-a297-92fbcf53809c.png 角度

我们已经得到边缘更加集中的图像。尽管如此,在多种形式的领域,边缘会变得更宽。我们需要使用一种称为非极大值抑制的技术来抑制这些错误边缘:

unsignedintnms(unsignedintmag[3][3],intang){
unsignedintq,r;

q=r=255;

if((0<= ang < 23) || (158 < ang <= 180)) {
        q = mag[1][2];
        r = mag[1][0];
    } else if (223 <= ang < 68) {
        q = mag[2][0];
        r = mag[0][2];
    } else if ( 68 <= ang < 113) {
        q = mag[0][1];
        r = mag[2][1];
    } else if ( 113 <= ang < 158) {
        q = mag[0][0];
        r = mag[2][2];
    }

    if (mag[1][1] >=q&&mag[1][1]>=r)
returnmag[1][1];

return0;
}

现在边缘更薄、更简洁。

8a322686-e4c6-11ee-a297-92fbcf53809c.png

实施

如前所述,输入图像以数据流的形式逐像素输入。为了应用卷积运算,我们需要将数据打包在 3 x 3 窗口下。可以使用具有两个缓冲区的架构来实现这一点,其中元素数量等于宽度,如果我们的输入图像:

8a36272c-e4c6-11ee-a297-92fbcf53809c.png

这里将有两个辅助函数用于移动行缓冲区和滑动窗口:

staticvoidshift_w(unsignedintwindow[3][3],unsignedintv1,unsignedintv2,
unsignedintv3)
{
window[0][0]=window[0][1];
window[0][1]=window[0][2];
window[0][2]=v1;
window[1][0]=window[1][1];
window[1][1]=window[1][2];
window[1][2]=v2;
window[2][0]=window[2][1];
window[2][1]=window[2][2];
window[2][2]=v3;
}

staticvoidshift_b(unsignedintline_buffer[2][1280],intpos,
unsignedintval)
{
line_buffer[0][pos]=line_buffer[1][pos];
line_buffer[1][pos]=val;
}

最后,我们可以将整个过程打包成一个 HLS 函数(代码见附件)。

得到了代码后,还应该对其进行测试。GIMP (https://www.oschina.net/p/gimp?hmsr=aladdin1e1)有一个非常酷的功能,可以直接将图像导出为头文件。假设我们将测试图像导出到文件 image.h 下,就可以利用如下代码实现我们要测试的功能(代码见文末)。

验证 HLS IP 的另一种方法是直接在 FPGA 上进行验证。

第一步是创建block design并将合成的 Sobel IP 添加到存储库:

8a3e1c8e-e4c6-11ee-a297-92fbcf53809c.png

添加已实现的 IP,其中一个 DMA 向其提供数据,另一个读取输出:

8a56565a-e4c6-11ee-a297-92fbcf53809c.png8a618cbe-e4c6-11ee-a297-92fbcf53809c.png8a7abb6c-e4c6-11ee-a297-92fbcf53809c.png

生成比特流后就可以验证功能。

生成的图像应与模拟图像相似。

现在我们需要实现一个直接从相机输入的架构。

第一个组件是 Znyq 处理系统和用于配置相机接口的 i2c 控制器

8a92dc2e-e4c6-11ee-a297-92fbcf53809c.png8aac5c62-e4c6-11ee-a297-92fbcf53809c.png8abfef5c-e4c6-11ee-a297-92fbcf53809c.png

在图像流方面,需要一个 MIPI 控制器和一个 Demosaic IP 将流转换为 RGB24:

8ad6161a-e4c6-11ee-a297-92fbcf53809c.png8ae1552a-e4c6-11ee-a297-92fbcf53809c.png8aecac36-e4c6-11ee-a297-92fbcf53809c.png

最后添加我们的图像处理IP和VDMA:

8b007590-e4c6-11ee-a297-92fbcf53809c.png8b04c14a-e4c6-11ee-a297-92fbcf53809c.png



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1602

    文章

    21320

    浏览量

    593194
  • 图像处理
    +关注

    关注

    26

    文章

    1224

    浏览量

    55823
  • 计算机
    +关注

    关注

    19

    文章

    6649

    浏览量

    84526
  • SVM
    SVM
    +关注

    关注

    0

    文章

    154

    浏览量

    32183
  • 面部识别
    +关注

    关注

    1

    文章

    373

    浏览量

    26491

原文标题:FPGA 上使用 SVM 进行图像处理

文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    关于fpga图像处理

    各位大虾好,我现在正在做关于fpga的课题。想问问大家用fpga图像,图片以怎么的方式输入fpga进行
    发表于 04-12 11:00

    利用FPGA进行图像处理,实现特效显示,事先我怎么设定模块?

    利用FPGA进行图像处理,实现特效显示。请问事先我怎么设定模块?求帮忙说说采集
    发表于 10-10 00:21

    利用FPGA进行图像处理,实现“冻结”的特效是什么意思?

    利用FPGA进行图像处理,实现“冻结”的特效是什么意思?什么是冻结?大神快来帮忙
    发表于 10-14 00:30

    CPU vs FPGA图像处理谁更“应景”?

    图像发送回CPU以进行更高级的操作,例如光学字符识别(OCR)或模式匹配。在某些情况下,您可以在FPGA实现所有的处理步骤,并只将
    发表于 08-03 11:13

    图像处理FPGA 设计基本方法和代码

    图像处理FPGA 设计基本方法:1.阵列结构结合流水线处理设计例如RGB图像,包括三组数据,处理
    发表于 01-04 13:59

    基于FPGA图像平滑处理

    数据流,FPGA通过对其同步信号,如时钟、行频和场频进行检测,从而从数据总线上实时的采集图像数据。MT9V034摄像头默认初始化数据就能输出正常的视频流,因此FPGA中实际
    发表于 07-05 13:51

    如何在ML403 FPGA开发板实现图像处理

    我正在尝试在ML403 FPGA开发板实现图像处理。我知道如何进行图像
    发表于 11-07 09:20

    荐读:FPGA设计经验之图像处理

    基本就只能用FPGA。例如在一些分选设备中图像处理基本用的都是FPGA,因为在其中相机从看到物料图像
    发表于 06-08 15:55

    基于DSP和FPGA的通用图像处理平台设计

    设计一种基于DSP和FPGA架构的通用图像处理平台,运用FPGA实现微处理器接口设计,并对图像
    发表于 12-25 17:06 61次下载

    基于DSP和FPGA的通用图像处理平台设计

    基于DSP和FPGA的通用图像处理平台设计 摘要:设计一种基于DSP和FPGA架构的通用图像处理
    发表于 02-01 11:10 1392次阅读
    基于DSP和<b class='flag-5'>FPGA</b>的通用<b class='flag-5'>图像</b><b class='flag-5'>处理</b>平台设计

    FPGA图像处理

    FPGA图像处理
    发表于 12-14 22:29 18次下载

    基于SVM与Adaboost的图像检索应用梁竞敏

    基于SVM与Adaboost的图像检索应用_梁竞敏
    发表于 03-17 08:00 2次下载

    FPGA进行图像处理及其示例

    借助FPGA技术和NI视觉开发模块,您可以对从相机采集的图像进行高速现场可编程门阵列(FPGA)处理
    发表于 11-17 06:00 1.8w次阅读

    略谈FPGA图像处理

    FPGA图像处理之路,从此开始,接下来,让我们把时间交给“图像处理”。一休哥在动笔之前,一直在犹豫,反复思考着一个问题,这个问题一直困扰着我
    发表于 05-09 17:05 3967次阅读

    15个使用FPGA进行图像处理的相关论文资料免费下载

    本文档的主要内容详细介绍的是15个使用FPGA进行图像处理的相关论文资料免费下载主要内容包括了:图像调焦算法研究及
    发表于 12-25 08:00 39次下载
    15个使用<b class='flag-5'>FPGA</b><b class='flag-5'>进行</b><b class='flag-5'>图像</b><b class='flag-5'>处理</b>的相关论文资料免费下载