基於膚色模型的人臉識別FPGA實現,包含tb測試檔案和MATLAB輔助驗證

简简单单做算法發表於2024-05-14

1.演算法執行效果圖預覽

matlab2022a的測試結果如下:

vivado2019.2的模擬結果如下:

將資料匯入到matlab中,

系統的RTL結構圖如下圖所示:

系統包括中值濾波,RGB轉換為ycbcr,人臉檢測三個模組

2.演算法執行軟體版本

vivado2019.2

matlab2022a

3.演算法理論概述

膚色模型通常定義在特定的顏色空間中,常見的有RGB、HSV、YCbCr、Lab等。在這些顏色空間中,YCbCr因其能較好地分離亮度(Y)和色度資訊(Cb和Cr),常被用於膚色檢測。膚色模型可以是簡單的閾值方法,也可以是複雜的機率模型,如高斯模型或混合高斯模型。

對於給定的畫素點Cbi​,Cri​),可以透過計算其在膚色模型下的機率密度值來判斷是否屬於膚色區域。如果該值超過某一閾值T,則認為該畫素屬於膚色區域:

在膚色檢測之前,通常需要對影像進行預處理,如灰度化、去噪、光照補償等,以減少環境因素的干擾。對於彩色影像,首先將其從RGB空間轉換至YCbCr空間:

基於膚色模型,膚色分割通常採用閾值法或機率判決法。閾值法直接設定Cb和Cr的閾值範圍,如:

基於膚色模型的人臉識別技術利用了膚色在色彩空間中的統計特性,透過構建膚色機率模型實現人臉區域的初步定位。儘管這種方法對於複雜背景和光照變化敏感,但透過適當的預處理、後處理及模型最佳化,可以有效提升識別準確率。

4.部分核心程式

`timescale 1ns / 1ps
 
module TEST();
 
reg i_clk;
reg i_rst;
reg [7:0] Isave[0:220000];
integer fids;
 
 
integer dat; 
integer Pix_begin;
integer Sizes;
 
 
initial 
begin
	fids = $fopen("D:\\FPGA_Proj\\FPGAtest\\code\\test.bmp","rb");
	dat  = $fread(Isave,fids);
	//有效畫素起始位置
	Pix_begin = {Isave[13], Isave[12], Isave[11], Isave[10]};
	//尺寸
	Sizes     = {Isave[5], Isave[4], Isave[3], Isave[2]};
 
	$fclose(fids);
end
 
initial 
begin
i_clk=1;
i_rst=1;
#1000
i_rst=0;
end 
 
always #5  i_clk=~i_clk;
 
 
integer jj=0;
reg [7:0]R;
reg [7:0]G;
reg [7:0]B;
always@(posedge i_clk) 
begin
	R<=Isave[jj+2];//這個datas可以用於輸入到FPGA的後期處理
	G<=Isave[jj+1];//這個datas可以用於輸入到FPGA的後期處理
	B<=Isave[jj];//這個datas可以用於輸入到FPGA的後期處理
	jj<=jj+3;
end
 
 
wire [7:0]o_Rmed,o_Gmed,o_Bmed;
wire [7:0]o_Y;// Y 
wire [7:0]o_Cr;// Y 
wire [7:0]o_Cb;// Y 
wire [7:0]o_face_check;
 
 
tops tops_u(
.i_clk (i_clk),
.i_rst (i_rst),
.i_R   (R),
.i_G   (G),
.i_B   (B),
.o_Rmed       (o_Rmed),
.o_Gmed       (o_Gmed),
.o_Bmed       (o_Bmed),
.o_Y          (o_Y),// Y 
.o_Cr         (o_Cr),// Y 
.o_Cb         (o_Cb),// Y 
.o_face_check (o_face_check)
);
 
integer fout1;
initial begin
 fout1 = $fopen("face.txt","w");
end
 
always @ (posedge i_clk)
 begin
    if(jj<=65536*3+54 & jj>54)
	$fwrite(fout1,"%d\n",o_face_check);
	else
	$fwrite(fout1,"%d\n",0);
end
endmodule

  

相關文章