SCPI标准命令解析:从语法到实践,构建高效自动化测试系统
1. 项目概述SCPI仪器世界的“普通话”如果你在电子测量、自动化测试或者研发实验室里待过大概率会听过GPIB、VISA或者“程控仪器”这些词。在这些场景背后让一台电脑能够精确指挥示波器、信号源、电源、万用表等五花八门仪器协同工作的正是我们今天要深入拆解的SCPIStandard Commands for Programmable Instruments可编程仪器标准命令。你可以把它理解为仪器界的“普通话”。想象一下如果没有SCPI每家仪器厂商都用自己的方言私有命令集来通信。你想让A家的电源输出5V电压得用VOLT 5想让B家的电源做同样的事可能就得用SET:VOLTAGE 5.00。当你搭建一个包含十几台不同品牌仪器的自动化测试系统时光是为了记住这些五花八门的命令写代码和维护的复杂度就会呈指数级上升调试更是噩梦。SCPI的出现就是为了解决这个“巴别塔”问题。它定义了一套标准化的命令语法、语义和结构让不同厂商、不同类型的仪器能够用同一种“语言”进行交流。对于测试工程师、研发人员或任何需要与仪器打交道的从业者来说掌握SCPI不是一项“加分技能”而是构建高效、可靠、可维护自动化测试系统的核心基础能力。它能让你从繁琐的、设备相关的底层命令中解放出来更专注于测试逻辑和数据分析本身。2. SCPI指令的核心设计哲学与语法解析SCPI不仅仅是一套命令列表其背后有一套严谨的设计哲学。理解这些你才能更好地运用它而不是死记硬背命令。2.1 树状分层命令结构SCPI命令采用清晰的树状结构类似于文件系统的路径。这种结构具有极强的扩展性和可读性。一个完整的SCPI命令通常如下所示:[ROOT]:SUBSYSTEM:COMMAND?冒号:作为层级分隔符。顶层的冒号可以省略但显式写出能使结构更清晰。ROOT根节点通常表示一个主要的功能子系统例如SENSE测量设置、SOURCE信号源设置、OUTPUT输出控制、SYSTEM系统设置等。SUBSYSTEM子系统在根节点下的进一步功能划分。COMMAND命令具体的操作指令。举例拆解假设我们有一台数字万用表DMM想要设置其直流电压测量功能量程为10V分辨率为6.5位。选择测量功能:SENSE:VOLTAGE:DC:RANGE 10SENSE根节点表示测量/感知相关设置。VOLTAGE:DC子系统指定为直流电压测量。RANGE命令设置量程。10参数量程值为10V。设置分辨率:SENSE:VOLTAGE:DC:RESOLUTION 0.0001沿用了SENSE:VOLTAGE:DC的路径。RESOLUTION命令设置分辨率。0.0001参数分辨率值对应6.5位10V量程下最小可分辨1mV。触发一次测量并读取结果:READ?READ?是一个常用复合命令。在万用表上下文中它通常隐含了执行一次由:SENSE子系统配置好的测量并将结果返回。注意命令中的空格至关重要。空格用于分隔命令和其参数。RANGE 10是正确的RANGE10则会被仪器认为是非法命令。2.2 命令类型设置、查询与公共命令SCPI命令主要分为三类设置命令Setting Commands用于配置仪器参数。通常**没有问号?**结尾。示例:SOURCE:VOLTAGE:LEVEL 3.3设置电源输出电压为3.3V示例:TRIGGER:DELAY 0.001设置触发延迟为1ms查询命令Query Commands用于从仪器读取当前设置或测量数据。总是以问号?结尾。示例:MEASURE:VOLTAGE:DC?查询当前的直流电压测量值示例:SOURCE:VOLTAGE:LEVEL?查询电源当前设置的电压值查询命令的返回值通常是字符串或数值需要通过程序解析。公共命令Common Commands以星号*开头是SCPI标准强制要求所有兼容仪器必须支持的命令。它们独立于仪器的树状结构提供最基础的控制功能。*IDN?查询仪器标识符。这是你连接一台新仪器后第一个应该发送的命令返回信息通常包含厂商、型号、序列号、固件版本。这是调试和确认连接的黄金命令。*RST将仪器复位到出厂默认状态。在测试脚本开始时发送此命令可以确保仪器处于已知的初始状态避免之前测试的残留设置影响本次结果。*OPC?查询操作完成状态。当仪器执行一个耗时较长的操作如频率扫描、校准时发送此查询会等待操作完成后才返回“1”。在编程中常用它来实现同步。*CLS清除状态寄存器。用于清除错误队列和事件状态。*TST?执行自检并返回结果0通常表示通过。2.3 参数格式与数据类型SCPI命令的参数支持多种格式增强了灵活性数值参数可以是整数、浮点数支持科学计数法如1.5E-3。离散参数从一个预定义的集合中选取如ON/OFFMAX/MINAUTO。示例:OUTPUT ON打开输出示例:SENSE:VOLTAGE:DC:RANGE MAX设置量程为最大值布尔参数通常用1/0或ON/OFF表示。字符串参数用引号括起来如:DISPLAY:TEXT “TESTING”。3. 从理论到实践搭建你的第一个SCPI控制环境理解了语法我们来看看如何在实际中操作。这里不依赖任何特定的自动化测试框架如NI LabVIEW、TestStand我们从最通用的编程语言Python和通信接口TCP/IP USB-TMC GPIB转接入手。3.1 硬件连接与接口选择现代仪器通常支持多种程控接口你需要根据实际情况选择LANLXI/ Ethernet目前最主流、最推荐的方式。仪器通过网线连接到局域网使用TCP/IP协议通信。优势是速度快、距离远、成本低无需额外硬件且便于远程访问。USB-TMC (USB Test Measurement Class)即插即用使用标准USB线缆。在PC上通常需要安装厂商提供的IVI或VISA驱动。适合桌面单机测试。GPIB (IEEE-488)传统工业标准稳定可靠但线缆和接口卡昂贵速度较慢。目前多用于连接老旧设备或对电磁干扰要求极高的场合。RS-232串口现在已较少见速度慢连线复杂。实操建议优先选择LAN接口。它不仅免去了购买昂贵GPIB卡和线缆的成本还使得你的测试站部署更加灵活。你可以将仪器放在机柜里用一台工控机通过交换机控制所有仪器。3.2 软件准备PyVISA与NI-VISA在PC端我们需要一个“翻译官”来管理不同接口的通信细节这个翻译官就是VISA (Virtual Instrument Software Architecture)库。NI-VISA是业界最常用的实现。而PyVISA是一个Python库它提供了对VISA库的Python绑定让我们能用Python简洁地发送SCPI命令。安装步骤安装NI-VISA Runtime访问NI官网下载并安装适合你操作系统的NI-VISA Runtime免费。这是底层通信的基础。安装PyVISA在命令行中使用pip安装。pip install pyvisa验证安装安装完成后打开Python交互环境执行以下命令列出所有连接的仪器资源。import pyvisa rm pyvisa.ResourceManager() print(rm.list_resources())如果一切正常你会看到一个列表可能包含类似TCPIP0::192.168.1.100::inst0::INSTRLAN设备或USB0::0x1234::0x5678::SN001234::INSTRUSB设备的字符串。这个字符串就是仪器的“地址”Resource String。3.3 第一个控制脚本与仪器“握手”假设我们通过LAN控制一台吉时利Keithley的六位半数字万用表DMM6500其IP地址是192.168.1.100。import pyvisa import time # 1. 创建资源管理器 rm pyvisa.ResourceManager() # 2. 使用VISA资源字符串打开仪器连接 # 格式TCPIP0::IP地址::inst0::INSTR dmm_address TCPIP0::192.168.1.100::inst0::INSTR try: dmm rm.open_resource(dmm_address) # 3. 设置超时时间单位毫秒非常重要 dmm.timeout 10000 # 10秒超时 # 4. 清空仪器缓冲区良好习惯 dmm.clear() # 5. 首次通信查询仪器ID idn dmm.query(*IDN?) print(fConnected to: {idn.strip()}) # 6. 复位仪器到已知状态 dmm.write(*RST) time.sleep(1) # 给仪器一点复位时间 # 7. 配置一个简单的直流电压测量 # 设置测量功能为直流电压 dmm.write(SENSE:FUNCTION “VOLT:DC”) # 设置量程为自动 dmm.write(SENSE:VOLTAGE:DC:RANGE:AUTO ON) # 设置分辨率为6.5位0.0001 dmm.write(SENSE:VOLTAGE:DC:RESOLUTION 0.0001) # 8. 触发一次测量并读取 reading dmm.query(READ?) print(fVoltage Reading: {reading.strip()} V) # 9. 连续读取10次 for i in range(10): reading dmm.query(READ?) print(fReading {i1}: {reading.strip()} V) time.sleep(0.5) except pyvisa.errors.VisaIOError as e: print(fVISA IO Error: {e}) except Exception as e: print(fOther Error: {e}) finally: # 10. 无论如何最后关闭连接 if dmm in locals(): dmm.close() rm.close()代码关键点解析open_resource建立连接。资源字符串是关键格式必须正确。timeout务必设置。否则如果仪器无响应程序会永远挂起。write()用于发送设置命令无问号。query()用于发送查询命令有问号它等价于先write(command?)再read()是更便捷的“一问一答”方式。*RST和*IDN?公共命令的典型应用。clear()和close()良好的资源管理习惯避免连接残留。4. 高级应用与编程模式掌握了基础通信后我们需要考虑更复杂、更稳健的自动化测试场景。4.1 错误处理与状态报告仪器执行命令可能出错如参数超限、硬件故障。健全的程序必须能捕获并处理这些错误。SCPI仪器通过状态寄存器组来报告其状态。最常用的是标准事件状态寄存器ESR和错误队列。最佳实践在关键操作后检查错误。def check_errors(instrument): 查询并清除仪器的错误队列 error_list [] while True: err instrument.query(SYSTEM:ERROR?) code, message err.strip().split(,, 1) code int(code) if code 0: # “No error” 代码为0 break error_list.append((code, message.strip())) return error_list # 在可能出错的操作后调用 dmm.write(SENSE:VOLTAGE:DC:RANGE 1000) # 假设量程设置过大 errors check_errors(dmm) if errors: print(Instrument Errors Found:) for code, msg in errors: print(f Code {code}: {msg}) # 可以选择抛出异常或进行其他处理 else: print(No errors.)4.2 提高通信效率二进制数据传输当需要读取大量数据时如示波器波形、频谱分析仪轨迹使用ASCII格式query(DATA?)传输效率极低。SCPI支持二进制数据传输速度可提升一个数量级。# 以示波器读取波形为例 scope.write(DATA:SOURCE CH1) # 设置数据源为通道1 scope.write(DATA:ENCdg SRIBINARY) # 设置编码为有符号整数二进制常用 scope.write(DATA:WIDTH 2) # 设置数据宽度为2字节 scope.write(DATA:START 1) # 设置起始点 scope.write(DATA:STOP 10000) # 设置结束点 # 关键使用 query_binary_values 方法 scope.write(CURVE?) # 读取二进制数据 ‘h’ 表示数据类型为16位有符号整数short waveform_data scope.query_binary_values(CURVE?, datatypeh, containernp.array) print(fRead {len(waveform_data)} points.) # waveform_data 现在是NumPy数组便于后续处理注意事项二进制传输时必须严格匹配仪器设置的编码ENCdg和数据宽度WIDTH否则读出的数据是乱码。务必查阅仪器编程手册。4.3 同步与触发控制自动化测试中经常需要多台仪器同步工作例如信号源输出一个脉冲的同时示波器开始捕获。这依赖于SCPI的触发系统。一个典型的触发链路由触发总线如GPIB的TRG线或LAN的TRIGGER命令或软件触发命令*TRG来完成。示例用一台函数发生器触发一台示波器配置示波器scope.write(TRIGGER:A:EDGE:SOURCE CH1) # 触发源为CH1 scope.write(TRIGGER:A:LEVEL 1.0) # 触发电平1V scope.write(TRIGGER:A:SWEEP NORMAL) # 触发模式为Normal等待触发 scope.write(ACQUIRE:STATE STOP) # 先停止采集配置函数发生器fgen.write(SOURCE1:FUNCTION PULSE) fgen.write(SOURCE1:PULSE:WIDTH 1e-6) fgen.write(SOURCE1:VOLTAGE:AMPLITUDE 2.5) fgen.write(TRIGGER:SOURCE BUS) # 触发源为总线等待*TRG命令执行同步scope.write(ACQUIRE:STATE RUN) # 示波器开始等待触发 time.sleep(0.1) # 短暂延时确保状态就绪 fgen.write(*TRG) # 向信号源发送软件触发它开始输出脉冲 # 脉冲边沿到达示波器CH1满足触发条件示波器捕获波形 time.sleep(0.05) # 等待捕获完成 waveform scope.query_binary_values(CURVE?, datatypeh)5. 调试技巧与常见问题实录在实际项目中SCPI编程的难点往往不在于命令本身而在于调试和排错。5.1 问题排查清单问题现象可能原因排查步骤连接失败(VisaIOError)1. 地址错误2. 防火墙/网络问题3. 仪器未开启远程控制4. VISA驱动未正确安装1. 用rm.list_resources()确认地址。2. Ping仪器IP检查仪器Web界面如有。3. 检查仪器前面板菜单确保“远程接口”如LAN, USB已启用。4. 重新安装NI-VISA或尝试使用PyVISA的py后端 (rm ResourceManager(py))。命令无响应/超时1. 命令语法错误2. 仪器正在执行长任务如校准3. 输出未开启1.使用仪器前面板手动输入命令这是最直接的验证方法。2. 发送*OPC?查询操作是否完成。3. 对于电源、信号源检查是否发送了:OUTPUT ON。返回数据格式错误1. 查询命令与读取方式不匹配2. 二进制传输参数不匹配1. 确认用的是query()用于返回文本的查询还是read()用于读取特定输出。2. 核对二进制传输的ENCdg和WIDTH设置与query_binary_values的datatype参数是否对应。测量结果不稳定/不准1. 仪器未预热2. 接地或屏蔽不良3. SCPI命令配置冲突或顺序错误1. 高精度仪器如DMM需要至少30分钟预热。2. 检查测试夹具和线缆。3.重置仪器*RST后按逻辑顺序重新发送配置命令。避免残留设置干扰。5.2 我的实操心得与“坑”养成“重置-配置”的习惯在测试脚本的开头务必发送*RST。仪器可能被之前的操作包括前面板操作置于一个未知状态。从一个干净的默认状态开始配置是保证结果可重复性的第一原则。善用仪器手册的“编程示例”章节不要只查命令字典。手册中的编程示例章节通常提供了完整的、最优的配置流程和命令序列直接借鉴可以避免很多低级错误。超时设置是生命线永远不要使用默认超时。根据操作合理设置简单查询设1-2秒复杂测量如万用表高分辨率模式设10-30秒校准或扫描操作可能需要几分钟。超时后程序应能优雅地捕获异常并记录日志而不是卡死。小心字符串参数中的空格和引号SENSE:FUNCTION “VOLT:DC”和SENSE:FUNCTION “VOLT: DC”冒号后多了一个空格对于某些严格的仪器解析器来说可能是不同的。最稳妥的方式是严格按照手册示例书写。LAN接口的“双刃剑”LAN方便但也意味着仪器可能被网络中其他电脑误操作。在生产测试环境中务必为测试专用的仪器设置静态IP并将其置于一个独立的、物理或逻辑隔离的网络段中避免与办公网络冲突。记录原始命令与响应在开发调试阶段启用PyVISA的日志功能或者简单地将所有发送和接收的字符串打印到文件。当出现问题时这份日志是无价的。dmm rm.open_resource(address) dmm.read_termination \n # 设置正确的终止符 dmm.write_termination \n # 简易日志 def logged_write(cmd): print(f”[SEND] {cmd}“) dmm.write(cmd) def logged_query(cmd): print(f”[SEND] {cmd}“) resp dmm.query(cmd) print(f”[RECV] {resp.strip()}“) return resp掌握SCPI就像掌握了与整个仪器王国对话的钥匙。它剥离了不同设备外观和品牌的差异直抵其功能核心。从简单的单次测量到复杂的多设备同步测试系统其底层逻辑都离不开这些标准化的命令。花时间深入理解其树状结构、命令分类和同步机制在搭建自动化测试平台时你将拥有清晰的思路和高效的排错能力从而让仪器真正成为你延伸的、精准的“手”和“眼”。

