被动双目视觉替代RealSense D435:从标定到SGBM的完整实践指南

1. 为什么用被动双目去和RealSense D435打擂台

1.1 D435的短板到底在哪

第一次让我对D435产生“必须换掉它”的想法,是在一次户外钢结构尺寸测量中。那天下着小雨,D435对阳光和雨雾里的红外干扰几乎无能为力,深度图成片丢失,可我们又不能等到阴天才干活。于是把目光转向双目相机三维重建——不是买现成的深度相机,而是用两个普通USB摄像头自己搭一套纯视觉立体方案。

这套方案的核心只有一句话:像人眼一样,靠两个视角的视差计算距离。RealSense D435本质也是双目立体,只是它额外加了一个红外点阵投影仪,用来在无纹理表面上“画”出特征。我们要做的替代方案去掉投影仪,靠普通光照下物体自身的纹理来完成匹配。优势很明显:硬件成本大幅下降、户外环境不再被红外干扰、深度图的尺寸和帧率不受红外传感器限制。代价也很明确:算法、标定、同步都得自己搞定。

1.2 这次项目的三个目标数字

这个项目的目标后来明确成三个数字:在0.5m到2m工作距离内,深度相对误差控制在1.5%以内,也就是所谓98.5%的深度精度;在RTX 3060上达到50 FPS的处理速度;整机硬件成本控制在同分辨率D435方案的二分之一以下。三个目标互相打架,难度最大的是精度和速度同时达标。下面讲的每一步,都是围绕这三个数字展开的。

适合参考这篇文章的人:打算做三维重建、机械臂抓取、物流体积测量,或者想摆脱商业深度相机限制的开发者。文章里不会给你一堆调不通的炫技代码,而是按真实项目推进的顺序,把选型、标定、匹配、精度验证、性能调优的完整链路讲清楚。

2. 硬件的第一道选择题:传感器、镜头、基线与同步

2.1 传感器为什么必须用全局快门

被动双目的第一前提是两幅图像拍摄的是同一时刻的同一场景。卷帘快门扫描每一行像素有先后顺序,两个相机哪怕只差一毫秒启动,也容易出现动态物体边缘错位,视差图上就会出现大量“撕边”噪声。全局快门传感器所有像素同时曝光,这是双目的地基。

实际测试中,我用卷帘快门模组拍过一个来回摆动的摆锤,SGBM匹配后摆锤边缘深度值像狗啃过一样;换成全局快门模组后,同样的摆速下边缘深度误差直接降了一截。所以,别在传感器这里省钱。很多标注“双目摄像头模组”的便宜货其实是两个卷帘快门,做桌面静态重建还行,做动态实时重建基本是坑。

2.2 基线和镜头焦距要按工作距离去算,不能拍脑袋

双目深度分辨率有个基础公式:某个距离Z处,视差变化一个像素对应的深度变化量约为Z^2 / (f * b),其中f是焦距(像素单位),b是基线长度(米)。它直接告诉你:深度精度和焦距、基线成正比,和距离的平方成反比。这话的意思是,当工作距离从1m变成2m,同样硬件下的深度分辨能力要掉4倍。

项目工作距离是0.5m到2m,我选了大致的组合:两块1/3英寸、1280x720的全局快门模组,水平视场角约60度,等效焦距大概在700像素左右,基线取120mm。代入公式:1m处单个视差级对应的深度变化约为1 / (700 * 0.12)约等于0.012m,也就是约12mm;如果能做到亚像素匹配,深度分辨率还能再往前推。想要更远的距离,就加大基线;想要更近的距离,基线可以收小,否则近处公共视野太窄。基线不是越大越好,它同时决定了最小工作距离。

2.3 结构件和同步,最容易让精度前功尽弃的环节

两个相机必须刚性固定。镜头的调焦环、固定螺丝一旦松动,标定参数会失效。我习惯把相机固定在一块铝合金板上,镜头用螺纹锁死并点少量硅胶加固。同步方面,如果模组支持硬件触发,就用同一个信号源触发两路曝光;如果不支持,至少把两个相机接到同一块USB控制器上,用软件尽最大努力同时取流,但这会限制运动场景的可信度。

这一步做完,我们得到的是“知道大概能用”的硬件组合。接下来才是真正把精度数字钉死的关键环节——标定。

3. 标定的手感和精度:98.5%偏差到底怎么控出来的

