Ultralytics解读DFL模块前言相关介绍Ultralytics 简介前提条件实验环境DFLDistribution Focal Loss 积分模块代码实现功能初始化参数前向方法使用示例流程示意图代码解读注意事项优缺点优点缺点参考文献前言由于本人水平有限难免出现错漏敬请批评改正。更多精彩内容可点击进入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.8DFLDistribution Focal Loss 积分模块DFL是Distribution Focal Loss的积分模块它将模型预测的离散概率分布转换为连续期望值如边界框坐标。该设计源于论文Generalized Focal Loss通过将回归目标建模为概率分布提升了边界框定位的精度。该模块在YOLOv8等目标检测模型的检测头中被广泛使用。代码实现importcv2importmathimporttorchimportnumpyasnpimportmatplotlib.pyplotaspltfromtorchimportnnclassDFL(nn.Module):Integral module of Distribution Focal Loss (DFL). Proposed in Generalized Focal Loss https://ieeexplore.ieee.org/document/9792391 def__init__(self,c1:int16):Initialize a convolutional layer with a given number of input channels. Args: c1 (int): Number of input channels. super().__init__()self.convnn.Conv2d(c1,1,1,biasFalse).requires_grad_(False)xtorch.arange(c1,dtypetorch.float)self.conv.weight.data[:]nn.Parameter(x.view(1,c1,1,1))self.c1c1defforward(self,x:torch.Tensor)-torch.Tensor:Apply the DFL module to input tensor and return transformed output.b,_,ax.shape# batch, channels, anchorsreturnself.conv(x.view(b,4,self.c1,a).transpose(2,1).softmax(1)).view(b,4,a)# return self.conv(x.view(b, self.c1, 4, a).softmax(1)).view(b, 4, a)功能分布转期望值将预测的离散分布4 * c1个通道通过 Softmax 归一化为概率然后与固定的权重0, 1, ..., c1-1进行加权求和得到连续的 4 个回归值如边界框的(x, y, w, h)。梯度固定卷积层的权重被固定为等差数列不参与训练仅作为投影矩阵使用。高效实现利用 1×1 卷积替代矩阵乘法便于在 GPU 上加速。初始化参数参数类型说明c1int分布的分箱数量默认 16即预测的离散区间个数卷积层self.conv输入通道c1输出通道 1核大小 1×1无偏置并设置为不可训练requires_grad_(False)。卷积核权重被初始化为[0, 1, ..., c1-1]形状为(1, c1, 1, 1)相当于一个加权向量。前向方法forward(x)输入x形状为(b, 4 * c1, a)其中b为 batch sizea为 anchor 数量或空间位置数。输出形状为(b, 4, a)。计算流程按代码中的实际运算顺序b, _, a x.shape获取 batch 大小和 anchor 数。x.view(b, 4, self.c1, a)将通道维重塑为(4, c1)即将每个回归值4个分别对应c1个概率值。.transpose(2, 1)交换维度形状变为(b, 4, a, c1)即将c1移至最后。.softmax(1)在维度 1即a维度上应用 Softmax。注意此处的softmax(1)可能是一个实现细节或笔误通常应对c1维度即最后维度做 Softmax。但根据代码注释可能是为了适应特定数据排布。self.conv(...)1×1 卷积作用于c1维度输入通道c1输出形状为(b, 4, a, 1)。.view(b, 4, a)去除多余的维度得到最终输出。功能上无论 Softmax 作用在哪个维度其最终目的都是对c1个概率值进行加权求和。由于卷积核权重固定为等差数列等价于计算期望值。使用示例if__name____main__:# 1. 设置参数c116# 分箱数b,a2,100# batch size, anchor数量# 模拟输入每个回归值对应 c1 个概率值共 4 个回归值xtorch.randn(b,4*c1,a)# 2. 创建 DFL 模块dflDFL(c1c1)# 3. 前向传播withtorch.no_grad():outdfl(x)print(输入形状:,x.shape)# [2, 64, 100]print(输出形状:,out.shape)# [2, 4, 100]# 4. 使用真实图像演示模拟检测头的输出# 由于 DFL 通常在检测头内部使用这里仅做形状验证# 实际使用时输入通常来自卷积层输出print(模块功能将分布转换为期望值输出维度为 4回归值)输出示例输入形状: torch.Size([2, 64, 100]) 输出形状: torch.Size([2, 4, 100]) 模块功能将分布转换为期望值输出维度为 4回归值流程示意图输入 x (b, 4*c1, a)view: (b, 4, c1, a)transpose(2,1): (b, 4, a, c1)softmax(1) 或 对c1维度做softmax1x1 Conv (c1→1, 权重固定为 0..c1-1)view: (b, 4, a)输出 (b, 4, a)代码解读__init__创建nn.Conv2d(c1, 1, 1, biasFalse)输入通道为c1输出为 1。self.conv.weight.data被设置为torch.arange(c1).view(1, c1, 1, 1)即权重为[0,1,...,c1-1]并禁止梯度更新。forward将输入x4*c1个通道重塑为(b, 4, c1, a)表示每个回归值有c1个分箱概率。转置后对a维度或c1维度做 Softmax但代码中softmax(1)作用于a维度若输入形状为(b,4,a,c1)dim1是a。这似乎不是标准做法但可能是为了适应特定数据排布或者这里应该是对c1维度做 Softmax。注释中给出了一行备选实现被注释掉# return self.conv(x.view(b, self.c1, 4, a).softmax(1)).view(b, 4, a)该备选实现是先 view 为(b, c1, 4, a)然后softmax(1)对c1再卷积最后 view。该备选实现更符合常规理解。卷积核self.conv对c1维度进行加权求和得到每个回归值的期望。注意事项输入形状x必须是(b, 4*c1, a)其中4代表边界框的四个坐标或回归目标c1为分箱数a为 anchor/位置数量。Softmax 维度当前代码中softmax(1)作用于a维度经转置后这可能不符合 DFL 的标准定义。强烈建议使用被注释掉的备选实现该实现先 view 为(b, c1, 4, a)然后softmax(1)对c1维度再卷积。标准做法是沿c1维度做 Softmax 以得到概率分布。权重固定卷积核权重被设置为等差数列不可训练这相当于一个固定的加权投影矩阵。输出范围输出值为[0, c1-1]范围内的浮点数对应边界框在离散网格上的坐标通常需结合 stride 缩放回原图尺寸。与 DFL 损失的关系该模块只在推理时使用训练时通常使用交叉熵损失直接优化分布训练时不需此模块或仅在训练后期用于监督。优缺点优点提升定位精度通过分布建模相比直接回归能更好地处理边界模糊的样本。简单高效仅使用一个固定权重的 1×1 卷积计算量极低。可微整个操作可微可嵌入网络进行端到端训练虽然权重固定。与检测头无缝集成可直接替换 YOLO 系列中的回归头无需大幅改动。缺点分箱数选择c1需手动设定过大增加参数过小则精度不足。维度操作易出错如代码所示形状变换和 Softmax 维度若不正确会导致错误结果。仅限固定范围输出值被限制在[0, c1-1]内需配合缩放因子才能映射到真实坐标。对离散化敏感若目标分布不是单峰可能导致期望值偏移。在 YOLOv8 等模型中DFL通常放在检测头末层将网络输出的分布转化为精确的边界框坐标已成为提升检测性能的标准组件。建议在实现时参考官方代码的维度操作确保 Softmax 沿着c1维度进行。参考文献[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
Ultralytics:解读DFL模块
Ultralytics解读DFL模块前言相关介绍Ultralytics 简介前提条件实验环境DFLDistribution Focal Loss 积分模块代码实现功能初始化参数前向方法使用示例流程示意图代码解读注意事项优缺点优点缺点参考文献前言由于本人水平有限难免出现错漏敬请批评改正。更多精彩内容可点击进入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.8DFLDistribution Focal Loss 积分模块DFL是Distribution Focal Loss的积分模块它将模型预测的离散概率分布转换为连续期望值如边界框坐标。该设计源于论文Generalized Focal Loss通过将回归目标建模为概率分布提升了边界框定位的精度。该模块在YOLOv8等目标检测模型的检测头中被广泛使用。代码实现importcv2importmathimporttorchimportnumpyasnpimportmatplotlib.pyplotaspltfromtorchimportnnclassDFL(nn.Module):Integral module of Distribution Focal Loss (DFL). Proposed in Generalized Focal Loss https://ieeexplore.ieee.org/document/9792391 def__init__(self,c1:int16):Initialize a convolutional layer with a given number of input channels. Args: c1 (int): Number of input channels. super().__init__()self.convnn.Conv2d(c1,1,1,biasFalse).requires_grad_(False)xtorch.arange(c1,dtypetorch.float)self.conv.weight.data[:]nn.Parameter(x.view(1,c1,1,1))self.c1c1defforward(self,x:torch.Tensor)-torch.Tensor:Apply the DFL module to input tensor and return transformed output.b,_,ax.shape# batch, channels, anchorsreturnself.conv(x.view(b,4,self.c1,a).transpose(2,1).softmax(1)).view(b,4,a)# return self.conv(x.view(b, self.c1, 4, a).softmax(1)).view(b, 4, a)功能分布转期望值将预测的离散分布4 * c1个通道通过 Softmax 归一化为概率然后与固定的权重0, 1, ..., c1-1进行加权求和得到连续的 4 个回归值如边界框的(x, y, w, h)。梯度固定卷积层的权重被固定为等差数列不参与训练仅作为投影矩阵使用。高效实现利用 1×1 卷积替代矩阵乘法便于在 GPU 上加速。初始化参数参数类型说明c1int分布的分箱数量默认 16即预测的离散区间个数卷积层self.conv输入通道c1输出通道 1核大小 1×1无偏置并设置为不可训练requires_grad_(False)。卷积核权重被初始化为[0, 1, ..., c1-1]形状为(1, c1, 1, 1)相当于一个加权向量。前向方法forward(x)输入x形状为(b, 4 * c1, a)其中b为 batch sizea为 anchor 数量或空间位置数。输出形状为(b, 4, a)。计算流程按代码中的实际运算顺序b, _, a x.shape获取 batch 大小和 anchor 数。x.view(b, 4, self.c1, a)将通道维重塑为(4, c1)即将每个回归值4个分别对应c1个概率值。.transpose(2, 1)交换维度形状变为(b, 4, a, c1)即将c1移至最后。.softmax(1)在维度 1即a维度上应用 Softmax。注意此处的softmax(1)可能是一个实现细节或笔误通常应对c1维度即最后维度做 Softmax。但根据代码注释可能是为了适应特定数据排布。self.conv(...)1×1 卷积作用于c1维度输入通道c1输出形状为(b, 4, a, 1)。.view(b, 4, a)去除多余的维度得到最终输出。功能上无论 Softmax 作用在哪个维度其最终目的都是对c1个概率值进行加权求和。由于卷积核权重固定为等差数列等价于计算期望值。使用示例if__name____main__:# 1. 设置参数c116# 分箱数b,a2,100# batch size, anchor数量# 模拟输入每个回归值对应 c1 个概率值共 4 个回归值xtorch.randn(b,4*c1,a)# 2. 创建 DFL 模块dflDFL(c1c1)# 3. 前向传播withtorch.no_grad():outdfl(x)print(输入形状:,x.shape)# [2, 64, 100]print(输出形状:,out.shape)# [2, 4, 100]# 4. 使用真实图像演示模拟检测头的输出# 由于 DFL 通常在检测头内部使用这里仅做形状验证# 实际使用时输入通常来自卷积层输出print(模块功能将分布转换为期望值输出维度为 4回归值)输出示例输入形状: torch.Size([2, 64, 100]) 输出形状: torch.Size([2, 4, 100]) 模块功能将分布转换为期望值输出维度为 4回归值流程示意图输入 x (b, 4*c1, a)view: (b, 4, c1, a)transpose(2,1): (b, 4, a, c1)softmax(1) 或 对c1维度做softmax1x1 Conv (c1→1, 权重固定为 0..c1-1)view: (b, 4, a)输出 (b, 4, a)代码解读__init__创建nn.Conv2d(c1, 1, 1, biasFalse)输入通道为c1输出为 1。self.conv.weight.data被设置为torch.arange(c1).view(1, c1, 1, 1)即权重为[0,1,...,c1-1]并禁止梯度更新。forward将输入x4*c1个通道重塑为(b, 4, c1, a)表示每个回归值有c1个分箱概率。转置后对a维度或c1维度做 Softmax但代码中softmax(1)作用于a维度若输入形状为(b,4,a,c1)dim1是a。这似乎不是标准做法但可能是为了适应特定数据排布或者这里应该是对c1维度做 Softmax。注释中给出了一行备选实现被注释掉# return self.conv(x.view(b, self.c1, 4, a).softmax(1)).view(b, 4, a)该备选实现是先 view 为(b, c1, 4, a)然后softmax(1)对c1再卷积最后 view。该备选实现更符合常规理解。卷积核self.conv对c1维度进行加权求和得到每个回归值的期望。注意事项输入形状x必须是(b, 4*c1, a)其中4代表边界框的四个坐标或回归目标c1为分箱数a为 anchor/位置数量。Softmax 维度当前代码中softmax(1)作用于a维度经转置后这可能不符合 DFL 的标准定义。强烈建议使用被注释掉的备选实现该实现先 view 为(b, c1, 4, a)然后softmax(1)对c1维度再卷积。标准做法是沿c1维度做 Softmax 以得到概率分布。权重固定卷积核权重被设置为等差数列不可训练这相当于一个固定的加权投影矩阵。输出范围输出值为[0, c1-1]范围内的浮点数对应边界框在离散网格上的坐标通常需结合 stride 缩放回原图尺寸。与 DFL 损失的关系该模块只在推理时使用训练时通常使用交叉熵损失直接优化分布训练时不需此模块或仅在训练后期用于监督。优缺点优点提升定位精度通过分布建模相比直接回归能更好地处理边界模糊的样本。简单高效仅使用一个固定权重的 1×1 卷积计算量极低。可微整个操作可微可嵌入网络进行端到端训练虽然权重固定。与检测头无缝集成可直接替换 YOLO 系列中的回归头无需大幅改动。缺点分箱数选择c1需手动设定过大增加参数过小则精度不足。维度操作易出错如代码所示形状变换和 Softmax 维度若不正确会导致错误结果。仅限固定范围输出值被限制在[0, c1-1]内需配合缩放因子才能映射到真实坐标。对离散化敏感若目标分布不是单峰可能导致期望值偏移。在 YOLOv8 等模型中DFL通常放在检测头末层将网络输出的分布转化为精确的边界框坐标已成为提升检测性能的标准组件。建议在实现时参考官方代码的维度操作确保 Softmax 沿着c1维度进行。参考文献[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