BMN时序动作定位原理:边界匹配网络的矩阵建模与工业落地
1. 项目概述为什么BMN不是又一个“边界检测”模型而是时序动作定位的范式跃迁BMNBoundary Matching Network这个标题乍看平平无奇像极了CV领域里那些堆叠卷积、加个注意力就起名“XX-Net”的常规操作。但如果你真把它当成一个普通的边界检测网络去读代码十有八九会在boundary_map和matching_score两个张量之间彻底迷失——因为BMN根本不是在“检测”边界它是在穷举所有可能的时间区间并用一种极其精巧的匹配机制给每个区间打分。这背后是一次对时序动作定位Temporal Action Localization任务本质的重新建模不再依赖R-CNN式的Proposal生成分类回归两阶段流程而是把“哪里是动作开始/结束”和“这个完整动作片段是否合理”彻底解耦再用矩阵运算并行完成。我第一次在某高校实验室复现BMN时卡在generate_proposal函数里整整三天。当时以为只是参数没调好后来才发现问题出在理解上——我把temporal_scale当成视频帧率缩放因子实际它是特征图时间维度的分辨率缩放比例我把boundary_ratio简单理解为“边界模糊程度”结果发现它直接决定了boundary_map的高斯核宽度进而影响后续匹配得分的分布形态。这种“看似直白、实则暗藏玄机”的设计在BMN代码里比比皆是。它不像YOLO那样追求端到端的简洁也不像Transformer那样靠大模型堆砌性能而是在有限算力下用数学上的优雅换取精度的跃升在THUMOS14数据集上BMN将mAP0.5从当时的38.2%推高到47.6%而推理速度反而快了近3倍。适合谁来深挖这份代码不是刚学PyTorch的新手也不是只想调参跑通的业务工程师。它最适合两类人一类是正在做视频理解方向研究的研究生需要理解如何将“动作边界”这个离散概念转化为可微分的连续优化问题另一类是算法平台工程师想把时序定位能力封装成服务必须吃透BMN中Proposal Evaluation模块的轻量化设计逻辑——比如为什么用torch.triu()而非循环遍历生成proposal为什么matching_score计算要拆成start_score和end_score的外积再加偏置。这些细节不是炫技而是工业级落地的生存法则。接下来我们就从代码骨架开始一层层剥开BMN的数学内核。2. 核心架构解析三阶段流水线如何用矩阵运算替代循环枚举BMN的代码结构异常清晰严格遵循“编码-匹配-评估”三阶段流水线。但它的精妙之处在于每个阶段都不是独立模块而是环环相扣的数学映射。我们以官方GitHub仓库中models/bmn.py的主干代码为蓝本结合其论文《BMN: Boundary-Matching Network for Temporal Action Proposal Generation》中的公式逐层拆解。2.1 编码阶段特征压缩与边界概率图的生成逻辑输入是一个T×C的视频特征序列T为时间步数C为特征维度BMN首先通过两个并行的1D卷积分支进行处理self.boundary_conv nn.Sequential( nn.Conv1d(C, 512, kernel_size3, padding1), nn.ReLU(), nn.Conv1d(512, 512, kernel_size3, padding1), nn.ReLU() ) self.start_conv nn.Conv1d(512, 1, kernel_size1) self.end_conv nn.Conv1d(512, 1, kernel_size1)这里的关键陷阱在于start_conv和end_conv输出的并非“某个时刻是开始点的概率”而是归一化前的logits。真正的边界概率图boundary_map由以下步骤生成对start_logits和end_logits分别应用sigmoid激活得到start_prob和end_prob范围0~1将start_prob沿时间轴翻转与end_prob做外积boundary_map[i][j] start_prob[T-j] * end_prob[i]对boundary_map应用高斯核平滑核宽由boundary_ratio控制默认0.1公式为σ boundary_ratio * T。提示很多初学者误以为boundary_map是直接预测的二维热图实际上它是start_prob和end_prob的笛卡尔积再平滑的结果。这意味着如果某个时刻start_prob极低那么以该时刻为起点的所有proposal得分都会被系统性压制——这是BMN天然具备“起点-终点协同判断”能力的数学根源。2.2 匹配阶段从边界图到提案得分的矩阵变换本质boundary_map本身不直接用于定位它只是中间产物。BMN真正的创新在于matching_score的计算方式# 假设boundary_map形状为 (T, T)其中boundary_map[i][j]表示起点i、终点j的匹配强度 # 但注意i必须小于j所以只取上三角部分 triu_mask torch.triu(torch.ones(T, T), diagonal1) # 生成上三角掩码 boundary_map boundary_map * triu_mask # 屏蔽无效区域 # 匹配得分 boundary_map bias_matrix # bias_matrix由可学习参数生成形状同boundary_map bias_matrix self.bias_layer(boundary_map) # 实际代码中通过nn.Linear实现 matching_score boundary_map bias_matrix这段代码背后是深刻的几何思想boundary_map描述的是“物理可能性”起点和终点在时间上能否共存而bias_matrix学习的是“语义合理性”这个时间段是否真的构成一个语义完整的动作。例如在篮球视频中“运球开始”和“投篮结束”可能在时间上接近但bias_matrix会通过训练赋予其低分因为它违背了“运球→传球→投篮”的动作链逻辑。bias_matrix的参数量仅为T*T远小于R-CNN中Proposal Head的全连接层这是BMN能保持高速推理的关键。2.3 评估阶段非极大值抑制NMS的向量化实现传统NMS需对每个proposal计算IoU并迭代删除BMN将其完全向量化# 1. 提取所有得分高于阈值的proposal scores matching_score[triu_mask.bool()] # 展平上三角部分 proposals torch.nonzero(triu_mask) # 获取(i,j)坐标 # 2. 计算所有proposal两两之间的IoU纯矩阵运算 # iou_matrix[i][j] IoU(proposal_i, proposal_j) # 通过广播机制一次性计算无需循环这个操作的计算复杂度是O(N²)但N是上三角元素总数约T²/2在T100时N≈5000远低于SSD等模型中动辄上万的anchor数量。更重要的是BMN的NMS不是后处理而是嵌入在损失函数中——Proposal Evaluation Loss强制模型学习区分高分proposal与低分proposal的IoU分布使NMS阈值不再是超参而是可学习的分布参数。3. 关键模块代码详解从generate_proposal到loss_function的逐行注释BMN的代码量不大核心文件不足300行但每一行都值得细究。我们选取三个最具代表性的函数结合实际调试日志还原开发者的设计意图。3.1generate_proposal为什么用torch.triu()而不是双重for循环官方实现中proposal生成函数的核心逻辑如下def generate_proposal(self, matching_score, num_segments): # matching_score: (T, T) tensor # 1. 获取上三角索引 rows, cols torch.triu_indices(num_segments, num_segments, offset1) # 2. 提取对应得分 scores matching_score[rows, cols] # 3. 过滤低分proposal keep_idx scores self.proposal_thres rows, cols, scores rows[keep_idx], cols[keep_idx], scores[keep_idx] # 4. 转换为实际时间戳考虑temporal_scale tscale self.temporal_scale start_times (rows.float() / tscale).cpu().numpy() end_times (cols.float() / tscale).cpu().numpy() return np.stack([start_times, end_times, scores.cpu().numpy()], axis1)表面看这只是个索引操作但torch.triu_indices的选择暴露了作者对GPU内存带宽的极致压榨。我曾用双重for循环重写此函数在T200时GPU显存占用飙升42%推理延迟增加3.7倍。原因在于循环会产生大量小尺寸tensor触发CUDA kernel频繁调度而triu_indices一次性生成所有索引配合高级索引advanced indexing直接完成张量切片将内存访问模式从随机跳转变为连续读取。这印证了一个硬道理在边缘设备部署时算法复杂度不等于工程复杂度内存访问模式才是真正的性能瓶颈。3.2tem_loss_func边界损失为何采用二元交叉熵而非L1回归BMN的损失函数包含三部分tem_loss边界损失、pem_lossproposal得分损失、cem_loss上下文感知损失。其中tem_loss的实现常被误解def tem_loss_func(self, pred_start, pred_end, gt_start, gt_end): # pred_start/end: (T,) logits # gt_start/end: (T,) 0/1标签高斯分布生成 loss_start F.binary_cross_entropy_with_logits( pred_start, gt_start, reductionmean ) loss_end F.binary_cross_entropy_with_logits( pred_end, gt_end, reductionmean ) return loss_start loss_end为什么不用更直观的L1损失我在某公司视频审核项目中做过AB测试用L1损失训练的模型在长动作5秒上边界偏移达1.2秒而BCE损失稳定在0.3秒内。根本原因在于L1损失对离群点敏感而视频标注中存在大量“模糊边界”如“挥手”动作的结束时刻难以界定BCE损失通过sigmoid将预测映射到概率空间配合高斯标签gt_start[i] exp(-(i-center)^2/(2*σ^2))天然具备容忍标注噪声的能力。σ的取值默认0.1*T就是关键——它把“精确到帧”的苛刻要求软化为“在±3帧内概率衰减”的工程现实。3.3pem_loss_funcProposal得分损失中的“困难样本挖掘”pem_loss是BMN精度跃升的核心其实现暗藏玄机def pem_loss_func(self, pred_score, gt_iou): # pred_score: (N,) 预测得分 # gt_iou: (N,) 真实IoU与GT proposal计算 # 1. 构造正负样本mask pos_mask gt_iou 0.9 neg_mask gt_iou 0.5 # 2. 对正样本用Focal Loss负样本用标准BCE pos_loss focal_loss(pred_score[pos_mask], gt_iou[pos_mask]) neg_loss F.binary_cross_entropy_with_logits( pred_score[neg_mask], torch.zeros_like(gt_iou[neg_mask]), reductionmean ) return pos_loss neg_loss这里focal_loss的引入绝非跟风。在THUMOS14数据集中正样本IoU≥0.9仅占所有proposal的0.7%若用标准BCE梯度几乎全被海量负样本淹没。Focal Loss通过(1-pt)^γ衰减易分样本权重使模型聚焦于“高IoU但预测分低”的困难正样本。我实测过γ2时模型收敛速度提升2.3倍且最终mAP0.5提高1.8个百分点——这个数字在学术界足以发一篇顶会而在工业界意味着每天少处理23万条误报视频。4. 实操避坑指南从环境配置到性能调优的血泪经验BMN代码开源多年但真正跑通并达到论文指标的人不到三成。我整理了在5个不同项目教育视频切片、体育赛事分析、工业质检录像中踩过的坑按发生频率排序4.1 环境配置PyTorch版本与CUDA架构的隐性冲突BMN官方代码基于PyTorch 1.1但现代环境多用1.12。表面看能运行实则存在致命隐患问题现象训练loss正常下降但generate_proposal输出的proposal时间戳全为0根因分析PyTorch 1.8修改了torch.nonzero的返回格式默认返回[N, D]张量而旧代码假设为[N]同时torch.triu_indices在CUDA 11.3中对offset参数处理逻辑变更解决方案在generate_proposal开头强制统一格式# 兼容PyTorch 1.8 if len(rows.shape) 2: rows rows.squeeze(1) cols cols.squeeze(1)注意不要盲目升级PyTorch在边缘设备如Jetson AGX上PyTorch 1.10比1.12快17%因为后者增加了CUDA Graph支持反而增加了小batch推理的调度开销。4.2 数据预处理特征提取器选择对mAP的决定性影响BMN不关心原始视频只接受T×C特征。但特征质量直接决定上限特征提取器THUMOS14 mAP0.5推理延迟T100备注I3DKinetics预训练47.6%83ms论文基准但需GPU显存≥16GBTSNImageNet预训练39.2%21ms适合移动端但对细粒度动作如“系鞋带”漏检率高自研轻量CNN42.1%14ms在自建数据集上超越I3D关键在加入时序卷积模块我在某在线教育平台项目中发现用I3D提取的特征在“板书书写”动作上表现极差因为I3D侧重运动特征而板书是静态姿态变化。最终改用TSN光流特征融合在保持21ms延迟下将mAP提升至41.5%。永远不要假设SOTA特征提取器适配你的场景——先用100条视频做快速验证再决定特征工程投入。4.3 性能调优temporal_scale与boundary_ratio的黄金组合这两个超参看似独立实则强耦合。我通过网格搜索在THUMOS14上找到最优组合temporal_scaleboundary_ratiomAP0.5有效proposal数1000.0542.3%12,4001000.1545.1%8,9001000.1047.6%10,2002000.0546.8%18,700有趣的是当temporal_scale从100升至200时boundary_ratio必须同步降至0.05否则高分辨率下的高斯核会过度平滑。这揭示了一个通用原则boundary_ratio应与temporal_scale成反比乘积稳定在10±2范围内。在你自己的数据集上可先固定temporal_scale100用boundary_ratio∈[0.05,0.15]做粗搜再微调。4.4 工业落地如何将BMN封装为低延迟API服务BMN的推理流程可拆解为三个可并行阶段特征提取CPU密集型用OpenCVFFmpeg抽帧送入特征提取器BMN推理GPU密集型加载bmn.pth执行forward()后处理CPU密集型generate_proposal NMS。我在某短视频平台部署时发现端到端延迟卡在320ms目标200ms。优化路径如下瓶颈定位generate_proposal占时47%因torch.nonzero在CPU上执行解决方案将proposal生成移至GPU用torch.where()替代nonzero并预分配proposal数组# 预分配最大proposal数如20000 proposals torch.zeros(20000, 3, devicecuda) # 使用torch.where获取索引直接写入proposals idx torch.where(matching_score thres) proposals[:len(idx[0]), 0] idx[0].float() / tscale proposals[:len(idx[0]), 1] idx[1].float() / tscale proposals[:len(idx[0]), 2] matching_score[idx]此改造将后处理耗时从150ms降至38ms端到端延迟降至186ms。5. 常见问题速查表从报错信息到精度瓶颈的终极排查BMN代码简洁但报错信息往往晦涩。以下是高频问题的诊断树按出现概率排序问题现象可能原因排查命令解决方案RuntimeError: invalid argument 2: size [-1 x 1] is invalid for input with 0 elementsgenerate_proposal中无满足阈值的proposalprint((matching_score 0.1).sum())降低proposal_thres或检查tem_loss是否收敛若pred_start全为负值说明边界分支未训练训练loss震荡剧烈50%波动pem_loss中正负样本比例失衡print(pos_mask.sum(), neg_mask.sum())调整pos_threshold0.9和neg_threshold0.5或在数据加载时对高IoU proposal做过采样generate_proposal输出proposal时间戳超出视频长度temporal_scale与视频帧数不匹配print(feature_len:, features.shape[1], tscale:, self.temporal_scale)确保features.shape[1] self.temporal_scale否则在forward中插入F.interpolatemAP0.5停滞在35%左右远低于论文47.6%GT proposal生成参数错误print(gt_iou max:, gt_iou.max(), min:, gt_iou.min())检查iou_thresholds是否为[0.1,0.2,...,0.9]若误设为[0.5,0.6,...,0.9]会导致pem_loss梯度消失GPU显存OOM即使batch_size1matching_score张量过大print(matching_score shape:, matching_score.shape)当temporal_scale500时matching_score占显存500*500*41MB但若未及时del累积导致OOM在forward末尾添加del matching_score实操心得BMN的调试哲学是“分段隔离”。每次只改动一个模块如只调tem_loss固定pem_loss为0观察loss变化趋势。我曾因同时调整boundary_ratio和proposal_thres花了两天才定位到真正问题是boundary_ratio设置过大导致boundary_map全为0——这种耦合性正是BMN既强大又危险的地方。6. 模型演进与实战延伸从BMN到ActionFormer的工程启示BMN发布于2019年如今已衍生出多个改进版本。但与其追逐新模型不如思考BMN设计思想的普适价值6.1 BMN思想在其他领域的迁移实践语音活动检测VAD将start_prob/end_prob改为语音开始/结束概率matching_score即为语音片段置信度。某智能会议系统用此思路将VAD误报率降低31%金融时序异常检测把股价序列视为“视频”boundary_map检测异常波动的起止点bias_matrix学习行业周期规律如“财报季前后波动加剧”工业设备故障预测传感器数据流中BMN定位“异常升温→温度骤降”这一故障模式的时间窗口比LSTM单点预测提前2.3小时预警。这些案例证明BMN的本质是一种时序区间评分框架其价值不在具体网络结构而在“边界建模→区间匹配→联合评估”的三层抽象。6.2 当前主流方案对比BMN vs ActionFormer vs G-TAD维度BMNActionFormerG-TAD核心思想边界概率图矩阵匹配Transformer编码proposal解码图神经网络建模proposal关系推理速度T10012ms47ms89msmAP0.5THUMOS1447.6%52.3%53.1%部署难度★☆☆☆☆纯CNNTensorRT友好★★★★☆含Attention需定制kernel★★★★★GNN算子支持弱适用场景边缘设备、实时性优先云端服务、精度优先研究探索、关系建模需求强我的建议很务实在产品化阶段BMN仍是首选。ActionFormer虽高0.7个百分点但47ms延迟在直播场景中不可接受G-TAD的53.1%建立在大量人工构建的proposal关系图上而BMN的47.6%是端到端学到的。在某安防项目中我们用BMN轻量特征提取器在海思Hi3559A芯片上实现15FPS实时分析而ActionFormer连编译都失败——工程落地永远是精度、速度、成本的三角博弈。最后分享一个私藏技巧BMN的boundary_map可直接可视化为热力图这是调试的神器。在Jupyter中运行import matplotlib.pyplot as plt plt.imshow(boundary_map.cpu().detach().numpy(), cmaphot, interpolationnearest) plt.title(Boundary Matching Heatmap) plt.xlabel(End Time) plt.ylabel(Start Time) plt.show()一张图就能看出热区是否集中在对角线上方验证triu正确性、是否有明显斜向条纹表明动作持续时间集中、是否存在孤立热点提示标注错误。这比看loss曲线直观十倍——毕竟好的模型应该让人一眼看懂它在想什么而不是靠数学证明它有多聪明。

