在恶劣天气(如雨、雪、雾)下的图像恢复任务中,传统 Transformer 模型为降低计算量,常将自注意力限制在固定空间范围或仅在通道维度操作,导致难以捕捉长距离空间特征,尤其无法有效处理天气退化像素(如雪花、雨滴)与清晰背景像素的差异。为解决这一局限,研究者提出了 Histogram Transformer Block(HTB),作为 Histoformer 的核心组件,旨在通过动态范围的特征处理机制,实现对长距离相似退化特征的精准捕捉,同时兼顾局部与全局特征融合,提升恶劣天气下图像恢复的效率与精度。
1.HTB 原理
HTB 的核心原理是通过动态范围特征分组与针对性注意力机制,突破传统卷积和自注意力的局限:
动态范围直方图自注意力(DHSA):将空间特征按像素强度排序并划分为多个 “强度箱(bin)”,在箱内或箱间应用自注意力。这使得模型能针对性聚焦于动态范围内的相似特征(如同一强度的雪花或雨滴),将长距离的退化像素统一处理,同时通过 Bin-wise 重塑(全局范围特征整合)和 Frequency-wise 重塑(局部精细特征提取),平衡全局与局部信息。
动态范围卷积:通过对像素进行水平和垂直排序,使卷积操作不再局限于相邻像素,而是在相似强度的像素间进行,增强对天气退化模式的捕捉能力。
双尺度门控前馈(DGFF):采用 5×5 普通卷积和 3×3 扩张卷积两个并行分支,结合门控机制(通过激活函数生成门控图筛选关键特征),提取多尺度、多范围的特征,弥补单一尺度卷积对复杂天气特征的漏检。
HTB 的结构以 “特征增强 - 融合” 为核心,包含两个关键模块,整体遵循 “归一化 - 处理 - 残差连接” 的设计:
整体框架:输入特征先经层归一化(LN),送入 DHSA 模块处理后与原始特征残差相加;再经层归一化,送入 DGFF 模块处理后再次残差相加,输出增强后的特征。
DHSA 模块:内部包含动态范围卷积(对特征分分支排序后卷积)和直方图自注意力(通过两种重塑机制生成箱内 / 箱间注意力图,再融合),最终将特征恢复至原始空间顺序。
DGFF 模块:先通过 1×1 卷积扩展通道,分两个分支分别用 5×5 深度卷积和 3×3 扩张深度卷积提取特征,再通过门控机制(Mish 激活后的分支特征与另一分支特征逐元素相乘)融合,最后通过 1×1 卷积压缩通道输出。
2.HTB 习作思路
HTB 在目标检测中的优点
HTB 凭借动态范围自注意力对长距离相似特征的捕捉能力,能有效聚合恶劣天气下被干扰的目标特征(如被雨雾遮挡的车辆、被雪花覆盖的行人),减少天气噪声对目标特征一致性的破坏;同时,双尺度卷积机制可保留目标的多尺度细节(如小目标的边缘、大目标的局部纹理),使检测器更精准区分目标与背景,尤其在天气导致目标特征模糊或碎片化的场景中,显著提升检测的召回率与定位精度。
HTB 在分割中的优点
HTB 通过直方图自注意力维持像素间的强度关联,能精准区分相似强度的前景(如目标)与背景(如被天气影响的环境),避免因天气导致的强度混淆;动态范围卷积则增强了对模糊边界(如雾中物体的边缘、雪中植被的轮廓)的特征提取,结合双尺度融合细化边界细节,使分割结果在像素级上更贴合真实目标形态,尤其在天气导致前景与背景过渡模糊的场景中,提升分割的边界精度与区域一致性。
3. YOLO与HTB 的结合
YOLO 追求实时性与检测效率,HTB 的动态范围卷积和轻量化注意力设计(通过分箱机制减少计算量)能在增加有限计算负担的同时,增强对恶劣天气下特征的提取能力;其多尺度特征融合可与 YOLO 的特征金字塔网络(FPN)互补,提升 YOLO 对小目标、模糊目标的识别速度与准确性,使其在复杂天气场景中更稳健。
4.HTB 代码部分
YOLO12模型改进方法,快速发论文,总有适合你的改进,还不改进上车_哔哩哔哩_bilibili
代码获取:YOLOv8_improve/YOLOV12.md at master · tgf123/YOLOv8_improve · GitHub
5. HTB 引入到YOLOv12中
第一: 先新建一个v12_changemodel,将下面的核心代码复制到下面这个路径当中,如下图如所示。E:\Part_time_job_orders\YOLO_NEW\YOLOv12\ultralytics\v12_changemodel。
第二:在task.py中导入包
第三:在task.py中的模型配置部分下面代码
第四:将模型配置文件复制到YOLOV11.YAMY文件中
第五:运行代码
from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorld
import torch
if __name__=="__main__":
# 使用自己的YOLOv8.yamy文件搭建模型并加载预训练权重训练模型
model = YOLO("/home/shengtuo/tangfan/YOLO11/ultralytics/cfg/models/11/yolo12_HTB")\
# .load(r'E:\Part_time_job_orders\YOLO\YOLOv11\yolo11n.pt') # build from YAML and transfer weights
results = model.train(data="/home/shengtuo/tangfan/YOLO11/ultralytics/cfg/datasets/VOC_my.yaml",
epochs=300,
imgsz=640,
batch=4,
# cache = False,
# single_cls = False, # 是否是单类别检测
# workers = 0,
# resume=r'D:/model/yolov8/runs/detect/train/weights/last.pt',
amp = True
)