基于卷积神经网络的花朵识别课程设计:Python源码、GUI演示与快速部署指南
简介这是一套面向高校计算机、智能科学与技术等专业学生的花朵识别卷积神经网络课程设计资源以Python实现包含完整源码、项目文档、GUI演示页面与快速部署指南适合课程实践、毕业设计参考及教学演示。压缩包共88个文件约107.39MB涵盖5个py脚本、2个pb模型文件、1个npy数据文件以及jpg样本图、css/js前端资源、md文档、yml与Dockerfile部署配置等模块划分清晰。系统采用经典机器学习框架覆盖数据预处理、特征提取与分类识别全流程并配有inceptionV3迁移学习模型与Flask服务端可识别牵牛花、月季、万寿菊、石竹、三色堇等类别。已有43人学习下载。使用者可据此理解项目架构、复现训练与推理流程并基于现有算法模块进行功能扩展与参数优化快速完成环境搭建与二次开发。1. 花朵识别课程设计为什么总在“跑通”和“跑不动”之间反复横跳做花朵识别卷积神经网络课程设计的人十有八九经历过同一个场景在本地用几十张图跑通了训练脚本准确率看着还行一换数据集或者一上GUI演示就翻车。问题往往不在模型本身而在数据管线的组织方式、输入尺寸的统一策略、以及推理阶段和训练阶段的预处理不一致。这个标题指向的是一套完整的课程设计交付物Python实现的卷积神经网络花朵识别配套源码、文档、GUI演示和快速部署指南。它适合正在做课程设计的学生、需要快速搭一个可演示原型的开发者以及想把图像分类流程走通一遍的工程师。核心价值不在于模型多先进而在于把“数据进、模型出、界面能看、别人能跑”这条链路完整闭合。花朵识别本身是一个经典的细粒度分类问题类别间差异小、类内差异大正好用来暴露工程细节上的坑。2. 花朵识别数据集怎么选、怎么切、怎么喂给卷积网络2.1 常见花朵数据集的类别分布与选型理由课程设计里最常被拿来用的花朵数据集通常包含几种到十几种常见花卉每类几十到几百张不等。选数据集时不要只看总图片数要看最小类的样本量。如果最小类只有三十张而最大类有三百张直接训练会让模型严重偏向多数类。我一般会先做一次类别计数把少于五十张的类要么合并要么用数据增强补到和其他类接近的量级。另一个选型点是图片背景如果所有图片都是纯色背景模型学到的可能是背景颜色而不是花瓣纹理换一个背景就废了。所以选数据集时优先选背景多样、拍摄角度有变化的版本哪怕类别少一点。2.2 用Python做数据划分与增强的最小代码import os import shutil import random from pathlib import Path # 原始数据目录结构data/raw/类别名/图片文件 RAW_DIR Path(data/raw) TRAIN_DIR Path(data/train) VAL_DIR Path(data/val) VAL_RATIO 0.2 SEED 42 random.seed(SEED) for class_dir in RAW_DIR.iterdir(): if not class_dir.is_dir(): continue images list(class_dir.glob(*.jpg)) list(class_dir.glob(*.png)) random.shuffle(images) split_idx int(len(images) * (1 - VAL_RATIO)) train_imgs images[:split_idx] val_imgs images[split_idx:] (TRAIN_DIR / class_dir.name).mkdir(parentsTrue, exist_okTrue) (VAL_DIR / class_dir.name).mkdir(parentsTrue, exist_okTrue) for img in train_imgs: shutil.copy(img, TRAIN_DIR / class_dir.name / img.name) for img in val_imgs: shutil.copy(img, VAL_DIR / class_dir.name / img.name) print(划分完成训练集与验证集已生成)这段代码做的是按类别分层划分保证每个类在训练集和验证集里的比例一致。VAL_RATIO控制验证集占比课程设计里一般取0.2数据量特别少时可以降到0.1。SEED固定随机种子保证每次划分结果可复现这一点在写文档时很重要否则别人跑出来的结果和你不一样。注意这里用的是复制而不是移动原始数据保留一份后面调参时不用重新解压。2.3 训练时的输入尺寸与归一化参数怎么定卷积网络对输入尺寸没有硬性要求但同一批数据必须统一。常见做法是缩放到224×224或256×256。如果图片本身分辨率很低比如大量图片短边不到200像素强行放大到224只会引入插值模糊这时候用128×128反而更稳。归一化参数不要凭感觉写要么用ImageNet的均值和标准差要么在自己的训练集上统计一遍。课程设计里我一般直接用ImageNet的mean[0.485, 0.456, 0.406]和std[0.229, 0.224, 0.225]因为大多数预训练模型就是在这个分布上训练的迁移学习时保持一致能少踩一个坑。from torchvision import transforms train_transform transforms.Compose([ transforms.Resize((224, 224)), transforms.RandomHorizontalFlip(p0.5), transforms.RandomRotation(15), transforms.ColorJitter(brightness0.2, contrast0.2), transforms.ToTensor(), transforms.Normalize(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]) ])训练变换里加了随机水平翻转、随机旋转和颜色抖动验证变换里只做缩放和归一化。这个不对称是故意的验证集要模拟真实推理时的确定性输入不能带随机增强。RandomRotation(15)里的15度是经验值花朵图片旋转超过30度容易把花蕊转到画面外反而变成噪声。3. 卷积网络模型怎么搭、怎么训、怎么判断有没有过拟合3.1 从零搭一个小型卷积网络还是用预训练模型课程设计的评分点通常包括“网络结构设计”所以完全用预训练模型不加修改会被认为工作量不足。我的建议是主干用预训练模型但把分类头改成自己的结构并在文档里写清楚为什么这么改。比如用ResNet18做特征提取把最后的全连接层换成“Dropout Linear(512, 类别数)”再在训练时先冻结主干几轮再解冻微调。这样既有迁移学习的稳定性又能体现对网络结构的理解。如果非要从零搭卷积层数控制在4到6层每层后面跟BatchNorm和ReLU池化用最大池化最后全局平均池化接全连接。层数再多小数据集上直接过拟合。3.2 训练循环里的三个关键参数学习率、批大小、冻结轮数import torch import torch.nn as nn from torch.utils.data import DataLoader from torchvision import datasets, models BATCH_SIZE 32 LR_HEAD 1e-3 LR_FINETUNE 1e-4 FREEZE_EPOCHS 5 TOTAL_EPOCHS 30 train_dataset datasets.ImageFolder(data/train, transformtrain_transform) val_dataset datasets.ImageFolder(data/val, transformval_transform) train_loader DataLoader(train_dataset, batch_sizeBATCH_SIZE, shuffleTrue, num_workers2) val_loader DataLoader(val_dataset, batch_sizeBATCH_SIZE, shuffleFalse, num_workers2) model models.resnet18(weightsmodels.ResNet18_Weights.DEFAULT) num_features model.fc.in_features model.fc nn.Sequential( nn.Dropout(0.3), nn.Linear(num_features, len(train_dataset.classes)) ) criterion nn.CrossEntropyLoss() # 第一阶段只训练分类头 for param in model.parameters(): param.requires_grad False for param in model.fc.parameters(): param.requires_grad True optimizer torch.optim.Adam(model.fc.parameters(), lrLR_HEAD) for epoch in range(FREEZE_EPOCHS): model.train() for imgs, labels in train_loader: optimizer.zero_grad() outputs model(imgs) loss criterion(outputs, labels) loss.backward() optimizer.step() print(f冻结阶段 Epoch {epoch1}/{FREEZE_EPOCHS} 完成) # 第二阶段解冻全部参数用更小的学习率微调 for param in model.parameters(): param.requires_grad True optimizer torch.optim.Adam(model.parameters(), lrLR_FINETUNE) for epoch in range(FREEZE_EPOCHS, TOTAL_EPOCHS): model.train() running_loss 0.0 for imgs, labels in train_loader: optimizer.zero_grad() outputs model(imgs) loss criterion(outputs, labels) loss.backward() optimizer.step() running_loss loss.item() print(f微调阶段 Epoch {epoch1}/{TOTAL_EPOCHS} 损失 {running_loss/len(train_loader):.4f})批大小32在显存够用的情况下优先选显存不够就降到16或8但学习率要相应调小。冻结阶段的学习率用1e-3因为只训练分类头梯度不会传到主干大一点没关系。解冻后学习率降到1e-4避免把预训练权重冲垮。FREEZE_EPOCHS设5轮是经验值如果数据集和预训练数据分布差异大可以加到10轮。训练过程中要同时看训练损失和验证准确率如果训练损失持续下降但验证准确率在第15轮之后不再提升甚至下降就是过拟合的信号这时候要么加Dropout要么加权重衰减要么早停。3.3 验证阶段怎么算准确率才不会被“假高”骗到验证准确率不能只看最后一轮。我一般会在每个epoch结束后跑一遍验证集记录准确率最后取验证准确率最高的那一轮保存模型而不是取最后一轮。另外如果验证集里某个类的样本特别少整体准确率会被多数类主导这时候要额外看混淆矩阵。课程设计文档里放一张混淆矩阵比只写一个准确率数字有说服力得多。from sklearn.metrics import confusion_matrix, classification_report import numpy as np model.eval() all_preds [] all_labels [] with torch.no_grad(): for imgs, labels in val_loader: outputs model(imgs) _, preds torch.max(outputs, 1) all_preds.extend(preds.cpu().numpy()) all_labels.extend(labels.numpy()) print(classification_report(all_labels, all_preds, target_namesval_dataset.classes)) print(confusion_matrix(all_labels, all_preds))classification_report会给出每个类的精确率、召回率和F1分数比整体准确率更能暴露问题。如果某个类的召回率明显低于其他类要么是这个类样本太少要么是这个类和另一个类在视觉上太像需要针对性补充数据或调整增强策略。4. GUI演示和快速部署从脚本到能给别人跑的界面4.1 用Tkinter搭一个最小可用的花朵识别界面课程设计里GUI演示是加分项但不需要做得花哨。Tkinter是Python自带的不用额外装依赖最适合快速交付。界面只需要三个元素一个按钮选图片一个区域显示图片一个标签显示预测结果和置信度。import tkinter as tk from tkinter import filedialog from PIL import Image, ImageTk import torch from torchvision import transforms class FlowerApp: def __init__(self, model, class_names): self.model model self.class_names class_names self.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]) ]) self.root tk.Tk() self.root.title(花朵识别演示) self.root.geometry(400x500) self.btn tk.Button(self.root, text选择图片, commandself.load_image) self.btn.pack(pady10) self.img_label tk.Label(self.root) self.img_label.pack() self.result_label tk.Label(self.root, text等待输入, font(Arial, 14)) self.result_label.pack(pady20) def load_image(self): path filedialog.askopenfilename( filetypes[(图片文件, *.jpg *.png *.jpeg)]) if not path: return img Image.open(path).convert(RGB) img_display img.resize((300, 300)) self.tk_img ImageTk.PhotoImage(img_display) self.img_label.config(imageself.tk_img) input_tensor self.transform(img).unsqueeze(0) self.model.eval() with torch.no_grad(): output self.model(input_tensor) prob torch.softmax(output, dim1) conf, pred torch.max(prob, 1) result f{self.class_names[pred.item()]} {conf.item()*100:.1f}% self.result_label.config(textresult) def run(self): self.root.mainloop()unsqueeze(0)是把单张图片从[C, H, W]变成[1, C, H, W]因为模型期望的输入带批次维度。torch.softmax把输出转成概率torch.max同时拿到最大概率和对应类别索引。注意推理前要调model.eval()否则BatchNorm和Dropout会按训练模式运行结果不稳定。4.2 快速部署时模型保存与加载的格式选择课程设计交付时模型文件要能被别人加载。PyTorch有两种保存方式保存整个模型和只保存状态字典。保存整个模型依赖当时的类定义别人换个目录就可能加载失败。我一般只保存state_dict加载时先实例化同样的网络结构再load_state_dict。这样文件小也不依赖序列化时的类路径。# 保存 torch.save(model.state_dict(), flower_model.pth) # 加载 model models.resnet18(weightsNone) model.fc nn.Sequential( nn.Dropout(0.3), nn.Linear(model.fc.in_features, len(class_names)) ) model.load_state_dict(torch.load(flower_model.pth, map_locationcpu)) model.eval()map_locationcpu是为了在没有GPU的机器上也能加载。如果对方有GPU去掉这个参数或者改成map_locationcuda也行但课程设计交付时优先保证CPU能跑。4.3 依赖清单和启动脚本怎么写才不翻车依赖清单不要用pip freeze直接导出那会把系统里无关的包全带上。手动写一个requirements.txt只列真正用到的torch、torchvision、Pillow、scikit-learn、numpy。版本号可以写范围比如torch2.0不要锁死到某个小版本否则别人环境里装不上。启动脚本写一个run.py里面先检查模型文件是否存在不存在就提示先训练存在就直接启动GUI。# run.py import os import sys if not os.path.exists(flower_model.pth): print(未找到模型文件请先运行 train.py 完成训练) sys.exit(1) from gui import FlowerApp from model_loader import load_model, class_names model load_model(flower_model.pth, len(class_names)) app FlowerApp(model, class_names) app.run()这个脚本把“模型不存在”这个最常见的报错提前拦截了别人拿到代码后不会一上来就报一堆看不懂的错。5. 避坑与排查花朵识别课程设计里最容易翻车的五个地方5.1 训练准确率很高但GUI里预测全是同一类现象训练脚本打印的验证准确率有80%以上但打开GUI选任何图片都输出同一个类别。原因通常是GUI里的预处理和训练时的验证预处理不一致比如训练时用了归一化GUI里忘了加或者输入尺寸没对齐。解决方法是把验证变换单独写成一个函数训练和GUI都调用同一个函数不要各写各的。5.2 换一台机器加载模型报“Missing key(s) in state_dict”现象在自己电脑上保存的模型别人加载时报键不匹配。原因一般是保存时用了torch.save(model)而不是state_dict或者加载时网络结构定义和保存时不一致比如分类头的Dropout位置变了。解决方法是统一用state_dict保存并且把网络结构定义单独放在一个model_loader.py里训练和加载都从这里导入。5.3 验证集准确率波动超过10个百分点现象同一个模型每次跑验证集准确率忽高忽低。原因通常是验证集太小或者验证时没有固定model.eval()和torch.no_grad()。另外如果验证集的DataLoader设了shuffleTrue虽然不影响准确率计算但会让混淆矩阵的顺序对不上。解决方法是验证集至少占20%验证时关掉shuffle并且确保model.eval()在循环前调用。5.4 训练损失降到很低但验证损失开始上升现象训练损失持续下降验证损失在第10轮之后反弹。这是典型的过拟合。原因可能是模型参数量远大于数据量或者数据增强太弱。解决方法是增加Dropout比例、加权重衰减、减少微调轮数或者把数据增强里的随机旋转和颜色抖动幅度加大。如果这些都不管用就换更小的模型比如把ResNet18换成ResNet10或者自己搭一个更浅的网络。5.5 GUI打包成exe后闪退现象用PyInstaller打包后双击exe一闪而过。原因通常是模型文件没有被打包进去或者Tkinter的图片处理依赖缺失。解决方法是把模型文件和代码放在同一目录打包时用--add-data把模型文件加进去并且在代码里用sys._MEIPASS处理打包后的路径。如果不想折腾打包直接交付Python脚本加依赖清单让对方用命令行启动反而更稳。6. 把课程设计从“能跑”推到“能讲清楚”的一个技巧最后一章说一个我反复用到的技巧在训练脚本里加一个“单张图片推理自检”步骤。具体做法是训练结束后从验证集里随机抽5张图片打印它们的真实标签、预测标签和置信度。这一步花不了几秒钟但能让你在写文档和答辩时直接拿出具体例子而不是只说“准确率多少”。更重要的是如果这5张里有明显预测错的你能立刻发现是数据问题还是模型问题。import random def sanity_check(model, dataset, class_names, num_samples5): model.eval() indices random.sample(range(len(dataset)), num_samples) for idx in indices: img, true_label dataset[idx] with torch.no_grad(): output model(img.unsqueeze(0)) prob torch.softmax(output, dim1) conf, pred torch.max(prob, 1) print(f真实: {class_names[true_label]} | f预测: {class_names[pred.item()]} | f置信度: {conf.item()*100:.1f}%) sanity_check(model, val_dataset, val_dataset.classes)这个自检函数我一般会放在训练脚本的最后每次训练完自动跑一遍。如果发现某张图置信度只有30%多但预测对了说明模型在这个类上还不够稳如果置信度90%但预测错了那大概率是标签有问题。课程设计里能讲出这种细节比堆一堆准确率数字更有说服力。我自己的习惯是任何图像分类项目不管多小训练完必须跑一次单张推理自检不然心里没底。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

手写汉字识别准确率提升实战:从90%到98%的调优全攻略

手写汉字识别准确率提升实战:从90%到98%的调优全攻略

简介:一套基于Python的手写汉字识别系统项目包,面向计算机视觉初学者、OCR方向开发者及课程设计、毕业设计场景,解决手写汉字识别准确率提升与工程化落地难题。项目含模型构建、数据加载、训练、单字/多字识别、结果可视化等完整流程&#xf…

2026/10/12 9:23:44 阅读更多 →
养殖场肉鸡YOLO目标检测实战:从数据集训练到小目标推理全指南

养殖场肉鸡YOLO目标检测实战:从数据集训练到小目标推理全指南

简介:一套面向养殖场肉鸡识别场景的YOLO目标检测数据集,适合目标检测初学者、农业智能化算法工程师及养殖项目开发者直接使用。数据集中包含大量标注好的鸡只位置,采用Pascal VOC格式的xml与jpg图片一一对应,可供yolov5、yolov7、…

2026/10/11 7:38:14 阅读更多 →
垃圾分类数据集与代码:从迁移学习到ONNX部署实战

垃圾分类数据集与代码:从迁移学习到ONNX部署实战

简介:面向深度学习初学者和垃圾分类项目开发者,资料包内含硬纸板、纸、塑料瓶、玻璃瓶、铜制品与不可回收垃圾共6类图片数据集,并配齐从数据预处理、模型训练到图片分类预测的Python代码。压缩包共7个文件,以5个py脚本为主干&…

2026/10/12 7:42:13 阅读更多 →

最新新闻

整车八自由度Simulink动力学模型搭建:从方程到仿真验证

整车八自由度Simulink动力学模型搭建:从方程到仿真验证

做整车动力学仿真的人,几乎都会经历从二自由度自行车模型起步,再逐步往多自由度模型走的过程。二自由度模型能把横摆和侧向运动的基本逻辑讲清楚,但一涉及到载荷转移、侧倾对轮荷分布的影响、四个车轮独立的转速动力学,它就完全不…

2026/10/14 13:48:57 阅读更多 →
IMX6ULL嵌入式Linux文件系统目录操作指南

IMX6ULL嵌入式Linux文件系统目录操作指南

1. 项目概述作为一名嵌入式Linux开发者,我最近开始深入研究IMX6ULL这款性价比极高的ARM Cortex-A7开发板。在嵌入式Linux开发中,文件系统目录结构的理解和常用目录操作命令的掌握是基础中的基础。这篇文章将分享我在IMX6ULL开发板上学习Linux文件目录结构…

2026/10/14 13:48:57 阅读更多 →
快慢指针原理与实战:链表中间节点、环检测与入口定位

快慢指针原理与实战:链表中间节点、环检测与入口定位

1. 为什么快慢指针是链表问题的“万能钥匙”?——从三个经典问题看算法设计的本质快慢指针不是什么高深莫测的黑科技,它本质上是一种空间换时间的朴素思想在链表结构上的极致应用。我带过不少刚学数据结构的学生,他们第一次看到“用两个指针一…

2026/10/14 13:48:57 阅读更多 →
Workbench齿轮动力学仿真与工程优化实践

Workbench齿轮动力学仿真与工程优化实践

1. 项目概述:齿轮仿真的工程价值齿轮传动作为机械工业的"细胞",其动态特性直接影响着整个传动系统的可靠性、噪声水平和寿命。传统设计方法依赖经验公式和静态计算,难以捕捉高速运转下的真实行为。Workbench平台提供的齿轮动力学仿…

2026/10/14 13:48:57 阅读更多 →
C# OPC客户端调试:DA与UA双协议连接、读取、订阅全链路诊断

C# OPC客户端调试:DA与UA双协议连接、读取、订阅全链路诊断

简介:本资源是一个面向工业自动化与.NET开发者的C# OPC客户端实战项目,聚焦于使用OPC Net Api Chs库实现与OPC服务器的连接、数据读写、事件订阅及异常处理等核心通信功能,适用于具备基础C#和WinForm开发能力的中高级工程师学习工业协议集成。…

2026/10/14 13:48:57 阅读更多 →
ponytail:一个轻量原生JS前端插件,轻松搞定H5底部导航与运营浮层

ponytail:一个轻量原生JS前端插件,轻松搞定H5底部导航与运营浮层

ponytail 这个名字,好多人第一次听到都以为是来聊发型的。其实它是我很早就为了处理移动端 H5 底部导航和运营浮层写的一个微型前端插件,核心干的事情就一件:在页面任意指定位置追加一块内容,同时把动画、状态记忆、批量挂载这些看…

2026/10/14 13:47:56 阅读更多 →

日新闻

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/14 7:53:34 阅读更多 →