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

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

3天內(nèi)不再提示

如何在LiDAR點(diǎn)云上進(jìn)行3D對(duì)象檢測(cè)

科技觀察員 ? 來(lái)源:Xinyu Chen ? 作者:Xinyu Chen ? 2022-04-26 17:41 ? 次閱讀

該項(xiàng)目將借助KV260上的PYNQ-DPU覆蓋,從而能夠使我們?cè)贚iDAR點(diǎn)云上進(jìn)行3D對(duì)象檢測(cè)比以往任何時(shí)候都更加高效!

背景

在構(gòu)建自動(dòng)駕駛汽車、自動(dòng)導(dǎo)航機(jī)器人和其他現(xiàn)實(shí)世界的應(yīng)用程序時(shí),環(huán)境感知起著不可或缺的作用。

為什么要在點(diǎn)云上進(jìn)行3D對(duì)象檢測(cè)?

雖然基于深度學(xué)習(xí)的相機(jī)數(shù)據(jù)二維對(duì)象檢測(cè)顯示出很高的準(zhǔn)確性,但它可能不是有效的活動(dòng),如定位、測(cè)量對(duì)象之間的距離和計(jì)算深度信息

LiDAR傳感器生成的點(diǎn)云提供對(duì)象的3D信息,以更有效地定位對(duì)象并表征形狀。因此,點(diǎn)云上的3D對(duì)象檢測(cè)正在各種應(yīng)用中出現(xiàn),尤其是在自動(dòng)駕駛方面。

盡管如此,設(shè)計(jì)基于LiDAR的3D對(duì)象檢測(cè)系統(tǒng)仍具有挑戰(zhàn)性。首先,此類系統(tǒng)需要在模型推理中進(jìn)行大量計(jì)算。其次,由于點(diǎn)云數(shù)據(jù)是不規(guī)則的,處理管道需要預(yù)處理和后處理才能提供端到端的感知結(jié)果。

KV260與3D物體檢測(cè)系統(tǒng)完美匹配。模型推理的昂貴計(jì)算可以卸載到KV260的可編程邏輯部分并由其加速,而KV260強(qiáng)大的ARM內(nèi)核能夠處理預(yù)處理和后處理任務(wù)。

設(shè)計(jì)概述

我們現(xiàn)在討論選擇的用于點(diǎn)云上3D對(duì)象檢測(cè)的深度學(xué)習(xí)模型以及包括軟件和硬件的系統(tǒng)概述。

網(wǎng)絡(luò)架構(gòu)

作為對(duì)現(xiàn)有工作的完整性檢查,我們選擇了基于ResNet的關(guān)鍵點(diǎn)特征金字塔網(wǎng)絡(luò)(KFPN),這是第一個(gè)在KITTI基準(zhǔn)上具有最先進(jìn)性能的單目3D檢測(cè)實(shí)時(shí)系統(tǒng)。特別是,我們采用了它在點(diǎn)云上的開源PyTorch實(shí)現(xiàn),稱為SFA3D。

pYYBAGJnvfWAavm5AAHyyN3Lr_U640.png

KV260 上的 PYNQ-DPU

之所以我們使用Xilinx 開發(fā)板的 Ubuntu Desktop 20.04.3 LTS而不是 Petalinux 作為 KV260 上的操作系統(tǒng),是因?yàn)?Ubuntu 是一個(gè)很好的開發(fā)環(huán)境,用于安裝預(yù)處理點(diǎn)云和后處理結(jié)果所需的軟件包。另一方面,KV260 對(duì) Pynq 和 DPU 覆蓋的支持避免了從頭設(shè)計(jì)高效的 DPU,使我們能夠在 python 環(huán)境下工作。這在很大程度上簡(jiǎn)化了基于 CPU/GPU 的深度學(xué)習(xí)實(shí)現(xiàn)向 KV260 的遷移。

設(shè)置環(huán)境

按照官方指南將Ubuntu鏡像安裝到KV260,然后參考Github在Ubuntu操作系統(tǒng)中安裝Pynq 。Git 通過(guò)執(zhí)行以下命令克隆所有必需的文件并將所需的包安裝到板上。

