電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>加州野火緊急通知系統(tǒng)

加州野火緊急通知系統(tǒng)

2022-10-20 | zip | 0.00 MB | 次下載 | 免費(fèi)

資料介紹

描述

項(xiàng)目概念

項(xiàng)目名稱“Xiraffe”是“Xilinx”和“Giraffe”的組合。這個(gè)

簡(jiǎn)單來(lái)說(shuō),該項(xiàng)目的目標(biāo)是建造一個(gè)“動(dòng)物觀測(cè)站”,使用安裝在高處(長(zhǎng)桅桿或樹(shù)頂上)的穩(wěn)定的、可平移的相機(jī),從遠(yuǎn)處觀察動(dòng)物。長(zhǎng)焦距(又名變焦)鏡頭,因此單個(gè)單元可以覆蓋廣闊的區(qū)域。野生動(dòng)物生物學(xué)家可以使用這種設(shè)備來(lái)幫助研究動(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è)備的過(guò)程。

背景

我使用 Xilinx FPGA 已有一段時(shí)間了,并且喜歡在各種項(xiàng)目中使用 Zynq-7000 SOC。我是 SOC 概念的忠實(shí)擁護(hù)者,過(guò)去曾在各種項(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,但沒(méi)有基于 petalinux。由于在這個(gè)項(xiàng)目中我需要同時(shí)使用 VCU 和 DPU,我知道我必須涉足 linux 領(lǐng)域。這是一個(gè)相當(dāng)長(zhǎng)的學(xué)習(xí)曲線,所以我將盡可能詳細(xì)地記錄我的旅程。

套件

ZCU104 套件包括 ZCU104 板、電源、16GB SD 卡、USB3 集線器和 USB3 攝像頭。一切都包裝得很好。我需要開(kāi)始的唯一其他東西是 HDMI 電纜、顯示端口電纜和顯示器。謝天謝地,我已經(jīng)有了這些。

啟程之旅...

由于在開(kāi)始了解項(xiàng)目的細(xì)節(jié)之前有很多東西需要學(xué)習(xí)(硬件和軟件方面),我開(kāi)始了熟悉這個(gè)野獸的旅程,以及可用的工具。

第 1 步:?jiǎn)?dòng)電路板并運(yùn)行出廠映像:我按照套件隨附手冊(cè)中的說(shuō)明進(jìn)行操作。這包括一些外圍測(cè)試以及通過(guò)查看 LED 來(lái)驗(yàn)證板上的各種電壓。

第 2 步:嘗試 PYNQ:我一直對(duì) PYNQ 感到非常興奮,因?yàn)橥ǔ?python 比 C/C++ 更容易嘗試想法。

設(shè)置很簡(jiǎn)單,下載 ZCU104 的圖像并按照http://www.pynq.io/上的說(shuō)明進(jìn)行操作

我登錄到板子并瀏覽了所有提供的示例,這非常有趣。坦率地說(shuō),我希望 PYNQ 能夠提供足夠的“能力”,讓我可以在項(xiàng)目中做我想做的所有事情,至少用于原型制作目的。但是,我很快意識(shí)到 PYNQ 不支持使用 DPU 或 VCU,而這兩者都是我的項(xiàng)目所需要的。我試圖在互聯(lián)網(wǎng)上進(jìn)行挖掘,并認(rèn)為我需要相當(dāng)多的技能才能在 PYNQ 中集成和使用這些功能,所以我暫時(shí)放棄了它,并且

