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;共同谋划我国工业软件未来发展…

java初始化list的几种方式

在Java中初始化List有以下几种常见的方式: 使用Arrays.asList()静态方法: List<Integer> list1 Arrays.asList(1, 2, 3);使用List接口的实现类ArrayList的构造函数: List<String> list2 new ArrayList<>();使用Collections.singletonList() String obj…

实用篇-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;也就是浏览器连接…

一台服务器是否能够安装多个SSL证书?

在今天的互联网世界中&#xff0c;网络安全是至关重要的&#xff0c;而SSL证书是为了保护网络通信安全而设计的加密协议。然而&#xff0c;对于一台服务器是否能够安装多个SSL证书这个问题&#xff0c;仍然存在一些疑问。本文将探讨这个问题&#xff0c;并提供一些相关的解析和…

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

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

QPQ表面处理,浅谈高校“站群维保”功能服务

成都工具研究所有限公司的前身是成都工具研究所&#xff0c;于1956年创建于北京&#xff0c;是原机械工业部的直属研究所&#xff0c;是我国机械工业的综合性工具科研机构。公司官网&#xff1a;http://www.ctri.com.cn/ 公司主要从事精密切削工具、精密测量仪器以及表面改性处…

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)\$…

Android NDK开发详解之针对中间件供应商的建议

Android NDK开发详解之针对中间件供应商的建议 选择 API 级别和 NDK 版本使用 STL在 AAR 中分发原生库包含 JNI 库的 Java 中间件 分发使用 NDK 构建的中间件会引发其他问题&#xff0c;但应用开发者无需对此感到担心。预构建库会为用户提供一些实现选项。 选择 API 级别和 ND…

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

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

IT行业就业分析

1. IT技术发展背景及历程介绍 2. IT行业的就业方向有哪些&#xff1f; IT技术发展背景及历程介绍&#xff1a; IT技术的发展背景和历程可以追溯到上世纪40年代&#xff0c;以下是IT技术的主要发展阶段&#xff1a; 1.计算机的发展&#xff1a;二战期间&#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…

AWK语言第二版 3.2啤酒评级

3.2 啤酒评级 我们的下一个数据集是大约160万种啤酒的评级&#xff0c;数据来源于 ratebeer.com&#xff0c;一个啤酒爱好者的网站。数据集太大&#xff0c;通过逐行研究来确认它的特性是不可行的&#xff0c;所以我们要依赖像Awk这样的工具来探索并验证数据。 数据来自Kaggl…