基于水位的CNN图像分类实战:从数据集到Notebook训练全流程
简介一套面向机器学习与计算机视觉学习者的水瓶水位图像分类项目资源包其核心问题是训练模型根据水瓶图像自动区分满水位、半水位与溢出状态。资源涵盖完整数据集与建模代码适合用于CNN图像分类实践、课程设计或算法对比。压缩包共488个文件约64.94MB其中429张JPEG与57张PNG格式的实拍图像构成训练/验证数据图像包含多种水瓶大小、形状与拍摄角度另有1个Python脚本和1个Jupyter Notebook实现基于CNN及ResNet50的模型构建、训练与评估流程。目前已有185人学习/浏览该资源。通过该包可快速获得带标注的水瓶图像数据与可运行Notebook节省自行采集与预处理的时间同时参考代码能帮助理解数据加载、模型设计、训练调参与结果评估的完整图像分类实现路线。1. 水瓶水位图像分类一个把 CNN、数据集和 Notebook 串起来的完整落地点“水瓶图像分类”这个题目听起来很小但它把一个机器学习应用流程里最关键的环节全串起来了CNN 怎么选型、图像数据集怎么组织、Notebook 里怎么从数据读到模型训练逐步跑通。以“基于水位的机器学习水瓶图像分类”命名的项目包内容通常就是四个东西标注好水位档位的瓶子照片数据集、能直接打开的 Jupyter Notebook、完整的 CNN 训练源码以及一份把三者串起来的训练流程。它的适用场景很具体——灌装线液位质检、实验室液位记录、课程设计里做图像分类的完整练习甚至可以作为“连续状态转图像分类”的入门样本。这类项目真正让新手翻车的不是网络层数而是数据怎么划分、模型到底在学什么。这篇笔记按“能复现”的标准把链路拆开。2. 特征在哪里模型就学哪里水位分类为什么必须用 CNN先回答一个绕不开的问题这任务用传统视觉方案就做不了吗答案是可以做但非常脆弱。固定一个相机、固定灯箱、固定瓶型时把瓶子区域裁出来用 Canny 检测水面线求水线上下像素比例再映射到档位整个管线又快又便宜精度能到毫米级。可一旦换成磨砂瓶水面线被瓶壁糊成一条模糊过渡带换成透明瓶加印花标签瓶身上的图案边缘比水面线还锐利背景里只要出现一个倒影阈值参数就要重新调。传统视觉的短板很清楚它假设“水面线是这个场景里最明显的边缘”而这个假设在真实数据里经常不成立。CNN 的思路是把这个假设丢掉。它不显式去找任何一条线而是从大量标注样本里自己学一组特征把“水位在哪个档位”当成一个图像分类决策。方向对了代价也来了CNN 是一个黑匣子它会认真学你给的所有相关特征包括瓶子标签、桌面倒影和拍摄角度。所以后面所有操作都围绕一件事展开——让数据只表达水位差异让模型只能从水位差异里获取收益。2.1 从桌面倒影到水位线这个任务的视觉难点在哪水位线在图像里属于低对比度特征。瓶内水面和空气的分界隔着瓶壁和拍摄光线后往往只是一条几十像素宽的渐变带而瓶身标签、品牌 Logo、瓶盖颜色、桌面反光哪一个对比度都比它高。分类器如果照单全收最后学到的往往是一堆“背景联想键”——看到某个标签就判高档看到某个倒影就判低档换一瓶就全部失效。这个判断可以直接决定模型设计策略。第一网络不能太深ResNet50 以上对这类简单任务属于浪费容易把噪声也当特征记住第二数据增强必须克制那种“随机裁剪加旋转”的图像分类标准套餐在这里会直接毁掉位置语义第三验证时必须用 Grad-CAM 检查注意力落点确认热区在水线附近而不是瓶身标签上。这三条后面都会落到具体操作里。2.2 区间分类还是连续回归先按标题选分类再按生产需求补回归标题写的是分类工程落地也建议先按档位分类做。原因很简单档位输出有明确的验收标准容易做混淆矩阵容易界定“错一个档”和“错三个档”的代价。常用做法是先把水位切成低、中、高三个区间三分类对新手最友好效果也最容易做出来等管线通了再往下切 5 档或 8 档。档位越多相邻档位的边界样本越多模型不确定度越高这是任务本身的难度不是训练的锅。如果把档位切到 10 档以上分类的缺点就暴露了它把连续量硬切成离散桶浪费了“水位 47% 和 48%”之间本该有的连续性。这个时候更合理的做法是换回归头把最后的分类层换成单个神经元损失换成 MSE 或 Huber Loss输出直接映射为水位比例。标题既然是分类正文就按分类路线走完回归作为进阶改造放到最后一章细说。2.3 模型选型ResNet18 迁移学习为什么是这一步的最短路径对于“在一张图上定位一条渐变色带”这个任务ResNet18 属于性价比很高的起点。它只有一千多万参数用 ImageNet 预训练权重初始化后对边缘、纹理、颜色这些底层特征已经有了非常强的先验而水位分类需要的就是这些低级视觉特征不需要它记住“猫”和“狗”。VGG 虽然结构更直白但参数多、训练慢对小数据集收益有限EfficientNet 系列精度上限更高但涉及更多调参细节和训练技巧不适合作为第一个跑通的模型。迁移学习的接入方式也相对固定加载 ImageNet 预训练权重把最后的全连接层替换成“类别数个神经元”的新分类头先冻结主干只训练分类头再解冻全量微调。需要注意 torchvision 0.13 之后的接口用weightsmodels.ResNet18_Weights.IMAGENET1K_V1旧版用pretrainedTrue两个写法在 Notebook 里混用会直接报参数类型错误这也是我见过比较多的问题。2.4 同构问题把一维水位时序也变成图像CNN 照样能接如果现场没有摄像头只有液位计给出一串水位采样值CNN 还能用吗能而且思路和本标题完全同构把一维时序先编码成二维图像再做图像分类。常用编码有格拉姆角场GAF和马尔可夫变迁场把每个时间点的水位值映射成角度或状态转移概率画成一张方阵图然后丢给同一个 ResNet 分类器去判断“当前处于哪个水位阶段”。这和金融里把 OHLC 行情数据画成 K 线图再交给 CNN 做涨跌分类是同一个思路——问题本身不是图像但把它转成图像后就可以复用整套 CNN 工具链和训练经验。这个意识比某一次具体训练更重要。3. 从零准备水位图像数据集拍摄规范、标注规则与数据集划分模型的上限由数据集决定。有不少人下载过车辆检测 BDD100K、车牌 CCPD 或者医学影像 ADNI 这类公开数据集它们的下载和组织流程可以作为参考但“基于水位的图像分类”没有现成的公开数据集可用因为这个任务本身太垂直。结合从业经验自己采一批数据花不了一小时而且质量可控。这里把采集和标注的关键规则列清楚。3.1 数据从哪里来没有公开数据集时怎么自采采集的第一原则是固定机位。相机和瓶子的相对位置一旦变化水位线在画面里的绝对高度就失去意义模型会额外学一套视角特征。手机固定在三脚架或直接用 USB 摄像头都可以分辨率 640×480 以上就够因为分类看的是水线在什么位置附近不需要读刻度。背景用白色或浅灰色纸能有效压掉桌面倒影这一类干扰。瓶子要覆盖三种形态透明瓶、磨砂瓶、带标签瓶。每瓶从空瓶到满瓶按水位梯度拍 5 到 10 张每档位拍 3 到 5 个微小的角度变化模拟真实摆放的抖动。一个容易忽略的点是同一个瓶子同一机位下连拍的照片信息量极低几乎等于同一张图复制多份对训练没有正向帮助只会虚增数据集规模。真正要变的是水位、瓶型和光线而不是连拍次数。整体拍 20 分钟得到两三百张高质量样本完全够跑通这个任务。3.2 用脚本把文件夹变成带标签的 CSV目录即标注标注方式不要用图形标注工具直接用文件夹目录名当标签效率最高。目录结构约定为data/raw/level/bottle_id_seq.jpg其中level是水位档位bottle_id是同一个瓶子的唯一编号不要在编号里用下划线否则下面的拆分逻辑要改seq是同一瓶子的拍摄序号。这样标注信息同时存在于路径和文件名里后续生成 CSV、按瓶分组都方便。下面这段脚本扫描目录并生成标注表import pandas as pd from pathlib import Path root Path(data/raw) rows [] for level_dir in sorted(root.iterdir()): if not level_dir.is_dir(): continue level level_dir.name # 目录名即水位标签 for img_path in sorted(level_dir.glob(*.jpg)): bottle_id img_path.stem.split(_)[0] # 文件名前缀即瓶子编号 rows.append({ filename: str(img_path), level: level, bottle_id: bottle_id }) df pd.DataFrame(rows) df.to_csv(data/annotations.csv, indexFalse) print(df.groupby(level).size())逻辑说明脚本把“目录结构”翻译成“表格结构”每一行对应一张图片字段分别是图片路径、水位标签、瓶子编号。groupby(level).size()是第一个风险检查用来确认每个档位有多少张图避免某一档只有十几张。文件名里拆bottle_id这一步很关键后面按瓶划分数据集全靠它。3.3 按瓶子 ID 分组划分数据集杜绝数据泄露最常见的翻车点在这里直接用train_test_split按行随机划分。随机划分会把同一个瓶子的照片同时分进训练集和验证集模型只要记住“这个瓶子的标签长什么样”就能在验证集上拿高分根本不用学水位线。验证集分数虚高一部署到新瓶子就现原形。正确做法是按瓶子分组划分from sklearn.model_selection import GroupShuffleSplit gss GroupShuffleSplit(n_splits1, test_size0.2, random_state42) train_idx, val_idx next(gss.split(df, groupsdf[bottle_id])) train_df df.iloc[train_idx].reset_index(dropTrue) val_df df.iloc[val_idx].reset_index(dropTrue) assert not set(train_df[bottle_id]) set(val_df[bottle_id]), 瓶子ID泄露逻辑说明GroupShuffleSplit按bottle_id分组切分保证同一个瓶子要么全在训练集要么全在验证集。最后的assert是双保险一旦发现两边有同一个瓶子 ID 就直接报错。这样验证集分数才反映“模型遇到没见过的瓶子”时的真实表现。注意拍数据时如果同一个瓶子在不同水位下拍摄背景完全一致模型仍可能通过背景联想猜测水位。自采数据时要有意识地变换背景纸颜色或光照角度避免背景和水位高度完全相关。3.4 在 Notebook 里做数据探索和分布统计数据集落地后在 Notebook 里先做两步探索不要急着开训。第一步看类别分布第二步人工抽查边界样本。类别分布用 3.2 的groupby结果画柱状图即可如果一个档位明显少于其他档位后面要在 Loss 里加权或做重采样而不是让模型自己吸收不均衡。边界样本抽查指的是把每个档位的图片按文件名排序后抽几张出来看一眼特别关注水位正好卡在两个档位分界线的照片。这类样本如果标注员自己都犹豫建议在文件名里加一个_edge后缀后续训练时单独处理或者直接把它挪到更明确的档位里。这一步人工检查花十分钟能省掉后面训练时的很多困惑。4. 在 Notebook 里训练 CNN从 DataLoader 到微调完整可跑数据集就绪后进入 Notebook 的常规动作自定义 Dataset、写数据增强、加载预训练模型、两段式训练、画混淆矩阵。下面按顺序给出可以直接放进 Jupyter Notebook 的代码块并说明哪些参数不能乱改。4.1 自定义 Dataset 与轻量数据增强哪些增强不能碰水位分类的数据增强策略和普通图像分类不一样。水位线是全局位置特征它的语义依赖于“在画面中的绝对位置”所以垂直翻转、随机裁剪、较大角度的旋转都不能用这些操作会直接改变水位相对瓶身的语义。水平翻转可以用因为左右镜像不改变水面高度亮度轻微抖动可以用用来模拟早晚光照变化。下面是一个可用的 Dataset 实现from torch.utils.data import Dataset from PIL import Image import torchvision.transforms as T class WaterLevelDataset(Dataset): def __init__(self, df, size224, trainingFalse): self.df df.reset_index(dropTrue) self.size size self.training training self.labels sorted(df[level].unique()) self.label2id {label: i for i, label in enumerate(self.labels)} def __len__(self): return len(self.df) def __getitem__(self, idx): row self.df.iloc[idx] img Image.open(row[filename]).convert(RGB) if self.training: img T.RandomHorizontalFlip(p0.5)(img) img T.ColorJitter(brightness0.1, contrast0.05)(img) img T.Resize((self.size, self.size))(img) return T.ToTensor()(img), self.label2id[row[level]]逻辑说明__getitem__里每次读图后先做轻量增强再做 Resize。RandomHorizontalFlip对水位线是安全的因为瓶身左右对称ColorJitter只动亮度和轻微对比度模拟光照变化不改变水位位置。这里没有RandomResizedCrop这是刻意的——随机裁剪会让网络看到瓶子的局部而不是全貌水位位置语义直接丢失。归一化使用 ImageNet 的 mean/std配合预训练权重使用不能省略。4.2 冻结主干先探测再解冻微调的两段式训练直接对整个网络用小学习率微调也能收敛但水位分类数据集只有几百张全量微调很容易把预训练特征冲坏出现训练 Loss 下降但验证分数震荡不前的现象。常见做法是两段式先冻结主干只训练新替换的分类头跑几个 epoch 让它先适应新任务再解冻全部参数用小学习率统一微调。先准备模型和第一段训练import torch import torchvision.models as models device cuda if torch.cuda.is_available() else cpu model models.resnet18(weightsmodels.ResNet18_Weights.IMAGENET1K_V1) num_classes len(train_df[level].unique()) model.fc torch.nn.Linear(model.fc.in_features, num_classes) model model.to(device) for p in model.parameters(): p.requires_grad False for p in model.fc.parameters(): p.requires_grad True criterion torch.nn.CrossEntropyLoss() def run_epochs(model, loader, optimizer, criterion, epochs, device): for epoch in range(epochs): model.train() total_loss 0.0 for images, labels in loader: images, labels images.to(device), labels.to(device) optimizer.zero_grad() loss criterion(model(images), labels) loss.backward() optimizer.step() total_loss loss.item() print(fepoch {epoch 1}, loss {total_loss / len(loader):.4f}) optimizer torch.optim.AdamW(model.fc.parameters(), lr1e-3, weight_decay1e-4) run_epochs(model, train_loader, optimizer, criterion, epochs5, devicedevice)逻辑说明这里把主干参数全部冻结只有model.fc能接收梯度所以优化器只传入model.fc.parameters()。这个阶段用1e-3不会把预训练特征冲坏因为更深的层根本没参与反向传播。train_loader由WaterLevelDataset(train_df, trainingTrue)配合DataLoader构造验证集对应trainingFalse。第二段是解冻全量微调学习率要降一个数量级防止大步长破坏主干已经学好的边缘特征for p in model.parameters(): p.requires_grad True optimizer torch.optim.AdamW(model.parameters(), lr1e-4, weight_decay1e-4) run_epochs(model, train_loader, optimizer, criterion, epochs15, devicedevice)逻辑说明解冻后优化器接管全部参数学习率从1e-3降到1e-4。阶段二建议配早停——监控验证 Loss连续 3 轮不下降就break不需要硬跑满 15 轮。如果你发现验证 Loss 在下降但速度偏慢可以按 0.5 的系数手动衰减学习率而不是把 batch 调大。注意weightsmodels.ResNet18_Weights.IMAGENET1K_V1是 torchvision 0.13 之后的写法旧版本要用pretrainedTrue两者不要混用否则会报参数名不匹配。4.3 训练参数表学习率、batch、轮次与早停参数怎么设是新手问比较多的地方。下表是这套任务跑通后的参考配置直接抄一般不会出大问题参数参考值说明输入尺寸224×224与 ImageNet 预训练输入一致batch size16 或 32数据量小16 更保险显存不足用 8阶段一学习率1e-3只更新 fc 层可以稍大阶段二学习率1e-4全量微调不要超过 3e-4阶段一轮次3~5让分类头先收敛阶段二轮次10~15配早停不必硬跑满优化器AdamW比 Adam 权重衰减更规范早停 patience3验证 Loss 连续 3 轮不降就停说明两个容易看错的地方。第一阶段一 lr 用 1e-3 不危险因为这个阶段反向传播不会触及冻结的主干参数只有 fc 层在更新第二早停应该监控验证 Loss 而不是验证准确率Loss 对预测置信度的变化更敏感准确率可能连续几个 epoch 不变但 Loss 仍在下降。用验证 Loss 的耐心值通常取 3微调任务不建议取 5 以上会把过拟合的风险放大。4.4 混淆矩阵看边界档位而不是只盯 acc训练结束后验证集准确率 90% 以上看起来不错但对水位分类来说还不够。假设三档数据不均衡60% 的样本都在“中档”模型全部猜“中档”就能拿到 60% 的准确率这个数字会掩盖模型对“低档”和“高档”完全失效的事实。正确的评估动作是打印混淆矩阵和每一类的 precision、recallfrom sklearn.metrics import confusion_matrix, classification_report # preds 和 labels 是验证集推理得到的预测索引和真实索引 cm confusion_matrix(labels, preds) print(classification_report(labels, preds, target_namesclass_names))逻辑说明classification_report会输出每一档的 precision、recall 和 F1低档和高档的数值如果明显低于中档说明类别不均衡问题没处理干净需要回 3.4 做重采样。混淆矩阵的观察重点是矩阵对角线两侧——样本主要混淆在相邻档位是正常的说明模型知道水位大概在哪只是边界判断不清如果出现“低档错判成高档”这种跨档位混淆大概率是数据标签或者文件路径搞错了优先查 CSV 而不是调模型。5. 水位图像分类训练避坑五个让我返工的真实翻车现场这套流程里最容易出问题的环节不在模型结构而在数据和验证方式。下面五条都是实际踩过的坑按数据侧和训练侧分开讲每条都是现象、原因、解决三段。5.1 数据侧翻车按瓶泄露与边界标注来回改数据侧的坑最隐蔽因为它发生在模型训练之前训练过程里一切指标都正常直到部署才暴露。下面两条都是数据划分和标注环节的问题。第一条验证集准确率冲到 99%新瓶子一测就崩。现象是我这边训练和验证都好看但换一个没见过的瓶子准确率直接掉到六成以下原因几乎可以锁定在数据划分上——随机切分把同一个瓶子的照片同时分进了训练集和验证集模型记住的是瓶身标签、瓶盖颜色这些外观线索而不是水位线。解决方法是回到 3.3用GroupShuffleSplit按bottle_id分组划开并在划分后assert两边没有交集。想确认是不是这个问题只需要检查两张来自同一瓶子的相似照片是不是分居两组如果是那后面的验证分数就没有参考意义全部要推翻重来。第二条Loss 降到一定程度就下不去验证集上总是那几张图反复错。现象是查看样本后发现错误图片的水位都卡在两个档位交界处标注员自己前后给了两个不同的标签原因是档位边界没有明确的裁决规则人肉标注时凭感觉分类同一张图在不同批次被标成不同档位模型学到的标签自带噪声。解决是在标注规范里加入硬规则例如“水位线中点落在区间上半段算高档落在下半段算低档”让规则可重复执行对实在难以判断的样本单独建一个_edge文件夹先不参与训练等模型收敛后再用预测结果辅助标注。确认此事的方法是统计验证集里连续几个 epoch 都预测错的样本看它们的标签是不是集中在边界档位。5.2 模型侧翻车学错特征、强增强掉点与类别不均衡模型侧的坑集中在学习快慢和学习方向上。特征学偏、增强过猛、类别失衡都会让训练过程看起来“正常”但结果不可信。第三条模型准确率看着高但 Grad-CAM 热区落在瓶身品牌文字上。现象是验证集里预测正确的图像画上注意力热图后热点集中在标签文字和高光区域而不是水面线原因是数据里标签和水位高度存在相关性比如“满水位”的照片恰好大多数是某一种瓶子模型学会了用品牌文字猜水位。解决方法是数据采集时打乱瓶子型号和水位的配对关系确保每一种瓶子都覆盖所有水位档位训练后把 Grad-CAM 作为常规体检手段热区不在水线附近就回去补数据而不是继续调学习率。判断是不是这个问题的办法很直接把瓶子标签区域遮住再跑一次预测如果准确率明显下降说明模型靠标签而非水位做题。第四条加了随机裁剪增强后验证准确率反而掉了 3 到 5 个点。现象是训练集 Loss 下降更快但验证集效果变差典型的训练验证不一致原因是RandomResizedCrop会裁剪出瓶子的局部水位线在全图上的位置信息被破坏模型被迫从残缺信息里去猜档位等价于往数据里注入噪声。解决是把随机裁剪和旋转从增强管线中移除保留水平翻转和亮度抖动即可。要验证这个判断可以分别用“带裁剪增强”和“不带裁剪增强”两个配置各训一轮对比验证准确率差异一出来就很清楚。对于位置敏感型任务增强的目标是保持语义不变的前提下增加多样性而不是盲目堆增强操作。第五条三档数据不均衡模型几乎把所有样本都预测成中档。现象是混淆矩阵里中档的 recall 接近 95%低档和高档的 recall 只有 30% 不到原因是交叉熵损失对类别先验敏感不均衡时模型发现“都猜中档”能拿到最低的平均 Loss于是放弃学习少数类。解决是在 DataLoader 里加WeightedRandomSampler按类别样本数的倒数加权采样让每个 batch 里各档位比例相对均匀评估指标从 accuracy 换成 macro-F1这样少样本类别表现差时分数一眼就能看出来。这个现象在训练曲线上的特征是训练准确率高但每个 epoch 结束时打印的每类 recall 差异持续很大这时候再堆 epoch 没有用先治数据。6. 用 Grad-CAM 给模型做体检再顺手把分类头改回归模型训练完先别急着交付做一次“看哪里”的体检。对 ResNet18 来说在最后一个残差块layer4[-1]上挂 forward 和 backward hook取该模块输出特征图与类别梯度做加权求和就能得到一张注意力热图。热区如果落在瓶身中段的水线附近说明模型学到了物理水位特征如果热区漂到瓶子标签或桌面倒影上说明此前数据里的相关性问题没有彻底解决此时即使准确率数字好看也要回炉补数据。这也解释了为什么水位分类任务里验证集准确率和模型可靠性是两回事——准确率只告诉你是对是错热图告诉你凭什么对、凭什么错。import torch import torch.nn.functional as F feat_map {} grad_map {} def save_feat(module, input, output): feat_map[feat] output.detach() def save_grad(module, grad_input, grad_output): grad_map[grad] grad_output[0].detach() h1 model.layer4[-1].register_forward_hook(save_feat) h2 model.layer4[-1].register_full_backward_hook(save_grad) model.eval() img val_dataset[0][0].unsqueeze(0).to(device) out model(img) pred out.argmax(dim1).item() model.zero_grad() out[0, pred].backward() weights grad_map[grad].mean(dim(2, 3), keepdimTrue) cam (weights * feat_map[feat]).sum(dim1, keepdimTrue) cam F.relu(cam) cam F.interpolate(cam, size(224, 224), modebilinear, align_cornersFalse) cam (cam - cam.min()) / (cam.max() - cam.min() 1e-8) # 把 cam 叠加到原图上颜色较亮的区域就是模型分类的依据逻辑说明register_full_backward_hook捕获该模块输出对类别分数的梯度梯度的全局平均池化结果表示每个通道对预测的贡献权重权重乘上特征图再沿通道求和得到的就是“模型主要看画面中哪个区域”的粗粒度热图。PyTorch 1.8 之后应该用register_full_backward_hook旧写法register_backward_hook对新版自动求导图不生效这也是一个容易踩的小坑。体检通过后如果生产环节要求“水位百分比”而不是“档位”改造起来也不麻烦把model.fc换成单输出神经元损失换成 MSE验证指标换成水位误差均值原本的数据集和训练管线都不需要动。这里有一个我的个人习惯先做三档分类确认模型确实在学水线再把 head 换成回归做连续量预测因为分类阶段的问题定位手段更丰富回归模型出错了很难判断是特征问题还是数值回归问题。如果你的目标是毕设或课设做到“分类体检通过 回归改造可运行”这一步已经把一个完整的水位图像分析闭环全部打通了数据怎么采、模型怎么训、注意力怎么验、输出怎么用。希望这一套从数据到验证的流程能帮到你。本文还有配套的精品资源点击获取

相关新闻

Zulip 开源贡献指南:如何提出高质量问题并高效获取社区帮助

Zulip 开源贡献指南:如何提出高质量问题并高效获取社区帮助

即时通讯后端前端WebSocket 【免费下载链接】zulip Zulip server and web application. Open-source team chat that helps teams stay productive and focused. 项目地址: https://gitcode.com/GitHub_Trending/zu/zulip 点击查看 免费下载 Zulip 是一个开源的组织…

2026/10/11 22:05:49 阅读更多 →
从提示词到技能:Agent稳定落地的关键路径与技能库搭建指南

从提示词到技能:Agent稳定落地的关键路径与技能库搭建指南

最近一年,身边聊 Agent 的人肉眼可见地变多了。但聊归聊,真正把手头事情跑通的没几个。我也在被问过"能不能让 Agent 帮我们把周报自动写了"之后,被现实狠狠教育了一顿:光靠提示词写出来的 Agent,演示的时候…

2026/10/11 22:05:49 阅读更多 →
从杂乱脚本到可复用任务:cua 命令行自动化实践

从杂乱脚本到可复用任务:cua 命令行自动化实践

在维护一套内部任务平台的时候,我被大量重复的跨主机操作折磨过。每个环境都要处理几十行脚本,参数不同、路径不同,失败原因千奇百怪。后来我们把这些最常用的操作抽成命令,再用一套统一的配置文件去描述任务,就沉淀出…

2026/10/11 22:05:49 阅读更多 →

最新新闻

德思特 GNSS 模拟器技术参数详解:700+通道、1000Hz 迭代率、可模拟1200颗卫星的全星座仿真方案

德思特 GNSS 模拟器技术参数详解:700+通道、1000Hz 迭代率、可模拟1200颗卫星的全星座仿真方案

在高阶自动驾驶 HiL 闭环、低空无人系统及高动态 PNT(定位、导航、定时)测试中,传统户外路测往往受环境干扰大且场景难以 100% 复现。针对工程选型关注的核心参数与信号支持能力,德思特 GNSS 模拟器基于 Skydel 引擎与 SDA 软件定…

2026/10/11 22:52:37 阅读更多 →
vnpy量化实战:多因子选股+LightGBM动态仓位优化闭环

vnpy量化实战:多因子选股+LightGBM动态仓位优化闭环

简介:本资源是一套基于vn.py框架深度二次开发的量化投资实践项目,面向金融工程开发者、量化交易学习者及AI金融交叉领域从业者,解决选股自动化、策略回测工程化与机器学习模型集成等核心问题。压缩包共1656个文件,体量59.07MB&…

2026/10/11 22:52:37 阅读更多 →
vllm-metal 加载 GGUF 量化模型完整指南:Mac 本地部署 LLM 的省钱秘籍

vllm-metal 加载 GGUF 量化模型完整指南:Mac 本地部署 LLM 的省钱秘籍

【免费下载链接】vllm-metal Community maintained hardware plugin for vLLM on Apple Silicon 项目地址: https://gitcode.com/gh_mirrors/vl/vllm-metal 点击查看 免费下载 vllm-metal 是一个社区维护的硬件插件,让 vLLM 能够运行在 Apple Silicon&a…

2026/10/11 22:52:37 阅读更多 →
家电维修预约欧米到家|博世洗衣机维修预约|附近师傅上门检修|欧米到家报修热线

家电维修预约欧米到家|博世洗衣机维修预约|附近师傅上门检修|欧米到家报修热线

前言🌆 国内住宅业态丰富,各地老城老旧管网老化、水质杂质多,城市高层住宅水压波动频繁,全国大部分地区属于湿润气候,梅雨季、多雨季节潮湿多雨、空气湿度极高,冬夏温差大,差异化的居家工况让洗…

2026/10/11 22:52:37 阅读更多 →
构网型储能变流器参数整定:虚拟惯量、阻尼与下垂系数实战解析

构网型储能变流器参数整定:虚拟惯量、阻尼与下垂系数实战解析

最近在调试一个构网型储能样机,100kW 的柜子在离网工况下带 RLC 负载,光是 J 和 D 两个参数就调了两个晚上。功率波形要么像水面波纹一样持续荡漾,要么频率响应慢到让人怀疑控制器死机。后来我才意识到,构网型变流器能不能真正工程…

2026/10/11 22:52:37 阅读更多 →
MySQL子查询完全指南:分类、执行流程、性能优化与常见坑

MySQL子查询完全指南:分类、执行流程、性能优化与常见坑

子查询在MySQL里被很多人当成"会用但说不清"的技术点。SQL子查询用得好,能把复杂统计拆成清晰的嵌套逻辑;用不好,一条慢查询直接拖垮业务接口。这篇文章我把子查询从分类、执行流程到性能优化、报错排查完整过一遍,所有…

2026/10/11 22:51:36 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →