cv2.dnn.NMSBoxes()深度解析:从IoU原理到返回值版本坑与调参实战
我第一次在项目里被 cv2.dnn.NMSBoxes() 坑到是因为没搞清楚它的返回值。当时我接手一个目标检测服务的后处理模块模型一顿推理输出几百个候选框同一个目标被框了七八次那边线上接口还在等结果我这边看着满屏乱七八糟的矩形框头皮发麻。一开始我想自己写个循环做非极大值抑制后来发现 OpenCV 的 dnn 模块本身就带了这个函数以为拿来就能用结果在解析返回值时又浪费了小半天。今天就把我对这个函数的理解完整梳理一遍。如果你也在做目标检测相关开发或者正在被模型输出的一堆重叠框折磨这篇文章应该能帮你少走不少弯路。我会从原理讲起把参数、返回值、版本差异、调参经验一次说清楚。1. NMSBoxes到底在解决什么问题1.1 目标检测后处理中的“框灾”做过目标检测的人应该都有印象模型推理完并不是直接就能交付结果的。像 YOLO、SSD、Faster R-CNN 这类检测模型本质上会在特征图的每个位置上生成大量候选框每个候选框都带着一个置信度分数。模型训练时让这些框去逼近真实目标推理时它们就全都冒出来了。结果是同一个物体周围会聚集一大堆高度重叠的矩形框。比如一只猫左上角可能同时存在五六个框得分从 0.95 一直到 0.4框的位置只差几个像素。如果直接把模型输出展示给用户你会看到猫身上叠着好几层框线而别的目标可能只被一个框覆盖。这种候选框冗余的“框灾”就是非极大值抑制要处理的。不夸张地说NMS 是检测模型和最终交付之间的关键桥梁。没有它模型输出就只能算半成品。我见过不少新手直接拿模型输出画图结果界面上全是密密麻麻的矩形第一反应是模型训练失败了其实是后处理没做。1.2 NMS的通俗逻辑和IoU计算NMS 的全称是 Non-Maximum Suppression翻译过来叫非极大值抑制。这个名字很学术但逻辑其实特别简单我打个比方你就懂了。想象一下停车场里只剩下一个车位但有十来辆车都想停进去。管理员怎么处理先看谁最靠谱比如离车位最近的那辆先停进去然后告诉其他车“你们跟它重叠太多都走吧”。这就是非极大值抑制的思路在所有候选框里留下置信度最高的那一个把跟它重叠度高的其他框全部丢掉。那“重叠度”在数学上怎么衡量就用 IoU也就是交并比。它是两个框的交集面积除以并集面积取值范围 0 到 1越接近 1 说明两个框重叠得越厉害。IoU 的计算代码很简单def iou(box_a, box_b): # 交集区域左上角和右下角 x1 max(box_a[0], box_b[0]) y1 max(box_a[1], box_b[1]) x2 min(box_a[2], box_b[2]) y2 min(box_a[3], box_b[3]) inter_area max(0, x2 - x1) * max(0, y2 - y1) # 各自的面积 area_a (box_a[2] - box_a[0]) * (box_a[3] - box_a[1]) area_b (box_b[2] - box_b[0]) * (box_b[3] - box_b[1]) # 并集面积 union_area area_a area_b - inter_area return inter_area / union_area有了 IoUNMS 的标准流程就四步先把所有候选框按置信度从高到低排序取当前得分最高的框把它加入最终结果遍历剩下所有的框计算它们跟当前最高分框的 IoU只要超过设定阈值就直接删除然后对剩下的框重复这个过程直到没有候选框为止。cv2.dnn.NMSBoxes() 干的就是这件事只是在内部实现上增加了一些优化和额外功能。1.3 为什么直接用dnn模块的实现也有人问我自己手写 NMS 也不难为什么非要用 OpenCV 这个函数我在早期确实自己写过Python 循环版本跑起来倒也还行但后来发现 OpenCV 的实现有两个明显优势。第一是性能。OpenCV 的底层是 C 实现对排序、索引管理这些操作做了优化比自己用 Python 列表一遍遍循环快很多。在视频流逐帧推理的场景下这个差距会直接体现在帧率上。第二是功能完整。cv2.dnn.NMSBoxes() 内部已经内置了置信度过滤和 Soft-NMS 的支持相当于把后处理里最容易踩坑的两个细节都封装好了。自己写的话这些逻辑需要逐个手动实现而且很容易漏掉边界情况。另外要注意这个函数在 OpenCV 的 dnn 子模块下面不是全局的 cv2.nms。我见过有人写成 cv2.nms一运行就报 AttributeError。接口位置比较隐蔽可能也是这个函数经常被忽视的原因之一。2. 参数与返回值从原理到API细节2.1 参数逐一拆解尤其是bboxes格式cv2.dnn.NMSBoxes() 的完整签名在 Python 接口里大致长这样cv2.dnn.NMSBoxes(bboxes, scores, score_threshold, nms_threshold, eta1.0, top_k0)看起来只有几个参数但每个都有讲究。我整理了一张表方便对比参数类型作用默认值常见坑bboxeslist / ndarray候选框坐标无必须是 [x1, y1, x2, y2] 格式scoreslist / ndarray每个框的置信度无必须与 bboxes 一一对应score_thresholdfloat低于该分数的框直接丢弃0.5设太低会引入大量低质量框nms_thresholdfloatIoU 抑制阈值0.4设太大保留框过多设太小漏检etafloatSoft-NMS 动态衰减系数1.0仅在 nms_threshold 0 时生效top_kint参与抑制的候选框数量上限00 表示不限制先说 bboxes。它必须是左上角和右下角坐标也就是 [x1, y1, x2, y2]不是中心坐标加宽高 [cx, cy, w, h]。这一点太容易错了。我见过不少同学把模型输出的中心格式直接传进去结果 NMS 的效果完全不对因为函数内部默认你给的是绝对坐标。如果你手里是 [cx, cy, w, h]一定要先换算成左上右下再传。scores 就简单得多每个候选框对应一个置信度分数和 bboxes 的列表顺序要严格一致。如果模型输出的是归一化分数记得先把低于阈值的过滤掉再传入或者干脆让 score_threshold 帮你过滤。score_threshold 是 NMS 的前置筛选器。函数拿到候选框后第一步不是排序而是先把所有低于这个分数的框直接丢掉。这个参数默认是 0.5但在实际项目里很多人会调低到 0.25 左右避免漏检。nms_threshold 就是前面说的 IoU 阈值。它决定了两个框重叠到什么程度算重复。这个参数调大了保留的框更多可能一个目标输出好几个框调小了重叠目标会被误杀。2.2 容易被忽略的eta和top_keta 和 top_k 这两个参数平时用得不多但理解它们有助于加深对函数的认识。eta 对应 Soft-NMS 的思路。传统 NMS 对超过 IoU 阈值的框是直接硬删除但 Soft-NMS 觉得这样太粗暴尤其是密集场景下两个目标靠得很近时一个目标的高分框可能会把另一个目标的低分框直接删掉。eta 的作用是让 nms_threshold 在迭代过程中动态变小相当于抑制条件越来越严格保留一部分“边缘框”的余地。在 OpenCV 实现里eta 大于 0 时就会启用这个动态衰减逻辑。不过我用下来感觉普通检测任务保持默认值就好只有在特定密集场景才需要调它。top_k 是候选框数量上限。模型推理输出几千个框但真正有价值的可能就那么几十个。top_k 设为 200 或者 400NMS 只处理分数最高的前 K 个框可以显著减少计算量。对视频流或者嵌入式设备来说这个参数是调优速度的有效手段。2.3 返回值在两个版本之间的“断裂”这是我最想提醒大家的一个点。cv2.dnn.NMSBoxes() 的返回值在不同版本的 OpenCV 里不一样接口升级不兼容会直接把代码搞崩。在老版本里比如 OpenCV 4.5.x 早期这个函数返回一个简单的索引列表列表里每个元素是保留框的原始下标直接用 for 循环遍历就行。但在新版本里函数返回的是一个元组类似 (indices, num_kept)。其中 indices 是一个形状为 (N, 1) 的二维数组N 是保留框数量num_kept 是保留数量本身。如果你还按老写法result cv2.dnn.NMSBoxes(boxes, scores, 0.3, 0.4) for i in result: print(i)在新版本里i 不是整数而是一个只含一个元素的数组后续用 boxes[i] 取坐标的时候就会报错或者取错数据。所以我的建议是写一个兼容函数统一处理返回值def parse_nms_result(result): if result is None: return [] if isinstance(result, tuple): indices, _ result if indices is None: return [] indices np.asarray(indices).reshape(-1) return indices.tolist() return list(result)这样不管在哪个 OpenCV 版本下跑结果都能正确解析成普通整数列表。这个兼容代码我已经用在新老项目里都没出过问题。3. 完整实操从模拟输出到可视化3.1 一个最小可运行的演示理解了原理和参数接下来我用一组模拟数据完整跑一遍方便你直接复制代码去验证。假设模型输出了 5 个候选框其中第 0 和第 1 个框重叠很严重第 2 和第 3 个框也重叠很严重第 4 个框是单独一个目标import cv2 import numpy as np boxes [ [10, 10, 60, 60], # 目标1的高分框 [12, 12, 62, 62], # 目标1的低分框 [80, 80, 130, 130], # 目标2的高分框 [82, 82, 132, 132], # 目标2的低分框 [50, 100, 110, 160] # 目标3 ] scores [0.91, 0.72, 0.85, 0.65, 0.33] result cv2.dnn.NMSBoxes(boxes, scores, score_threshold0.3, nms_threshold0.5) indices parse_nms_result(result) print(保留的框索引:, indices) # 可视化 img np.zeros((200, 200, 3), dtypenp.uint8) for i, box in enumerate(boxes): if i in indices: # 保留的框用绿色加粗 cv2.rectangle(img, (box[0], box[1]), (box[2], box[3]), (0, 255, 0), 2) else: # 被抑制的框用红色细线 cv2.rectangle(img, (box[0], box[1]), (box[2], box[3]), (0, 0, 255), 1) cv2.imshow(NMS result, img) cv2.waitKey(0) cv2.destroyAllWindows()输出结果应该是保留索引 [0, 2, 4]。第 0 号框得分 0.91把 IoU 超过 0.5 的第 1 号框抑制掉第 2 号框得分 0.85把第 3 号框抑制掉第 4 号框跟前面两组都不重叠独立保留而且分数 0.33 高于 score_threshold 0.3所以没有被过滤。你可以试着把 nms_threshold 改成 0.6你会发现第 1 号和第 3 号框也可能保留下来因为阈值放宽了对 IoU 的容忍度变大。把 score_threshold 改成 0.5第 4 号框就会被过滤掉。这个例子直观展示了两个阈值的协同作用。3.2 bboxes的数据格式究竟有多重要这个函数的输入格式细节比一般 Python 接口更敏感。bboxes 可以是 Python 列表也可以是 numpy 数组但坐标顺序必须是 [x1, y1, x2, y2]。我在实际调试中遇到过这样的问题模型输出的候选框是 [x_center, y_center, width, height] 格式我图省事直接转成列表传进去结果 NMS 结果乱七八糟。仔细检查才发现函数把 width 当成了 x2把 height 当成了 y2IoU 计算全错。正确做法是先做一次格式转换def xywh_to_xyxy(boxes): converted [] for cx, cy, w, h in boxes: x1 cx - w / 2 y1 cy - h / 2 x2 cx w / 2 y2 cy h / 2 converted.append([x1, y1, x2, y2]) return converted另外坐标值最好用浮点数。如果你传入的是整数OpenCV 内部会做类型转换但为了保险起见我一般会先在 numpy 里统一成 float32boxes np.array(boxes, dtypenp.float32) scores np.array(scores, dtypenp.float32)还有一个容易忽略的点scores 的长度必须和 boxes 的行数一致。如果不一致OpenCV 会直接报参数错误排查起来反而简单。3.3 如果检测框带旋转角度怎么办普通 NMSBoxes 处理的是轴对齐矩形。但有些场景里比如文本检测、车牌识别模型输出的是带旋转角度的框这时候就得用另一个接口cv2.dnn.NMSBoxesRotated()。这个函数和 NMSBoxes 的区别在于 bboxes 的格式变成了 [cx, cy, w, h, angle]角度通常用弧度表示。它的返回值也是索引列表但解析方式和普通版本一样要注意版本兼容问题。另外还有一个 NMSBoxesBatched()适合多类别检测时一次性处理所有类别的候选框不用写 for 循环按类别单独调用。它的输入会复杂一些需要把每个类别的分数拼成一个矩阵但处理效率更高。如果你的检测模型类别很多可以研究一下这个接口。4. 常见坑与排查实录4.1 返回值tuple导致索引报错的根源我在文章开头提到被返回值坑过这里展开说说具体现象。有段时间我用的 OpenCV 版本升级了原本好好的代码突然报错result cv2.dnn.NMSBoxes(boxes, scores, 0.3, 0.4) for i in result: box boxes[i] # TypeError: only integer scalar arrays can be converted to a scalar index报错信息很明确i 不是一个整数标量而是一个数组。原因就是新版本返回的是一个 (indices, num_kept) 元组我直接用 result 去遍历等于遍历了一个混合对象。这种问题在多人协作的项目里尤其容易发生因为每个人的本地环境版本不一样有人跑老代码没问题有人跑就崩。我的解决办法就是在公共工具模块里放一个解析函数所有调用 NMSBoxes 的地方都走同一个入口遇到版本差异只改一处。还有一个更隐蔽的问题是老版本里如果所有检测框都被过滤掉了返回值可能是一个空列表而新版本里可能是 (None, 0)。如果代码里没有做空结果判断后续取索引的时候就会操作 None 报错。所以解析函数里一定要处理 None。4.2 score_threshold设太低会“误伤”高分组很多人以为 score_threshold 只是个过滤小开关设成 0 或者 0.05 无所谓反正 NMS 会继续处理。这个认知会埋雷。举个例子。两个目标靠得很近目标 A 的框得分 0.9目标 B 的框得分 0.6。如果 score_threshold 设得很低比如 0.05那些背景噪声框也会进入候选集。这些噪声框虽然分数低但位置可能恰好跟目标 A 的框 IoU 很高排序后进入 NMS 流程被当成“第二个候选”参与相互抑制最终可能把目标 A 的框意外删除或者把噪声框当成结果保留下来导致误检。正确的做法是让 score_threshold 只负责过滤掉“明显是背景”的框真正的重叠问题交给 nms_threshold 处理。我一般会把 score_threshold 设到 0.2 到 0.4 之间具体根据验证集上模型输出的分数分布来定。4.3 不同场景的阈值调参速查每个人项目里的模型、数据、场景都不一样没法给一个万能阈值。但根据我在多个项目里的经验可以整理一个起步参考表检测场景建议score_threshold建议nms_threshold经验备注通用目标检测0.3 ~ 0.50.4 ~ 0.5默认 0.4 比较稳妥密集小目标0.2 ~ 0.30.3 左右高 IoU 误删概率大nms 不宜太高行人 / 人群遮挡0.30.2 ~ 0.3遮挡严重时只能靠降低阈值换召回文本检测0.30.4 ~ 0.5倾斜文本建议用 Rotated 版本视频流 / 嵌入式部署0.4 ~ 0.50.4配合 top_k 控制计算量需要说明的是这些数值只是初始参考最终还是要看你自己的验证集指标。我习惯的做法是固定 nms_threshold把 score_threshold 从 0.1 到 0.6 每隔 0.05 测一遍画出召回率和精确率曲线再反过来调整。5. 从调参到落地的几句大实话5.1 先可视化再调参别对着日志猜我见过太多人在终端里打印一堆 IoU 数值然后对着数字猜问题。说实话效果很差。人眼对空间重叠的感知能力远超对数字的感知能力。我的习惯是把 NMS 前后的框画在同一张图里作对比红色是原始候选框绿色是 NMS 保留框。如果发现一个目标仍然有两个绿框说明 nms_threshold 太大如果发现一个该保留的目标没有绿框说明被误杀了要么 score_threshold 太高要么 nms_threshold 太小。有了视觉反馈调参效率会高很多。5.2 多类别检测建议按类别分别做NMS如果你的检测模型是同时检测多个类别的比如猫、狗、车而且这些类别之间没有空间互斥关系那在调用 NMSBoxes 之前最好先按类别分组每组单独做一次 NMS。原因是 NMS 只看框的重叠不关心类别。两个不同类别的目标如果靠得很近全局 NMS 可能把一个类别的高分框干掉保留另一个类别的低分框输出结果就不符合预期了。简单的做法是final_indices [] for class_id in range(num_classes): class_mask np.where(class_ids class_id)[0] class_boxes [boxes[i] for i in class_mask] class_scores [scores[i] for i in class_mask] idx parse_nms_result(cv2.dnn.NMSBoxes(class_boxes, class_scores, 0.3, 0.4)) final_indices.extend([class_mask[i] for i in idx])当然如果你的业务需求是“同一个物理区域只输出一个检测框”那全局 NMS 也是合理的具体看场景。5.3 部署环境里我踩过的几个坑最后分享几个我在生产环境部署时遇到的真实问题希望你能直接避开。第一个是视频流逐帧调用。检测模型跑一帧可能输出上千个候选框虽然 NMS 本身不算慢但如果每帧都把全部框传进去累计耗时很可观。我的做法是先按 score_threshold 快速过滤一遍把候选框压到两三百个以内再加 top_k 限制NMS 耗时基本可以忽略不计。第二个是版本兼容。同一套代码在开发环境和部署服务器上跑OpenCV 版本不一致返回值不一样线上直接报错。所以一定要用解析函数把返回值格式统一掉这是最低成本的保险措施。第三个是阈值写死在代码里。早期我在推理代码里直接写 nms_threshold 0.4后来换了一组新数据需要调阈值就得改代码重新发布。现在我把所有后处理参数放在配置文件里线上调参不用改一行代码只需要重启服务或者重新加载配置。第四个要注意的是不要在推理线程里打印日志。NMS 本身很快但如果你在循环里加了一堆 print帧率瞬间掉一半。我之前在联调时干过这事后来用日志库加开关控制只有调试模式才输出。我还想提一个具体案例。有次我在一个检测项目里发现多个目标互相靠得很近时nms_threshold 用 0.4 总是把其中一个目标的框误杀。后来我调成 0.3同时把 score_threshold 从 0.3 提到 0.4整体效果明显改善。这个案例说明两个阈值不是孤立调的score_threshold 提高能滤掉更多低质量框nms_threshold 降低能减少相邻目标的误杀两者配合往往比单独调一个更有效。根据我个人经验凡是遇到 NMS 相关的诡异问题第一步永远是可视化。把模型的原始输出画出来把阈值过滤后的结果画出来把 NMS 的结果画出来三步对比之下问题基本一目了然。别怕改阈值也别一直依赖默认值你的数据只有你自己最懂。

相关新闻

锂电池双串主动均衡设计:MP2642GR-Z与STM32F446RE协同方案

锂电池双串主动均衡设计:MP2642GR-Z与STM32F446RE协同方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 1:22:20 阅读更多 →
NLP库版本升级导致tokenizer参数报错的根因与治理

NLP库版本升级导致tokenizer参数报错的根因与治理

1. 这个报错不是你的代码写错了,而是版本契约被悄悄撕毁了“TypeError:init() got an unexpected keyword argument tokenizer_language”——这个报错我第一次见到时,正帮某高校实验室调试一个文本预处理Pipeline。当时整个流程跑得好好的,突…

2026/10/17 1:22:20 阅读更多 →
Kotlin实战指南:从空安全到协程,构建Android应用的完整技能闭环

Kotlin实战指南:从空安全到协程,构建Android应用的完整技能闭环

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 1:22:20 阅读更多 →

最新新闻

UGUI撞上DOTS:Canvas性能黑洞与ECS渲染管线重构

UGUI撞上DOTS:Canvas性能黑洞与ECS渲染管线重构

简介:UGUIDots 是一套面向数据技术栈(DOTS)的 UI 解决方案,专为希望在 Unity 中兼顾 UGUI 工作流与 ECS 性能的开发者设计。它并非替代 Unity 原生 UI,而是在其基础上扩充,让 UI 设计流程基本保持不变&…

2026/10/17 2:34:37 阅读更多 →
科捷智能职位分析:售后服务工程师

科捷智能职位分析:售后服务工程师

本文基于科捷智能官方最新工作职责、任职资格撰写,精准聚焦新能源事业部锂电配套智能仓储物流设备售后场景,针对性拆解岗位定位、必备专业知识、核心实操技能、岗位职责、简历优化方案、高频面试真题及应答技巧,完全贴合企业用人标准与现场工…

2026/10/17 2:34:37 阅读更多 →
科捷智能职位分析:电气工程师(新能源事业部)

科捷智能职位分析:电气工程师(新能源事业部)

本文基于科捷智能官方工作职责与任职资格撰写,精准聚焦新能源事业部锂电赛道,主打锂电化成分容、原材料库、集片库、新能源仓储物流自动化电气设计与调试岗位。全面拆解岗位定位、专业知识、核心技能、工作权责、简历优化、高频面试题与应答技巧&#xf…

2026/10/17 2:34:37 阅读更多 →
动力电池膨胀深度拆解(01):物理化学本质 - 嵌锂膨胀与产气膨胀的力学逻辑与判定阈值

动力电池膨胀深度拆解(01):物理化学本质 - 嵌锂膨胀与产气膨胀的力学逻辑与判定阈值

LFP电芯的体积变化由两条本质不同的主线叠加而成:可逆的嵌锂膨胀(石墨~10%/LFP~6.5%) 与 不可逆的产气膨胀。前者是正常"呼吸",后者是故障信号。二者的区别不在体积数字,而在可逆性、应力分布和时间尺度。17…

2026/10/17 2:34:37 阅读更多 →
科捷智能职位分析:数据架构师

科捷智能职位分析:数据架构师

本文严格依据科捷智能官方工作职责、任职资格,结合智能制造、装备制造、项目制交付企业业务特性,对标DAMA、华为数据之道两大权威体系,系统性拆解数据架构师岗位定位、必备专业知识、核心软硬技能、岗位职责、简历优化策略、高频面试真题及标…

2026/10/17 2:34:37 阅读更多 →
PDMS-AVEVA-E3D二次开发教程(18):批量化作业与无人值守——任务清单、幂等、日志与失败隔离

PDMS-AVEVA-E3D二次开发教程(18):批量化作业与无人值守——任务清单、幂等、日志与失败隔离

版本声明 本篇基线为 AVEVA E3D Design 3.1,涉及前代 AVEVA PDMS 处显式标注。PML Add-in 机制的小节标题(Defining a PML Add-in、PML Application Control Object、Create a PLOBJ Control File、Create a UIC File、How to Add a PML Add-in to the P…

2026/10/17 2:33:37 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →