现有低光图像增强方法在处理图像亮度和颜色时存在不足。在 sRGB 颜色空间中,图像亮度和颜色与三个通道紧密相关,轻微干扰就会导致生成图像的亮度和颜色明显变化 ,如给 sRGB 空间的一个维度(红色通道)引入噪声,增强图像的颜色会发生显著改变,这使得现有方法在增强过程中不稳定,需要更多参数和复杂网络结构来学习增强映射。HSV 颜色空间虽能分离亮度和颜色,但色相轴不连续且与 sRGB 空间映射关系复杂,在处理复杂光照条件时会产生明显黑色伪影。因此,改论文提出一种新的可训练颜色空间Horizontal/Vertical-Intensity(HVI),以解决现有颜色空间在低光图像增强中的不稳定性问题。基于HVI颜色空间,并引入Lighten Cross-Attention(LCA)模块以促进亮度分支和颜色分支之间的交互。
上面是原模型,下面是改进模型

1. 点亮交叉注意力模块LCA介绍
LCA 模块旨在促进 HV (HV 用于表示图像的色度(颜色)信息)分支和I(I 代表图像的亮度或强度信息)强度分支之间的交互引导,学习两个分支的互补信息。通过交叉注意力块(CAB),让 HV 特征和强度特征相互引导,例如将一个分支作为查询,另一个分支作为键和值,以此学习互补潜力。同时,基于 Retinex 理论,强度增强层(IEL)对相关张量进行分解处理,以改善图像的亮度并去除饱和区域;颜色降噪层(CDL)则用于避免噪声伪影和颜色偏移,最终提升增强图像的视觉效果。
从提供的图片来看,LCA模块由交叉注意力块(CAB)、颜色降噪层(CDL)和强度增强层(IEL)组成,主要用于增强低光图像中亮度和颜色分支间图像结构的交互,提升增强效果。
输入与交叉注意力块(CAB):LCA 模块有 HV 分支和 I 分支,分别处理 HV 特征和强度特征。以 I 分支为例,其输入数据进入 CAB 后,会通过特定的卷积操作得到用于注意力计算的查询(query)、键(key)和值(value)。通过查询与键的计算,结合 Softmax 函数,得到注意力权重,再与值进行运算,最后将运算结果与原输入相加,并再次经过卷积,实现了两个分支特征间的相互引导,从而学习到互补信息。
强度增强层(IEL):基于 Retinex 理论,IEL 会对 CAB 输出的数据进行分解,得到两组数据。然后,分别对这两组数据进行处理,先通过双曲正切函数(tanh)处理后再与原数据相加,接着将这两组处理后的数据进行逐元素相乘,再经过深度卷积,以此改善图像亮度并去除饱和区域,最后添加残差来简化训练过程。
颜色降噪层(CDL):CDL 在 LCA 模块中起着避免图像出现噪声伪影和颜色偏移问题的作用。它与 CAB、IEL 相互协作,从不同方面提升低光图像增强后的视觉效果,确保增强后的图像在亮度、颜色和细节等方面都能达到更好的效果。
2. YOLO和LCA的结合
原模型是用来增强增强亮度和颜色分支,本文使用他们增强neck层upsample后的两个分支的融合,也就是替换原有的contact,使其学习两个拼接分支的特征,同时对背景去噪,增强模型特征。大家可以两个concat都替换。
3. LCA代码部分
YOLOv8_improve/YOLOv11.md at master · tgf123/YOLOv8_improve · GitHub
视频讲解:YOLOv11模型改进讲解,教您如何修改YOLOv11_哔哩哔哩_bilibili
YOLO11改进-模块-引入点亮交叉注意力模块LCA 提升模型对图像细节的捕捉能力,降噪_哔哩哔哩_bilibili
YOLOv11全部代码,现有几十种改进机制。
4. 将LCA引入到YOLOv11中
第一: 将下面的核心代码复制到D:\model\yolov11\ultralytics\change_model路径下,如下图所示。
第二:在task.py中导入包
第三:在task.py中的模型配置部分下面代码
第四:将模型配置文件复制到YOLOV11.YAMY文件中
第五:运行成功
from sympy import false
from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorld
if __name__=="__main__":
# 使用自己的YOLOv8.yamy文件搭建模型并加载预训练权重训练模型
model = YOLO(r"E:\Part_time_job_orders\YOLO\YOLOv11\ultralytics\cfg\models\11\yolo11_LCA.yamy")\
.load(r'E:\Part_time_job_orders\YOLO\YOLOv11\yolo11n.pt') # build from YAML and transfer weights
results = model.train(data=r'E:\Part_time_job_orders\YOLO\YOLOv11\ultralytics\cfg\datasets\VOC_my.yaml',
epochs=300,
imgsz=640,
batch=64,
# cache = False,
# single_cls = False, # 是否是单类别检测
# workers = 0,
# resume=r'D:/model/yolov8/runs/detect/train/weights/last.pt',
amp = True
)