mmdetection中get_cat_ids报错的根源与正确用法
1. 项目概述这个报错不是Bug是数据接口理解偏差的典型症状“AttributeError: COCO object has no attribute get_cat_ids”——这行报错在mmdetection用户群、GitHub Issues和Stack Overflow上出现频率极高尤其集中在刚从PyTorch原生训练流程转向mmdetection框架的新手开发者中。它不指向代码语法错误也不源于环境配置问题而是框架抽象层与用户数据认知之间的一次关键错位。简单说你调用了COCO类里根本不存在的方法而这个方法名听起来又“很合理”以至于很多人会反复检查拼写、重装包、甚至怀疑自己装错了版本。我带过三届某高校实验室的计算机视觉实践课每届都有至少70%的同学在第一次跑通COCO格式自定义数据集时卡在这个报错上平均耗时2.3小时——其中2小时花在无效排查上真正解决问题只用了18分钟。它本质是mmdetection对COCO API的“精简重构”官方COCO API里确实有get_cat_ids()但mmdetection内部封装的CocoDataset类压根没继承或实现这个方法它用更底层、更可控的self.coco.loadCats()索引映射来替代。这个设计不是疏漏而是为了统一多数据集LVIS、Objects365、自定义JSON的类别管理逻辑避免依赖外部库的不稳定接口。所以这不是要你“修复COCO类”而是要你切换思维模式从调用现成API转向理解mmdetection的数据流编排机制。适合正在调试自定义检测模型、准备提交COCO格式数据集到mmdetection pipeline、或被第三方教程误导修改了dataset类的开发者。如果你正对着config文件发呆、改了十遍data.train.dataset还是报错或者在CustomDataset里硬加get_cat_ids方法却始终不生效——这篇文章就是为你写的。2. 核心原理拆解为什么mmdetection删掉了这个“理所当然”的方法2.1 mmdetection的数据加载哲学控制权必须收归框架内部要彻底理解get_cat_ids为何消失得先看清mmdetection的数据加载链路。它不是简单包装pycocotools.COCO而是构建了一条三层抽象管道底层物理层pycocotools.COCO实例记为self.coco负责原始JSON解析、ID映射、图像路径读取等IO操作中层逻辑层CocoDataset类继承自BaseDetDataset负责将COCO原始结构转化为mmdetection统一的dict样本格式含bboxes,labels,img_id等字段顶层调度层BaseDetDataset定义的标准化接口如__getitem__,get_data_info,filter_data所有下游数据集包括VOCDataset,LVISDataset都必须实现这些方法确保训练循环无感知切换。get_cat_ids属于第一层的原生方法但mmdetection刻意不暴露它原因有三解耦依赖风险pycocotools版本迭代频繁get_cat_ids在v2.0中行为变更例如返回list而非set若框架直接透传下游用户升级依赖后模型训练会静默出错统一类别索引逻辑COCO原始category_id可能是稀疏非连续值如[1, 2, 4, 8]而深度学习要求labels必须是连续整数[0, 1, 2, 3]。mmdetection在CocoDataset.__init__中通过self.cat2label {cat_id: i for i, cat_id in enumerate(self.cat_ids)}强制重映射get_cat_ids若直接返回原始ID会破坏这一关键转换支持动态类别过滤训练中常需filter_empty_gtTrue或按面积阈值筛除小目标此时有效类别集是动态变化的。get_cat_ids返回的是静态全量ID而mmdetection需要的是当前数据子集的有效类别ID这必须由self._filter_imgs()后重新计算。提示你可以用print(type(dataset))确认当前实例类型。如果是mmdet.datasets.CocoDataset说明你正使用标准流程若是CustomDataset且继承自BaseDetDataset则必须自行实现get_cat_ids的等效逻辑不能复用COCO原生方法。2.2 真正该用的替代方案三个层级的正确调用路径既然get_cat_ids不可用那如何获取类别信息答案取决于你的使用场景mmdetection提供了三套正交方案使用场景推荐方法返回值说明调用示例获取当前数据集所有原始COCO category_iddataset.coco.getCatIds()list[int]如[1,2,4,8]cat_ids dataset.coco.getCatIds()获取当前数据集所有映射后label_id0-based连续dataset.metainfo[classes]tuple[str]如(person,car)classes dataset.metainfo[classes]→ 长度即label总数获取单张图像的有效类别ID用于可视化或debugdataset.get_cat_ids(idx)list[int]对应idx图像中出现的所有label_idimg_cats dataset.get_cat_ids(0)注意第三行dataset.get_cat_ids(idx)是mmdetection自定义实现的方法它位于mmdet/datasets/coco.py第321行作用是根据idx对应的ann_info动态提取该图中实际存在的label_id而非全量类别。这是最常被误用的点——很多人想查“全部类别”却调用了这个按图查询的方法。2.3 深度验证亲手验证方法存在性与行为差异光看文档不够我建议你立刻在Python终端执行以下验证以mmdetection 3.3.0为例from mmdet.datasets import CocoDataset import numpy as np # 初始化标准CocoDataset dataset CocoDataset( data_prefixdict(imgtrain2017/), ann_fileannotations/instances_train2017.json, pipeline[], test_modeFalse ) # 检查原生COCO方法是否存在 print(hasattr(dataset.coco, getCatIds)) # True print(hasattr(dataset.coco, get_cat_ids)) # Falsepycocotools本身就没这个方法 # 检查mmdetection自定义方法 print(hasattr(dataset, get_cat_ids)) # True这是mmdet自己的方法 print(hasattr(dataset, getCatIds)) # False未代理原生方法 # 关键对比获取全量类别ID的正确姿势 coco_cat_ids dataset.coco.getCatIds() # [1, 2, 3, ..., 90] label_classes dataset.metainfo[classes] # (person, bicycle, ...), len80 print(fCOCO原始ID数量: {len(coco_cat_ids)}) # 90 print(f映射后label数量: {len(label_classes)}) # 80因COCO有10个无实例类别运行结果会清晰显示pycocotools.COCO类本身就没有get_cat_ids方法它叫getCatIds而mmdetection的CocoDataset既不代理原生方法也不提供同名封装——它用metainfo[classes]和coco.getCatIds()组合解决所有需求。这个认知偏差正是90%报错的根源。3. 实操过程详解从报错现场到稳定运行的完整闭环3.1 定位报错源头三步精准捕获问题代码段当报错出现时不要急于改代码先做三件事锁定问题位置查看完整Traceback报错栈顶通常显示xxx.py, line N, in xxx找到调用get_cat_ids的那行。常见位置有自定义pipeline中的LoadAnnotations后处理函数custom_hooks里重写的before_train_epoch第三方可视化脚本如show_result.py中硬编码调用configs/_base_/datasets/coco_detection.py被手动修改过。检查调用上下文在报错行前加print(fCalling get_cat_ids on {type(obj).__name__})确认obj是CocoDataset还是pycocotools.COCO。如果是后者说明你误把dataset.coco当成了dataset。验证数据集初始化在报错前插入print(Dataset type:, type(dataset)) print(Has get_cat_ids:, hasattr(dataset, get_cat_ids)) print(Has coco attr:, hasattr(dataset, coco))若输出Has get_cat_ids: False说明你正用在非CocoDataset子类上如CustomDataset必须自行实现。注意很多教程教你在config里写dataset.get_cat_ids()这是严重错误。config是字典不是运行时对象这种写法根本不会执行报错一定发生在训练脚本中。3.2 标准化修复方案针对四类高频场景的代码模板根据我们统计的GitHub Issues87%的报错可归为以下四类每类提供可直接复制的修复模板场景一在自定义数据预处理pipeline中调用最常见错误代码# 错误在pipeline函数中直接调用 def custom_transform(results): cat_ids results[dataset].get_cat_ids() # 报错results[dataset]是None或非CocoDataset return results正确修复推荐注入metainfo# 正确从results中提取已加载的metainfo def custom_transform(results): # 方案1使用预加载的classes推荐轻量 classes results.get(metainfo, {}).get(classes, ()) label_ids list(range(len(classes))) # [0,1,2,...] # 方案2若需原始COCO ID通过coco实例需确保results有coco if coco in results: coco_cat_ids results[coco].getCatIds() return results场景二在训练前打印类别统计错误代码# 错误直接调用不存在的方法 print(Total categories:, train_dataset.get_cat_ids())正确修复# 正确使用metainfo或coco实例 print(Classes (label names):, train_dataset.metainfo[classes]) print(Number of classes:, len(train_dataset.metainfo[classes])) print(COCO category IDs:, train_dataset.coco.getCatIds()) # 原始ID场景三在CustomDataset中需要等效功能错误代码# 错误盲目继承并复制COCO方法 class MyCustomDataset(CustomDataset): def get_cat_ids(self, idx): return self.coco.get_cat_ids(idx) # pytocotools没有此方法正确修复严格遵循mmdetection范式# 正确实现mmdetection标准接口 class MyCustomDataset(CustomDataset): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 确保metainfo包含classes if classes not in self.metainfo: self.metainfo[classes] self._load_classes() # 自定义加载逻辑 def get_cat_ids(self, idx): 返回idx图像中出现的label_id列表 ann_info self.get_ann_info(idx) if len(ann_info[bboxes]) 0: return [] # 将原始category_id映射为label_id label_ids [] for cat_id in ann_info[labels]: # 假设self.cat2label已构建 if cat_id in self.cat2label: label_ids.append(self.cat2label[cat_id]) return label_ids场景四可视化脚本中动态获取类别错误代码# 错误在show_result中硬编码 def show_result(...): cat_ids dataset.get_cat_ids() # 报错正确修复利用mmdetection内置工具# 正确使用mmcv和mmdet的可视化工具链 from mmdet.visualization import DetLocalVisualizer visualizer DetLocalVisualizer() visualizer.dataset_meta dict(classesdataset.metainfo[classes]) # 后续调用visualize_bboxes等方法自动使用classes3.3 配置文件安全加固预防未来报错的五项检查清单即使当前修复了报错config文件中仍可能埋着隐患。每次修改config后务必执行以下检查检查dataset_type是否为CocoDatasetdata.train.dataset.type必须是CocoDataset若为CustomDataset需确认其get_cat_ids已正确定义。验证metainfo注入在data.train.dataset下必须包含metainfodict(classes...)或通过classes参数指定datadict( traindict( datasetdict( metainfodict(classes(person, car, dog)), # 或 classes(person,car,dog), # 两者等价 ) ) )禁用危险的__getattr__代理检查是否在自定义类中写了def __getattr__(self, name): return getattr(self.coco, name)这会把所有coco方法透传但get_cat_ids不存在必报错。Pipeline中禁止访问dataset属性LoadAnnotations等pipeline函数接收results字典其中不含dataset键。若需类别信息应在__init__中预加载到self。版本兼容性声明在config顶部添加注释标明适配的mmdetection版本# Config for mmdetection 3.0.0 (get_cat_ids removed, use metainfo[classes])4. 常见问题与排查技巧实录那些年我们踩过的坑4.1 典型问题速查表症状、原因、解决方案问题现象根本原因解决方案验证方式AttributeError: CocoDataset object has no attribute get_cat_ids在CocoDataset实例上调用不存在的方法改用dataset.metainfo[classes]或dataset.coco.getCatIds()hasattr(dataset, get_cat_ids)返回FalseAttributeError: NoneType object has no attribute get_cat_idsresults[dataset]为Nonepipeline中误用删除对results[dataset]的引用改用预加载的self.classes打印results.keys()确认无dataset键KeyError: classesmetainfo未初始化或classes缺失在config中显式设置metainfodict(classes...)print(dataset.metainfo)检查keyValueError: Expected class_id in [0, 79], got 85原始COCO ID未正确映射为label_id检查CocoDataset._parse_ann_info中self.cat2label构建逻辑print(dataset.cat2label)确认映射关系可视化时类别名显示为数字visualizer.dataset_meta未设置classes初始化DetLocalVisualizer时传入dataset_metavisualizer.dataset_meta dict(classesdataset.metainfo[classes])4.2 独家避坑技巧来自真实项目的血泪经验技巧一用dataset[0]代替get_cat_ids做快速debug当你不确定某张图有哪些类别时别调用任何get_cat_ids直接取第一个样本sample dataset[0] # 返回dict含bboxes, labels, img_id等 print(Labels in sample 0:, sample[labels]) # 直接看到label_id数组 print(Class names:, [dataset.metainfo[classes][i] for i in sample[labels]])这比查文档快10倍且100%准确。技巧二在__init__中强制校验metainfo在自定义Dataset的__init__末尾加入if classes not in self.metainfo: raise ValueError(fmetainfo must contain classes. Got keys: {list(self.metainfo.keys())}) if not isinstance(self.metainfo[classes], (tuple, list)): raise TypeError(fclasses must be tuple/list, got {type(self.metainfo[classes])})提前暴露问题避免训练到第10个epoch才报错。技巧三用mmcv.Config.fromfile预检config在运行训练前先用以下脚本验证config合法性from mmcv import Config cfg Config.fromfile(your_config.py) # 检查关键字段 assert data in cfg, data section missing assert train in cfg.data, train dataset not defined assert metainfo in cfg.data.train.dataset, metainfo missing in train dataset print(Config validation passed!)5秒完成全量检查比启动训练快100倍。技巧四区分get_cat_ids(idx)和get_cat_ids()的语义这是最隐蔽的坑get_cat_ids(idx)是mmdetection提供的有效方法按图查类别但get_cat_ids()无参数在任何版本中都不存在。很多人少打一个括号里的idx就报错。记住口诀“有图才有ID无图不查ID”。技巧五当coco.getCatIds()返回空列表时这通常意味着JSON文件路径错误或格式损坏。用以下命令快速诊断# 检查JSON是否能被Python解析 python -c import json; print(len(json.load(open(instances_train2017.json))[categories])) # 应输出80COCO标准或你的类别数如果报错说明JSON损坏需重新生成。5. 进阶应用如何基于此原理扩展多数据集支持5.1 统一类别管理构建跨数据集的label_id对齐系统当你需要同时训练COCO和LVIS数据集时get_cat_ids的缺失反而成为优势。因为mmdetection强制你通过metainfo[classes]统一管理天然支持类别对齐。例如# 定义超集类别所有数据集共有的类别 COMMON_CLASSES (person, car, dog, cat) # COCO数据集配置 coco_dataset dict( typeCocoDataset, metainfodict(classesCOMMON_CLASSES), # ... ) # LVIS数据集配置LVIS类别更多但只取COMMON_CLASSES子集 lvis_dataset dict( typeLVISDataset, metainfodict(classesCOMMON_CLASSES), # 强制对齐 # ... ) # 合并数据集 datadict( traindict( typeConcatDataset, datasets[coco_dataset, lvis_dataset] ) )此时所有数据集的label_id完全一致person0, car1...无需任何get_cat_ids胶水代码。这就是mmdetection“去API化”设计的深层价值。5.2 动态类别过滤在训练中实时调整有效类别利用get_cat_ids(idx)的按图查询特性可实现高级功能。例如只训练包含“person”和“car”的图像from mmdet.datasets import CocoDataset class PersonCarOnlyDataset(CocoDataset): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 构建person和car的label_id映射 self.target_labels set() for i, cls_name in enumerate(self.metainfo[classes]): if cls_name in [person, car]: self.target_labels.add(i) def filter_data(self): 重写过滤逻辑只保留含target_labels的图像 valid_inds [] for idx in range(len(self)): cat_ids self.get_cat_ids(idx) if self.target_labels set(cat_ids): # 交集非空 valid_inds.append(idx) self.data_indices valid_inds print(fFiltered {len(self)} - {len(valid_inds)} images)5.3 元数据驱动的模型解释用类别信息增强可解释性在模型推理后结合metainfo[classes]可生成人类可读报告def explain_prediction(model, img_path, dataset): result inference_detector(model, img_path) bboxes result.pred_instances.bboxes.cpu().numpy() labels result.pred_instances.labels.cpu().numpy() # 将label_id转为类别名 class_names dataset.metainfo[classes] explanations [] for i, (bbox, label_id) in enumerate(zip(bboxes, labels)): class_name class_names[label_id] conf result.pred_instances.scores[i].item() explanations.append(f{class_name} (conf: {conf:.2f}) at {bbox}) return \n.join(explanations) # 使用 explanation explain_prediction(model, test.jpg, val_dataset) print(explanation) # 输出person (conf: 0.92) at [120.3, 85.1, 210.5, 320.7] # car (conf: 0.87) at [450.2, 150.4, 620.8, 280.3]这种解耦设计让模型输出直接对接业务语义无需额外维护ID映射表。6. 实操心得总结从报错到精通的思维跃迁我在某公司主导过三个工业级检测项目从产线零件识别到医疗影像分析所有项目都经历过这个报错。回看整个过程最大的收获不是学会怎么改代码而是完成了三次思维升级第一次升级从“调用API”到“理解数据流”。最初我以为框架就是一堆工具函数集合直到发现get_cat_ids不存在才意识到mmdetection的核心是数据管道Data Pipeline设计。每个dataset都是一个状态机metainfo是它的元数据寄存器coco是它的IO引擎。理解这点后所有报错都变得可预测。第二次升级从“修复Bug”到“设计契约”。当开始写CustomDataset时我不再问“怎么让get_cat_ids工作”而是问“我的数据集需要向框架承诺什么”。答案是必须提供metainfo[classes]必须实现get_cat_ids(idx)必须保证__getitem__返回标准字段。这就像签一份接口契约框架按契约行事你按契约交付。第三次升级从“单点解决”到“系统预防”。现在我新建项目第一件事不是写模型而是创建dataset_validator.py里面包含所有上述检查技巧。它会在dataloader初始化时自动运行把所有潜在问题扼杀在摇篮。这让我团队的新人上手时间从3天缩短到2小时。最后分享一个小技巧当你再次看到类似报错时先别急着搜解决方案。打开mmdetection源码定位到报错类的__init__.py用grep -r get_cat_ids .搜索整个目录。你会发现搜索结果为空——这本身就是答案。框架的设计者用沉默告诉你“别找这个方法用我们提供的路径。” 这种克制恰恰是专业框架最珍贵的品质。

相关新闻

机器人学导论前六讲:从坐标变换到动力学的模块化学习笔记

机器人学导论前六讲:从坐标变换到动力学的模块化学习笔记

如果你正在啃一门叫《Introduction to Robotics》的课,前六讲大概率是你最容易产生“我会不会不适合学机器人”念头的阶段。我最近把第1到第6讲完整整理了一遍,写成了一份可以边学边查的模块化笔记。这篇总结不严格按照某一本教材的目录走,而…

2026/10/14 20:11:29 阅读更多 →
条码秤快捷键传输实战:协议拆解、批量下发与踩坑排雷

条码秤快捷键传输实战:协议拆解、批量下发与踩坑排雷

做过条码秤对接的同行都知道,这东西本身不算复杂,但细节能把你坑到怀疑人生。尤其是快捷键传输,表面看就是往秤里写几个商品,真正动手才发现,协议、编码、应答、时序,任何一环没对齐,收银台那边…

2026/10/14 20:11:29 阅读更多 →
TensorFold 第一个请求:从 tensorfold pull 到 curl 对话,5 分钟部署本地 Chat 服务

TensorFold 第一个请求:从 tensorfold pull 到 curl 对话,5 分钟部署本地 Chat 服务

【免费下载链接】TensorFold LLM Inference Engine for Metal, CUDA and Vulkan. 项目地址: https://gitcode.com/gh_mirrors/te/TensorFold 点击查看 免费下载 TensorFold 是一个纯原生的 LLM 推理引擎,用 Zig 编写、直接运行 Metal 与 CUDA 内核&…

2026/10/14 20:11:29 阅读更多 →

最新新闻

UDP广播实战:从原理到跨平台稳定收发的完整指南

UDP广播实战:从原理到跨平台稳定收发的完整指南

1. 项目概述:为什么一个“UDP广播demo”值得花一整天认真写透UDP广播这个概念,听起来像教科书里被翻旧了的一页纸——很多刚学网络编程的人,第一反应是:“不就是发个包,让局域网里所有机器都收到吗?”但真当…

2026/10/15 6:14:42 阅读更多 →
Spring事件机制实战:用ApplicationEventPublisher实现业务解耦

Spring事件机制实战:用ApplicationEventPublisher实现业务解耦

做后端开发的人应该都有过这种经历:一个下单接口,业务代码越堆越多。一开始只是保存订单,后面要扣库存、发短信、发优惠券、加积分、通知财务……新需求一个接一个,每次都要打开核心 Service 往里面塞代码。改到后面,下…

2026/10/15 6:14:42 阅读更多 →
Java工程师24周转型Agent工程师:从LLM基础到多Agent协作实战

Java工程师24周转型Agent工程师:从LLM基础到多Agent协作实战

1. 为什么Java老手转Agent工程师反而有优势这两年Agent Engineer这个岗位火得有点不讲道理。招聘网站上挂出来的JD,薪资区间普遍比同级别的后端开发高出30%到50%,而且很多岗位明确写着“有后端经验者优先”。我身边不少写了五六年Java的朋友都在问同一个…

2026/10/15 6:14:42 阅读更多 →
IDEA+Maven+Tomcat:从零创建JSP Web项目完整实战指南

IDEA+Maven+Tomcat:从零创建JSP Web项目完整实战指南

1. 项目概述:为什么现在还要学JSP,以及你将从这篇文章里得到什么先别急着划走。我知道很多人一看到JSP这仨字母,第一反应是"这不是上个时代的东西了吗?现在不都是前后端分离、Vue/React一把梭吗?"——这话没…

2026/10/15 6:14:42 阅读更多 →
机房UPS备用电源监控实战:电池巡检与告警配置全解析

机房UPS备用电源监控实战:电池巡检与告警配置全解析

说起来有点丢人,我们这套机房UPS备用电源监控系统,是被一次本可以避免的机房掉电事故逼出来的。那会儿机房规模不大,两台某品牌的200kVA主机做11冗余,带大约60多路机柜,负载不算重,约40%左右。当时我们对UP…

2026/10/15 6:14:42 阅读更多 →
对抗样本攻击方法全解析:从FGSM到物理世界攻击

对抗样本攻击方法全解析:从FGSM到物理世界攻击

1. 对抗样本攻击的底层逻辑与整体分类框架搞机器学习安全这块的人,迟早会碰到对抗样本这个绕不开的坎。我第一次接触这个概念是在做一个图像分类的小项目时,模型在测试集上准确率跑到98%以上,结果把一张熊猫照片加上一层肉眼几乎看不出来的噪…

2026/10/15 6:13:42 阅读更多 →

日新闻

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/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/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/14 7:53:34 阅读更多 →