9.3.tensorRT高级(4)封装系列-自动驾驶案例项目self-driving-车道线检测

news2024/11/26 18:41:50

目录

    • 前言
    • 1. 车道线检测
    • 总结

前言

杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。

本次课程学习 tensorRT 高级-自动驾驶案例项目self-driving-车道线检测

课程大纲可看下面的思维导图

在这里插入图片描述

1. 车道线检测

这节我们学习车道线检测模型的分析,我们的目的是找到车道线检测的 onnx,分析其 onnx 的大致使用逻辑,然后写出最简洁版本的 predict.py,大体可以分为以下三步:

1. 打开车道线检测的 onnx,查看其输入与输出

2. 查看代码,找到 onnx 的预处理,分析得到预处理的逻辑

3. 针对获得的信息,编写 predict.py,尝试写出来

值得注意的是,在这个案例中,由于后处理过于复杂,因此考虑合并到 onnx 中,使得模型尽量的简单

在开始之前,我们先对车道线检测任务进行一个简单的分析

对于常规的框回归任务,例如求取下图中硬币在图像中的位置,cx,cy,w,h,其通常直接输出 4 个标量值进行回归

在这里插入图片描述

图1 常规框回归

目前最新的,大家更倾向于使用位置概率点乘其位置作为输出值,属于加权和,如下图所示

在这里插入图片描述

图2 位置概率

这种方法将回归的坐标以 n 个位置概率进行表示,例如对于 cx 的回归,表示为 5 个概率,可以认为对图像划分为 5 块,然后 cx 更有可能落到哪一块上进行表述。例如落在图像中心上时,其中心概率最高。有一种 attention 的味道。像 NanoDet、Alphapose 的后处理都与位置概率类似

车道线检测图如下所示:

在这里插入图片描述

对于车道线检测任务,我们是有一些先验知识的,比如车道线一样是位于图像下半部分,图像上半部分是天空无需考虑。另外检测的车道线通常是驾驶区域的 2 条加上两侧总共 4 条车道线;还有车道线点坐标的 y 值是知道的,我们会将图像按行划分为 N 个网格,每条车道线输出的点数就是 N,因此每个点的 y 我们是已知的;唯一不确定的是每个点的 x 坐标,这是需要模型学习出来的

那模型该如何回归这些点的 x 坐标呢?其实是通过位置概率来实现的,我们将图像按列分成 M 个网格,网络需要输出的总数量是 4xNxM,另外我们还要在列方向上增加一个维度,用来判断该点是否存在,因此网络的最终输出就是 4xNx(M+1)

我们来观察下车道线的 onnx 模型,如下图所示:

在这里插入图片描述

图3 onnx模型

可以看到 onnx 模型的输入是 1x3x288x800,其中输入图像的高度是 288,宽度是 800,输出是 1x201x18x4,其中 4 代表 4 条车道线,18 代表将图像下半部分划分为 18 行(即 N=18),201 代表将图像下半部分划分为 201 列(即 M=200)

我们分析总结可以得到如下信息:

1. 输入是:1x3x288x800

2. 输出是:1x201x18x4

3. 对于车道线检测任务而言有一些定义或者说是先验

  • 只需要识别 4 条线
  • 对于车道线基本是在地面上的,因此 y 方向可以从图像中心开始,也就是 anchor 起始坐标是图像中心到图像底部
  • 对于车道线的检测,因为线是连续的,因此这里可以转变为离散的点的检测,对于一根线可以设计为 18 个点来描述
  • 因此回归一个点,其 y 坐标已知,x 坐标需要回归出来
  • 对于 x 的回归,采用了位置概率来表示,划分为 200 个网格表示其坐标
  • 对于车道线的点是否存在这个问题,采用第 201 个概率表示,若这个点不存在,则 201 个点位置的值是最大的

我们再分析项目中的 image_processor/lane_engine.cpp 代码可以得出具体的预处理和后处理所做的工作:(详细分析请参照视频)

预处理部分

  • 图像的预处理直接是 image / 255.0
  • 图像需要从 BGR 到 RGB
  • 图像直接 resize 到 288x800

