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

C# Onnx LSTR 基于Transformer的端到端实时车道线检测

目录

效果

模型信息

项目

代码

下载


效果

端到端实时车道线检测

模型信息

lstr_360x640.onnx

Inputs
-------------------------
name:input_rgb
tensor:Float[1, 3, 360, 640]
name:input_mask
tensor:Float[1, 1, 360, 640]
---------------------------------------------------------------

Outputs
-------------------------
name:pred_logits
tensor:Float[1, 7, 2]
name:pred_curves
tensor:Float[1, 7, 8]
name:foo_out_1
tensor:Float[1, 7, 2]
name:foo_out_2
tensor:Float[1, 7, 8]
name:weights
tensor:Float[1, 240, 240]
---------------------------------------------------------------

项目

VS2022+.net framework 4.8

OpenCvSharp 4.8

Microsoft.ML.OnnxRuntime 1.16.2

代码

创建输入tensor使用指针

float[] input_tensor_data = new float[1 * 3 * inpHeight * inpWidth];
for (int c = 0; c < 3; c++)
{
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            float pix = ((byte*)(resize_image.Ptr(i).ToPointer()))[j * 3 + c];
            input_tensor_data[c * row * col + i * col + j] = (float)((pix / 255.0 - mean[c]) / std[c]);
        }
    }
}
input_tensor = new DenseTensor<float>(input_tensor_data, new[] { 1, 3, inpHeight, inpWidth });

using Microsoft.ML.OnnxRuntime.Tensors;
using Microsoft.ML.OnnxRuntime;
using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Linq;
using System.IO;
using System.Text;
using System.Drawing;namespace Onnx_Demo
{public partial class frmMain : Form{public frmMain(){InitializeComponent();}string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";string image_path = "";DateTime dt1 = DateTime.Now;DateTime dt2 = DateTime.Now;int inpWidth;int inpHeight;Mat image;string model_path = "";float[] factors = new float[2];SessionOptions options;InferenceSession onnx_session;Tensor<float> input_tensor;Tensor<float> mask_tensor;List<NamedOnnxValue> input_ontainer;IDisposableReadOnlyCollection<DisposableNamedOnnxValue> result_infer;DisposableNamedOnnxValue[] results_onnxvalue;Tensor<float> result_tensors;int len_log_space = 50;float[] log_space;float[] mean = new float[] { 0.485f, 0.456f, 0.406f };float[] std = new float[] { 0.229f, 0.224f, 0.225f };Scalar[] lane_colors = new Scalar[] { new Scalar(68, 65, 249), new Scalar(44, 114, 243), new Scalar(30, 150, 248), new Scalar(74, 132, 249), new Scalar(79, 199, 249), new Scalar(109, 190, 144), new Scalar(142, 144, 77), new Scalar(161, 125, 39) };private void button1_Click(object sender, EventArgs e){OpenFileDialog ofd = new OpenFileDialog();ofd.Filter = fileFilter;if (ofd.ShowDialog() != DialogResult.OK) return;pictureBox1.Image = null;pictureBox2.Image = null;textBox1.Text = "";image_path = ofd.FileName;pictureBox1.Image = new System.Drawing.Bitmap(image_path);image = new Mat(image_path);}private void Form1_Load(object sender, EventArgs e){// 创建输入容器input_ontainer = new List<NamedOnnxValue>();// 创建输出会话options = new SessionOptions();options.LogSeverityLevel = OrtLoggingLevel.ORT_LOGGING_LEVEL_INFO;options.AppendExecutionProvider_CPU(0);// 设置为CPU上运行// 创建推理模型类,读取本地模型文件model_path = "model/lstr_360x640.onnx";inpWidth = 640;inpHeight = 360;onnx_session = new InferenceSession(model_path, options);// 创建输入容器input_ontainer = new List<NamedOnnxValue>();FileStream fileStream = new FileStream("model/log_space.bin", FileMode.Open);BinaryReader br = new BinaryReader(fileStream, Encoding.UTF8);log_space = new float[len_log_space];byte[] byteTemp;float fTemp;for (int i = 0; i < len_log_space; i++){byteTemp = br.ReadBytes(4);fTemp = BitConverter.ToSingle(byteTemp, 0);log_space[i] = fTemp;}br.Close();image_path = "test_img/0.jpg";pictureBox1.Image = new Bitmap(image_path);}private unsafe void button2_Click(object sender, EventArgs e){if (image_path == ""){return;}textBox1.Text = "检测中,请稍等……";pictureBox2.Image = null;System.Windows.Forms.Application.DoEvents();//图片缩放image = new Mat(image_path);int img_height = image.Rows;int img_width = image.Cols;Mat resize_image = new Mat();Cv2.Resize(image, resize_image, new OpenCvSharp.Size(inpWidth, inpHeight));int row = resize_image.Rows;int col = resize_image.Cols;float[] input_tensor_data = new float[1 * 3 * inpHeight * inpWidth];for (int c = 0; c < 3; c++){for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){float pix = ((byte*)(resize_image.Ptr(i).ToPointer()))[j * 3 + c];input_tensor_data[c * row * col + i * col + j] = (float)((pix / 255.0 - mean[c]) / std[c]);}}}input_tensor = new DenseTensor<float>(input_tensor_data, new[] { 1, 3, inpHeight, inpWidth });float[] input_mask_data = new float[1 * 1 * inpHeight * inpWidth];for (int i = 0; i < input_mask_data.Length; i++){input_mask_data[i] = 0.0f;}mask_tensor = new DenseTensor<float>(input_mask_data, new[] { 1, 1, inpHeight, inpWidth });//将 input_tensor 放入一个输入参数的容器,并指定名称input_ontainer.Add(NamedOnnxValue.CreateFromTensor("input_rgb", input_tensor));input_ontainer.Add(NamedOnnxValue.CreateFromTensor("input_mask", mask_tensor));dt1 = DateTime.Now;//运行 Inference 并获取结果result_infer = onnx_session.Run(input_ontainer);dt2 = DateTime.Now;//将输出结果转为DisposableNamedOnnxValue数组results_onnxvalue = result_infer.ToArray();float[] pred_logits = results_onnxvalue[0].AsTensor<float>().ToArray();float[] pred_curves = results_onnxvalue[1].AsTensor<float>().ToArray();int logits_h = results_onnxvalue[0].AsTensor<float>().Dimensions[1];int logits_w = results_onnxvalue[0].AsTensor<float>().Dimensions[2];int curves_w = results_onnxvalue[1].AsTensor<float>().Dimensions[2];List<int> good_detections = new List<int>();List<List<OpenCvSharp.Point>> lanes = new List<List<OpenCvSharp.Point>>();for (int i = 0; i < logits_h; i++){float max_logits = -10000;int max_id = -1;for (int j = 0; j < logits_w; j++){float data = pred_logits[i * logits_w + j];if (data > max_logits){max_logits = data;max_id = j;}}if (max_id == 1){good_detections.Add(i);int index = i * curves_w;List<OpenCvSharp.Point> lane_points = new List<OpenCvSharp.Point>();for (int k = 0; k < len_log_space; k++){float y = pred_curves[0 + index] + log_space[k] * (pred_curves[1 + index] - pred_curves[0 + index]);float x = (float)(pred_curves[2 + index] / Math.Pow(y - pred_curves[3 + index], 2.0) + pred_curves[4 + index] / (y - pred_curves[3 + index]) + pred_curves[5 + index] + pred_curves[6 + index] * y - pred_curves[7 + index]);lane_points.Add(new OpenCvSharp.Point(x * img_width, y * img_height));}lanes.Add(lane_points);}}Mat result_image = image.Clone();//draw linesList<int> right_lane = new List<int>();List<int> left_lane = new List<int>();for (int i = 0; i < good_detections.Count; i++){if (good_detections[i] == 0){right_lane.Add(i);}if (good_detections[i] == 5){left_lane.Add(i);}}if (right_lane.Count() == left_lane.Count()){Mat lane_segment_img = result_image.Clone();List<OpenCvSharp.Point> points = new List<OpenCvSharp.Point>();points.AddRange(lanes.First());points.Reverse();points.AddRange(lanes[left_lane[0]]);Cv2.FillConvexPoly(lane_segment_img, points, new Scalar(0, 191, 255));Cv2.AddWeighted(result_image, 0.7, lane_segment_img, 0.3, 0, result_image);}for (int i = 0; i < lanes.Count(); i++){for (int j = 0; j < lanes[i].Count(); j++){Cv2.Circle(result_image, lanes[i][j], 3, lane_colors[good_detections[i]], -1);}}pictureBox2.Image = new System.Drawing.Bitmap(result_image.ToMemoryStream());textBox1.Text = "推理耗时:" + (dt2 - dt1).TotalMilliseconds + "ms";}private void pictureBox2_DoubleClick(object sender, EventArgs e){Common.ShowNormalImg(pictureBox2.Image);}private void pictureBox1_DoubleClick(object sender, EventArgs e){Common.ShowNormalImg(pictureBox1.Image);}}
}

下载

源码下载

相关文章:

C# Onnx LSTR 基于Transformer的端到端实时车道线检测

目录 效果 模型信息 项目 代码 下载 效果 端到端实时车道线检测 模型信息 lstr_360x640.onnx Inputs ------------------------- name&#xff1a;input_rgb tensor&#xff1a;Float[1, 3, 360, 640] name&#xff1a;input_mask tensor&#xff1a;Float[1, 1, 360, …...

Java相关编程思想

少用继承多用“组合”——在现有类的基础上组织一个新类。 2.继承要用“is”来检验&#xff0c;如果继承者is被继承者&#xff0c;说明这是一个比较好的继承。 3.向上造型&#xff0c;把实现方法留给继承者去实现。&#xff08;动态绑定&#xff09; 4.把接口理解为抽象类的进一…...

Hadoop-HDFS架构与设计

HDFS架构与设计 一、背景和起源二、HDFS概述1.设计原则1.1 硬件错误1.2 流水访问1.3 海量数据1.4 简单一致性模型1.5 移动计算而不是移动数据1.6 平台兼容性 2.HDFS适用场景3.HDFS不适用场景 三、HDFS架构图1.架构图2.Namenode3.Datanode 四、HDFS数据存储1.数据块存储2.副本机…...

OpenAI暂停新的ChatGPT Plus注册 | OpenAI 的 GPT Builder 创建您的 GPTs

OpenAI DevDay 才过去仅仅一周时间&#xff0c;伴随着开发者大会上发布的一系列重磅升级和新特性&#xff0c;无疑这样的进化速度让广大网友炸锅了&#xff0c;其火热程度可见一斑。 就在四个小时前&#xff0c;OpenAI的CEO Sam Altma突然宣布&#xff0c;ChatGPT Plus账号暂停…...

Git目录不对,即当前文件夹不对应git仓库

报错信息是&#xff1a; fatal: not a git repository (or any of the parent directories): .git 如&#xff1a; 是当前文件夹不对应git仓库&#xff0c;一般在git clone之后&#xff0c;需要进入下一级文件夹才对应仓库。 在文件夹看&#xff0c;本层中没有.git文件夹&…...

Python基础:正则表达式(regular expression)详解

在Python中&#xff0c;正则表达式是一种强大的工具&#xff0c;可用于匹配和操作字符串。什么是正则表达式&#xff1f; 正则表达式是一种模式匹配语言&#xff0c;用于匹配字符串中的特定模式。这些模式可以是字母、数字、字符组合或其他符号。正则表达式通常用于文本处理、网…...

sqlmap requires ‘python-pymysql‘ third-party library

使用sqlmap进行udf提权报错&#xff1a; [14:06:04] [CRITICAL] sqlmap requires python-pymysql third-party library in order to directly connect to the DBMS MySQL. You can download it from https://github.com/PyMySQL/PyMySQL. Alternative is to use a package pyt…...

05 robotFrameWork+selenium2library 一维数组的使用

一、原生数组&#xff1a; 1、Excel中&#xff1a; LIST_OneRange 项目1|项目2 2、生成的PY&#xff1a; LIST_OneRange [u项目1,u项目2] 3、脚本使用&#xff1a; :FOR ${Local_I} IN RANGE len(${OneRange}) ${value} Evaluate ${OneRange}[${Local_I}] …...

SpringCloud Alibaba组件入门全方面汇总(上):注册中心-nacos、负载均衡-ribbon、远程调用-feign

文章目录 NacosRibbonFeignFeign拓展 Nacos 概念&#xff1a;Nacos是阿里巴巴推出的一款新开源项目&#xff0c;它是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos致力于帮助用户发现、配置和管理微服务&#xff0c;它提供了一组简单易用的特性集&am…...

Zabbix钉钉机器人告警

目录 一.在钉钉群里添加机器人 二.配置钉钉告警脚本 1.安装python依赖模块python-requests 2.配置钉钉告警配置脚本zabbix_ding.conf 3.创建告警日志并且授权。 4.配置钉钉告警执行脚本dingding.py 5.测试 三.配置zabbix告警 1.创建媒介 2.给用户添加报警媒介 3.配置…...

unity shaderGraph实例-扫描效果

文章目录 效果展示整体结构各区域内容区域1区域2区域3区域4区域5区域6GraphSetttings注意事项使用方法 效果展示 整体结构 各区域内容 区域1 用场景深度减去顶点的View空间的视野深度&#xff08;Z值&#xff09;&#xff0c;这里Z值需要乘-1是因为从相机看到的物体顶点的视野…...

AW2013芯片讲解

文章目录 前言一、AW2013芯片介绍二、AW2013从机地址三、AW2013读写时序AW2013写时序AW2013读时序 四、AW2013的INT引脚五、LED作用和配置描述LED控制PWM控制模式简短编程模式 六、AW2013寄存器讲解总结 前言 本篇文章将带大家学习AW2013芯片的使用。 一、AW2013芯片介绍 AW…...

Spring JdbcTemplate Junit 测试 - ResultSetExtractor/RowMapper

Spring JdbcTemplate Junit 测试覆盖率 - 以 ResultSetExtractor / RowMapper 为例 1、RowMapper Mockito 测试 &#xff08;1&#xff09;创建实体类 User Data public class User {private Integer id;private String name;private String applicant;private String addre…...

RabbitMQ实战

文章目录 1、简介2、MQ优点缺点MQ的应用场景AMQP工作原理市面上常见的MQ 3、Linux安装RabbitMQ3.1 版本对应3.2 安装socat3.3 下载 Erlang/OTP、安装、验证 erlang方法一&#xff1a;1. 下载2. 将下载的Erlang服务上传到服务器上面3. 解压4. 编译erlang的依赖环境5. 安装Erlang…...

UI游戏设计模板大放送:7种别具匠心的创意!

随着游戏产业的快速发展&#xff0c;UI游戏设计已经成为一个热门的设计行业&#xff0c;但与之前的设计相比&#xff0c;UI游戏设计还是比较特殊的&#xff0c;主要体现在UI游戏设计难度大&#xff0c;需要大量的手绘内容和对游戏玩法的理解上。这些门槛需要大量的时间去学习&a…...

酷开系统 酷开科技,将家庭娱乐推向新高潮

在当今数字化时代&#xff0c;家庭娱乐已经成为人们日常生活中不可或缺的一部分。如果你厌倦了传统的家庭娱乐方式&#xff0c;想要一种全新的、充满惊喜的娱乐体验&#xff0c;那么&#xff0c;不妨进入到酷开科技的世界&#xff0c;作为智能电视行业领军企业&#xff0c;酷开…...

我精心制作的 python 一小时极简课程来了 ≧◠◡◠≦ 免安装程序+精简核心概念

我精心制作的 python 一小时极简课程来了 ≧◠◡◠≦ 免安装程序+精简核心概念 用过我的软件的朋友应该知道,目前我发布的所有的软件都是 python 写的,例如: 发票批量识别软件点云格式转换软件亲人微信消息记录提取软件批量 WORD-MD 文档中英翻译软件批量 TXT 文本转音频软件…...

220V交流转直流的简易电源设计

220V交流转直流的简易电源设计 设计简介设计原理电路图变压器电路交流转直流电路3.3V电源接口电路 PCB3D图 实践检验 设计简介 通过模拟电路的相关知识&#xff0c;尝试将220V的交流电转化为我们指定电压的直流电。 设计原理 将220V交流电转化为直流电的方法常用的有通过变压器…...

使用Nginx和uwsgi在自己的服务器上部署python的flask项目

Nginx 是一个高性能的 HTTP 和反向代理服务。其特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力在同类型的网页服务器中表现较好。 Nginx 专为性能优化而开发&#xff0c;性能是其最重要的考量指标&#xff0c;实现上非常注重效率&#xff0c;能经受…...

【Windows 开发环境配置——NVIDIA 篇】CUDA、cuDNN、TensorRT 三件套安装

CUDA 从CUDA Toolkit Archive下载相应版本的离线安装包&#xff0c;这里以11.7为例。 打开安装包&#xff0c;在安装选项选择自定义模式&#xff0c;点击下一步。 在自定义安装选项中&#xff0c;仅选择CUDA组件&#xff08;其中Nsight相关组件用于代码调试与性能分析&#xff…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

《Docker》架构

文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器&#xff0c;docker&#xff0c;镜像&#xff0c;k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…...

基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)

注&#xff1a;文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件&#xff1a;STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …...

Go爬虫开发学习记录

Go爬虫开发学习记录 基础篇&#xff1a;使用net/http库 Go的标准库net/http提供了完善的HTTP客户端功能&#xff0c;是构建爬虫的基石&#xff1a; package mainimport ("fmt""io""net/http" )func fetchPage(url string) string {// 创建自定…...