順便說(shuō)一句,我最近在這里這里遇到了一些不錯(cuò)的帖子,這些帖子展示了如何將 DPU 與 PYNQ 一起使用。我計(jì)劃很快嘗試一下。對(duì)于在 PYNQ 中使用 VPU,我還沒(méi)有發(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。因此,我開(kāi)始遵循 Adam Taylor 在鏈接上的出色指南(包括視頻)。就我而言,由于我沒(méi)有專用的 Linux PC,因此我在 VM 中安裝了 VITIS(我使用了 VMware,但 VirtualBox 或其他應(yīng)該可以正常工作)。

a) 一個(gè)*必須*使用兼容版本的 Ubuntu。我最初嘗試使用 Ubuntu 18.04,但我遇到了意外錯(cuò)誤,因此它無(wú)法在安裝 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è)置中增加分配的磁盤(pán)空間后,我使用 Linux 實(shí)用程序“GParted”將磁盤(pán)擴(kuò)展至 150GB。后來(lái)我了解到,當(dāng)您開(kāi)始安裝和使用其他賽靈思工具(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 模擬器無(wú)法啟動(dòng)時(shí),我最終遇到了一個(gè)小問(wèn)題。仔細(xì)查看錯(cuò)誤消息,我發(fā)現(xiàn)它無(wú)法識(shí)別關(guān)鍵字“netstat”,因此我在 Ubuntu OS 中打開(kāi)了一個(gè)終端窗口并安裝了 net-tools,之后它開(kāi)始正常工作。

sudo apt-get install net-tools

請(qǐng)注意,本教程將指導(dǎo)您將 DPU 與您的自定義設(shè)計(jì)集成。此特定網(wǎng)絡(luò)研討會(huì)未涵蓋此 DPU 在 Vitis-AI 中的使用。

第 6 步:Vitis 深度教程:我按照一些 Vitis 深度教程來(lái)熟悉 Vitis 中的一些新概念(我過(guò)去主要使用 SDK),并熟悉 AI事情的一面,我對(duì)此很陌生。這些教程是一個(gè)好的開(kāi)始

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(jué)得將我的應(yīng)用程序構(gòu)建為 gstreamer 過(guò)濾器(如演示中所做的那樣)對(duì)于我目前的能力水平來(lái)說(shuō)有點(diǎn)太多了。也就是說(shuō),我決定使用這個(gè)圖像作為我的基礎(chǔ)平臺(tái),并在它之上構(gòu)建我的應(yīng)用程序。

構(gòu)建硬件

該項(xiàng)目的一個(gè)重要方面是,當(dāng)您在非城市環(huán)境中工作時(shí),您沒(méi)有安裝攝像機(jī)的剛性結(jié)構(gòu)。因此,您可以使用,例如,使用“Guy-lines”吊起的一根長(zhǎng)桿,或者可能是一根綁在該地區(qū)一棵較高樹(shù)木的樹(shù)干頂部的桿,以提供較高的有利位置,并能夠觀察更大的區(qū)域。無(wú)論哪種方式,您的相機(jī)安裝架都會(huì)有些不穩(wěn)定,因此視頻輸入不穩(wěn)定......對(duì)于圖像處理來(lái)說(shuō)不是那么好。我決定通過(guò)將相機(jī)安裝在 3 軸無(wú)刷萬(wàn)向節(jié)上來(lái)解決這個(gè)問(wèn)題,并(最終)在 FPGA 中進(jìn)行視頻穩(wěn)定以消除剩余的運(yùn)動(dòng)偽影。

無(wú)刷云臺(tái)實(shí)際上應(yīng)該有兩個(gè)好處:1。在很大程度上穩(wěn)定視頻2。允許使用相同的電機(jī)來(lái)控制相機(jī),因?yàn)槲覀冃枰谖覀兊南到y(tǒng)中進(jìn)行平移控制。

對(duì)于無(wú)刷云臺(tái)部分,我買了一個(gè)便宜的 3 軸無(wú)刷云臺(tái)框架,它配備了 3 個(gè)小電機(jī)。設(shè)計(jì)不是最好的,但我還不想在這部分項(xiàng)目上花費(fèi)太多時(shí)間。

我研究了一個(gè)很好的無(wú)刷云臺(tái)用于我的設(shè)計(jì),并遇到了 Olliw 的“STorm32 BGC 。我訂購(gòu)了一個(gè) V1.3 板開(kāi)始使用,兩周后我收到了。我先用 Gopro 試了一下,效果很好,而且很容易設(shè)置。我最初的計(jì)劃是將 ARM Coretx-M3 代碼移植到 FPGA 內(nèi)部實(shí)例化的 ARM Cortex-M3 或 ZU7-EV 內(nèi)部的 Cortex-R5。然而,令我沮喪的是,盡管這個(gè)特定云臺(tái)板的硬件是開(kāi)源的,但軟件卻不是。您可以隨意使用已編譯的二進(jìn)制文件,但代碼未打開(kāi)。我有點(diǎn)失望,但我不得不繼續(xù)前進(jìn)。幸運(yùn)的是,我發(fā)現(xiàn)這個(gè)云臺(tái)允許通過(guò) uart 接口控制位置,所以我決定改用它。

由于我需要一個(gè)長(zhǎng)焦距(又名“變焦”)鏡頭,我擰下隨附 USB3 相機(jī)上的 M12 鏡頭,并使用中間的 C-to-M12 適配器更換為 35mm C-mount 鏡頭(鏈接在項(xiàng)目物料清單)。這為我提供了一個(gè)非常狹窄的視野,以及更好的圖像質(zhì)量。

下一步是將它安裝在我的無(wú)刷云臺(tái)上。我設(shè)計(jì)并 3D 打印了一個(gè)支架,以便我可以將這款相機(jī)安裝在我的無(wú)刷云臺(tái)設(shè)置上。

我將固件上傳到板上,并嘗試校準(zhǔn)云臺(tái)。這是我的萬(wàn)向節(jié)設(shè)置遇到的主要障礙。我發(fā)現(xiàn)云臺(tái)上的電機(jī)功率不足以支撐和移動(dòng)相機(jī)+鏡頭。我可以通過(guò)在相機(jī)背面添加一些金屬片和大量熱膠(其中一些在上圖中可見(jiàn))來(lái)平衡情況,從而使情況變得更好。但是,一旦我將 USB-C 數(shù)據(jù)線連接到相機(jī),云臺(tái)就無(wú)法握住或移動(dòng)相機(jī)太多。USB 電纜太重且太硬,無(wú)法讓微弱的電機(jī)穩(wěn)定并自由移動(dòng)相機(jī)。在嘗試了幾件事后,我得出結(jié)論,我需要更大的無(wú)刷電機(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è)置),使用萬(wàn)向節(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) 并將短視頻剪輯保存到磁盤(pán),或根據(jù)需要通過(guò)網(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è)。通過(guò)不在每一幀上一直運(yùn)行 DPU 來(lái)降低功耗。通過(guò)使用更大的輸入圖像來(lái)增加檢測(cè)范圍。圖像差分和斑點(diǎn)分析的內(nèi)存和處理能力要求要小得多,并且可以在全尺寸相機(jī)幀上完成。然后,人工智能只能在有運(yùn)動(dòng)的部件上運(yùn)行,并適當(dāng)縮放,以獲得最大的檢測(cè)性能。

通過(guò)用 Halcon 語(yǔ)言編寫(xiě)腳本,我在我的 PC 上對(duì)算法進(jìn)行了原型設(shè)計(jì)和微調(diào)。代碼可以在我的 github 頁(yè)面上找到。請(qǐng)注意,我決定對(duì)前一個(gè)/參考圖像使用 IIR 濾波器,因?yàn)樗屛以谶\(yùn)動(dòng)檢測(cè)和忽略較小的連續(xù)運(yùn)動(dòng)(如樹(shù)葉因風(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 頁(yè)面上找到

這是一個(gè)關(guān)于實(shí)際代碼的簡(jiǎn)短視頻。當(dāng)他們?cè)谖蓓斏仙⒉綍r(shí),我很高興跟蹤鳥(niǎo)類。

?

AI 檢測(cè):這讓我進(jìn)入了這個(gè)項(xiàng)目中最有趣的部分,也是需要最大學(xué)習(xí)曲線的部分。正如我之前在這篇文章的“入門(mén)”部分中提到的,到目前為止,我已經(jīng)確定最好的選擇是在IVAS 參考設(shè)計(jì)之上構(gòu)建我的應(yīng)用程序,因?yàn)樗呀?jīng)包含了 DPU 和 VPU(兩者比賽規(guī)則要求的)。

