PosPool:极简位置池化如何统一主流点云算子

这期论文精读想聊一个看着很朴素、后劲却很大的点云算子工作。它来自 ECCV 2020,叫 PosPool——按字面翻译就是“位置池化”。当时大家都在往点云算子里堆更精巧的模块、更复杂的卷积变体,结果这篇论文偏偏反着来,用“一个几乎没有额外可学习参数的池化操作”去统一了大量主流算子,并且在分类、分割、场景流这些任务上打出了很有竞争力的结果。套用标题的说法:这是点云算子的一次“大一统”,也是“极简主义”的一次反击。

读这篇论文之前,实话说我是带着点怀疑的。一个小到不能再小的加权平均池化,真能顶替那些精心设计的局部卷积模块?但顺着论文把 PointNet++ 里的 set abstraction、PointConv、X-Conv 这些经典算子全部拆开看之后,我发现大家的底层结构确实长得非常像。很多花哨操作的本质,就是在邻域点特征上乘一个与“相对坐标”相关的权重,然后再聚合。PosPool 就是把这件事做到最简、也做得最直接。

这篇文章适合想搞懂点云算子底层逻辑的人,尤其是正在复现 PointNet++、或者自己设计点云网络的同学。我会从统一框架、公式细节、变体选择、实验结论、复现踩坑这几个方面展开,希望能帮你在自己项目里少走几步弯路。

1. 点云算子为什么需要“大一统”

1.1 从规则网格到无序集合,卷积为什么失效

图像卷积之所以好写,是因为像素之间有天然的规则网格。卷积核里的每个权重,都能对应到一个固定的空间offset:左上角、正上方、右下角……偏移量是预先定死的,所以同一套卷积核可以在整张图上滑动复用。

点云没有这个便利。一个点云在空间里是一堆无序、稀疏、密度不均的点,既没有行号列号,也没有固定的邻居分布。同一个局部区域里,点的数量可能不一样,点的相对位置也可能千奇百怪。所以直接把图像卷积搬过来是行不通的,我们需要一套对“顺序不敏感”、又能感知“相对位置”的算子。

也正因为这样,过去这些年点云深度学习的主流玩法一直是:先采样一组中心点,再在周围找邻居,然后对邻居点做特征变换,最后把一组邻居特征聚合起来。这个流程本身大家是达成共识的,分歧只出现在细节上——特征变换怎么做、位置信息怎么用、聚合用 max 还是 sum 还是 attention。PosPool 这篇论文就是盯着这些分歧出手的。

1.2 PointNet++、PointConv、X-Conv 之间的“同一张脸”

如果只看表面,PointNet++、PointConv、X-Conv 这几个模块的差异还挺大的。PointNet++ 的局部提取是一组共享 MLP 加最大池化;PointConv 是用 MLP 从相对坐标生成连续权重,再对邻域特征加权求和;X-Conv 则要先学一个变换矩阵把邻域点排布到类似网格的结构上,再用卷积处理。

但你把这些算子放进一个通用框架里看,会发现它们其实都长这样:

[ y_i = A_{j \in N(i)}\left( \psi(f_j) ; \otimes ; h(\Delta_{ij}) \right) ]

其中 (N(i)) 是中心点 (p_i) 的邻域点集合,(\Delta_{ij}=p_j-p_i) 是邻域点相对中心的位置偏移,(f_j) 是邻域点自身特征,(\psi) 是特征变换函数,(h) 是位置编码函数,(\otimes) 是某种把两者结合起来的操作,(A) 则是聚合函数。

PointNet++ 里,(h) 基本没被显式使用,特征全靠 (\psi) 这个 MLP 去隐式编码位置;PointConv 里,(h) 是一个可学习的 MLP,(\psi) 是恒等函数;X-Conv 更复杂,(h) 和 (\psi) 被绑在一起,通过 K 近邻点坐标生成变换矩阵和卷积权重。

说白了,它们都在做同一件事:怎么把一个位置偏移 (\Delta) 变换成一个权重,再作用于邻域特征。区别只是这个“位置权重函数”设计得复杂还是简单、可学习还是固定。PosPool 的贡献,就是把这件事明确拆成三个组件,然后告诉大家:位置编码函数做得再花哨,最终效果也未必比一个简单的多项式基更好。

2. PosPool 算子:最简公式与设计细节

2.1 一个几乎没有参数的位置池化

PosPool 的具体做法非常容易被低估。它选择了若干个“单变量位置基函数”,比如相对坐标本身及其幂次:

[ h(\Delta) = {1,\ \Delta_x,\ \Delta_y,\ \Delta_z,\ \Delta_x^2,\ \Delta_y^2,\ \Delta_z^2} ]

这里取了 7 个基函数。把邻域点特征在通道维上平均分成 7 组,第 (k) 组特征乘上第 (k) 个基函数的数值,然后在邻域维度上做平均池化,最后把每组的结果拼回来。

用伪代码写出来大概是这样的:

# feat: [B, C, K] 邻域点特征 # rel: [B, K, 3] 邻域点相对坐标,已归一化到[-1,1] def pos_pool(feat, rel): B, C, K = feat.shape bases = [ torch.ones_like(rel[..., :1]), # 1 rel[..., 0:1], # dx rel[..., 1:2], # dy rel[..., 2:3], # dz rel[..., 0:1] ** 2, # dx^2 rel[..., 1:2] ** 2, # dy^2 rel[..., 2:3] ** 2, # dz^2 ] nb = len(bases) group_c = C // nb pooled = [] for k, base in enumerate(bases): fg = feat[:, k * group_c : (k + 1) * group_c, :] # [B, group_c, K] w = base.permute(0, 2, 1) # [B, K, 1] weighted = fg * w pooled.append(weighted.mean(dim=-1)) # 邻域平均 return torch.cat(pooled, dim=1) # [B, C]

如果你的输入特征通道数不能整除 7,最简单的办法是补零,或者把最后剩下的通道全部塞给基函数 (1)。实际工程里我建议显式要求设计网络时把通道数定成 7 的倍数,省得以后踩 padding 的坑。

整个算子除了特征输入输出处的线性变换之外,位置编码部分不需要任何可学习参数。它的计算量也低得离谱:在逐元素乘法之外,只有一个平均池化。相比那些用多层 MLP 生成点权重的方案,PosPool 几乎是把“轻量”写在了脑门上。

2.2 为什么分组乘位置编码,而不是整个特征一起乘

很多人第一次看 PosPool 会涌出一个疑问:为什么非要先按基函数个数把特征切成几组,而不是让整个特征向量都乘上同一个位置权重?

原因很简单——维度爆炸。假设输入特征有 128 维,位置基函数有 7 个,如果每个基函数都和完整特征做外积再拼接,输出通道就会变成 (128 \times 7 = 896) 维。到了下一层,参数量会瞬间被撑大,训练成本翻好几倍。这种设计在理论上是完备的,但在实际网络里一点都不划算。

用分组的方式,每个基函数只负责调整一部分通道。这背后的逻辑有点像“分工”:一部分通道主要表达“这个位置有没有点、点了多少”,另一部分通道表达“左右偏移有多明显”,再有一部分通道负责“上下、远近的二次变化”。每个通道被位置编码影响的方向更集中,信息也不会因为叠乘而过度膨胀。

而且从表达能力的角度讲,分组乘法的假设是:特征通道之间存在一定的冗余,不需要让每个通道都看到完整的位置模式。这在视觉任务里其实很常见——低层特征不同的通道天然会关注不同的局部模式。PosPool 只是把这个经验假设沿用到了点云的位置编码里。

2.3 为什么这么简单的权重也能奏效

回到那个最反直觉的问题:一个固定死的多项式权重,凭什么能顶替可学习的复杂权重?

关键在于点云局部区域是连续的。在一个小半径球里,点与点之间的位置关系是高度平滑的,中心点周围的密度变化、形状变化,用低阶多项式已经能刻画得相当好。就像你在一条曲线上取一个非常小的区间,哪怕原始曲线再复杂,用线性函数或二次函数去逼近,误差也会很小。PosPool 的位置基函数正好就是一个局部低阶多项式展开,它天然具备这种“局部近似”能力。

而之前很多复杂的可学习权重,比如用 MLP 从坐标直接回归权重,本质上也是在拟合一个平滑函数。给 MLP 足够容量,它确实能覆盖更复杂的位置关系,但它同时也引入了更多参数、更多过拟合风险、更多调参难度。在大多数点云数据规模并不算大的情况下,一个没有参数的固定多项式基,反而更容易保持稳定的优化路径。这就是“极简主义”能够在精度和效率上同时占便宜的根本原因。

3. 从大一统到三种变体:怎么选

3.1 统一框架下的不同变体

PosPool 论文里并不只有最简版。作者把前面的通用框架当成底座,在位置编码 (h) 和特征变换 (\psi) 这两个位置分别做文章,提出了几个变体,方便应对不同任务。

  • PosPool-RA(最简版):位置编码用固定多项式基,特征变换用恒等函数,聚合用平均池化。适合做主干网络里的轻量局部特征提取。
  • PosPool-FP(特征学习版):在特征变换 (\psi) 上加入可学习的 MLP,位置编码仍然保持固定。这个版本比最简版更有表达力,适合特征维度较低、局部语义更复杂的任务。
  • PosPool-DP(位置学习版):位置编码 (h) 由两层 MLP 生成,特征变换仍保持恒等。这等于把 PointConv 那类可学习位置权重重新装了回来,但整体结构仍然比 PointConv 更收敛。
  • PosPool-DF(混合版):固定基和可学习基一起用,或者用可学习基底替换原始固定基的部分分项,兼顾稳定性与灵活性。

选择逻辑其实不难:如果你追求极致速度和低参数量,直接上最简版;如果你觉得最简版在以形状细节为主的任务上不够精细,可以先加特征 MLP;如果你的数据规模非常大、训练周期也充裕,位置学习版值得一试。

3.2 关于“资源观”的一点经验

讲变体之前,我想先提一个在论文里没有明说、但复现时体会很深的点:复杂算子带来的收益,很多时候不是模型表达能力本身,而是它带来了更强的正则化或更平滑的优化曲面。

这不是玄学。拿 MLP 生成位置权重和固定基函数相比,MLP 的权重如果初始化不好,训练早期很容易在局部区域产生不稳定的权重分布,导致网络需要更长的时间才能进入正常状态。固定多项式基没有这个问题,它从第一个 step 开始就在做一件语义上很明确的事:用低阶位置模式去调制特征。这反而让网络更容易收敛。

所以我的建议是:在设计自己的点云网络时,把极简版 PosPool 当成“默认起点”,先跑通、跑到平稳,再决定要不要升级成带 MLP 的变体。不要一上来就奔着最复杂的模块去。很多点云任务本身数据量只有几万到几十万个样本,复杂模型带来的优势很容易被方差吃掉,而极简模型的稳定效率是实打实的。

4. 实验:哪些任务真的被它“打服”

4.1 公开基准上的效果

原论文在点云分类、室内场景分割、动态场景流估计几个任务上做了实验。说“打服”可能有点夸张,但结论非常有冲击力:在不引入任何额外位置可学习参数的最简版本下,PosPool 就能做到与当时更复杂的算子相当甚至更好的结果。

在公共点云分类基准上,PosPool 的准确率和 PointNet++ 那一类经典方法基本持平,个别配置下还更高。在室内点云语义分割这类需要捕捉细粒度局部几何的任务上,最简 PosPool 配合多层网络结构也能拿到很有竞争力的 IoU。而在动态场景流估计这种原本很依赖局部运动模式的任务上,它同样没有掉链子,甚至超过了那些为场景流专门设计的复杂模块。

这给我们的启示是:之前很多复杂模块带来的所谓提升,可能有一大部分只是来自“更深的特征变换”或者“更充分的位置归一化”,而不是来自极其精巧的权重生成网络。PosPool 把这些额外复杂度全部拿掉,只保留“位置加权聚合”的核心,反而迫使网络的表达能力集中在主干特征上。

4.2 效率与显存:被忽略的隐形优势

除了精度,PosPool 在工程实践里真正让我喜欢的原因是效率。它几乎没有位置权重生成部分的可学习参数,所以训练和推理时的前向计算量都小很多。在同样的网络深度和宽度的条件下,显存占用也要低不少。

这在实际项目里意味着两件事:一是你可以把批次大小调大,训练速度更快;二是即便在资源受限的环境里,也能把网络做深一点,或者把邻域搜索半径调大一点。点云处理中邻域点数对效果影响很直接,很多时候精度瓶颈不在算子本身,而是显存不够用导致邻域必须取小一点。PosPool 这种轻量算子在这一点上特别友好。

我当时在一个室内分割的消融里做过对比:把原来网络里的局部算子从带 MLP 位置编码的方式换成 PosPool,整体参数量大概降了一半,训练速度提升明显,最后指标几乎没有下降。这种体验在调参过程中非常舒服,因为你可以更放心地扩大邻域和加宽通道。

5. 复现与踩坑实录

5.1 邻域构建:用 KNN 还是球查询

PosPool 本身不关心邻域怎么来,它只负责对给定的邻域点做池化。但邻域构建直接决定了输入数据的质量。我在复现时先用 KNN,后来换成球查询,差距不小。

对密度相对均匀的点云,比如用激光雷达在固定距离扫描得到的场景,KNN 够用。但点云数据经常存在密度剧烈变化,比如室内场景中墙面点很密、远处物体点很稀。这时候 KNN 会强行把远处的稀疏点拉进邻域,导致局部几何被扭曲。球查询则保证了邻域点的空间范围是一致的,更符合“局部区域”的语义。

实操里我一般按中心点数据集尺度去定半径。比如先把整个点云坐标缩放到一个单位范围内,半径取 0.02 到 0.05 之间;如果对具体物体点云,半径可以更小一点。建议在开始训练前可视化几个邻域结果,确认半径没有大到把不同物体粘连在一起、也没有小到每个邻域只有三四个点。

5.2 三个容易翻车的实现细节

第一个坑是坐标归一化。相对坐标如果直接用原始值算平方项,稍微远一点的点就会让 (x^2) 变得很大,甚至超过 1,导致位置基函数数值上压过特征本身。我习惯先把所有点云坐标缩放到中心点局部坐标的 ([-1,1]) 范围内,再送入 PosPool。最简单的做法是除以邻域半径,把所有相对坐标限制在单位球内。

第二个坑是通道分组边界。前面说过,如果输入通道不是基函数个数的整数倍,实现时很容易写出索引越界或者把分组错位的 bug。建议在网络定义处直接约束输入通道为 7 的倍数,或者在做分组乘法前加一个 padding 层,保证每个 group 至少拿到一个通道。

第三个坑是邻域点数不一致导致的 mask 问题。不同中心点的邻域点数不同,处理时需要把邻域特征 padding 成统一长度,同时记录一个 mask,在池化时把无效位置遮掉。如果直接把 padding 的 0 也算进平均池化,结果一定会被稀释。我见过不少复现就是在这里静默丢分,最后还以为是算子本身精度不够。

5.3 把 PosPool 嵌进 PointNet++ 风格网络

PosPool 最常见的用法是替换 PointNet++ 的 set abstraction 里的局部 PointNet。具体步骤很简单:先做最远点采样得到中心点,然后球查询找邻域,把邻域点相对中心的位置偏移和邻域点特征一起喂给 PosPool,输出池化后的局部特征,再作为下一层的输入。

这里有个特别值得注意的点:建议在 PosPool 输出之后把中心点原始特征 concat 回去。只靠固定多项式基做位置调制,对特征的全局自描述能力比较弱,保留一个全局路径可以显著提升分割这类需要上下文的任务的效果。你可以把这个操作理解成给极简算子补一个“恒等连接”,成本极低,但对稳定性和精度的帮助很大。

网络结构上也不要一上来就做得太深。PosPool 信息复用能力强,通常三层到四层足够处理大多数室内分割场景。每层的通道数我习惯从 64 翻倍到 256,采样点数从原始点云逐步减少,最后接全局池化做分类或分割头。

6. 常见问题速查

现象排查思路解决建议
精度比论文低很多邻域半径太小/太大,或坐标未归一化先可视化邻域;把相对坐标缩放到单位尺度
训练一开始 loss 不降学习率过大,或位置基函数数值溢出调低学习率,检查相对坐标是否超范围
显存爆掉邻域点数设置过大减小球查询半径,或调小 batch size
结果对随机种子极其敏感池化时没有对 padding 点做 mask加 mask,用 sum 除以有效邻域点数
分组乘法后输出形状错乱通道数不是基函数个数倍数输入通道取 7 的倍数,或补零通道
分割边界模糊,缺乏整体语义PosPool 只看了局部在每层 concat 中心点原始特征,或者加全局上下文模块
换数据集效果下降数据密度分布变化大从 KNN 换球查询,重新标定半径

如果你发现自己的 PosPool 复现效果总是不稳定,我强烈建议你先做一个“单层诊断”:只用一层 PosPool 接一个线性分类器,在小型分类数据集上做快速实验。如果这样都能收敛,说明主干网络没问题;如果这样都不稳定,那基本可以确定是数据预处理或者邻域构建的环节出了岔子。

最后再分享一个实际项目里的体会。PosPool 这类极简单算子特别适合当“试金石”。我每接触一个新点云数据集时,会先拿它搭一个最小可跑通的基线,不做任何花哨改进,用固定参数测一遍。这样就能迅速判断数据本身的难度、标注质量、邻域参数是否合理。等拿到一个稳定可信的基线之后,再决定是往深了做还是往复杂了做。极简主义最大的价值,就是让你在复杂世界里先找到一块坚实的地面站住脚。

相关新闻

AI插件安全审核系统:三级漏斗架构与eBPF沙箱实践

AI插件安全审核系统:三级漏斗架构与eBPF沙箱实践

1. 项目概述:一个被低估的“安全门禁系统”正在成型最近在几个技术社区刷到一条消息:“Claude插件目录开源,第三方提交需过安全审核”。初看像一句平平无奇的公告,但作为连续三年深度参与多个AI工具链安全治理项目的从业者&#x…

2026/10/20 8:59:35 阅读更多 →
Java代码保护:类加载加密与代码混淆组合方案实战

Java代码保护:类加载加密与代码混淆组合方案实战

Java 做商业项目交付,最头疼的不是功能写不出来,而是交付出去的字节码等于把源码“裸奔”给客户。Class 文件天生就是为 JVM 设计的中间产物,反编译工具一抓一大把,拖进去就能看到近乎原版的代码逻辑。我见过不少团队在这个问题上…

2026/10/20 8:59:35 阅读更多 →
配电网韧性提升的移动储能预布局与动态调度策略解析

配电网韧性提升的移动储能预布局与动态调度策略解析

每年台风季,调度屏上总有那么几个节点让我觉得特别无力。线路跳闸不可怕,可怕的是关键负荷跟着一起躺平——医院、泵站、通信基站一旦断电,抢修压力直接翻倍。这时候如果有一台能"跑"的储能车,提前停在预测的关键位置&a…

2026/10/20 8:58:34 阅读更多 →

最新新闻

AI课程矩阵实战路线:从提示词工程到API调用与批量部署

AI课程矩阵实战路线:从提示词工程到API调用与批量部署

AI 课程现在不难找,难的是判断一门课在你的成长路径里到底处于哪个位置。市面上大量课程要么只教提示词,要么直接堆 ComfyUI 节点,学完能复现案例,但换个场景就不会用了。“河南元力共生 AI 课程矩阵”这个提法,核心是…

2026/10/20 9:45:00 阅读更多 →
秋招十月下旬还没回音:剩下六周怎么排

秋招十月下旬还没回音:剩下六周怎么排

版权与内容来源声明 本文为原创整理。文中涉及官方文档、开源仓库、论文与公开报道的内容,均在附表 A 中标注来源;引用官方原文保持原样,不作改写。文中命令、版本号与界面截图以本文成文时的实测/核验结果为准,标注「待验证」的部…

2026/10/20 9:45:00 阅读更多 →
Matlab GUI实时均衡器:IIR滤波器零极点与音频信号流协同设计

Matlab GUI实时均衡器:IIR滤波器零极点与音频信号流协同设计

简介:本资源是一份面向数字信号处理初学者与Matlab GUI入门者的实践型教学项目,聚焦音频信号频率响应调节这一典型应用场景,帮助学习者掌握IIR滤波器设计原理与交互式界面开发方法。压缩包共3个文件(2个.m主程序与辅助函数、1个.f…

2026/10/20 9:45:00 阅读更多 →
企业网盘选型实测:安全管控与协作效率深度对比

企业网盘选型实测:安全管控与协作效率深度对比

测评类文章最容易犯的毛病,就是把配置参数罗列一通,最后丢一句“按需选择”就完事。这篇不一样,我从企业实际使用的角度出发,把真正影响日常协作和数据安全的关键点都拆开讲清楚,包括那些厂商不会主动告诉你的限制和坑…

2026/10/20 9:45:00 阅读更多 →
AI日报系统设计与实现:从RSS聚合到智能摘要生成

AI日报系统设计与实现:从RSS聚合到智能摘要生成

我无法基于当前输入生成符合要求的博文。原因如下:输入中项目标题为“AI 日报(2026年10月10日)”,但该标题本身不具备可拆解的实质性项目属性——它是一个时间标记型信息聚合名称,而非具体技术实现、工具开发、系统搭建…

2026/10/20 9:45:00 阅读更多 →
FPGA+AD/DA协同设计:H题信号发生器与频谱分析的时序工程实践

FPGA+AD/DA协同设计:H题信号发生器与频谱分析的时序工程实践

简介:本资源为2024年全国大学生电子设计竞赛H题完整参赛代码工程包,面向电子类、自动化、通信等专业本科生及嵌入式开发初学者,聚焦高实时性、强稳定性嵌入式系统实现场景。压缩包含180个文件,主体为C语言源码(c/h&…

2026/10/20 9:43:58 阅读更多 →

日新闻

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/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出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/19 2:54:50 阅读更多 →
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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →