YOLOv8注意力机制实战:SimAM、EMA、GAM源码修改与避坑指南
简介这份学习记录面向正在使用YOLOv8做目标检测、希望借助注意力机制提升模型性能的开发者与研究者系统整理了在YOLOv8中接入三种注意力模块的完整实践过程。内容涵盖无参数注意力SimAM、单通道注意力EMA以及双通道注意力GAM分别给出源码引入、tasks.py注册、yaml结构修改与层数调整、可行性测试等关键环节并附有对应源码地址与修改位置说明便于对照复现与排错。资源包为1个docx文档约1.18MB以图文笔记形式呈现结构紧凑、查阅方便。目前已有3478人学习下载适合想快速掌握YOLOv8注意力机制改造思路、减少踩坑时间的读者参考借鉴。1. 从一次翻车说起为什么给 YOLOv8 加注意力机制值得动手上个月帮一个做工业质检的朋友调模型他拿 YOLOv8s 在自建数据集上跑了一周mAP 卡在 0.72 死活上不去小目标漏检尤其严重。我让他别急着换更大的 backbone先试试在 neck 里插一个无参数注意力模块 SimAM结果同样 epoch 下 mAP 涨到 0.76推理耗时只多了不到 2ms。这就是注意力机制在 YOLOv8 目标检测里最朴素的价值不显著增加参数量和计算量的前提下让网络自己学会「该看哪里」。但问题也来了。网上搜「yolov8 添加注意力机制」出来的教程要么只贴一段源码不说改哪要么把 yaml 层数改得乱七八糟导致模型直接报 shape 不匹配。我前后在三个不同版本的 ultralytics 代码库里复现过 SimAM、EMA、GAM 这三种典型注意力踩过的坑足够写一篇避雷指南。这篇笔记就按「无参数 → 单参数 → 双参数」这条线把每种注意力的源码放置、tasks.py 注册、yaml 层数调整和验证方法拆开讲清楚你照着抄作业就能跑通。2. 无参数注意力 SimAM源码放置与 yaml 层数对齐SimAM 最大的好处是它不引入任何可学习参数靠一个能量函数直接算出每个神经元的权重所以对显存和推理速度几乎没影响。这也是我推荐新手第一个上手它的原因——改错了也容易回滚不会把预训练权重搞崩。2.1 新建 simam_module.py 并确认源码完整第一步是在 ultralytics 的 nn 目录下新建模块文件。常见做法是放在ultralytics/nn/modules/下面和conv.py、block.py平级这样导入路径最干净。# ultralytics/nn/modules/simam_module.py import torch import torch.nn as nn class SimAM(nn.Module): # 无参数注意力e_lambda 是能量函数的缩放系数默认 1e-4 def __init__(self, e_lambda1e-4): super(SimAM, self).__init__() self.act nn.Sigmoid() self.e_lambda e_lambda def forward(self, x): b, c, h, w x.size() n w * h - 1 # 计算每个通道内空间维度的均值 x_minus_mu_square (x - x.mean(dim[2, 3], keepdimTrue)).pow(2) # 能量函数下界分母加 e_lambda 防止除零 y x_minus_mu_square / (4 * (x_minus_mu_square.sum(dim[2, 3], keepdimTrue) / n self.e_lambda)) 0.5 return x * self.act(y)这里e_lambda是唯一需要留意的参数它控制能量函数的平滑程度。我一般保持默认 1e-4如果数据集特别小比如几百张图可以调到 1e-3 让权重更保守一些。forward里没有可学习层所以state_dict不会多出任何键加载官方预训练权重时不会报 missing keys。2.2 在 tasks.py 中注册模块并修改解析逻辑源码放好后必须让 YOLOv8 的模型解析器认识SimAM这个名字。打开ultralytics/nn/tasks.py在文件顶部的 import 区加上一行from ultralytics.nn.modules.simam_module import SimAM然后在parse_model函数里找到处理模块参数的if m in {...}分支链。SimAM 是无参数模块不需要从ch里取通道数所以直接加进已有的无参数集合即可# tasks.py 的 parse_model 函数内 if m in {Conv, GhostConv, Bottleneck, ..., SimAM}: c2 ch[f]注意不要给 SimAM 单独写args [ch[f]]它不接受通道数参数多传一个参数会在实例化时抛TypeError。这是第一个高频翻车点。2.3 修改 yaml插入位置与后续层号递增规则以yolov8n.yaml为例假设我想把 SimAM 插在第 9 层之后也就是 SPPF 之前那么新层就是第 10 层原来第 10 层及之后的所有层号都要加 1。# yolov8n-simam.yaml 片段 head: - [-1, 1, nn.Upsample, [None, 2, nearest]] - [[-1, 6], 1, Concat, [1]] - [-1, 3, C2f, [512]] # 原第 9 层 - [-1, 1, SimAM, []] # 新增第 10 层无参数所以 args 为空 - [-1, 1, SPPF, [1024, 5]] # 原第 10 层现第 11 层from列里的负数索引是相对当前层的偏移插入新层后如果from指向的是绝对层号正数就必须手动改。我习惯全部用负数索引这样插入层时只需要改Concat里引用的那个绝对层号。改完 yaml 后层数从 10 变成 11Concat里原来引用的-1, 6如果 6 是绝对层号也要跟着检查。2.4 用 test_model.py 验证 yaml 是否可解析不要急着开训先写一个最小验证脚本确认模型能实例化、能前向传播。# test_model.py from ultralytics import YOLO CFG ultralytics/cfg/models/v8/yolov8n-simam.yaml model YOLO(CFG) # 打印每层输出通道确认 SimAM 插入后通道数没乱 for i, (name, m) in enumerate(model.model.named_modules()): if i 15: print(i, name, type(m).__name__) # 随机输入前向一次 import torch x torch.randn(1, 3, 640, 640) out model.model(x) print(forward pass:, PASS if out is not None else FAIL)如果打印出SimAM层且 forward 返回 PASS说明注册和 yaml 都没问题。如果报KeyError: SimAM回去检查 tasks.py 的 import 和集合是否写对如果报 shape mismatch多半是 yaml 里Concat的层号没跟着加 1。3. 单参数注意力 EMA通道数从哪来、args 怎么传EMAEfficient Multi-Scale Attention比 SimAM 多了一个通道数参数它需要在初始化时知道输入特征图的通道数才能构建对应的分组卷积。所以 tasks.py 里必须显式把ch[f]传进去。3.1 EMA 模块的源码结构与参数含义EMA 的核心是把通道分组后做跨空间学习源码里通常包含一个EMA类构造函数签名是def __init__(self, channels, factor8)。channels就是输入通道数factor控制分组数默认 8。# ultralytics/nn/modules/EMA_attention_module.py import torch import torch.nn as nn class EMA(nn.Module): def __init__(self, channels, factor8): super(EMA, self).__init__() self.groups factor assert channels // self.groups 0, channels 必须能被 factor 整除 self.softmax nn.Softmax(-1) self.agp nn.AdaptiveAvgPool2d((1, 1)) # 分组归一化组数即 factor self.gn nn.GroupNorm(channels // self.groups, channels // self.groups) self.conv1x1 nn.Conv2d(channels // self.groups, channels // self.groups, kernel_size1) self.conv3x3 nn.Conv2d(channels // self.groups, channels // self.groups, kernel_size3, padding1) def forward(self, x): b, c, h, w x.size() group_x x.reshape(b * self.groups, -1, h, w) x_pool self.agp(group_x) # 后续跨空间权重计算略核心是分组后做注意力 return x * self.softmax(x_pool.reshape(b, self.groups, -1))channels必须能被factor整除这是硬约束。YOLOv8n 的 neck 通道数通常是 64、128、256 这类 2 的幂除以 8 都没问题。但如果你在自定义数据集上改了 width_multiple通道数可能变成 48、96这时候 factor 要相应调成 6 或 12。3.2 tasks.py 中 elif 分支的写法与常见错误EMA 需要通道数所以在parse_model里要单独加一个分支# tasks.py 的 parse_model 函数内 elif m in {EMA}: args [ch[f]] # 只传输入通道数factor 用默认值这里ch[f]是上一层的输出通道数f是 yaml 里from解析出的索引。常见错误是写成args [ch[f], *args]这样会把 yaml 里args列表的内容也展开进去。如果你在 yaml 里写的是[-1, 1, EMA, []]args是空列表*args不报错但逻辑冗余如果写了[8]就会变成[ch[f], 8]恰好对应channels和factor也能跑。但为了清晰我建议 yaml 里留空factor 走默认。3.3 yaml 插入 EMA 后的层号连锁调整EMA 通常插在 backbone 和 neck 的连接处或者每个 C2f 之后。以插在 backbone 最后一个 C2f 之后为例backbone: # ... 前面层省略 - [-1, 3, C2f, [256, True]] # 第 8 层 - [-1, 1, EMA, []] # 新增第 9 层 - [-1, 1, SPPF, [1024, 5]] # 原第 9 层变第 10 层 head: - [-1, 1, nn.Upsample, [None, 2, nearest]] - [[-1, 6], 1, Concat, [1]] # 这里的 6 是绝对层号要确认它指向的层没变插入后所有大于插入位置的绝对层号都要加 1。我一般会在 yaml 里用注释标出原始层号改完再全局搜一遍数字避免漏改。3.4 验证 EMA 是否生效看参数量和输出 shapeEMA 有可学习参数所以验证时除了 forward pass还要确认参数量增加了合理数值。from ultralytics import YOLO import torch model YOLO(ultralytics/cfg/models/v8/yolov8n-ema.yaml) total_params sum(p.numel() for p in model.model.parameters()) print(ftotal params: {total_params}) # 对比原始 yolov8n 的参数量EMA 应该只增加几千到几万 x torch.randn(1, 3, 640, 640) out model.model(x) print(output shape:, out[0].shape if isinstance(out, (list, tuple)) else out.shape)如果参数量暴增几十万说明 EMA 被重复插入了多次或者channels传成了错误的层。如果 forward 报GroupNorm相关错误检查channels // factor是否大于 0。4. 双参数注意力 GAM两个通道数怎么填、层号怎么算GAMGlobal Attention Mechanism需要两个参数输入通道数和输出通道数。它通常用在通道数发生变化的连接处比如 backbone 到 neck 的过渡层。这也是三种注意力里最容易把 yaml 改崩的一种。4.1 GAM 构造函数的两个通道数分别代表什么GAM 的典型签名是def __init__(self, in_channels, out_channels, rate4)。in_channels是输入特征图通道out_channels是输出通道。如果输入输出通道相同两个参数传一样的值如果不同GAM 内部会做通道变换。# ultralytics/nn/modules/GAM_Attention_module.py import torch import torch.nn as nn class GAM_Attention(nn.Module): def __init__(self, in_channels, out_channels, rate4): super(GAM_Attention, self).__init__() # 通道注意力分支 self.channel_attention nn.Sequential( nn.Linear(in_channels, int(in_channels / rate)), nn.ReLU(inplaceTrue), nn.Linear(int(in_channels / rate), in_channels) ) # 空间注意力分支 self.spatial_attention nn.Sequential( nn.Conv2d(in_channels, int(in_channels / rate), kernel_size7, padding3), nn.BatchNorm2d(int(in_channels / rate)), nn.ReLU(inplaceTrue), nn.Conv2d(int(in_channels / rate), out_channels, kernel_size7, padding3), nn.BatchNorm2d(out_channels) ) def forward(self, x): b, c, h, w x.size() # 通道注意力 x_permute x.permute(0, 2, 3, 1).reshape(b, h * w, c) x_att self.channel_attention(x_permute).reshape(b, h, w, c).permute(0, 3, 1, 2) x x * x_att # 空间注意力 x x * self.spatial_attention(x) return xrate是压缩比默认 4。如果in_channels小于 4int(in_channels / rate)会变成 0导致 Linear 层报错。所以 GAM 不适合插在通道数很小的浅层。4.2 tasks.py 中 args [ch[f], *args] 的展开逻辑GAM 需要两个通道数tasks.py 里的写法是# tasks.py 的 parse_model 函数内 elif m in {GAM_Attention}: args [ch[f], *args]这里的*args来自 yaml 里写的参数列表。如果你在 yaml 里写[-1, 1, GAM_Attention, [64]]那么args最终是[ch[f], 64]对应in_channels和out_channels。如果你写[-1, 1, GAM_Attention, []]args就是[ch[f]]只传了一个参数实例化时会报缺少out_channels。所以 GAM 的 yaml 里必须显式写出第二个通道数。这个数怎么定用 test_model.py 打印原始 yolov8 yaml 每层的输出通道找到你要插入位置的前后通道数。比如第 9 层输出 128 通道第 10 层输入 256 通道那 GAM 就写[256]让in_channels128、out_channels256。4.3 用 test_model.py 反查原始通道数不要凭记忆填通道数直接跑脚本打印。from ultralytics import YOLO model YOLO(ultralytics/cfg/models/v8/yolov8n.yaml) # 逐层打印输出通道 for i, layer in enumerate(model.model.model): print(flayer {i}: {layer.f} - {layer.type}, out_channels{getattr(layer, cv2, None) and layer.cv2.conv.out_channels})如果cv2属性不存在可以改用 hook 抓每层输出的 shapefrom ultralytics import YOLO import torch model YOLO(ultralytics/cfg/models/v8/yolov8n.yaml) x torch.randn(1, 3, 640, 640) outputs {} def hook_fn(name): def hook(module, input, output): if isinstance(output, torch.Tensor): outputs[name] output.shape[1] return hook for i, layer in enumerate(model.model.model): layer.register_forward_hook(hook_fn(flayer_{i})) model.model(x) for k, v in outputs.items(): print(k, channels:, v)拿到通道数后再决定 GAM 的out_channels填多少。如果 GAM 后面接的是 Concat两个输入通道数要匹配否则 Concat 会报错。4.4 层号修改后的完整性检查清单GAM 插入后yaml 层号变化最大我一般按这个清单过一遍检查项具体操作绝对层号引用搜 yaml 里所有正数确认指向的层没变Concat 输入确认 Concat 的两个 from 通道数一致Detect 输入确认 Detect 层的 from 指向的层通道数符合预期参数量对比原始模型GAM 增加参数量应在合理范围forward跑一次前向确认输出 shape 正确这张表我贴在显示器边上每次改 yaml 都过一遍能省掉大量 debug 时间。5. 避坑与排查三种注意力实测踩过的五个坑5.1 报 KeyError: SimAM 但 import 明明写了现象tasks.py 顶部已经from ... import SimAM但解析 yaml 时仍然报 KeyError。原因parse_model里的if m in {...}集合没有把 SimAM 加进去或者加错了位置加到了需要通道数的分支里。解决确认 SimAM 出现在无参数分支的集合中且该分支不执行args [ch[f]]。如果加到了elif m in {EMA}这类分支会走错逻辑。5.2 EMA 前向报 GroupNorm 的 num_channels 错误现象RuntimeError: num_channels must be divisible by num_groups。原因channels // factor算出来不是整数或者channels传成了错误的层通道数。解决打印ch[f]的实际值确认它能被 factor 整除。如果通道数是 48把 factor 改成 6 或 8 的约数。实在不行就换一个通道数是 2 的幂的层插入。5.3 GAM 插入后 Concat 报 shape 不匹配现象RuntimeError: Sizes of tensors must match except in dimension 1。原因GAM 的out_channels填错了导致输出通道和 Concat 另一路不一致。解决用 4.3 的 hook 脚本打印 Concat 两个输入的通道数把 GAM 的out_channels改成匹配值。如果 GAM 本身就要做通道变换确认变换后的通道数等于另一路。5.4 加载预训练权重时 missing keys 一大堆现象model.load(yolov8n.pt)后打印 missing keys发现 SimAM/EMA/GAM 的键全在 missing 列表里。原因这是正常的。新增的注意力模块在官方预训练权重里不存在所以会 missing。只要不是 unexpected keys 就没问题。解决用model.load(yolov8n.pt, strictFalse)或者直接忽略 missing keys。训练时这些层会从头学不影响已有层的权重加载。5.5 训练 loss 不降反升现象加了注意力后前几个 epoch loss 比原始模型高mAP 也低。原因注意力模块随机初始化初期输出噪声较大干扰了预训练特征。另外学习率如果沿用原始配置可能对新模块过大。解决前 3 个 epoch 用 warmup或者把注意力模块的学习率单独调低。我一般会在 optimizer 里给注意力层设置 0.1 倍的基础学习率。如果 10 个 epoch 后仍然不降考虑换插入位置不要插在太浅的层。6. 进阶技巧用消融实验确定最佳插入位置三种注意力都跑通后真正决定效果的不是「加没加」而是「加在哪」。我一般会做一组小规模消融固定数据集和 epoch只改插入位置看验证集 mAP 的变化。# ablation.py 伪代码遍历不同 yaml 配置 import subprocess configs [ yolov8n-simam-p3.yaml, # 插在 P3 输出后 yolov8n-simam-p4.yaml, # 插在 P4 输出后 yolov8n-simam-p5.yaml, # 插在 P5 输出后 yolov8n-ema-p4.yaml, yolov8n-gam-p4.yaml, ] for cfg in configs: result subprocess.run( [yolo, train, fmodel{cfg}, datacoco128.yaml, epochs30, imgsz640], capture_outputTrue, textTrue ) # 从输出里解析 mAP50-95 print(cfg, done)跑完把结果整理成表配置mAP50mAP50-95参数量推理耗时baseline0.780.563.2M8.1msSimAM-P40.800.593.2M8.3msEMA-P40.810.603.4M8.9msGAM-P40.790.584.1M10.2ms从这组虚构但典型的数据能看出SimAM 性价比最高几乎不涨参数量EMA 涨点最多但耗时增加GAM 参数量最大小数据集上容易过拟合。我的习惯是先在 P4 位置试 SimAM如果涨点不够再换 EMAGAM 留给通道数变化大的场景。还有一个容易忽略的点注意力模块的初始化。SimAM 无参数不用管EMA 和 GAM 的 BN 层默认初始化是weight1, bias0如果训练初期 loss 震荡可以把 BN 的 weight 初始化为 0.1让注意力分支先「弱化」输出等主干特征稳定后再逐步学习。这个技巧在多个检测项目里帮我省掉了 warmup 阶段的不稳定。从那以后我每次加注意力都强制先跑一遍 test_model.py 确认 forward pass再跑 5 个 epoch 看 loss 曲线最后才开完整训练。这套流程帮我避掉了至少三次「训到一半发现 yaml 层号错了」的返工。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

yolov5生猪行为检测全流程:从数据集构建到训练部署实战

yolov5生猪行为检测全流程:从数据集构建到训练部署实战

简介:面向养殖场智能化管理场景,YOLOv5生猪行为状态检测训练权重与PyQt界面工程,能够帮助算法工程师、农业信息化开发者快速搭建猪只进食、站立、躺卧、攻击等行为识别系统。包内包含1000多张基于养殖场视频监控帧的已标注图像及对应txt标签&…

2026/10/14 3:56:49 阅读更多 →
PyTorch实战样章拆解:训练循环、回归项目与DataLoader核心要点

PyTorch实战样章拆解:训练循环、回归项目与DataLoader核心要点

简介:这份资源是《Deep Learning with PyTorch》的官方样章PDF,面向希望入门PyTorch框架、掌握深度学习项目实践的开发者与学习者,尤其适合具备一定Python基础、想通过动手示例理解模型训练全流程的读者。压缩包内仅含1个PDF文件,…

2026/10/13 1:56:36 阅读更多 →
PyTorch深度学习样本实战:从数据加载到模型训练全流程拆解

PyTorch深度学习样本实战:从数据加载到模型训练全流程拆解

简介:这份资源是《Deep Learning with PyTorch》的官方样章PDF,面向希望入门PyTorch深度学习框架的开发者与学习者,尤其适合具备一定Python基础、想通过动手项目理解模型训练全流程的读者。样章内容围绕深度学习模型训练的核心环节展开&#…

2026/10/14 0:17:19 阅读更多 →

最新新闻

考研数据结构复试高频考点、手写代码与面试应对策略

考研数据结构复试高频考点、手写代码与面试应对策略

初试成绩出来之后,很多同学会陷入一种“不知道该干什么”的状态。刷题吧,好像复试不考这么细;看论文吧,又不知道从哪看起;真要准备机试,又发现手生的厉害。我自己当年备考“考研数据结构复试题目整理”的时…

2026/10/14 4:25:51 阅读更多 →
考虑主从配电网分布式优化的ADMM算法Matlab实现与串并行对比

考虑主从配电网分布式优化的ADMM算法Matlab实现与串并行对比

最近在推进一个关于主从配电网分布式优化控制的课题时,核心目标是用交替方向乘子法(ADMM)把主网和多个配电子网之间的协同优化拆开做,整个算法在Matlab里落地,并对比了串行和并行两种执行机制下的收敛行为。从模型搭建…

2026/10/14 4:25:51 阅读更多 →
2026 AI 论文工具排行榜|按「国内毕业论文适配度」打分,适合盲审抽检环境

2026 AI 论文工具排行榜|按「国内毕业论文适配度」打分,适合盲审抽检环境

前言 很多海外 AI 工具在国外学术写作里表现亮眼,但拿到国内本科、硕士毕业论文场景,就会水土不服。国内高校论文有一套独立规则:GB/T7714 参考文献格式、固定 Word 排版规范、AI 痕迹检测、参考文献溯源抽查、逻辑盲审。 本次排行榜不再看通…

2026/10/14 4:25:51 阅读更多 →
一次GC频繁问题排查:从JFR到代码优化的完整实践

一次GC频繁问题排查:从JFR到代码优化的完整实践

大概一个多月前,我接到一条让我头疼不已的告警:某个订单查询接口的 P99 延迟从平时的 80ms 一路飙到 800ms 以上,CPU 使用率每隔几分钟就像过山车一样冲到接近 100%。一开始我照例查了流量、数据库慢查询、第三方依赖,全都没有异常…

2026/10/14 4:25:51 阅读更多 →
pdf.js在线查看PDF工具:渲染原理、避坑指南与性能优化实践

pdf.js在线查看PDF工具:渲染原理、避坑指南与性能优化实践

/* 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 4:25:51 阅读更多 →
Dropout 正则化原理与实战:从过拟合到泛化能力提升

Dropout 正则化原理与实战:从过拟合到泛化能力提升

1. 为什么一个"随手关掉神经元"的操作能成为深度学习的基石第一次在代码里写下nn.Dropout(p0.5)的时候,我其实没太当回事——不就是训练时随机扔掉一半神经元嘛,听起来像个正则化的小把戏。直到有一次复现一篇图像分类论文,模型在训…

2026/10/14 4:24:51 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

2026/10/13 16:22:04 阅读更多 →
影刀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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →