【训练源码】
https://github.com/albrateanu/LYT-Net
【参考源码】
https://github.com/hpc203/Low-Light-Image-Enhancement-onnxrun
【算法介绍】
研究的目标是提出一种轻量级的基于YUV Transformer 的网络(LYT-Net),用于低光照图像增强。与传统的Retinex模型不同,LYT-Net利用YUV色彩空间的亮度(Y)和色度(U和V)自然分离的特性,简化了图像光照和颜色信息的解耦任务。
过去的低光照图像增强方法主要分为两类:
本文提出的LYT-Net基于Transformer结构,通过将输入的RGB图像转换为YUV色彩空间,分别增强亮度和色度信息。主要模块包括多头自注意力(MHSA)模块、多阶段压缩和激励融合(MSEF)模块和通道去噪器(CWD)模块。利用YUV色彩空间的分离特性,LYT-Net专注于提高图像的亮度和细节,同时保留颜色信息。
LYT-Net在LLIE任务上实现了SOTA性能的同时模型参数量和FLOPS显著低于一般方法
Low-Light Image Enhancement on LOL Rank 5
算法框架
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\images
下载源码后一般打开直接可以运行但是偶尔也可能报错,如果报错可以参考博文blog.csdn.net/FL1623863129/article/details/139207146
【视频演示】
【C#算法实现源码下载】