王金環(huán),徐衛(wèi)軍,李寶敏
(1.西安培華學(xué)院 智能科學(xué)與信息工程學(xué)院 計算機(jī)系,陜西 西安 710125;2.西安工業(yè)大學(xué)圖書館,陜西 西安 710021;3.西安工業(yè)大學(xué) 計算機(jī)學(xué)院,陜西 西安 710021)
網(wǎng)購已成為當(dāng)前人們生活中一種非常普遍的消費(fèi)方式。然而在網(wǎng)購衣服的時候,當(dāng)你找到了自己心儀的衣服款式,而這種款式穿在自己身上的效果卻不得知。以往的做法:只能把衣服買回來試穿后才能感覺到是否美觀、合身、稱心。本項目解決了人們網(wǎng)購衣服時的困擾,從而為人們網(wǎng)購帶來了極大的便利。
從技術(shù)層面來講,本項目利用計算機(jī)技術(shù)和一定的算法在云網(wǎng)的平臺下對實物進(jìn)行識別的嘗試,對于許多通過網(wǎng)購而需要嘗試的物品都可以通過該技術(shù)得到驗證。這一技術(shù)改變了人們身臨其境試穿的感官常規(guī)習(xí)慣和對網(wǎng)購物品體驗的嘗試,給人們以全新的理念和方式,給生活帶來極大的方便。它是將智能識別技術(shù)[1]在人們?nèi)粘I钜恍w驗進(jìn)行普及推廣應(yīng)用的一種嘗試,其在社會和人們?nèi)粘I钪芯哂泻軐嵱玫囊饬x和效應(yīng),尤其在當(dāng)今信息主導(dǎo)社會發(fā)展,將帶來一定程度的社會經(jīng)濟(jì)效益。
(1)云穿衣系統(tǒng)總體架構(gòu)如圖1所示。
圖1 系統(tǒng)總體架構(gòu)
●從攝像頭獲取圖像;
●從采集的圖像中分析出人臉、人體的幾個關(guān)鍵識別點(diǎn)[2-3];
●將捕獲的圖像作為貼圖,放置在場景的最后面一層;
●獲取識別點(diǎn)的坐標(biāo)[4-5];
●計算目標(biāo)大小和位置;
●根據(jù)目標(biāo)大小和位置,針對3D圖元進(jìn)行變換;
●渲染輸出圖元;
●由OM自動合并圖像。
(2)實現(xiàn)部分詳述。
●預(yù)載入分類器特征文件;
●獲取圖像;
●利用積分圖對每個像素計算特征值;
●通過決策樹篩選并得到目標(biāo)物體窗口;
●計算窗口大小及位置;
●根據(jù)窗口的大小、位置改變3D模型的坐標(biāo)的縮放及轉(zhuǎn)換;
●將獲取的圖像轉(zhuǎn)換為Texture2D作為背景貼圖;
●渲染3D[6-7]模型;
●由DirectX 12[8]的Output Merger自動合成;
●輸出圖像。
Haar算法[9]特征值反映了圖像的灰度變化情況。
Haar特征有邊緣特征、線性特征、中心特征和對角線特征。利用這些特征組合出僅有黑色矩形和白色矩形的特征模板,文中定義此模板的特征值為:白色矩形像素的和減去黑色矩形像素的和。以下進(jìn)行舉例:
圖2 Haar算法特征值圖像
對于圖2中A、B、D三種模型,其特征值計算公式為v=Sum白-Sum黑,而對于C模型,為了使兩種矩形區(qū)域像素數(shù)目一致,需要為黑色像素和乘2,因此公式為:v=Sum白-2*Sum黑。
計算過程中,通過調(diào)整模板的大小和位置,就可以得出很多特征。這些特征的值被稱為“特征值”。由于特征量過于龐大,可以利用圖3積分圖來進(jìn)行計算。
這里通過圖像大小一樣的一個二維數(shù)組來表示積分圖,在該二維數(shù)組中,(x,y)位置的值是在原始圖像中從(0,0)到(x,y)處的像素值的和。
對應(yīng)圖3中的a、c圖所示的haar特征,計算公式如下:
SAT(x,y)=SAT(x,y-1)+SAT(x-1,y)+
I(x,y)-SAT(x-1,y-1)
RecSum(r)=SAT(x-1,y-1)+SAT(x+w-1,
y+h-1)-SAT(x-1,y+h-1)-SAT(x+w-1,y-1)
圖3 積分圖
其中,SAT表示積分圖中的值,RecSum表示(x,y)處的長寬為(w,h)的區(qū)域的和。以RecSum為基礎(chǔ)來計算haar特征。同理,對b圖和d圖對應(yīng)的haar特征計算公式如下:
RSAT(x,y)=RSAT(x-1,y-1)+RSAT(x+1,
y-1)+I(x,y)-RSAT(x,y-2)+I(x,y)+I(x,y-1)
RecSum(r)=RSAT(x-h+w,y+w+h-1)+
RSAT(x,y-1)-RSAT(x-h,y+
h-1)-RSAT(x+w,y+w-1)
2.2.1 弱分類器
弱分類器用來表示一個最基本的Haar-like[10]特征,通過對輸入圖像計算得到的Haar-like特征值與最初的弱分類器的特征值進(jìn)行比較,來判斷所輸入的圖像是否為目標(biāo)物體。弱分類器通過孵化訓(xùn)練就成為最優(yōu)弱分類器。
一個弱分類器h是由x、f、p、θ(x:子窗口圖像,f:一個特征,θ:閾值)四部分組成。p的作用是控制不等式的方向,使得不等式都是<號,形式方便。這里是通過分類和回歸樹進(jìn)行識別,如圖4所示。
在分類的應(yīng)用中,每一個非葉子節(jié)點(diǎn)都表示一種判斷,每一條路徑都代表一種判斷的輸出,每一個葉子節(jié)點(diǎn)代表一種類別,并作為最終判斷的結(jié)果。
一個弱分類器就是圖4類似的決策樹,最基本的弱分類器只包含一個Haar-like特征,也就是說它的決策樹只有一層,被稱為樹樁(stump)。
要注意的是如何來確定每一個節(jié)點(diǎn)判斷的輸出,在對輸入圖像的特征值與弱分類器中的特征進(jìn)行比較時,需要有一個閾值才可以。判定其為人臉的條件是:只有當(dāng)輸入圖像的特征值大于該閾值時才成立。對最優(yōu)弱分類器的訓(xùn)練過程就是在尋找一個合適的分類器的閾值,使得該分類器對所有現(xiàn)有的樣本的判讀誤差降為最低。獲得閾值的操作過程如下:
(1)對于每個特征f,計算所有訓(xùn)練樣本的特征值,并將其排序。
圖4 回歸樹
(2)對排好序的特征值掃描一遍,對每個元素,計算求得以下四個值:
(a)全部人臉樣本的權(quán)重的和t1;
(b)全部非人臉樣本的權(quán)重的和t0;
(c)在此元素之前的人臉樣本的權(quán)重的和s1;
(d)在此元素之前的非人臉樣本的權(quán)重的和s0。
(3)最終在獲得每個元素的分類誤差對應(yīng)表中尋找r值最小的元素,并將該元素作為最優(yōu)閾值。
r=min(s1+(t0-s0),(s0+(t1-s1)))
2.2.2 強(qiáng)分類器
強(qiáng)分類器需要T輪的迭代,具體操作如下:
(1)給定訓(xùn)練樣本集S(共N個樣本),其中X和Y分別對應(yīng)于正樣本和負(fù)樣本,T為訓(xùn)練的最大循環(huán)次數(shù);
(2)初始化樣本權(quán)重為1/N,即為訓(xùn)練樣本的初始概率分布;
(3)第一次迭代訓(xùn)練N個樣本,得到第一個最優(yōu)弱分類器,步驟見2.2.1節(jié)
(4)提高上一輪中被誤判的樣本的權(quán)重;
(5)將新的樣本和上次被誤判的樣本放在一起進(jìn)行新一輪的訓(xùn)練。
(6)循環(huán)執(zhí)行步驟4-步驟5,T輪后得到T個最優(yōu)弱分類器。
(7)對T個最優(yōu)弱分類器組合得到強(qiáng)分類器。
組合方式如下:
強(qiáng)分類器的結(jié)果就是由所有弱分類器加權(quán)求和的結(jié)果與其分類結(jié)果平均值進(jìn)行比較得到最終結(jié)果。
2.2.3 目標(biāo)Haar分類器
為了使得檢測的結(jié)果更加準(zhǔn)確,需要進(jìn)行級聯(lián)分類器訓(xùn)練。這涉及到Haar分類器的另一個體系—檢測體系。檢測體系是以現(xiàn)實中的一幅大圖像作為輸入,然后對圖像進(jìn)行多區(qū)域、多尺度的檢測。由于訓(xùn)練的時候用的照片一般都是20*20 mm左右的小圖片,所以對于大的目標(biāo)物體,還需要進(jìn)行多尺度的檢測。在區(qū)域放大的過程中會出現(xiàn)同一個人臉被多次檢測,這還需要進(jìn)行區(qū)域的合并。
無論哪一種搜索方法,都會為輸入的圖像輸出大量的子窗口圖像,這些子窗口圖像,經(jīng)過篩選式級聯(lián)分類器多次地被每一個節(jié)點(diǎn)篩選、拋棄或通過。它的結(jié)構(gòu)如圖5所示。
圖5 Haar分類器結(jié)構(gòu)
級聯(lián)強(qiáng)分類器的策略一般是:將若干個強(qiáng)分類器由簡單到復(fù)雜排列,經(jīng)過訓(xùn)練使得每個強(qiáng)分類器獲得較高檢測率和低的誤識率,比如幾乎99%的目標(biāo)物體可以通過,但50%的非目標(biāo)物體也可以通過,這樣如果有20個強(qiáng)分類器級聯(lián),那么它們的總識別率為0.99^20,約為98%,錯誤接受率也僅為0.5^20,約為0.000 1%。這樣的效果就可以滿足現(xiàn)實的需要。
設(shè)K是一個級聯(lián)檢測器的層數(shù),D是該級聯(lián)分類器的檢測率,F(xiàn)是該級聯(lián)分類器的誤識率,di是第i層強(qiáng)分類器的檢測率,fi是第i層強(qiáng)分類器的誤識率。如果要訓(xùn)練一個級聯(lián)分類器,達(dá)到給定的F值和D值,只需要訓(xùn)練出每層的d值和f值:
dk=D,fk=F
級聯(lián)分類器的要點(diǎn)就是如何訓(xùn)練每層強(qiáng)分類器的d值和f值使其達(dá)到指定要求。級聯(lián)分類器在訓(xùn)練時要考慮弱分類器的個數(shù)和計算時間的平衡,以及強(qiáng)分類器檢測率和誤識率之間的平衡。
3D模型:通過調(diào)用DirectX3D[11]接口實現(xiàn)對3D模型的渲染。
圖形管線是運(yùn)行在圖形硬件上處理流程中的一部分,叫做Stages。將數(shù)據(jù)推入圖形管線就可以獲取3D場景的2D圖像。還可以利用Stream Output Stage來流式輸出處理后的集合體。某些圖形管線可以被編程,可以被編程的圖形管線被稱作Shaders,編程圖形管線使用高級著色語言(HLSL)。
3.1.1 圖形管線中的著色器
圖形管線中的著色器如圖6所示。
圖6 圖形管線著色圖
3.1.2 著色器各部分的功能
(1)The Compute Shader(CS)。
CS專門用來進(jìn)行任何類型的計算,CS利用CPU平行計算的優(yōu)勢,可以處理很多對性能要求較高的計算,如碰撞檢測等。
(2)Input Assembler (IA) Stage。
這是圖形管線中的第一個Stage,這個Stage是靜態(tài)的,不可編程的。用D3D Device配置IA,以便IA可以理解如何創(chuàng)建圖元。需要提供輸入布局給IA,以便IA了解如何讀取頂點(diǎn)數(shù)據(jù)。IA還有一個功能,就是將圖元放到一起,并附加到系統(tǒng)根據(jù)圖元生成的數(shù)據(jù)上。這些數(shù)據(jù)被稱為“語義”。例如輸入布局可以是這樣的:
D 3D11_INPUT_ELEMENT_DESC layout[]=
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0,
D 3D11_INPUT_PER_VERTEX_DATA, 0},
};
這個輸入布局告訴IA,每個頂點(diǎn)緩沖區(qū)有一個元素,語義為“Position”。它還說明了這個元素從第一個頂點(diǎn)字節(jié)包括了3個浮點(diǎn)數(shù),每一個是32位,4個字節(jié)。
(3)Vertex Shader (VS) Stage。
VS是第一個可編程Stage (Shader),必須為這個Stage編寫?yīng)毩⒌某绦?。VS Stage用來處理所有圖元的頂點(diǎn)數(shù)據(jù)。VS可以處理頂點(diǎn)的變換、縮放、光照、置換貼圖等。
最簡單的VS程序如下所示,它直接將輸入的頂點(diǎn)輸出。
float4 main(float4 pos:POSITION) : SV_POSITION
{
return pos;
}
Vertex shader直接返回了輸入的位置。注意參數(shù)中的POSITION在Pos的后面,這是語義的簡單的例子。在輸入給IA的頂點(diǎn)緩沖區(qū)布局中說明了數(shù)據(jù)的語義為POSITION,于是在這里通過POSITION獲取。
(4)Hull Shader (HS) Stage。
這是三個可選著色器中的第一個著色器。三個可選著色器統(tǒng)稱為Tesslation Stages,包含了Hull Stage、Tessellator、Domain Shader,它們一起工作并實現(xiàn)了如何進(jìn)行曲面細(xì)分。
曲面細(xì)分取出一個圖元對象,然后劃分成多個小部分,以便增加模型的細(xì)節(jié)。它可以以極快的速度在圖元出現(xiàn)在屏幕之前在GPU上創(chuàng)建新的圖元。
Hull Shader是一個可編程的Stage,Hull Shader可以為曲面細(xì)分后的圖元添加細(xì)節(jié),它會將數(shù)據(jù)發(fā)送給Tessellator Stage和Domain Shader Stage。
(5)Tessellator (TS) Stage。
Tessellator Stage是曲面細(xì)分的第二Tessllator Stage不可編程。它從HullShader中獲取數(shù)據(jù),然后將圖元進(jìn)行細(xì)分,最后將數(shù)據(jù)輸出給Domain Shader。
(6)Domain Shader (DS) Stage。
這是曲面細(xì)分的第三步。這是一個可編程的Stage。這個Stage從Hull Shader中取出頂點(diǎn)位置,然后變換從Tessllator Stage中取出頂點(diǎn)來為圖元添加細(xì)節(jié)。
(7)Geometry Shader (GS) Stage。
這是另一個可選的可編程Shader。它接受圖元作為輸入,然后輸出另一個圖元,與Vertex Shader不同的地方在于,這個Shader可以利用一個圖元創(chuàng)建另一個圖元,而Vertex Shader不能創(chuàng)建新的圖元。這個Shader常常用來創(chuàng)建粒子特效。
(8)Stream Output (SO) Stage。
這個Stage用來從管線中獲得頂點(diǎn)數(shù)據(jù)。
(9)Rasterizer Stage (RS)。
光柵器輸入向量信息(圖形或圖元),然后將它們轉(zhuǎn)換為像素。它還將不出現(xiàn)在視口中的圖元裁剪掉。
(10)Pixel Shader (PS) Stage。
這個Stage計算和修改每個將會在屏幕上出現(xiàn)的像素,比如光照信息等,這是一個可編程Shader。
PS的功能在于,計算每個Pixel Fragment的最終顏色,Pixel Fragment是每個可能被顯示在屏幕上的像素。舉個例子,有一個單面的矩形在一個單面的圓后面,矩形的像素和圓的像素都是Pixel Fragments,它們都有機(jī)會被寫入屏幕,它發(fā)現(xiàn)圓的深度數(shù)據(jù)小于矩形的,于是只有圓的像素會被顯示到屏幕上。PS將會輸出一個4D的顏色數(shù)據(jù)。舉一個簡單的例子:
float4 main():SV_TARGET
{
return float4(1.0f,1.0f,1.0f,1.0f);
}
這個像素著色器直接將每個將會出現(xiàn)在屏幕上的像素設(shè)置為白色。
(11)Output Merger (OM) Stage。
這是渲染管線的最后一個部分。這個Stage將會獲取每個Pixel Fragment的深度、鏤空信息,來決定最終哪些像素可以被渲染到渲染目標(biāo)上。
DirectX12工作主要包括以下四個方面:
(1)Pipeline State Objects (PSO)。
PSO指的是ID3D12PipelineState這個接口,利用Device的CreateGraphics Pipeline State()方法來創(chuàng)建。這個結(jié)構(gòu)體將會決定渲染管線的狀態(tài)。
(2)The Device。
Device指的是ID3D12Device接口。Device是一個用來創(chuàng)建CL,PSO,Root Signatures,CA,Command Queues,F(xiàn)ences,Resources,Descriptors以及Descriptor Heaps的虛擬適配器。通過D3D12CreateDevice()函數(shù)來創(chuàng)建Device。
(3)Command Lists (CL)。
CL指的是ID3D12CommandList接口,使用CL來分配需要在GPU上執(zhí)行的命令。
(4)Bundles。
Bundles指的是ID3D12CommandList接口,Bundles是一組經(jīng)常被重用的命令,因為CPU在創(chuàng)建命令的時候很浪費(fèi)時間,因此命令的重用對提升效率很有作用。
CQ指的是ID3D12CommandQueue接口,CQ還用來更新資源映射。
3.3.1 Command Allocators (CA)
CA指的是D3D12CommandALlocator接口,是顯存中CL和Bundles所儲存的空間。
3.3.2 Resource
Resource包括在構(gòu)造場景時需要用到的數(shù)據(jù)。它是儲存了幾何體、貼圖、著色器數(shù)據(jù)的可以被圖形管線訪問的大塊內(nèi)存。
資源類型是指資源所保存的數(shù)據(jù)的類型。包括:Texture1D、Texture1DArray、Texture2D、Texture2DArray、Texture2DMS、Texture2DMSArray、Texture3D、Buffers (ID3D12Resource)。
Descriptors是一個結(jié)構(gòu)體,用來告訴Shaders哪里可以找到資源,以及如何解釋資源數(shù)據(jù)??梢詾橥粋€資源創(chuàng)建多個描述符,用來以不同的方式傳遞給不同的Stage。
舉個例子,可以創(chuàng)建一個Texture2D資源,然后創(chuàng)建一個渲染目標(biāo)視圖以便使用資源作為輸出緩存的管線。描述符只能被放置在描述符堆中,不能儲存在內(nèi)存中。
3.5.1 Descriptor Tables (DT)
Descriptor Tables是一個描述符數(shù)組。Shader可以從描述符堆中訪問描述符,通過Root Signature的Descriptor Tables的索引。為了從Shader中訪問描述符,應(yīng)該給Root Signatures的Descritpro Tables進(jìn)行索引。
3.5.2 Descriptor Heaps (DH)
描述符堆表示的是ID3D12 Descriptor Heap接口,是一個占用大段內(nèi)存的描述符列表。
Root Signatures定義了Shader訪問的數(shù)據(jù)(資源)。Root Signatures類似于一個函數(shù)的參數(shù)列表,函數(shù)就是Shader,參數(shù)列表就是Shader訪問的數(shù)據(jù)的類型。
(1)Root Constants是一個內(nèi)聯(lián)的32位數(shù)據(jù)(DWORD)。這些數(shù)據(jù)直接儲存在Root Signature中,因為內(nèi)存限制了Root Signature,所以把Shader可以訪問的經(jīng)常改變的數(shù)值放置到這里。
(2)Root Descriptors是可以被Shader經(jīng)常訪問的內(nèi)聯(lián)的Descriptors。占用64位虛擬地址(2 DWORDS)。
(3)Descriptor Tables由偏移量和長度組成,位于Descriptor Heap中,Descriptor Tables只有32位。不限制其中保存的Descriptor數(shù)量。
Resource Barriers被用來改變資源的狀態(tài)或者資源的子資源的使用。
有三種資源的種類:
(1)Transition Barrier用來轉(zhuǎn)換資源以及子資源的狀態(tài)。
(2)Aliasing Barriers與Tiled Resources一起使用。
(3)UAV Barriers用來確保讀寫操作已經(jīng)完成。
Fences與Fence Events會指示GPU是否在執(zhí)行CQ。Fences指的是ID3D12Fence接口,通過Device的CreateFence()來創(chuàng)建,F(xiàn)ence Events通過CreateEvent()方法來創(chuàng)建。
通過計算機(jī)軟件建立人體以及人臉的模型,利用Haar算法對采集到的數(shù)據(jù)進(jìn)行匹配,匹配成功后則判定該物體為人體,通過硬件發(fā)射激光測量出深度場,并結(jié)合光源方向、物體明暗情況、人體模型的匹配結(jié)果,綜合判定人體的旋轉(zhuǎn)角度,然后將旋轉(zhuǎn)角度賦予衣服的模型,將渲染獲得的圖像與采集到的圖像[12]疊加,最后顯示到顯示屏上,就得到了穿上衣服的效果。
通過網(wǎng)格平均采樣的方式,獲得圖像中部分點(diǎn)的亮度,根據(jù)亮度判斷物體明暗情況,并結(jié)合圖像背景,判斷出光源位置。
云服務(wù)器負(fù)責(zé)接收商戶提交的關(guān)于衣服的數(shù)據(jù)(照片、尺寸等),建立出衣服的3D模型,并輸出一些有關(guān)衣服與人體適配的參數(shù),提供給客戶端進(jìn)行下載,客戶端需要結(jié)合參數(shù)合成衣服的動畫并渲染模型以及合成。
具體要解決的技術(shù)問題:(1)首先解決采集物的信息,采集手段與信息的處理;(2)對采集到的人與物等信息進(jìn)行識別;(3)在云平臺上[13]進(jìn)行人與衣服匹配的信息處理;(4)將處理后的信息提交給人去鑒賞。
從攝像頭或客戶端捕獲圖像,見圖7。
圖7 捕獲圖像
從收到的圖像中識別出人臉、肩膀部位,見圖8。
圖8 識別圖像
基于機(jī)器學(xué)習(xí)[14]以及Haar算法識別出特定的物體,如人臉,調(diào)用DirectX進(jìn)行渲染,通過DirectX 12用顯卡,進(jìn)行圖元的渲染。
由DirectX 12渲染管線中的OM直接合成圖像,然后繪制到hwnd上或輸出圖片,見圖9。
圖9 合并圖像
本項目在實踐初期經(jīng)常遇到識別不準(zhǔn)的問題。經(jīng)過研究發(fā)現(xiàn),是由于樣本數(shù)量不足導(dǎo)致的,后期將精力放在了樣本的采集上,使得識別精確度大幅提高。
(1)利用物體識別算法對物體大小的偵測并不完全靠譜,應(yīng)當(dāng)對物體的某些小區(qū)域進(jìn)行識別,根據(jù)多個小區(qū)域之間的距離計算出物體的大小,這才是合適的做法。
(2)在物體識別的過程中,攝像頭扮演的角色十分重要,因此,需要高精度攝像頭,攝像頭產(chǎn)生的雜色會嚴(yán)重影響到物體識別的精確度。
(3)這是智能識別技術(shù)在網(wǎng)購衣物方面的一次嘗試,尚存在許多不盡人意的地方,有待今后更進(jìn)一步的研究和學(xué)習(xí),使其更加趨于完善和成熟。