自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(84)
  • 收藏
  • 关注

原创 超分(SR)中 Batch Normalization 的负面效果

摘要:本文探讨了BatchNormalization(BN)层在超分辨率(SR)任务中的负面影响。作者通过实验发现,BN层会抹除图像的绝对亮度(均值)和对比度(方差)信息,这与SR任务需要精确重建像素值的要求相冲突。具体表现为:1)BN强制归一化导致暗图被错误提亮;2)放大噪声导致重建伪影;3)训练测试不一致引发数值崩坏。建议在SR等底层视觉任务中移除BN层,采用Conv-ReLU-Conv结构或残差缩放等替代方案。研究强调理解数据物理特性比盲目套用网络组件更重要。

2026-02-04 11:17:16 991

原创 如何在 VSCode 中高效开发和调试 C++ 程序:面向用过 Visual Studio 的小白

VSCode 通过插件的形式扩展了功能,支持各种编程语言和工具,但它不像 Visual Studio 那样开箱即用。因此,对于习惯了 VS 的开发者,理解和配置 VSCode 可能会让人觉得有些繁琐。尤其是调试配置和编译任务的管理,可能需要一些额外的理解。本文将结合一个 C++ 项目的实际目录结构,通过详细的分析 tasks.json、launch.json 和 settings.json 配置文件,帮助大家理解如何在 VSCode 中开发和调试 C++ 程序,并展示如何将这个配置扩展到多个 C++ 文

2025-12-02 14:23:15 896 1

原创 RT-DETR v1 详解:论文 + 源码结合详细讲解

最近在啃 RT-DETR v1,一边对着论文,一边翻官方仓库的 PyTorch 实现,发现网上的很多介绍要么只停留在“架构大图”,要么只讲训练命令,真正把“每一层在干什么、张量长什么样、为什么这么设计”说清楚的资料不多。所以写了这篇学习笔记。下面我把在学习RT-DETR v1过程中的的整体思想 + 算法流程 + 各模块细节记录下来分享给大家

2025-11-19 18:38:27 1521 7

原创 YOLOv8 的检测头、旋转检测头与分割头 —— 从理论到源码的完整解析

目标检测发展多年,YOLO 系列一直以实时、高效为特点。YOLOv8 不仅在普通目标检测上表现优异,同时支持 旋转目标检测(Oriented Object Detection,OBB) 和 实例分割(Instance Segmentation),还有其他的pose和分类等等,这里暂不做介绍。这两类任务本质上都是在 原始 YOLO 检测头(Detect Head)基础上做扩展,但扩展方式非常典型且具工程特色。本文从理论 → 结构 → YOLOv8 代码 → 数据维度 逐层讲解其差异,一方面能巩固所学,另

2025-11-18 11:08:36 1349 1

原创 头部姿态估计的技术方法与发展趋势

头部姿态估计(Head Pose Estimation, HPE)指根据图像或视频推断人头相对于摄像机的朝向(通常以欧拉角yaw偏航、pitch俯仰、roll翻滚表示)。作为非言语行为分析的重要组成,头部朝向能够反映注意力、意图等信息,广泛应用于驾驶员监控、人机交互、视线追踪等领域。早期方法主要依赖几何与经典机器学习技术,近年来深度学习推动了精度提升。总的来说,HPE方法大致分为基于2D关键点(两阶段)和直接图像回归(端到端)两大策略。研究表明,在深度学习助力下,端到端方法已显著超越传统的关键点两步法。下面

2025-11-17 17:53:01 933

原创 解决 “Could not locate zlibwapi.dll” 错误全流程分析

在使用 ONNX Runtime(或其他深度学习库)进行推理时,可能会遇到如下错误:"Could not locate zlibwapi.dll. Please make sure it is in your library path!"这个错误的根本原因是程序找不到 zlibwapi.dll,它是 zlib 压缩库的一部分,用于处理 数据压缩和解压缩。ONNX Runtime 和许多其他深度学习框架依赖这个库来加载和处理模型文件。因此,确保 zlibwapi.dll 被正确加载是非常重要的。

2025-11-14 16:17:15 550

原创 LR→HR 的超分模型为什么最终结果往往偏向模糊(均值)

为了下游检测/分割/OCR,更希望边界更利落、结构更稳定。我们在超分(LR→HR)之外加入传统锐化增强,发现在一些数据上很有效(如大字号文字、Logo、二维码),但在另一些数据上效果一般甚至更糊(如城市夜景的窗格、草地/头发、栅栏、砖墙、织物)。为什么 LR→HR 的超分“学不满”呢?

2025-11-13 11:10:23 1011

原创 如何裁剪YOLOv8m的大目标检测头并验证其结构

YOLOv8在速度和精度之间取得了卓越的平衡。然而,在许多实际应用场景中,我们可能并不需要模型具备检测所有尺寸目标的能力。例如,在针对行人或常规车辆的监控场景中,对超大尺寸目标的检测能力就显得有些多余。这些“多余”的能力不仅占用了宝贵的计算资源,也拖慢了模型的推理速度,尤其是在资源受限的边缘设备上。那么能否通过“裁剪”模型中负责大目标检测的部分,来为速度“减负”,实现更高效的推理呢?本文将以YOLOv8的中量级模型——YOLOv8m为例,详细记录一次完整的模型裁剪实验:从理解其多尺度检测头,到修改模

2025-10-30 17:37:15 1189

原创 优化 ONNX 推理速度:将后处理放入模型中

在 图像生成(比如SR) 和 切片推理 中,我们常常需要处理大尺寸图像,将其分割成多个小切片进行推理。每个切片的推理结果通常需要在 C++ 端 进行后处理操作。这些操作往往是在 C++ 后处理阶段 完成的,但它们会导致 不必要的 CPU 运算和内存拷贝,尤其在处理多个切片时,推理速度受到严重影响。

2025-10-29 14:25:17 594

原创 ONNX Runtime 参数解析:节点名称、输入输出数量与张量结构全面解析

ONNX Runtime 是一个高性能推理引擎,可以加载并执行 ONNX 模型。虽然它使得跨平台部署变得非常方便,但是初学者第一次看到如下 C++ 推理代码时,往往会被复杂的接口参数弄晕。这些参数到底是什么?为什么要指定节点名?输入数量、张量结构为什么不能改?本篇博客将结合代码、图示与内存结构,详细讲解 ONNX 推理的所有关键细节。

2025-10-28 09:29:19 1756

原创 图像归一化:OpenCV 高效映射 [0,255] → [-1,1] 性能实测

在一次算法优化的任务中,我需要将整个推理项目的速度尽可能优化到极致(前处理,推理,后处理),将自己对于其中图像归一化的迭代优化思考的过程记录下来,温故而知新。

2025-10-27 13:02:09 1041

原创 将不适合导出的 PyTorch 网络成功转换为 ONNX 格式并解决常见问题

本文介绍了PyTorch模型导出为ONNX格式的原理及常见问题解决方案。首先阐述了ONNX格式的跨平台优势,其通过静态图优化技术提升推理效率。然后分析了导出过程中常见的错误类型,重点解决了两类问题:1)BatchNorm与卷积层通道数不匹配导致的融合失败;2)ONNX不支持的自定义操作(如动态padding)。针对这些问题,提出了具体的修改方案:替换自定义操作为标准算子、增加通道数检查、区分导出/训练模式等。最后总结了ONNX导出的关键点:使用兼容操作、正确处理BN层、实现导出模式与训练模式的分离。这些方法

2025-10-09 09:36:56 1381

原创 使用BatchNorm偏置填充边界:确保推理一致性与数值稳定性

摘要: 本文探讨了BatchNorm(BN)层在边界标准化中的问题及解决方案。由于边界区域缺乏邻域数据,使用全局统计量进行标准化会导致失真,尤其在零填充时。偏置填充通过计算并应用BN层的偏置(β-γμ/σ),补偿边界标准化误差,确保推理阶段边界与中心区域的一致性。文章结合公式推导和代码示例,展示了如何通过偏置填充(pad_tensor函数)修正边界输出,从而提升模型稳定性。该方法有效解决了BN在边界区域的标准化失真问题。

2025-09-30 13:32:53 900

原创 图像切片推理:ONNX 进行超分辨率处理的高效方法

本文介绍了图像切片推理方法在深度学习中的实际应用,特别针对超分辨率任务中大图像处理的内存和效率问题。文章详细阐述了图像切片推理的概念、实现步骤和关键技术,包括: 图像切分方法:将大图像划分为多个小切片(Tile),每个切片单独处理 重叠区域处理:通过设置重叠区域避免拼接接缝 切片推理流程:包括图像读取、预处理、模型推理和后处理 结果拼接技巧:如何有效合并各切片结果 文章提供了完整的C++实现代码,支持ONNX模型推理,并包含GPU加速选项。该方法适用于处理超大图像或内存资源有限的情况,能显著提高推理效率。代

2025-09-28 18:39:27 800

原创 DETR中的匈牙利算法:结合图文例子详解

摘要:本文系统介绍了匈牙利算法在DETR目标检测器中的关键应用。首先阐述了DETR需要匹配机制的原因:通过固定数量的预测框与真实目标建立最优对应,替代传统NMS后处理。详细解析了匈牙利算法的核心原理,包括行减、列减、最小覆盖线等矩阵操作步骤,并通过示例图解说明匹配过程。特别指出DETR中未匹配的预测会被自动归类为"noobject",实现端到端训练。最后总结了该算法对DETR架构的重要意义及其在各改进模型中的持续应用价值。

2025-09-25 13:55:12 1546

原创 Transformer:代码逐行讲解与核心机制解析

本文介绍了Transformer模型的实现细节,包括核心模块和整体架构。主要内容有:1)缩放点积注意力机制,通过QKV计算和mask处理实现上下文建模;2)多头注意力并行学习不同依赖关系;3)前馈网络增强非线性能力;4)正弦/余弦位置编码注入序列顺序信息;5)两种mask机制(PAD mask和subsequent mask)控制注意力范围;6)编码器-解码器结构差异及权重共享策略。最后提供了完整的PyTorch实现代码,涵盖从底层模块到完整模型的构建,可用于序列到序列任务。代码实现了核心功能如自注意力、交

2025-09-24 11:15:23 812

原创 code2prompt 快速生成项目 Markdown 文档(结合大模型进行问答)

这篇文章介绍了code2prompt工具的用途和用法。code2prompt能够自动将代码项目转换为适合大语言模型阅读的提示文本,保留代码结构和语法高亮,支持生成.txt或.md文件并可添加行号。文章详细说明了安装要求(Python3.9+)、基本命令格式、常用参数(如指定路径、输出文件、行号等)以及使用场景(如大模型协作、项目归档、调试等)。该工具能显著提升与AI模型的交互效率,避免手动复制代码的繁琐。

2025-09-19 16:36:56 1089

原创 Batch Size与预热导致深度学习模型推理时间忽快忽慢

深度学习推理优化中常见"灵异现象"解析:首帧推理慢(400ms vs 6ms)源于CUDA初始化、cuDNN算法搜索等固定开销;正确计时需使用perf_counter()并同步GPU;batchsize影响显著但反常(14张图bs=8时更慢,16张图则快8倍),关键在于"残缺批"导致成本不均摊和算法缓存失效。解决方案:预热采用与推理一致的输入形状,确保数据集大小能被batch整除或剔除尾批统计。

2025-09-18 19:16:11 861

原创 超分辨率训练中遇到的颜色错位问题:RGB vs BGR 的坑

摘要:在超分辨率任务中遇到形状正确但颜色异常的问题,排查发现是OpenCV与PyTorch的RGB/BGR格式不一致所致。OpenCV默认读取BGR格式,而模型处理采用RGB格式,导致输出保存时红蓝通道被交换。解决方案是在保存前将RGB转回BGR,或改用PIL保存。经验表明,处理图像时需统一输入为RGB格式,输出前检查是否需要转换格式,可避免颜色异常问题。

2025-09-11 12:37:27 516

原创 cv::Mat::reshape 与手动构造 cv::Mat + 转置的差异

【摘要】在处理YOLO系列模型输出时,reshape操作与转置操作存在本质区别。模型输出通常为[116,8400]格式(116个属性×8400个候选框),但后处理需要按框组织数据。reshape仅改变内存解释方式,会导致属性错位(如将连续x坐标误解析为多属性组合);而转置.t()则真正重排数据,使每行对应一个候选框的全部属性。实验表明,错误使用reshape会导致检测结果混乱,正确做法是:先构造[116,8400]矩阵再转置为[8400,116],确保数据按框组织。关键点在于理解模型按属性存储数据的特性与后

2025-09-04 18:25:15 622

原创 U-Net图像语义分割中梯度下降的直观解释

本文介绍了图像语义分割的基本原理与方法。语义分割通过对图像每个像素进行分类,输出与输入同尺寸的mask。以U-Net为例,其编码器-解码器结构和跳跃连接能有效融合低层细节与高层语义特征。使用二分类交叉熵损失函数衡量预测与真实标签的差异,通过计算梯度指导模型参数更新:预测错误时梯度较大,促使参数快速调整;预测正确时梯度较小,保持稳定。通过梯度下降迭代优化,模型最终能准确完成像素级分类任务。

2025-08-26 11:04:00 600

原创 基于 ONNX Runtime 的 YOLOv8 高性能 C++ 推理实现

本文介绍了一个基于ONNXRuntime和OpenCV的YOLOv8 C++推理模块,支持Windows/Linux平台,具有轻量高效、可扩展性强等特点。项目核心文件inference.cpp实现了完整的推理流程,包括模型加载、图像预处理、推理执行和后处理。系统支持CPU和CUDA加速,提供检测和分类两种任务模式,通过模板化设计实现了FP32/FP16的灵活切换。预处理采用Letterbox缩放策略,后处理包含NMS非极大值抑制。项目还提供了完善的错误处理和性能分析功能,通过WarmUp机制避免首次推理延迟

2025-08-18 19:34:46 2612

原创 YOLOv8 级联检测:在人脸 ROI 内检测眼镜(零改源码方案)

摘要:本文提出一种基于YOLOv8的两级目标检测方法,通过先检测人脸区域再在ROI内进行眼镜检测,有效提升了小目标检测精度。方法利用官方Python API实现串联推理,无需修改源码,兼容性强。流程包括人脸检测、ROI裁剪、眼镜检测和坐标回填,支持多种输入源。实验表明该方法能准确识别人脸和眼镜,代码运行稳定。关键参数可调,适用于不同场景需求。

2025-08-13 15:57:47 535

原创 Visual Studio中VC++目录、C/C++和链接器配置的区别与最佳实践

本文对比了Visual Studio中两种配置第三方库(如OpenCV)的方法:1)在VC++目录中设置包含/库目录,并在链接器中添加依赖项;2)在C/C++中添加包含目录,在链接器中添加库目录和依赖项。虽然两种方式都能成功运行,但方案二更优:它将头文件路径、库路径和库清单明确区分,作用范围限定在当前项目,配置直观且易于团队协作。建议优先使用方案二,在C/C++和链接器页面进行配置,避免使用VC++目录的默认路径宏方式,以提高项目可维护性和迁移性。

2025-08-12 19:18:41 1612

原创 YOLOv8 结构化剪枝:Torch-Pruning + C2f_v2 + Ultralytics 微调全流程

本篇博客基于与,记录了一次完整的流程。由于(好像是8.1),所以记录了踩的各种坑,自己搭建了一个YOLO系列通用的剪枝模型,用于学习记录。

2025-07-31 20:15:17 1680

原创 yolov8通道级剪枝讲解(超详细思考版)

为了提升推理速度并降低部署成本,模型剪枝已成为关键技术。本文将结合实践操作,讲解YOLOv8模型剪枝的方法原理、实施步骤及注意事项。虽然YOLOv8n版本本身参数量少、推理速度快,能满足大多数工业检测需求,但谷歌研究表明:通过对大模型进行裁剪得到的小模型往往性能更优。本文基于其他博客的剪枝方法的代码实现,专门针对YOLOv8模型进行剪枝优化,能够理解模型剪枝的底层操作。其核心创新点在于利用BN层(Batch Normalization)的特性,实现高效的通道级剪枝操作。

2025-07-25 19:11:23 1972 7

原创 YOLOv8 剪枝模型加载踩坑记:解决 YAML 覆盖剪枝结构的问题

模型剪枝是实现模型轻量化、加速推理的关键步骤。然而,在 Ultralytics YOLOv8 的生态中,在成功剪枝后,进行微调(Fine-tuning)时会遇到一个令人困惑的现象:明明加载的是剪枝后的模型(例如 20M 参数),但训练启动时打印的日志却显示为标准版模型的参数(例如 25M)。并且经过验证,微调后的模型参数就是标准的yolo模型。加载代码如下:原因是Ultralytics 的 仍会先依据 原始 YAML 构建标准结构(约 25M 参数)。随后仅将 文件中的权重加载到这张标准结构中。问

2025-07-24 19:16:34 1278

原创 在离线环境中安装 Python 包及其相关依赖

安装 Python 包及其依赖。这种情况常发生在企业内部、实验室、保护性环境或特定硬件平台上。在机器学习、数据科学以及其他 Python 项目中,较为常见的需求是在。为了方便直接复制相关命令,写篇博客作为记录。虽然直接复制虚拟环境中的库文件看似简便。方法,以确保包的完整性和兼容性。不访问在线包索引,避免网络请求。因此,在离线环境中,推荐使用。指定当前目录查找已经下载的包。没有网络连接的环境中。

2025-07-23 16:53:13 867

原创 YOLOv8中YAML自定义结构加载预训练权重深度解析

于是看了一下源码来记录一下。

2025-07-17 13:35:05 1477

原创 NMS代码详解(数据维度变换解析)

本文详解了目标检测中非极大值抑制(NMS)的代码实现,包括置信度筛选、类别处理、IOU计算等关键步骤。NMS通过置信度阈值筛选候选框,按类别分组后,保留每个类别中置信度最高的框,并删除与其IOU超过阈值的重叠框。代码解析了输入特征图格式、维度变换过程,以及核心的迭代抑制逻辑,最终输出保留框的坐标和类别信息。该算法能有效消除重复检测,提升检测精度。

2025-07-16 14:12:27 1105

原创 YOLOv8 预测结果添加面积过滤以及检测框坐标如何是从针对缩放转换为针对原图大小

本文详细解析了目标检测预测器类DetectionPredictor的核心功能,重点探讨了postprocess方法的工作流程。该方法首先对模型原始输出进行非最大抑制处理,随后通过scale_boxes将预测坐标从缩放图像转换至原始图像尺寸。文章特别提出了在结果处理阶段添加面积过滤的优化方案,通过创建布尔掩码并计算边界框面积,有效剔除了小于设定阈值(如60000像素)的小目标检测。值得注意的是,研究发现仅需过滤boxes.data属性即可同步更新其他相关属性(如cls、conf等),这一特性简化了实现过程。

2025-07-15 16:35:19 622

原创 YOLO标准分割数据集转labelme进行可视化

LabelMe是进行图像分割的标注软件,但不支持YOLO格式的分割数据集。,会将新的json标签存在labelme_annotations目录下。在我们的YOLO标准数据集中,目录结构如下所示(本文将探讨如何将YOLO标准分割数据集转换为。: 该文件夹包含所有待处理的图像文件,图片的。,方便在训练和可视化时进行类别的识别和标注。只要给出images所在的目录就可以。格式,以便进行可视化和进一步分析。图片目录、标签目录和一个类别文件。: 此文件夹存储与图像对应的标签。得到如下json标签。

2025-07-09 09:03:42 448

原创 YOLOv8直接利用分割数据集进行检测的运行原理(结合项目结构进行代码讲解YOLOv8数据加载和处理的流程)

常规而在任务中,标签则是多边形顶点(直觉告诉我们:若想用分割数据集跑检测任务,应该先将多边形“降级”成 bbox。.txt,而且效果毫无偏差。YOLOv8 为什么分割标签能被当成检测标签无缝使用?网上几乎搜索不到资料,于是开启了自己的debug之旅,作为记录,也希望大家能少走弯路。

2025-07-08 10:51:45 898

原创 Anaconda换源与hosts文件配置指南

Anaconda作为一个流行的Python发行版,提供了强大的包管理和环境管理功能。然而,由于网络环境的限制,直接使用Anaconda的默认源可能会遇到下载速度慢或不稳定的问题。此外,在某些情况下,我们可能需要,避免访问conda官方平台造成某些麻烦(懂得都懂)。本文将详细介绍如何通过更换源和配置hosts文件来优化Anaconda环境。

2025-07-04 09:01:42 908

原创 离线迁移 Conda 环境到 Windows 服务器:用 conda-pack 摆脱硬路径限制

在进行深度学习算法的环境部署时,由于生产服务器被彻底隔离外网,只能把conda中env文件夹中的虚拟环境文件夹从开发机直接拷到Windows 服务器,但在运行labelimg等工具时可能报错,因此用conda-pack来解决。

2025-07-03 20:05:22 1280

原创 YOLOv8 模块添加与修改讲解:从源码修改到配置文件配置

YOLOv8 的模块(如。

2025-06-12 18:55:39 1513 2

原创 YOLOv8损失函数代码详解(示例展示数据变换过程)

如果传入形如 (B, N, 1, 4) × (B, 1, M, 4) 的高维张量,上面所有逐元素运算依靠 PyTorch 广播机制 依旧能得到 (B, N, M) 的 IoU 矩阵。YOLOv8的损失函数计算代码位于'ultralytics/utils/loss.py'文件中(如下所示),我在代码中的注释提供了详细解析。本文将展示YOLOv8中损失函数计算的完整代码解析,注释中提供了详尽的解释,并结合示例演示了数据维度的转换,以帮助更好地理解。__init__和preprocess的代码如下。

2025-05-24 22:22:30 1036

原创 YOLOv8检测头代码详解(示例展示数据变换过程)

由于在不同阶段,检测头的输出有所不同,因此在讲解损失函数的计算之前,我们需要先理解检测头的输出内容以及相关参数的定义。例如输入图像640x640生成80x80特征图(stride=8时,特征图每个单元格对应输入图像8x8区域, 锚点坐标为(i+0.5, j+0.5),最终输出形状为(N,2)的锚点坐标和(N,1)的步长张量, N为所有特征图层网格点总数(如80x80+40x40+20x20=8400)。,这也是我们所说的大目标检测头和小目标检测头的区别(即20x20和80x80的区别)。

2025-05-23 18:48:29 1910

原创 YOLO中的DFL损失函数的理论讲解与代码分析

如图所示:由于遮挡、阴影、模糊等原因,许多目标的边界并不清晰,因此真实标签(白色框)有时并不可靠,仅用狄拉克δ分布难以表示这些情况(狄拉克δ分布是一种理想的、只在单一点概率为1,其他地方概率为0的数学分布,表示完全确定的情况)。相反,提出的边界框泛化分布学习方法能够通过分布形状体现边界信息,其中较为平坦的分布表示边界不清晰或模糊的情况(见红色圆圈标记),而尖锐的分布表示边界明确的情况。,由中间的anchor负责预测,那么预测框边界到中心点的距离最大为10,所以16足够了。的特征图,16表示离散区间数(

2025-05-02 15:58:49 4387 2

原创 YOLOV8加载预处理数据并前向传播代码模块逐行调试

模型训练类的初始化结束也没有找到相关步骤,那么就可能不在初始化过程中进行数据预处理,回到一开始点进去的model.train(data="ultralytics/cfg/datasets/coco.yaml", epochs=2),发现在self.trainer初始化结束后调用了self.trainer.train()。框起来的方法是处理数据集的,但是都得主动调用,然而目前只实现了模型训练的构造,并没有主动调用什么方法。在_do_train中调用了_setup_train,点击进去。

2025-05-01 11:05:13 884 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除