www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > > OpenFPGA

SVM簡介

面部識(shí)別是一個(gè)經(jīng)常討論的計(jì)算機(jī)科學(xué)話題,并且由于計(jì)算機(jī)處理能力的指數(shù)級(jí)增長而成為人們高度關(guān)注的話題。面部識(shí)別在機(jī)器人、生物安全和汽車工業(yè)等許多領(lǐng)域都有廣泛的應(yīng)用,涉及對(duì)輸入圖像應(yīng)用數(shù)學(xué)算法,提取不同的特征,表明所提供的圖片中是否存在人臉。方向梯度直方圖(HOG)是一種傳統(tǒng)算法,用于提取圖像特征,例如像素方向,并且可以與線性支持向量機(jī)(SVM)一起使用來將輸入圖像識(shí)別為人臉或不是人臉。

我們將使用下面圖像作為參考和測試:

圖像處理

卷積

兩個(gè)函數(shù)的卷積是一種重要的數(shù)學(xué)運(yùn)算,在信號(hào)處理中廣泛應(yīng)用。在計(jì)算機(jī)圖形和圖像處理領(lǐng)域,我們通常使用離散函數(shù)(例如圖像)并應(yīng)用離散形式的卷積來消除高頻噪聲、銳化細(xì)節(jié)或檢測邊緣。

卷積是對(duì)兩個(gè)信號(hào) f 和 g 的數(shù)學(xué)運(yùn)算,定義為:

在圖像領(lǐng)域,我們可以將卷積想象為單個(gè)像素與其相鄰像素之間的關(guān)系。這種關(guān)系主要應(yīng)用搜索顏色變化、亮度差異和像素周期性等獨(dú)特特征檢測。

下圖說明了使用小型 3 x 3 內(nèi)核的卷積濾波器。濾波器被定義為一個(gè)矩陣,其中中心項(xiàng)對(duì)中心像素進(jìn)行加權(quán),其他項(xiàng)定義相鄰像素的權(quán)重。我們也可以說 3×3 核的半徑為 1,因?yàn)樵诰矸e過程中只考慮“一環(huán)”鄰域。在圖像邊界要定義卷積的行為,其中內(nèi)核映射到圖像外部未定義的值。

使用 3 x 3 窗口和 3 x 3 內(nèi)核的卷積運(yùn)算可以定義如下:

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

為了對(duì)整個(gè)圖像進(jìn)行卷積運(yùn)算,可以應(yīng)用滑動(dòng)窗口技術(shù)。從第一個(gè)像素開始,每 8 個(gè)臨近像素被分組為一個(gè)方形窗口,窗口內(nèi)的輸入像素與內(nèi)核進(jìn)行卷積,產(chǎn)生一個(gè)像素值放置在輸出圖像中。重復(fù)此步驟直到圖像結(jié)束。

Sobel-索貝爾

邊緣檢測是檢測灰度圖像中不連續(xù)性的最常見方法。邊緣被定義為位于兩個(gè)區(qū)域之間的特定邊界上的一組連接的像素。

如果輸入圖像是彩色圖像,則在應(yīng)用卷積運(yùn)算之前,將其轉(zhuǎn)換為灰度圖像。

假設(shè)每個(gè)像素都使用 32 位無符號(hào)整數(shù)表示,則 RGB 轉(zhuǎn)換為灰度的代碼如下所示:

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

運(yùn)行后,測試圖像將如下所示:

Sobel 算子是邊緣檢測中最常用的算子之一。Sobel 算子使用兩個(gè) 3×3 內(nèi)核與原始圖像進(jìn)行卷積來計(jì)算導(dǎo)數(shù)的近似值 - 一個(gè)用于水平變化,另一個(gè)用于垂直變化。如果我們將 A 定義為源圖像,G x和 G y是兩個(gè)圖像,每個(gè)點(diǎn)分別包含水平和垂直導(dǎo)數(shù)近似值,則計(jì)算如下:

通過前面的卷積函數(shù),我們可以使用以下代碼計(jì)算輸出圖像:

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

其中窗口定義為 3 x 3 滑動(dòng)窗口,內(nèi)核是 Sobel 算子使用的內(nèi)核:

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

卷積計(jì)算后得到的圖像如下:

正如所看到的,垂直和水平細(xì)節(jié)得到增強(qiáng)并且更易于觀察。盡管它有幫助,但我們需要一個(gè)更獨(dú)特的特征圖像,僅代表邊緣。

下一步將組合這兩個(gè)圖像并獲得雙向變化圖。我們可以通過計(jì)算每個(gè)像素值的大小或強(qiáng)度以及當(dāng)前像素與邊緣線中的另一個(gè)像素鏈接的方向或角度來做到這一點(diǎn)。

在圖像中的每個(gè)點(diǎn),可以使用以下方法組合所得的近似值來給出幅度:

以及使用的角度:

squareroot 和 atan2 函數(shù)都已在 HLS 命名空間中實(shí)現(xiàn):

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

結(jié)果是:

幅度角度

我們已經(jīng)得到邊緣更加集中的圖像。盡管如此,在多種形式的領(lǐng)域,邊緣會(huì)變得更寬。我們需要使用一種稱為非極大值抑制的技術(shù)來抑制這些錯(cuò)誤邊緣:

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

現(xiàn)在邊緣更薄、更簡潔。

實(shí)施

如前所述,輸入圖像以數(shù)據(jù)流的形式逐像素輸入。為了應(yīng)用卷積運(yùn)算,我們需要將數(shù)據(jù)打包在 3 x 3 窗口下??梢允褂镁哂袃蓚€(gè)緩沖區(qū)的架構(gòu)來實(shí)現(xiàn)這一點(diǎn),其中元素?cái)?shù)量等于寬度,如果我們的輸入圖像:

這里將有兩個(gè)輔助函數(shù)用于移動(dòng)行緩沖區(qū)和滑動(dòng)窗口:

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

最后,我們可以將整個(gè)過程打包成一個(gè) HLS 函數(shù)(代碼見附件)。

得到了代碼后,還應(yīng)該對(duì)其進(jìn)行測試。GIMP (https://www.oschina.net/p/gimp?hmsr=aladdin1e1)有一個(gè)非??岬墓δ埽梢灾苯訉D像導(dǎo)出為頭文件。假設(shè)我們將測試圖像導(dǎo)出到文件 image.h 下,就可以利用如下代碼實(shí)現(xiàn)我們要測試的功能(代碼見文末)。

驗(yàn)證 HLS IP 的另一種方法是直接在 FPGA 上進(jìn)行驗(yàn)證。

第一步是創(chuàng)建block design并將合成的 Sobel IP 添加到存儲(chǔ)庫:

添加已實(shí)現(xiàn)的 IP,其中一個(gè) DMA 向其提供數(shù)據(jù),另一個(gè)讀取輸出:

生成比特流后就可以驗(yàn)證功能。

生成的圖像應(yīng)與模擬圖像相似。

現(xiàn)在我們需要實(shí)現(xiàn)一個(gè)直接從相機(jī)輸入的架構(gòu)。

第一個(gè)組件是 Znyq 處理系統(tǒng)和用于配置相機(jī)接口的 i2c 控制器:

在圖像流方面,需要一個(gè) MIPI 控制器和一個(gè) Demosaic IP 將流轉(zhuǎn)換為 RGB24:

最后添加我們的圖像處理IP和VDMA:

SVM-支持向量機(jī)

在機(jī)器學(xué)習(xí)中,支持向量機(jī)(SVM,也稱為支持向量網(wǎng)絡(luò))是具有相關(guān)學(xué)習(xí)算法的監(jiān)督學(xué)習(xí)模型,用于分析用于分類和回歸分析的數(shù)據(jù)。給定一組訓(xùn)練樣本,每個(gè)樣本都標(biāo)記為屬于兩個(gè)類別中的一個(gè)或另一個(gè),SVM 訓(xùn)練算法會(huì)構(gòu)建一個(gè)模型,將新樣本分配給一個(gè)類別或另一個(gè)類別,使其成為非概率二元線性分類器(盡管方法例如 Platt 縮放可以在概率分類設(shè)置中使用 SVM)。SVM 模型將示例表示為空間中的點(diǎn),進(jìn)行映射,以便將不同類別的示例劃分為盡可能寬的清晰間隙。然后,新的示例被映射到同一空間,并根據(jù)它們所在的間隙一側(cè)預(yù)測屬于某個(gè)類別。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
關(guān)閉