农作物病虫害识别Python分类项目:从数据加载到F1评估的完整工程实战
简介这是一套面向计算机相关专业学生与项目实战学习者的农作物病虫害识别分类完整项目包可直接用于毕业设计、课程设计或期末大作业。资源以Python为核心实现涵盖数据加载、模型构建、训练验证等完整流程并附带数据集与使用说明帮助读者快速理解图像分类任务从数据到模型落地的整体思路。压缩包共96个文件以76个py源码为主辅以pyc编译文件、zip数据包及txt、md说明文档整体约25.1MB目录按主程序、模型库、配置与工具模块分层组织便于按模块查阅与二次开发。项目已通过严格调试下载即用可运行验证。目前已有2167人学习下载适合需要完整毕设方案、实战练习素材或课程作业参考的读者能从中获得可复用的代码框架、数据集组织方式与模型训练排错经验。1. 农作物病虫害识别项目一份能直接跑通的 Python 分类工程农田里拍一张叶片照片几秒钟后告诉你这是稻瘟病还是白叶枯这件事在实验室里早就不新鲜但真正把「数据加载—模型定义—训练—验证」串成一条能跑通的流水线才是多数人卡住的地方。这份基于 Python 的农作物病虫害识别分类项目给的不是一段演示脚本而是一套完整工程train_val.py负责训练与验证主循环lib/dataloader.pyc管数据读取models/下塞了 resnet、efficientnet、swin_transformer、levit、xcit 等一长串骨干网络config/里放配置CNLtrainlog.txt和f1.txt是训练日志与指标记录。它面向的是正在做毕设、课程设计或需要一次完整分类实战的人——你要的不是从零搭轮子而是在一个已经调通的框架上换数据、调参数、看结果。下面按「这套东西怎么组织、怎么跑起来、哪里会翻车」的顺序拆开讲。2. 工程结构与骨干网络选型为什么塞了这么多模型拿到压缩包先别急着python train_val.py花十分钟把目录结构看明白后面调参能省掉大量瞎试的时间。这个项目的组织方式属于典型的「配置驱动 模型注册」风格理解它的分层逻辑比记住某个文件名重要得多。2.1 目录分层与各模块职责从文件清单能看出清晰的三层结构。最外层是入口与配置train_val.py是训练验证入口config/目录下的config.pyc、constants.pyc存放超参和常量README.md是使用说明。中间层是数据与工具lib/下的dataloader.pyc负责数据集加载和增强utils.pyc是通用工具函数helpers.py、features.py提供辅助能力。最内层是模型定义models/目录下按骨干网络拆成独立文件registry.py做模型注册factory.py做实例化工厂。这种分法的好处是换模型不用动训练代码。你只要在配置里改一个模型名字factory.py就会去registry.py里找对应实现并构建。常见做法是训练脚本只认配置不认具体网络这样同一套训练循环能跑 resnet 也能跑 swin。目录/文件职责改动频率train_val.py训练与验证主循环低lib/dataloader.pyc数据加载、增强、批处理中config/config.pyc超参、路径、模型名高models/registry.py模型注册表低models/factory.py模型实例化低models/*.py各骨干网络实现低CNLtrainlog.txt/f1.txt训练日志与 F1 记录只读需要提醒的是lib/和config/下不少文件是.pyc编译产物不是.py源码。这意味着你能直接运行但想改数据加载逻辑时得先确认有没有对应的.py源文件否则只能通过配置项间接调整。这是这类打包项目的常见取舍——保护核心逻辑同时留出配置口子。2.2 骨干网络清单与选型逻辑models/目录里的网络数量相当可观粗略分几类。CNN 经典系resnet.py、resnetv2.py、resnet_rs.py、resnet_dw.py、densenet.py、xception.py、efficientnet.py及其efficientnet_blocks.py、efficientnet_builder.py。轻量系levit.py、rexnet.py、regnet.py。注意力与 Transformer 系swin_transformer.py、vision_transformer.py、vision_transformer_hybrid.py、xcit.py、cait.pyc、tnt.py、pit.py、convit.py。混合与特殊结构coat.pyc、twins.py、botnet.pyc、visformer.py、san_lowrank.py、sknet.py、resnest.py、res2net.py、cotnet.py、cotnet_hybrid.py、lambdAnet.py、lr_net.py、psresnet.py。为什么放这么多因为病虫害识别这个任务有个特点类间差异可能很细比如两种叶斑病类内差异又可能很大光照、角度、病斑阶段不同。轻量网络如 levit、rexnet 在样本量不大时不容易过拟合适合先跑通基线swin、xcit 这类带注意力机制的在病斑区域定位上往往更强但吃显存、吃数据量。我的建议是先用 resnet 或 efficientnet 跑一个基线确认数据管道没问题再换大模型对比。提示不要一上来就选参数量最大的模型。病虫害数据集通常规模有限大模型在小数据上很容易过拟合验证集 F1 反而更低。2.3 配置驱动的模型切换方式配置驱动的核心是「改配置不改代码」。虽然config.pyc是编译产物但通常仍会暴露可读的配置项。常见做法是在配置里指定模型名、输入尺寸、批大小、学习率、训练轮数。下面是一段示意性的配置读取与模型构建代码帮助你理解这个流程该怎么接# 示意从配置读取模型名并构建实际以项目内 config 为准 import importlib from models import registry, factory # 1. 读取配置中的模型标识例如 resnet 或 swin_transformer model_name cfg.MODEL.NAME num_classes cfg.MODEL.NUM_CLASSES # 病虫害类别数需与数据集一致 # 2. 通过注册表拿到模型构建函数 build_fn registry.get(model_name) if build_fn is None: raise KeyError(f模型 {model_name} 未注册检查 models/registry.py) # 3. 实例化模型传入类别数等参数 model factory.build(build_fn, num_classesnum_classes, pretrainedcfg.MODEL.PRETRAINED) model model.to(cfg.DEVICE) print(f已构建模型: {model_name}, 类别数: {num_classes})逻辑说明第一步从配置拿模型名和类别数类别数必须和你数据集的实际分类数一致否则最后一层全连接维度对不上训练时直接报维度错误。第二步通过注册表查找如果名字拼错或该模型没注册这里会提前抛错比训练到一半才崩要好。第三步实例化并搬到设备上pretrained控制是否加载预训练权重——小数据集上强烈建议开预训练。参数说明cfg.MODEL.NAME是字符串取值要和registry.py里注册的键一致cfg.MODEL.NUM_CLASSES是整数等于你病虫害类别总数cfg.DEVICE通常是cuda或cpu。改模型时只动配置训练脚本一行不用碰这就是这套结构最实用的地方。3. 数据管道与训练流程从图片到 F1 指标模型再多数据管道不通就是空转。这一章讲清楚数据怎么进来、训练怎么跑、指标怎么看这是把项目从「能打开」变成「能出结果」的关键一步。3.1 数据加载与增强的配置要点lib/dataloader.pyc承担数据加载。虽然它是编译产物但数据管道的关键参数通常通过配置暴露。农作物病虫害图像有几个典型问题拍摄设备不统一导致分辨率差异大、田间光照变化剧烈、病斑在整张图里占比可能很小。对应的增强策略要围绕这几点设计。常见做法是训练集用随机裁剪、随机翻转、颜色抖动验证集只做 resize 和中心裁剪。颜色抖动要谨慎因为病斑的颜色本身就是判别特征之一抖过头会把有用信号也抖没。下面是一段示意性的数据管道构建代码# 示意构建训练/验证数据加载器 from torch.utils.data import DataLoader from lib.dataloader import build_dataset, build_transform # 训练集增强裁剪 翻转 轻度颜色扰动 train_tf build_transform( sizecfg.DATA.INPUT_SIZE, # 如 224 或 384 trainTrue, color_jitter0.2, # 颜色抖动幅度病斑任务建议不超过 0.3 flip_prob0.5 ) # 验证集只做确定性预处理 val_tf build_transform(sizecfg.DATA.INPUT_SIZE, trainFalse) train_set build_dataset(cfg.DATA.TRAIN_ROOT, transformtrain_tf) val_set build_dataset(cfg.DATA.VAL_ROOT, transformval_tf) train_loader DataLoader( train_set, batch_sizecfg.DATA.BATCH_SIZE, # 显存不够就往下调 shuffleTrue, num_workerscfg.DATA.NUM_WORKERS, # Windows 下建议设 0 pin_memoryTrue ) val_loader DataLoader(val_set, batch_sizecfg.DATA.BATCH_SIZE, shuffleFalse, num_workerscfg.DATA.NUM_WORKERS) print(f训练样本 {len(train_set)}验证样本 {len(val_set)})逻辑说明训练和验证必须用不同的 transform这是最容易被忽略的点。如果验证集也做随机增强每次评估结果都在抖你根本判断不了模型到底有没有变好。build_dataset负责按目录结构读图通常约定每个类别一个子文件夹。参数说明INPUT_SIZE要和模型匹配swin 这类对尺寸有倍数要求不是随便设BATCH_SIZE受显存限制8G 显存跑 224 尺寸的 resnet 大概能到 32换 swin 可能要降到 8 甚至更低NUM_WORKERS在 Linux 下可以设 4 到 8 加速读取Windows 下多进程容易出问题设 0 最稳。3.2 训练主循环与日志解读train_val.py是主循环。训练脚本一般包含加载配置、构建模型、构建优化器和学习率调度、逐 epoch 训练、逐 epoch 验证、保存最优权重、写日志。CNLtrainlog.txt就是训练过程的记录f1.txt记录 F1 分数。# 典型启动方式具体参数以 README 为准 python train_val.py --config config/config.pyc --gpu 0 # 如果脚本用位置参数或环境变量按 README 调整 # 训练过程中观察日志 tail -f CNLtrainlog.txt逻辑说明启动前先确认配置文件路径和 GPU 编号。训练开始后日志里通常每个 epoch 会打印训练损失、验证损失、准确率f1.txt里是 F1 分数。F1 比准确率更值得看因为病虫害类别往往不均衡准确率会被大类别带偏。参数说明--config指定配置文件--gpu指定用哪块卡。如果你的机器没有 GPU把设备改成cpu也能跑只是慢很多。看日志时重点关注验证损失有没有在训练损失下降时反而上升那是过拟合的典型信号。3.3 指标评估与结果复现f1.txt是判断项目是否真的跑通的关键文件。F1 是精确率和召回率的调和平均在类别不均衡时比准确率更能反映真实水平。复现时要注意随机种子、数据划分、预训练权重三者固定结果才可复现。# 示意从日志或评估结果计算并核对 F1 from sklearn.metrics import f1_score, classification_report # y_true 为真实标签y_pred 为模型预测 f1_macro f1_score(y_true, y_pred, averagemacro) f1_weighted f1_score(y_true, y_pred, averageweighted) print(fMacro-F1: {f1_macro:.4f} Weighted-F1: {f1_weighted:.4f}) print(classification_report(y_true, y_pred, digits4))逻辑说明macro对每个类别一视同仁能暴露小类别是否被忽略weighted按类别样本数加权更接近整体表现。两个都看如果 macro 明显低于 weighted说明小类别学得差需要考虑重采样或类别权重。参数说明average取值macro或weighted前者适合评估均衡性后者适合评估整体。classification_report会逐类打印精确率、召回率、F1定位到具体哪个病虫害类别拖后腿。4. 避坑与排查那些让训练白跑的细节这一章是我踩过的坑集中营。很多问题不是模型不行而是环境和配置的细节没对齐训练跑了几小时才发现结果没法用。4.1 现象启动即报维度不匹配现象运行train_val.py后立刻抛出类似size mismatch for fc.weight的错误训练还没开始就退出。原因模型最后一层全连接输出维度是默认的 1000ImageNet 类别数而你的病虫害数据集类别数不是 1000。配置里的NUM_CLASSES没改或者改了但模型构建时没读到。解决确认配置文件里的类别数与数据集实际类别数一致。数一下训练集根目录下有多少个类别子文件夹那就是类别数。改完配置重新启动如果还报错检查factory.py构建模型时有没有把num_classes传进去。4.2 现象损失不下降准确率卡在随机水平现象训练几个 epoch 后损失几乎不动准确率在 1/类别数 附近徘徊比如 10 类就卡在 10% 左右。原因常见有三种。一是学习率设得太大梯度直接炸掉二是数据标签和文件夹对不上模型在学噪声三是输入没归一化像素值范围不对。解决先把学习率降一个数量级试。再抽查几条数据确认图片和标签对应正确。最后检查预处理有没有做归一化常见做法是减均值除标准差均值方差用数据集统计值或 ImageNet 的值。4.3 现象验证集表现远好于实际上线就崩现象验证集 F1 很高但拿新拍的田间照片一测准确率断崖式下跌。原因训练集和验证集来自同一批拍摄条件数据泄漏或者分布太接近模型学到的是拍摄特征而不是病斑特征。也可能是验证集做了和训练集一样的随机增强评估结果虚高。解决确保验证集 transform 是确定性的不含随机增强。数据划分时按拍摄批次或地块划分而不是随机打乱这样验证集才能反映真实泛化能力。4.4 现象显存溢出batch 调小后训练变慢且不稳现象CUDA out of memory把 batch size 调小后能跑但训练震荡、收敛慢。原因batch 变小后梯度噪声变大等效学习率需要相应调整。另外有些模型对 batch 大小敏感比如带 BatchNorm 的网络在小 batch 下统计量不准。解决batch 调小后学习率也按比例下调或者改用梯度累积模拟大 batch。如果模型含 BatchNorm 且 batch 太小考虑换 GroupNorm 的变体或者冻结 BN 层。4.5 现象.pyc文件无法修改想改逻辑无从下手现象想改数据加载或配置逻辑打开发现是.pyc改不了。原因项目打包时把部分源码编译成了字节码只留配置口子。解决优先通过配置项调整大部分可调参数都会暴露在config里。如果确实需要改核心逻辑找对应的.py源文件没有的话只能反编译或联系提供方。这也是评估这类项目时要提前确认的点——配置够不够用。5. 进阶技巧用迁移学习把 F1 再抬一截项目跑通只是起点真正决定毕设或课程设计成色的是你能不能把指标做上去。这一章讲一个具体技巧迁移学习加分层学习率这是在小规模病虫害数据集上性价比最高的操作。核心思路是骨干网络加载预训练权重后底层特征边缘、纹理是通用的不该被大学习率冲掉顶层和分类头需要快速适配新任务该用大学习率。做法是把参数分组骨干底层给小学习率分类头给大学习率。# 示意分层学习率 冻结策略 import torch # 1. 加载预训练权重以 resnet 为例 model factory.build(registry.get(resnet), num_classescfg.MODEL.NUM_CLASSES, pretrainedTrue) # 2. 参数分组骨干底层小学习率分类头大学习率 backbone_params [] head_params [] for name, param in model.named_parameters(): if fc in name or head in name or classifier in name: head_params.append(param) else: backbone_params.append(param) optimizer torch.optim.SGD([ {params: backbone_params, lr: cfg.TRAIN.LR * 0.1}, # 底层 0.1 倍 {params: head_params, lr: cfg.TRAIN.LR} # 分类头 1 倍 ], momentum0.9, weight_decay1e-4) # 3. 可选先冻结骨干训练几轮再解冻微调 for epoch in range(cfg.TRAIN.EPOCHS): if epoch cfg.TRAIN.FREEZE_EPOCHS: for param in backbone_params: param.requires_grad False else: for param in backbone_params: param.requires_grad True # ... 正常训练循环逻辑说明第一步加载预训练权重这是迁移学习的前提。第二步按参数名分组含fc、head、classifier的归为分类头其余归为骨干。第三步用冻结策略做两阶段训练先只训分类头让模型快速适应新类别再解冻骨干做精细微调。这套组合在小数据集上通常比直接全量微调更稳。参数说明cfg.TRAIN.LR * 0.1是骨干学习率具体倍数可以试 0.1 到 0.01FREEZE_EPOCHS是冻结轮数一般占总轮数的三分之一到一半weight_decay控制正则强度过拟合明显时适当加大。验证这套技巧有没有效果方法很直接固定随机种子和数据划分跑一次基线记录f1.txt里的 macro-F1再跑一次分层学习率版本对比同一个指标。如果 macro-F1 提升明显且小类别召回率上来了说明方向对了。我一般还会把两次的classification_report并排看确认提升不是靠某个大类撑起来的。从那以后我每次拿到一个新的分类项目都强制先跑通基线、记下 F1再动任何迁移学习的花活——没有基线对比的调参都是玄学。希望这份拆解能帮你少走几个弯路把这份农作物病虫害识别项目真正用起来。本文还有配套的精品资源点击获取

相关新闻

C++图像分割实战:大津法、连通域分析与区域合并

C++图像分割实战:大津法、连通域分析与区域合并

1. 项目概述与题目拆解1.1 这道题到底在考什么拿到"1013 Image Segmentation (35分)(C)"这个题目时,我第一反应是:这是一道典型的综合性算法题——不是单纯让你调库跑个模型,而是要求你从底层理解图像分割的…

2026/10/12 21:11:54 阅读更多 →
给大模型补上长期记忆:从上下文窗口到外部记忆层的工程实践

给大模型补上长期记忆:从上下文窗口到外部记忆层的工程实践

1. 从“对话”到“记忆”:先搞清楚AI记忆到底缺什么做AI应用开发的朋友应该都有这种体验:跟模型聊得正high,上下文窗口一滚,前面说的关键约定直接“失忆”了。更尴尬的是,你昨天让助手记住的偏好、项目背景、代码规范&…

2026/10/12 21:11:54 阅读更多 →
算法复杂度实战指南:从LeetCode刷题到性能直觉养成

算法复杂度实战指南:从LeetCode刷题到性能直觉养成

1. 这不是“背公式”的速成课,而是帮你把算法复杂度刻进肌肉记忆的实战路径你是不是也经历过这样的场景:看到LeetCode上一道题,脑子里立刻蹦出几个解法,但一到分析时间空间复杂度,就卡在“这个for循环嵌套了三层&#…

2026/10/12 21:11:54 阅读更多 →

最新新闻

C++进阶指南:从类型系统到内存模型,理解设计动机而非死记语法

C++进阶指南:从类型系统到内存模型,理解设计动机而非死记语法

/* 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 1:33:08 阅读更多 →
深度学习验证码识别:从模型训练到落地的完整路线

深度学习验证码识别:从模型训练到落地的完整路线

/* 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 1:33:08 阅读更多 →
Qt视频播放器开发:QMediaPlayer与QVideoWidget协作与避坑指南

Qt视频播放器开发:QMediaPlayer与QVideoWidget协作与避坑指南

1. 从零拆解QMediaPlayer与QVideoWidget的协作逻辑很多人第一次在Qt里做视频播放,脑子里冒出来的第一个念头是“找个控件拖上去,调个play()就完事了”。我当初也是这么想的,结果在QVideoWidget上折腾了大半天,画面死活出不来&…

2026/10/13 1:33:08 阅读更多 →
Nacos集群搭建实战:从单机到高可用架构的完整指南

Nacos集群搭建实战:从单机到高可用架构的完整指南

/* 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 1:33:08 阅读更多 →
产品EMC设计与风险评估:从后期整改到事前预防的工程实践

产品EMC设计与风险评估:从后期整改到事前预防的工程实践

/* 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 1:33:08 阅读更多 →
洛谷DP初阶题单刷题指南:从状态设计到代码实现

洛谷DP初阶题单刷题指南:从状态设计到代码实现

/* 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 1:32:08 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →