从零构建数据集:数据收集、标注到PyTorch训练全流程实战
1. 先搞清楚“从0构建数据集”到底要解决什么问题很多人一看到“训练自己的模型”就兴奋但第一步往往就卡在数据集上。不是找不到数据就是数据格式不对、质量太差或者根本不知道需要什么样的数据。这篇文章不聊复杂的模型调参就解决一个最实际的问题当你有一个具体的任务想法时如何从零开始弄出一份能让模型“学得会”的数据集并完成一次完整的训练流程。无论是做图像分类、目标检测比如YOLOv8/YOLOv5、文本分类还是更小众的任务比如用PointNet处理点云、用LSTM做序列预测核心痛点都一样数据从哪来怎么处理格式怎么定训练怎么配我会用一个贯穿始终的虚拟案例——“识别工业场景中的螺丝松动”一个简单的二分类图像任务——来拆解每一步。即使你的任务是文本、音频或其他类型处理逻辑也是相通的。最关键的是你要建立的不是一份“理论上”的数据集而是一份在具体训练框架如PyTorch, TensorFlow, MM系列套件里能直接跑起来的数据集。这中间涉及到数据收集、清洗、标注、格式转换、路径配置等一系列琐碎但决定成败的环节。2. 构建数据集从想法到结构化文件的完整链路构建数据集不是简单地把图片扔进一个文件夹。它是一个系统工程目的是生成训练代码能够理解和高效读取的标准化文件。下面以“螺丝松动检测”为例拆解每一步。2.1 定义任务与数据需求在动手找一张图片之前必须先明确以下几点这直接决定了后续所有工作的方向任务类型图像二分类“正常螺丝” vs “松动螺丝”。如果是目标检测就需要边界框坐标语义分割如用MMSegmentation训练Cityscapes则需要像素级掩码。数据规模深度学习需要足够的数据量。对于入门级分类任务每个类别至少需要数百张图像。目标检测和分割需求更大。如果数据稀缺就要考虑数据增强或迁移学习使用ResNet等预训练模型。数据格式图像通常为JPG/PNG文本为UTF-8编码的TXT/CSV。要统一。标注形式分类任务最简单一个文件对应一个标签如正常或松动。我们需要一个标注文件来记录这种对应关系。2.2 数据收集与获取渠道数据来源决定了数据的“原始质量”和清洗难度。自采数据用手机、相机在真实场景拍摄。优势最贴合实际需求。注意光线、角度、背景要尽可能多样化模拟真实应用环境。拍完后立即建立原始数据备份。公开数据集许多任务有现成数据集可以借鉴或迁移。通用视觉COCO2017、ImageNet、PASCAL VOC。理解它们的数据集结构如COCO的annotations/、train2017/目录和JSON标注格式对后续自己组织数据很有帮助。垂直领域自动驾驶数据集如KITTI、遥感图像、医疗图像。你的任务可能需要在特定数据集如DOTA、VisDrone上微调。搜索技巧在GitHub、Kaggle、Papers with Code等平台用英文关键词搜索如“loose screw dataset industrial”。即使没有完全匹配的类似场景的数据集也能提供灵感。网络爬取与合成需谨慎处理版权和伦理问题且数据噪声大清洗成本高。对于工业场景更推荐自采或使用专业领域开源数据。核心建议先尝试用最少的数据每类50-100张跑通整个流程验证可行性再大规模收集。不要一开始就追求万级数据量。2.3 数据清洗与预处理收集来的原始数据通常是“脏”的直接训练效果很差。去重删除完全重复或高度相似的图像/样本。筛选剔除与任务无关的、质量极差的如严重模糊、过曝数据。统一化处理图像调整尺寸如统一缩放到224x224归一化像素值如从[0,255]缩放到[0,1]或标准化。文本统一编码、去除乱码、特殊符号。数据增强这是小数据集训练的关键。通过旋转、翻转、裁剪、色彩抖动等方式人工扩充数据增加模型鲁棒性。注意增强操作要符合实际场景例如螺丝倒置可能无意义。2.4 数据标注创造“标准答案”这是构建数据集的核心劳动。标注的准确性直接决定模型性能上限。分类任务为每个文件打上标签。可以手动创建目录结构例如dataset/ ├── train/ │ ├── normal/ # 存放所有正常螺丝图片 │ └── loose/ # 存放所有松动螺丝图片 └── val/ ├── normal/ └── loose/很多框架如PyTorch的ImageFolder可以直接读取这种结构。目标检测任务需要标注边界框Bounding Box。使用标注工具如LabelImg、CVAT、MakeSense.ai画出框并指定类别工具会生成XMLVOC格式或TXTYOLO格式等标注文件。语义分割任务需要像素级标注使用LabelMe、EISeg等工具生成JSON或PNG掩码图。标注原则一致性。同一个“松动”标准所有标注员必须统一。建议先制定详细的标注规范文档。2.5 组织数据集目录与生成标注文件一个清晰、标准的目录结构是高效训练的基础。推荐如下结构screw_dataset/ ├── images/ # 存放所有原始图像 │ ├── train/ # 训练集图像 │ └── val/ # 验证集图像 ├── labels/ # 存放所有标注文件 (对于检测/分割任务) │ ├── train/ │ └── val/ └── meta/ # 存放元数据/列表文件 ├── train.txt # 训练集列表每行: images/train/001.jpg 0 └── val.txt # 验证集列表每行: images/val/100.jpg 1对于分类任务train.txt内容可能是相对路径和标签索引例如train/001.jpg 0 train/002.jpg 1 ...这里的0和1对应“正常”和“松动”。你需要编写一个简单的Python脚本根据images/train/和images/val/目录下的实际文件自动生成这两个列表文件并确保图像文件确实存在。绝对不要手动维护这个列表。3. 配置训练环境与理解数据加载数据集准备好后下一步是让训练代码能够“吃”进去。这里以PyTorch框架为例。3.1 创建自定义Dataset类PyTorch通过torch.utils.data.Dataset类来定义如何读取数据和标签。你需要继承这个类。import torch from torch.utils.data import Dataset from PIL import Image import os class ScrewDataset(Dataset): 螺丝松动分类数据集 def __init__(self, meta_file, transformNone): Args: meta_file (str): 元数据文件路径 (如 meta/train.txt) transform (callable, optional): 应用于图像的变换/增强 self.data [] self.transform transform # 读取元数据文件 with open(meta_file, r) as f: for line in f: img_path, label line.strip().split() self.data.append((img_path, int(label))) def __len__(self): return len(self.data) def __getitem__(self, idx): img_path, label self.data[idx] # 读取图像 image Image.open(img_path).convert(RGB) # 确保三通道 if self.transform: image self.transform(image) # 将标签转换为Tensor label torch.tensor(label, dtypetorch.long) return image, label关键点__init__负责读取你上一步生成的train.txt将路径-标签对存入列表。__getitem__根据索引返回一个(图像Tensor, 标签Tensor)对。这里是数据增强transform发生的地方。transform使用torchvision.transforms组合如调整大小、转为Tensor、归一化。3.2 配置数据变换Transforms与增强训练和验证/测试阶段的数据变换通常不同。from torchvision import transforms # 训练集变换增强 基础处理 train_transform transforms.Compose([ transforms.RandomHorizontalFlip(p0.5), # 随机水平翻转 transforms.RandomRotation(10), # 随机旋转 transforms.Resize((224, 224)), # 调整大小 transforms.ToTensor(), # 转为Tensor (H,W,C) - (C,H,W)值范围[0,1] transforms.Normalize(mean[0.485, 0.456, 0.406], # ImageNet均值 std[0.229, 0.224, 0.225]) # ImageNet标准差 ]) # 验证集变换仅基础处理不做增强 val_transform transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ])为什么用ImageNet的均值和标准差因为大多数预训练模型如ResNet是在ImageNet上训练的输入数据经过同样的归一化能更快更好地收敛。如果你的数据域与ImageNet差异极大可以计算自己数据集的均值和标准差。3.3 使用DataLoader进行批量加载Dataset负责读取单个样本DataLoader负责批量加载、打乱顺序、多进程加速。from torch.utils.data import DataLoader # 实例化Dataset train_dataset ScrewDataset(meta_filescrew_dataset/meta/train.txt, transformtrain_transform) val_dataset ScrewDataset(meta_filescrew_dataset/meta/val.txt, transformval_transform) # 创建DataLoader train_loader DataLoader(train_dataset, batch_size32, shuffleTrue, num_workers4, pin_memoryTrue) val_loader DataLoader(val_dataset, batch_size32, shuffleFalse, num_workers4, pin_memoryTrue)参数解释batch_size一次训练输入模型的样本数。根据GPU显存调整常见值为16, 32, 64。shuffle训练集必须打乱防止模型学习到数据顺序验证集不需要。num_workers用于数据加载的子进程数。可以加速数据读取但设置过高可能消耗过多内存。通常设为CPU核心数。pin_memory在GPU训练时设置为True可以加速主机到设备的数据传输。4. 选择模型、损失函数与优化器数据管道搭建好后需要定义模型、如何计算损失好坏以及如何优化更新。4.1 模型选择从零训练 vs 迁移学习从零训练随机初始化模型所有权重。仅推荐在数据量非常大远超ImageNet的百万级或任务非常独特与现有预训练模型差异极大时使用。对于我们的螺丝数据集假设仅几百张图从零训练极易过拟合。迁移学习使用在大型数据集如ImageNet上预训练好的模型如ResNet-18并对其最后一层或最后几层进行微调Fine-tuning。这是小数据集场景下的标准做法能极大提升收敛速度和最终性能。import torchvision.models as models import torch.nn as nn # 加载预训练的ResNet-18模型 model models.resnet18(pretrainedTrue) # 冻结所有底层参数特征提取器只训练最后一层 # for param in model.parameters(): # param.requires_grad False # 修改最后一层全连接层使其输出类别数我们这里是2类 num_features model.fc.in_features model.fc nn.Linear(num_features, 2) # 二分类 # 将模型移动到GPU如果可用 device torch.device(cuda if torch.cuda.is_available() else cpu) model model.to(device)策略选择策略A特征提取冻结所有预训练层requires_gradFalse只训练新添加的最后一层。训练快资源消耗少适合数据量极少或特征通用性强的场景。策略B微调不冻结或只冻结部分底层训练所有或大部分层。能更好地适应新任务但需要更多数据和计算资源。对于我们的任务通常采用此策略。4.2 损失函数与优化器损失函数Loss Function衡量模型预测与真实标签的差距。对于二分类或多分类任务使用交叉熵损失CrossEntropyLoss。优化器Optimizer根据损失计算梯度并更新模型参数。Adam是当前最常用的默认选择它自适应调整学习率通常效果不错。import torch.optim as optim criterion nn.CrossEntropyLoss() # 损失函数 optimizer optim.Adam(model.parameters(), lr0.001) # 优化器学习率设为0.001学习率lr最重要的超参数之一。太大可能导致震荡不收敛太小则收敛缓慢。可以从1e-3或1e-4开始尝试。更复杂的调度可以使用torch.optim.lr_scheduler。5. 编写训练循环与模型验证这是将数据、模型、损失、优化器串联起来的核心代码。5.1 训练循环Training Loopdef train_one_epoch(model, dataloader, criterion, optimizer, device): model.train() # 设置为训练模式启用Dropout, BatchNorm等 running_loss 0.0 correct 0 total 0 for batch_idx, (inputs, labels) in enumerate(dataloader): inputs, labels inputs.to(device), labels.to(device) # 前向传播 outputs model(inputs) loss criterion(outputs, labels) # 反向传播与优化 optimizer.zero_grad() # 清空上一轮的梯度 loss.backward() # 反向传播计算梯度 optimizer.step() # 更新参数 # 统计 running_loss loss.item() _, predicted outputs.max(1) total labels.size(0) correct predicted.eq(labels).sum().item() # 可选每N个batch打印一次进度 if batch_idx % 10 0: print(f Batch [{batch_idx}/{len(dataloader)}], Loss: {loss.item():.4f}) epoch_loss running_loss / len(dataloader) epoch_acc 100. * correct / total return epoch_loss, epoch_acc5.2 验证循环Validation Loop验证循环与训练循环类似但不进行反向传播和参数更新。torch.no_grad() # 禁用梯度计算节省内存和计算 def validate(model, dataloader, criterion, device): model.eval() # 设置为评估模式禁用Dropout, 固定BatchNorm的统计量 running_loss 0.0 correct 0 total 0 for inputs, labels in dataloader: inputs, labels inputs.to(device), labels.to(device) outputs model(inputs) loss criterion(outputs, labels) running_loss loss.item() _, predicted outputs.max(1) total labels.size(0) correct predicted.eq(labels).sum().item() epoch_loss running_loss / len(dataloader) epoch_acc 100. * correct / total return epoch_loss, epoch_acc5.3 主训练流程将多个epoch串联起来并保存最佳模型。num_epochs 20 best_val_acc 0.0 for epoch in range(num_epochs): print(fEpoch [{epoch1}/{num_epochs}]) # 训练 train_loss, train_acc train_one_epoch(model, train_loader, criterion, optimizer, device) # 验证 val_loss, val_acc validate(model, val_loader, criterion, device) print(f Train Loss: {train_loss:.4f}, Train Acc: {train_acc:.2f}%) print(f Val Loss: {val_loss:.4f}, Val Acc: {val_acc:.2f}%) # 保存验证集上性能最好的模型 if val_acc best_val_acc: best_val_acc val_acc torch.save({ epoch: epoch, model_state_dict: model.state_dict(), optimizer_state_dict: optimizer.state_dict(), val_acc: val_acc, }, best_model.pth) print(f - Saved best model with val_acc: {val_acc:.2f}%) print(Training Finished.)6. 关键问题排查与实战建议即使代码逻辑正确实际运行中也会遇到各种问题。以下是几个最常见的排查点。6.1 数据加载与路径问题现象程序一开始就报错提示找不到文件或无法读取图像。检查1文件路径。确保meta.txt中的路径是相对于运行脚本的路径并且文件确实存在。使用os.path.exists()进行验证。检查2图像格式。有些图像文件可能损坏或格式怪异。在Dataset的__getitem__方法中加入try-except跳过损坏文件并记录日志。检查3标签范围。对于N类分类标签必须是0到N-1的整数。检查你的meta.txt文件。6.2 训练过程异常Loss为NaN或不收敛Loss为NaN学习率过大尝试将学习率lr降低一个数量级例如从0.001降到0.0001。数据未归一化确保使用了transforms.Normalize。输入数据的值范围过大可能导致梯度爆炸。网络层或损失函数问题检查模型结构特别是自定义层。Loss不下降不收敛模型能力不足或任务过难尝试更复杂的模型如ResNet-34代替ResNet-18。数据标注错误随机检查一些样本看标签是否正确。错误标签会严重干扰学习。优化器或学习率问题尝试更换优化器如SGD或使用学习率调度器如StepLR。特征提取层未解冻如果你在做迁移学习且冻结了所有层模型可能无法适应新任务。尝试解冻最后几层或全部层。6.3 过拟合与欠拟合过拟合训练集准确率很高但验证集准确率很低。对策增加数据增强强度添加正则化如Dropout层权重衰减weight_decay减少模型复杂度使用早停Early Stopping。欠拟合训练集和验证集准确率都很低。对策增加模型复杂度减少正则化增加训练轮数检查数据质量和任务定义是否合理。6.4 资源与性能问题GPU显存不足CUDA out of memory减小batch_size。使用更小的图像输入尺寸。使用更小的模型。使用梯度累积Gradient Accumulation多次前向传播累积梯度后再更新一次参数模拟大batch_size效果。训练速度慢增加DataLoader的num_workers但不要超过CPU核心数。确保使用了pin_memoryTrue。检查是否在CPU和GPU之间频繁传输数据。6.5 模型评估与测试训练完成后在独立的测试集从未参与训练和验证的数据上评估最终模型性能。加载保存的最佳模型best_model.pth# 加载模型 checkpoint torch.load(best_model.pth) model.load_state_dict(checkpoint[model_state_dict]) model.eval() # 在测试集上评估 test_loss, test_acc validate(model, test_loader, criterion, device) print(fTest Accuracy: {test_acc:.2f}%)最后也是最重要的建议从极简开始逐步迭代。先用一个很小的子集比如每类10张图跑通整个流程确保数据加载、训练、验证、保存都无误。然后再用全量数据训练并开始调整超参数学习率、batch size等。记录每一次实验的配置和结果这是你后续分析和优化的唯一依据。构建和训练自己的模型是一个循环迭代的过程耐心和系统的实验记录比任何技巧都重要。

相关新闻

AI电影制作实战:从工作流搭建到本地部署全解析

AI电影制作实战:从工作流搭建到本地部署全解析

这次我们来看一个很有意思的项目:全球首部 AI 电影的核心制作技能(SKILL)公开,并且已经完成了首发汉化。对于关注 AI 视频生成、AI 电影制作流程,特别是想了解如何将 AI 工具串联起来完成复杂叙事创作的朋友来说&#…

2026/8/19 15:06:51 阅读更多 →
LLM智能体工具选择诊断:基于金丝雀工具与MCP协议的推理分析

LLM智能体工具选择诊断:基于金丝雀工具与MCP协议的推理分析

1. 项目概述:当LLM智能体“选错工具”时,我们如何诊断?在构建基于大语言模型的智能体时,我们常常会陷入一种“黑盒”的困惑。你精心设计了一套工具集,比如一个能查询天气的API、一个能执行数据库操作的函数、一个能调用…

2026/8/19 15:12:37 阅读更多 →
玛莎拉蒂2019款全系车型解析:豪华品牌如何通过年度改款应对市场变革

玛莎拉蒂2019款全系车型解析:豪华品牌如何通过年度改款应对市场变革

1. 从“展台明星”到“市场试金石”:上海车展对豪华品牌的意义 每年四月的上海车展,对于全球汽车行业而言,其重要性早已超越了单纯的“新车发布会”。它更像是一场面向中国这个全球最大单一市场的“期中大考”和“战略风向标”。对于玛莎拉蒂…

2026/8/19 12:59:06 阅读更多 →

最新新闻

卡尔曼滤波实战:从原理到代码,掌握目标跟踪与状态估计

卡尔曼滤波实战:从原理到代码,掌握目标跟踪与状态估计

这类算法教程最值得先看的不是它列了多少公式,而是能不能帮你把“预测-更新”这个核心循环真正用起来。卡尔曼滤波在目标跟踪、传感器融合、状态估计这些场景里几乎是绕不开的,但很多人卡在理论推导和代码落地之间,感觉懂了又好像没完全懂。 …

2026/8/21 8:53:43 阅读更多 →
服务器文件系统异常排查:从编码问题到安全威胁的实战指南

服务器文件系统异常排查:从编码问题到安全威胁的实战指南

在服务器运维和开发过程中,我们偶尔会遇到一些极其诡异、难以解释的现象,比如日志中出现无法识别的字符、进程占用异常、或者磁盘上凭空出现奇怪的文件。最近,一个颇为有趣的话题在技术社区流传开来:有运维工程师在检查服务器时&a…

2026/8/21 8:53:43 阅读更多 →
协同智能体探索与结构化建模:构建任务充分的世界模型

协同智能体探索与结构化建模:构建任务充分的世界模型

1. 从“世界模型”到“任务充分”:一个被忽视的协同难题在强化学习和具身智能的研究与实践中,构建一个能够准确预测环境动态的“世界模型”一直是核心目标之一。我们常常听到这样的说法:一个好的世界模型是智能体高效学习和泛化的基石。然而&…

2026/8/21 8:53:43 阅读更多 →
C++可变参数模板:从核心原理到实战应用

C++可变参数模板:从核心原理到实战应用

1. 项目概述:从“固定”到“不定”的范式跃迁在C的漫长演进史中,编写一个能处理任意数量、任意类型参数的函数或类,曾是无数开发者心中的“圣杯”。在C11之前,我们只能依赖C语言风格的变参宏(如printf背后的va_list&am…

2026/8/21 8:53:43 阅读更多 →
华为手机组装机鉴别与故障排查:从硬件原理到实战拆解

华为手机组装机鉴别与故障排查:从硬件原理到实战拆解

最近在帮朋友排查一台华为手机故障时,遇到了一个非常典型的案例:手机突然无法开机,拆机后发现内部组件与官方描述严重不符。这背后反映的不仅是硬件故障,更是一个普遍存在的消费陷阱—— 高仿组装机 。对于开发者、技术爱好者和…

2026/8/21 8:53:43 阅读更多 →
Prometheus 企业级部署完全指南:Docker + 二进制双方式、配置详解与热加载【20260818】】

Prometheus 企业级部署完全指南:Docker + 二进制双方式、配置详解与热加载【20260818】】

文章目录 Prometheus 企业级部署完全指南:Docker + 二进制双方式、配置详解与热加载 一、Prometheus 架构与核心概念速览 1.1 它到底是什么 1.2 核心组件关系 二、方式一:Docker 部署(推荐快速验证 / 容器化环境) 2.1 环境准备 2.2 编写配置文件 2.3 启动容器(单条命令) …

2026/8/21 8:52:37 阅读更多 →

日新闻

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

前言随着国家数字基础设施信创替代、关键技术自主可控战略持续深化,口岸智慧安防、边检智能管控领域正全面进入国产化、自主化、安全可控升级周期。当前国内机场边检旅客识别与定位体系长期依赖国外商用视觉算法、进口成像硬件、闭源通用计算平台,存在核…

2026/8/21 0:00:42 阅读更多 →
别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱当下数字化建设浪潮中,很多项目将三维可视化、视频贴图叠加的数字孪生等同于空间智能。传统数字孪生更多停留在三维场景复刻,擅长把物理世界“画出来、展示出来”,…

2026/8/21 0:00:42 阅读更多 →
105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40C到85C的影像质量一致性——ISP参数温漂补偿与产线标定策略 去年冬天在北方某车厂做A样评审,凌晨四点的黑河试验场,零下三十三度。客户拿了一台冷启动的车,中控屏上倒车影像全是雪花噪点,暗部细节直接糊成一片。我第一反应是sensor温度没上来,暗电流…

2026/8/21 0:00:42 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/21 0:02:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/20 6:11:08 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/20 21:46:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/21 0:14:22 阅读更多 →