ESP32 AEC回声消除失效排查:参考信号与硬件失真才是关键
先说我自己的真实现场。手头一个基于ESP32的语音对讲盒子平时录个音、发个指令都正常一接入双向通话对方就反复喊“喂那边怎么有我的声音迟了半拍又回来了”。我当时第一反应是AEC没开去配置里翻了一圈“回声消除”选项确实亮着。可实测下来只要对方一说话本地录音里就有清晰的、带延迟的自己的回声。后来把整套东西完整拆了一遍才发现事情远不是“开启/关闭”一个开关这么简单。这篇就把这个问题说透ESP32语音设备明明开了AEC却仍然能听到自己的声音背后有哪些环节在掉链子以及到底该按什么顺序排查。这个问题不是个例。做过语音对讲、会议终端、智能音箱改造的人都懂AEC几乎是最容易“配置对了但效果不对”的模块。很多人甚至怀疑是算法能力不行其实大多数情况是参考信号接错路、采样率不对齐、功放失真、硬件布局埋雷这些更底层的事。下面按我实际排查的顺序展开全程可复现。1. AEC不是你以为的“录放屏蔽”先看它到底在消除什么1.1 回声从哪来一条通话链路里的信号流向语音设备里的回声本质是扬声器播放出去的声音经过空气、墙壁、桌面、机身外壳等路径又回到了麦克风。在远程通话场景中你听到的是“对方的声音从你的喇叭出来再被你的麦克风收走发回给对方”——所以扬声器开得越响、麦克风离得越近、房间反射越多回声就越明显。很多人以为AEC是“喇叭响的时候麦克风自动闭麦”这是最大的误解。AEC从来不是录放屏蔽它的工作逻辑是在麦克风信号里把“由扬声器播放信号所产生的那部分声音”减去。它依赖的是信号处理和算法估计不是开关切换。1.2 自适应滤波器的“抄作业”原理AEC的核心是一个自适应滤波器。它拿到两路输入参考信号也就是送去喇叭播放的那段数字音频。麦克风信号也就是麦克风实际采集到的声音里面混着近端说话人声、环境噪声以及扬声器回声。滤波器假设回声 参考信号经过某个“回声路径冲激响应”的卷积结果。它通过算法不断调整这个脉冲响应生成一段拟回声再从麦克风信号里减去。用大白话说AEC是在“抄作业”。它手里有教科书参考信号先算出麦克风里的回声大概长什么样然后在采集信号里把这一部分勾掉。这种自适应算法对“线性、平稳、可预测”的回声路径效果极好对非线性、突变的东西基本无效——这是理解AEC边界的关键。1.3 AEC的三个内在边界线性、延迟、非线性失真第一个边界是线性。自适应滤波器假设回声路径是线性时不变系统。喇叭和功放一旦失真、削波回声里就会出现“参考信号里没有的频率分量”这种非线性成分是滤波器无法建模的。第二个边界是参考信号一致性。算法只认喂进来的参考信号如果参考信号和喇叭真正播出的声音在时间轴或波形上对不上再聪明也消不干净。第三个边界是时间覆盖窗口。滤波器只能估计有限长度内的回声路径如果回声从播放到被麦克风收到的时间超过这个窗口残余就漏在外面。这三条边界决定了排查方向。出现“开了AEC还听到自己”99%都能落到这三条边界被打破上。下面逐一展开。2. 参考信号接错路AEC等于对着空气消回声2.1 参考信号必须“看到”喇叭真正播出的东西在ESP32上做语音方案时AEC往往作为一个独立模块要求输入近端麦克风信号和参考信号。很多人的做法是把麦克风采集信号传给AEC参考信号则随手从某个处理后的音频流里拉出来。这个“随手”就是问题根源。看一个对比示例这是我调试时常用来说明问题的伪代码// 错误示例把经过降噪/AGC处理后的输出当参考信号 audio_in mic_read(); // 麦克风采集 aec_ref audio_in; // 错这是近端信号不是参考信号 processed aec_process(aec_ref, audio_in); // 正确示例参考信号必须来自播放路径 dac_out render_audio_to_buffer(); // 即将送入DAC/功放的数据 aec_ref dac_out; // 参考信号从播放链路里取 mic_in mic_read(); processed aec_process(aec_ref, mic_in);参考信号必须取在“最靠近喇叭播放”的那条数字音频流上最好就是DAC之前、音量控制之后的最终数据。如果取在音量控制之前喇叭实际播放的音量和参考信号的幅值不匹配AEC还要花大量时间重新收敛如果取在播放路径里经过EQ、动态范围压缩等处理后的数据那AEC看到的“教科书”是处理后的版本与喇叭工作状态一致反而相对合理。我在实际板子上试过最典型的错误是把AEC的参考信号配置成降噪模块的输出结果AEC始终在尝试消除“近端说话人的声音”那当然越消越糟。2.2 采样率不一致AEC处理的16k和I2S播放的48k是两套时钟ESP32的I2S一般工作在48kHz或者44.1kHz作为音频主时钟而AEC处理内部经常默认在16kHz下做自适应估计。如果参考信号和麦克风信号没有经过统一的重采样对齐两路数据在时间轴上对不齐AEC看到的参考信号和喇叭实际播放的波形是错位的就算把tail length拉到最大也收敛不了。具体表现是AEC的抑制深度有限回声残余呈现“模糊的、不稳定的嗡声”而且会随着音量大小变化时好时坏。检查方法很简单在调试日志里把参考信号和麦克风信号的采样率、帧长、时间戳全部打印出来看是不是同一个时钟源。一个稳妥做法是把参考信号和近端信号都强制重采样到AEC内部统一采样率通常16kHz再用同一套帧结构送入AEC而不是让I2S回调只管播放、AEC模块自己另起一个采样率。ESP32语音框架里一般都有现成的重采样组件宁可多花一点CPU也不要省这一步。2.3 音量削波参考信号干干净净喇叭却已经失真这是我踩过最深的一个坑。I2S里的参考信号是一个完美的满幅正弦但D类功放为了追求响度把增益拉满实际喇叭输出的波形已经被削顶了。AEC拿着原始正弦去建模麦克风收到的却是顶部被切平的“近正方波”两者的谐振频率、谐波成分天差地别怎么消判断削波不需要示波器。用一个稳定的1kHz正弦测试信号通过喇叭播放同时用麦克风录音然后打开波形软件看录音波形顶部。如果看到明显的平顶半数以上的幅度被切平那基本就是功放输入增益过高。解法也很直接降低功放输入增益保证正常工作音量下不进入削波区。在播放链路里加限幅器(limiter)或软削波处理让参考信号和喇叭出声继续保持线性关系。如果产品需要极限响度AEC参考信号就要取“经过限幅器处理后的数据”而不是限幅器前的原始信号。实测下来把功放输入增益从最大回调6dB残余回声能量直接下降了一个数量级。很多“AEC无效”其实是被削波坑了。2.4 路径延迟超出tail length冲激响应根本覆盖不上回声从参考信号被送入DAC到声音经喇叭出声、反射到达麦克风中间有多个固定的延迟环节播放路径缓冲延迟DMA缓冲、DAC内部锁存声波在空气中的传播时间每米约2.9ms房间反射叠加产生的附加路径采集路径的过采样、滤波延迟如果总延迟超过AEC滤波器tail length滤波器等于在“看一段已经错过的时间窗口”自然什么都消不了。我见过一个ESP32蓝牙音箱方案播放路径因为蓝牙协议栈和音频后处理积压了60ms延迟AEC的tail只配置了32ms回声漏得干干净净。解决思路分两条一是尽量缩短播放路径的缓冲延迟把音频处理管线中的队列改小二是把AEC tail length配置到能覆盖最大期望延迟的量级。如果系统里存在网络缓冲、蓝牙缓冲这种延迟不可控的环节还需要加入动态延迟对齐补偿。3. 硬件通路悄悄“骗过”AEC功放失真、麦克风布局与声学泄漏3.1 D类功放的谐波失真那不是回声是喇叭的“走音”ESP32音频板最常用D类功放原因无外乎效率高、发热小。但D类功放的PWM开关过程会引入谐波失真、开关噪声这些成分和参考信号不存在线性关系。AEC的自适应滤波器只能对线性回声路径建模遇到这类非线性产物基本束手无策。典型听感是AEC开启后低频回声被压下去了但中高频仍然有一层“电质感”的残响音量越大越明显。这不是AEC没工作而是D类功放的非线性失真不在它的能力范围内。工程上的实用对策有三个尽量增大喇叭到麦克风的物理隔离让直达声变小残余失真在麦克风信号中的占比也下降。控制功放输入增益避开失真最明显的输出段。如果产品必须大音量工作可以在AEC后级再接一个后处理非线性抑制模块针对静态残余做衰减。我做过一次对比同一套AEC配置把喇叭更换成低失真单元残余回声主观听感立刻干净很多。硬件品质对AEC下限的影响远比很多人意识到的要大。3.2 麦克风离喇叭太近直达声压根本压不住很多紧凑型产品为了体积把麦克风和喇叭的距离压缩到5cm以内。这在声学上是很糟糕的。近距离直达声意味着麦克风信号中回声能量非常大AEC的收敛速度和稳态精度都面临更大压力更重要的是喇叭的振动会通过外壳、PCB板直接传导到麦克风形成一条固体传导路径这条路径是高非线性的比空气路径更难建模。一个实际案例某对讲模块麦克风和喇叭距离只有3cmAEC无论如何调参都感觉有“金属箱味”的残响。后来把喇叭底部贴了泡棉减震垫麦克风固定方式从硬性焊接到加硅胶套残留立刻降了不少。这条经验在做PCB布局时就要提前考虑麦克风尽量远离喇叭开孔、避开壳体共振节点、使用独立减震结构。AEC再强也补不了声学结构的先天缺陷。3.3 结构共振与麦克风增益在声音层面破坏参考信号的条件机壳共振会产生额外的频率峰麦克风灵敏度如果偏高拾取到的回声动态范围更大。更隐蔽的是后端自动增益控制AGC当AEC把回声压下去之后AGC检测到整体能量偏低会主动拉高增益把未被消掉的残余回声和噪声重新抬到听感响度正常的位置。用户听到的结果就是“AEC开了但好像没什么用”——它确实压了但被AGC又抬回来了。调试时如果发现开AEC后回声降低、但整体音量也变大了怀疑对象就是AGC/ALC。处理办法是在AEC前端或者至少在测试阶段把AGC关闭改为固定增益。量产产品中AGC必须放在AEC之后而且回声音量抑制要有明确下限防止自动增益“抵消”掉消回声的成果。4. 一次完整的AEC失效排查从录波形到参数调整4.1 第一步确认AEC到底有没有在工作排查别先改代码先做开关对照实验。固定播放同一段语音比如一段1kHz正弦和一段人声播报在同样的房间环境、同样的音量下分别关闭AEC和开启AEC各录一段麦克风数据。然后把两段录音导入波形软件观察喇叭播放期间的能量变化。如果开启AEC后录音里对应区域的能量几乎没有下降说明AEC完全没有发挥作用问题大概率在参考信号配置、采样率或者AEC根本没被真正调用。如果能量有些下降但残余明显说明AEC在工作只是受非线性或延迟边界限制瓶颈通常在硬件失真或tail不足。这一步能快速圈定排查范围。4.2 第二步参考信号与喇叭出声的对齐校验这个校验需要开发板支持把参考信号和麦克风信号同时导出。做法是播放一个周期性的脉冲测试信号比如每100ms发一个1kHz、20ms宽的脉冲然后同时录制参考信号和麦克风信号。对比两个波形就能测出参考脉冲到麦克风捕获脉冲之间的延迟采样点数。如果延迟超过当前tail length的覆盖范围就把tail加大或者在框架里配置延时补偿。另一个观察点是脉冲形状如果麦克风端的脉冲顶部明显削平配合之前提到的削波排查基本能锁定功放增益问题。这一步是整个排查中最关键的一步。我之前一度怀疑AEC算法能力不行做了这个对齐测试才发现参考信号和麦克风信号之间差了80ms而tail只有40ms等于滤波器覆盖的是一段“回声还没到达”的时间窗自然什么都消不掉。4.3 第三步硬件增益扫描与物理隔离测试把喇叭音量从低到高分若干档麦克风增益也取几档固定值逐组测试“开AEC后残留回声能量占比”。把这个占比做成一张小表很容易看出在哪个音量区间开始回声占比急剧上升——那个拐点往往对应功放削波起点。接下来做物理隔离测试在喇叭和麦克风之间放一块吸音棉或隔板看看残余回声有没有明显变化。如果有变化说明直达声/声学耦合占主导结构设计要优化如果完全没变化且延迟对齐、增益都正常那要怀疑固体传导路径比如喇叭振动直接传到麦克风需要在结构上做减震。4.4 一个可以直接抄走的排查顺序表步骤测试动作观察对象失败时重点怀疑1开/关AEC录相同语音对比残余能量是否显著下降参考信号配置、AEC未真正启用2参考信号与麦克风脉冲对齐延迟是否超过tail length播放路径缓冲、DMA延迟3扫描喇叭音量与MIC增益残余变化拐点功放削波、AGC/ALC4喇叭/麦克风物理隔离测试直达声强度变化结构布局、固体传导5调整tail length与采样率后复测残余是否下降算法配置、重采样对齐这张表是我调过的语音板子通用流程。任何“AEC失效”问题都按这个顺序走基本能把“算法问题”和“链路问题”切开。5. 几个值得抠的配置细节tail length、DTD与采样率5.1 tail length给回声路径一个足够长的“记忆窗口”tail length是AEC滤波器允许估计的回声路径最大长度直接决定了它能覆盖多长延迟的回声。经验值参考如下使用场景喇叭与MIC距离建议tail length桌面小音箱20cm100ms左右对讲/会议盒子20cm-1m150-200ms有网络或蓝牙缓冲距离不定200ms以上但tail不是越大越好。ESP32这类芯片上滤波器长度越长内存占用和每秒乘法运算量都成比例上升。做产品时最好把tail做成可配置项在量产前用实际功放、实际结构测出最合适的值不要盲目拉满。5.2 双讲检测DTD解决两人同时说话时的滤波器发散语音通话中近端说话和远端播放往往同时发生这叫双讲场景。如果AEC在双讲时还持续更新滤波器系数它会误把近端说话人的声音当成“需要消除的回声”去建模导致滤波器发散回声反而变多。DTD的作用就是在检测到双讲时冻结或减慢系数更新让滤波器专注于回声路径本身。我遇到过把DTD关掉的设备安静时AEC很好一有人说话铃声、语音同时出现时回声突然爆出来就是这个原因。ESP32框架里通常有DTD开关不要图省事关掉阈值灵敏度需要调节到既不漏报也不误报的程度。5.3 采样率与块大小在延迟和CPU占用之间找平衡AEC处理一般以帧为单位常见帧长10ms、20ms。帧长越小处理延迟越低但CPU占用越高自适应算法对短突发输入也更敏感帧长太大双向通话时感知延迟明显。ESP32在16kHz采样率下20ms帧是一个比较稳的起点。此外AEC在信号链路中的位置很重要。正确顺序应该是麦克风原始信号 → AEC消回声 → 降噪/AGC → 唤醒词/编码/发送。如果把降噪放在AEC前面降噪处理会改变回声的相位和波形破坏参考信号与麦克风信号之间的线性关系AEC反而更难收敛。这一点在不少现成例程里顺序是反的值得检查。还有一点容易被忽略AEC参考信号最好独立于主通路在送入AEC之前不要做任何EQ、压缩、动态范围处理。实在要做音量控制也要让参考信号和喇叭播放数据保持同一份数据源确保幅值和相位关系一致。这些都是ESP32语音设备上验证过有效的基本功做到位之后“开了AEC还听到自己”基本可以告别。跑过这一轮之后我自己的体会是这类问题第一嫌疑通常不在算法本身而是参考信号不给力或者硬件路径太脏。先别急着换更高级的AEC算法按前面这套流程把参考信号对齐、削波点找到、tail和DTD配置合理往往已经把残余回声压下去一大截。尤其做ESP32这类资源有限平台上的量产产品结构、电平、驱动层级任何一个不配合再强的算法也救不回来。希望这篇能给你省掉几个通宵。

相关新闻

纯前端实现域名DNS查询工具:JS核心逻辑与DoH接口实战解析

纯前端实现域名DNS查询工具:JS核心逻辑与DoH接口实战解析

做在线域名DNS查询工具,核心JS实现看着不难,真正跑通一遍才发现里面有不少讲究。这个工具解决的问题很实际:不用开终端敲 dig 或 nslookup,浏览器里输个域名,就能把 A、AAAA、CNAME、MX、TXT、NS、SOA 这些记录一次查明…

2026/10/14 16:58:12 阅读更多 →
SpringBoot 入门+ApiPost 测试接口

SpringBoot 入门+ApiPost 测试接口

创建springboot项目,选择springboot,语言选java,类型选maven,打包选jar选完下一步添加依赖,勾选web里的springweb,然后就创建完成了代码演示:打包运行:选择右边的m也就是maven&#…

2026/10/14 16:57:11 阅读更多 →
Akka.Hosting 日志系统实战:Akka.NET 与 Microsoft.Extensions.Logging、Serilog 的集成与日志过滤

Akka.Hosting 日志系统实战:Akka.NET 与 Microsoft.Extensions.Logging、Serilog 的集成与日志过滤

后端微服务 【免费下载链接】akka.net Canonical actor model implementation for .NET with local distributed actors in C# and F#. 项目地址: https://gitcode.com/gh_mirrors/ak/akka.net 点击查看 免费下载 在 Akka.NET 应用中,ActorSystem 的日…

