資料介紹
描述
項(xiàng)目概念
項(xiàng)目名稱“Xiraffe”是“Xilinx”和“Giraffe”的組合。這個(gè)
簡(jiǎn)單來說,該項(xiàng)目的目標(biāo)是建造一個(gè)“動(dòng)物觀測(cè)站”,使用安裝在高處(長(zhǎng)桅桿或樹頂上)的穩(wěn)定的、可平移的相機(jī),從遠(yuǎn)處觀察動(dòng)物。長(zhǎng)焦距(又名變焦)鏡頭,因此單個(gè)單元可以覆蓋廣闊的區(qū)域。野生動(dòng)物生物學(xué)家可以使用這種設(shè)備來幫助研究動(dòng)物習(xí)性、遷徙模式等。
同樣的設(shè)備也可用于動(dòng)物保護(hù)區(qū)等地方的動(dòng)物保護(hù)主義者,以檢測(cè)和防止非法動(dòng)物偷獵。該設(shè)備可以安裝在高處,有助于在廣闊的區(qū)域內(nèi)保持監(jiān)視……就像長(zhǎng)頸鹿一樣!
在這篇文章中,我將嘗試記錄我嘗試構(gòu)建這種設(shè)備的過程。
背景
我使用 Xilinx FPGA 已有一段時(shí)間了,并且喜歡在各種項(xiàng)目中使用 Zynq-7000 SOC。我是 SOC 概念的忠實(shí)擁護(hù)者,過去曾在各種項(xiàng)目中為 Zynq FPGA 找到了一個(gè)好地方,尤其是在使用成像傳感器時(shí)。然而,最近,我一直想探索擁有各種奇特功能的最新 Zynq Ultrascale 設(shè)備。這個(gè)項(xiàng)目似乎很適合這個(gè)。
董事會(huì)花了很長(zhǎng)時(shí)間才到達(dá)我的手中,但它終于做到了。我自己使用 Xilinx 設(shè)備的經(jīng)驗(yàn)主要是使用 Vivado 和 SDK,我的大部分設(shè)計(jì)都是基于裸機(jī)或 FreeRTOS,但沒有基于 petalinux。由于在這個(gè)項(xiàng)目中我需要同時(shí)使用 VCU 和 DPU,我知道我必須涉足 linux 領(lǐng)域。這是一個(gè)相當(dāng)長(zhǎng)的學(xué)習(xí)曲線,所以我將盡可能詳細(xì)地記錄我的旅程。
套件
ZCU104 套件包括 ZCU104 板、電源、16GB SD 卡、USB3 集線器和 USB3 攝像頭。一切都包裝得很好。我需要開始的唯一其他東西是 HDMI 電纜、顯示端口電纜和顯示器。謝天謝地,我已經(jīng)有了這些。
啟程之旅...
由于在開始了解項(xiàng)目的細(xì)節(jié)之前有很多東西需要學(xué)習(xí)(硬件和軟件方面),我開始了熟悉這個(gè)野獸的旅程,以及可用的工具。
第 1 步:?jiǎn)?dòng)電路板并運(yùn)行出廠映像:我按照套件隨附手冊(cè)中的說明進(jìn)行操作。這包括一些外圍測(cè)試以及通過查看 LED 來驗(yàn)證板上的各種電壓。
第 2 步:嘗試 PYNQ:我一直對(duì) PYNQ 感到非常興奮,因?yàn)橥ǔ?python 比 C/C++ 更容易嘗試想法。
設(shè)置很簡(jiǎn)單,下載 ZCU104 的圖像并按照http://www.pynq.io/上的說明進(jìn)行操作
我登錄到板子并瀏覽了所有提供的示例,這非常有趣。坦率地說,我希望 PYNQ 能夠提供足夠的“能力”,讓我可以在項(xiàng)目中做我想做的所有事情,至少用于原型制作目的。但是,我很快意識(shí)到 PYNQ 不支持使用 DPU 或 VCU,而這兩者都是我的項(xiàng)目所需要的。我試圖在互聯(lián)網(wǎng)上進(jìn)行挖掘,并認(rèn)為我需要相當(dāng)多的技能才能在 PYNQ 中集成和使用這些功能,所以我暫時(shí)放棄了它,并且
順便說一句,我最近在這里和這里遇到了一些不錯(cuò)的帖子,這些帖子展示了如何將 DPU 與 PYNQ 一起使用。我計(jì)劃很快嘗試一下。對(duì)于在 PYNQ 中使用 VPU,我還沒有發(fā)現(xiàn)任何有用的東西。
第 3 步:嘗試 USB3 相機(jī) reVISION 堆棧示例:在嘗試查找附帶相機(jī)的一些信息時(shí),我遇到了這個(gè)鏈接,并決定嘗試 ZCU104 上的 reVISION 示例。我發(fā)現(xiàn)密集光流示例特別令人著迷,它給了我很好的動(dòng)力,讓我以后在板上嘗試類似的東西。我還學(xué)習(xí)了一些關(guān)于在板上使用 gstreamer 管道的知識(shí),這在以后也很有用。
第 4 步:安裝 VITIS:此時(shí)我確信我需要走 VITIS 路線才能同時(shí)使用 DPU 和 VCU。因此,我開始遵循 Adam Taylor 在此鏈接上的出色指南(包括視頻)。就我而言,由于我沒有專用的 Linux PC,因此我在 VM 中安裝了 VITIS(我使用了 VMware,但 VirtualBox 或其他應(yīng)該可以正常工作)。
a) 一個(gè)*必須*使用兼容版本的 Ubuntu。我最初嘗試使用 Ubuntu 18.04,但我遇到了意外錯(cuò)誤,因此它無法在安裝 Vitis 時(shí)繼續(xù)前進(jìn)。最后,我為 18.04.4 LTS 創(chuàng)建了一個(gè)新 VM,一切正常。
b) 創(chuàng)建 VM 時(shí),請(qǐng)確保分配至少 120GB 空間,因?yàn)?Vitis 安裝不會(huì)繼續(xù)進(jìn)行,除非它看到它認(rèn)為需要的所有可用空間。我最初嘗試將 100GB 分配給 VM,但它不會(huì)繼續(xù)安裝。就我而言,在虛擬機(jī)設(shè)置中增加分配的磁盤空間后,我使用 Linux 實(shí)用程序“GParted”將磁盤擴(kuò)展至 150GB。后來我了解到,當(dāng)您開始安裝和使用其他賽靈思工具(XRT、petalinux、Vitis-AI 等)時(shí),即使這還不夠,我不得不多次調(diào)整驅(qū)動(dòng)器的大小,直到 200GB。
在這一點(diǎn)上,我會(huì)推薦
第 5 步:跟隨 Adam Taylor 的網(wǎng)絡(luò)研討會(huì)“使用 Vitis 構(gòu)建加速應(yīng)用程序”,可在此處獲得。
當(dāng) QEMU 模擬器無法啟動(dòng)時(shí),我最終遇到了一個(gè)小問題。仔細(xì)查看錯(cuò)誤消息,我發(fā)現(xiàn)它無法識(shí)別關(guān)鍵字“netstat”,因此我在 Ubuntu OS 中打開了一個(gè)終端窗口并安裝了 net-tools,之后它開始正常工作。
sudo apt-get install net-tools
請(qǐng)注意,本教程將指導(dǎo)您將 DPU 與您的自定義設(shè)計(jì)集成。此特定網(wǎng)絡(luò)研討會(huì)未涵蓋此 DPU 在 Vitis-AI 中的使用。
第 6 步:Vitis 深度教程:我按照一些 Vitis 深度教程來熟悉 Vitis 中的一些新概念(我過去主要使用 SDK),并熟悉 AI事情的一面,我對(duì)此很陌生。這些教程是一個(gè)好的開始
https://github.com/Xilinx/Vitis-In-Depth-Tutorial
第 7 步:構(gòu)建 IVAS TRD 設(shè)計(jì):我遇到了 Xilinx 最近發(fā)布的 IVAS(智能視頻分析系統(tǒng))參考設(shè)計(jì)(此處),這似乎是我項(xiàng)目的一個(gè)很好的起點(diǎn),因?yàn)樗Y(jié)合了 DPU 用于 AI 推理,如以及用于視頻編碼/解碼的 VPU。
我花了幾天時(shí)間成功地重新創(chuàng)建設(shè)計(jì)并運(yùn)行 Facedetect + reid 演示,但最終我成功了并且對(duì)結(jié)果非常滿意。該設(shè)計(jì)使用 gstreamer 運(yùn)行演示,這有好有壞。很好,因?yàn)槲医?jīng)常使用 gstreamer,而不好,因?yàn)槲矣X得將我的應(yīng)用程序構(gòu)建為 gstreamer 過濾器(如演示中所做的那樣)對(duì)于我目前的能力水平來說有點(diǎn)太多了。也就是說,我決定使用這個(gè)圖像作為我的基礎(chǔ)平臺(tái),并在它之上構(gòu)建我的應(yīng)用程序。
構(gòu)建硬件
該項(xiàng)目的一個(gè)重要方面是,當(dāng)您在非城市環(huán)境中工作時(shí),您沒有安裝攝像機(jī)的剛性結(jié)構(gòu)。因此,您可以使用,例如,使用“Guy-lines”吊起的一根長(zhǎng)桿,或者可能是一根綁在該地區(qū)一棵較高樹木的樹干頂部的桿,以提供較高的有利位置,并能夠觀察更大的區(qū)域。無論哪種方式,您的相機(jī)安裝架都會(huì)有些不穩(wěn)定,因此視頻輸入不穩(wěn)定......對(duì)于圖像處理來說不是那么好。我決定通過將相機(jī)安裝在 3 軸無刷萬向節(jié)上來解決這個(gè)問題,并(最終)在 FPGA 中進(jìn)行視頻穩(wěn)定以消除剩余的運(yùn)動(dòng)偽影。
無刷云臺(tái)實(shí)際上應(yīng)該有兩個(gè)好處:1。在很大程度上穩(wěn)定視頻2。允許使用相同的電機(jī)來控制相機(jī),因?yàn)槲覀冃枰谖覀兊南到y(tǒng)中進(jìn)行平移控制。
對(duì)于無刷云臺(tái)部分,我買了一個(gè)便宜的 3 軸無刷云臺(tái)框架,它配備了 3 個(gè)小電機(jī)。設(shè)計(jì)不是最好的,但我還不想在這部分項(xiàng)目上花費(fèi)太多時(shí)間。
我研究了一個(gè)很好的無刷云臺(tái)用于我的設(shè)計(jì),并遇到了 Olliw 的“STorm32 BGC ” 。我訂購(gòu)了一個(gè) V1.3 板開始使用,兩周后我收到了。我先用 Gopro 試了一下,效果很好,而且很容易設(shè)置。我最初的計(jì)劃是將 ARM Coretx-M3 代碼移植到 FPGA 內(nèi)部實(shí)例化的 ARM Cortex-M3 或 ZU7-EV 內(nèi)部的 Cortex-R5。然而,令我沮喪的是,盡管這個(gè)特定云臺(tái)板的硬件是開源的,但軟件卻不是。您可以隨意使用已編譯的二進(jìn)制文件,但代碼未打開。我有點(diǎn)失望,但我不得不繼續(xù)前進(jìn)。幸運(yùn)的是,我發(fā)現(xiàn)這個(gè)云臺(tái)允許通過 uart 接口控制位置,所以我決定改用它。
由于我需要一個(gè)長(zhǎng)焦距(又名“變焦”)鏡頭,我擰下隨附 USB3 相機(jī)上的 M12 鏡頭,并使用中間的 C-to-M12 適配器更換為 35mm C-mount 鏡頭(鏈接在項(xiàng)目物料清單)。這為我提供了一個(gè)非常狹窄的視野,以及更好的圖像質(zhì)量。
下一步是將它安裝在我的無刷云臺(tái)上。我設(shè)計(jì)并 3D 打印了一個(gè)支架,以便我可以將這款相機(jī)安裝在我的無刷云臺(tái)設(shè)置上。
我將固件上傳到板上,并嘗試校準(zhǔn)云臺(tái)。這是我的萬向節(jié)設(shè)置遇到的主要障礙。我發(fā)現(xiàn)云臺(tái)上的電機(jī)功率不足以支撐和移動(dòng)相機(jī)+鏡頭。我可以通過在相機(jī)背面添加一些金屬片和大量熱膠(其中一些在上圖中可見)來平衡情況,從而使情況變得更好。但是,一旦我將 USB-C 數(shù)據(jù)線連接到相機(jī),云臺(tái)就無法握住或移動(dòng)相機(jī)太多。USB 電纜太重且太硬,無法讓微弱的電機(jī)穩(wěn)定并自由移動(dòng)相機(jī)。在嘗試了幾件事后,我得出結(jié)論,我需要更大的無刷電機(jī),并且還要打印自己更大的云臺(tái)框架,以便能夠更好地平衡和移動(dòng)相機(jī)。
此時(shí),由于剩余時(shí)間不足,我決定將這部分放在一邊,直到我收到更大的電機(jī),并更多地關(guān)注軟件/FPGA方面的事情。
構(gòu)建軟件
在應(yīng)用程序級(jí)別,我想要的視頻處理管道如下:1。在 Scene.2 中檢測(cè)運(yùn)動(dòng)。僅在具有運(yùn)動(dòng)的部分場(chǎng)景上運(yùn)行 AI 識(shí)別。3。一旦檢測(cè)到感興趣的對(duì)象(動(dòng)物、人或車輛 - 根據(jù)作業(yè)設(shè)置),使用萬向節(jié)運(yùn)動(dòng)跟蹤框架內(nèi)和 3d 空間中的對(duì)象。4。text/xml/json 文件中的日志信息(時(shí)間戳、運(yùn)動(dòng)路徑、計(jì)數(shù)等)。(可選)生成alerts.5。壓縮 (H.264/H.265) 并將短視頻剪輯保存到磁盤,或根據(jù)需要通過網(wǎng)絡(luò)將實(shí)時(shí)視頻流式傳輸?shù)酱蟊緺I(yíng)。
在使用上述所有內(nèi)容構(gòu)建完整系統(tǒng)之前,我需要先制作原型并讓各個(gè)部分正常工作。
場(chǎng)景中的運(yùn)動(dòng)檢測(cè):一旦將相機(jī)設(shè)置為朝某個(gè)方向看,使用圖像差分檢測(cè)場(chǎng)景中的運(yùn)動(dòng),然后進(jìn)行一些 IIR 濾波和斑點(diǎn)分析。我想在 AI 推理之前進(jìn)入這個(gè)階段有兩個(gè)原因:
一個(gè)。通過不在每一幀上一直運(yùn)行 DPU 來降低功耗。通過使用更大的輸入圖像來增加檢測(cè)范圍。圖像差分和斑點(diǎn)分析的內(nèi)存和處理能力要求要小得多,并且可以在全尺寸相機(jī)幀上完成。然后,人工智能只能在有運(yùn)動(dòng)的部件上運(yùn)行,并適當(dāng)縮放,以獲得最大的檢測(cè)性能。
通過用 Halcon 語言編寫腳本,我在我的 PC 上對(duì)算法進(jìn)行了原型設(shè)計(jì)和微調(diào)。代碼可以在我的 github 頁面上找到。請(qǐng)注意,我決定對(duì)前一個(gè)/參考圖像使用 IIR 濾波器,因?yàn)樗屛以谶\(yùn)動(dòng)檢測(cè)和忽略較小的連續(xù)運(yùn)動(dòng)(如樹葉因風(fēng)而移動(dòng))之間取得了更好的折衷。該算法可以輕松轉(zhuǎn)換為 OpenCV,然后可以使用Vitis Vision Library中的預(yù)構(gòu)建函數(shù)將圖像差分、腐蝕、膨脹等操作加速到 FPGA 內(nèi)核中。
對(duì)象跟蹤:對(duì)于框架內(nèi)的對(duì)象跟蹤,我使用這篇文章中的代碼作為起點(diǎn),并根據(jù)我的需要進(jìn)行了修改。由于此代碼在 opencv 中,因此可以直接在我的最終應(yīng)用程序中使用。我的跟蹤代碼的最新版本可以在我的 github 頁面上找到。
這是一個(gè)關(guān)于實(shí)際代碼的簡(jiǎn)短視頻。當(dāng)他們?cè)谖蓓斏仙⒉綍r(shí),我很高興跟蹤鳥類。
AI 檢測(cè):這讓我進(jìn)入了這個(gè)項(xiàng)目中最有趣的部分,也是需要最大學(xué)習(xí)曲線的部分。正如我之前在這篇文章的“入門”部分中提到的,到目前為止,我已經(jīng)確定最好的選擇是在IVAS 參考設(shè)計(jì)之上構(gòu)建我的應(yīng)用程序,因?yàn)樗呀?jīng)包含了 DPU 和 VPU(兩者比賽規(guī)則要求的)。
我首先按照此頁面上的構(gòu)建步驟進(jìn)行操作。在開始之前,我強(qiáng)烈建議您確保有足夠的空間。例如,如果您在像我這樣的虛擬機(jī)中運(yùn)行主機(jī) Ubuntu 操作系統(tǒng),請(qǐng)確保為虛擬機(jī)分配至少 200GB 的空間。如果您擁有像我這樣的普通 i7 機(jī)器,這將為您節(jié)省至少一天的等待時(shí)間。要增加磁盤空間分配,首先在 VM 設(shè)置中增加分配,然后啟動(dòng)操作系統(tǒng)并使用“GParted”實(shí)用程序讓操作系統(tǒng)聲明新分配的額外空間。
在我已經(jīng)安裝了 Vitis 工具的 Ubuntu 主機(jī)上,我首先在 home 下設(shè)置了新目錄并克隆了完整的存儲(chǔ)庫(kù)。在新終端中:
cd ~
mkdir IVAS_TRD
cd IVAS_TRD
git clone --recurse-submodules https://github.com/Xilinx/Vitis-In-Depth-Tutorial
cd ~/IVAS_TRD/Vitis-In-Depth-Tutorial/Runtime_and_System_Optimization/Design_Tutorials/02-ivas-ml
源 Vitis 和 petalinux 腳本
source /tools/Xilinx/Vitis/2020.1/settings64.sh
source /tools/Xilinx/PetaLinux/2020.1/settings.sh
在進(jìn)一步移動(dòng)之前,我應(yīng)用了與 rootfs 分區(qū)大小相關(guān)的推薦補(bǔ)丁
sudo cp vitis_patch/mkfsImage.sh ${XILINX_VITIS}/scripts/vitis/util
現(xiàn)在我們可以制作提供的zcu104_vcu平臺(tái)
cd platform/dev/zcu104_vcu
make
這在我運(yùn)行在 i7 機(jī)器上的普通虛擬機(jī)上花費(fèi)了很長(zhǎng)時(shí)間。我也用完了分配的空間,不得不重新開始,所以請(qǐng)確保不要重復(fù)錯(cuò)誤。但是,最后,不知何故 BIF 文件沒有被創(chuàng)建:錯(cuò)誤:無法生成 BIF 文件,文件“/home/saadtiwana/IVAS_TRD/Vitis-In-Depth-Tutorial/Runtime_and_System_Optimization/Design_Tutorials/02-ivas-ml/平臺(tái)/dev/zcu104_vcu/petalinux/project-spec/hw-description/xilinx_zcu104_vcu_202010_1.bit”不存在。Makefile:52:目標(biāo)“bootimage”的配方失敗
為了解決這個(gè)問題,我根據(jù)腳本手動(dòng)復(fù)制了文件,這解決了我的問題并使我能夠繼續(xù)前進(jìn)。
cp /home/$USER/IVAS_TRD/Vitis-In-Depth-Tutorial/Runtime_and_System_Optimization/Design_Tutorials/02-ivas-ml/platform/dev/zcu104_vcu/petalinux/components/plnx_workspace/device-tree/device-tree/xilinx_zcu104_vcu_202010_1.bit /home/$USER/IVAS_TRD/Vitis-In-Depth-Tutorial/Runtime_and_System_Optimization/Design_Tutorials/02-ivas-ml/platform/dev/zcu104_vcu/petalinux/project-spec/hw-description/
平臺(tái)搭建成功后,解壓安裝sysroot
cd ../../repo/xilinx_zcu104_vcu_202010_1/sysroot
./sdk.sh -d `pwd` -y
現(xiàn)在,我們需要構(gòu)建 Vitis 設(shè)計(jì)。首先,獲取 XRT 設(shè)置腳本:
source /opt/xilinx/xrt/setup.sh
接下來,應(yīng)用補(bǔ)?。▋H應(yīng)用一次?。?/font>
cd ~/IVAS_TRD/Vitis-In-Depth-Tutorial/Runtime_and_System_Optimization/Design_Tutorials/02-ivas-ml
cd hw_src/Vitis_Libraries
patch -p1 < ../vision_lib_area_resize_ii_fix.patch
然后構(gòu)建設(shè)計(jì)
cd ../..
cd hw_src
make
此時(shí),我意識(shí)到我需要先安裝 Vitis-AI 庫(kù),然后再繼續(xù)。為此,我需要先安裝 petalinux。對(duì)于 petalinux,我從這篇文章中獲得了指導(dǎo),并立即安裝了它。
之后,我按照此頁面上的說明安裝了 Vitis-AI 。
制作安裝目錄
mkdir ~/petalinux_sdk
之后,下載安裝腳本(sdk-2020.1.0.0.sh)并執(zhí)行
./sdk-2020.1.0.0.sh
出現(xiàn)提示時(shí),我按照頁面上的說明提供了以下安裝路徑:~/petalinux_sdk
完成后,獲取腳本
source ~/petalinux_sdk/environment-setup-aarch64-xilinx-linux
下載 Vitis-AI 壓縮文件并解壓
tar -xzvf vitis_ai_2020.1-r1.2.0.tar.gz -C ~/petalinux_sdk/sysroots/aarch64-xilinx-linux
在這個(gè)階段,Vitis-AI 庫(kù)已經(jīng)建立。盡管 IVAS 設(shè)計(jì)不需要,但我繼續(xù)執(zhí)行頁面上的其余說明以嘗試示例。
現(xiàn)在,我需要安裝 Vitis-AI docker 容器才能編譯 densebox 和 reid 模型。要安裝這些,我按照這里的簡(jiǎn)單步驟進(jìn)行操作,沒有任何問題(我使用了預(yù)構(gòu)建的 docker 映像)。我還在這里找到了 Vitis-AI v1.2 的一些很好的資源,這些資源在接下來的幾天里非常有用。
要下載 AI 模型,我從AI 模型動(dòng)物園下載了模型
為了編譯,我遵循了 Vitis-AI 指南。比如densebox模型,從model zoo下載模型,解壓到~/Vitis-AI/AI-Model-Zoo/models/(其實(shí)也可以放到別的地方)。接下來,切換到 quantized/edge 目錄
cd ~/Vitis-AI/AI-Model-Zoo/models/cf_densebox_wider_360_640_1.11G_1.2/quantized/Edge
現(xiàn)在,運(yùn)行 docker 鏡像,激活 conda 環(huán)境并編譯模型
. ~/Vitis-AI/docker_run.sh xilinx/vitis-ai:latest
conda activate vitis-ai-caffe
vai_c_caffe --prototxt ./deploy.prototxt --caffemodel ./deploy.caffemodel --arch /opt/vitis_ai/compiler/arch/DPUCZDX8G/ZCU104/arch.json --output_dir compiled_model --net_name densebox_640_360
編譯后的.elf 文件將位于“compiled_model 文件夾”下。請(qǐng)注意,我能夠成功編譯 tensorflow 模型,但對(duì) Caffe 模型沒有同樣的運(yùn)氣。我在這里和這里尋求幫助。出于IVAS 的目的,Xilinx 工程師非常友好地為我提供了模型編譯后的 elf 文件,以便我繼續(xù)前進(jìn)。
為此,我從一個(gè)全新的終端(賽靈思強(qiáng)烈推薦)開始,并獲取了環(huán)境設(shè)置腳本
cd ~/IVAS_TRD/Vitis-In-Depth-Tutorial/Runtime_and_System_Optimization/Design_Tutorials/02-ivas-ml/platform/repo/xilinx_zcu104_vcu_202010_1/sysroot
source ./environment-setup-aarch64-xilinx-linux
接下來,我在適當(dāng)?shù)牡胤阶隽艘粋€(gè)目錄
cd ~/IVAS_TRD/Vitis-In-Depth-Tutorial/Runtime_and_System_Optimization/Design_Tutorials/02-ivas-ml/
mkdir ml_models
然后將兩個(gè)elf文件復(fù)制到ml_models文件夾中。現(xiàn)在我需要做的就是運(yùn)行最終的腳本來執(zhí)行魔法并創(chuàng)建 SD 卡映像:
./go.sh
一旦完成而沒有錯(cuò)誤,我使用etcher將以下位置的圖像刻錄到sdcard:hw_src/sd_card_zcu104/sd_card.img
在此之后,我按照此處的最后幾個(gè)步驟直到頁面結(jié)束,并且最終能夠運(yùn)行示例應(yīng)用程序。
我說“最終”是因?yàn)檫@對(duì)我來說并不順利,事實(shí)上我花了整整 2 天的時(shí)間才弄清楚。最初我嘗試運(yùn)行應(yīng)用程序,但屏幕上什么也沒有顯示。我開始進(jìn)行故障排除并閱讀。讓 DisplayPort 輸出正常工作的一個(gè)非常有用的資源是DP Linux 驅(qū)動(dòng)程序頁面,其中包含有關(guān)顯示端口 DRM 驅(qū)動(dòng)程序的大量信息。
我發(fā)現(xiàn)的一件事是我的顯示器的分辨率為 2560x1440,要在屏幕上看到輸出,發(fā)送到顯示器的圖像/視頻必須是完全相同的分辨率。經(jīng)過大量閱讀和嘗試不同的事情后,我找到了將分辨率設(shè)置為 1920x1080 的解決方法,但它也啟動(dòng)了測(cè)試模式生成器(42 是來自 modetest -m xlnx 的連接器的 id)
modetest -M xlnx -s 42:1920x1080@RG16 &
接下來,為了解決測(cè)試模式的問題,我將終端層的不透明度設(shè)置為零
modetest -M xlnx -w 39:alpha:0
這樣做的副作用是終端層會(huì)消失,但這不是問題,因?yàn)闊o論如何我都是通過串行 uart 登錄到板子的,并且對(duì)視頻本身更感興趣。現(xiàn)在,我可以成功運(yùn)行 1920x1080 分辨率的輸出,我使用以下 gstreamer 管道使用視頻測(cè)試源對(duì)其進(jìn)行了測(cè)試:
gst-launch-1.0 videotestsrc ! "video/x-raw, width=1920, height=1080" ! queue ! videoscale ! "video/x-raw, width=2560, height=1440" ! queue ! kmssink driver-name=xlnx sync=false
請(qǐng)注意,autovideosink 也適用于 kmssink 驅(qū)動(dòng)程序
gst-launch-1.0 videotestsrc ! "video/x-raw, width=1920, height=1080, format=YUY2" ! queue ! autovideosink sync=false
在此之后,我設(shè)法從屏幕上顯示的 USB3 攝像頭獲取實(shí)時(shí)視頻:
gst-launch-1.0 v4l2src device=/dev/video0 ! "video/x-raw, width=1920, height=1080" ! videoconvert ! queue ! autovideosink
最后,我可以運(yùn)行 IVAS 演示應(yīng)用程序:
gst-launch-1.0 -v \
filesrc location=/home/root/videos/dahua2.mp4 ! \
qtdemux ! \
h264parse ! \
omxh264dec internal-entropy-buffers=3 ! \
tee name=t0 t0.src_0 ! \
queue ! \
ivas_xm2m kconfig="/home/root/jsons/kernel_resize_bgr.json" ! \
ivas_xfilter kernels-config="/home/root/jsons/kernel_densebox_640_360.json" ! \
scalem0.sink_master ivas_xmetaaffixer name=scalem0 scalem0.src_master ! \
fakesink \
t0.src_1 ! \
scalem0.sink_slave_0 scalem0.src_slave_0 ! \
queue ! \
ivas_xfilter kernels-config="/home/root/jsons/kernel_crop.json" ! \
ivas_xfilter kernels-config="/home/root/jsons/kernel_reid.json" ! \
ivas_xfilter kernels-config="/home/root/jsons/kernel_swbbox.json" ! \
queue ! kmssink driver-name=xlnx sync=false
獎(jiǎng)勵(lì):要使用任何管道顯示 fps,您可以將最后一個(gè)元素更改為: fpsdisplaysink sync=false text-overlay=true fullscreen-overlay=1
例如,在以下管道中,我設(shè)法讓相同的應(yīng)用程序處理實(shí)時(shí)視頻:
gst-launch-1.0 -v v4l2src device=/dev/video0 io-mode=dmabuf ! "video/x-raw, width=1920, height=1080" ! videoconvert ! video/x-raw,format=NV12 ! tee name=t0 \
t0.src_0 ! \
queue ! \
ivas_xm2m kconfig="/home/root/jsons/kernel_resize_bgr.json" ! \
ivas_xfilter kernels-config="/home/root/jsons/kernel_densebox_640_360.json" ! \
scalem0.sink_master ivas_xmetaaffixer name=scalem0 scalem0.src_master ! \
fakesink \
t0.src_1 ! \
scalem0.sink_slave_0 scalem0.src_slave_0 ! \
queue ! \
ivas_xfilter kernels-config="/home/root/jsons/kernel_crop.json" ! \
ivas_xfilter kernels-config="/home/root/jsons/kernel_reid.json" ! \
ivas_xfilter kernels-config="/home/root/jsons/kernel_swbbox.json" ! \
queue ! fpsdisplaysink video-sink="kmssink driver-name=xlnx" sync=false text-overlay=true
重要提示:對(duì)于所有管道,在使用 kmssink(xilinx DRM 驅(qū)動(dòng)程序)時(shí),確保最后一個(gè)元素的視頻與顯示器上設(shè)置的分辨率相同非常重要!
VideoCompression:此時(shí),我使用 gstreamer 在 VPU 中的視頻解碼工作正常,并且還想嘗試視頻編碼。這是我遇到障礙的地方。我已經(jīng)在Xilinx 論壇上寫過它。我需要進(jìn)一步調(diào)查。
你可以用我能想到的最簡(jiǎn)單的編解碼管道來試試
gst-launch-1.0 videotestsrc ! "video/x-raw, width=1920, height=1080" ! omxh264enc ! h264parse ! omxh264dec ! queue max-size-bytes=0 ! autovideosink
此時(shí),我想知道如何將 VPU 集成到我的 C++/python 應(yīng)用程序中,最終我想出了一個(gè)非常簡(jiǎn)單的方法:在我的應(yīng)用程序中使用 gstreamer。
例如,要使用 VCU 解碼 H.264/265 文件或 RTSP 流,請(qǐng)?jiān)?opencv 應(yīng)用程序中使用以下管道(為清楚起見已簡(jiǎn)化):
<壓縮文件/流源> ! omxh264dec !應(yīng)用程序rc
要從應(yīng)用程序中編碼(壓縮)視頻幀,請(qǐng)使用以下(簡(jiǎn)化的)gstreamer 管道將它們發(fā)送到 VCU:
應(yīng)用程序!omxh264enc !....
您可以通過查看此處的代碼以及我的項(xiàng)目 github頁面上的 C++ 文件來了解更多信息。希望能幫助到你!
把這一切放在一起
現(xiàn)在我已經(jīng)弄清楚并測(cè)試了所有的組成部分,并且距離提交截止日期還有幾天,我開始將這些部分放在一起。
我制定了一個(gè)構(gòu)建我的應(yīng)用程序的計(jì)劃,如下所示:- 在 python 中構(gòu)建主應(yīng)用程序,在 IVAS 參考設(shè)計(jì)圖像之上運(yùn)行- 使用帶有“appsink”元素的 gstreamer 管道將視頻帶入 OpenCV 域。這樣,視頻可以在來自攝像機(jī)的實(shí)時(shí)視頻<或>來自文件或 RTSP 流的壓縮視頻之間快速切換,由 VPU 解碼(使用 gstreamer 管道中的 omxh264dec 元素)。- 在 opencv-python 中預(yù)處理視頻幀- 使用與 DPU 對(duì)話的 Vitis-AI python 綁定——對(duì)數(shù)據(jù)和視頻幀進(jìn)行后處理。使用opencv生成覆蓋圖形-使用gstreamer管道使用“appsink”元素顯示帶有覆蓋圖形的幀,并使用“kmssink”元素發(fā)送到displayPort。-此外,使用gstreamer“tee” 管道中的元素使用“omxh264enc”元素將此最終圖像發(fā)送到 VPU,并作為 RTSP 流發(fā)送到 UDP 接收器。盡管在這方面我的編碼器驅(qū)動(dòng)程序出現(xiàn)了問題,如前所述,并且在這里。
由于 IVAS 示例純粹是在 gstreamer 中,DPU 處理部分也構(gòu)建為 gstreamer 管道,這對(duì)我來說不是很有用。我通過查看 C++ 示例開始在 python 中編寫我的應(yīng)用程序,這花了我很多時(shí)間,而且我在后處理 DPU 數(shù)據(jù)方面遇到了很多問題(您必須執(zhí)行幾個(gè)操作來確定邊界框的位置,例如例子)。值得慶幸的是,我在Avnet 的 Mario Bergeron 上找到了一個(gè)類似的優(yōu)秀示例。由于后處理(確定邊界框的位置)是相同的,我使用了他的代碼作為起點(diǎn)并將其修改為使用 gstreamer 輸入,使用為 zcu104 編譯的密集盒模型進(jìn)行處理,并使用 gstreamer 輸出到 displayport。很高興終于可以正常工作,如下面的視頻剪輯所示:
請(qǐng)注意,在此視頻中,我通過 gstreamer 管道使用來自攝像機(jī)的實(shí)時(shí)視頻。相機(jī)安裝了 35 毫米鏡頭,指向我的手機(jī)屏幕,播放來自 YouTube 的隨機(jī)視頻,里面有人物。運(yùn)行的代碼和說明可以在我的 github 鏈接上找到。
進(jìn)入下一步,因?yàn)槲覍?shí)際上需要一個(gè)對(duì)象檢測(cè)器而不是人臉檢測(cè)器,所以我開始修改代碼以使用 SSD 對(duì)象檢測(cè)器。嘗試運(yùn)行代碼時(shí),我的應(yīng)用程序會(huì)掛起(并超時(shí))等待 DPU。最初我懷疑我的應(yīng)用程序存在問題,因此我查看了示例以使用相同的對(duì)象檢測(cè)器找到合適的示例。我從 Xilinx 找到了一個(gè)使用相同 SSD 模型的 VART 示例,盡管它是用 C++ 編寫的。原始代碼使用原始(webm)文件進(jìn)行輸入,因此我將其修改為使用 gstreamer 輸入和輸出,如源代碼文件開頭所示:
VideoCapture cap("v4l2src device=/dev/video0 io-mode=dmabuf ! video/x-raw, width=1920, height=1080, format=UYVY ! videoconvert ! appsink", CAP_GSTREAMER);
VideoWriter writer("appsrc ! queue ! autovideosink sync=false",
0, // fourcc
30, // fps
Size(1920, 1080),
true); // isColor
我首先使用運(yùn)行良好的 gstreamer 管道測(cè)試了我的輸入和輸出,然后開始修改其余代碼以使用 gstreamer 數(shù)據(jù)而不是視頻幀中的幀。然而此時(shí),在編譯并運(yùn)行應(yīng)用程序后,我發(fā)現(xiàn)它也在等待 DPU 響應(yīng)。在論壇搜索之后,我能想到的唯一可能的問題是,我使用的 model.elf 文件可能是針對(duì)與我的 IVAS 設(shè)計(jì)的 DPU 不同的 DPU 架構(gòu)編譯的。所以我開始從模型動(dòng)物園下載模型并嘗試在我的主機(jī)上重新編譯它。這也是我之前在使用 Caffee 模型時(shí)遇到的一些問題的地方。我已經(jīng)發(fā)布了在論壇上尋求幫助并等待回復(fù)。考慮到那里可能存在版本控制問題,我嘗試運(yùn)行量化,但也遇到了一些問題,我主要?dú)w咎于我目前使用 AI 模型的有限經(jīng)驗(yàn)。我修改后的代碼可以在我的 github頁面上找到。
距離提交截止日期還有一天,我決定在這里暫停一下,并在 hackster 上完成項(xiàng)目進(jìn)度的記錄。
未來的計(jì)劃
由于我的想法與一個(gè)實(shí)際項(xiàng)目有關(guān),我希望繼續(xù)努力,希望也能在其他項(xiàng)目中重用這些知識(shí)。一些要點(diǎn):
- 通過模型編譯和測(cè)試完整系統(tǒng)來解決問題。
- 更深入地研究 AI 模型的技術(shù)細(xì)節(jié),尤其是在后處理方面
- 在動(dòng)物身上訓(xùn)練我自己的模型,甚至可能在旅行恢復(fù)后獲取我自己的一些數(shù)據(jù)。
- 在 PL 中實(shí)現(xiàn)視頻加速內(nèi)核(圖像大小調(diào)整、DPU 預(yù)處理等),以實(shí)現(xiàn)更快的端到端加速 - 在 FPGA 端進(jìn)行視頻穩(wěn)定,以增強(qiáng)云臺(tái)穩(wěn)定并獲得最流暢的視頻輸出。
最后的想法
在開始這個(gè)項(xiàng)目時(shí),考慮到 FPGA 項(xiàng)目通常的學(xué)習(xí)曲線,我已經(jīng)意識(shí)到時(shí)間會(huì)很緊。我嘗試逐步構(gòu)建,將項(xiàng)目劃分為更小的邏輯模塊,并在此過程中進(jìn)行原型設(shè)計(jì)和學(xué)習(xí)。盡管最終在達(dá)到所有目標(biāo)之前已經(jīng)沒有時(shí)間了,但我對(duì)自己取得的進(jìn)步感到滿意。時(shí)間限制也幫助我以比通常的“探索”速度更快的速度學(xué)習(xí)事物。它還幫助我在嵌入式領(lǐng)域?qū)W到了很多新東西,并幫助我確定了我未來需要投入更多時(shí)間的領(lǐng)域(例如,人工智能)。感謝 Hackster 和 Xilinx 提供這次學(xué)習(xí)機(jī)會(huì)。這確實(shí)是一次很棒的經(jīng)歷。
- 用于通知緊急情況并打開與護(hù)理人員通信線路的項(xiàng)目
- 基于單片機(jī)的交通信號(hào)燈控制系統(tǒng)設(shè)計(jì)論文 1次下載
- 使用GSM 900l制作緊急鄰居通知器
- 野火stm32單片機(jī)指南者原理圖下載 187次下載
- 入門Cortex-M4野火Kinetics開發(fā)板教程 14次下載
- 野火stm32開發(fā)板ucgui無操作系統(tǒng)移植成功案例資料下載 16次下載
- 【代碼】野火站立平衡組初級(jí)篇 1次下載
- AMBER無線緊急響應(yīng)系統(tǒng)
- 緊急停車系統(tǒng)組態(tài)探討
- ProE Wildfire 5.0 野火版中文免費(fèi)版 0次下載
- proe5.0野火版下載(中文版免費(fèi)下載) 0次下載
- Pro/E野火版3.0基礎(chǔ)教程電子教案(周四新proe3基礎(chǔ) 0次下載
- Pro/E 野火版視頻教程 0次下載
- PROE野火版4.0 下載 (Pro/ENGINEER Wildfire野火版4.0中文版) 0次下載
- 緊急停車系統(tǒng)組態(tài)探討
- 基于RA6M5的智能煙霧感應(yīng)吸除系統(tǒng)設(shè)計(jì) 958次閱讀
- Free RTOS的任務(wù)通知-3 766次閱讀
- Free RTOS的任務(wù)通知-2 746次閱讀
- Free RTOS的任務(wù)通知-1 789次閱讀
- 【shell腳本分享】性能指標(biāo)監(jiān)控與通知! 1041次閱讀
- FreeRTOS任務(wù)通知簡(jiǎn)介及實(shí)現(xiàn) 1833次閱讀
- 8位逐次逼近模數(shù)轉(zhuǎn)換器TLC0838的性能特點(diǎn)及在緊急電話系統(tǒng)中的應(yīng)用 2833次閱讀
- 緊急切斷閥的工作原理_緊急切斷閥的分類 1.1w次閱讀
- 南京物聯(lián)傳感技術(shù)緊急按鈕03型介紹 1604次閱讀
- Linux常見故障的緊急處理方法分享 3134次閱讀
- 汽車緊急呼叫參考設(shè)計(jì)電路圖 1793次閱讀
- 緊急報(bào)警燈電路圖 4193次閱讀
- 火警和緊急警戒裝置電路圖 2053次閱讀
- 帶有緊急裝置的自鎖撤銷型防盜報(bào)警電路圖 1630次閱讀
- 用公共電話網(wǎng)構(gòu)建社區(qū)緊急求助系統(tǒng) 1165次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多