相关新闻

Steam成就管理器:三步解锁游戏成就的终极指南

Steam成就管理器:三步解锁游戏成就的终极指南

Steam成就管理器:三步解锁游戏成就的终极指南 【免费下载链接】SteamAchievementManager A manager for game achievements in Steam. 项目地址: https://gitcode.com/gh_mirrors/st/SteamAchievementManager Steam成就管理器(Steam Achievement …

2026/10/14 7:20:05 阅读更多 →
AtlasOS技术深度解析:基于Playbook架构的Windows系统优化设计哲学

AtlasOS技术深度解析:基于Playbook架构的Windows系统优化设计哲学

AtlasOS技术深度解析:基于Playbook架构的Windows系统优化设计哲学 【免费下载链接】Atlas 🚀 An open and lightweight modification to Windows, designed to optimize performance, privacy and usability. 项目地址: https://gitcode.com/GitHub_Tr…

2026/10/3 19:09:24 阅读更多 →
TPFanCtrl2:ThinkPad双风扇终极控制指南 - 免费降低噪音提升性能

TPFanCtrl2:ThinkPad双风扇终极控制指南 - 免费降低噪音提升性能

TPFanCtrl2:ThinkPad双风扇终极控制指南 - 免费降低噪音提升性能 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 TPFanCtrl2是一款专为ThinkPad双风扇机型设…