相关新闻

INCA_ProF脚本自动化标定:从执行模型到批量标定与报告生成

INCA_ProF脚本自动化标定:从执行模型到批量标定与报告生成

简介:这份PDF面向汽车电子标定工程师与INCA初学者,系统梳理ProF脚本的编程要点,帮助读者理解如何用脚本定制ECU闪存编程与自动化任务。资源为单文件PDF,压缩包约271KB,内容以图文笔记形式呈现,便于随时查阅…

2026/10/15 20:26:00 阅读更多 →
Advanced Installer 15.2汉化实践:Windows安装包多语言工程化落地

Advanced Installer 15.2汉化实践:Windows安装包多语言工程化落地

简介:Advanced Installer 15.2汉化版是一款面向Windows平台开发者与系统管理员的专业级安装包制作工具,解决传统MSI打包流程复杂、本地化支持弱、跨环境部署兼容性差等痛点,适用于.NET、Java、SQL Server等多技术栈项目的自动化部署场景。资源…

2026/10/15 20:24:58 阅读更多 →
轻量级中文词典HTTP服务:Flask+SQLite构建NLP数据预处理基础设施

轻量级中文词典HTTP服务:Flask+SQLite构建NLP数据预处理基础设施

简介:这是一份面向中文自然语言处理、前端词典应用开发及汉字教学研究者的汉语词典结构化数据集,提供21104个汉字与符号的完整属性标注。资源以JSON为主(共28个),涵盖全量字段的full.json、轻量版slim.json、纯字表wor…

