FPGA 上使用 SVM 进行图像处理

这篇具有很好参考价值的文章主要介绍了FPGA 上使用 SVM 进行图像处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉

SVM简介

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

FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉

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

FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉

图像处理

卷积

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

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

FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉

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

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

FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉

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

static int convolve(unsigned int window[3][3], int kernel[3][3])
{
    int result = 0;

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

    return result;
}

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

FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉

Sobel-索贝尔

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

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

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

#define R(pixel)    (((pixel) >> 16) & 0xFF)
#define G(pixel)    (((pixel) >> 8)  & 0xFF)
#define B(pixel)    (((pixel)      ) & 0xFF)

float rgb2gray(unsigned int pixel)
{
    return (R(pixel) * 0.2989 + G(pixel) * 0.5870 + B(pixel) * 0.1440);
}

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

FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉

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

FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉

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

int dx = convolve(window, kernel_x);
int dy = convolve(window, kernel_y);

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

static int kernel_x[3][3] = {
    { 1,  2,  1},
    { 0,  0,  0},
    {-1, -2, -1}
};

static int kernel_y[3][3] = {
    { 1,  0, -1},
    { 2,  0, -2},
    { 1,  0, -1}
};

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

FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉

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

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

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

FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉

以及使用的角度:

FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉

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

unsigned int magnitude = hls::sqrt(dx*dx + dy*dy);
int angle = hls::atan2(dx,dy);

结果是:

FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉幅度 FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉角度

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

unsigned int nms(unsigned int mag[3][3], int ang) {
    unsigned int q,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)
        return mag[1][1];

    return 0;
}

现在边缘更薄、更简洁。

FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉

实施

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

FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉

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

static void shift_w(unsigned int window[3][3], unsigned int v1, unsigned int v2,
                    unsigned int v3)
{
    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;
}

static void shift_b(unsigned int line_buffer[2][1280], int pos,
                    unsigned int val)
{
    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 添加到存储库:

FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉

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

FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉

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

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

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

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

FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉

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

FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉

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

FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉FPGA 上使用 SVM 进行图像处理,fpga开发,支持向量机,图像处理,机器学习,计算机视觉

HOG

后续单独文章介绍,敬请关注~

SVM-支持向量机

在机器学习中,支持向量机(SVM,也称为支持向量网络)是具有相关学习算法的监督学习模型,用于分析用于分类和回归分析的数据。给定一组训练样本,每个样本都标记为属于两个类别中的一个或另一个,SVM 训练算法会构建一个模型,将新样本分配给一个类别或另一个类别,使其成为非概率二元线性分类器(尽管方法例如 Platt 缩放可以在概率分类设置中使用 SVM)。SVM 模型将示例表示为空间中的点,进行映射,以便将不同类别的示例划分为尽可能宽的清晰间隙。然后,新的示例被映射到同一空间,并根据它们所在的间隙一侧预测属于某个类别。

代码

https://github.com/cuciureansergiu/kv260_svm文章来源地址https://www.toymoban.com/news/detail-842330.html

到了这里,关于FPGA 上使用 SVM 进行图像处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA应用于图像处理

    FPGA(Field-Programmable Gate Array)直译过来就是现场可编程门阵列。是一种可以编程的逻辑器件,具有高度的灵活性,可以根据具体需求就像编程来实现不同的功能。 FPGA器件属于专用的集成电流中的一种半定制电路,是可编程的逻辑阵列,内部有基本的逻辑单元,可配置的逻辑

    2024年02月11日
    浏览(31)
  • FPGA图像处理-灰度化

    用 verilog 实现彩色图像的灰度化算法,并进行 Modelsim 仿真。 图像处理操作中最简单的一类就是点操作,一个像素的输出只取决于输入图像的相应像素值。 RGB 转 GRAY 公式: GRAY = 0.299R + 0.587G + 0.114B 由于 FPGA 不方便小数运算,所以放大 256 倍进行运算,然后右移 8 位: GRAY = (

    2024年02月07日
    浏览(38)
  • 基于FPGA的图像灰度处理

            对于图像的灰度处理,原理与基于FPGA的图像反转相同,但算法不同。相交于基于FPGA的图像反转,基于FPGA的图像灰度处理操作时间由于FPGA的并行性,其处理时间与前者相同。虽然工作量大了4倍左右,但处理时间基本相同,在仿真中,仍在5.2ms完成了处理。凸显出

    2024年02月04日
    浏览(30)
  • 基于FPGA的车牌识别,其中包括常规FPGA图像处理算法

    基于FPGA的车牌识别,其中包括常规FPGA图像处理算法:         rgb转yuv,        sobel边缘检测,        腐蚀膨胀,        特征值提取与卷积模板匹配。 有bit流可以直接烧录实验。 保证无错误,完好,2018.3vivado版本,正点达芬奇Pro100t,板卡也可以自己更改移植一下。 所

    2024年04月14日
    浏览(36)
  • 基于FPGA的运动目标检测跟踪系统项目,FPGA项目,FPGA图像处理(已实现)

      1.项目简介 基于FPGA的运动目标检测跟踪系统项目,FPGA项目,FPGA图像处理 FPGA项目 采用帧间差分法作为核心算法,该项目涉及图像采集,颜色空间转换,帧间差分核心算法,腐蚀等形态学处理,目标定位,目标标识,图像显示等模块。 通过该项目可以学习到以下两方面内容

    2024年02月07日
    浏览(33)
  • FPGA图像处理仿真实验——sobel算子

            sobel算子是一个离散的一阶差分算子,广泛应用于边缘检测等领域。算法的 应用原理比较简单,可以完成对水平方向和垂直方向的边缘检测。分别用图中的两个卷积模板对图像进行滑动窗口的卷积计算,将卷积模板和图像3*3窗口对应的数据相乘,相乘的结果相加得

    2024年02月17日
    浏览(38)
  • 基于FPGA的数字图像处理【1.0】

            最近几年图像处理与机器视觉的发展非常迅速,图像处理领域也被认为是未来几十年最有前途的领域之一。         随着现代图像及视频处理技术的不断发展,人们对图像处理提出了新的要求,图像处理系统的硬件体积越来越小,实时性也越来越好。特别是最

    2024年04月14日
    浏览(24)
  • FPGA|数字图像处理实现口罩识别——二值化

    【写在前面】刚入门小菜鸟,记录一下口罩识别学习过程。参考文件和网址会在文末注明。有错误欢迎指出,也欢迎进行补充~ 原理图如下,二值化对应为红框里的部分 使用的二值化方法是 手动指定一个 阈值 ,通过阈值来进行二值化处理 。(还有一种方法是一个自适应阈值

    2023年04月11日
    浏览(37)
  • FPGA图像处理仿真实验——均值滤波(FIFO)

            之前的博客中用shift ram做的均值滤波,那篇文章里讲了原理,在这里不进行重复。考虑到shift ram的深度有限,在处理高分辨率图片时可能会收到限制,所以这次采用FIFO来进行均值滤波。FIFO可以看成是一个先进先出的堆栈,有两个独立的读使能信号和写使能信号,

    2024年02月13日
    浏览(31)
  • FPGA图像处理_中值滤波实现(含源码)

    非线性滤波器在通常情况下没有特定的转移函数。一类比较重要的非线性滤波就是统计排序滤波器,统计排序滤波器即对窗口内的像素值进行排序并通过多路选择器选择使用排序后的值,例如中值滤波、最大/最小值滤波等。排序滤波器或者其组合,可以在很多图像处理的场合

    2023年04月15日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包