[C#]winform使用onnxruntime部署LYT-Net轻量级低光图像增强算法

【训练源码】

https://github.com/albrateanu/LYT-Net

【参考源码】

https://github.com/hpc203/Low-Light-Image-Enhancement-onnxrun

【算法介绍】

一、研究动机

1.研究目标

研究的目标是提出一种轻量级的基于YUV Transformer 的网络(LYT-Net),用于低光照图像增强。与传统的Retinex模型不同,LYT-Net利用YUV色彩空间的亮度(Y)和色度(U和V)自然分离的特性,简化了图像光照和颜色信息的解耦任务。

2.过去方法

过去的低光照图像增强方法主要分为两类:

  1. 直接映射:使用卷积神经网络(CNN)直接将低光照图像映射为正常光照图像,此类方法往往忽视了人类对颜色感知的特点,缺乏理论解释。
  2. Retinex理论:基于Retinex理论采用更复杂的多阶段训练流程,利用不同的卷积神经网络进行颜色图像分解、去噪和光照调整。此类方法更具理论可解释性,但其复杂性和多阶段训练要求带来了显著的挑战。

3.本文方法

本文提出的LYT-Net基于Transformer结构,通过将输入的RGB图像转换为YUV色彩空间,分别增强亮度和色度信息。主要模块包括多头自注意力(MHSA)模块、多阶段压缩和激励融合(MSEF)模块和通道去噪器(CWD)模块。利用YUV色彩空间的分离特性,LYT-Net专注于提高图像的亮度和细节,同时保留颜色信息。

4.优势及创新点

LYT-Net在LLIE任务上实现了SOTA性能的同时模型参数量和FLOPS显著低于一般方法

Low-Light Image Enhancement on LOL Rank 5

  1. 轻量级设计:LYT-Net结构简单,计算复杂度低,参数数量少,适用于资源受限的应用场景。
  2. 色彩空间分离:利用YUV色彩空间分离亮度和色度,增强图像的可视性和细节,而不影响颜色信息。
  3. 混合损失函数:设计了一个新的混合损失函数,提高了模型的训练效率和增强能力。

二、算法主要思想

算法框架

LYT-Net采用双路径方法,将色度和亮度视为独立的实体,以帮助模型更好地理解光度调整和降噪恢复之间的区别。 具体实现方式如下:

亮度通道Y通过卷积和池化提取特征,然后通过MHSA模块进行增强。色度通道U和V通过CWD模块进行降噪,保持纹理细节。增强后的色度通道U和V重新组合并通过MSEF模块处理,增强输入特征的空间和通道特征。最终与亮度通道Y进行拼接,通过一组卷积层得到高质量的增强图像。

模型的混合损失计算公式如下,α1到α6是用于平衡各组成部分损失函数的超参数:

损失函数

损失从左到右依次为平滑L1损失(避免对异常值过度敏感,增强鲁棒性)、感知损失(监督人眼视觉感知的高层特征)、直方图损失(对齐真实和预测图像的像素数量分布)、PSNR损失(控制噪声)、颜色失真损失(对齐真实和预测图像的色彩)、SSIM损失(结构相似性,图像保真度)。

【界面展示】

【效果演示】

 

 

【C#部分调用代码】

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OpenCvSharp;

namespace FIRC
{
    public partial class Form1 : Form
    {
        Mat src = new Mat();
        LytNet yn = new LytNet();
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "图文件(*.*)|*.jpg;*.png;*.jpeg;*.bmp";
            openFileDialog.RestoreDirectory = true;
            openFileDialog.Multiselect = false;
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
              
                src = Cv2.ImRead(openFileDialog.FileName);
                pictureBox1.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(src);


            }


        }

        private void button2_Click(object sender, EventArgs e)
        {
            if(pictureBox1.Image==null)
            {
                return;
            }
            Stopwatch sw = new Stopwatch();
            sw.Start();
            var result = yn.Inference(src);
            sw.Stop();
            this.Text = "耗时" + sw.Elapsed.TotalSeconds + "秒";
            pictureBox2.Image= OpenCvSharp.Extensions.BitmapConverter.ToBitmap(result); //Mat转Bitmap
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            yn.LoadWeights(Application.StartupPath+ "\\weights\\lyt_net_lolv2_real_320x240.onnx");

        }

        private void btn_video_Click(object sender, EventArgs e)
        {
            var detector = new LytNet();
            detector.LoadWeights(Application.StartupPath + "\\weights\\lyt_net_lolv2_real_320x240.onnx");
            VideoCapture capture = new VideoCapture(0);
            if (!capture.IsOpened())
            {
                Console.WriteLine("video not open!");
                return;
            }
            Mat frame = new Mat();
            //var sw = new Stopwatch();
            //int fps = 0;
            while (true)
            {

                capture.Read(frame);
                if (frame.Empty())
                {
                    Console.WriteLine("data is empty!");
                    break;
                }
                //sw.Start();
                var result = detector.Inference(frame);
                //sw.Stop();
                //fps = Convert.ToInt32(1 / sw.Elapsed.TotalSeconds);
                //sw.Reset();
                //显示结果
                Cv2.ImShow("Result", result);
                int key = Cv2.WaitKey(10);
                if (key == 27)
                    break;
            }

            capture.Release();
  
        }
    }
}

【测试环境】

vs2019
netframwork4.7.2
opencvsharp==4.8.0
onnxruntime==1.16.2
模型都在FIRC\bin\x64\Debug\weights
测试图片都在FIRC\bin\x64\Debug\weights
下载源码后一般打开直接可以运行但是偶尔也可能报错,如果报错可以参考博文blog.csdn.net/FL1623863129/article/details/139207146

【C#算法实现源码下载】

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NVIDIA DeepStream SDK 说明及链接

NVIDIA DeepStream SDK DeepStream 的多平台支持为您提供了一种更快、更简单的方式来开发视觉AI应用程序和服务。您甚至可以在本地、边缘和云中部署它们,只需单击一个按钮。 开始 在Launchpad上试用 什么是 NVIDIA DeepStream? NVIDIA 的 DeepStream …

没有登录微信就不会截图了?这个方法你一定要学会

前言 前段时间小白在指导小伙伴的时候,发现他在电脑没有登录微信的时候就不会截图了。 这个可就难倒他了…… 所以他登录了个微信,然后截了张图,接着把微信退出了。这人可真是谨慎啊~ 所以,小伙伴在使用电脑的时候…

linux shell查看24h内修改的文件

执行命令: find /path -type f -mtime 0

【JMeter接口测试工具】第二节.JMeter项目实战(下)【实战篇】

文章目录 前言一、接口弱压力测试二、高并发、高频率三、生成图形化报告总结 前言 一、接口弱压力测试 场景举例: 场景1:模拟半小时之内 1000 个用户访问服务器资源,要求平均响应时间在3000ms内,且错误率为0 实现步骤: 步骤一&am…

创新共享经济:探索Web3对新商业模式的启迪

随着Web3时代的到来,我们正在见证着一场数字经济的革命。在这个革命中,区块链技术作为一种基础设施,正为创新的共享经济模式提供新的契机。本文将深入探讨Web3对新商业模式的启迪,以及如何借助区块链技术构建更加开放、公平、高效…

go context 源码刨析(一)

Context 上下文context.Context 是用来设置截止时间、同步信号,传递请求相关值的结构体。 context.Context 定义了四个需要实现的方法: Deadline: 返回 context.Context 被取消的时间。Done: 返回一个 Channel,这个 Channel 会在当前工作完…

从零开始手把手Vue3+TypeScript+ElementPlus管理后台项目实战九(整体布局02)

使用el-menu和el-sub-menu及el-menu-item导航 src/layout目录下新增components目录,components目录下新增PageSidebar.vue 代码基本思想为:读取router中定义的routes数组,渲染绑定到el-menu。 el-menu和el-sub-menu及el-menu-item的区别&…

RNA-seq上下游分析snakemake流程

学习完snakemake后写的第一个流程是RNA-seq上游定量和下游的质控和差异分析。 使用fastp处理fastq文件,在使用START比对到基因组同时得到raw count,使用非冗余外显子长度作为基因的长度计算FPKM、TPM,同时也生成了CPM的结果。 非冗余外显子…

【单片机毕业设计选题24003】-基于STM32和阿里云的家庭安全监测系统

系统功能: 此设计采用STM32单片机采集环境温湿度,烟雾浓度和一氧化碳浓度显示在OLED上,并将这些信息上报至阿里云平台。 1. 上电连接手机热点后自动连接阿里云,可通过阿里云平台收到系统上报的温湿度,烟雾 浓度,一氧化碳数据以…

BGW总结

Java基础 Java概述 面向对象和面向过程的区别 面向过程性能比面向对象高,因为类调用时需要实例化,开销比较大 面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护 三大特性 ①封装&a…

地面自动气象站的工作原理

TH-CQX10地面自动气象站是一种部署在地面上,用于监测和记录气象要素的自动化设备。能够自动观测、储存和发送气象数据的设备。它能够实时监测和记录温度、湿度、风速、风向、气压等多种气象参数,为气象监测、气候研究、农业生产、环境监测等领域提供准确…

C++中的结构体——结构体案例1_2

案例描述 学校正在做毕设项目,每位老师指导5名学生,总共有3名老师,需求如下 设计学生和老师的结构体,其中在老师的结构体中,有老师的姓名和一个存放5名学生的数组作为成员 学生的成员有姓名、考试分数,创…

Python写UI自动化--playwright(安装)

Playwright是微软推出的开源自动化测试工具,专为跨浏览器端到端测试设计。Playwright可以在多个浏览器引擎上运行测试,包括基于Chromium的浏览器(如Chrome、Edge)、Firefox和WebKit(Safari的技术基础)。支持…

信息收集---网站目录和CMS指纹识别

一. 网站目录收集 1. 常见网站敏感文件 网站的备份文件/数据库备份文件 wwwroot.zip Db.zip 后台登陆的目录 manage login 安装包(源码) 上传的目录uploads mysql的管理界面 phpmyadmin 程序的安装路径 2. Dirb 工具 工具介绍 dirb 是一款用…

【Spine学习06】之IK约束绑定,制作人物待机动画,图表塞贝尔曲线优化动作

引入IK约束的概念: 约束目标父级 被约束骨骼子集 这样理解更好,约束目标可以控制被约束的两个骨骼运作 IK约束绑定过程中呢,如果直接绑定最下面的脚掌骨骼会发生偏移,所以在开始处理IK之前,需要先设置一个ROOT结点下的…

自定义类型:枚举(enum)+联合体(union)

枚举联合体 一.枚举1.枚举类型的声明2.枚举类型的优点3.枚举类型的使用 二.联合体1.联合体类型的声明2.联合体的特点3.相同成员的结构体和联合体对比4.联合体大小的计算5.联合体的练习(判断大小端)6.联合体节省空间例题 一.枚举 1.枚举类型的声明 枚举…

HTML制作一个日蚀的动画特效

大家好&#xff0c;今天制作一个日蚀动画特效&#xff01; 先看具体效果&#xff1a; 使用一个逐渐扩大的圆形阴影来模拟月亮遮挡太阳的效果。使用了CSS的keyframes动画和border-radius属性来创建一个简单的圆形阴影效果。 HTML <!DOCTYPE html> <html lang"e…

Linux构建本地时间同步ntp

环境介绍&#xff1a; 主机名 IP地址 系统发行版 环境 Node01 192.168.100.102 Centos 7.4 可联网、已关闭防火墙selinux Node02 192.168.100.103 Centos 7.4 已关闭防火墙selinux 1.主节点同步阿里云标准时间 在保证连接外网的情况下&#xff0c;同步阿里服务器的…

Rust 实战丨SSE(Server-Sent Events)

&#x1f4cc; SSE&#xff08;Server-Sent Events&#xff09;是一种允许服务器向客户端浏览器推送信息的技术。它是 HTML5 的一部分&#xff0c;专门用于建立一个单向的从服务器到客户端的通信连接。SSE的使用场景非常广泛&#xff0c;包括实时消息推送、实时通知更新等。 S…

Linux2(文件类型分类 基本命令2 重定向)

目录 一、文件类型分类 二、基本命令2 1. find 帮助查询 2. stat 查看文件的信息 3. wc 统计文本 4. 查看文本内容 4.1 cat 4.2 more 4.3 less 4.4 head 4.5 tail 5. cal 显示日历 6. date 显示时间 7. du 文件大小 8. ln 链接 软链接 硬链接 区别 9. histo…