我首先按照頁(yè)面上的構(gòu)建步驟進(jìn)行操作。在開(kāi)始之前,我強(qiáng)烈建議您確保有足夠的空間。例如,如果您在像我這樣的虛擬機(jī)中運(yùn)行主機(jī) Ubuntu 操作系統(tǒng),請(qǐng)確保為虛擬機(jī)分配至少 200GB 的空間。如果您擁有像我這樣的普通 i7 機(jī)器,這將為您節(jié)省至少一天的等待時(shí)間。要增加磁盤(pán)空間分配,首先在 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í)間。我也用完了分配的空間,不得不重新開(kāi)始,所以請(qǐng)確保不要重復(fù)錯(cuò)誤。但是,最后,不知何故 BIF 文件沒(méi)有被創(chuàng)建:錯(cuò)誤:無(wú)法生成 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è)問(wèn)題,我根據(jù)腳本手動(dòng)復(fù)制了文件,這解決了我的問(wèn)題并使我能夠繼續(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

接下來(lái),應(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),并立即安裝了它。

之后,我按照此頁(yè)面上的說(shuō)明安裝了 Vitis-AI 。

制作安裝目錄

mkdir ~/petalinux_sdk

之后,下載安裝腳本(sdk-2020.1.0.0.sh)并執(zhí)行

./sdk-2020.1.0.0.sh

出現(xiàn)提示時(shí),我按照頁(yè)面上的說(shuō)明提供了以下安裝路徑:~/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í)行頁(yè)面上的其余說(shuō)明以嘗試示例。

現(xiàn)在,我需要安裝 Vitis-AI docker 容器才能編譯 densebox 和 reid 模型。要安裝這些,我按照這里的簡(jiǎn)單步驟進(jìn)行操作,沒(méi)有任何問(wèn)題(我使用了預(yù)構(gòu)建的 docker 映像)。我還在這里找到了 Vitis-AI v1.2 的一些很好的資源,這些資源在接下來(lái)的幾天里非常有用。

要下載 AI 模型,我從AI 模型動(dòng)物園下載了模型

為了編譯,我遵循了 Vitis-AI 指南。比如densebox模型,從model zoo下載模型,解壓到~/Vitis-AI/AI-Model-Zoo/models/(其實(shí)也可以放到別的地方)。接下來(lái),切換到 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 模型沒(méi)有同樣的運(yùn)氣。我在這里這里尋求幫助。出于IVAS 的目的,Xilinx 工程師非常友好地為我提供了模型編譯后的 elf 文件,以便我繼續(xù)前進(jìn)。

為此,我從一個(gè)全新的終端(賽靈思強(qiáng)烈推薦)開(kāi)始,并獲取了環(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

接下來(lái),我在適當(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)行最終的腳本來(lái)執(zhí)行魔法并創(chuàng)建 SD 卡映像:

./go.sh

一旦完成而沒(méi)有錯(cuò)誤,我使用etcher將以下位置的圖像刻錄到sdcard:hw_src/sd_card_zcu104/sd_card.img

在此之后,我按照此處的最后幾個(gè)步驟直到頁(yè)面結(jié)束,并且最終能夠運(yùn)行示例應(yīng)用程序。

我說(shuō)“最終”是因?yàn)檫@對(duì)我來(lái)說(shuō)并不順利,事實(shí)上我花了整整 2 天的時(shí)間才弄清楚。最初我嘗試運(yùn)行應(yīng)用程序,但屏幕上什么也沒(méi)有顯示。我開(kāi)始進(jìn)行故障排除并閱讀。讓 DisplayPort 輸出正常工作的一個(gè)非常有用的資源是DP Linux 驅(qū)動(dòng)程序頁(yè)面,其中包含有關(guān)顯示端口 DRM 驅(qū)動(dòng)程序的大量信息。

我發(fā)現(xiàn)的一件事是我的顯示器的分辨率為 2560x1440,要在屏幕上看到輸出,發(fā)送到顯示器的圖像/視頻必須是完全相同的分辨率。經(jīng)過(guò)大量閱讀和嘗試不同的事情后,我找到了將分辨率設(shè)置為 1920x1080 的解決方法,但它也啟動(dòng)了測(cè)試模式生成器(42 是來(lái)自 modetest -m xlnx 的連接器的 id)

modetest -M xlnx -s 42:1920x1080@RG16 &

接下來(lái),為了解決測(cè)試模式的問(wèn)題,我將終端層的不透明度設(shè)置為零

modetest -M xlnx -w 39:alpha:0

這樣做的副作用是終端層會(huì)消失,但這不是問(wèn)題,因?yàn)闊o(wú)論如何我都是通過(guò)串行 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 論壇寫(xiě)過(guò)它。我需要進(jìn)一步調(diào)查。

你可以用我能想到的最簡(jiǎn)單的編解碼管道來(lái)試試

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)已簡(jiǎn)化):

<壓縮文件/流源> ! omxh264dec !應(yīng)用程序rc

要從應(yīng)用程序中編碼(壓縮)視頻幀,請(qǐng)使用以下(簡(jiǎn)化的)gstreamer 管道將它們發(fā)送到 VCU:

應(yīng)用程序!omxh264enc !....

您可以通過(guò)查看此處的代碼以及我的項(xiàng)目 github頁(yè)面上的 C++ 文件來(lái)了解更多信息希望能幫助到你!

把這一切放在一起

現(xiàn)在我已經(jīng)弄清楚并測(cè)試了所有的組成部分,并且距離提交截止日期還有幾天,我開(kāi)始將這些部分放在一起。

我制定了一個(gè)構(gòu)建我的應(yīng)用程序的計(jì)劃,如下所示:- 在 python 中構(gòu)建主應(yīng)用程序,在 IVAS 參考設(shè)計(jì)圖像之上運(yùn)行- 使用帶有“appsink”元素的 gstreamer 管道將視頻帶入 OpenCV 域。這樣,視頻可以在來(lái)自攝像機(jī)的實(shí)時(shí)視頻<或>來(lái)自文件或 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)了問(wèn)題,如前所述,并且在這里。

由于 IVAS 示例純粹是在 gstreamer 中,DPU 處理部分也構(gòu)建為 gstreamer 管道,這對(duì)我來(lái)說(shuō)不是很有用。我通過(guò)查看 C++ 示例開(kāi)始在 python 中編寫(xiě)我的應(yīng)用程序,這花了我很多時(shí)間,而且我在后處理 DPU 數(shù)據(jù)方面遇到了很多問(wèn)題(您必須執(zhí)行幾個(gè)操作來(lái)確定邊界框的位置,例如例子)。值得慶幸的是,我在Avnet 的 Mario Bergeron 上找到了一個(gè)類似的優(yōu)秀示例。由于后處理(確定邊界框的位置)是相同的,我使用了他的代碼作為起點(diǎn)并將其修改為使用 gstreamer 輸入,使用為 zcu104 編譯的密集盒模型進(jìn)行處理,并使用 gstreamer 輸出到 displayport。很高興終于可以正常工作,如下面的視頻剪輯所示:

?

請(qǐng)注意,在此視頻中,我通過(guò) gstreamer 管道使用來(lái)自攝像機(jī)的實(shí)時(shí)視頻。相機(jī)安裝了 35 毫米鏡頭,指向我的手機(jī)屏幕,播放來(lái)自 YouTube 的隨機(jī)視頻,里面有人物。運(yùn)行的代碼和說(shuō)明可以在我的 github 鏈接上找到。

