当前位置: 首页 > 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…...

如何高效突破Cursor试用限制:全功能AI编程助手解锁指南

如何高效突破Cursor试用限制&#xff1a;全功能AI编程助手解锁指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your tr…...

嵌入式系统调试实战:工具、技巧与内存管理

1. 嵌入式调试的核心价值与挑战从事嵌入式开发十多年来&#xff0c;我深刻体会到调试环节往往决定着项目的成败。与桌面软件开发不同&#xff0c;嵌入式系统一旦部署后很难进行现场维护&#xff0c;这就要求我们必须在上线前解决所有潜在问题。根据行业统计&#xff0c;嵌入式工…...

01_第一篇:到底什么是嵌入式芯片?与通用CPU_GPU_DSP的核心区别

嵌入式芯片入门&#xff1a;到底什么是嵌入式芯片&#xff1f;与通用CPU/GPU/DSP的核心区别 引言&#xff1a;智能时代的核心基石&#xff0c;嵌入式芯片的无处不在 在万物互联的智能时代&#xff0c;我们的生活早已被无数“隐形大脑”环绕&#xff1a;清晨唤醒你的智能手环、出…...

ESP32-S3实战指南:SPI多设备管理与高效数据传输

1. ESP32-S3的SPI总线基础认知 第一次接触ESP32-S3的SPI总线时&#xff0c;我完全被各种专业术语搞懵了。后来在实际项目中反复折腾才发现&#xff0c;SPI本质上就是个"快递小哥"&#xff0c;负责在芯片和外围设备之间搬运数据。ESP32-S3内置了4个这样的"快递站…...

前端开发者的福音:5分钟用Mergely.js给你的网页加个在线文本对比器

零成本打造专业级文本对比工具&#xff1a;Mergely.js全攻略 在代码审查、合同修订或是配置管理场景中&#xff0c;文本差异对比是个高频刚需。传统方案要么需要后端支持&#xff0c;要么功能简陋。现在&#xff0c;只需5分钟和几行JavaScript代码&#xff0c;你就能为Web项目嵌…...

Phi-4-mini-reasoning效果对比:在GSM8K与AQuA数据集上的zero-shot推理表现

Phi-4-mini-reasoning效果对比&#xff1a;在GSM8K与AQuA数据集上的zero-shot推理表现 1. 模型介绍 Phi-4-mini-reasoning是一款专注于推理任务的文本生成模型&#xff0c;特别擅长处理需要多步逻辑分析和精确结论输出的任务场景。与通用对话模型不同&#xff0c;它被专门设计…...

请解释 Linux 系统中的内核模块管理,并描述如何加载和卸载模块。

在 Linux 系统中&#xff0c;内核模块&#xff08;Kernel Modules&#xff09; 是可以在不重新编译或重启内核的情况下&#xff0c;动态添加到运行中内核的代码片段。它们通常用于支持新的硬件设备、文件系统或网络协议。 这种机制使得 Linux 内核保持精简&#xff08;核心功能…...

从“看见光点”到“看懂世界”:视觉重建让这个世界变得更近一些

三十多年前&#xff0c;“让盲人重新看见”更像一句带有未来感的科学想象。而今天&#xff0c;这件事已经进入临床试验和真实的人体研究。视觉重建之所以被视为脑机接口里最具挑战性的方向之一&#xff0c;不只是因为它要解决“能不能刺激大脑”的问题&#xff0c;更因为它要回…...

嵌入式开发者的效率利器:在VS Code里实时看到MISRA-C违规提示(含头文件路径配置避坑)

嵌入式开发实战&#xff1a;用VS Code打造MISRA-C实时检查工作流 每次保存代码后才发现MISRA-C违规有多痛苦&#xff1f;想象一下这样的场景&#xff1a;你正在编写一段关键的车载控制逻辑&#xff0c;反复调试后终于通过了编译&#xff0c;却在提交前的静态检查中被揪出二十多…...

终极指南:如何使用Python实现同花顺自动化程序交易

终极指南&#xff1a;如何使用Python实现同花顺自动化程序交易 【免费下载链接】jqktrader 同花顺自动程序化交易 项目地址: https://gitcode.com/gh_mirrors/jq/jqktrader 在量化投资领域&#xff0c;自动化交易已成为专业投资者的标准配置。本文将详细介绍如何利用jqk…...