2026/10/14 16:57:11 阅读更多 →

最新新闻

IntelliJ IDEA 的Qoder CN 插件报错“暂时无法同步代码库索引选择”怎么解决?完整排查与修复指南

IntelliJ IDEA 的Qoder CN 插件报错“暂时无法同步代码库索引选择”怎么解决?完整排查与修复指南

摘要 本文针对在IDEA中使用Qoder CN时出现的报错,给出官方说明与实战解决步骤。官方指出需启用代码库索引:可点击“创建”手动启用,或切换“自动索引”。实战中,先登录Qoder CN且不要输入提示词,再进入设置—>Qode…

2026/10/14 17:36:00 阅读更多 →
PTZ-C8T6.zip 云台控制 C 工程解析:编译、协议与避坑指南

PTZ-C8T6.zip 云台控制 C 工程解析:编译、协议与避坑指南

简介:PTZ-C8T6.zip 是一份面向嵌入式开发初学者与 STM32 学习者的云台控制项目工程源码,基于 STM32F103 系列芯片与 HAL 库构建,适合用于课程设计、毕业设计或电赛类云台控制方案的参考与二次开发。压缩包共 98 个文件,约 675KB&a…

2026/10/14 17:36:00 阅读更多 →
Python 读取 Excel 并写入 zip:自动化报表打包实战

Python 读取 Excel 并写入 zip:自动化报表打包实战

简介:这份资源面向需要处理表格数据的Python学习者与开发者,聚焦Excel文件的读取与写入这一常见任务,帮助解决数据分析、数据清洗与自动化报告中的表格操作问题。压缩包共4个文件,全部为py脚本,整体约6KB,涵…

2026/10/14 17:36:00 阅读更多 →
Terminus(Olares)RabbitMQ 中间件集成实战:用 OlaresManifest.yaml 声明式接入消息队列

Terminus(Olares)RabbitMQ 中间件集成实战:用 OlaresManifest.yaml 声明式接入消息队列

云原生后端运维 【免费下载链接】Terminus Open-Source Personal Cloud OS for Always-On Agents 项目地址: https://gitcode.com/gh_mirrors/terminus2/Terminus 点击查看 免费下载 本篇技术指南基于 Terminus 仓库中 RabbitMQ 集成文档 展开,讲解如何…

2026/10/14 17:36:00 阅读更多 →
九轴姿态解算实战:C语言实现Mahony互补滤波与四元数融合

九轴姿态解算实战:C语言实现Mahony互补滤波与四元数融合

简介:九轴姿态解算源代码是一套面向嵌入式开发、无人机及机器人等场景的C语言实现,融合加速度计、磁力计与陀螺仪数据,用于实时估计物体的横滚、俯仰与偏航角。资源包含4个文件,全部为2个C源文件和2个头文件,压缩包仅5…

2026/10/14 17:36:00 阅读更多 →
C#工业级图形面积周长计算:精度、鲁棒性与性能平衡

C#工业级图形面积周长计算:精度、鲁棒性与性能平衡

1. 项目概述:为什么一个“图形周长、面积计算”功能值得花时间深挖? 你可能第一眼看到“C# 图形周长、面积计算”这个标题,会下意识觉得:“不就是几个数学公式封装成方法吗?勾股定理、πr、底高2……抄一遍就完事。”我…

2026/10/14 17:34:59 阅读更多 →

日新闻

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/14 16:30:29 阅读更多 →
影刀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/14 7:53:34 阅读更多 →