前言
杜老師推出的 tensorRT從零起步高性能部署 課程,之前有看過一遍,但是沒有做筆記,很多東西也忘了。這次重新擼一遍,順便記記筆記。
本次課程學(xué)習(xí) tensorRT 高級(jí)-自動(dòng)駕駛案例項(xiàng)目self-driving-車道線檢測(cè)
課程大綱可看下面的思維導(dǎo)圖
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)行回歸
目前最新的,大家更傾向于使用位置概率點(diǎn)乘其位置作為輸出值,屬于加權(quán)和,如下圖所示
這種方法將回歸的坐標(biāo)以 n 個(gè)位置概率進(jìn)行表示,例如對(duì)于 cx 的回歸,表示為 5 個(gè)概率,可以認(rèn)為對(duì)圖像劃分為 5 塊,然后 cx 更有可能落到哪一塊上進(jìn)行表述。例如落在圖像中心上時(shí),其中心概率最高。有一種 attention 的味道。像 NanoDet、Alphapose 的后處理都與位置概率類似
車道線檢測(cè)圖如下所示:
對(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 模型,如下圖所示:
可以看到 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)
輸出如下圖:
可以看到輸出符合我們的預(yù)期,輸出的車道線檢測(cè)圖如下所示:
那如果要使用 tensorRT 進(jìn)行推理,你會(huì)發(fā)現(xiàn)后處理太復(fù)雜了,我們需要考慮將后處理放到 onnx 中,我們可以先導(dǎo)出后處理的 onnx 模型,然后把它添加到我們的 onnx 模型中,如下圖所示:
文章來源:http://www.zghlxwxcb.cn/news/detail-695238.html
總結(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)!