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

目录

    • 前言
    • 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 scipysession = 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] = 0col_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] / 288colors = [(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:continuecv2.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.rhkb.cn/news/121464.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

博物学欣赏

自文艺复兴以降,西方开启发现世界的旅程。 这些东西对于科学、地理学、考古学、探险、旅游学、博物学、绘画学、美学无疑有着至高无上的借鉴价值。我们今天出版这些图文并茂的书籍有如斯高远的志向和目标: 展现自然的历史风貌 呈现万物的生态原样 复现…

第10章_索引优化与查询优化(覆盖索引, 索引下推等)

4. 子查询优化 MySQL 从 4.1 版本开始支持子查询,使用子查询可以进行 SELECT 语句的嵌套查询,即一个 SELECT 查询的结果作为另一个SELECT 语句的条件。 子查询可以一次性完成很多逻辑上需要多个步骤才能完成的 SQL 操作 。 子查询是 MySQL 的一项重…

app自动化测试(Android)

Capability 是一组键值对的集合(比如:"platformName": "Android")。Capability 主要用于通知 Appium 服务端建立 Session 需要的信息。客户端使用特定语言生成 Capabilities,最终会以 JSON 对象的形式发送给 …

EDM邮件营销:使用EDM代发实现更高发送率

虽然现在进入数字时代,但电子邮件依然是企业跟客户之间沟通最有效的方式之一。为了吸引并且留存目标用户,各大企业都在努力做好EDM(Electronic Direct Mail)邮件营销。但是通常用电子邮箱发送外贸邮件会有发送数量和自动化的限制&…

【python爬虫】16.爬虫知识点总结复习

文章目录 前言爬虫总复习工具解析与提取(一)解析与提取(二)更厉害的请求存储更多的爬虫更强大的爬虫——框架给爬虫加上翅膀 爬虫进阶路线指引解析与提取 存储数据分析与可视化更多的爬虫更强大的爬虫——框架项目训练 反爬虫应对…

记一次Nginx代理Mysql服务的经历

背景: 根据组长背景描述,具备以下前提 1. Mysql服务器为 某A云厂商的RDS SAAS服务,但是不开通外网服务 2. EC2 服务器一台,某A云厂商LaaS服务,也不开通外网 3.阿里云服务器一台,这台服务器有服务需要连…

设计模式之策略模式

1、场景: 某个市场人员接到单后的报价策略(CRM系统中常见问题)。报价策略很复杂,可以简单作如下分类: • 普通客户小批量报价 • 普通客户大批量报价 • 老客户小批量报价 • 老客户大批量报价 具体选用哪个报价策略,这需要根据实…

全民拼购模式:美妆行业的新机遇和挑战

美妆是一个充满创意和变化的行业,每个人都想拥有自己独特的美丽风格。但是,美妆产品的价格和品质却不尽相同,很多消费者在购买时会遇到困惑和不满。有没有一种方法,可以让消费者以更低的价格买到更好的美妆产品,同时还…

微信小程序添加用户授权《隐私保护协议》

官方文档:wx.onNeedPrivacyAuthorization(function listener) | 微信开放文档 隐私协议配置 微信小程序平台上需要进行隐私配置,审核成功后大概半小时左右才会生效。 小程序公众平台 --- 设置 --- 服务内容声明 --- 用户隐私保护指引(提交…

辛普森近似求值

辛普森近似求解 公式证明任意一个对称区间的一元二次函数定积分拆分求和:strawberry: 总结 : 如果我们把六分之一乘进去我们只不过在指定的区间采集数据六个求平均,乘以采集数据区间的微元宽度(历史上不少的手稿用h,翻译为微元高度&#xff0…

在Visual Studio 2017上配置Glut

上篇 已经介绍了如何配置OpenGL,但缺点是每次新建一个项目时,都应重新安装 “nupengl.core.redist” 与 “nupengl.core” 这两个文件,这在有网的情况下还是可以实现的,但不是一个长久之计。现在介绍另一种方法,用Glut…

高光谱图像超分辨率-总

高光谱图像超分辨率 高光谱图像超分辨率 高光谱图像超分辨率一、基础内容1.1 高光谱图像特点1.2 研究现状1.3 高光谱图像数据集1.4 评价指标1.5 Wald**协议**二、文献阅读清单2.1 综述+先锋工作1.提出解混的思想。2.随机混合模型在高光谱分辨率增强中的应用。3.遥感中的多光谱和…

23. 带旋转的数独游戏

题目 Description 数独是一个基于逻辑的组合数字放置拼图,在世界各地都很受欢迎。 在这个问题上,让我们关注 网格的拼图,其中包含 个区域。 目标是用十六进制数字填充整个网格,即 ,以便每列,每行和每个区…

java 基础面试题 静态绑定与动态绑定

一 静态绑定与动态绑定 1.1 前言概述 昨天去用友面试,被问到了如下几个问题 1.单例模式使用场景 2.责任链模式 3.分布式事务TCC 4.动态绑定和静态绑定 5.类加载器 今天就来研究一下静态绑定和动态绑定 1.2 静态绑定代码 1.父类:定义一个stati…

打包个七夕exe玩玩

前段时间七夕 当别的哥们都在酒店不要不要的时候 身为程序员的我 还在单位群收到收到 正好后来看到大佬些的这个 https://www.52pojie.cn/thread-1823963-1-1.html 这个贱 我必须要犯,可是我也不能直接给他装个python吧 多麻烦 就这几个弹窗 好low 加上bgm 再打包成…

MySQL访问和配置

目录 1.使用MySQL自带的客户端工具访问 2.使用DOS访问(命令行窗口WinR → cmd) 3.连接工具(SQLyog或其它) MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 1.使用MySQL自…

FastViT实战:使用FastViT实现图像分类任务(一)

文章目录 摘要安装包安装timm安装 grad-cam安装mmcv 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集补充一个知识点:torch.jit两种保存方式 摘要 论文翻译:https://wanghao.blog.csdn.net/article/details/132407722?spm1001.2014.3001.550…

前端实习第七周周记

前言 第六周没写,是因为第六周的前两天在处理第五周的样本库部分。问题解决一个是嵌套问题(因为我用到了递归),还有一个问题在于本机没有问题,打包上线接口404。这个问题我会在这周的总结中说。 第六周第三天才谈好新…

【核心复现】基于改进灰狼算法的并网交流微电网经济优化调度(Matlab代码实现)

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

Re44:数据集 GSM8K 和 论文 Training Verifiers to Solve Math Word Problems

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名:Training Verifiers to Solve Math Word Problems GSM8K数据集原始论文 OpenAI 2021年的工作,关注解决MWP问题(具体场景是小学(grade school&#xf…