進(jìn)入下一步,因?yàn)槲覍?shí)際上需要一個(gè)對(duì)象檢測(cè)器而不是人臉檢測(cè)器,所以我開(kāi)始修改代碼以使用 SSD 對(duì)象檢測(cè)器。嘗試運(yùn)行代碼時(shí),我的應(yīng)用程序會(huì)掛起(并超時(shí))等待 DPU。最初我懷疑我的應(yīng)用程序存在問(wèn)題,因此我查看了示例以使用相同的對(duì)象檢測(cè)器找到合適的示例。我從 Xilinx 找到了一個(gè)使用相同 SSD 模型的 VART 示例,盡管它是用 C++ 編寫(xiě)的。原始代碼使用原始(webm)文件進(jìn)行輸入,因此我將其修改為使用 gstreamer 輸入和輸出,如源代碼文件開(kāi)頭所示:

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è)試了我的輸入和輸出,然后開(kāi)始修改其余代碼以使用 gstreamer 數(shù)據(jù)而不是視頻幀中的幀。然而此時(shí),在編譯并運(yùn)行應(yīng)用程序后,我發(fā)現(xiàn)它也在等待 DPU 響應(yīng)。在論壇搜索之后,我能想到的唯一可能的問(wèn)題是,我使用的 model.elf 文件可能是針對(duì)與我的 IVAS 設(shè)計(jì)的 DPU 不同的 DPU 架構(gòu)編譯的。所以我開(kāi)始從模型動(dòng)物園下載模型并嘗試在我的主機(jī)上重新編譯它。這也是我之前在使用 Caffee 模型時(shí)遇到的一些問(wèn)題的地方。我已經(jīng)發(fā)布了在論壇上尋求幫助并等待回復(fù)。考慮到那里可能存在版本控制問(wèn)題,我嘗試運(yùn)行量化,但也遇到了一些問(wèn)題,我主要?dú)w咎于我目前使用 AI 模型的有限經(jīng)驗(yàn)。我修改后的代碼可以在我的 github頁(yè)面上找到

距離提交截止日期還有一天,我決定在這里暫停一下,并在 hackster 上完成項(xiàng)目進(jìn)度的記錄。

未來(lái)的計(jì)劃

由于我的想法與一個(gè)實(shí)際項(xiàng)目有關(guān),我希望繼續(xù)努力,希望也能在其他項(xiàng)目中重用這些知識(shí)。一些要點(diǎn):
- 通過(guò)模型編譯和測(cè)試完整系統(tǒng)來(lái)解決問(wèn)題。
- 更深入地研究 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)定并獲得最流暢的視頻輸出。

最后的想法

在開(kāi)始這個(gè)項(xiàng)目時(shí),考慮到 FPGA 項(xiàng)目通常的學(xué)習(xí)曲線,我已經(jīng)意識(shí)到時(shí)間會(huì)很緊。我嘗試逐步構(gòu)建,將項(xiàng)目劃分為更小的邏輯模塊,并在此過(guò)程中進(jìn)行原型設(shè)計(jì)和學(xué)習(xí)。盡管最終在達(dá)到所有目標(biāo)之前已經(jīng)沒(méi)有時(shí)間了,但我對(duì)自己取得的進(jìn)步感到滿意。時(shí)間限制也幫助我以比通常的“探索”速度更快的速度學(xué)習(xí)事物。它還幫助我在嵌入式領(lǐng)域?qū)W到了很多新東西,并幫助我確定了我未來(lái)需要投入更多時(shí)間的領(lǐng)域(例如,人工智能)。感謝 Hackster 和 Xilinx 提供這次學(xué)習(xí)機(jī)會(huì)。這確實(shí)是一次很棒的經(jīng)歷。


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊(cè)
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開(kāi)發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊(cè)
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)