2026/10/9 18:12:48 阅读更多 →

最新新闻

MATLAB共享储能电站冷热电多微网双层优化配置模型详解

MATLAB共享储能电站冷热电多微网双层优化配置模型详解

先说一句啊,这篇不是那种把模型往纸上一放、公式一抄就完事的论文复现,而是基于“MATLAB共享储能电站服务冷热电多微网系统双层优化配置模型”这条线,把建模思路、求解路线、MATLAB实现细节和踩坑经验一次性捋清楚。如果你想做园区级综合能源…

2026/10/14 7:20:37 阅读更多 →
90天PMP通关攻略:专治拖延症的反人性备考技巧

90天PMP通关攻略:专治拖延症的反人性备考技巧

2026年6月PMP考试:一场与“拖延症”的终极对决!90天通关全攻略(内附反人性备考技巧)如果有人问我,PMP考试难在哪,我大概率会说:难在开始。2026年6月那场考试,我提前90天就买好了教材…

2026/10/14 7:20:37 阅读更多 →
电商数据获取技术解析与实战架构设计

电商数据获取技术解析与实战架构设计

1. 电商数据获取的核心价值与挑战在电商行业摸爬滚打这些年,我深刻体会到数据就是决策的氧气。记得2016年刚入行时,团队还在用Excel手动统计商品点击量,现在回头看简直像石器时代。如今一个中等规模的电商平台,日均产生的用户行为…

2026/10/14 7:20:37 阅读更多 →
豆瓣电影排行榜高级爬虫实战:从请求构造到数据存储的完整链路

豆瓣电影排行榜高级爬虫实战:从请求构造到数据存储的完整链路

很多人学网络爬虫时,第一个练手项目都会选豆瓣电影排行榜的数据抓取。理由很简单:页面结构清晰、数据规律、难度适中。但如果你以为requests拿到HTML、正则抠出几条电影名就算学会了爬虫,那离真正的高级数据抓取还差着十万八千里。我见过不少…

2026/10/14 7:20:37 阅读更多 →
做Temu多久能看到收益?回款周期与利润真相深度拆解

做Temu多久能看到收益?回款周期与利润真相深度拆解

做Temu多久能看到收益?这个问题几乎每个新入局的人都问过,但网上的答案特别极端:一边是晒后台截图说上架三天就出单的,一边是吐槽备货压了几万块却迟迟见不到钱的。我跟几个做全托管、半托管的朋友反复对过账,也盯着后…

2026/10/14 7:20:37 阅读更多 →
AI编程教程为何爆火2万Star:从零基础到生产落地的完整路径

AI编程教程为何爆火2万Star:从零基础到生产落地的完整路径

1. 这个“2万Star”到底意味着什么:从GitHub数字看AI编程教程的真实分量很多人看到标题里“2万Star”第一反应是:哇,火了。但作为在开发者教育领域摸爬滚打十多年的老手,我得先泼一盆冷静的水——Star数从来不是教学内容质量的直接…

2026/10/14 7:19:37 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29: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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →