码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • [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#部分调用代码】

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Diagnostics;
    6. using System.Drawing;
    7. using System.Linq;
    8. using System.Text;
    9. using System.Threading.Tasks;
    10. using System.Windows.Forms;
    11. using OpenCvSharp;
    12. namespace FIRC
    13. {
    14. public partial class Form1 : Form
    15. {
    16. Mat src = new Mat();
    17. LytNet yn = new LytNet();
    18. public Form1()
    19. {
    20. InitializeComponent();
    21. }
    22. private void button1_Click(object sender, EventArgs e)
    23. {
    24. OpenFileDialog openFileDialog = new OpenFileDialog();
    25. openFileDialog.Filter = "图文件(*.*)|*.jpg;*.png;*.jpeg;*.bmp";
    26. openFileDialog.RestoreDirectory = true;
    27. openFileDialog.Multiselect = false;
    28. if (openFileDialog.ShowDialog() == DialogResult.OK)
    29. {
    30. src = Cv2.ImRead(openFileDialog.FileName);
    31. pictureBox1.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(src);
    32. }
    33. }
    34. private void button2_Click(object sender, EventArgs e)
    35. {
    36. if(pictureBox1.Image==null)
    37. {
    38. return;
    39. }
    40. Stopwatch sw = new Stopwatch();
    41. sw.Start();
    42. var result = yn.Inference(src);
    43. sw.Stop();
    44. this.Text = "耗时" + sw.Elapsed.TotalSeconds + "秒";
    45. pictureBox2.Image= OpenCvSharp.Extensions.BitmapConverter.ToBitmap(result); //Mat转Bitmap
    46. }
    47. private void Form1_Load(object sender, EventArgs e)
    48. {
    49. yn.LoadWeights(Application.StartupPath+ "\\weights\\lyt_net_lolv2_real_320x240.onnx");
    50. }
    51. private void btn_video_Click(object sender, EventArgs e)
    52. {
    53. var detector = new LytNet();
    54. detector.LoadWeights(Application.StartupPath + "\\weights\\lyt_net_lolv2_real_320x240.onnx");
    55. VideoCapture capture = new VideoCapture(0);
    56. if (!capture.IsOpened())
    57. {
    58. Console.WriteLine("video not open!");
    59. return;
    60. }
    61. Mat frame = new Mat();
    62. //var sw = new Stopwatch();
    63. //int fps = 0;
    64. while (true)
    65. {
    66. capture.Read(frame);
    67. if (frame.Empty())
    68. {
    69. Console.WriteLine("data is empty!");
    70. break;
    71. }
    72. //sw.Start();
    73. var result = detector.Inference(frame);
    74. //sw.Stop();
    75. //fps = Convert.ToInt32(1 / sw.Elapsed.TotalSeconds);
    76. //sw.Reset();
    77. //显示结果
    78. Cv2.ImShow("Result", result);
    79. int key = Cv2.WaitKey(10);
    80. if (key == 27)
    81. break;
    82. }
    83. capture.Release();
    84. }
    85. }
    86. }

    【测试环境】

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

    【视频演示】

    C# winform使用onnxruntime部署LYT-Net轻量级低光图像增强算法_哔哩哔哩_bilibili【测试环境】vs2019netframwork4.7.2opencvsharp==4.8.0onnxruntime==1.16.2模型都在FIRC\bin\x64\Debug\weights测试图片都在FIRC\bin\x64\Debug\weights博文地址:https://blog.csdn.net/FL1623863129/article/details/139653895更多信息参考博文, 视频播放量 5、弹幕量 0、点赞数 0、投硬币枚数 0、收藏人数 0、转发人数 0, 视频作者 未来自主研究中心, 作者简介 未来自主研究中心,相关视频:用C#部署yolov8的tensorrt模型进行目标检测winform最快检测速度,C++使用纯opencv部署yolov9的onnx模型,C和C++的区别竟然是这样!看完我瞬间悟了,C语言、C++和C#的区别竟是这样,看完我瞬间懂了!,使用C#的winform部署yolov8的onnx实例分割模型,使用C++部署yolov8的onnx和bytetrack实现目标追踪,labelme json转yolo工具用于目标检测训练数据集使用教程,使用C++部署yolov9的tensorrt模型进行目标检测,yolov7部署在ros机器人操作系统视频演示,用opencv和onnxruntime去部署yolov5-7-8icon-default.png?t=N7T8https://www.bilibili.com/video/BV1YD421M7R5/?vd_source=989ae2b903ea1b5acebbe2c4c4a635ee

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

    https://download.csdn.net/download/FL1623863129/89429033

  • 相关阅读:
    【SpringBoot】理解配置背后的 PropertySource 抽象
    Camunda 7.x 系列【51】运行时服务 RuntimeService
    API文档工具knife4j使用详解
    计算机网络第二章知识点回顾(自顶向下)
    hello react
    【taro react】---- 团购或秒杀的批量倒计时实现
    机器学习(十七)大规模机器学习
    sql注入(6), 更新注入, 堆叠注入, 宽字节注入
    银行卡转账记录p图软件,建设邮政工商招商农业,易语言回执单生成开发!
    Leetcode 895. Maximum Frequency Stack (Heap 题)
  • 原文地址:https://blog.csdn.net/FL1623863129/article/details/139653895
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号