Ultralytics:解读ContrastiveHead模块

发布时间:2026/7/23 21:11:24
Ultralytics:解读ContrastiveHead模块
Ultralytics解读ContrastiveHead模块前言相关介绍Ultralytics 简介前提条件实验环境ContrastiveHead对比学习头代码实现功能初始化参数前向方法使用示例流程示意图代码解读注意事项优缺点优点缺点参考文献前言由于本人水平有限难免出现错漏敬请批评改正。更多精彩内容可点击进入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.8ContrastiveHead对比学习头ContrastiveHead是一种用于视觉-语言对比学习的模块常见于 CLIP 风格的模型中。它将图像特征和文本特征映射到同一度量空间并计算像素级或区域级的相似度从而支持密集对比学习。该模块包含可学习的温度参数logit_scale和偏置bias用于调整相似度分布提升训练稳定性。代码实现importcv2importmathimporttorchimporttorch.nnasnnimporttorch.nn.functionalasFimportnumpyasnpimportmatplotlib.pyplotaspltclassContrastiveHead(nn.Module):Implements contrastive learning head for region-text similarity in vision-language models.def__init__(self):Initialize ContrastiveHead with region-text similarity parameters.super().__init__()# NOTE: use -10.0 to keep the init cls loss consistency with other lossesself.biasnn.Parameter(torch.tensor([-10.0]))self.logit_scalenn.Parameter(torch.ones([])*torch.tensor(1/0.07).log())defforward(self,x:torch.Tensor,w:torch.Tensor)-torch.Tensor:Forward function of contrastive learning. Args: x (torch.Tensor): Image features. w (torch.Tensor): Text features. Returns: (torch.Tensor): Similarity scores. xF.normalize(x,dim1,p2)wF.normalize(w,dim-1,p2)xtorch.einsum(bchw,bkc-bkhw,x,w)returnx*self.logit_scale.exp()self.bias功能特征归一化对图像特征x形状[B, C, H, W]沿通道维进行 L2 归一化对文本特征w形状[B, K, C]沿最后一个维度即特征维进行 L2 归一化。相似度计算使用爱因斯坦求和einsum计算图像每个空间位置H, W与所有文本描述K的点积相似度输出形状[B, K, H, W]。温度缩放与偏置将相似度乘以可学习的logit_scale.exp()温度参数的指数并加上可学习的bias以调整输出分布的锐度和偏移。初始化参数参数类型说明biasnn.Parameter可学习偏置初始化为 -10.0用于保持初始损失一致性logit_scalenn.Parameter可学习对数尺度参数初始化为log(1/0.07)即温度约为 0.07CLIP 风格该模块没有额外的可学习投影层直接对输入特征进行归一化和点积。前向方法forward(x, w)x图像特征形状[B, C, H, W]w文本特征形状[B, K, C]其中K为文本描述数量返回相似度张量形状[B, K, H, W]使用示例if__name____main__:# 1. 模拟随机输入验证模块功能 B,C,H,W2,256,16,16# 图像特征尺寸K10# 文本描述数量xtorch.randn(B,C,H,W)# 随机图像特征wtorch.randn(B,K,C)# 随机文本特征headContrastiveHead()withtorch.no_grad():simhead(x,w)print(图像特征形状:,x.shape)# [2, 256, 16, 16]print(文本特征形状:,w.shape)# [2, 10, 256]print(相似度形状:,sim.shape)# [2, 10, 16, 16]# 2. 使用真实图像演示产生有纹理的热力图 img_pathcat_640x640.pngimg_bgrcv2.imread(img_path)ifimg_bgrisnotNone:img_graycv2.cvtColor(cv2.resize(img_bgr,(64,64)),cv2.COLOR_BGR2GRAY)img_tensortorch.from_numpy(img_gray).float().unsqueeze(0).unsqueeze(0)# [1,1,64,64]# 方案一使用随机特征推荐每个像素向量方向不同热力图有内容x_imgtorch.randn(1,128,64,64)# 方案二注释灰度图重复通道 小噪声也可产生差异# x_img img_tensor.repeat(1, 128, 1, 1) 0.1 * torch.randn(1, 128, 64, 64)w_imgtorch.randn(1,3,128)# 模拟3个文本描述head_imgContrastiveHead()withtorch.no_grad():sim_imghead_img(x_img,w_img)# [1, 3, 64, 64]# 检查相似度是否全相等若全相等则热力图归一化后全0print(相似度最小值:,sim_img[0,0,:,:].min().item())print(相似度最大值:,sim_img[0,0,:,:].max().item())sim_mapsim_img[0,0].cpu().numpy()# 取第0个文本的热力图# 归一化到 [0,1]sim_map(sim_map-sim_map.min())/(sim_map.max()-sim_map.min()1e-8)plt.figure(figsize(12,5))plt.subplot(1,2,1)plt.imshow(img_gray,cmapgray)plt.title(Original)plt.axis(off)plt.subplot(1,2,2)plt.imshow(sim_map,cmaphot)plt.title(Similarity (text 0))plt.axis(off)plt.savefig(contrastive_head_demo.png,dpi150)print(可视化已保存为 contrastive_head_demo.png)else:print(图片未找到请检查路径)输出示例图像特征形状: torch.Size([2, 256, 16, 16]) 文本特征形状: torch.Size([2, 10, 256]) 相似度形状: torch.Size([2, 10, 16, 16]) 相似度最小值: -15.13952350616455 相似度最大值: -5.142784118652344 可视化已保存为 contrastive_head_demo.png流程示意图图像特征 x (B, C, H, W)L2 归一化 (dim1) → (B, C, H, W)文本特征 w (B, K, C)L2 归一化 (dim-1) → (B, K, C)einsum: bchw,bkc-bkhw相似度 (B, K, H, W)乘以 exp(logit_scale) bias输出相似度 (B, K, H, W)代码解读__init__self.bias可学习偏置初始化为 -10.0用于在不训练时让初始损失值与其他损失如分类损失量级相近稳定训练。self.logit_scale可学习对数尺度参数。初始值log(1/0.07)使得实际温度约为 0.07这是 CLIP 中常用的值能有效调节 softmax 分布的锐度。forward对图像特征x沿通道维dim1进行 L2 归一化使每个像素的特征向量模长为 1。对文本特征w沿最后维度dim-1进行 L2 归一化使每个文本向量模长为 1。使用einsum计算点积bchw表示图像特征的批次、通道、高、宽bkc表示文本特征的批次、文本数、通道。输出bkhw即每个空间位置与每个文本的相似度。最后应用温度缩放exp(logit_scale)和偏置得到最终相似度。注意事项归一化维度图像特征归一化沿通道维dim1文本特征归一化沿最后一个维度dim-1确保每个向量模长为 1。logit_scale的初始化使用torch.ones([]) * torch.tensor(1 / 0.07).log()实际温度约为 0.07符合 CLIP 设计。训练时该参数会自适应调整。bias的作用初始为 -10.0可防止初始相似度过高导致 softmax 饱和有助于稳定训练。内存与计算相似度张量大小为B * K * H * W当空间分辨率H, W较大或文本数K较多时显存占用和计算量会显著增加。输入特征维度x的通道数C必须与w的特征维C一致否则einsum会报错。优缺点优点简单有效仅需归一化和点积无需额外投影层参数少计算高效。空间保留输出保持空间维度支持密集对比学习如像素级分类。可学习温度logit_scale能自适应调节相似度分布提升训练稳定性。即插即用可嵌入各类视觉-语言模型中直接替换简单的余弦相似度计算。缺点计算量大需计算H*W个位置与K个文本的点积在高分辨率下显存和计算成本较高。依赖特征质量若输入特征未充分对齐相似度可能不具区分度。偏置初值依赖bias初始值需谨慎设置否则可能影响早期训练。无投影层相比 CLIP 的投影头该模块缺少可学习的线性变换可能限制特征对齐能力。在对比学习或视觉-语言预训练中ContrastiveHead可作为轻量级相似度计算单元。使用时需注意输入特征的归一化状态并根据显存调整H, W和K。若需更强的对齐能力可考虑增加投影层。参考文献[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