后处理部分

  • 对 0-200 维度进行 softmax,此时得到的是位置概率
  • 对位置概率和位置索引点乘相加,得到 location,此时 location 是 18x4
  • 对原始输出的最大值进行判断,决定该点是否存在
  • 最后通过过滤得到 4 根线的坐标

我们可以简单的写个 demo 来验证下,代码如下:

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)

输出如下图:

在这里插入图片描述

图4 输出

可以看到输出符合我们的预期,输出的车道线检测图如下所示:

在这里插入图片描述

图5 车道线检测效果图

那如果要使用 tensorRT 进行推理,你会发现后处理太复杂了,我们需要考虑将后处理放到 onnx 中,我们可以先导出后处理的 onnx 模型,然后把它添加到我们的 onnx 模型中,如下图所示:

在这里插入图片描述

图6 复杂后处理放onnx

总结

本次课程学习了开源项目中的车道线检测案例,主要是对车道线检测模型的 onnx 进行了简单分析,并通过对项目代码的分析将预处理和后处理部分理清楚,然后通过 onnxruntime 进行了简单验证,随后将复杂的后处理部分塞到 onnx 中方便后续在 tensorRT 上执行推理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/969420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AJAX学习笔记2发送Post请求

AJAX学习笔记1发送Get请求_biubiubiu0706的博客-CSDN博客 继续 AJAX发送POST请求 无参数 测试 改回来 测试 AJAX POST请求 请求体中提交参数 测试 后端打断点 如何用AJAX模拟form表单post请求提交数据呢? 设置请求头必须在open之后,send之前 请求头里的设置好比…

yolov5手机版移植

感谢阅读 运行export.py然后百度一个onnx转化工具下载yolov5移动版文件和ncnn修改代码CMakeLists.txt修改修改param的参数![在这里插入图片描述](https://img-blog.csdnimg.cn/7c929414761840db8a2556843abcb2b3.jpeg)yolov5ncnn_jni.cpp修改修改stride16和stride32完工 运行ex…

【AWS实验 】在 AWS Fargate 上使用 Amazon ECS 部署应用程序

文章目录 实验概览目标实验环境任务 1:连接到实验命令主机任务 2:将应用程序容器化任务 3:构建 Web2048 容器任务 4:创建 Amazon ECR 存储库并推送 Docker 映像任务 5:创建 ECS 集群任务 6:测试应用程序总结…

12.redis 持久化

redis 持久化 redis 持久化redis持久化策略RDB > Redis DataBase 定期备份rdb 文件处理rdb 优缺点 AOF > Append Only File 实时备份AOF 工作流程AOF 缓冲区刷新策略AOF 重写机制AOF 重写流程 混合持久化持久化流程总结 redis 持久化 redis 是一个内存数据库&#xff0c…

Mybatis学习|动态sql、动态sql标签

动态SQL 什么是动态SQL: 动态SQL就是指根据不同的条件生成不同的SQL语句 动态SQL就是在拼接SQL语句,我们只要保证SQL的正确性,按照SQL的格式,去排列组合就可以了! 搭建环境 创建一个基础工程 1.导包 2.编写配置文件 3.编写实体类 4.编写实…

OS 内存换入换出

当通过逻辑地址得到虚拟地址,但是发现虚拟地址没有对应的页框号时,就要中断,然后从磁盘中找把这一页读进来,再把页表中的影射做好,再接着原来的程序。 缺页中断进行中断处理 getfreepage 得到物理空闲页 下一句从磁…

9.2.tensorRT高级(4)封装系列-自动驾驶案例项目self-driving-深度估计

目录 前言1. 深度估计总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。 本次课程学习 tensorRT 高级-自动驾驶案例项目self-driving-深度估…

【电路参考】缓启动电路

一、外部供电直接上电可能导致的问题 1、在热拔插的过程中,两个连接器的机械接触,触点在瞬间会出现弹跳,电源不稳,发生震荡。这期间系统工作可能造成不稳定。 2、由于电路中存在滤波或大电解电容,在上电瞬间&#xff…

基于ResNet18网络训练二分类模型

目录 一、背景介绍 二、数据构建 三、模型构建及训练 3.1 采用预训练的权重进行训练 3.2 固定模型的参数,训练过程中不更新 3.3 如何保存训练好的模型? 3.4 如何查看可视化训练过程? 四、模型预测 五、查看网络各层的参数 六、可视…

船舶稳定性和静水力计算——绘图体平面图,静水力,GZ计算(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Navigation2学习笔记--总揽nav2_bringup导航包launch文件

launch文件是一个包的窗口,通过这个窗口我们可以知道一个软件包能干什么,具体调动了什么节点,需要加载什么参数,下面我们从总体看里面每个launch文件的作用。 环境:utuntu20.04 ros2 foxy nav2不同版本大同小异。 …

keil 编译stm32,编译信息释义

文章目录 上图中: Code:表示代码大小,占用 279420 字节。 RO-Data:表示只读数据所占的空间大小,一般是指 const 修饰的数据大小。 RW-Data:表示有初值(且非 0)的可读写数据所占的空…

在Ubuntu上安装CUDA和cuDNN以及验证安装步骤

在Ubuntu上安装CUDA和cuDNN以及验证安装步骤 本教程详细介绍了如何在Ubuntu操作系统上安装CUDA(NVIDIA的并行计算平台)和cuDNN(深度神经网络库),以及如何验证安装是否成功。通过按照这些步骤操作,您将能够…

git企业级使用

1.初始Git 1.1创建Git仓库 要提前说的是,仓库是进⾏版本控制的⼀个⽂件⽬录。我们要想对⽂件进⾏版本控制,就必须先创建⼀个仓库出来。创建⼀个Git本地仓库对应的命令为 git init ,注意命令要在⽂件⽬录下执⾏,例如:…

Elasticsearch、Kibana以及Java操作ES 的快速使用

docker 安装elastic search 、 kibana(可视化管理elastic search) docker pull elasticsearch:7.12.1 docker pull kibana:7.12.1创建docker自定义网络 docker自定义网络可以使得容器之间使用容器名网络互连,默认的网络不会有这功能。 一定…

sqli-labs复现

sqli-labs第一关复现 环境搭建下载phpstudy下载sqli-labs浏览器加载 第一关复现 环境搭建 下载phpstudy phpstudy是一个可以快速帮助我们搭建web服务器环境的软件 官网:https://www.xp.cn/ 这里我选择的是windows 64bit 客户端版本,安装路径为C:\php…

docker 安装xxljob

1. 安装mysql镜像 2.初始化xxljob的数据库和表 一、初始化db:https://codechina.csdn.net/mirrors/xuxueli/xxl-job/-/blob/2.3.1/doc/db/tables_xxl_job.sql 对脚本进行修改,添加ROW_FORMATDYNAMIC 安装xxljob 镜像 docker pull xuxueli/xxl-job-admin:2.3.1 …

networkX-02-基础指标

文章目录 1.度1.1 度1.2 入度1.3 出度1.4 加权度1.5 邻居节点1.5.1 邻居节点计算1.5.2 出度邻居节点1.5.3 入度邻居节点 2.节点数、边数3.最短路径3.1 最短路径(不带权重)3.2 最短路径(带权重) 4.计算图中所有的最短路径 教程仓库地址:github networkx_tutorial imp…

肖sir__设计测试用例方法之等价类02_(黑盒测试)

设计测试用例方法之等价类02_(黑盒测试) 一、掌握常用的设计方法: 黑盒测试方法:等价类、边界值,状态迁移法、场景法、判定表、因果图、正交表,(7种) 经验测试方法:错误推测法、异常…

file.raw和file在formdata中上传时遇到的坑!!

首先是这样,我在写一个表单上传页面的时候,结合elementeplus遇到了需要上传图片文件和视频文件的情况,一顿上网猛搜,经过一二十篇博客浏览下来,找到了三四篇可以参考,但是对于到底是上传file还是file.raw说…