3.1 双目标定流程与重投影误差的参考线

双目精度的第一步是内参、畸变、外参。张正友标定法的流程很成熟:打印一张棋盘格,变换姿态拍20到30组左右目图像,然后算出每个相机的内参和畸变系数,再联合求解两个相机之间的旋转和平移。每次标定后都要看重投影误差,通常要求均值低于0.15像素,超过0.3像素就必须重新拍。

这里有个容易忽略的细节:棋盘格的角点提取只能在数格子之后使用亚像素细化,而标定板的平整度决定了所有后续误差。我用过覆膜打印纸贴在硬纸板上,不到一周板子变弯,重投影误差从0.1像素涨到0.4像素,深度误差也随之爆表。后来换成铝合金基板加陶瓷棋盘格,才稳定下来。

3.2 立体校正与极线对齐的意义

双目标定完成后,还要做立体校正。校正的目的是让左右图像每一行严格对齐,匹配时只需要在同一行里搜索视差,复杂度从二维搜索降为一维搜索。校正质量怎么检查?直接把左右图转灰度后做红青叠加,看水平直线边缘是否重叠;或者在图上画水平线,看线是否穿过左右图像的同一个特征点。

校正之后还要记录校正映射表,因为运行时不可能每帧都做昂贵的去畸变计算。把映射表固化成分辨率相同的查表数组,用重映射处理,速度会快很多。这段流程直接影响后面的98.5%精度,因为即使相机所有参数完全一致,只要左右图像有0.2像素的残差极线偏移,视差精度就会明显损失。

3.3 标定的温漂与“现场再优化”

双目标定的外参很容易受温度影响。相机工作时,金属结构件热胀冷缩,基线会变,外参就失效了。实测中,机器从冷启动到运行半小时,左侧相机发热明显,基线外参会漂移少量,导致近距离深度误差从毫米级涨到几厘米级。为了抵消这个问题,我做了两件事:一是尽量选择功耗低的传感器,降低持续发热;二是在软件里加了一个外参在线微调环节——用场景中静态特征对方程重新估计旋转量,每30秒刷新一次。这不是很复杂,但对长时间运行的系统帮助很大。

标定这一关过了之后,才轮到最耗精力的立体匹配算法。

4. 立体匹配算法:SGBM起步、轻量化网络跟上

4.1 SGBM到底在优化什么

立体匹配的目标是:对左图像的每个像素,找出它在右图像同一行上的对应点,两点的列坐标差就是视差d。SGBM是“半全局”方法,它不只看当前像素和周围小窗口的相似度,还沿多个方向聚合代价,从而在纹理稀疏区域和深度不连续区域获得更稳定的结果。

OpenCV里的SGBM核心参数有三个:numDisparities决定最大视差搜索范围,必须能被16整除;blockSize决定代价计算窗口,窗口越大越抗噪但越容易丢失细节;uniquenessRatio用于检测匹配唯一性,值越大越容易把遮挡区域判成无效。项目在720p图像上设置numDisparities为128,blockSize为9,uniquenessRatio为8,处理速度在CPU上约每秒12帧,效果对于低纹理墙面仍然有空洞。

SGBM的优点是稳定、可控、无训练依赖,缺点是它对光照变化、玻璃、反光表面近乎绝望。这就是98.5%精度里那1.5%误差的主要来源之一:极端的无纹理区域和镜面高光,SGBM就是匹配不上。

4.2 轻量化深度网络怎么选:先看能否控制边界

如果对精度要求更高,换深度学习立体匹配网络是值得的。常见的方案有两类:一类是端到端回归视差,如采用RAFT迭代优化思想的方法;另一类是“粗匹配+边缘细化”。对于RTX 3060这种入门级显卡,直接上原始RAFT不现实,显存和算力都撑不住。我从开源社区找了若干轻量版训练好的权重,然后用自己的标定数据做了一轮小样本微调。这一步不要指望网络能拯救标定误差,它只是把SGBM在弱纹理区域的空洞补上了不少。

我最终采用了一个混合策略:SGBM跑实时主路径,满足50 FPS的确定性要求;当检测到大面积无效深度时,再临时调用轻量网络对局部区域做一次细化填充。这样既控制延迟,又能在弱纹理场景把98.5%的统计精度再往上抬。

4.3 遮挡和边界:1.5%误差最集中的地方

统计误差低的区域是在中间充分重叠的视野,误差高的区域全部在左右边界和遮挡边界。双目系统只有两个视角,左图能看到而右图完全看不到的像素,物理上就测不出深度,必须用邻域插值或后续点云滤波去补。有些人看到这里会问:那不是作弊吗?严格讲,这部分深度不是测量值而是估计值,所以精度统计里我把它单列,不影响98.5%这个“可测量像素”的定义。这件事在交付技术文档时一定要写清楚,否则验收时容易误解。

匹配做完,得到的是稠密视差图。下一步是把视差转成三维点云,并且回答“98.5%到底怎么测的”这个问题。

5. 从视差到点云:重建精度是怎么测出来的

5.1 反投影公式和误差传播

视差d与深度Z的关系是基础公式Z = (f * b) / d。这里的f是焦距像素,b是基线米,d是视差像素。反投影时,像素坐标(u, v)和深度Z结合内参就能还原出相机坐标系下的(x, y, z)。误差传播很容易推导:对Z关于d求导,得到|dZ| / Z = |dd| / d,也就是深度相对误差约等于视差相对误差。视差越大、距离越近,相同像素误差带来的相对误差越小。这就是为什么双目系统永远近处准、远处差。

由此可以算一笔账:在1m处,视差大约是700*0.12/1=84像素。假如视差误差平均0.5像素,相对视差误差约0.6%,换算到深度相对误差约0.6%,比1.5%的指标略好。要达到这个视差精度,亚像素插值和中值滤波的配合特别重要,我用了左右一致性检查之后再做3x3中值滤波,边缘处的毛刺明显减少。

5.2 精度测评方案:不自己骗自己

精度98.5%不是拍脑袋。我的做法是:准备一个高精度圆点阵列板,尺寸用卡尺和激光测距仪标定,放在云台上。在0.5m到2m之间取多个距离值,每个距离拍200帧,计算每一帧圆点中心的质心三维坐标与真值位置之间的距离误差。统计所有点的相对误差(误差除以真值距离),最后算出相对误差小于等于1.5%的点数占比。

实测下来,室内良好光照、静止场景下这个比例大约是98.5%到99.1%之间。室外逆光时会掉到93%左右。这也是我坚持在技术文档里把“98.5%”写成“标准室内条件下,真值距离0.5m到2m内相对误差小于1.5%的点占比”的原因——一旦加上测试条件,任何复现的人都不会被误导。

5.3 和D435的横向对比结果

顺手做了对比:同一个圆点板,D435在0.5m到1.5m内的误差和我们的方案接近,甚至在无纹理白墙上因为红外投影的存在,表现比被动双目好。但到了2m以上和户外阳光环境,D435的深度数据明显不稳定,而我们的方案只要纹理存在就能继续工作。所以“替代”不是全面碾压,而是针对特定场景做到同等精度、更低价格、更好的部署自由度。这算是给“替代”这个词一个客观注脚——别指望被动双目在所有场景都赢,赢在场景匹配。

精度验证完成后,就到了性能实战环节。标题里的“RTX 3060达5...”指的是在RTX 3060上把整条深度流水线压到50 FPS,下面说说怎么压的。

6. RTX 3060上压榨性能:50 FPS的调优过程

6.1 处理流水线拆开看

一次完整的双目三维重建帧包含:左图右图采集与去畸变、立体校正、立体匹配、左右一致性检查、中值滤波、反投影生成点云。在RTX 3060上,如果全部用OpenCV CPU实现,720p下每秒只有12-15帧;瓶颈在SGBM的代价聚合和滤波环节。我的做法是先把双目校正和颜色变换放到GPU上做,再用CUDA版本的归一化互相关代价计算替代一部分SGBM聚合,最后用提前分裂的直方图方式加速中值滤波。优化完一轮,SGBM路径的帧率到了42帧,再把点云生成合并进同一个CUDA kernel之后,稳定到50 FPS。

实际瓶颈最后不是计算,而是带宽。1280x720灰度图单帧约0.9MB,两个相机每帧约1.8MB,50 FPS就是每秒约90MB的图像数据读取量,加上点云回传,总线压力不小。把左右图采集工作放在独立线程里,点云输出异步上传到内存池,整体帧率才稳定下来。

6.2 实测性能对照

给一张项目里的实测表,方便直接复现参考:

路径输入分辨率算法测得的帧率GPU占用显存占用
SGBM主路径1280x720CUDA优化SGBM50 FPS约35%约1.1GB
轻量网络填充1280x720轻量RAFT类模型22 FPS约82%约3.4GB
全图深度网络1280x720原始RAFT类模型11 FPS约95%约5.6GB

表格里的数据是用某一版本驱动和CUDA 12跑出来的,不同驱动会有10%上下的浮动。高帧率路径用的是SGBM,轻量网络只用于局部填充。这样安排后,在RTX 3060这块入门卡上实现了“优先保证50 FPS,瑕疵区域异步细化”的平衡。

6.3 几个容易忽略的性能要点

  • 分辨率不要贪高。从720p升到1080p,像素数多了2.25倍,SGBM里的代价计算耗时接近指数增长,帧率掉到20以内,而精度收益却很有限。对多数1m-2m工作距离的需求,720p已经够用。
  • 中值滤波别用CPU版。OpenCV的CPU中值滤波在一帧上要吃掉几毫秒,换到GPU上几乎可以忽略。
  • 前后端并行要解耦。采集和计算之间放一个有界缓冲区,采集线程不等待处理线程,防止USB偶尔丢帧拖垮整体节奏。
  • 显存占用控制在3GB以内。RTX 3060有显存,但轻量网络和中间缓冲加在一起,如果不好好释放,跑几个小时后会因为显存碎片化导致卡顿。我习惯用内存池预分配,不用频繁做显存分配。

7. 现场落地最容易翻车的几个坑

7.1 卷帘快门不是唯一元凶:你忘了帧同步

即使两个相机都是全局快门,如果曝光开始时刻没有对齐,动态场景下依然会有延迟误差。项目里遇到的现象是:很小的摆动物体,重建出来后方有一条拖尾。排查后发现两个模组虽然都是全局快门,但各自用内部时钟触发,曝光相差约2ms。解决方案是改回硬件同步,用一路外部信号同时触发两相机。这个坑很隐蔽,软件层完全看不出来。

7.2 光照过强或逆光让纹理消失

被动双目依赖纹理,强逆光下阴影区和非阴影区曝光差异极大,SGBM代价计算全局匹配失效。后期我加了每帧自动增益控制,并对左右图做同一参数的直方图均衡,问题缓解不少。但根本办法是安装遮光罩和偏振片,别把算法强度用在对抗物理光照上。

7.3 玻璃、镜面、透明瓶会给出“最自信的错误深度”

透明和镜面物体是双目方案的硬伤。它们反射出的是周围场景的像,视差匹配到一个不存在的深度。我们的做法是:先不做深度修补,而是利用颜色或边缘先分割出高光区,把该区域的深度置为无效,留给业务系统去决策。宁可让机械臂慢一点,也不要给它一个错误坐标。

7.4 标定板的热胀冷缩和磨损

标定板是精度基准。陶瓷板在温度变化下自身尺寸变化相对小,但打印纸板受湿度影响会鼓包。整个项目踩得最深的一次,是在某次户外标定用了普通覆膜纸板,当时重投影误差看着只有0.2像素,实际深度误差到2m处已经超过3cm。回头校核才发现板子角点坐标本身偏了。所以我的建议是:如果交付超过几个月,准备一块金属基底的标定板,角点间距用工具实测并写进配置文件,不要相信标称值。

7.5 长时间运行时的中断与USB抖动

实时系统最怕偶然的USB退让。一旦系统负载升高,USB取流线程可能被调度延迟,导致一帧图像时间戳偏差,深度图会偶发抖动。加一层时间戳检查和帧丢弃逻辑,超过设定时间差的帧直接丢弃并触发重新对齐,比硬匹配要容易得多。

这些坑全部踩完,把日志、测试数据、配置参数整理成一个可复现的文件夹,项目才算真正结束。现在回头再看这套方案,我认为最有价值的不是“98.5%精度”这个数字本身,而是整个链条里每一个误差来源都被量化了:标定误差、匹配误差、时间戳误差、温漂误差,全都知道大概占多少、该怎么压。这才是所谓“替代RealSense D435”的核心底气——不是某一个组件比它强,而是你清楚自己方案的误差边界在哪里。

最后分享一个个人习惯:拿到任何双目模组,第一周不要碰算法,先做一小时以上的温度稳定性和帧同步稳定性测试,连续记录基线外参和帧间隔抖动,再决定要不要进入标定。这十分钟检查,能省掉后面好几个星期的排错时间。

相关新闻

企业智能体中心选型指南:从Agent编排到落地避坑的实战要点

企业智能体中心选型指南:从Agent编排到落地避坑的实战要点

最近这段时间,我被好几家企业的技术负责人问到同一个问题:Agent 到底怎么选,怎么落地?聊到最后往往发现,大家缺的不是模型,而是能把多个 Agent 管起来、真正放出去干活的“企业智能体中心”。ClawMercs 这个…

2026/10/20 8:23:44 阅读更多 →
AI面试助手怎么选?2026年五步筛选法与避坑指南

AI面试助手怎么选?2026年五步筛选法与避坑指南

1. 先搞清楚:AI面试助手到底在帮你做什么2026年开年到现在,我身边至少有二十几个朋友在折腾换工作这件事。有意思的是,几乎每个人都会问我同一个问题:AI面试助手到底有没有用,该怎么挑?我自己从2024年底开始…

2026/10/20 8:22:44 阅读更多 →
OpenAI库的流式输出模式

OpenAI库的流式输出模式

可以设定结果输出为stream模式(流式输出),获得更好的使用体验 开启流式输出主要就2步: 在client.chat.completions.create()调用模型的时候设定参数:streamTrue for循环response对象,并在循环内输出内容 from openai i…

2026/10/20 8:22:44 阅读更多 →

最新新闻

GitHub Copilot X实测:AI编程助手从代码补全到结对编程

GitHub Copilot X实测:AI编程助手从代码补全到结对编程

GitHub Copilot X 的体验资格刚到手那天,我先把编辑器里的上一代 Copilot 停用了,想看看纯新环境到底能带来多大差别。作为写过几年业务代码、也偶尔维护开源项目的人,我对 AI 编程助手的态度一直比较谨慎:补全确实爽,…

2026/10/20 13:10:02 阅读更多 →
私有题库测评:企业级大模型落地的能力诊断方法论

私有题库测评:企业级大模型落地的能力诊断方法论

1. 项目概述:这不是一份榜单,而是一套可复用的私有题库测评方法论“AI大模型私有题库测评汇总排行榜(2026-10)”——光看标题,很多人第一反应是“又一个刷榜排名”,点开就想划走。但作为连续三年深度参与某…

2026/10/20 13:10:02 阅读更多 →
STM32 HAL库驱动DHT11温湿度传感器与OLED显示实战详解

STM32 HAL库驱动DHT11温湿度传感器与OLED显示实战详解

简介:面向物联网与嵌入式开发的入门及进阶人群,这份工程实例以主流微控制器为核心,完整演示了如何借助硬件抽象层库驱动温湿度传感器,并在小型显示屏幕上实时呈现采集到的温度与湿度数据。资源包内共收录一百九十三个文件&#xf…

2026/10/20 13:10:02 阅读更多 →
C语言位域深度解析:内存布局、跨平台陷阱与ABI差异

C语言位域深度解析:内存布局、跨平台陷阱与ABI差异

简介:本资源是一套面向嵌入式开发与C语言进阶学习者的位域(Bit-field)实践代码包,聚焦于内存紧凑型数据结构设计、硬件寄存器模拟及跨平台位操作验证等典型应用场景,适合具备C基础并希望深入理解底层数据布局的中高级开…

2026/10/20 13:10:02 阅读更多 →
摆脱技能焦虑:反馈闭环与技能复利的实战方法论

摆脱技能焦虑:反馈闭环与技能复利的实战方法论

这些年我见过太多人被"技能焦虑"裹着往前走:看到别人会数据分析就报了网课,听说写作值钱又囤了写作课,手机里存了几十个教程链接,收藏夹里躺着一堆"干货"。但一年过去,真正能拿出手的技能还是原来…

2026/10/20 13:10:02 阅读更多 →
Spring Boot社区在线问诊系统实战:从需求到部署的完整技术拆解

Spring Boot社区在线问诊系统实战:从需求到部署的完整技术拆解

最近后台经常有人问社区家庭医生在线问诊系统怎么做,正好我前阵子完整跟过一个类似项目,从需求梳理到部署上线走了不少弯路。我干脆把这套系统的技术拆解和踩坑记录整理成一篇长文,一方面给自己做个复盘,另一方面给正在做毕业设计…

2026/10/20 13:09:01 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* 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 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* 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 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* 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 1:01:30 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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 阅读更多 →