Ultralytics:解读BNContrastiveHead模块
Ultralytics解读BNContrastiveHead模块前言相关介绍Ultralytics 简介前提条件实验环境BNContrastiveHead批归一化对比头代码实现功能初始化参数前向方法使用示例流程示意图代码解读注意事项优缺点优点缺点参考文献前言由于本人水平有限难免出现错漏敬请批评改正。更多精彩内容可点击进入Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏、自然语言处理专栏、人工智能混合编程实践专栏或我的个人主页查看YOLOs-CPP一个免费开源的YOLO全系列C推理库以YOLO26为例PaddleOCRWin10上安装使用PPOCRLabel标注工具目标检测使用自己的数据集微调DEIMv2进行物体检测图像分割PyTorch从零开始实现SegFormer语义分割图像超分使用自己的数据集微调Real-ESRGAN-x4plus进行超分重建图像生成PyTorch从零开始实现一个简单的扩散模型Stable Diffusion使用自己的数据集微调 Stable Diffusion 3.5 LoRA 文生图模型图像超分使用自己的数据集微调Real-ESRGAN-x2plus进行超分重建Anomalib使用Anomalib 2.1.0训练自己的数据集进行异常检测Anomalib在Linux服务器上安装使用Anomalib 2.1.0人工智能混合编程实践C调用封装好的DLL进行异常检测推理人工智能混合编程实践C调用封装好的DLL进行FP16图像超分重建v3.0隔离系统Python源码编译3.11.8到自定义目录含PGO性能优化在线机的Python环境迁移到离线机上Nuitka 将 Python 脚本封装为 .pyd 或 .so 文件Ultralytics使用 YOLO11 进行速度估计Ultralytics使用 YOLO11 进行物体追踪Ultralytics使用 YOLO11 进行物体计数Ultralytics使用 YOLO11 进行目标打码人工智能混合编程实践C调用Python ONNX进行YOLOv8推理人工智能混合编程实践C调用封装好的DLL进行YOLOv8实例分割人工智能混合编程实践C调用Python ONNX进行图像超分重建人工智能混合编程实践C调用Python AgentOCR进行文本识别通过计算实例简单地理解PatchCore异常检测Python将YOLO格式实例分割数据集转换为COCO格式实例分割数据集YOLOv8 Ultralytics使用Ultralytics框架训练RT-DETR实时目标检测模型基于DETR的人脸伪装检测YOLOv7训练自己的数据集口罩检测YOLOv8训练自己的数据集足球检测YOLOv5TensorRT加速YOLOv5模型推理YOLOv5IoU、GIoU、DIoU、CIoU、EIoU玩转Jetson Nano五TensorRT加速YOLOv5目标检测YOLOv5添加SE、CBAM、CoordAtt、ECA注意力机制YOLOv5yolov5s.yaml配置文件解读、增加小目标检测层Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集YOLOv5使用7.0版本训练自己的实例分割模型车辆、行人、路标、车道线等实例分割使用Kaggle GPU资源免费体验Stable Diffusion开源项目Stable Diffusion在服务器上部署使用Stable Diffusion WebUI进行AI绘图v2.0Stable Diffusion使用自己的数据集微调训练LoRA模型v2.0相关介绍Ultralytics 简介Ultralytics 基于多年的计算机视觉和人工智能基础研究创建了最先进的 (SOTA) YOLO 模型。我们的模型不断更新性能和灵活性快速、准确且易于使用。他们擅长对象检测、跟踪、实例分割、语义分割、图像分类和姿势估计任务。官方文档https://docs.ultralytics.com/官方代码https://github.com/ultralytics/ultralytics.git前提条件熟悉Python、Pytorch实验环境Package Version ------------------------ ------------ Python3.11.8 absl-py2.4.0 accelerate1.13.0 annotated-doc0.0.4 anyio4.13.0 calflops0.3.2 certifi2026.4.22 charset-normalizer3.4.7 click8.3.3 colorama0.4.6 contourpy1.3.3 cycler0.12.1 filelock3.29.0 flatbuffers25.12.19 fonttools4.62.1 fsspec2026.4.0 grpcio1.80.0 h110.16.0 hf-xet1.5.0 httpcore1.0.9 httpx0.28.1 huggingface_hub1.14.0 idna3.15Jinja23.1.6 kiwisolver1.5.0 Markdown3.10.2 markdown-it-py4.2.0 MarkupSafe3.0.3 matplotlib3.10.9 mdurl0.1.2 ml_dtypes0.5.0 mpmath1.3.0 networkx3.6.1 numpy1.26.4 nvidia-cublas-cu1212.8.3.14 nvidia-cuda-cupti-cu1212.8.57 nvidia-cuda-nvrtc-cu1212.8.61 nvidia-cuda-runtime-cu1212.8.57 nvidia-cudnn-cu129.7.1.26 nvidia-cufft-cu1211.3.3.41 nvidia-cufile-cu121.13.0.11 nvidia-curand-cu1210.3.9.55 nvidia-cusolver-cu1211.7.2.55 nvidia-cusparse-cu1212.5.7.53 nvidia-cusparselt-cu120.6.3 nvidia-nccl-cu122.26.2 nvidia-nvjitlink-cu1212.8.61 nvidia-nvtx-cu1212.8.55 onnx1.19.0 onnxruntime-gpu1.26.0 onnxslim0.1.94 opencv-python4.6.0.66 packaging26.2pillow12.2.0 pip24.0polars1.40.1 polars-runtime-321.40.1 protobuf7.34.1 psutil7.2.2 pycocotools2.0.11 Pygments2.20.0 pyparsing3.3.2 python-dateutil2.9.0.post0 PyYAML6.0.3 regex2026.5.9 requests2.34.1 rich15.0.0 safetensors0.7.0 scipy1.16.0 setuptools65.5.0 shellingham1.5.4 six1.17.0 sympy1.14.0 tabulate0.10.0 tensorboard2.20.0 tensorboard-data-server0.7.2 tokenizers0.22.2 torch2.7.1cu128 torchaudio2.7.1cu128 torchvision0.22.1cu128 tqdm4.67.3 transformers5.8.1 triton3.3.1 typer0.25.1 typing_extensions4.15.0 ultralytics8.4.58 ultralytics-thop2.0.19 urllib32.7.0 Werkzeug3.1.8BNContrastiveHead批归一化对比头BNContrastiveHead是一种用于对比学习的模块通常用于视觉-语言多模态任务如 CLIP 风格。它将图像特征和文本特征映射到同一度量空间并计算相似度得分。与常规的 L2 归一化方法不同该模块对图像特征使用BatchNorm2d进行归一化对文本特征使用 L2 归一化并通过可学习的温度和偏置调整相似度分布。该设计有助于训练稳定性并可通过fuse()方法在推理时简化模块提升速度。代码实现importcv2importmathimporttorchimporttorch.nnasnnimporttorch.nn.functionalasFimportnumpyasnpimportmatplotlib.pyplotaspltclassBNContrastiveHead(nn.Module):Batch Norm Contrastive Head using batch norm instead of l2-normalization. Args: embed_dims (int): Embed dimensions of text and image features. def__init__(self,embed_dims:int):Initialize BNContrastiveHead. Args: embed_dims (int): Embedding dimensions for features. super().__init__()self.normnn.BatchNorm2d(embed_dims)# NOTE: use -10.0 to keep the init cls loss consistency with other lossesself.biasnn.Parameter(torch.tensor([-10.0]))# use -1.0 is more stableself.logit_scalenn.Parameter(-1.0*torch.ones([]))deffuse(self):Fuse the batch normalization layer in the BNContrastiveHead module.delself.normdelself.biasdelself.logit_scale self.forwardself.forward_fusestaticmethoddefforward_fuse(x:torch.Tensor,w:torch.Tensor)-torch.Tensor:Passes image features through unchanged after fusing.returnxdefforward(self,x:torch.Tensor,w:torch.Tensor)-torch.Tensor:Forward function of contrastive learning with batch normalization. Args: x (torch.Tensor): Image features. w (torch.Tensor): Text features. Returns: (torch.Tensor): Similarity scores. xself.norm(x)wF.normalize(w,dim-1,p2)xtorch.einsum(bchw,bkc-bkhw,x,w)returnx*self.logit_scale.exp()self.bias注意代码中使用了F.normalize需要import torch.nn.functional as F才能运行。功能特征归一化对图像特征x形状[B, C, H, W]应用BatchNorm2d使其在训练时利用批量统计量进行归一化对文本特征w形状[B, K, C]进行L2 归一化沿特征维度C使其模长为 1。相似度计算通过 Einstein 求和einsum计算图像特征与文本特征之间的点积相似度输出形状为[B, K, H, W]表示每个文本描述与图像每个空间位置的相似度。可学习温度与偏置使用可学习的logit_scale温度参数通过对数尺度控制和bias对相似度进行缩放和平移以调节分布锐度。融合模式调用fuse()可删除norm、bias和logit_scale并将forward重定向到forward_fuse直接返回图像特征忽略文本输入用于推理时快速处理。初始化参数参数类型说明embed_dimsint图像和文本特征的嵌入维度Cself.normBatchNorm2d对图像特征进行批量归一化。self.bias可学习偏置初始化为 -10.0。self.logit_scale可学习对数尺度参数初始化为 -1.0即原始尺度约为 0.3679。前向方法forward(x, w)x图像特征形状[B, C, H, W]。w文本特征形状[B, K, C]其中K为文本描述数量。返回相似度张量形状[B, K, H, W]。计算流程x self.norm(x)→ 归一化图像特征。w F.normalize(w, dim-1, p2)→ L2 归一化文本特征。torch.einsum(bchw,bkc-bkhw, x, w)→ 计算点积相似度输出[B, K, H, W]。x * self.logit_scale.exp() self.bias→ 缩放并平移。forward_fuse(x, w)仅返回x忽略w用于轻量推理。使用示例if__name____main__:# 模拟输入B,C,H,W2,256,16,16# 图像特征K10# 文本描述数量xtorch.randn(B,C,H,W)# 图像特征wtorch.randn(B,K,C)# 文本特征# 创建模块headBNContrastiveHead(embed_dimsC)# 前向传播withtorch.no_grad():simhead(x,w)print(相似度形状:,sim.shape)# [2, 10, 16, 16]# 融合后推理忽略文本仅返回图像特征head.fuse()withtorch.no_grad():fused_outhead(x,w)# 现在返回 x与输入相同print(融合后输出形状:,fused_out.shape)# [2, 256, 16, 16]输出示例相似度形状: torch.Size([2, 10, 16, 16]) 融合后输出形状: torch.Size([2, 256, 16, 16])流程示意图融合模式输入 x, w直接返回 x (忽略 w)图像特征 x (B, C, H, W)BatchNorm2d归一化后 x (B, C, H, W)文本特征 w (B, K, C)L2 归一化 (dim-1)归一化后 w (B, K, C)einsum: bchw,bkc-bkhw计算相似度 (B, K, H, W)缩放: * exp(logit_scale) bias输出相似度 (B, K, H, W)代码解读__init__normBatchNorm2d 用于对图像特征进行归一化在训练时使用批量统计量推理时使用运行统计量。bias和logit_scale均为可学习参数初始值分别设为 -10.0 和 -1.0以保持初始损失与其他损失函数一致。forward先对x进行 BatchNorm再对w进行 L2 归一化沿最后一个维度使每个文本向量模长为 1。使用einsum高效计算点积并将图像特征的空间维度H, W保留使得每个空间位置的像素都能与所有文本特征计算相似度。最后通过指数缩放和偏置调整输出范围。fuse删除norm,bias,logit_scale属性并将forward替换为forward_fuse。forward_fuse直接返回图像特征忽略文本特征适用于仅需要图像特征的场景如分类或检索。依赖需要导入torch.nn.functional as F以使用F.normalize。注意事项BatchNorm2d 模式训练时应保持self.norm处于train()模式以便累积运行统计量推理时需切换至eval()模式或调用fuse()彻底移除 BN。输入形状w的最后一维必须等于embed_dims否则无法与x计算点积。fuse()后使用融合后forward仅返回x不再返回相似度因此需确保后续网络正确处理。温度初始化logit_scale初始为 -1.0实际温度约为 0.3679可能偏小可根据任务调整。内存开销由于输出包含空间维度 H×W当分辨率较大时相似度张量占用显存较多。优缺点优点训练稳定BatchNorm 能减少内部协变量偏移加速收敛。保留空间信息输出保持空间维度适用于密集预测或像素级对比学习。融合便捷提供fuse()方法便于推理时裁剪冗余参数提升速度。灵活的温度缩放可学习参数使模型能自适应调整相似度分布。缺点依赖批量统计量BatchNorm 在小 batch 下可能不稳定且推理时需使用运行统计量。融合后功能单一fuse()后无法再进行相似度计算限制了灵活性。额外参数相比简单的 L2 归一化增加了 BatchNorm 的可学习参数gamma, beta以及温度、偏置参数。输入约束要求w的通道维与embed_dims严格匹配。在对比学习或视觉-语言多模态任务中BNContrastiveHead可作为图像与文本特征对齐的头部模块。使用时应合理设置embed_dims并根据训练和推理场景选择是否调用fuse()。若任务需要相似度输出则保持完整模块若仅需图像特征则可融合以加速。参考文献[1] https://docs.ultralytics.com/[2] https://github.com/ultralytics/ultralytics.git由于本人水平有限难免出现错漏敬请批评改正。更多精彩内容可点击进入Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏、自然语言处理专栏、人工智能混合编程实践专栏或我的个人主页查看YOLOs-CPP一个免费开源的YOLO全系列C推理库以YOLO26为例PaddleOCRWin10上安装使用PPOCRLabel标注工具目标检测使用自己的数据集微调DEIMv2进行物体检测图像分割PyTorch从零开始实现SegFormer语义分割图像超分使用自己的数据集微调Real-ESRGAN-x4plus进行超分重建图像生成PyTorch从零开始实现一个简单的扩散模型Stable Diffusion使用自己的数据集微调 Stable Diffusion 3.5 LoRA 文生图模型图像超分使用自己的数据集微调Real-ESRGAN-x2plus进行超分重建Anomalib使用Anomalib 2.1.0训练自己的数据集进行异常检测Anomalib在Linux服务器上安装使用Anomalib 2.1.0人工智能混合编程实践C调用封装好的DLL进行异常检测推理人工智能混合编程实践C调用封装好的DLL进行FP16图像超分重建v3.0隔离系统Python源码编译3.11.8到自定义目录含PGO性能优化在线机的Python环境迁移到离线机上Nuitka 将 Python 脚本封装为 .pyd 或 .so 文件Ultralytics使用 YOLO11 进行速度估计Ultralytics使用 YOLO11 进行物体追踪Ultralytics使用 YOLO11 进行物体计数Ultralytics使用 YOLO11 进行目标打码人工智能混合编程实践C调用Python ONNX进行YOLOv8推理人工智能混合编程实践C调用封装好的DLL进行YOLOv8实例分割人工智能混合编程实践C调用Python ONNX进行图像超分重建人工智能混合编程实践C调用Python AgentOCR进行文本识别通过计算实例简单地理解PatchCore异常检测Python将YOLO格式实例分割数据集转换为COCO格式实例分割数据集YOLOv8 Ultralytics使用Ultralytics框架训练RT-DETR实时目标检测模型基于DETR的人脸伪装检测YOLOv7训练自己的数据集口罩检测YOLOv8训练自己的数据集足球检测YOLOv5TensorRT加速YOLOv5模型推理YOLOv5IoU、GIoU、DIoU、CIoU、EIoU玩转Jetson Nano五TensorRT加速YOLOv5目标检测YOLOv5添加SE、CBAM、CoordAtt、ECA注意力机制YOLOv5yolov5s.yaml配置文件解读、增加小目标检测层Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集YOLOv5使用7.0版本训练自己的实例分割模型车辆、行人、路标、车道线等实例分割使用Kaggle GPU资源免费体验Stable Diffusion开源项目Stable Diffusion在服务器上部署使用Stable Diffusion WebUI进行AI绘图v2.0Stable Diffusion使用自己的数据集微调训练LoRA模型v2.0