git clone https://github.com/SoldierChen/DPU-Accelerated-3D-Object-Detection-on-Point-Clouds.git
cd DPU-Accelerated-3D-Object-Detection-on-Point-Clouds
pip install -r requirements.txt

在這里,我們需要 Pytorch 1.4,因?yàn)?Pynq DPU 的 VART 是 v1.4。

數(shù)據(jù)準(zhǔn)備

需要下載的數(shù)據(jù)包括:

Velodyne 點(diǎn)云(29 GB)

對(duì)象數(shù)據(jù)集的訓(xùn)練標(biāo)簽(5 MB)

對(duì)象數(shù)據(jù)集的相機(jī)校準(zhǔn)矩陣(16 MB)

對(duì)象數(shù)據(jù)集的左側(cè)彩色圖像(12 GB) (僅用于可視化目的)

要使用 3D 框可視化 3D 點(diǎn)云,讓我們執(zhí)行:

cd model_quant_compile/data_process/
python kitti_dataset.py

poYBAGJnve-ATVJiAANp_yMD2lk154.png

模型訓(xùn)練

python train.py --gpu_idx 0

該命令使用一個(gè) GPU 進(jìn)行訓(xùn)練,但它支持分布式訓(xùn)練。此外,您可以選擇 fpn_resnet 或 resnet 作為目標(biāo)模型。訓(xùn)練后的模型將存儲(chǔ)在名為“Model_restnet/fpn_resnet_epoch_#”的檢查點(diǎn)文件夾中。根據(jù)您的硬件,epoch 可以從 10 到 300,精度越高越好。

模型量化和編譯

同樣,由于 Pynq 的 VART 是 V1.4,我們需要 VITIS AI v1.4 而不是最新版本(V2.0)來(lái)進(jìn)行模型量化。

# install the docker at first (if not stalled)
docker pull xilinx/vitis-ai-cpu:1.4.1.978

# run the docker
./docker_run.sh xilinx/vitis-ai-cpu:1.4.1.978

pYYBAGJnveuANqppAAHNXTdxXq4184.png

然后我們使用以下命令量化模型:

# activate the pytorch environment
conda activate vitis-ai-pytorch

# install required packages
pip install -r requirements.txt

# configure the quant_mode to calib
ap.add_argument('-q', '--quant_mode', type=str, default='calib', choices=['calib','test'], help='Quantization mode (calib or test). Default is calib')
# here, it quantize the example model: Model_resnet_18_epoch_10.pth
python quantize.py

# configure the quant_mode to test
ap.add_argument('-q', '--quant_mode', type=str, default='test', choices=['calib','test'], help='Quantization mode (calib or test). Default is calib')
# here, it outputs the quantized model.
python quantize.py

接下來(lái),我們將編譯模型:

./compile.sh zcu102 build/

不要介意 zcu102 與 KV260 共享相同的 DPU 架構(gòu)。您將看到成功編譯的以下消息:

pYYBAGJnveOALEBRAAIqqYmpSWs883.png

到目前為止,我們得到了可以在 DPU 上執(zhí)行的編譯 xmodel,在 KV260 上過(guò)度執(zhí)行。接下來(lái),我們將其部署在板上并開發(fā)應(yīng)用程序代碼。

KV260部署

按照官方指南,我們先在KV260上搭建好Ubuntu操作系統(tǒng)。然后,我們按照PYNQ-DPU GitHub在板上安裝 python 。

搭建好板子后,我們需要安裝git,將代碼克隆到板子上,并將編譯好的xmodel復(fù)制到文件夾中。

應(yīng)用程序代碼設(shè)計(jì)

這里我們將介紹如何調(diào)用并與 DPU 接口進(jìn)行推理。

我們首先加載 DPU 覆蓋和自定義的 xmodel。然后,重要的是,必須知道輸入和輸出張量信息才能與數(shù)據(jù)集協(xié)調(diào)。在這里,我們只有一個(gè)張量作為輸入,五個(gè)張量作為輸出。相應(yīng)地分配輸入和輸出緩沖區(qū)。

# load model and overly
overlay = DpuOverlay("dpu.bit")
overlay.load_model("./CNN_zcu102.xmodel")
dpu = overlay.runner

# get tensor information
inputTensors = dpu.get_input_tensors()
outputTensors = dpu.get_output_tensors()
shapeIn = tuple(inputTensors[0].dims)
outputSize = int(outputTensors[0].get_data_size() / shapeIn[0])
shapeOut = tuple(outputTensors[0].dims)
shapeOut1 = tuple(outputTensors[1].dims)
shapeOut2 = tuple(outputTensors[2].dims)
shapeOut3 = tuple(outputTensors[3].dims)
shapeOut4 = tuple(outputTensors[4].dims)

# allocate input and output buffers.
# Note the output is a list of five tensors.
output_data = [np.empty(shapeOut, dtype=np.float32, order="C"),
np.empty(shapeOut1, dtype=np.float32, order="C"),
np.empty(shapeOut2, dtype=np.float32, order="C"),
np.empty(shapeOut3, dtype=np.float32, order="C"),
np.empty(shapeOut4, dtype=np.float32, order="C")]
# the input is only one tensor.
input_data = [np.empty(shapeIn, dtype=np.float32, order="C")]

image = input_data[0]

一次性推理的過(guò)程封裝在下面的函數(shù)中。在這里,我們將輸入張量置換為 DPU 輸入張量的形狀,并將張量置換為后處理所需的形狀。這對(duì)于正確的結(jié)果至關(guān)重要。

def do_detect(dpu, shapeIn, image, input_data, output_data, configs, bevmap, is_front):

if not is_front:
bevmap = torch.flip(bevmap, [1, 2])
input_bev_maps = bevmap.unsqueeze(0).to("cpu", non_blocking=True).float()

# do permutation
input_bev_maps = input_bev_maps.permute(0, 2, 3, 1)
image[0,...] = input_bev_maps[0,...] #.reshape(shapeIn[1:])

job_id = dpu.execute_async(input_data, output_data)
dpu.wait(job_id)

# convert the output arrays to tensors for the following post-processing.
outputs0 = torch.tensor(output_data[0])
outputs1 = torch.tensor(output_data[1])
outputs2 = torch.tensor(output_data[2])
outputs3 = torch.tensor(output_data[3])
outputs4 = torch.tensor(output_data[4])

# do permutation
outputs0 = outputs0.permute(0, 3, 1, 2)
outputs1 = outputs1.permute(0, 3, 1, 2)
outputs2 = outputs2.permute(0, 3, 1, 2)
outputs3 = outputs3.permute(0, 3, 1, 2)
outputs4 = outputs4.permute(0, 3, 1, 2)
outputs0 = _sigmoid(outputs0)
outputs1 = _sigmoid(outputs1)

# post-processing
detections = decode(
outputs0,
outputs1,
outputs2,
outputs3,
outputs4, K=configs.K)
detections = detections.cpu().numpy().astype(np.float32)
detections = post_processing(detections, configs.num_classes, configs.down_ratio, configs.peak_thresh)

return detections[0], bevmap

在 KV260 上執(zhí)行

通過(guò)運(yùn)行以下命令,將在 DPU 上執(zhí)行演示數(shù)據(jù)的推理:

python demo_2_sides-dpu.py

poYBAGJnvdyAL9B1AAXY097iyE0689.png

然后運(yùn)行以下命令:

pythondemo_front-dpu.py

pYYBAGJnvdiAIvgzAAQ2PWJcjnQ482.png

性能范圍從10到20FPS,比在服務(wù)器級(jí)CPU(IntelXeonGold6226R)上的執(zhí)行速度快100到200倍。

結(jié)論

總之,我們展示了在KV260上使用AMD-XilinxDPU來(lái)加速基于點(diǎn)云的3D對(duì)象檢測(cè)是多么容易。為了進(jìn)一步提升性能,我們計(jì)劃通過(guò)使用多個(gè)DPU實(shí)例來(lái)優(yōu)化模型推理階段,以及通過(guò)使用多線程和批處理來(lái)優(yōu)化預(yù)處理和后處理階段。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 3D
    3D
    +關(guān)注

    關(guān)注

    9

    文章

    2843

    瀏覽量

    107178
  • LIDAR
    +關(guān)注

    關(guān)注

    10

    文章

    317

    瀏覽量

    29305
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    LiDAR如何構(gòu)建3D點(diǎn)?如何利用LiDAR提供深度信息

    3D模型。LiDAR 系統(tǒng)捕獲的圖像中的每個(gè)像素都將具有與之關(guān)聯(lián)的深度。這樣可以更好地識(shí)別物體,并消除僅采用圖像傳感器獲得的2D圖像中可能存在的模糊。 LiDAR如何構(gòu)建
    的頭像 發(fā)表于 04-06 12:00 ?4275次閱讀
    <b class='flag-5'>LiDAR</b>如何構(gòu)建<b class='flag-5'>3D</b><b class='flag-5'>點(diǎn)</b><b class='flag-5'>云</b>?如何利用<b class='flag-5'>LiDAR</b>提供深度信息

    基于3D點(diǎn)的多任務(wù)模型在板端實(shí)現(xiàn)高效部署

    對(duì)于自動(dòng)駕駛應(yīng)用來(lái)說(shuō),3D 場(chǎng)景感知至關(guān)重要。3D點(diǎn)數(shù)據(jù)就是具有3D特征的數(shù)據(jù)。一方面,3D
    的頭像 發(fā)表于 12-28 16:35 ?1269次閱讀
    基于<b class='flag-5'>3D</b><b class='flag-5'>點(diǎn)</b><b class='flag-5'>云</b>的多任務(wù)模型在板端實(shí)現(xiàn)高效部署

    基于深度學(xué)習(xí)的方法在處理3D點(diǎn)進(jìn)行缺陷分類應(yīng)用

    背景部分介紹了3D點(diǎn)應(yīng)用領(lǐng)域中公開可訪問的數(shù)據(jù)集的重要性,這些數(shù)據(jù)集對(duì)于分析和比較各種模型至關(guān)重要。研究人員專門設(shè)計(jì)了各種數(shù)據(jù)集,包括用于3D形狀分類、
    的頭像 發(fā)表于 02-22 16:16 ?884次閱讀
    基于深度學(xué)習(xí)的方法在處理<b class='flag-5'>3D</b><b class='flag-5'>點(diǎn)</b><b class='flag-5'>云</b><b class='flag-5'>進(jìn)行</b>缺陷分類應(yīng)用

    制作3D 對(duì)象,然后顯示。 導(dǎo)入3D對(duì)象 ,然后顯示。

    PS:Labview 版本是2014 最近開始測(cè)試 Labview的3D相關(guān)的功能。 制作3D 對(duì)象,然后顯示。 導(dǎo)入3D對(duì)象 ,然后顯示。
    發(fā)表于 12-23 22:00

    如何同時(shí)獲取2d圖像序列和相應(yīng)的3d點(diǎn)

    如何同時(shí)獲取2d圖像序列和相應(yīng)的3d點(diǎn)?以上來(lái)自于谷歌翻譯以下為原文How to obtain the sequence of 2d im
    發(fā)表于 11-13 11:25

    3D點(diǎn)技術(shù)介紹及其與VR體驗(yàn)的關(guān)系

    ;x>nkedIn上發(fā)表了一篇跟澳大利亞科技公司優(yōu)立(Euclideon)所使用的點(diǎn)數(shù)據(jù)有關(guān)的文章,并在業(yè)內(nèi)引起了一番討論。 1. 點(diǎn)的問題 點(diǎn)
    發(fā)表于 09-15 09:28 ?20次下載

    點(diǎn)問題的介紹及3D點(diǎn)技術(shù)在VR中的應(yīng)用

    1. 點(diǎn)的問題 點(diǎn)是由3D掃描硬件收集的數(shù)據(jù),如FARO的Focus 3D激光掃描儀和Shi
    發(fā)表于 09-27 15:27 ?17次下載

    何在PADS 3D Layout中進(jìn)行命令操作

    了解如何在 PADS 3D Layout 中對(duì)您的 PCB 使用“Measure Distance”和“Measure Minimum Distance”命令。
    的頭像 發(fā)表于 05-15 06:05 ?5077次閱讀
    如<b class='flag-5'>何在</b>PADS <b class='flag-5'>3D</b> Layout中<b class='flag-5'>進(jìn)行</b>命令操作

    基于圖卷積的層級(jí)圖網(wǎng)絡(luò)用于基于點(diǎn)3D目標(biāo)檢測(cè)

    論文:A Hierarchical Graph Network for 3D Object Detection on Point Clouds 由于大多數(shù)現(xiàn)有的點(diǎn)對(duì)象
    的頭像 發(fā)表于 06-21 12:15 ?6141次閱讀
    基于圖卷積的層級(jí)圖網(wǎng)絡(luò)用于基于<b class='flag-5'>點(diǎn)</b><b class='flag-5'>云</b>的<b class='flag-5'>3D</b>目標(biāo)<b class='flag-5'>檢測(cè)</b>

    基于層級(jí)圖網(wǎng)絡(luò)的圖卷積,用點(diǎn)完成3D目標(biāo)檢測(cè)

    由于大多數(shù)現(xiàn)有的點(diǎn)對(duì)象檢測(cè)方法不能充分適應(yīng)點(diǎn)的特征(例如稀疏性),所以一些關(guān)鍵的語(yǔ)義信息(如物體形狀)不能被很好的捕捉到。本文提出了一種
    的頭像 發(fā)表于 12-24 15:25 ?597次閱讀

    何為3D點(diǎn)語(yǔ)義分割

    融合標(biāo)注使用的3D標(biāo)注工具仍以3D立體框?yàn)橹?,但?b class='flag-5'>3D點(diǎn)數(shù)據(jù)以外,還需要使用2D標(biāo)注工具在
    的頭像 發(fā)表于 07-21 15:52 ?8426次閱讀

    3D點(diǎn)數(shù)據(jù)集在3D數(shù)字化技術(shù)中的應(yīng)用

    隨著計(jì)算機(jī)視覺技術(shù)的不斷發(fā)展,3D 數(shù)字化技術(shù)已經(jīng)成為了當(dāng)今工業(yè)制造領(lǐng)域和三維醫(yī)學(xué)影像領(lǐng)域的關(guān)鍵技術(shù)。然而,構(gòu)建高精度、高分辨率的 3D 點(diǎn)數(shù)據(jù)集對(duì)于實(shí)現(xiàn)這一技術(shù)至關(guān)重要。在這篇文章
    的頭像 發(fā)表于 05-06 16:46 ?1293次閱讀

    基于點(diǎn)3D障礙物檢測(cè)介紹

    基于點(diǎn)3D障礙物檢測(cè) 主要有以下步驟: 點(diǎn)數(shù)據(jù)的處理 基于
    的頭像 發(fā)表于 06-26 10:22 ?876次閱讀
    基于<b class='flag-5'>點(diǎn)</b><b class='flag-5'>云</b>的<b class='flag-5'>3D</b>障礙物<b class='flag-5'>檢測(cè)</b>介紹

    基于深度學(xué)習(xí)的3D點(diǎn)實(shí)例分割方法

    3D實(shí)例分割(3DIS)是3D領(lǐng)域深度學(xué)習(xí)的核心問題。給定由點(diǎn)云表示的 3D 場(chǎng)景,我們尋求為每個(gè)點(diǎn)
    發(fā)表于 11-13 10:34 ?1917次閱讀
    基于深度學(xué)習(xí)的<b class='flag-5'>3D</b><b class='flag-5'>點(diǎn)</b><b class='flag-5'>云</b>實(shí)例分割方法

    兩種應(yīng)用于3D對(duì)象檢測(cè)點(diǎn)深度學(xué)習(xí)方法

    隨著激光雷達(dá)傳感器(“光檢測(cè)和測(cè)距”的縮寫,有時(shí)稱為“激光掃描”,現(xiàn)在在一些最新的 iPhone 上可用)或 RGB-D 攝像頭(一種 RGB-D 攝像頭)的興起,3D 數(shù)據(jù)變得越來(lái)越
    的頭像 發(fā)表于 01-03 10:32 ?789次閱讀
    兩種應(yīng)用于<b class='flag-5'>3D</b><b class='flag-5'>對(duì)象</b><b class='flag-5'>檢測(cè)</b>的<b class='flag-5'>點(diǎn)</b><b class='flag-5'>云</b>深度學(xué)習(xí)方法