C# Onnx Ultra-Fast-Lane-Detection-v2 车道线检测

效果

项目

代码

using Microsoft.ML.OnnxRuntime;
using Microsoft.ML.OnnxRuntime.Tensors;
using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;namespace Onnx_Demo
{public partial class frmMain : Form{public frmMain(){InitializeComponent();}string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";string image_path = "";string startupPath;string model_path;DateTime dt1 = DateTime.Now;DateTime dt2 = DateTime.Now;Mat image;Mat result_image;SessionOptions options;InferenceSession onnx_session;Tensor<float> input_tensor;List<NamedOnnxValue> input_ontainer;IDisposableReadOnlyCollection<DisposableNamedOnnxValue> result_infer;DisposableNamedOnnxValue[] results_onnxvalue;StringBuilder sb = new StringBuilder();int inpHeight = 320;int inpWidth = 1600;int num_row;int num_col;List<float> row_anchor = new List<float>();List<float> col_anchor = new List<float>();float crop_ratio;string dataset;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 Bitmap(image_path);image = new Mat(image_path);}private void Form1_Load(object sender, EventArgs e){startupPath = Application.StartupPath + "\\model\\";model_path = startupPath + "ufldv2_culane_res18_320x1600.onnx";// 创建输出会话options = new SessionOptions();options.LogSeverityLevel = OrtLoggingLevel.ORT_LOGGING_LEVEL_INFO;options.AppendExecutionProvider_CPU(0);// 设置为CPU上运行// 创建推理模型类,读取本地模型文件onnx_session = new InferenceSession(model_path, options);if (model_path.Contains("culane")){dataset = "culane";num_row = 72;num_col = 81;crop_ratio = 0.6f;}else{num_row = 56;num_col = 41;crop_ratio = 0.8f;}// 创建输入容器input_ontainer = new List<NamedOnnxValue>();GenerateAnchor();}void GenerateAnchor(){for (int i = 0; i < num_row; i++){if (dataset == "culane"){row_anchor.Add((float)(0.42 + i * (1.0 - 0.42) / (num_row - 1)));}else{row_anchor.Add((float)((160 + i * (710 - 160) / (num_row - 1)) / 720.0));}}for (int i = 0; i < num_col; i++){col_anchor.Add((float)(0.0 + i * (1.0 - 0.0) / (num_col - 1)));}}private void button2_Click(object sender, EventArgs e){if (image_path == ""){return;}textBox1.Text = "检测中,请稍等……";pictureBox2.Image = null;Application.DoEvents();//图片image = new Mat(image_path);int img_h = image.Rows;int img_w = image.Cols;Mat resize_image = new Mat();Cv2.Resize(image, resize_image, new OpenCvSharp.Size(inpWidth, inpHeight / crop_ratio));Mat dstimg = Common.Normalize(resize_image,inpHeight);var sourceData = Common.ExtractMat(dstimg);int[] dimensions = new int[4] { 1, 3, inpHeight, inpWidth };input_tensor = new DenseTensor<float>(sourceData, dimensions);input_ontainer.Add(NamedOnnxValue.CreateFromTensor("input", input_tensor));dt1 = DateTime.Now;//运行 Inference 并获取结果result_infer = onnx_session.Run(input_ontainer);dt2 = DateTime.Now;//将输出结果转为DisposableNamedOnnxValue数组results_onnxvalue = result_infer.ToArray();var loc_row = results_onnxvalue[0].AsTensor<float>().ToArray();var loc_col = results_onnxvalue[1].AsTensor<float>().ToArray();var exist_row = results_onnxvalue[2].AsTensor<float>().ToArray();var exist_col = results_onnxvalue[3].AsTensor<float>().ToArray();var loc_row_dims = results_onnxvalue[0].AsTensor<float>().Dimensions.ToArray();int num_grid_row = loc_row_dims[1];int num_cls_row = loc_row_dims[2];int num_lane_row = loc_row_dims[3];var loc_col_dims = results_onnxvalue[1].AsTensor<float>().Dimensions.ToArray();int num_grid_col = loc_col_dims[1];int num_cls_col = loc_col_dims[2];int num_lane_col = loc_col_dims[3];int[] exist_row_dims = results_onnxvalue[2].AsTensor<float>().Dimensions.ToArray();int[] exist_col_dims = results_onnxvalue[3].AsTensor<float>().Dimensions.ToArray();int[] max_indices_row = Common.argmax_1(loc_row, loc_row_dims);int[] valid_row = Common.argmax_1(exist_row, exist_row_dims);int[] max_indices_col = Common.argmax_1(loc_col, loc_col_dims);int[] valid_col = Common.argmax_1(exist_col, exist_col_dims);List<List<OpenCvSharp.Point>> line_list = new List<List<OpenCvSharp.Point>>();List<OpenCvSharp.Point> temp = new List<OpenCvSharp.Point>();line_list.Add(temp);line_list.Add(temp);line_list.Add(temp);line_list.Add(temp);int[] item = new int[2] { 1, 2 };foreach (var i in item){if (Common.sum_valid(valid_row, num_cls_row, num_lane_row, i) > num_cls_row * 0.5){for (int k = 0; k < num_cls_row; k++){int index = k * num_lane_row + i;if (valid_row[index] != 0){List<float> pred_all_list = new List<float>();List<int> all_ind_list = new List<int>();for (int all_ind = Math.Max(0, (int)(max_indices_row[index] - 1)); all_ind <= (Math.Min(num_grid_row - 1, max_indices_row[index]) + 1); all_ind++){pred_all_list.Add(loc_row[all_ind * num_cls_row * num_lane_row + index]);all_ind_list.Add(all_ind);}List<float> pred_all_list_softmax = new List<float>();float[] pred_all_list_softmax_temp = new float[pred_all_list.Count];Common.SoftMaxFast(pred_all_list.ToArray(), ref pred_all_list_softmax_temp, pred_all_list.Count);pred_all_list_softmax = pred_all_list_softmax_temp.ToList();float out_temp = 0;for (int l = 0; l < pred_all_list.Count; l++){out_temp += pred_all_list_softmax[l] * all_ind_list[l];}float x = (float)((out_temp + 0.5) / (num_grid_row - 1.0));float y = row_anchor[k];line_list[i].Add(new OpenCvSharp.Point((int)(x * img_w), (int)(y * img_h)));}}}}item = new int[4] { 0, 1, 2, 3 };foreach (var i in item){if (Common.sum_valid(valid_col, num_cls_col, num_lane_col, i) > num_cls_col / 4){for (int k = 0; k < num_cls_col; k++){int index = k * num_lane_col + i;if (valid_col[index] != 0){List<float> pred_all_list = new List<float>();List<int> all_ind_list = new List<int>();for (int all_ind = Math.Max(0, (int)(max_indices_col[index] - 1)); all_ind <= (Math.Min(num_grid_col - 1, max_indices_col[index]) + 1); all_ind++){pred_all_list.Add(loc_col[all_ind * num_cls_col * num_lane_col + index]);all_ind_list.Add(all_ind);}List<float> pred_all_list_softmax = new List<float>();float[] pred_all_list_softmax_temp = new float[pred_all_list.Count];Common.SoftMaxFast(pred_all_list.ToArray(), ref pred_all_list_softmax_temp, pred_all_list.Count);pred_all_list_softmax = pred_all_list_softmax_temp.ToList();float out_temp = 0;for (int l = 0; l < pred_all_list.Count; l++){out_temp += pred_all_list_softmax[l] * all_ind_list[l];}float y = (float)((out_temp + 0.5) / (num_grid_col - 1.0));float x = col_anchor[k];line_list[i].Add(new OpenCvSharp.Point((int)(x * img_w), (int)(y * img_h)));}}}}result_image = image.Clone();foreach (var line in line_list){foreach (var p in line){Cv2.Circle(result_image, p, 3, new Scalar(0, 255, 0), -1);}}sb.Clear();sb.AppendLine("推理耗时:" + (dt2 - dt1).TotalMilliseconds + "ms");sb.AppendLine("------------------------------");pictureBox2.Image = new Bitmap(result_image.ToMemoryStream());textBox1.Text = sb.ToString();}private void pictureBox2_DoubleClick(object sender, EventArgs e){Common.ShowNormalImg(pictureBox2.Image);}private void pictureBox1_DoubleClick(object sender, EventArgs e){Common.ShowNormalImg(pictureBox1.Image);}}
}

下载

源码下载

ufldv2-culane-res34-320x1600.onnx

ufldv2-tusimple-res18-320x800.onnx

ufldv2-tusimple-res34-320x800.onnx

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

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

相关文章

科东软件受邀参加2023国家工业软件大会,共话工业软件未来

10月28日&#xff0c;由中国自动化学会主办的2023国家工业软件大会在浙江湖州开幕。大会以“工业软件智造未来”为主题&#xff0c;一批两院院士、千余名专家学者齐聚一堂&#xff0c;共同探讨工业软件领域前沿理论和技术创新应用问题&#xff0c;共同谋划我国工业软件未来发展…

实用篇-Linux

一、Linux介绍 linux特点 免费开源多用户多任务 Linux系统版本分为内核版和发行版 发行版是基于内核版进行扩展&#xff0c;由各个Linux厂商开发和维护&#xff0c;因为我们真正使用linux最终安装的其实是linux的发行版 下面以CentOS为例来学习Linux 二、Linux安装 安装方式…

LiveGBS流媒体平台GB/T28181常见问题-概览中负载信息具体表示什么直播、回放、播放、录像、H265、级联等

LiveGBS常见问题-概览中负载信息具体表示什么直播、回放、播放、录像、H265、级联等 1、负载信息2、负载信息说明3、搭建GB28181视频直播平台 1、负载信息 实时展示直播、回放、播放、录像、H265、级联等使用数目 2、负载信息说明 直播&#xff1a;当前推流到平台的实时视频…

情报、监视和侦察能力在城市作战中的应用发展研究

源自&#xff1a; 防务快讯 “人工智能技术与咨询” 发布 1 近年来的城市作战案例 图1 一名以色列士兵展示了一种为城市作战设计的巡飞弹。 2 ISR不仅仅是传感器&#xff0c;还需要增强感知和打击能力 3 使用无人机蜂群解决 城市作战中的ISR和打击问题 图2 OFFSET项目设想…

「直播回放」使用 PLC + OPC + TDengine,快速搭建烟草生产监测系统

在烟草工业场景里&#xff0c;多数设备的自动控制都是通过 PLC 可编程逻辑控制器来实现的&#xff0c;PLC 再将采集的数据汇聚至 OPC 服务器。传统的 PI System、实时数据库、组态软件等与 OPC 相连&#xff0c;提供分析、可视化、报警等功能&#xff0c;这类系统存在一些问题&…

2023/10/29总结

总结 踩坑记录 写代码的时候遇到了一个错误大概是这样的 io.jsonwebtoken.security.WeakKeyException: The signing keys size is 48 bits which is not secure enough for the HS256 algorithm. The JWT JWA Specification (RFC 7518, Section 3.2) states that keys used…

【Spring MVC】传递参数

前言&#xff1a; 访问不同路径就是在发送不同的请求&#xff0c;在发送请求时&#xff0c;可能会带有一些参数&#xff0c;所以Spring的请求主要是为了学习如何传递参数到后端以及后端如何接收。 在SpringMVC中使用RequestMapping来实现路由映射&#xff0c;也就是浏览器连接…

Linux--jdk、tomcat、环境配置,mysql安装、后端项目搭建

前言 上期我们讲到了安装linux虚拟机&#xff0c;这期我们来讲一下如何使用xshell和xftp在linux系统上搭建我们的单体项目 一、软件的传输 1.1 xftp Xftp是一款功能强大的文件传输软件&#xff0c;用于在本地主机和远程服务器之间进行快速、安全的文件传输。它是由南京帆软科…

2024王道考研计算机组成原理——中央处理器

CPU的运算器其实就是进行固定的数据处理&#xff0c;后面讲的CPU主要侧重的是它的控制器功能 运算器的基本结构 左右两边都是16位&#xff0c;因为寄存器可能位于左右两端的一边(源/目的操作数) A、B两端都要接一堆线 通用寄存器 ALU都在运算器当中 从主存来的数据直接放到…

BLS embedded curves族

1. 引言 以太坊基金会Antonio Sanso 2023年论文 Family of embedded curves for BLS中&#xff0c;展示了源自BLS椭圆曲线的embedded curves。 pairing-friendly curve E E E具有bilinear map e : G 1 G 2 → G T e:\mathbb{G}_1\times \mathbb{G}_2\rightarrow \mathbb{G…

MFC打开控制台的常用方式

工程项目中&#xff0c;想打开控制台的&#xff0c;简单打印日志 &#xff08;1&#xff09;依次打开&#xff1a; 项目配置属性——>生成事件——>后期生成事件&#xff1a;命令行 &#xff08;2&#xff09;输入&#xff1a; editbin /SUBSYSTEM:CONSOLE $(OUTDIR)\$…

C++前缀和算法的应用:统计上升四元组

C前缀和算法的应用&#xff1a;统计上升四元组 本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 给你一个长度为 n 下标从 0 开始的整数数组 nums &#xff0c;它包含 1 到 n 的所有数字&#xff0c;请你返回上…

DXF文件写入多边形和名称属性,可在Global Mapper和ArcGIS打开

DXF文件写入多边形和名称属性&#xff0c;可在Global Mapper和ArcGIS打开 目标效果 为了实现下图的效果&#xff0c;学习了一下dxf格式的相关内容。 官方文档价值很高&#xff0c;但是结合实例.dxf文件看学习起来更快。 免费下载实例 下面将介绍dxf文件的格式规范&#xff0…

Elasticsearch:在你的数据上训练大型语言模型 (LLM)

过去的一两年&#xff0c;大型语言模型&#xff08;LLM&#xff09;席卷了互联网。 最近 Google 推出的 PaLM 2 和 OpenAI 推出的 GPT 4激发了企业的想象力。 跨领域构思了许多潜在的用例。 多语言客户支持、代码生成、内容创建和高级聊天机器人都是一些例子。 这些用例要求 LL…

数字展厅搭建平台要具备哪些功能,如何选择数字展厅搭建平台

引言: 数字展厅搭建平什台是现代营销中不可或缺的重要工具之一。它可以帮助企业打造个性化、多媒体、互动性强的展示空间&#xff0c;吸引、引导和留住目标用户。在选择数字展厅搭建平台时&#xff0c;我们需要考虑各方面的功能和性能&#xff0c;以确保能够满足企业的需求并取…

面试算法47:二叉树剪枝

题目 一棵二叉树的所有节点的值要么是0要么是1&#xff0c;请剪除该二叉树中所有节点的值全都是0的子树。例如&#xff0c;在剪除图8.2&#xff08;a&#xff09;中二叉树中所有节点值都为0的子树之后的结果如图8.2&#xff08;b&#xff09;所示。 分析 下面总结什么样的节…

全网公开电商数据的采集重点

数据的采集是根据需求而定的&#xff0c;品牌会做数据采集的原因&#xff0c;一般与内部营销、渠道管控有关&#xff0c;如需要做价格管控时&#xff0c;需要先采集价格&#xff0c;这就需要对数据进行采集&#xff0c;包括价格、促销信息&#xff0c;又或者是需要做行业分析、…

PHP连接SQLServer echo输出中文汉字显示乱码解决方法

1、查询结果有中文会显示乱码。 解决方法一&#xff08;较简单&#xff0c;建议使用&#xff09;&#xff1a; 在php文件最开头写上&#xff1a; header(Content-type: text/html; charsetUTF8); // UTF8不行改成GBK试试&#xff0c;与你保存的格式匹配 <?php header(&q…

matab读取包含struct混合类型的mat文件转为txt文件

现有一个mat文件&#xff0c;其内容如下&#xff1a; 目标&#xff1a;要将data.mat中的Obs_Iridium_A转为文本格式。 分析&#xff1a; data.mat里面包含了4个struct结构的成员&#xff0c;Obs_Iridium_A是其中之一&#xff0c;Obs_Iridium_A为1*7496维&#xff0c;7496代表…

波浪理论第3波anzo capital昂首资本3个方法3秒确认

要想通过波浪理论在交易中赚取最大利润&#xff0c;确认第三波必不可少&#xff0c;因为第三波通常是趋势中最大和最强的一波&#xff0c;今天anzo capital昂首资本3个方法3秒确认。 首先&#xff0c;第一个确认方法—斜率。 通常&#xff0c;第三波的斜率会比第一波更陡峭&a…