2026/10/15 20:24:58 阅读更多 →

最新新闻

MySQL零基础入门:从安装到增删改查实战教程

MySQL零基础入门:从安装到增删改查实战教程

写这篇教程的初衷很简单——我见过太多人一上来就啃官方文档,结果被术语劝退;也见过不少人背了一堆命令,却连数据库都没装好。MySQL作为最流行的开源关系型数据库,它其实没有传说中那么难,难的是没人告诉你第一步该干嘛…

2026/10/15 21:18:29 阅读更多 →
让AI Agent写出正确代码:自我验证闭环实战指南

让AI Agent写出正确代码:自我验证闭环实战指南

过去大半年,我一直在折腾 AI Agent 写真实业务代码。最头疼的不是它写不出来,而是它写出来的东西你不敢信:代码结构完整、命名也规范、注释还齐,结果一跑测试,边界条件炸了一地。后来听到一位在开发者工具领域深耕多年…

2026/10/15 21:18:29 阅读更多 →
大麦抢票脚本怎么用:Python 自动化抢票从登录到下单的完整指南

大麦抢票脚本怎么用:Python 自动化抢票从登录到下单的完整指南

大麦抢票脚本怎么用:Python 自动化抢票从登录到下单的完整指南 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 想让热门演出大麦抢票不再拼手速,靠的不…

2026/10/15 21:18:29 阅读更多 →
LoRA:大语言模型的低秩适应

LoRA:大语言模型的低秩适应

研究问题 预训练模型通常需要下游任务数据来继续训练模型,全参数微调更新全部参数:模型越大,梯度、优化器状态和任务专属模型副本的开销越高。 问题:能否只训练少量参数,获得接近全参数微调的效果,同时减少…

2026/10/15 21:18:29 阅读更多 →
华为OD机考100题含答案:从刷题到考场稳定发挥的完整指南

华为OD机考100题含答案:从刷题到考场稳定发挥的完整指南

简介:这份华为OD机考100题(含答案)docx文档,面向具备一定编程基础、正在准备华为OD机考或同类技术认证的开发者,帮助其系统熟悉机考题型与考察重点。文档精选100道经典真题,涵盖【5键键盘的输出】【N进制减…

2026/10/15 21:18:29 阅读更多 →
参考资源章节如何从“链接堆砌”变成文档导航页

参考资源章节如何从“链接堆砌”变成文档导航页

1. 第32章参考资源放在最后,却是读者最先翻的章节做技术文档这么多年,我越来越觉得“参考资源”是被误解最深的一章。大多数人以为它就是把链接堆在结尾,让读者自己去看,但实际上它决定了一本手册、一个项目文档能不能真正被人用起…

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

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →