当前位置: 首页 > news >正文

9.1.tensorRT高级(4)封装系列-自动驾驶案例项目self-driving-道路分割分析

目录

    • 前言
    • 1. 道路分割
    • 总结

前言

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

本次课程学习 tensorRT 高级-自动驾驶案例项目self-driving-道路分割分析

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

在这里插入图片描述

1. 道路分割

这节我们学习自动驾驶场景中的模型案例

1. 这个案例中存在 4 个模型,分别是:车辆检测 YoloX、车道线检测、道路分割、深度估计

2. 学习把该案例的模型跑起来,对不同任务进行了解

项目地址:https://github.com/iwatake2222/self-driving-ish_computer_vision_system

在这里插入图片描述

图1 演示效果图

我们只需要拿到项目提供的模型并导出 ONNX 就行了,至于其它的环境配置等我们就不用关注了

那在案例中提供了下载好的模型,因此我们可以直接看案例代码

我们先来看道路分割模型,我们的目的是找到道路分割的 onnx,分析其 onnx 的大致使用逻辑,然后写出最简洁版本的 predict.py,大体可以分为以下三步:

1. 打开道路分割的 onnx,查看其输入与输出

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

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

我们来观察下其 onnx 模型,如下图所示:

在这里插入图片描述

图2 onnx模型

从导出的 onnx 我们可以了解并猜测:

  • 输入是 1x3x512x896
  • 输出是 1x512x896x4,并且是概率值,0~1,仅仅是不确定 4 通道代表什么
  • 可能代表:可行驶区域、车道线、不可行驶区域、马路牙子

我们通过分析项目中的 image_processor/semantic_segmentation_engine.cpp 文件可以得出具体的预处理所做的工作:(详细分析请参照视频)

  • normalize → \rightarrow mean = 0, norm = 1.0
  • 对输入图像直接 resize 到 height=512,width=896
  • 确定输入的图像就是 BGR 图像
  • normalize = (src_image - normalize.mean) * normalize.norm

我们可以简单的写个预处理程序来验证下,代码如下:

import onnxruntime
import cv2
import numpy as npsession = onnxruntime.InferenceSession("workspace/road-segmentation-adas.onnx", provider_options=["CPUExecutionProvider"])image = cv2.imread("workspace/imgs/dashcam_00.jpg")
image = cv2.resize(image, (896, 512))
image_tensor = image.astype(np.float32)
image_tensor = image_tensor.transpose(2, 0, 1)[None]prob = session.run(["tf.identity"], {"data": image_tensor})[0]print(prob.shape)cv2.imwrite("prob0.jpg", prob[0, :, :, 1] * 255)

输出如下图:

在这里插入图片描述

图3 预处理验证

可以看到输出符合我们的预期,输出的概率图如下所示:

在这里插入图片描述

图4 道路分割概率图

总结

本次课程学习了开源项目中的道路分割案例,主要是对道路分割模型的 onnx 进行了简单分析,并通过对项目代码的分析将预处理部分理清楚,然后通过 onnxruntime 进行了简单验证。
次课程学习了开源项目中的道路分割案例,主要是对道路分割模型的 onnx 进行了简单分析,并通过对项目代码的分析将预处理部分理清楚,然后通过 onnxruntime 进行了简单验证。

http://www.lryc.cn/news/163891.html

相关文章:

  • 稳定的 Glance 来了,安卓小部件有救了!
  • 用友U8与MES系统API接口对接案例分析
  • web UI自动化介绍
  • 小米13Pro/13Ultra刷面具ROOT后激活LSPosed框架微X模块详细教程
  • 文盘Rust -- 给程序加个日志 | 京东云技术团队
  • C语言深入理解指针(非常详细)(五)
  • [docker]笔记-portainer的安装
  • 详解TCP/IP的三次握手和四次挥手
  • YOLOv5算法改进(16)— 增加小目标检测层
  • 蓝桥杯官网练习题(图像模糊)
  • 使用鳄鱼指标和ADX开立空头的条件,3秒讲清楚
  • RabbitMQ死信队列与延迟队列
  • 存储管理呀
  • 学习 BeautifulSoup 库从入门到精通
  • JavaScript基础知识总结
  • 技术面试与HR面:两者之间的关联与区别
  • 【Redis】为什么要学 Redis
  • 动静态库生成使用
  • LLVM编译安装
  • 表的内连接和外连接
  • 三、C#—变量,表达式,运算符(3)
  • 纷享销客受邀出席CDIE2023数字化创新博览会 助力大中型企业增长
  • linux下qt交叉编译 tslib 库
  • 2.13 PE结构:实现PE代码段加密
  • Rust更换Cargo国内源,镜像了寂寞
  • 【网络安全带你练爬虫-100练】第23练:文件内容的删除+写入
  • ESP32蓝牙实例-BLE服务器与客户端通信
  • 第11章_瑞萨MCU零基础入门系列教程之SysTick
  • 【面试题精讲】如何使用Stream的聚合功能
  • Linux 中的 chmod 命令及示例