七万五千张大米图像分类数据集:从数据清洗到基线模型实战
简介这份资源是面向计算机视觉学习者与图像分类实践者的五类大米图像分类数据集覆盖Arborio、Basmati、Ipsala、Jasmine、Karacadag五个品种适合用于分类网络训练、模型对比与迁移学习实验。数据已完成预处理可直接作为分类网络输入并已划分训练集与测试集各类图片按类别分目录存放便于快速构建数据加载流程。压缩包为7z格式共约2000个文件其中1998个jpg图像、1个py脚本与1个json标注文件整体约143.85MBjson文件记录类别与划分信息py脚本可用于数据集可视化方便检查样本分布与图像质量。目前已有174人学习下载可作为图像分类、分割网络改进的练手数据帮助读者省去采集与清洗成本把精力集中在模型结构、训练策略与结果分析上。1. 七万五千张大米图像分类数据集从拿到手到跑通第一个基线做农产品视觉分级的同行大概都有过这种体验算法调了半天最后卡在数据上。尤其是大米这种品类颗粒小、品种间差异微妙网上能找到的公开数据要么只有几百张要么标注格式乱七八糟清洗成本比训练还高。我最近拆了一份约 75,000 张、覆盖五个不同品种的大米图像分类数据集已标注拿来就能直接进训练流程。它解决的核心问题就一个省掉从零采集和标注的周期让你把精力放在模型选型和调参上。适合做食品质检、农产品分拣、细粒度图像分类的从业者也适合想找一个规模够大、类别干净的数据集来验证新网络结构的人。下面按我实际拆包的顺序把这份资源从结构到落地讲清楚。2. 数据集结构与标注格式先搞清楚你拿到的是什么2.1 五个品种的目录组织与类别分布这份数据集最常见的组织方式是按类别分目录每个品种一个文件夹文件夹名就是类别标签。五个品种对应五个目录总样本量约 75,000 张平均下来每类大概 15,000 张。实际拆开看类别之间会有轻微不均衡这在农产品数据里很正常——某个品种的样本更容易采集数量就会偏多。先做一件事统计每个类别的实际数量别假设它是均衡的。不均衡会直接影响后面损失函数和采样策略的选择。import os from collections import Counter data_root rice_dataset # 数据集根目录 split_dirs [train, val, test] # 常见做法是已经切好 for split in split_dirs: split_path os.path.join(data_root, split) if not os.path.exists(split_path): continue counter Counter() for cls_name in os.listdir(split_path): cls_path os.path.join(split_path, cls_name) if os.path.isdir(cls_path): # 只统计图片文件过滤掉可能的隐藏文件 n len([f for f in os.listdir(cls_path) if f.lower().endswith((.jpg, .jpeg, .png, .bmp))]) counter[cls_name] n print(f[{split}] 类别分布: {dict(counter)}) print(f[{split}] 总计: {sum(counter.values())})这段脚本的逻辑很直接遍历每个 split 下的类别目录统计图片文件数量。参数上唯一需要注意的是文件后缀过滤有些数据集里混了.DS_Store或者缩略图缓存文件不过滤就会把统计结果带偏。跑完之后你会得到一张类别分布表如果某个类别的数量明显低于平均值后面就要考虑用加权采样或者类别权重来处理。如果数据集没有预先切分 train/val/test只有一个总目录那就需要自己切。常见做法是按 7:1.5:1.5 或者 8:1:1 来分用sklearn.model_selection.train_test_split配合stratify参数保证每个类别的比例一致。2.2 标注文件格式与解析方式已标注这个描述在不同数据集里含义不一样。有的数据集是目录名即标签不需要额外的标注文件有的会附带一个 CSV 或者 JSON里面记录文件名和对应标签。拆包后先确认属于哪种。如果是 CSV 格式通常长这样一列是图片相对路径一列是类别名或类别 ID。解析的时候要注意路径拼接问题——CSV 里存的路径可能是相对于数据集根目录的也可能是绝对路径直接拼容易翻车。import csv import os csv_path rice_dataset/labels.csv data_root rice_dataset samples [] with open(csv_path, r, encodingutf-8) as f: reader csv.DictReader(f) # 先打印表头确认列名不同数据集列名不统一 print(列名:, reader.fieldnames) for row in reader: # 常见列名是 filename/image_path 和 label/class img_path row.get(filename) or row.get(image_path) label row.get(label) or row.get(class) full_path os.path.join(data_root, img_path) if os.path.exists(full_path): samples.append((full_path, label)) else: print(f路径不存在: {full_path}) print(f有效样本数: {len(samples)})这里的关键点是先打印表头再解析。我见过太多人直接按自己以为的列名去取结果KeyError报了一堆。另外路径校验那一步别省数据集在打包和传输过程中偶尔会丢文件提前发现比训练到一半报错强。提示如果标注是 JSON 格式结构通常是{image_name: xxx.jpg, label: 品种A}的列表解析逻辑类似用json.load读入后遍历即可。重点是先确认字段名不要硬编码。2.3 图像尺寸、通道与预处理基线大米图像通常是 RGB 三通道尺寸方面不同数据集差异较大。有的已经统一缩放到 224×224 或 256×256有的保留原始分辨率。先抽样看几张图的尺寸分布决定后面是直接 resize 还是先裁剪。from PIL import Image import random sample_paths [s[0] for s in random.sample(samples, min(20, len(samples)))] for p in sample_paths: with Image.open(p) as img: print(f{os.path.basename(p)}: size{img.size}, mode{img.mode})如果尺寸参差不齐训练前统一 resize 到目标尺寸是必须的。分类任务里 224×224 是通用起点但如果品种间差异体现在纹理细节上可以适当提高到 320×320 或 384×384。代价是显存占用和训练时间增加这个权衡后面调参章节会展开。预处理基线我一般这样设resize 到目标尺寸转 tensor按 ImageNet 的均值和标准差做归一化。虽然大米图像和 ImageNet 分布不同但用预训练权重时保持一致的归一化参数是常见做法省事且效果稳定。3. 训练基线搭建从 DataLoader 到第一个 epoch3.1 用 ImageFolder 快速构建数据管道如果数据集是按类别分目录的结构torchvision.datasets.ImageFolder是最省事的入口。它自动把目录名映射为类别索引配合DataLoader几行就能跑起来。import torch from torchvision import datasets, transforms from torch.utils.data import DataLoader train_transform transforms.Compose([ transforms.Resize((224, 224)), # 统一尺寸 transforms.RandomHorizontalFlip(), # 轻量增强大米图像翻转合理 transforms.RandomRotation(15), # 小角度旋转模拟拍摄角度变化 transforms.ToTensor(), transforms.Normalize( # ImageNet 统计值 mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225] ), ]) val_transform transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize( mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225] ), ]) train_dataset datasets.ImageFolder(rice_dataset/train, transformtrain_transform) val_dataset datasets.ImageFolder(rice_dataset/val, transformval_transform) train_loader DataLoader( train_dataset, batch_size64, shuffleTrue, num_workers4, pin_memoryTrue ) val_loader DataLoader( val_dataset, batch_size64, shuffleFalse, num_workers4, pin_memoryTrue ) print(f类别映射: {train_dataset.class_to_idx}) print(f训练集: {len(train_dataset)}, 验证集: {len(val_dataset)})参数说明几个关键点。batch_size64是 224 尺寸下的常见起点显存不够就降到 32。num_workers4取决于你的 CPU 核数设太大反而会因为进程调度开销拖慢速度一般设成 CPU 核数的一半左右。pin_memoryTrue在 GPU 训练时能加速数据传输CPU 训练就关掉。增强策略上大米图像的翻转和旋转是安全的因为品种特征不依赖方向。但颜色抖动要谨慎——如果品种区分依赖颜色特征ColorJitter可能把关键信息搅乱。我一般先不加颜色增强跑完基线看混淆矩阵再决定。3.2 选 ResNet50 还是 EfficientNet基线的取舍基线模型的选择决定了你后面调参的天花板。这份数据集有 75,000 张图、5 个类别规模不算小轻量模型容易欠拟合太大的模型又没必要。模型参数量224 输入下的特点适用场景ResNet50约 25M稳定、社区资源多、调参经验丰富首选基线排错容易EfficientNet-B0约 5.3M参数少、推理快显存紧张或要部署到边缘设备ViT-B/16约 86M需要更多数据增强数据量够大时尝试75K 勉强够我的建议是先用 ResNet50 跑一个基线。理由很简单它的训练行为可预测出问题容易定位。EfficientNet 虽然参数少但它的复合缩放策略对输入尺寸和正则化比较敏感新手调起来容易懵。ViT 类模型在这份数据量上可以试但需要更强的增强策略和更长的训练周期不适合作为第一个基线。import torch.nn as nn from torchvision import models def build_model(num_classes5, pretrainedTrue): # 用预训练权重小数据集上收敛快很多 model models.resnet50(weightsmodels.ResNet50_Weights.DEFAULT if pretrained else None) # 替换最后的全连接层输出类别数改为 5 in_features model.fc.in_features model.fc nn.Linear(in_features, num_classes) return model device torch.device(cuda if torch.cuda.is_available() else cpu) model build_model(num_classes5).to(device) print(f设备: {device}, 输出类别数: {model.fc.out_features})替换fc层是标准操作注意in_features要从原模型读不要硬编码 2048虽然 ResNet50 确实是 2048但写成动态获取更稳妥。3.3 训练循环与第一个 epoch 的验证训练循环不用写得太花哨基线阶段核心就是前向、算 loss、反向、更新每个 epoch 结束跑一次验证。import torch.optim as optim from torch.optim.lr_scheduler import CosineAnnealingLR criterion nn.CrossEntropyLoss() optimizer optim.AdamW(model.parameters(), lr1e-3, weight_decay1e-4) scheduler CosineAnnealingLR(optimizer, T_max20) # 假设训练 20 个 epoch def train_one_epoch(model, loader, criterion, optimizer, device): model.train() total_loss, correct, total 0.0, 0, 0 for imgs, labels in loader: imgs, labels imgs.to(device), labels.to(device) optimizer.zero_grad() outputs model(imgs) loss criterion(outputs, labels) loss.backward() optimizer.step() total_loss loss.item() * imgs.size(0) correct (outputs.argmax(1) labels).sum().item() total imgs.size(0) return total_loss / total, correct / total torch.no_grad() def evaluate(model, loader, criterion, device): model.eval() total_loss, correct, total 0.0, 0, 0 for imgs, labels in loader: imgs, labels imgs.to(device), labels.to(device) outputs model(imgs) loss criterion(outputs, labels) total_loss loss.item() * imgs.size(0) correct (outputs.argmax(1) labels).sum().item() total imgs.size(0) return total_loss / total, correct / total for epoch in range(20): train_loss, train_acc train_one_epoch(model, train_loader, criterion, optimizer, device) val_loss, val_acc evaluate(model, val_loader, criterion, device) scheduler.step() print(fEpoch {epoch1:02d} | train_loss{train_loss:.4f} acc{train_acc:.4f} f| val_loss{val_loss:.4f} acc{val_acc:.4f})AdamW配合weight_decay1e-4是 Transformer 时代之后比较通用的选择比 SGD 省心。学习率1e-3对 AdamW 来说偏大但配合余弦退火能在前期快速下降。如果你发现 loss 震荡厉害降到3e-4试试。CosineAnnealingLR的T_max设成总 epoch 数让学习率平滑降到接近零。第一个 epoch 跑完验证集准确率如果在 80% 以上说明数据质量和模型选型都没大问题。如果低于 60%先别急着调模型回去检查数据管道——大概率是标签映射错了或者图像读取有问题。4. 避坑与排查这份数据集最容易翻车的五个地方4.1 类别索引与标签名对不上现象训练时准确率正常上升但推理阶段把预测结果映射回品种名时全乱了。原因ImageFolder的class_to_idx是按目录名的字母顺序生成的不是按你期望的业务顺序。如果后面用硬编码的列表去映射顺序不一致就会错位。解决始终用train_dataset.class_to_idx来建立索引到名称的映射把它保存下来推理时加载同一个映射文件。不要手写类别列表。import json idx_to_class {v: k for k, v in train_dataset.class_to_idx.items()} with open(idx_to_class.json, w, encodingutf-8) as f: json.dump(idx_to_class, f, ensure_asciiFalse)4.2 验证集泄漏进训练集现象验证准确率高得离谱接近 99%但换一批新图测试就崩了。原因数据集切分时没有按样本去重同一张原图经过不同增强后同时出现在训练集和验证集里。或者切分时用了随机切分但没固定随机种子导致每次运行切分结果不同。解决切分前先对图片做哈希去重确保同一张图只出现在一个 split 里。切分时固定random_state并把切分后的文件列表保存下来后续训练直接读列表而不是重新切。4.3 图像损坏导致训练中途崩溃现象训练到某个 batch 时突然报PIL.UnidentifiedImageError或者OSError整个进程挂掉。原因75,000 张图里难免有几张在传输或压缩过程中损坏Image.open读不了。解决训练前跑一遍完整性校验把坏图挑出来删掉或替换。校验脚本用Image.open加img.verify()虽然慢一点但一劳永逸。from PIL import Image import os def check_images(root): bad [] for dirpath, _, filenames in os.walk(root): for fn in filenames: if not fn.lower().endswith((.jpg, .jpeg, .png, .bmp)): continue fp os.path.join(dirpath, fn) try: with Image.open(fp) as img: img.verify() # 校验文件完整性 except Exception as e: bad.append((fp, str(e))) return bad bad_files check_images(rice_dataset) print(f损坏文件数: {len(bad_files)}) for fp, err in bad_files[:10]: print(f {fp}: {err})4.4 显存溢出与 batch size 的玄学现象CUDA out of memory但你明明算过显存够用。原因PyTorch 的显存分配有碎片化问题尤其是动态输入尺寸或者频繁创建临时张量时。另外num_workers设太大也会占用额外显存。解决先把batch_size减半试如果还报就检查是否有张量没释放。常见做法是在训练循环里用torch.cuda.empty_cache()但别每个 batch 都调会拖慢速度。更根本的办法是固定输入尺寸避免动态 shape 导致的显存碎片。4.5 数据增强过度导致欠拟合现象训练 loss 和验证 loss 都居高不下模型学不动。原因增强策略太激进比如同时加了强颜色抖动、大角度旋转、随机裁剪把品种间的关键差异特征给抹掉了。解决基线阶段只用翻转和小角度旋转。跑完基线看混淆矩阵如果某两个品种互相混淆严重再针对性加增强。增强是为了让模型学到不变性不是为了把图变得面目全非。5. 进阶技巧用混淆矩阵和 t-SNE 定位品种间的混淆边界基线跑通之后准确率数字本身信息量有限。真正有价值的是搞清楚模型在哪些品种之间犯错以及为什么犯错。我一般会做两件事画混淆矩阵跑 t-SNE 看特征分布。混淆矩阵能直接告诉你哪两个品种互相误判最多。比如品种 A 和品种 B 之间的误判率明显高于其他组合那就要回去看这两个品种的图像特征差异——是颜色接近、形状相似还是纹理在 resize 之后丢失了。import numpy as np import matplotlib.pyplot as plt from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay torch.no_grad() def get_all_preds(model, loader, device): model.eval() all_preds, all_labels [], [] for imgs, labels in loader: imgs imgs.to(device) outputs model(imgs) preds outputs.argmax(1).cpu().numpy() all_preds.extend(preds) all_labels.extend(labels.numpy()) return np.array(all_labels), np.array(all_preds) labels, preds get_all_preds(model, val_loader, device) cm confusion_matrix(labels, preds) disp ConfusionMatrixDisplay(cm, display_labelslist(train_dataset.class_to_idx.keys())) disp.plot(cmapBlues, values_formatd) plt.title(验证集混淆矩阵) plt.tight_layout() plt.savefig(confusion_matrix.png, dpi150) print(混淆矩阵已保存)t-SNE 则是把模型倒数第二层的特征向量降维到二维看五个品种在特征空间里是否分得开。如果某两个品种的簇重叠严重说明模型提取的特征还不足以区分它们可能需要换更强的 backbone 或者针对性地设计增强。from sklearn.manifold import TSNE torch.no_grad() def extract_features(model, loader, device): model.eval() # 去掉最后的 fc 层取全局池化后的特征 feature_extractor torch.nn.Sequential(*list(model.children())[:-1]) feats, labels [], [] for imgs, lbls in loader: imgs imgs.to(device) f feature_extractor(imgs).squeeze(-1).squeeze(-1) feats.append(f.cpu().numpy()) labels.extend(lbls.numpy()) return np.concatenate(feats), np.array(labels) feats, tsne_labels extract_features(model, val_loader, device) tsne TSNE(n_components2, perplexity30, random_state42) feats_2d tsne.fit_transform(feats) plt.figure(figsize(8, 6)) for cls_id in np.unique(tsne_labels): mask tsne_labels cls_id plt.scatter(feats_2d[mask, 0], feats_2d[mask, 1], s5, labelfclass {cls_id}) plt.legend() plt.title(验证集特征 t-SNE 分布) plt.tight_layout() plt.savefig(tsne.png, dpi150) print(t-SNE 图已保存)perplexity30是 t-SNE 的常用起点样本多的时候可以调到 50。注意 t-SNE 的计算量随样本数增长很快验证集如果有一万多张跑一次可能要几分钟建议先随机采样几千张来跑。这两个图结合起来看基本能定位问题出在哪。如果混淆矩阵显示某两类互相误判t-SNE 也显示这两类重叠那就是特征区分度不够考虑换 backbone 或者加针对性的数据增强。如果混淆矩阵有问题但 t-SNE 分得开那可能是分类头的问题检查一下 fc 层的学习率是否合适。从那以后我每次拿到新数据集都强制先跑一遍类别分布统计和图像完整性校验再开始搭模型。这两个步骤花不了十分钟但能省掉后面几个小时的排错时间。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

后端转 Agent 开发:避开认知差,掌握企业级项目核心思维(TaoToken 收藏版)

后端转 Agent 开发:避开认知差,掌握企业级项目核心思维(TaoToken 收藏版)

/* 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 12:25:23 阅读更多 →
陌生源码包安全分析:微盘类源码的排查流程与高危点

陌生源码包安全分析:微盘类源码的排查流程与高危点

简介:压缩包内含一套微盘(微交易)系统完整源码,采用多种编程语言编写,以PHP后端逻辑与JavaScript前端交互为主,面向需要搭建、学习或二次开发微盘交易平台的开发者。全包共2000个文件,核心文件包…

2026/10/11 12:25:23 阅读更多 →
用进化论重构投资体系:自然选择下的适者生存法则

用进化论重构投资体系:自然选择下的适者生存法则

1. 为什么偏偏是达尔文:进化论本质上是一套生存算法我第一次认真想这个问题,是因为读了很多投资类的书之后,发现一个反复出现的感觉——好的投资方法,几乎都带着一点“生物学味”。不是套个名词装高深,而是底层逻辑实在…

2026/10/11 12:24:22 阅读更多 →

最新新闻

面对模糊需求如何落地项目?从rea代号拆解到技术选型与实现

面对模糊需求如何落地项目?从rea代号拆解到技术选型与实现

1. 当标题只剩三个字母:一次“信息真空”下的项目复盘拿到“rea”这个标题的时候,我第一反应是愣了一下。没有项目正文,没有关键词,没有摘要描述,连热搜词和网络热词都是空的。换句话说,这是一个几乎零信息…

2026/10/11 13:11:50 阅读更多 →
HBuilderX.zip解压即用原理与跨端开发实战指南

HBuilderX.zip解压即用原理与跨端开发实战指南

简介:本资源为HBuilderX官方集成开发环境安装包,面向前端开发者、uniapp初学者及跨平台应用实践者,解决Vue.js与多端项目开发环境快速搭建问题。压缩包为标准ZIP格式,大小306.77MB,内含完整可执行安装程序及配套运行时…

2026/10/11 13:11:50 阅读更多 →
PHP风控实战:活体识别集成方案与接口对接详解

PHP风控实战:活体识别集成方案与接口对接详解

1. 风控场景下的活体识别需求拆解1.1 为什么传统身份核验方式已经不够用了做过风控系统的人都有一个共识:身份核验这件事,从来不是"验一次就完事"的。早些年大家做实名认证,无非就是姓名加身份证号二要素比对,后来升级到…

2026/10/11 13:11:50 阅读更多 →
WIN7老主板USB3.0驱动安装与DISM镜像注入实战指南

WIN7老主板USB3.0驱动安装与DISM镜像注入实战指南

简介:这份资源是专为Windows 7系统准备的USB3.0驱动程序包,主要面向使用SKYLAKE平台及以上CPU、需要通过USB设备安装或恢复系统的用户。在原生支持USB3.1但向下兼容USB3.0的硬件环境下,若未预先加载该驱动,Win7安装程序往往无法识…

2026/10/11 13:11:50 阅读更多 →
Java 实现 HEIC 转 PNG/JPEG 全攻略:选型、性能与避坑

Java 实现 HEIC 转 PNG/JPEG 全攻略:选型、性能与避坑

简介:这份资源面向需要在Java环境中处理HEIC图片的开发者,尤其是遇到苹果设备素材、旧系统或第三方库不支持该格式的兼容性场景。HEIC基于HEVC编码,压缩效率优于JPEG,但Java标准库并不原生支持解码,因此项目围绕借助Im…

2026/10/11 13:11:50 阅读更多 →
代码随想录67天刷题总结:算法模板、避坑与面试转化

代码随想录67天刷题总结:算法模板、避坑与面试转化

代码随想录刷到第67天,说实话,这一天比我想象中来得平静。没有“终于结束了”的解脱感,也没有“我全都学会了”的兴奋,更多的是一种踏实的收束感。从第一天的数组二分查找开始,到后来二叉树、回溯、动规、单调栈&#…

2026/10/11 13:10:49 阅读更多 →

日新闻

流感时间序列预测实战: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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/10 10:38:42 阅读更多 →