資料介紹
描述
項目概念
項目名稱“Xiraffe”是“Xilinx”和“Giraffe”的組合。這個
簡單來說,該項目的目標是建造一個“動物觀測站”,使用安裝在高處(長桅桿或樹頂上)的穩定的、可平移的相機,從遠處觀察動物。長焦距(又名變焦)鏡頭,因此單個單元可以覆蓋廣闊的區域。野生動物生物學家可以使用這種設備來幫助研究動物習性、遷徙模式等。
同樣的設備也可用于動物保護區等地方的動物保護主義者,以檢測和防止非法動物偷獵。該設備可以安裝在高處,有助于在廣闊的區域內保持監視……就像長頸鹿一樣!
在這篇文章中,我將嘗試記錄我嘗試構建這種設備的過程。
背景
我使用 Xilinx FPGA 已有一段時間了,并且喜歡在各種項目中使用 Zynq-7000 SOC。我是 SOC 概念的忠實擁護者,過去曾在各種項目中為 Zynq FPGA 找到了一個好地方,尤其是在使用成像傳感器時。然而,最近,我一直想探索擁有各種奇特功能的最新 Zynq Ultrascale 設備。這個項目似乎很適合這個。
董事會花了很長時間才到達我的手中,但它終于做到了。我自己使用 Xilinx 設備的經驗主要是使用 Vivado 和 SDK,我的大部分設計都是基于裸機或 FreeRTOS,但沒有基于 petalinux。由于在這個項目中我需要同時使用 VCU 和 DPU,我知道我必須涉足 linux 領域。這是一個相當長的學習曲線,所以我將盡可能詳細地記錄我的旅程。
套件
ZCU104 套件包括 ZCU104 板、電源、16GB SD 卡、USB3 集線器和 USB3 攝像頭。一切都包裝得很好。我需要開始的唯一其他東西是 HDMI 電纜、顯示端口電纜和顯示器。謝天謝地,我已經有了這些。
啟程之旅...
由于在開始了解項目的細節之前有很多東西需要學習(硬件和軟件方面),我開始了熟悉這個野獸的旅程,以及可用的工具。
第 1 步:啟動電路板并運行出廠映像:我按照套件隨附手冊中的說明進行操作。這包括一些外圍測試以及通過查看 LED 來驗證板上的各種電壓。
第 2 步:嘗試 PYNQ:我一直對 PYNQ 感到非常興奮,因為通常 python 比 C/C++ 更容易嘗試想法。
設置很簡單,下載 ZCU104 的圖像并按照http://www.pynq.io/上的說明進行操作
我登錄到板子并瀏覽了所有提供的示例,這非常有趣。坦率地說,我希望 PYNQ 能夠提供足夠的“能力”,讓我可以在項目中做我想做的所有事情,至少用于原型制作目的。但是,我很快意識到 PYNQ 不支持使用 DPU 或 VCU,而這兩者都是我的項目所需要的。我試圖在互聯網上進行挖掘,并認為我需要相當多的技能才能在 PYNQ 中集成和使用這些功能,所以我暫時放棄了它,并且
順便說一句,我最近在這里和這里遇到了一些不錯的帖子,這些帖子展示了如何將 DPU 與 PYNQ 一起使用。我計劃很快嘗試一下。對于在 PYNQ 中使用 VPU,我還沒有發現任何有用的東西。
第 3 步:嘗試 USB3 相機 reVISION 堆棧示例:在嘗試查找附帶相機的一些信息時,我遇到了這個鏈接,并決定嘗試 ZCU104 上的 reVISION 示例。我發現密集光流示例特別令人著迷,它給了我很好的動力,讓我以后在板上嘗試類似的東西。我還學習了一些關于在板上使用 gstreamer 管道的知識,這在以后也很有用。
第 4 步:安裝 VITIS:此時我確信我需要走 VITIS 路線才能同時使用 DPU 和 VCU。因此,我開始遵循 Adam Taylor 在此鏈接上的出色指南(包括視頻)。就我而言,由于我沒有專用的 Linux PC,因此我在 VM 中安裝了 VITIS(我使用了 VMware,但 VirtualBox 或其他應該可以正常工作)。
a) 一個*必須*使用兼容版本的 Ubuntu。我最初嘗試使用 Ubuntu 18.04,但我遇到了意外錯誤,因此它無法在安裝 Vitis 時繼續前進。最后,我為 18.04.4 LTS 創建了一個新 VM,一切正常。
b) 創建 VM 時,請確保分配至少 120GB 空間,因為 Vitis 安裝不會繼續進行,除非它看到它認為需要的所有可用空間。我最初嘗試將 100GB 分配給 VM,但它不會繼續安裝。就我而言,在虛擬機設置中增加分配的磁盤空間后,我使用 Linux 實用程序“GParted”將磁盤擴展至 150GB。后來我了解到,當您開始安裝和使用其他賽靈思工具(XRT、petalinux、Vitis-AI 等)時,即使這還不夠,我不得不多次調整驅動器的大小,直到 200GB。
在這一點上,我會推薦
第 5 步:跟隨 Adam Taylor 的網絡研討會“使用 Vitis 構建加速應用程序”,可在此處獲得。
當 QEMU 模擬器無法啟動時,我最終遇到了一個小問題。仔細查看錯誤消息,我發現它無法識別關鍵字“netstat”,因此我在 Ubuntu OS 中打開了一個終端窗口并安裝了 net-tools,之后它開始正常工作。
sudo apt-get install net-tools
請注意,本教程將指導您將 DPU 與您的自定義設計集成。此特定網絡研討會未涵蓋此 DPU 在 Vitis-AI 中的使用。
第 6 步:Vitis 深度教程:我按照一些 Vitis 深度教程來熟悉 Vitis 中的一些新概念(我過去主要使用 SDK),并熟悉 AI事情的一面,我對此很陌生。這些教程是一個好的開始
https://github.com/Xilinx/Vitis-In-Depth-Tutorial
第 7 步:構建 IVAS TRD 設計:我遇到了 Xilinx 最近發布的 IVAS(智能視頻分析系統)參考設計(此處),這似乎是我項目的一個很好的起點,因為它結合了 DPU 用于 AI 推理,如以及用于視頻編碼/解碼的 VPU。
我花了幾天時間成功地重新創建設計并運行 Facedetect + reid 演示,但最終我成功了并且對結果非常滿意。該設計使用 gstreamer 運行演示,這有好有壞。很好,因為我經常使用 gstreamer,而不好,因為我覺得將我的應用程序構建為 gstreamer 過濾器(如演示中所做的那樣)對于我目前的能力水平來說有點太多了。也就是說,我決定使用這個圖像作為我的基礎平臺,并在它之上構建我的應用程序。
構建硬件
該項目的一個重要方面是,當您在非城市環境中工作時,您沒有安裝攝像機的剛性結構。因此,您可以使用,例如,使用“Guy-lines”吊起的一根長桿,或者可能是一根綁在該地區一棵較高樹木的樹干頂部的桿,以提供較高的有利位置,并能夠觀察更大的區域。無論哪種方式,您的相機安裝架都會有些不穩定,因此視頻輸入不穩定......對于圖像處理來說不是那么好。我決定通過將相機安裝在 3 軸無刷萬向節上來解決這個問題,并(最終)在 FPGA 中進行視頻穩定以消除剩余的運動偽影。
無刷云臺實際上應該有兩個好處:1。在很大程度上穩定視頻2。允許使用相同的電機來控制相機,因為我們需要在我們的系統中進行平移控制。
對于無刷云臺部分,我買了一個便宜的 3 軸無刷云臺框架,它配備了 3 個小電機。設計不是最好的,但我還不想在這部分項目上花費太多時間。
我研究了一個很好的無刷云臺用于我的設計,并遇到了 Olliw 的“STorm32 BGC ” 。我訂購了一個 V1.3 板開始使用,兩周后我收到了。我先用 Gopro 試了一下,效果很好,而且很容易設置。我最初的計劃是將 ARM Coretx-M3 代碼移植到 FPGA 內部實例化的 ARM Cortex-M3 或 ZU7-EV 內部的 Cortex-R5。然而,令我沮喪的是,盡管這個特定云臺板的硬件是開源的,但軟件卻不是。您可以隨意使用已編譯的二進制文件,但代碼未打開。我有點失望,但我不得不繼續前進。幸運的是,我發現這個云臺允許通過 uart 接口控制位置,所以我決定改用它。
由于我需要一個長焦距(又名“變焦”)鏡頭,我擰下隨附 USB3 相機上的 M12 鏡頭,并使用中間的 C-to-M12 適配器更換為 35mm C-mount 鏡頭(鏈接在項目物料清單)。這為我提供了一個非常狹窄的視野,以及更好的圖像質量。
下一步是將它安裝在我的無刷云臺上。我設計并 3D 打印了一個支架,以便我可以將這款相機安裝在我的無刷云臺設置上。
我將固件上傳到板上,并嘗試校準云臺。這是我的萬向節設置遇到的主要障礙。我發現云臺上的電機功率不足以支撐和移動相機+鏡頭。我可以通過在相機背面添加一些金屬片和大量熱膠(其中一些在上圖中可見)來平衡情況,從而使情況變得更好。但是,一旦我將 USB-C 數據線連接到相機,云臺就無法握住或移動相機太多。USB 電纜太重且太硬,無法讓微弱的電機穩定并自由移動相機。在嘗試了幾件事后,我得出結論,我需要更大的無刷電機,并且還要打印自己更大的云臺框架,以便能夠更好地平衡和移動相機。
此時,由于剩余時間不足,我決定將這部分放在一邊,直到我收到更大的電機,并更多地關注軟件/FPGA方面的事情。
構建軟件
在應用程序級別,我想要的視頻處理管道如下:1。在 Scene.2 中檢測運動。僅在具有運動的部分場景上運行 AI 識別。3。一旦檢測到感興趣的對象(動物、人或車輛 - 根據作業設置),使用萬向節運動跟蹤框架內和 3d 空間中的對象。4。text/xml/json 文件中的日志信息(時間戳、運動路徑、計數等)。(可選)生成alerts.5。壓縮 (H.264/H.265) 并將短視頻剪輯保存到磁盤,或根據需要通過網絡將實時視頻流式傳輸到大本營。
在使用上述所有內容構建完整系統之前,我需要先制作原型并讓各個部分正常工作。
場景中的運動檢測:一旦將相機設置為朝某個方向看,使用圖像差分檢測場景中的運動,然后進行一些 IIR 濾波和斑點分析。我想在 AI 推理之前進入這個階段有兩個原因:
一個。通過不在每一幀上一直運行 DPU 來降低功耗。通過使用更大的輸入圖像來增加檢測范圍。圖像差分和斑點分析的內存和處理能力要求要小得多,并且可以在全尺寸相機幀上完成。然后,人工智能只能在有運動的部件上運行,并適當縮放,以獲得最大的檢測性能。
通過用 Halcon 語言編寫腳本,我在我的 PC 上對算法進行了原型設計和微調。代碼可以在我的 github 頁面上找到。請注意,我決定對前一個/參考圖像使用 IIR 濾波器,因為它讓我在運動檢測和忽略較小的連續運動(如樹葉因風而移動)之間取得了更好的折衷。該算法可以輕松轉換為 OpenCV,然后可以使用Vitis Vision Library中的預構建函數將圖像差分、腐蝕、膨脹等操作加速到 FPGA 內核中。
對象跟蹤:對于框架內的對象跟蹤,我使用這篇文章中的代碼作為起點,并根據我的需要進行了修改。由于此代碼在 opencv 中,因此可以直接在我的最終應用程序中使用。我的跟蹤代碼的最新版本可以在我的 github 頁面上找到。
這是一個關于實際代碼的簡短視頻。當他們在屋頂上散步時,我很高興跟蹤鳥類。
AI 檢測:這讓我進入了這個項目中最有趣的部分,也是需要最大學習曲線的部分。正如我之前在這篇文章的“入門”部分中提到的,到目前為止,我已經確定最好的選擇是在IVAS 參考設計之上構建我的應用程序,因為它已經包含了 DPU 和 VPU(兩者比賽規則要求的)。
我首先按照此頁面上的構建步驟進行操作。在開始之前,我強烈建議您確保有足夠的空間。例如,如果您在像我這樣的虛擬機中運行主機 Ubuntu 操作系統,請確保為虛擬機分配至少 200GB 的空間。如果您擁有像我這樣的普通 i7 機器,這將為您節省至少一天的等待時間。要增加磁盤空間分配,首先在 VM 設置中增加分配,然后啟動操作系統并使用“GParted”實用程序讓操作系統聲明新分配的額外空間。
在我已經安裝了 Vitis 工具的 Ubuntu 主機上,我首先在 home 下設置了新目錄并克隆了完整的存儲庫。在新終端中:
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
在進一步移動之前,我應用了與 rootfs 分區大小相關的推薦補丁
sudo cp vitis_patch/mkfsImage.sh ${XILINX_VITIS}/scripts/vitis/util
現在我們可以制作提供的zcu104_vcu平臺
cd platform/dev/zcu104_vcu
make
這在我運行在 i7 機器上的普通虛擬機上花費了很長時間。我也用完了分配的空間,不得不重新開始,所以請確保不要重復錯誤。但是,最后,不知何故 BIF 文件沒有被創建:錯誤:無法生成 BIF 文件,文件“/home/saadtiwana/IVAS_TRD/Vitis-In-Depth-Tutorial/Runtime_and_System_Optimization/Design_Tutorials/02-ivas-ml/平臺/dev/zcu104_vcu/petalinux/project-spec/hw-description/xilinx_zcu104_vcu_202010_1.bit”不存在。Makefile:52:目標“bootimage”的配方失敗
為了解決這個問題,我根據腳本手動復制了文件,這解決了我的問題并使我能夠繼續前進。
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/
平臺搭建成功后,解壓安裝sysroot
cd ../../repo/xilinx_zcu104_vcu_202010_1/sysroot
./sdk.sh -d `pwd` -y
現在,我們需要構建 Vitis 設計。首先,獲取 XRT 設置腳本:
source /opt/xilinx/xrt/setup.sh
接下來,應用補丁(僅應用一次!)
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
然后構建設計
cd ../..
cd hw_src
make
此時,我意識到我需要先安裝 Vitis-AI 庫,然后再繼續。為此,我需要先安裝 petalinux。對于 petalinux,我從這篇文章中獲得了指導,并立即安裝了它。
之后,我按照此頁面上的說明安裝了 Vitis-AI 。
制作安裝目錄
mkdir ~/petalinux_sdk
之后,下載安裝腳本(sdk-2020.1.0.0.sh)并執行
./sdk-2020.1.0.0.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
在這個階段,Vitis-AI 庫已經建立。盡管 IVAS 設計不需要,但我繼續執行頁面上的其余說明以嘗試示例。
現在,我需要安裝 Vitis-AI docker 容器才能編譯 densebox 和 reid 模型。要安裝這些,我按照這里的簡單步驟進行操作,沒有任何問題(我使用了預構建的 docker 映像)。我還在這里找到了 Vitis-AI v1.2 的一些很好的資源,這些資源在接下來的幾天里非常有用。
要下載 AI 模型,我從AI 模型動物園下載了模型
為了編譯,我遵循了 Vitis-AI 指南。比如densebox模型,從model zoo下載模型,解壓到~/Vitis-AI/AI-Model-Zoo/models/(其實也可以放到別的地方)。接下來,切換到 quantized/edge 目錄
cd ~/Vitis-AI/AI-Model-Zoo/models/cf_densebox_wider_360_640_1.11G_1.2/quantized/Edge
現在,運行 docker 鏡像,激活 conda 環境并編譯模型
. ~/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 文件夾”下。請注意,我能夠成功編譯 tensorflow 模型,但對 Caffe 模型沒有同樣的運氣。我在這里和這里尋求幫助。出于IVAS 的目的,Xilinx 工程師非常友好地為我提供了模型編譯后的 elf 文件,以便我繼續前進。
為此,我從一個全新的終端(賽靈思強烈推薦)開始,并獲取了環境設置腳本
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
接下來,我在適當的地方做了一個目錄
cd ~/IVAS_TRD/Vitis-In-Depth-Tutorial/Runtime_and_System_Optimization/Design_Tutorials/02-ivas-ml/
mkdir ml_models
然后將兩個elf文件復制到ml_models文件夾中。現在我需要做的就是運行最終的腳本來執行魔法并創建 SD 卡映像:
./go.sh
一旦完成而沒有錯誤,我使用etcher將以下位置的圖像刻錄到sdcard:hw_src/sd_card_zcu104/sd_card.img
在此之后,我按照此處的最后幾個步驟直到頁面結束,并且最終能夠運行示例應用程序。
我說“最終”是因為這對我來說并不順利,事實上我花了整整 2 天的時間才弄清楚。最初我嘗試運行應用程序,但屏幕上什么也沒有顯示。我開始進行故障排除并閱讀。讓 DisplayPort 輸出正常工作的一個非常有用的資源是DP Linux 驅動程序頁面,其中包含有關顯示端口 DRM 驅動程序的大量信息。
我發現的一件事是我的顯示器的分辨率為 2560x1440,要在屏幕上看到輸出,發送到顯示器的圖像/視頻必須是完全相同的分辨率。經過大量閱讀和嘗試不同的事情后,我找到了將分辨率設置為 1920x1080 的解決方法,但它也啟動了測試模式生成器(42 是來自 modetest -m xlnx 的連接器的 id)
modetest -M xlnx -s 42:1920x1080@RG16 &
接下來,為了解決測試模式的問題,我將終端層的不透明度設置為零
modetest -M xlnx -w 39:alpha:0
這樣做的副作用是終端層會消失,但這不是問題,因為無論如何我都是通過串行 uart 登錄到板子的,并且對視頻本身更感興趣。現在,我可以成功運行 1920x1080 分辨率的輸出,我使用以下 gstreamer 管道使用視頻測試源對其進行了測試:
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
請注意,autovideosink 也適用于 kmssink 驅動程序
gst-launch-1.0 videotestsrc ! "video/x-raw, width=1920, height=1080, format=YUY2" ! queue ! autovideosink sync=false
在此之后,我設法從屏幕上顯示的 USB3 攝像頭獲取實時視頻:
gst-launch-1.0 v4l2src device=/dev/video0 ! "video/x-raw, width=1920, height=1080" ! videoconvert ! queue ! autovideosink
最后,我可以運行 IVAS 演示應用程序:
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
獎勵:要使用任何管道顯示 fps,您可以將最后一個元素更改為: fpsdisplaysink sync=false text-overlay=true fullscreen-overlay=1
例如,在以下管道中,我設法讓相同的應用程序處理實時視頻:
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
重要提示:對于所有管道,在使用 kmssink(xilinx DRM 驅動程序)時,確保最后一個元素的視頻與顯示器上設置的分辨率相同非常重要!
VideoCompression:此時,我使用 gstreamer 在 VPU 中的視頻解碼工作正常,并且還想嘗試視頻編碼。這是我遇到障礙的地方。我已經在Xilinx 論壇上寫過它。我需要進一步調查。
你可以用我能想到的最簡單的編解碼管道來試試
gst-launch-1.0 videotestsrc ! "video/x-raw, width=1920, height=1080" ! omxh264enc ! h264parse ! omxh264dec ! queue max-size-bytes=0 ! autovideosink
此時,我想知道如何將 VPU 集成到我的 C++/python 應用程序中,最終我想出了一個非常簡單的方法:在我的應用程序中使用 gstreamer。
例如,要使用 VCU 解碼 H.264/265 文件或 RTSP 流,請在 opencv 應用程序中使用以下管道(為清楚起見已簡化):
<壓縮文件/流源> ! omxh264dec !應用程序rc
要從應用程序中編碼(壓縮)視頻幀,請使用以下(簡化的)gstreamer 管道將它們發送到 VCU:
應用程序!omxh264enc !....
您可以通過查看此處的代碼以及我的項目 github頁面上的 C++ 文件來了解更多信息。希望能幫助到你!
把這一切放在一起
現在我已經弄清楚并測試了所有的組成部分,并且距離提交截止日期還有幾天,我開始將這些部分放在一起。
我制定了一個構建我的應用程序的計劃,如下所示:- 在 python 中構建主應用程序,在 IVAS 參考設計圖像之上運行- 使用帶有“appsink”元素的 gstreamer 管道將視頻帶入 OpenCV 域。這樣,視頻可以在來自攝像機的實時視頻<或>來自文件或 RTSP 流的壓縮視頻之間快速切換,由 VPU 解碼(使用 gstreamer 管道中的 omxh264dec 元素)。- 在 opencv-python 中預處理視頻幀- 使用與 DPU 對話的 Vitis-AI python 綁定——對數據和視頻幀進行后處理。使用opencv生成覆蓋圖形-使用gstreamer管道使用“appsink”元素顯示帶有覆蓋圖形的幀,并使用“kmssink”元素發送到displayPort。-此外,使用gstreamer“tee” 管道中的元素使用“omxh264enc”元素將此最終圖像發送到 VPU,并作為 RTSP 流發送到 UDP 接收器。盡管在這方面我的編碼器驅動程序出現了問題,如前所述,并且在這里。
由于 IVAS 示例純粹是在 gstreamer 中,DPU 處理部分也構建為 gstreamer 管道,這對我來說不是很有用。我通過查看 C++ 示例開始在 python 中編寫我的應用程序,這花了我很多時間,而且我在后處理 DPU 數據方面遇到了很多問題(您必須執行幾個操作來確定邊界框的位置,例如例子)。值得慶幸的是,我在Avnet 的 Mario Bergeron 上找到了一個類似的優秀示例。由于后處理(確定邊界框的位置)是相同的,我使用了他的代碼作為起點并將其修改為使用 gstreamer 輸入,使用為 zcu104 編譯的密集盒模型進行處理,并使用 gstreamer 輸出到 displayport。很高興終于可以正常工作,如下面的視頻剪輯所示:
請注意,在此視頻中,我通過 gstreamer 管道使用來自攝像機的實時視頻。相機安裝了 35 毫米鏡頭,指向我的手機屏幕,播放來自 YouTube 的隨機視頻,里面有人物。運行的代碼和說明可以在我的 github 鏈接上找到。
進入下一步,因為我實際上需要一個對象檢測器而不是人臉檢測器,所以我開始修改代碼以使用 SSD 對象檢測器。嘗試運行代碼時,我的應用程序會掛起(并超時)等待 DPU。最初我懷疑我的應用程序存在問題,因此我查看了示例以使用相同的對象檢測器找到合適的示例。我從 Xilinx 找到了一個使用相同 SSD 模型的 VART 示例,盡管它是用 C++ 編寫的。原始代碼使用原始(webm)文件進行輸入,因此我將其修改為使用 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
我首先使用運行良好的 gstreamer 管道測試了我的輸入和輸出,然后開始修改其余代碼以使用 gstreamer 數據而不是視頻幀中的幀。然而此時,在編譯并運行應用程序后,我發現它也在等待 DPU 響應。在論壇搜索之后,我能想到的唯一可能的問題是,我使用的 model.elf 文件可能是針對與我的 IVAS 設計的 DPU 不同的 DPU 架構編譯的。所以我開始從模型動物園下載模型并嘗試在我的主機上重新編譯它。這也是我之前在使用 Caffee 模型時遇到的一些問題的地方。我已經發布了在論壇上尋求幫助并等待回復。考慮到那里可能存在版本控制問題,我嘗試運行量化,但也遇到了一些問題,我主要歸咎于我目前使用 AI 模型的有限經驗。我修改后的代碼可以在我的 github頁面上找到。
距離提交截止日期還有一天,我決定在這里暫停一下,并在 hackster 上完成項目進度的記錄。
未來的計劃
由于我的想法與一個實際項目有關,我希望繼續努力,希望也能在其他項目中重用這些知識。一些要點:
- 通過模型編譯和測試完整系統來解決問題。
- 更深入地研究 AI 模型的技術細節,尤其是在后處理方面
- 在動物身上訓練我自己的模型,甚至可能在旅行恢復后獲取我自己的一些數據。
- 在 PL 中實現視頻加速內核(圖像大小調整、DPU 預處理等),以實現更快的端到端加速 - 在 FPGA 端進行視頻穩定,以增強云臺穩定并獲得最流暢的視頻輸出。
最后的想法
在開始這個項目時,考慮到 FPGA 項目通常的學習曲線,我已經意識到時間會很緊。我嘗試逐步構建,將項目劃分為更小的邏輯模塊,并在此過程中進行原型設計和學習。盡管最終在達到所有目標之前已經沒有時間了,但我對自己取得的進步感到滿意。時間限制也幫助我以比通常的“探索”速度更快的速度學習事物。它還幫助我在嵌入式領域學到了很多新東西,并幫助我確定了我未來需要投入更多時間的領域(例如,人工智能)。感謝 Hackster 和 Xilinx 提供這次學習機會。這確實是一次很棒的經歷。
- 野生動物驅蟲劑傳感器開源硬件
- WAiT:野生動物追蹤器
- 野生動物探測器開源分享
- 555定時器構成的野生動物驅避傳感器
- 不同農業氣象自動監測站方案綜述 31次下載
- 基于5G通信及遙感衛星的氣象觀測站數據監測 16次下載
- 基于2G3G4G氣象信息采集系統設計指南 17次下載
- ADI民用無人機解決方案 19次下載
- 小Low成本,低功耗的一次性收音機1部分:發射機 15次下載
- 卡爾曼濾波在被動目標跟蹤系統中的應用
- 基于GPRS的溫度遠程監測系統設計 97次下載
- GPRS節水灌溉自動化系統 64次下載
- 重慶地區的天然光和日輻射觀測站 13次下載
- 基于89C51單片機的交通流量計數抽樣儀的設計
- 單站無源定位技術綜述
- 什么是箱式岸邊水質監測站? 220次閱讀
- 如何構建APISIX基于DeepFlow的統一可觀測性能力呢? 720次閱讀
- 使用小安派-DSL-3.5寸開發的Rd-03D雷達檢測站 428次閱讀
- 使用APM無法實現真正可觀測性的原因 745次閱讀
- 基于人工智能輔助的立體觀測技術 1573次閱讀
- 全階模型磁鏈觀測器學習 4200次閱讀
- 基于Raspberry Pi Pico的云端溫濕度監測站設計 1773次閱讀
- eBPF安全可觀測性的前景展望 1425次閱讀
- 介紹eBPF針對可觀測場景的應用 1424次閱讀
- 如何利用ESP8266實現便攜式空氣質量監測站的設計 3047次閱讀
- 基于二階廣義積分器的永磁同步電機定子磁鏈觀測方法介紹 8916次閱讀
- PiTalk 套件將Raspberry Pi當作智能手機或是行動物聯網裝置 6686次閱讀
- 百度發布Visual DL 使得深度學習任務變得生動形象,實現可視分析 4775次閱讀
- Festo以大自然為靈感設計各種仿生動物機器人 并且非常逼真 8409次閱讀
- 從原理出發,交流異步/永磁同步電動機如何產生動力? 8488次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多