Xilinx FPGA 推動(dòng)人群自動(dòng)監(jiān)測(cè)技術(shù)的發(fā)展
基于 Spartan 6 的實(shí)時(shí)運(yùn)動(dòng)分類系統(tǒng)為人群的自動(dòng)監(jiān)測(cè)和監(jiān)控開(kāi)辟新途徑。
本文引用地址:http://m.butianyuan.cn/article/201601/286356.htm人群的監(jiān)控與監(jiān)測(cè)已經(jīng)成為當(dāng)前的一個(gè)重要領(lǐng)域。政府和安全部門都已經(jīng)開(kāi)始尋求在公共場(chǎng)所智能監(jiān)測(cè)人群的更先進(jìn)的方式,從而避免在來(lái)不及采取行動(dòng)之前檢測(cè)到任何異常活動(dòng)。但是在有效達(dá)成這一目的之前還需要克服一些障礙。例如,如果需要一天 24 小時(shí)同時(shí)監(jiān)測(cè)整個(gè)城市里所有可能的人群活動(dòng),僅靠全人工監(jiān)測(cè)是不可能的,尤其在安裝有數(shù)千部 CCTV 攝像頭的情況下更是如此。
這個(gè)問(wèn)題的解決方案在于開(kāi)發(fā)全新的智能攝像頭或視覺(jué)系統(tǒng),借助先進(jìn)的視頻分析技術(shù)自動(dòng)監(jiān)測(cè)人群的活動(dòng),從而能夠立即向中央控制站報(bào)告任何異常事件。
設(shè)計(jì)這種智能攝像頭/視覺(jué)系統(tǒng)不僅需要標(biāo)準(zhǔn)的成像傳感器和光學(xué)設(shè)備,還需要高性能視頻處理器來(lái)執(zhí)行視頻分析工作。使用這種功能強(qiáng)大的板載視頻處理器的原因在于先進(jìn)視頻分析技術(shù)具有較高的處理要求,大多數(shù)此類技術(shù)通常會(huì)使用計(jì)算密集型視頻處理算法。
FPGA 非常適合于此類高性能要求的應(yīng)用。借助賽靈思 Vivado® Design Suite 中高層次綜合 (HLS) 功能實(shí)現(xiàn)的 UltraFast™ 設(shè)計(jì)方法,現(xiàn)在可以為 FPGA 輕松創(chuàng)建理想的高性能設(shè)計(jì)。此外,賽靈思 MicroBlaze™ 等嵌入式處理器與 FPGA 可重配置邏輯的完美融合,讓用戶現(xiàn)在能夠?qū)⒕哂袕?fù)雜控制流的應(yīng)用方便地移植到 FPGA 上。
鑒于這種情況,我們使用 Vivado HLS、賽靈思嵌入式開(kāi)發(fā)套件 (EDK) 和 ISE® Design Suite 中基于軟件的EDA工具,設(shè)計(jì)出一種用于人群運(yùn)動(dòng)分類和監(jiān)測(cè)系統(tǒng)的原型。這種設(shè)計(jì)方法基于我們所認(rèn)為的軟件控制和硬件加速架構(gòu)。我們的設(shè)計(jì)采用低成本的賽靈思 Spartan®-6 LX45 FPGA。我們?cè)谳^短時(shí)間內(nèi)即完成了總體系統(tǒng)設(shè)計(jì),其在設(shè)計(jì)的實(shí)時(shí)性能、低成本和高靈活性方面均展現(xiàn)出頗有前景的結(jié)果。
利用加權(quán)絕對(duì)差之和 (SWAD),我們計(jì)算出圖像上分布的 900 多個(gè)運(yùn)動(dòng)向量。
系統(tǒng)設(shè)計(jì)
總體系統(tǒng)設(shè)計(jì)分兩個(gè)階段完成。第一階段是開(kāi)發(fā)人群運(yùn)動(dòng)分類算法。在這個(gè)算法的驗(yàn)證完成后,接下來(lái)是把它實(shí)現(xiàn)到 FPGA 中。在開(kāi)發(fā)的第二階段,我們主要關(guān)注基于 FPGA 的實(shí)時(shí)視頻處理應(yīng)用的架構(gòu)設(shè)計(jì)方面。具體工作包括開(kāi)發(fā)實(shí)時(shí)視頻流水線、開(kāi)發(fā)硬件加速器,最后將二者集成并實(shí)現(xiàn)到算法控制和數(shù)據(jù)流中,從而完成系統(tǒng)設(shè)計(jì)。
下面介紹每個(gè)開(kāi)發(fā)階段,首先從簡(jiǎn)要介紹算法設(shè)計(jì)開(kāi)始,然后詳細(xì)介紹如何將算法實(shí)現(xiàn)到 FPGA 平臺(tái)上。
算法設(shè)計(jì)
就人群監(jiān)視和監(jiān)控而言,文獻(xiàn)中提出了多種算法。大多數(shù)此類算法從在人群場(chǎng)景中檢測(cè)(或布置)特征點(diǎn)開(kāi)始,然后隨時(shí)間推移跟蹤這些特征點(diǎn),采集運(yùn)動(dòng)統(tǒng)計(jì)數(shù)據(jù)。隨后把這些運(yùn)動(dòng)統(tǒng)計(jì)數(shù)據(jù)投射到一些之前預(yù)先計(jì)算好的運(yùn)動(dòng)模型上,用來(lái)預(yù)測(cè)任何異?;顒?dòng) [1]。進(jìn)一步改進(jìn)包括聚集特征點(diǎn),跟蹤這些集群而非單獨(dú)的特征點(diǎn)[2]。
本文的人群運(yùn)動(dòng)分類算法基于相同的概念,除了我們優(yōu)先使用模板匹配方法進(jìn)行運(yùn)動(dòng)估計(jì),而不是采用 Kanade-Lucas- Tomasi (KLT) 特征跟蹤器等傳統(tǒng)方法。該模板匹配方法經(jīng)驗(yàn)證表明,增加一些計(jì)算量能顯著改善低對(duì)比度或?qū)Ρ榷炔粩嘧兓闆r下的運(yùn)動(dòng)估計(jì)。
為將這一方法用于運(yùn)動(dòng)估計(jì),我們將視頻幀劃分為更小矩形貼片組成的網(wǎng)格,然后使用基于加權(quán)絕對(duì)差之和 (SWAD) 的方法對(duì)每個(gè)貼片的當(dāng)前圖像和之前圖像進(jìn)行運(yùn)動(dòng)計(jì)算。每個(gè)貼片相應(yīng)地提供一個(gè)運(yùn)動(dòng)向量,用于說(shuō)明該特定位置兩幀之間的運(yùn)動(dòng)范圍和方向。結(jié)果就是需要在整個(gè)圖像上計(jì)算超過(guò) 900 個(gè)運(yùn)動(dòng)向量。計(jì)算這些運(yùn)動(dòng)向量涉及的具體步驟如圖1所示。
圖 1:計(jì)算運(yùn)動(dòng)向量的步驟,從圖像采集開(kāi)始(上)
此外,我們使用加權(quán)高斯內(nèi)核實(shí)現(xiàn)圖像中遮擋區(qū)和零對(duì)比度區(qū)的可靠性。而且,用于計(jì)算一個(gè)運(yùn)動(dòng)向量的一個(gè)貼片處理工作獨(dú)立于其它貼片的處理工作,因此該方法非常適合使用 FPGA 上的并行實(shí)現(xiàn)方案。
在計(jì)算完整個(gè)圖像上的運(yùn)動(dòng)向量后,該算法隨即計(jì)算它們的統(tǒng)計(jì)屬性。這些屬性包括平均運(yùn)動(dòng)向量長(zhǎng)度、運(yùn)動(dòng)向量數(shù)量、運(yùn)動(dòng)的主導(dǎo)方向和類似指標(biāo)。
另外我們還計(jì)算了運(yùn)動(dòng)向量方向的 360 度柱狀圖,進(jìn)一步分析其標(biāo)準(zhǔn)偏差、平均偏差和偏差系數(shù)等屬性。這些統(tǒng)計(jì)屬性隨后被投射到預(yù)先計(jì)算好的運(yùn)動(dòng)模型上,從而將當(dāng)前運(yùn)動(dòng)分類到幾大類別之一。隨后我們運(yùn)用多個(gè)幀來(lái)解釋這些統(tǒng)計(jì)屬性,從而確認(rèn)分類結(jié)果。
預(yù)先計(jì)算好的運(yùn)動(dòng)模型采用加權(quán)決策樹(shù)分類器的形式構(gòu)建,其充分考慮了這些統(tǒng)計(jì)屬性來(lái)對(duì)所觀察到的運(yùn)動(dòng)進(jìn)行分類。例如,如果觀察到運(yùn)動(dòng)速度快而且場(chǎng)景中有動(dòng)量突變,同時(shí)運(yùn)動(dòng)方向隨機(jī)或超出圖像平面,就可以分類為可能的恐慌情況。該算法的開(kāi)發(fā)工作使用微軟 Visual C++ 配合 OpenCV 庫(kù)完成。算法的完整演示請(qǐng)參閱本文文末提供的 Web 鏈接。
FPGA 實(shí)現(xiàn)方案
系統(tǒng)設(shè)計(jì)的第二階段是該算法的 FPGA 實(shí)現(xiàn)過(guò)程。 這一步實(shí)現(xiàn)工作有它自己的設(shè)計(jì)難題,例如 FPGA 設(shè)計(jì)現(xiàn)在要包括視頻輸入/輸出和幀緩存。此外,有限的資源和可用性能可能需要必要的設(shè)計(jì)優(yōu)化。
鑒于這些設(shè)計(jì)特點(diǎn)和其它架構(gòu)考慮,整個(gè) FPGA 實(shí)現(xiàn)方案被分為三個(gè)部分。第一部分是在 FPGA 上開(kāi)發(fā)通用的實(shí)時(shí)視頻流水線,用于處理必要的視頻輸入/輸出和幀緩存。第二部分是開(kāi)發(fā)算法專用硬件加速器。最后在設(shè)計(jì)的第三階段,我們把它們集成到一起,實(shí)現(xiàn)算法控制和數(shù)據(jù)流。這就完成了整個(gè)基于 FPGA 的系統(tǒng)設(shè)計(jì)。
下面對(duì)這個(gè)過(guò)程的每一階段進(jìn)行更詳細(xì)的介紹。
實(shí)時(shí)視頻流水線
在為 FPGA 平臺(tái)開(kāi)發(fā)任何視頻處理應(yīng)用時(shí),實(shí)時(shí)視頻流水線都是最重要的構(gòu)建模塊。這個(gè)流水線對(duì)用戶隱藏了視頻輸入/輸出和幀緩存相關(guān)的復(fù)雜存儲(chǔ)器管理工作,而是提供了簡(jiǎn)單的訪問(wèn)界面以供用戶處理視頻幀數(shù)據(jù)。
雖然在這方面目前有幾種先進(jìn)的、商業(yè)許可的視頻流水線[3],我們選擇構(gòu)建針對(duì)這個(gè)用途的定制視頻流水線。我們基于賽靈思 EDK 構(gòu)建該流水線,使用定制視頻采集/顯示端口處理視頻輸入/輸出數(shù)據(jù)。這個(gè)流水線也可以方便地進(jìn)行配置,從而用于其它賽靈思 FPGA 系列。
視頻采集端口負(fù)責(zé)解碼來(lái)自視頻 ADC 的輸入視頻流數(shù)據(jù)并在本地緩存。隨后該數(shù)據(jù)被轉(zhuǎn)發(fā)至主存儲(chǔ)器,用于創(chuàng)建視頻幀。與此類似,視頻顯示端口負(fù)責(zé)對(duì)本地緩存中存儲(chǔ)的視頻幀數(shù)據(jù)進(jìn)行編碼,然后將其轉(zhuǎn)發(fā)到視頻 DAC 中供顯示使用。視頻輸入輸出端口連接到 MicroBlaze 主機(jī)處理器的主外設(shè)總線,該處理器負(fù)責(zé)處理與主存儲(chǔ)器之間的視頻數(shù)據(jù)流量。
視頻端口能夠生成中斷,以通知 MicroBlaze 處理器在視頻輸入端口有可用的新數(shù)據(jù)或視頻輸入端口需要新數(shù)據(jù)。兩種視頻端口采用“往復(fù)式”緩存管理方案,這樣即使是 MicroBlaze 處理器都無(wú)法立即響應(yīng)視頻端口,也不會(huì)發(fā)生緩存溢出或欠載。圖2所示是視頻端口與 MicroBlaze 處理器之間的互聯(lián)。
圖 2:視頻端口及其互聯(lián)
視頻端口設(shè)計(jì)用于檢測(cè)和生成視頻行數(shù)量、場(chǎng) ID(如果是隔行視頻)和視頻輸入/輸出流中的其它控制信息。當(dāng)有足夠數(shù)量的視頻數(shù)據(jù)被視頻輸入端口緩存,或當(dāng)視頻顯示端口請(qǐng)求的數(shù)據(jù)達(dá)到足夠數(shù)量時(shí),該信息就會(huì)通過(guò)視頻端口的中斷服務(wù)例程 (ISR) 傳遞給 MicroBlaze 處理器。這些服務(wù)例程相應(yīng)地通過(guò) DMA 完成視頻端口本地存儲(chǔ)器和主存儲(chǔ)器之間的視頻數(shù)據(jù)傳輸。
除了視頻端口 ISR,還有我們稱之為“視頻幀隊(duì)列 API”的一套高級(jí)視頻幀隊(duì)列管理功能在這些 ISR 和用戶層應(yīng)用之間工作。該 API 負(fù)責(zé)維持多個(gè)采集幀和顯示幀的隊(duì)列,以支持雙幀或三幀緩存方案。在MicroBlaze上運(yùn)行的用戶應(yīng)用能輕松獲得視頻采集幀,或利用“視頻幀隊(duì)列 API”功能提供視頻顯示幀。圖 3 顯示了在層級(jí)結(jié)構(gòu)中各級(jí)別的相關(guān)功能。
圖 3:視頻端口 ISR 和視頻幀隊(duì)列 API 功能
將 MicroBlaze 用作主機(jī)處理器以連接系統(tǒng)中的各個(gè)構(gòu)建模塊能產(chǎn)生眾多優(yōu)勢(shì)。例如我們可以使用 MicroBlaze 方便地連接各種外部存儲(chǔ)器(SRAM、SDRAM 等),加載或存儲(chǔ)來(lái)自視頻端口的視頻幀數(shù)據(jù)。類似地,我們可以使用 EDK 中的 DMA 控制器,在視頻端口和主存儲(chǔ)器之間傳輸視頻數(shù)據(jù)。此外,我們還可用 MicroBlaze 處理器以同樣方式連接定制硬件加速器。
這些“視頻幀隊(duì)列 API”功能加上視頻端口 ISR 和視頻輸入輸出端口讓設(shè)計(jì)中的視頻處理流水線的構(gòu)造更加完善。圖 4 所示的是使用 FPGA 上的本視頻流水線采集、處理和顯示實(shí)際的視頻幀。它還顯示了通過(guò)計(jì)算出的運(yùn)動(dòng)向量縮小視圖實(shí)現(xiàn)的畫中畫功能。
圖 4:右下被運(yùn)動(dòng)向量網(wǎng)格覆蓋的、經(jīng)過(guò) FPGA 處理后的實(shí)際幀
基于 Vivado HLS 的硬件加速器
在前文介紹的人群運(yùn)動(dòng)分類算法中,最為耗時(shí)、計(jì)算最密集的工作是計(jì)算運(yùn)動(dòng)向量。另一項(xiàng)系統(tǒng)工作——進(jìn)行分類——因不涉及像素級(jí)的處理,非常簡(jiǎn)單而且易于實(shí)現(xiàn)。注意到設(shè)計(jì)的這個(gè)方面,我們?yōu)橛?jì)算運(yùn)動(dòng)向量構(gòu)建了一個(gè)硬件加速器。我們借助賽靈思 Vivado HLS,用 C/C++ 語(yǔ)言在 RTL 中對(duì)該加速器進(jìn)行了設(shè)計(jì)、測(cè)試和綜合。
Vivado 生成的 RTL 代碼的關(guān)鍵特征之一是其在很大程度上已經(jīng)過(guò)了精心優(yōu)化。Vivado HSL 把陣列存取(例如存儲(chǔ)在陣列中的像素?cái)?shù)據(jù))綜合到存儲(chǔ)器接口中,通過(guò)分析代碼自動(dòng)生成所需的地址。Vivado HSL 還可分析預(yù)先計(jì)算好的偏移和常量,從而非??焖俚貓?zhí)行所謂的“跨步式”存儲(chǔ)器訪問(wèn)??绮绞酱鎯?chǔ)器訪問(wèn)從圖像的多行數(shù)據(jù)訪問(wèn)開(kāi)始(就如同在 2D 卷積中)。
設(shè)計(jì)基于 Vivado 的加速器的主要考慮因素是并行處理運(yùn)動(dòng)向量的計(jì)算,最大限度地提高從主存儲(chǔ)器中的數(shù)據(jù)讀取。為此目的,我們使用八個(gè) Block RAM 并行加載和存儲(chǔ)視頻幀數(shù)據(jù)。硬件加速器的內(nèi)核能夠并行計(jì)算四個(gè)運(yùn)動(dòng)向量,而且在計(jì)算中它會(huì)用到所有八個(gè) Block RAM。從主存儲(chǔ)器傳輸?shù)竭@些 Block RAM 的數(shù)據(jù)由 MicroBlaze 通過(guò) DMA 加以控制。
Vivado HLS 生成的硬件加速器具有部分自動(dòng)生成的握手信號(hào),這些信號(hào)對(duì)于啟停硬件加速器必不可少。 這些握手信號(hào)包含“啟動(dòng)”、“繁忙”、“閑置”、“完成”等標(biāo)志。這些標(biāo)志通過(guò) GPIO 傳送到 MicroBlaze 處理器以完成握手。圖 5 所示為該硬件加速器、八個(gè) Block RAM 和 MicroBlaze 處理器主外設(shè)總線之間的互聯(lián)。
圖 5:基于 Vivado HLS 的硬件加速器及其互聯(lián)
圖 5 中分別被命名為 SA1、TA1 到 SA4、TA4 的這些 Block RAM,每個(gè)的容量為 16KB。每對(duì) SA1、TA1 到 SA4、TA4 能夠保存計(jì)算一個(gè)完整行的運(yùn)動(dòng)向量所需的數(shù)據(jù)。因此硬件加速器在完成運(yùn)行后,會(huì)輸出四行運(yùn)動(dòng)向量寫回到相同的 Block RAM 存儲(chǔ)器中。這些計(jì)算完的運(yùn)動(dòng)向量隨即由 MicroBlaze 處理器讀回,然后把結(jié)果以運(yùn)動(dòng)向量網(wǎng)格的形式復(fù)制到自己的主存儲(chǔ)器中。(圖 4 所示的是被硬件加速器計(jì)算出的運(yùn)動(dòng)向量網(wǎng)格覆蓋的實(shí)際幀)
該硬件加速器在 200MHz 頻率下工作,計(jì)算整個(gè)圖像的運(yùn)動(dòng)向量所需的全部處理任務(wù)能夠在不足 10 毫秒內(nèi)完成,包括與存儲(chǔ)器之間的所有數(shù)據(jù)往來(lái)傳輸。
算法控制和數(shù)據(jù)流
在視頻流水線和硬件加速器開(kāi)發(fā)就緒后,完成該系統(tǒng)的最后一步是把這兩個(gè)單元與 MicroBlaze 主機(jī)處理器集成,并使用賽靈思軟件開(kāi)發(fā)套件 (SDK_,用 C/C++ 實(shí)現(xiàn)用戶層應(yīng)用的算法控制和數(shù)據(jù)流。 在賽靈思 SDK 中實(shí)現(xiàn)算法控制和數(shù)據(jù)流能為設(shè)計(jì)帶來(lái)極大的靈活性。這是因?yàn)橛脩艨梢杂孟嗤姆绞皆O(shè)計(jì)和集成新的硬件加速器,同時(shí)還可以修改必要的控制和數(shù)據(jù)流以集成新的硬件加速器。最終得到的就是一種軟件控制、硬件加速的設(shè)計(jì),其靈活度可媲美純軟件實(shí)現(xiàn)方案,同時(shí)其性能可媲美純硬件實(shí)現(xiàn)方案。
本文介紹的人群運(yùn)動(dòng)分類算法的控制和數(shù)據(jù)流從通過(guò)視頻幀隊(duì)列 API 功能采集視頻幀開(kāi)始。當(dāng)視頻幀獲取完畢,用戶應(yīng)用把當(dāng)前的和之前的視頻幀數(shù)據(jù)傳輸?shù)接布铀倨?,完成運(yùn)動(dòng)向量的計(jì)算。
此時(shí)系統(tǒng)在軟件中計(jì)算運(yùn)動(dòng)向量的統(tǒng)計(jì)屬性和分類結(jié)果。這樣做的原因是這些步驟不涉及任何像素級(jí)處理,只會(huì)增加很少的處理開(kāi)銷。當(dāng)分類結(jié)果計(jì)算完成時(shí),用屏幕顯示(OSD)功能把結(jié)果和運(yùn)動(dòng)向量顯示在處理后的幀上。這些屏幕顯示功能也是在賽靈思 SDK 中用 C/C++ 語(yǔ)言實(shí)現(xiàn)的。
這些構(gòu)建模塊(實(shí)時(shí)視頻流水線、硬件加速器和算法控制/數(shù)據(jù)流)全部就緒后,總體系統(tǒng)設(shè)計(jì)即告完成。隨后我們對(duì)基于 FPGA 的實(shí)現(xiàn)方案進(jìn)行了測(cè)試,并與之前的桌面 PC 型實(shí)現(xiàn)方案比較結(jié)果的準(zhǔn)確性。兩個(gè)結(jié)果是完全一致的。我們使用來(lái)自明尼蘇達(dá)大學(xué)數(shù)據(jù)庫(kù)( http://mha.cs.umn.edu/proj_recognition.sht- ml )和來(lái)自www.gettyimages.com 的各種測(cè)試視頻對(duì)本系統(tǒng)進(jìn)行了測(cè)試。
實(shí)現(xiàn)方案結(jié)果
整個(gè)設(shè)計(jì)只使用了 Spartan-6-LX45 FPGA 上 30% 的Slice LUT、60% 的 BRAM 和12% 的 DSP48E 乘法器資源。圖 6 所示是硬件設(shè)置(上)和實(shí)際系統(tǒng)輸出。硬件設(shè)置由 Digilent Atlys Spartan 6 FPGA 板和定制視頻接口卡組成,利用視頻 ADC 和 DAC 可為 FPGA 提供視頻輸入/輸出功能。如欲觀看該系統(tǒng)的詳細(xì)演示視頻,敬請(qǐng)?jiān)L問(wèn)下列 Web 鏈接:
http://www.dailymotion.com/video/x2av1wo_fpga-based-real-time-hu-man-cro...
http://www.dailymotion.com/vid-eo/x23icxj_real-time-motion-vec-tors-comp...
http://www.dailymotion.com/video/x28sq1c_crowd-motion-classifica-tion-us...
圖 6:硬件設(shè)置(上)和把場(chǎng)景分類為驚恐的實(shí)際 FPGA 處理后的幀
巨大的未來(lái)潛力
FPGA 是面向?qū)崟r(shí)視頻處理等需要高性能的應(yīng)用的理想平臺(tái)。開(kāi)發(fā)這種應(yīng)用要求進(jìn)行一定的架構(gòu)考量,以充分發(fā)揮所選 FPGA 的性能優(yōu)勢(shì)。此外使用 EDK 和 Vivado HLS 等先進(jìn)工具,能夠以比過(guò)去高得多的效率和更短的開(kāi)發(fā)時(shí)間實(shí)現(xiàn)總體系統(tǒng)設(shè)計(jì)。
因此正如我們?cè)诒疚闹兴故镜?,利用上述工具?nbsp;FPGA 上實(shí)現(xiàn)性能關(guān)鍵型應(yīng)用有著巨大的潛力。有這樣成功運(yùn)行的平臺(tái)作為先例,我們期望把這一成果推廣用于解決更多的技術(shù)問(wèn)題,例如自動(dòng)化交通監(jiān)測(cè)、醫(yī)院中的自動(dòng)病患觀察等更多的應(yīng)用。
參考資料
1. Ramin Mehran、Mubarak Shah,《使用社會(huì)力模型檢測(cè)異常人群行為》,IEEE 計(jì)算機(jī)視覺(jué)與模式識(shí)別 (CVPR) 國(guó)際會(huì)議,邁阿密,2009年
2. Duan-Yu Chen、Po-Chung Huang,《基于運(yùn)動(dòng)的人群異常事件檢測(cè)》,《視覺(jué)計(jì)算和圖像顯示期刊(Journal of Visual Computation and Image Representation)》,2011 年第 2 期第 22 卷,第 178-186 頁(yè)
3. OmniTek OSVP:http://omnitek.tv/sites/ default/files/OSVP.pdf
評(píng)論