Wireshark保存RTP包后变UDP?根因与修复方法详解

你是不是也遇到过这种怪事:用Wireshark抓RTP包,明明实时预览的时候一切正常,顶部协议栏也明明白白写着“RTP”,但只要一保存文件再打开,RTP就变成了光秃秃的UDP。我之前排查一个语音网关的问题时,抓了一百多个包,现场看着全是RTP,结果保存下来回办公室准备慢慢分析,一打开全是UDP,整个流状态全部丢失,差点以为抓包工具坏了。这个问题看着小,实际会直接废掉后续的RTP流分析、抖动计算、丢包统计,因为Wireshark只有在识别出RTP之后才能给你做语音质量评估、RTCP降级分析这些高级功能。这篇文章把根因和几种靠谱的解决办法一次讲清楚。

1. 问题根因:RTP本来就是“站在UDP肩膀上”的协议

1.1 RTP/UDP和Wireshark解析机制的关系

先说清楚一个最基本的概念:RTP(实时传输协议)绝大多数情况都是运行在UDP之下的。也就是说,在网络链路上真实流动的数据帧是“IP → UDP → RTP”这样的三层结构。IP层负责路由寻址,UDP层提供端口标识和无序传输,而RTP层才承载了时间戳、序列号、SSRC、负载类型这些和音视频同步相关的信息。

Wireshark要做的事,就是抓到原始帧后,先识别出这是一个IPv4或IPv6包,再解析里层的UDP头部,然后根据端口号、净负载特征等因素,决定是否把更内层的包识别成一个RTP包,而不是一个普通的UDP数据段。这里的关键在于:“它是不是RTP”这个结论并不同于“它是UDP”这个物理事实——UDP是这个包的传输封装,RTP是Wireshark对这个包上层内容的解释。

1.2 保存文件到底保存了什么

很多人对“保存文件”有误解,以为保存的是一个带Wireshark分析界面的快照,能够保留你当时看到的“RTP”标签、解码结果、着色规则。但实际上,Wireshark保存到pcap或pcapng文件里的,只是最原始的二层/三层/四层字节流。它保存的是链路上真实传输的0和1,不包含任何“Wireshark认为这是RTP”的解析状态。

这个就相当于你要把一本书分包寄给别人,你手里虽然有“这本是诗集”的标签,但你寄出去的是纯粹的纸页,收件人得自己判断这是诗集还是小说。如果收件人不大认识诗的特点,可能会把它当成普通的文集。Wireshark重新打开pcap时,同样需要重新用启发式规则或手工配置来识别RTP,一旦识别条件不满足,它就不会显示RTP标签,于是你只看到UDP。

1.3 重新打开后解码器状态丢失

还有一个更隐蔽的原因:Wireshark的“Decode As”功能。你在抓包界面里选中一个数据包,右键选择“Decode As”,告诉它把某个UDP端口上的包当作RTP来解析,当下所有的包确实都能显示成RTP,甚至RTP流分析窗口也能正常工作。但这种“解码指示”是存在于当前会话内存里的,不会自动写回pcap文件。一旦保存文件并重新打开,这个临时指示就丢了,Wireshark只能按照默认规则把它当作UDP处理。

尤其当你用的是非标准RTP端口(比如不是常见的5004、5005,而是像30000、31000这种自定义端口)时,重新打开文件后,Wireshark的启发式解析大概率无法自动认出RTP,于是就大量显示为UDP。我遇到过很多次,抓包时因为设置过Decode As所以一直显示RTP,保存后回到默认环境就原形毕露。

2. 快速恢复:打开文件后的两分钟操作

2.1 重新应用Decode As

如果你电脑上已经保存了那个“变成UDP”的pcap文件,别急着重抓,也别懊恼。最直接的办法是重新打开文件后,手工让Wireshark把对应端口解码为RTP。

具体操作路径是:选中任何一个UDP包,右键单击,选择“Decode As”,在弹出的对话框里找到“UDP port”字段,右侧下拉菜单里选择“RTP”,然后点击“确定”。如果你有多个端口,比如数据端口是30000,控制端口是30001,则分别添加两条规则。这一招十秒就能让整个文件里的RTP包全部恢复显示为RTP,如果你处理的是RTSP协商出来的动态端口,这种方法几乎是唯一不重新抓包的途径。

2.2 重建RTP流分析窗口

Decode As设置好之后,RTP包虽然显示出来了,但Telephony菜单下的“RTP Streams”和“VoIP Calls”窗口并不会自动亮起来。你需要去菜单栏的“Telephony → RTP → RTP Streams”里重新把流分析做一遍。这个步骤本质上是让Wireshark重新扫描所有已识别为RTP的包,并根据SSRC、时间戳、序列号重建流表。

之前我遇到的一个典型情况是:打开保存的文件后,Decode As已经恢复出RTP标签了,但RTP Streams窗口却是空的。原因是我没有在“Decode As”里同时设置RTCP端口,而Wireshark做RTP分析时往往需要RTCP来辅助判断同步源、丢包率。把RTCP端口也一并指定为RTP类别,再点“Find Reverse”之类的刷新按钮,流列表就会出来了。

2.3 验证恢复是否成功

看到RTP标签就万事大吉了吗?不一定。我建议在继续分析前做一个快速验证:打开“Telephony → RTP → RTP Streams”,确认里面有流记录,而且流中的包数量与抓包时的包数量基本一致。如果流数量为零,说明包虽然被标记成了RTP标签,但可能SSRC不连续或时间戳乱跳,导致Wireshark没有把它们合并成合法的流,这时候需要回到“Decode As”检查端口。别忘了再点开“Statistics → Protocol Hierarchy”,看一下RTP的百分比。只要这个统计窗口里RTP有占比,就说明当前会话的解析已经正确,接下来就可以放心做抖动、丢包和MOS值分析了。

3. 避免“变UDP”:几种正确的保存姿势

3.1 正确保存整个原始捕获

如果后续还要反复做深度分析,我建议优先保存完整的原始捕获文件,也就是“File → Save As”,格式选择pcapng(默认即可),范围保持“All packets”。这样保存出来的文件,包含了完整的帧、完整的接口信息和数据包注释,回到任何一台装了Wireshark的机器上都能打开做下一步处理。

有人会疑惑:“我保存全量包不还是UDP吗?”对,但注意,保存全量包的目的本来就不是为了保留RTP标签,而是保留完整现场。你只要记住打开文件后重新设置Decode As,或者使用后面第3.3节讲的tshark强制解码命令,就可以稳定恢复。保存全量包的最大好处是没有任何信息损失,万一你对某个包需要看TCP/UDP传输层的窗口、校验和,也都有据可查。

3.2 用显示过滤器保存RTP流,注意过滤条件写法

有些人为了只留RTP包减小文件体积,会用“File → Export Specified Packets”,然后在过滤框里填rtp或rtp.ssrc == ...。这种做法有个隐患:如果当前Wireshark会话里已经正确解析了RTP,那么rtp过滤器确实能筛出这些包;但导出的文件里同样只保存原始帧,不保存解析状态,所以在别的环境下打开,依然需要再次Decode As。这就产生了一个“白忙活”的观感。

更需要注意的坑是,如果导出时你用了udp.port == 30000这类传输层过滤条件,导出后文件里确实只包含该端口的包,但打开后也是UDP,这时候需要设定解码规则才能恢复RTP显示。如果你为了保持流分析的完整性,建议用rtp && !rtcp这类结合了协议解析状态的过滤表达式,并留意导出后还要顺手设置端口解码。

3.3 命令行方案:tshark强制解码

其实最省心的方式是脱离图形界面,直接用tshark命令行,在读取文件的同时强制指定解码规则。这条命令在脚本化、批处理场景下特别好用:

tshark -r capture.pcapng -d udp.port==30000,rtp -d udp.port==30001,rtcp -Y rtp -w rtp_only.pcapng

这条命令的意思是:从capture.pcapng中读取数据包,把30000端口解码为RTP,30001端口解码为RTCP,再过滤出所有RTP包,输出到rtp_only.pcapng。即使后续你用Wireshark打开rtp_only.pcapng,因为文件里已过滤完,并且你已经通过-d参数在写文件时确认了解码规则,这个新文件仍然不会自动带解析信息,所以还是要重新设置,但至少你得到了一个只含RTP包的瘦身文件,后续处理方便很多。

如果你只是想快速看结果,不要求保存,可以这样:

tshark -r capture.pcapng -d udp.port==30000,rtp -qz rtp,streams

最终输出的就是RTP流统计信息,其中包括开始时间、流方向、包数、丢包率、抖动等。我平时做批量质量分析,几乎都是靠这条命令跑几十个文件,比一个个在GUI里点开高效太多。有一点要提醒,-d参数可以叠加,写几个就能解码几个端口,非常灵活。

4. 深入原理:解码器配置与固化技巧

4.1 协议偏好与默认解码设置

既然默认情况下Wireshark可能不自动识别非标准端口的RTP,那我们可以修改Wireshark的协议偏好,让它在打开任何文件时,只要看到特定端口,就自动解码为RTP,省去每次手工设置Decode As的麻烦。

打开“Preferences → Protocols → RTP”,或者直接在“Decode As”对话框里点击“New”创建持久化条目,这些内容会写入Wireshark的配置文件(如decode_as_entries)。这样以后你用Wireshark打开文件,即使该文件里没有PCP标注,只要端口匹配,自动解码规则就会立刻生效。这个技巧对经常分析固定端口RTP流的人尤其有用。

4.2 创建可复用的配置快照

Wireshark的配置文件是可以复制到其他机器的。如果你在办公电脑上设置好了端口30000→RTP、30001→RTCP的持久化规则,想要在出差用的笔记本上复用,可以把配置目录里的decode_as_entries文件一起拷贝过去。配置目录在主菜单“Help → About Wireshark → Folders”里能直接定位到,通常是“Personal configuration”下的路径。

如果你频繁在多个项目之间切换,可以准备几套配置快照。比如一个项目常用端口是5004/5005,另一个项目可能用高端口范围,提前切换配置以后,打开文件时根本不再需要手工干预。这个方法比每次现场临时调Decode As的体验好得多,对长期做VoIP质量保障的人来说属于必会技巧。

4.3 用脚本批处理大批量文件

当你手头有几十个抓包文件需要统一处理时,别再用GUI一个个打开保存,直接用脚本配合tshark最靠谱。假设你有一批文件名是call_01.pcapng到call_30.pcapng,每个文件里RTP端口是动态协商出来的,但都在一个固定小范围内,例如31000到32000之间,你可以用脚本循环处理,并自动生成每个流的CSV统计报告:

for f in call_*.pcapng; do tshark -r "$f" -d "udp.port==31000,rtp" -d "udp.port==31001,rtcp" \ -T fields -e frame.time_epoch -e rtp.ssrc -e rtp.seq -e rtp.timestamp \ -Y rtp > "${f%.pcapng}.csv" done

输出到CSV以后,你可以用Python或Excel透视表做丢包率、抖动、延迟的分析。这样一来,Wireshark保存变不影响你的自动化流程,因为每条命令在读取数据时都指定了明确的解码方式。把我的经验讲得更直白一点:GUI适合交互式排障,而批量、长期、稳定性的分析,命令行永远比界面更值得信任。

5. 常见问题与排查技巧实录

5.1 保存后为什么包数量减少了

有人会发现“Export Specified Packets”保存后,新文件里包的数量比当前显示器里看到的少。最常见的原因是你用了rtp作为显示过滤器,但当前会话里有一部分RTP包没有被正确识别为RTP,于是真实存在的包被无声无息地丢弃了。解决办法是在保存前先用“Statistics → Protocol Hierarchy”确认RTP的识别范围。如果你发现大量端口为自定义值的UDP包其实是你预期的RTP包,但没有被识别,就需要先设置Decode As,再过滤导出。

5.2 RTP Streams窗口明明打开却是空列表

这种情况绝大多数是因为没有同时配置RTCP解码。Wireshark的RTP流分析器在重建流表的时候,需要RTP包与RTCP包互相参考。如果一个数据流只有RTP没有RTCP,有时也能分析,但很多时候会因为缺少辅助信息而拒绝建流。你在Decode As里将数据端口和RTCP端口都指定为RTP/RTCP后,再回到流的窗口,点击刷新,列表通常就会显示的。另一个小坑是,文件里同时存在多个SSRC,导致Wireshark把同一路通话拆成了多个流,如果你预期是一路通话,留意一下是不是SSRC在通话中切换过,或存在NAT导致的端口变化。

5.3 为什么有些来源/目标端口相同的包还是显示UDP

当同一端口上同时跑了RTP和RTCP时,Wireshark虽然有办法区分,但如果你只是在Decode As里设置了UDP port 30000 = RTP,那么所有来自30000端口的包都会被强制标记为RTP,包括那些实际是RTCP的包,导致RTCP内容被当成RTP解析,出现乱码。解决办法是准确区分数据端口和控制端口,分别设置。如果RTP和RTCP共用同一个端口(这种情况不太常见,但在某些私有协议里会见到),你则需要根据包的负载类型和RTCP的包头特征手工判断,可以用rtcp显示过滤器来帮助区分。

5.4 如何确认我保存的文件是否已经“修好”

我的习惯是先把文件复制一份,再用tshark跑一条快速命令验证:

tshark -r new_file.pcapng -d udp.port==30000,rtp -q -z rtp,streams

如果输出的流统计信息包含完整的流数量、丢包率、最大抖动,那么这个文件在Wireshark里手工设置Decode As后,一定能正常分析。这个方法比用GUI肉眼快速看完所有包更靠谱,因为统计信息是经过量化验证的。如果流统计为空,那说明你设定的端口不对,或者这些包根本不是RTP,需要进一步检查。

6. 一个实战案例:某VoIP网关排障中的“伪UDP”处理

说一个我印象很深的案例。某个项目里,客户报语音断续严重,我在核心交换机上做了端口镜像,抓了大约3分钟数据。现场看的时候,因为Wireshark自动识别了端口5004,所有语音包都正确显示RTP,我也顺利看到了RTP Streams窗口里两条绿色流。然而当时来不及详细分析,我保存了pcap文件带回办公室,一打开傻眼了——全部变成UDP了。

那时我还没养成“保存时顺手用tshark验证”的习惯,心里一阵发慌。后来我仔细回忆,这个VoIP网关并没有用标准端口5004,而是采用了随机动态端口。现场之所以显示RTP,是因为Wireshark的启发式解析加上我在实时抓包时做过一次Decode As。保存的时候我没有意识到,这个临时解析状态不会写入文件,所以到了办公室就全部打回原形。

解决过程花了大约三分钟:我先用tshark打开文件,用-d udp.port==45000,rtp强制解码,发现输出里立刻出现了RTP标签。接着我用-q -z rtp,streams看到了两路RTP流,确认端口无误。最后我用editcap配合tshark,把两路流各自提取成单独的pcap文件,再从中计算出丢包率、抖动。整个过程没有重新去现场抓包,也完全修复了保存后变为UDP的问题。

这个案例给我的教训是:在抓包现场如果要保存文件,最好在Saving的同时用命令行验证一次解码规则;如果当时就发现问题,可以直接在保存前设置好Decode As。以上这两个习惯,能帮你省下一晚上的郁闷时间。

7. 最后的几条实操心得

  • 如果你只关心RTP的载荷和序号的排序,对于恢复RTP标签并没有硬性必要,但只要是涉及抖动、MOS、丢包率分析,就必须让Wireshark正确识别RTP,否则它不会计算任何质量指标。
  • 在Decode As对话框中,不要勾选“强制使用这个解码器”以外的选项,否则可能会把RTCP或者其他UDP业务也一并影响。
  • 在保存文件时,建议同时保存一个text导出版本,用“File → Export Packet Dissections → As Plain Text”输出为可读文本。这样即便以后重新打开失效,还有一个带呈现层信息的结果供查阅。
  • 遇到图像、编码不规则的RTP包时,可先检查RTP的负载类型(PT值)。PT值在动态范围内(96到127)时,很可能就是协商决定的音视频编码,Wireshark未必能自动识别编码名称,但RTP解析不受影响。

就我个人的工作习惯,现在但凡是抓音视频相关的包,我都不直接只依赖GUI保存后重新打开这种操作。最重要的不是背住某个按钮的位置,而是记住“抓包文件里存的是原始帧,而不是分析结果,任何解析都是临时状态”。只要建立起这个基础认知,以后再看到RTP变成UDP,你心里就有底了——它一直都在那儿,只是Wireshark暂时没认出来而已。

相关新闻

AI事故频发的四大根因与系统防御策略

AI事故频发的四大根因与系统防御策略

1. 案例全景:十个引发广泛讨论的AI事故1.1 推荐算法放大虚假信息某大型内容平台曾发生一起标志性事件。一个不知名账号发布了一条完全虚构的所谓“重大新闻”,内容荒诞、错漏明显,但平台推荐引擎在几分钟内将它推送给数十万人。消息传到另一个…

2026/10/21 5:12:04 阅读更多 →
ADK-Python安全令牌传递机制:Agent身份穿越与防护实践

ADK-Python安全令牌传递机制:Agent身份穿越与防护实践

你们有没有遇到过这种情况:Agent 每执行一步都要去调第三方 API,令牌在工具函数里传了一圈,最后不知怎么就打到日志里了。我最早做多工具 Agent 的时候,就是这么把生产环境的 API Key 打满了一整个日志面板。标题里这个“Google A…

2026/10/21 5:12:04 阅读更多 →
Qt5下QFTP文件包接入实战:解决undefined reference与工程迁移

Qt5下QFTP文件包接入实战:解决undefined reference与工程迁移

简介:QT5移除了内置QFTP模块,使依赖FTP功能的开发者面临重新实现客户端能力的难题。这份资源正面向需要自建QT5 FTP模块的C开发者,提供一套可运行的QFTP实现,支持FTP连接、用户登录、服务器目录切换与列表获取,并留有扩…

2026/10/21 5:12:04 阅读更多 →

最新新闻

Elasticsearch集群安全配置:TLS/SSL与密钥库管理全解析

Elasticsearch集群安全配置:TLS/SSL与密钥库管理全解析

给Elasticsearch集群做安全配置这件事,远比想象中麻烦。很多人以为在elasticsearch.yml里加几行TLS/SSL配置就能收工,结果往往是节点之间互相不认证书、Kibana连不上、客户端报handshake failed,最后只能回滚。我这次把一套三节点ES集群从裸H…

2026/10/21 5:49:18 阅读更多 →
嘎嘎降AI实战教程:从注册到多轮降重,让AI文本更自然

嘎嘎降AI实战教程:从注册到多轮降重,让AI文本更自然

"嘎嘎降AI"这名字听起来有点随意,但用起来确实能解决一个实际问题:AI生成的内容,如何改得更像人写的。很多朋友现在写材料、做方案、写公众号,第一稿都习惯让AI对话软件先起个草,然后再自己改。可草稿一到手…

2026/10/21 5:49:18 阅读更多 →
广播、未知、同网、异网:交换机转发与排障核心解析

广播、未知、同网、异网:交换机转发与排障核心解析

干网络这行久了,最常被新人追问的一个问题是:交换机把一个帧从某个端口收进来之后,它凭什么决定从哪个端口送出去?教科书上会讲查MAC地址表、泛洪、丢弃,但真到排障时,大家还是容易懵。后来我发现&#xff…

2026/10/21 5:49:18 阅读更多 →
嘎嘎降AI工具详解:从注册到实操的AI文本自然化处理指南

嘎嘎降AI工具详解:从注册到实操的AI文本自然化处理指南

“你手头有一段AI生成的文章,第一眼读起来特别工整,逻辑也没什么毛病,但总觉得有点‘板’,像戴着面具在说话”——这就是我最初接触到“嘎嘎降AI”这个工具时最想解决的问题。它不是用来做文案初稿的,也不是单纯改错别…

2026/10/21 5:49:18 阅读更多 →
技能管理系统:从技能地图到刻意练习的完整框架

技能管理系统:从技能地图到刻意练习的完整框架

很多人看到“skills”这个词,第一反应是“又一篇讲职场技能提升的文章”。但我今天想换个角度聊:技能不是一个名词,而是一套需要持续维护的系统。你收藏过一堆课程、买过一堆书、报过训练营,最后真正变成自己能力的,其…

2026/10/21 5:49:18 阅读更多 →
AI信息挖掘实战:从提问到交叉验证,把碎片信息串成认知

AI信息挖掘实战:从提问到交叉验证,把碎片信息串成认知

元旦的钟声刚敲过,我猜不少人正把“新的一年多学点东西、把手头的事做精”写进计划表。这几天我发现一个很有意思的现象:大家不是不想查资料,而是被资料淹没了。打开浏览器想看某个行业的最新动态,结果十条链接里八条是去年的&…

2026/10/21 5:48:18 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →