DsInputReportMetrics 深度解析:DsHidMini 输入报告到达频率与间隔指标的驱动、IPC 与用户态全链路
驱动开发硬件开发【免费下载链接】DsHidMiniVirtual HID Mini-user-mode-driver for Sony DualShock 3 Controllers项目地址https://gitcode.com/gh_mirrors/ds/DsHidMini点击查看免费下载DsHidMini 是一套面向 Sony DualShock 3 手柄的虚拟 HID 用户态驱动方案其 SDK 通过共享内存与驱动交换数据。本文以 DsInputReportMetrics 这一公开模型为切入点完整讲解它承载的输入报告到达指标每秒报告率与平均到达间隔的语义、字节布局、驱动侧采集与发布流程、用户态读取方式以及在 ControlApp 中的实际展示。读完本文你将能独立解读该结构体的每个字段理解它如何在驱动DISPATCH_LEVEL的到达路径上被统计、如何以 seqlock 安全地跨越共享内存边界以及如何在自家应用中接入并格式化这些指标。一、指标是什么宿主侧到达节奏而非单向延迟DsInputReportMetrics是Nefarius.DsHidMini.IPC.Models.Public命名空间下的一个版本化、按插槽per-slot组织的输入报告到达指标结构。它的核心作用是让用户态程序每秒钟看到一次 DS3 手柄输入报告的到达频率与相邻报告之间的平均间隔从而判断手柄链路USB 或蓝牙是否处于健康状态。两个关键语义必须澄清间隔定义AverageIntervalUs度量的是宿主侧相邻成功报告之间的到达间距——即 USB 中断完成interrupt completion或蓝牙中断包先后到达主机的时间差不是单向包延迟也不是驱动到应用之间的传输时延。0 值含义当字段为0时表示在统计窗口内没有观察到足够数量的报告例如设备刚连接、处于 D0 休眠、或链路没有数据到达而非间隔为零微秒。按 C# 侧的注释ReportRateHz与AverageIntervalUs覆盖的是驱动最近完成的一个约 1 秒窗口the drivers last completed ~1 s window这是驱动侧 1 Hz 发布节奏与用户态轮询节奏共同决定的。二、数据结构28 字节、Pack1 的紧凑布局结构体使用[StructLayout(LayoutKind.Sequential, Pack 1)]声明保证按 1 字节对齐、无填充字节从而与驱动共享内存中的原生 C 结构严格一一对应参见 InputReportMetrics.cs。2.1 实例字段字段C# 类型偏移推算说明SlotIndexuint0设备插槽索引驱动侧写入Context-SlotIndex从 1 开始0 表示槽位已清空SequenceNumberint4seqlock 序号奇数表示发布者正在写入偶数且非零表示快照一致用于无锁安全读取Versionushort8结构体 ABI 版本当前恒为CurrentVersion 1Reserved0ushort10保留字段发布时恒为 0为未来扩展预留ReportRateHzuint12最近 1 秒窗口内的平均报告到达率Hz0 表示无足够样本AverageIntervalUsuint16窗口内相邻报告平均到达间隔微秒0 表示无足够样本TimestampQpculong20本次发布时刻的 QueryPerformanceCounterQPC值供用户态换算绝对时间戳字段总长为 28 字节与公开常量Size 28一致。原始文档中字段按字母顺序列出的全部 7 个成员AverageIntervalUs、ReportRateHz、Reserved0、SequenceNumber、SlotIndex、TimestampQpc、Version均已在上表覆盖。2.2 常量字段public const ushort CurrentVersion 1; // 当前 ABI 版本 public const int Size 28; // 序列化后总字节数版本号是 IPC 兼容性的第一道防线用户态程序在读取指标前应先读取驱动的InputReportMetricsVersionProperty设备属性确认 ABI 版本再决定能否按本结构体解析见下文第五节。三、驱动侧到达统计、窗口计算与 1 Hz 发布指标的全部采集与计算都发生在驱动内核心实现在 driver/DsInputReportMetrics.c 与 driver/DsInputReportMetrics.h。3.1 状态窗口DS_INPUT_REPORT_METRICS_STATE#define DS_INPUT_REPORT_METRICS_VERSION 1 #define DS_INPUT_REPORT_METRICS_PERIOD_MS 1000驱动维护的统计窗口包含窗口起点 QPCWindowStartQpc、上一次到达 QPCLastArrivalQpc、窗口内间隔累加值WindowIntervalSumQpc、窗口内报告计数WindowReportCount与间隔计数WindowIntervalCount并由一把在 USB 连续读路径上以DISPATCH_LEVEL获取的自旋锁WDFSPINLOCK Lock保护。3.2 到达记录DsInputReportMetrics_NoteArrival每当一个输入报告成功到达驱动在报告处理路径上调用 DsInputReportMetrics_NoteArrival。调用点位于 driver/DsHidMiniDrv.c 与 driver/DsHidMiniDrv.c分别覆盖 USB 与蓝牙两条到达路径。其逻辑为记录当前 QPC若存在上一次到达记录则把两次到达的差值累加到WindowIntervalSumQpc并递增WindowIntervalCount更新LastArrivalQpc并递增WindowReportCount。QueryPerformanceCounter(now); WdfSpinLockAcquire(metrics-Lock); { if (metrics-LastArrivalQpc.QuadPart ! 0) { metrics-WindowIntervalSumQpc (UINT64)(now.QuadPart - metrics-LastArrivalQpc.QuadPart); metrics-WindowIntervalCount; } metrics-LastArrivalQpc now; metrics-WindowReportCount; } WdfSpinLockRelease(metrics-Lock);这里到达既包含 USB 中断完成interrupt completion也包含蓝牙中断包与文档中host-side arrival spacing between successful USB interrupt completions or Bluetooth interrupt packets的语义严格对应。3.3 窗口计算与发布DsInputReportMetrics_ComputeAndPublish一个约 1 Hz 的发布器在PASSIVE_LEVEL下定时触发。注意一个 WDF 细节UMDF 不接受被动级别的周期性定时器periodic passive timers因此驱动创建的是单次触发one-shot定时器在回调中当Running标志仍置位时自我重新武装DsInputReportMetrics_ComputeAndPublish(context); WdfSpinLockAcquire(context-InputReportMetrics.Lock); { if (context-InputReportMetrics.Running) { WdfTimerStart(Timer, WDF_REL_TIMEOUT_IN_MS(DS_INPUT_REPORT_METRICS_PERIOD_MS)); } } WdfSpinLockRelease(context-InputReportMetrics.Lock);计算逻辑DsInputReportMetrics_ComputeAndPublish报告率rateHz reportCount * QPC频率 / 窗口流逝QPC即把窗口内的报告数换算成一秒等效频率平均间隔averageIntervalUs intervalSumQpc * 1_000_000 / (QPC频率 * intervalCount)即窗口内所有相邻到达间隔的 QPC 均值再换算为微秒。当窗口内reportCount 0或intervalCount 0时对应指标保持 0这与文档0means no sufficient reports were observed完全一致。发布成功后驱动会写入 ETW 跟踪日志TraceVerboseInput report metrics: %u Hz, %u us avg interval (reports%lu intervals%lu)可用于调试时确认数据确实在流动。四、与驱动的共享内存结构ABI 必须保持同步C# 侧结构体必须与驱动的 IPC_INPUT_REPORT_METRICS_MESSAGE 保持字节级一致二者都被要求Pack1#include pshpack1.h typedef struct _IPC_INPUT_REPORT_METRICS_MESSAGE { UINT32 SlotIndex; volatile LONG SequenceNumber; UINT16 Version; UINT16 Reserved0; UINT32 ReportRateHz; UINT32 AverageIntervalUs; UINT64 TimestampQpc; } IPC_INPUT_REPORT_METRICS_MESSAGE, *PIPC_INPUT_REPORT_METRICS_MESSAGE; #include poppack.h驱动用编译期断言强制校验布局假设driver/DsInputReportMetrics.hC_ASSERT(sizeof(IPC_INPUT_REPORT_METRICS_MESSAGE) 28); C_ASSERT((FIELD_OFFSET(IPC_INPUT_REPORT_METRICS_MESSAGE, SequenceNumber) % sizeof(LONG)) 0); C_ASSERT((sizeof(IPC_INPUT_REPORT_METRICS_MESSAGE) % sizeof(LONG)) 0);第二个断言保证SequenceNumberseqlock 序号按LONG对齐使InterlockedIncrement等原子操作合法可用。发布者 DsInputReportMetrics_PublishValues 的写入顺序也遵循 seqlock 惯例先InterlockedIncrement把序号变为奇数写入中再依次写入各字段最后再次InterlockedIncrement使序号变为偶数写入完成快照一致。槽位寻址采用offset sizeof(结构) * (SlotIndex - 1)并按共享区域大小做越界保护driver/DsInputReportMetrics.c。设备挂起/停止时DsInputReportMetrics_Stop与DsInputReportMetrics_D0Entry会发布全 0 快照或调用DsInputReportMetrics_PublishOrClearIpcSnapshot(..., TRUE)把整个槽位清零SlotIndex 0用户态据此判断无有效指标。共享区域本身在 driver/IPC.c 中创建并记录缓冲基址与大小。五、用户态读取共享内存映射与 seqlock 拷贝5.1 映射第四个内存区域IPC 客户端DsHidMiniInterop在初始化时按分配粒度dwAllocationGranularity映射多个共享区域指标区位于第 4 个区域偏移为3 * allocationGranularitySDK/Nefarius.DsHidMini.IPC/DsHidMiniInterop.cs。该映射是可选的旧版本驱动只暴露前三个区域映射失败时HasInputReportMetrics为falseGetInputReportMetrics返回false。5.2 读取 APIGetInputReportMetrics核心读取入口在 SDK/Nefarius.DsHidMini.IPC/DsHidMiniInterop.Commands.cspublic unsafe bool GetInputReportMetrics( int deviceIndex, out DsInputReportMetrics metrics, TimeSpan? timeout null)deviceIndex从 1 开始的设备索引timeout可选。不传时立即返回当前最新快照传入时会在等待事件GetOrOpenHidReportWaitEvent上等待驱动发布下一版快照若超时或槽位为空SlotIndex 0则返回false返回false的三种典型场景驱动无指标区域、槽位为空、等待超时。内部通过TryCopyInputReportMetrics实现 seqlock 读取DsHidMiniInterop.Commands.cs先读序号奇数则Thread.Yield()等待发布完成拷贝结构体再读一次序号若两次不一致则重试同时校验SlotIndex与请求的设备索引一致否则抛出DsHidMiniInteropUnexpectedReplyException。这种先验证写序、拷贝、再验证写序的读法保证用户态始终拿到一致的快照即使驱动侧正在并发写入。5.3 版本属性与兼容性检查驱动在设备属性中发布只读版本号DEVPKEY_DsHidMini_RO_InputReportMetricsVersionDEVPROP_TYPE_UINT32当前为1见 driver/DsInputReportMetrics.c 的DsInputReportMetrics_AssignVersionProperty。SDK 侧对应的静态属性为 DsHidMiniDriver.InputReportMetricsVersionProperty建议在读取指标前先校验版本再检查HasInputReportMetrics。六、应用落地ControlApp 中每秒轮询与格式化展示指标最终落到用户可见的界面上典型实现位于 ControlApp/ViewModels/UserControls/DeviceViewModel.cs设备视图模型启动一个每秒触发的定时器_inputReportMetricsQuery初始延迟与周期均为 1 秒每次触发先通过TryReadInputReportMetricsVersion()读取设备属性的指标 ABI 版本DeviceViewModel.cs确认可用通过惰性创建的DsHidMiniInterop实例EnsureInputReportMetricsInterop调用HasInputReportMetrics与GetInputReportMetrics取出metrics.ReportRateHz与metrics.AverageIntervalUs交给格式化器渲染仅在值发生变化时通过 Dispatcher 更新界面显示。格式化规则见 ControlApp/Models/Input/InputReportMetricsFormatter.csnull尚未读到→Unknown0窗口内无足够样本→—em dash非零值频率格式化为{0} Hz间隔格式化为{0:N0} µs千分位、微秒符号。这套 1 Hz 轮询 版本校验 可选读取的超时设计使界面即使在指标暂不可用如设备休眠、刚热插拔时也能稳定降级显示不会产生异常或误导性数据。七、兼容性与使用注意事项综合文档、SDK 与驱动源码使用DsInputReportMetrics时有几点必须注意旧驱动不提供指标区第四个共享区域与InputReportMetricsVersionProperty均属于较新 ABI对旧版驱动应先检查HasInputReportMetrics/ 版本属性再调用读取SDK 的 README 亦明确Absent on older drivers。数值语义两个指标都覆盖最近约 1 秒窗口0仅表示样本不足不要将AverageIntervalUs当作链路单程延迟使用。单次读取时机快照约每秒发布一次立即读取返回的是上一个已完成窗口需要等待最新窗口时请传入timeout参数。seqlock 一致性用户态读取由SequenceNumber奇偶校验保护任何直接memcpy该共享区域而不校验序号的自行实现都是不安全的应以 SDK 提供的GetInputReportMetrics为准。按槽寻址SlotIndex从 1 开始且唯一对应一个设备插槽读到SlotIndex 0表示该槽无有效指标。八、关键参考路径速查文档主题模型SDK/Nefarius.DsHidMini.IPC/Models/Public/InputReportMetrics.cs驱动状态与发布driver/DsInputReportMetrics.h、driver/DsInputReportMetrics.c到达采集调用点driver/DsHidMiniDrv.c第 868、1038 行共享区域创建driver/IPC.c用户态读取 APISDK/Nefarius.DsHidMini.IPC/DsHidMiniInterop.Commands.csGetInputReportMetrics区域映射与HasInputReportMetricsSDK/Nefarius.DsHidMini.IPC/DsHidMiniInterop.cs版本设备属性SDK/Nefarius.DsHidMini.IPC/Models/Drivers/DsHidMiniDriver.csInputReportMetricsVersionProperty应用层展示ControlApp/ViewModels/UserControls/DeviceViewModel.cs、ControlApp/Models/Input/InputReportMetricsFormatter.csIPC 概览与兼容性说明SDK/Nefarius.DsHidMini.IPC/README.md围绕报告到达率与平均间隔这一指标你已从数据结构、驱动统计窗口、共享内存 ABI、seqlock 无锁读取到界面轮询展示走通了完整链路。若需要在此基础上扩展如把指标接入诊断导出或绘制时序曲线可直接复用本文列出的各层入口继续深入。赞分享驱动开发硬件开发【免费下载链接】DsHidMiniVirtual HID Mini-user-mode-driver for Sony DualShock 3 Controllers项目地址https://gitcode.com/gh_mirrors/ds/DsHidMini点击查看免费下载相关推荐深入bubblewrap命名空间用户、PID、网络与IPC隔离详解深入bubblewrap命名空间用户、PID、网络与IPC隔离详解 在当今容器化技术蓬勃发展的时代 bubblewrap命名空间隔离 作为一种轻量级沙箱工具容器运行时Windows-driver-samples 实战用 KMDF 编写鼠标输入过滤驱动Moufiltr——报文报告链钩子与 PS/2 ISR 深入解析Windows driver samples 实战用 KMDF 编写鼠标输入过滤驱动Moufiltr——报文报告链钩子与 PS/2 ISR 深入解析 导读示例工程如何让你的Mac鼠标体验飙升从安装到付费的完整指南如何让你的Mac鼠标体验飙升从安装到付费的完整指南 Mac Mouse Fix是一款专为提升Mac用户鼠标体验设计的实用工具它能帮助你自定义鼠标按钮功能、优桌面应用系统编程上一篇量化交易新手落地指南用开源 stock 项目搭起行情采集、监控提醒与回测闭环下一篇鸣潮自动化工具终极指南解放双手轻松享受游戏乐趣创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

LlamaIndex 大模型集成实战:从单模调用到多模态交互的全攻略|TaoToken 统一 Key 接入

LlamaIndex 大模型集成实战:从单模调用到多模态交互的全攻略|TaoToken 统一 Key 接入

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 10:52:28 阅读更多 →
ctags 对 C++20 模块 `import` 指令的解析:以 import-6 测试用例为例

ctags 对 C++20 模块 `import` 指令的解析:以 import-6 测试用例为例

开发工具CLI 【免费下载链接】ctags A maintained ctags implementation 项目地址: https://gitcode.com/gh_mirrors/ct/ctags 点击查看 免费下载 本指南围绕 universal-ctags 仓库中 Units/parser-cxx.r/import-6.d 测试用例展开,讲解 C 解析器&#x…

2026/10/4 10:52:28 阅读更多 →
AutoDock Vina Python API 完全指南:Vina 类核心方法与亲和力图计算详解

AutoDock Vina Python API 完全指南:Vina 类核心方法与亲和力图计算详解

生物信息学科学计算科研 【免费下载链接】AutoDock-Vina AutoDock Vina 项目地址: https://gitcode.com/gh_mirrors/au/AutoDock-Vina 点击查看 免费下载 本篇技术指南系统梳理 AutoDock Vina 官方文档中面向 Python 的 API 参考页(对应仓库中的 vina.r…

2026/10/4 10:52:28 阅读更多 →

最新新闻

自动扶梯智能监控系统:AI图像识别与功能安全实战解析

自动扶梯智能监控系统:AI图像识别与功能安全实战解析

扶梯旁边贴满了“请站稳扶好”,但真正能管住乘客行为的,从来不是标语。去年我开始做自动扶梯智能监控系统,第一个要回答的问题是:AI图像识别到底能在这个场景里解决什么。传统机械安全回路能在故障发生后触发制动,却没…

2026/10/4 12:55:24 阅读更多 →
AI产物如何沉淀复用?WorkBuddy资料库实现工作流原生知识固化

AI产物如何沉淀复用?WorkBuddy资料库实现工作流原生知识固化

1. 为什么“AI产物”长期处于“用完即弃”的尴尬状态?“WorkBuddy资料库:AI产物终于能沉淀下来了”——这个标题里藏着一个被无数人默认接受、却从未被系统解决的行业隐痛:我们每天用ChatGPT、Claude、Kimi生成的会议纪要、周报草稿、技术方案…

2026/10/4 12:55:24 阅读更多 →
SolidWorks VBA配合开发:装配引擎原理与鲁棒实现方案

SolidWorks VBA配合开发:装配引擎原理与鲁棒实现方案

1. 项目概述:SolidWorks VBA二次开发中“配合”功能的深度实践困境SolidWorks VBA二次开发配合问题——这七个字背后,藏着至少三类工程师的真实焦灼:机械设计工程师想批量创建装配约束却卡在AddMate3返回-1;自动化产线仿真工程师试…

2026/10/4 12:55:24 阅读更多 →
限定领域与开放领域三元组抽取:技术路线与实战指南

限定领域与开放领域三元组抽取:技术路线与实战指南

做知识图谱的人,八成都被非结构化文本喂数据这件事折磨过。数据库里一堆表格好歹能映射,但扔过来几百篇新闻稿、病历描述、法院文书,你能做的第一件事,就是把里面的实体和关系捞出来,整理成 (头实体, 关系, 尾实体) 这…

2026/10/4 12:55:24 阅读更多 →
AI工程从零到落地:大模型应用开发的核心方法与实战指南

AI工程从零到落地:大模型应用开发的核心方法与实战指南

我刚入行那两年,总被一个问题卡住:AI 项目到底该怎么“认真”地做下去?模型会调参、会写 prompt,可一旦要落地成产品,就发现以前那套零散的技能完全不够用。数据、评测、接口、上下文管理、服务质量、成本控制&#xf…

2026/10/4 12:55:24 阅读更多 →
Fibocom LE270模组SDK开发实战:从环境搭建到量产踩坑记录

Fibocom LE270模组SDK开发实战:从环境搭建到量产踩坑记录

LE270-IN-1D3W6-10 这块 Fibocom 模组,我拿到手第一件事是翻 SDK 文档,而不是急着上电。原因很简单:这类无线通信模组看起来就是一块带天线的板子,实际上固件版本、SDK 版本、驱动和三方库之间的匹配关系非常敏感,任何…

2026/10/4 12:54:24 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →