开云-FPGA 上使用 SVM 进行图像处理

FPGA 上利用 SVM 进行图象处置 时候:2024-12-13 21:33:00 手机看文章

扫描二维码随时随地手机看文章

SVM简介

脸部辨认是一个常常会商的计较机科学话题,而且因为计较机处置能力的指数级增加而成为人们高度存眷的话题。脸部辨认在机械人、生物平安和汽车工业等很多范畴都有普遍的利用,触及对输入图象利用数学算法,提取分歧的特点,注解所供给的图片中是不是存在人脸。标的目的梯度直方图(HOG)是一种传统算法,用在提取图象特点,例如像素标的目的,而且可以与线性撑持向量机(SVM)一路利用来将输入图象辨认为人脸或不是人脸。

我们将利用下面图象作为参考和测试:

图象处置 卷积

两个函数的卷积是一种主要的数学运算,在旌旗灯号处置中普遍利用。在计较机图形和图象处置范畴,我们凡是利用离散函数(例如图象)并利用离散情势的卷积来消弭高频噪声、锐化细节或检测边沿。

卷积是对两个旌旗灯号 f 和 g 的数学运算,界说为:

在图象范畴,我们可以将卷积想象为单个像素与其相邻像素之间的关系。这类关系首要利用搜刮色彩转变、亮度差别和像素周期性等怪异特点检测。

下图申明了利用小型 3 x 3 内核的卷积滤波器。滤波器被界说为一个矩阵,此中中间项对中间像素进行加权,其他项界说相邻像素的权重。我们也能够说 3×3 核的半径为 1,由于在卷积进程中只斟酌“一环”邻域。在图象鸿沟要界说卷积的行动,此中内核映照到图象外部不决义的值。

利用 3 x 3 窗口和 3 x 3 内核的卷积运算可以界说以下:

staticintconvolve(unsignedintwindow[3][3],intkernel[3][3]){intresult=0; for (inti=0;i i++) { for (intj=0;j j++) { result+= window[i][j] * kernel[i][j]; } } return result;}

为了对全部图象进行卷积运算,可以利用滑动窗口手艺。从第一个像素最先,每 8 个邻近像素被分组为一个方形窗口,窗口内的输入像素与内核进行卷积,发生一个像素值放置在输出图象中。反复此步调直到图象竣事。

Sobel-索贝尔

边沿检测是检测灰度图象中不持续性的最多见方式。边沿被界说为位在两个区域之间的特定鸿沟上的一组毗连的像素。

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

假定每一个像素都利用 32 位无符号整数暗示,则 RGB 转换为灰度的代码以下所示:

#defineR(pixel)(((pixel) 16) 0xFF) #defineG(pixel)(((pixel) 8) 0xFF) #defineB(pixel)(((pixel)) 0xFF) float rgb2gray(unsignedintpixel){ return (R(pixel)*0.2989+G(pixel)*0.5870+B(pixel)*0.1440);}

运行后,测试图象将以下所示:

Sobel 算子是边沿检测中最经常使用的算子之一。Sobel 算子利用两个 3×3 内核与原始图象进行卷积来计较导数的近似值 - 一个用在程度转变,另外一个用在垂直转变。假如我们将 A 界说为源图象,G x和 G y是两个图象,每一个点别离包括程度和垂直导数近似值,则计较以下:

经由过程前面的卷积函数,我们可使用以下代码计较输出图象:

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}};

卷积计较后获得的图象以下:

正如所看到的,垂直和程度细节获得加强而且更容易在不雅察。虽然它有帮忙,但我们需要一个更怪异的特点图象,仅代表边沿。

下一步将组合这两个图象并取得双向转变图。我们可以经由过程计较每一个像素值的巨细或强度和当前像素与边沿线中的另外一个像素链接的标的目的或角度来做到这一点。

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

和利用的角度:

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

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

成果是:

幅度角度

我们已获得边沿加倍集中的图象。虽然如斯,在多种情势的范畴,边沿会变得更宽。我们需要利用一种称为非极年夜值按捺的手艺来按捺这些毛病边沿:

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) return mag[1][1]; return 0;}

此刻边沿更薄、更简练。

实行

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

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

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 添加到存储库:

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

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

生成的图象应与摹拟图象类似。

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

第一个组件是 Znyq 处置系统和用在设置装备摆设相机接口的 i2c 节制器:

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

最后添加我们的图象处置IP和VDMA:

SVM-撑持向量机

在机械进修中,撑持向量机(SVM,也称为撑持向量收集)是具有相干进修算法的监视进修模子,用在阐发用在分类和回归阐发的数据。给定一组练习样本,每一个样本都标识表记标帜为属在两个种别中的一个或另外一个,SVM 练习算法会构建一个模子,将新样天职配给一个种别或另外一个种别,使其成为非几率二元线性分类器(虽然方式例如 Platt 缩放可以在几率分类设置中利用 SVM)。SVM 模子将示例暗示为空间中的点,进行映照,以便将分歧种别的示例划分为尽量宽的清楚间隙。然后,新的示例被映照到统一空间,并按照它们地点的间隙一侧猜测属在某个种别。

欲知详情,请下载word文档 下载文档

上一篇:开云-手把手教你在单片机上移植GuiLite 下一篇:开云-Python 命令行之旅:深入 click 之选项篇