国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

9.3.tensorRT高級(jí)(4)封裝系列-自動(dòng)駕駛案例項(xiàng)目self-driving-車道線檢測(cè)

這篇具有很好參考價(jià)值的文章主要介紹了9.3.tensorRT高級(jí)(4)封裝系列-自動(dòng)駕駛案例項(xiàng)目self-driving-車道線檢測(cè)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

杜老師推出的 tensorRT從零起步高性能部署 課程,之前有看過一遍,但是沒有做筆記,很多東西也忘了。這次重新擼一遍,順便記記筆記。

本次課程學(xué)習(xí) tensorRT 高級(jí)-自動(dòng)駕駛案例項(xiàng)目self-driving-車道線檢測(cè)

課程大綱可看下面的思維導(dǎo)圖

9.3.tensorRT高級(jí)(4)封裝系列-自動(dòng)駕駛案例項(xiàng)目self-driving-車道線檢測(cè),tensorRT從零起步高性能部署,模型部署,tensorRT,CUDA,高性能

1. 車道線檢測(cè)

這節(jié)我們學(xué)習(xí)車道線檢測(cè)模型的分析,我們的目的是找到車道線檢測(cè)的 onnx,分析其 onnx 的大致使用邏輯,然后寫出最簡(jiǎn)潔版本的 predict.py,大體可以分為以下三步:

1. 打開車道線檢測(cè)的 onnx,查看其輸入與輸出

2. 查看代碼,找到 onnx 的預(yù)處理,分析得到預(yù)處理的邏輯

3. 針對(duì)獲得的信息,編寫 predict.py,嘗試寫出來

值得注意的是,在這個(gè)案例中,由于后處理過于復(fù)雜,因此考慮合并到 onnx 中,使得模型盡量的簡(jiǎn)單

在開始之前,我們先對(duì)車道線檢測(cè)任務(wù)進(jìn)行一個(gè)簡(jiǎn)單的分析

對(duì)于常規(guī)的框回歸任務(wù),例如求取下圖中硬幣在圖像中的位置,cx,cy,w,h,其通常直接輸出 4 個(gè)標(biāo)量值進(jìn)行回歸

圖1 常規(guī)框回歸

目前最新的,大家更傾向于使用位置概率點(diǎn)乘其位置作為輸出值,屬于加權(quán)和,如下圖所示

9.3.tensorRT高級(jí)(4)封裝系列-自動(dòng)駕駛案例項(xiàng)目self-driving-車道線檢測(cè),tensorRT從零起步高性能部署,模型部署,tensorRT,CUDA,高性能

圖2 位置概率

這種方法將回歸的坐標(biāo)以 n 個(gè)位置概率進(jìn)行表示,例如對(duì)于 cx 的回歸,表示為 5 個(gè)概率,可以認(rèn)為對(duì)圖像劃分為 5 塊,然后 cx 更有可能落到哪一塊上進(jìn)行表述。例如落在圖像中心上時(shí),其中心概率最高。有一種 attention 的味道。像 NanoDet、Alphapose 的后處理都與位置概率類似

車道線檢測(cè)圖如下所示:

9.3.tensorRT高級(jí)(4)封裝系列-自動(dòng)駕駛案例項(xiàng)目self-driving-車道線檢測(cè),tensorRT從零起步高性能部署,模型部署,tensorRT,CUDA,高性能

對(duì)于車道線檢測(cè)任務(wù),我們是有一些先驗(yàn)知識(shí)的,比如車道線一樣是位于圖像下半部分,圖像上半部分是天空無需考慮。另外檢測(cè)的車道線通常是駕駛區(qū)域的 2 條加上兩側(cè)總共 4 條車道線;還有車道線點(diǎn)坐標(biāo)的 y 值是知道的,我們會(huì)將圖像按行劃分為 N 個(gè)網(wǎng)格,每條車道線輸出的點(diǎn)數(shù)就是 N,因此每個(gè)點(diǎn)的 y 我們是已知的;唯一不確定的是每個(gè)點(diǎn)的 x 坐標(biāo),這是需要模型學(xué)習(xí)出來的

那模型該如何回歸這些點(diǎn)的 x 坐標(biāo)呢?其實(shí)是通過位置概率來實(shí)現(xiàn)的,我們將圖像按列分成 M 個(gè)網(wǎng)格,網(wǎng)絡(luò)需要輸出的總數(shù)量是 4xNxM,另外我們還要在列方向上增加一個(gè)維度,用來判斷該點(diǎn)是否存在,因此網(wǎng)絡(luò)的最終輸出就是 4xNx(M+1)

我們來觀察下車道線的 onnx 模型,如下圖所示:

9.3.tensorRT高級(jí)(4)封裝系列-自動(dòng)駕駛案例項(xiàng)目self-driving-車道線檢測(cè),tensorRT從零起步高性能部署,模型部署,tensorRT,CUDA,高性能

圖3 onnx模型

可以看到 onnx 模型的輸入是 1x3x288x800,其中輸入圖像的高度是 288,寬度是 800,輸出是 1x201x18x4,其中 4 代表 4 條車道線,18 代表將圖像下半部分劃分為 18 行(即 N=18),201 代表將圖像下半部分劃分為 201 列(即 M=200)

我們分析總結(jié)可以得到如下信息:

1. 輸入是:1x3x288x800

2. 輸出是:1x201x18x4

3. 對(duì)于車道線檢測(cè)任務(wù)而言有一些定義或者說是先驗(yàn)

  • 只需要識(shí)別 4 條線
  • 對(duì)于車道線基本是在地面上的,因此 y 方向可以從圖像中心開始,也就是 anchor 起始坐標(biāo)是圖像中心到圖像底部
  • 對(duì)于車道線的檢測(cè),因?yàn)榫€是連續(xù)的,因此這里可以轉(zhuǎn)變?yōu)殡x散的點(diǎn)的檢測(cè),對(duì)于一根線可以設(shè)計(jì)為 18 個(gè)點(diǎn)來描述
  • 因此回歸一個(gè)點(diǎn),其 y 坐標(biāo)已知,x 坐標(biāo)需要回歸出來
  • 對(duì)于 x 的回歸,采用了位置概率來表示,劃分為 200 個(gè)網(wǎng)格表示其坐標(biāo)
  • 對(duì)于車道線的點(diǎn)是否存在這個(gè)問題,采用第 201 個(gè)概率表示,若這個(gè)點(diǎn)不存在,則 201 個(gè)點(diǎn)位置的值是最大的

我們?cè)俜治鲰?xiàng)目中的 image_processor/lane_engine.cpp 代碼可以得出具體的預(yù)處理和后處理所做的工作:(詳細(xì)分析請(qǐng)參照視頻)

預(yù)處理部分

  • 圖像的預(yù)處理直接是 image / 255.0
  • 圖像需要從 BGR 到 RGB
  • 圖像直接 resize 到 288x800

后處理部分

  • 對(duì) 0-200 維度進(jìn)行 softmax,此時(shí)得到的是位置概率
  • 對(duì)位置概率和位置索引點(diǎn)乘相加,得到 location,此時(shí) location 是 18x4
  • 對(duì)原始輸出的最大值進(jìn)行判斷,決定該點(diǎn)是否存在
  • 最后通過過濾得到 4 根線的坐標(biāo)

我們可以簡(jiǎn)單的寫個(gè) demo 來驗(yàn)證下,代碼如下:

import onnxruntime
import cv2
import numpy as np
import matplotlib.pyplot as plt
import scipy

session = onnxruntime.InferenceSession("workspace/ultra_fast_lane_detection_culane_288x800.onnx", provider_options=["CPUExecutionProvider"])

image = cv2.imread("workspace/imgs/dashcam_00.jpg")
show  = image.copy()
image = cv2.resize(image, (800, 288))
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image_tensor = (image / 255.0).astype(np.float32)
image_tensor = image_tensor.transpose(2, 0, 1)[None]

prob = session.run(["200"], {"input.1": image_tensor})[0][0]

print(prob.shape)

out_j = prob
prob = scipy.special.softmax(out_j[:-1, :, :], axis=0)
idx = np.arange(200) + 1
idx = idx.reshape(-1, 1, 1)
loc = np.sum(prob * idx, axis=0)

print(loc.shape)

# 201 x 18 x 4, 201 維度上找最大值
out_j = np.argmax(out_j, axis=0)
loc[out_j == 200] = 0

col_sample = np.linspace(0, 800 - 1, 200)
col_sample_w = col_sample[1] - col_sample[0]
ys = np.array([121, 131, 141, 150, 160, 170, 180, 189, 199, 209, 219, 228, 238, 248, 258, 267, 277, 287])

xs = loc * col_sample_w * show.shape[1] / 800
ys = ys * show.shape[0] / 288

colors = [(0, 255, 0), (255, 0, 0), (255, 0, 0), (0, 255, 0)]

for iline in range(4):
    for x, y in zip(xs[:, iline], ys):
        if x == 0:
            continue

        cv2.circle(show, (int(x), int(y)), 5, colors[iline], -1, 16)

cv2.imwrite("lane.jpg", show)

輸出如下圖:

9.3.tensorRT高級(jí)(4)封裝系列-自動(dòng)駕駛案例項(xiàng)目self-driving-車道線檢測(cè),tensorRT從零起步高性能部署,模型部署,tensorRT,CUDA,高性能

圖4 輸出

可以看到輸出符合我們的預(yù)期,輸出的車道線檢測(cè)圖如下所示:

9.3.tensorRT高級(jí)(4)封裝系列-自動(dòng)駕駛案例項(xiàng)目self-driving-車道線檢測(cè),tensorRT從零起步高性能部署,模型部署,tensorRT,CUDA,高性能

圖5 車道線檢測(cè)效果圖

那如果要使用 tensorRT 進(jìn)行推理,你會(huì)發(fā)現(xiàn)后處理太復(fù)雜了,我們需要考慮將后處理放到 onnx 中,我們可以先導(dǎo)出后處理的 onnx 模型,然后把它添加到我們的 onnx 模型中,如下圖所示:

9.3.tensorRT高級(jí)(4)封裝系列-自動(dòng)駕駛案例項(xiàng)目self-driving-車道線檢測(cè),tensorRT從零起步高性能部署,模型部署,tensorRT,CUDA,高性能

圖6 復(fù)雜后處理放onnx

總結(jié)

本次課程學(xué)習(xí)了開源項(xiàng)目中的車道線檢測(cè)案例,主要是對(duì)車道線檢測(cè)模型的 onnx 進(jìn)行了簡(jiǎn)單分析,并通過對(duì)項(xiàng)目代碼的分析將預(yù)處理和后處理部分理清楚,然后通過 onnxruntime 進(jìn)行了簡(jiǎn)單驗(yàn)證,隨后將復(fù)雜的后處理部分塞到 onnx 中方便后續(xù)在 tensorRT 上執(zhí)行推理文章來源地址http://www.zghlxwxcb.cn/news/detail-695238.html

到了這里,關(guān)于9.3.tensorRT高級(jí)(4)封裝系列-自動(dòng)駕駛案例項(xiàng)目self-driving-車道線檢測(cè)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包