Matlab卷积神经网络手写汉字识别:从训练到GUI界面全流程实战
简介这份资源是一套基于卷积神经网络的手写字体识别完整项目面向希望入门深度学习与图像识别的学生、开发者及Matlab使用者帮助其理解CNN从特征提取到分类输出的全流程并借助GUI界面直观验证识别效果。压缩包共143个文件约25.14MB包含106个bmp与23个jpg手写样本图像、6个p文件、3个txt说明、2个fig界面文件、1个mat数据文件、1个m主程序及1个mp4演示视频覆盖数据集、模型代码与界面素材。项目采用Matlab 2018开发涉及卷积层、池化层、全连接层构建以及MNIST、CASIA等数据集的预处理、归一化与增强并讨论卷积核大小、步长、优化算法调参和过拟合抑制思路。GUI部分支持手写板输入与实时识别便于测试模型。目前已有2620人学习适合作为课程设计或毕业设计的参考案例。1. 从一张作业纸说起这个手写汉字识别项目到底能跑出什么效果期末交作业前一周A同学把一张写满汉字的草稿纸拍照发过来问能不能做个界面点一下按钮就把上面的字认出来。这个基于卷积神经网络的手写字体识别及界面项目就是冲着这个场景去的用 Matlab 搭一套完整的卷积神经网络把手写汉字图片喂进去训练再配一个 GUI 界面让不写代码的人也能直接上手测试。它适合两类人——一类是刚接触深度学习、想找一个能跑通全流程的入门项目另一类是手头有手写体识别需求想拿现成框架改一改就用的开发者。整个项目不依赖 Python 环境从数据预处理、网络搭建、训练到界面交互全部在 Matlab 里闭环完成对习惯 Matlab 工具链的人来说省掉了跨语言调试的麻烦。2. 技术选型与整体架构为什么用 Matlab 做卷积神经网络2.1 选 Matlab 而不是 Python 的现实理由很多人第一反应是手写汉字识别应该用 Python 加深度学习框架但这个项目偏偏选了 Matlab原因很实际。Matlab 自带 Deep Learning Toolbox卷积层、池化层、全连接层、softmax 层都是现成的函数不需要额外配环境。对于高校实验室或者工程现场来说Matlab 往往是已经装好的工具直接调用convolution2dLayer、maxPooling2dLayer这些接口就能搭网络省去了配 CUDA、装框架、调版本兼容的时间。另一个好处是 GUI 开发Matlab 的 App Designer 或者传统的 GUIDE 都能快速拖出界面和训练好的网络放在同一个.m文件体系里打包和分发都简单。常见做法是先把网络训练脚本和界面脚本分开写训练完把网络对象保存成.mat文件界面加载这个文件做推理。这样训练和部署解耦改网络结构不影响界面逻辑改界面也不影响训练。2.2 整体架构三层结构各管什么这个项目的架构可以拆成三层。第一层是数据层负责读取手写汉字图片、做灰度化、二值化、尺寸归一化把原始图片转成网络能吃的数值矩阵。第二层是网络层用卷积层提取笔画特征池化层降维全连接层做分类最后 softmax 输出每个类别的概率。第三层是交互层也就是 GUI 界面提供图片加载、识别按钮、结果显示区域把用户操作翻译成对网络的调用。三层之间的数据流是单向的图片进数据层变成张量进网络层网络输出类别索引进交互层显示。这种分层的好处是每一层可以单独调试——数据预处理不对看第一层的输出网络不收敛调第二层的超参数界面没反应查第三层的回调函数。2.3 目录结构文件怎么摆一个典型的项目目录会包含这些内容project/ ├── data/ # 手写汉字图片数据集 │ ├── train/ # 训练集按类别分文件夹 │ └── test/ # 测试集 ├── train_network.m # 网络定义与训练脚本 ├── preprocess_data.m # 数据预处理函数 ├── handwritten_gui.m # GUI 界面主程序 ├── trained_net.mat # 训练好的网络文件 └── README.md # 运行说明data/train/下面每个类别一个文件夹文件夹名就是类别标签Matlab 的imageDatastore能自动根据文件夹名生成标签。train_network.m里定义网络层数组、训练选项调用trainNetwork完成训练。handwritten_gui.m是界面入口里面加载trained_net.mat绑定按钮回调。这种结构清晰新手拿到手就知道先跑哪个、后跑哪个。3. 核心模块拆解数据预处理、网络定义与训练全流程3.1 数据预处理把图片变成网络能吃的矩阵手写汉字图片的来源五花八门尺寸不一、背景噪声不同直接喂给网络效果很差。预处理要做三件事灰度化、二值化、尺寸归一化。下面是一个常见的预处理函数function imgProcessed preprocess_data(imgPath) % 读取图片 img imread(imgPath); % 转灰度图消除颜色干扰 if size(img, 3) 3 img rgb2gray(img); end % 二值化把笔画和背景分开 level graythresh(img); img imbinarize(img, level); % 尺寸归一化到 28x28和网络输入层匹配 img imresize(img, [28, 28]); % 反转颜色让笔画为白、背景为黑符合常见训练习惯 img imcomplement(img); % 转成 double 类型归一化到 0-1 imgProcessed double(img) / 255; end这段代码里graythresh用 Otsu 方法自动找二值化阈值比手动设阈值稳。imresize把图片统一到 28×28这个尺寸是手写识别里常用的太小会丢笔画细节太大增加计算量。imcomplement反转黑白是因为很多公开数据集是白底黑字而网络训练时习惯黑底白字。最后归一化到 0-1避免数值过大导致梯度爆炸。参数说明level是自动计算的阈值如果某些图片二值化效果不好可以改成固定值比如 0.5。[28, 28]要和网络输入层一致改网络输入尺寸时这里也要同步改。3.2 网络定义卷积层、池化层、全连接层怎么搭网络结构直接决定识别效果。这个项目用的是一种经典的卷积神经网络结构适合手写汉字这种笔画复杂但尺寸不大的输入function layers define_network(numClasses) layers [ imageInputLayer([28 28 1], Name, input) convolution2dLayer(3, 16, Padding, same, Name, conv1) batchNormalizationLayer(Name, bn1) reluLayer(Name, relu1) maxPooling2dLayer(2, Stride, 2, Name, pool1) convolution2dLayer(3, 32, Padding, same, Name, conv2) batchNormalizationLayer(Name, bn2) reluLayer(Name, relu2) maxPooling2dLayer(2, Stride, 2, Name, pool2) convolution2dLayer(3, 64, Padding, same, Name, conv3) batchNormalizationLayer(Name, bn3) reluLayer(Name, relu3) fullyConnectedLayer(128, Name, fc1) reluLayer(Name, relu4) dropoutLayer(0.5, Name, dropout) fullyConnectedLayer(numClasses, Name, fc2) softmaxLayer(Name, softmax) classificationLayer(Name, output) ]; end逐段看imageInputLayer接收 28×28 单通道图片。第一组卷积用 16 个 3×3 卷积核Padding设为same保证输出尺寸不变后面接批归一化和 ReLU 激活再用 2×2 最大池化把尺寸减半。第二组卷积核数量翻到 32第三组到 64这是常见的“通道数递增”策略让网络逐步提取更抽象的特征。全连接层 128 个神经元做特征整合dropoutLayer(0.5)随机丢弃一半神经元防止过拟合最后输出层节点数等于类别数。参数说明numClasses是手写汉字的类别总数比如要识别 100 个字就传 100。卷积核数量 16、32、64 可以调但要注意显存和训练时间。dropoutLayer的 0.5 是丢弃概率训练集小的时候可以调高到 0.6训练集大可以降到 0.3。3.3 训练脚本怎么把网络跑起来网络定义好之后训练脚本负责加载数据、设置训练选项、启动训练% 加载训练集和验证集 imdsTrain imageDatastore(data/train, ... IncludeSubfolders, true, ... LabelSource, foldernames); [imdsTrain, imdsVal] splitEachLabel(imdsTrain, 0.8, randomized); % 定义网络 numClasses numel(categories(imdsTrain.Labels)); layers define_network(numClasses); % 设置训练选项 options trainingOptions(sgdm, ... InitialLearnRate, 0.01, ... MaxEpochs, 30, ... MiniBatchSize, 64, ... ValidationData, imdsVal, ... ValidationFrequency, 30, ... Shuffle, every-epoch, ... Plots, training-progress, ... Verbose, false); % 启动训练 net trainNetwork(imdsTrain, layers, options); % 保存训练好的网络 save(trained_net.mat, net);imageDatastore自动根据文件夹名生成标签splitEachLabel把 80% 数据划给训练、20% 给验证。trainingOptions里sgdm是随机梯度下降带动量InitialLearnRate设 0.01 是常用起点MaxEpochs30 轮对中小数据集够用。MiniBatchSize64 平衡内存和训练速度。Plots设为training-progress会弹出实时训练曲线能看到准确率和损失的变化方便判断是否收敛。参数说明如果训练集很大MaxEpochs可以降到 15-20如果准确率上不去先把学习率降到 0.001 试试。ValidationFrequency控制每多少轮验证一次设太小会拖慢训练。3.4 GUI 界面按钮回调怎么调网络界面部分用 Matlab 的 UI 组件搭建核心是一个“加载图片”按钮、一个“识别”按钮和一个结果显示区域function recognizeButtonPushed(app, event) % 加载训练好的网络 loadedData load(trained_net.mat); net loadedData.net; % 获取当前显示的图片路径 imgPath app.CurrentImagePath; if isempty(imgPath) app.ResultLabel.Text 请先加载图片; return; end % 预处理图片 imgProcessed preprocess_data(imgPath); % 调整维度以匹配网络输入 [28 28 1] imgInput reshape(imgProcessed, [28, 28, 1]); % 调用网络做预测 [predictedLabel, scores] classify(net, imgInput); % 显示结果和置信度 confidence max(scores) * 100; app.ResultLabel.Text sprintf(识别结果%s置信度 %.1f%%, ... string(predictedLabel), confidence); end这段回调函数做了四件事加载网络、检查图片是否已选、预处理图片、调用classify做预测。reshape把 28×28 的矩阵变成 28×28×1 的三维数组匹配网络输入层。classify返回预测标签和每个类别的概率取最大概率作为置信度显示。如果置信度低于某个阈值比如 60%可以在界面上提示“结果不确定”让用户重新拍图。参数说明app.CurrentImagePath是界面里保存的图片路径加载图片按钮的回调里赋值。scores是各类别概率向量长度等于类别数。置信度阈值可以根据实际需求调整手写汉字识别一般 70% 以上比较可靠。4. 避坑与常见问题训练不收敛、界面报错、识别率低怎么排查4.1 训练损失不下降准确率卡在随机水平现象训练跑了几轮损失一直在 2.3 左右对应类别数的对数准确率跟瞎猜差不多。原因最常见的是数据标签没对上。imageDatastore按文件夹名生成标签如果文件夹名有中文、空格或者特殊字符标签可能乱掉。另一个原因是学习率太大梯度直接飞了。解决先检查imdsTrain.Labels里的类别名是否正常用categories(imdsTrain.Labels)看一眼。如果标签有问题把文件夹名改成英文数字。学习率从 0.01 降到 0.001 再试同时把MiniBatchSize调小到 32观察损失是否开始下降。4.2 界面点识别按钮没反应或者报维度不匹配现象点了“识别”按钮Matlab 命令窗口报错说输入维度不对或者界面直接卡死。原因预处理后的图片尺寸和网络输入层不一致。比如网络定义的是 28×28但预处理函数里imresize写成了 32×32。另一个可能是图片是 RGB 三通道没转灰度就送进去了。解决在preprocess_data里加一行disp(size(imgProcessed))确认输出是 28×28。然后在回调里reshape之前检查size(imgProcessed)如果是三维就手动转灰度。网络输入层定义和预处理尺寸必须严格一致改一个就要改另一个。4.3 训练集准确率高但测试集低过拟合了现象训练曲线显示训练准确率 99%验证准确率只有 70% 左右差距很大。原因训练数据太少或者网络参数太多模型把训练样本背下来了。手写汉字如果每个类别只有几十张图很容易过拟合。解决先加数据增强用imageDataAugmenter做随机旋转、平移、缩放扩充训练集。然后把dropoutLayer的丢弃概率从 0.5 提到 0.6 或 0.7。如果还不行减少全连接层神经元数量从 128 降到 64。验证集准确率连续几轮不提升就可以提前停不用跑满MaxEpochs。4.4 识别结果总是偏向某几个类别现象不管输入什么图片识别结果总是那几个字其他类别几乎不出现。原因类别样本数量不均衡。比如“一”字有 500 张图“龘”字只有 20 张网络会倾向于预测样本多的类别。解决对样本少的类别做过采样或者用imageDatastore的replicate方法复制几份。另一种做法是在训练选项里设置ClassWeights给样本少的类别更高权重。Matlab 的trainingOptions不直接支持类别权重但可以在数据层做平衡把每个类别的图片数量补齐到相近水平。4.5 保存的网络文件加载后 classify 报错现象训练完保存了trained_net.mat界面里load之后调用classify报错说网络对象无效。原因保存的时候只保存了net变量但加载的时候变量名对不上或者保存的是layers而不是训练后的net。另一个可能是 Matlab 版本不一致训练和加载用的版本不同。解决保存时用save(trained_net.mat, net)加载时用loadedData load(trained_net.mat); net loadedData.net;确保变量名一致。训练和部署尽量用同一个 Matlab 版本跨版本时用save的-v7.3选项提高兼容性。5. 二次开发与改造换数据集、调网络、加功能的具体做法5.1 换数据集从手写汉字扩展到其他字符这个项目的网络结构不挑数据换成手写数字、英文字母甚至简单图形都能跑。关键是把新数据按同样的目录结构摆好data/train/下面每个类别一个文件夹文件夹名就是标签。然后改define_network里的numClasses它会自动根据categories(imdsTrain.Labels)计算。如果新数据图片尺寸不是 28×28改preprocess_data里的imresize参数同时改网络输入层的imageInputLayer([28 28 1])。注意类别数变化后全连接层和分类层会自动适配不用手动改。我一般会先拿 10 个类别跑一遍确认流程通了再扩到全部类别。这样万一有问题排查范围小。5.2 调网络加深、加宽还是换优化器如果识别率不够有三个方向可以试。第一是加深网络在conv3后面再加一组conv4pool但要注意 28×28 的输入经过三次池化已经变成 3×3再加池化就没了。所以加深之前先把输入尺寸提到 32×32 或 64×64。第二是加宽把卷积核数量从 16/32/64 提到 32/64/128代价是训练变慢。第三是换优化器把sgdm换成adamInitialLearnRate设 0.001通常收敛更快但可能过拟合。下面是一个加深网络的示例片段% 在 conv3 之后插入第四组卷积 convolution2dLayer(3, 128, Padding, same, Name, conv4) batchNormalizationLayer(Name, bn4) reluLayer(Name, relu4) % 注意如果输入是 28x28这里不能再加池化层改完网络后训练脚本不用大改trainNetwork会自动适配。但MaxEpochs可能要增加因为参数多了需要更多轮次收敛。5.3 加功能批量识别、结果导出、置信度过滤界面可以扩展的地方很多。批量识别就是加一个“选择文件夹”按钮遍历文件夹里所有图片循环调用classify把结果存到一个表格里。结果导出用writetable存成 Excel 或 CSV。置信度过滤是在显示结果前判断max(scores)是否低于阈值低于就显示“不确定”避免误导用户。批量识别的核心循环大概长这样function batchRecognize(app, event) folderPath uigetdir(选择图片文件夹); if folderPath 0 return; end fileList dir(fullfile(folderPath, *.png)); results cell(numel(fileList), 2); loadedData load(trained_net.mat); net loadedData.net; for i 1:numel(fileList) imgPath fullfile(folderPath, fileList(i).name); imgProcessed preprocess_data(imgPath); imgInput reshape(imgProcessed, [28, 28, 1]); [label, scores] classify(net, imgInput); results{i, 1} fileList(i).name; results{i, 2} string(label); end resultTable cell2table(results, VariableNames, {文件名, 识别结果}); writetable(resultTable, 识别结果.csv); app.ResultLabel.Text sprintf(批量识别完成共 %d 张, numel(fileList)); end这段代码遍历文件夹里所有 PNG 图片逐张识别把文件名和结果存到 cell 数组最后转成 table 导出 CSV。uigetdir返回 0 表示用户取消选择直接返回。批量识别时如果图片很多可以在循环里加drawnow刷新界面避免界面卡死。5.4 验证改造效果别只看准确率改完网络或数据后不能只看训练曲线上的准确率。我习惯留一个独立的测试集训练过程中完全不碰最后用classify跑一遍算混淆矩阵。Matlab 的confusionchart能直接画出来一眼看出哪些类别容易混。比如“日”和“曰”这种形近字混淆矩阵里会很明显。如果某个类别召回率特别低就针对它补数据或者调网络。还有一个血泪经验每次改完保存一个新的网络文件别覆盖旧的。命名带上日期和关键参数比如net_28x28_conv3_20250101.mat。这样效果变差了可以回退不用重新训练。从那以后我每次改网络结构或者换数据集都强制走一遍“训练→验证→混淆矩阵→保存新文件”的流程不偷懒。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

AMBA CHI协议解析:多核缓存一致性与SoC集成避坑指南

AMBA CHI协议解析:多核缓存一致性与SoC集成避坑指南

简介:《AMBA CHI架构规范》是ARM官方发布的第五代CHI(Coherent Hub Interface)协议技术文档(编号ARMIHI0050,版本G.b,2025年9月更新),面向SoC设计、芯片验证和系统架构工程师。CHI协…

2026/10/18 13:07:47 阅读更多 →
安卓蓝牙控制智能小车:电机驱动、避障循迹与通信协议全闭环实现

安卓蓝牙控制智能小车:电机驱动、避障循迹与通信协议全闭环实现

简介:本资源是一份面向电子设计、嵌入式开发与物联网实践初学者的完整毕业设计资料,聚焦安卓手机蓝牙遥控智能小车的软硬件协同实现。资料以AT89C52单片机为核心控制器,集成HC-06蓝牙模块与L298N电机驱动电路,配套Eclipse平台开发…

2026/10/18 13:07:47 阅读更多 →
CCXT库与交易所API对接:Python自动化交易系统落地指南

CCXT库与交易所API对接:Python自动化交易系统落地指南

简介:面向想用 Python 搭建自动交易系统的开发者,这份 PDF 文档以 CCXT 库和交易所 API 对接为主线,系统讲解自动化交易的整体实现路径。内容从 Python 在金融领域的优势、自动化交易基本概念入手,逐步深入到 CCXT 安装配置、交易…

2026/10/18 13:07:47 阅读更多 →

最新新闻

从 APK/PCK 恢复完整 Godot 项目:gdsdecomp 上手与实战指南

从 APK/PCK 恢复完整 Godot 项目:gdsdecomp 上手与实战指南

从 APK/PCK 恢复完整 Godot 项目:gdsdecomp 上手与实战指南 【免费下载链接】gdsdecomp Godot reverse engineering tools 项目地址: https://gitcode.com/GitHub_Trending/gd/gdsdecomp gdsdecomp(Godot RE Tools)是一个面向 Godot 引…

2026/10/18 16:15:27 阅读更多 →
Convert to it PriorityQueue 拆解

Convert to it PriorityQueue 拆解

Convert to it PriorityQueue 拆解 【免费下载链接】convert Truly universal online file converter 项目地址: https://gitcode.com/GitHub_Trending/convert7/convert Convert to it 敢承诺"任何格式转任何格式",底气来自在格式图上做路径搜索。…

2026/10/18 16:15:27 阅读更多 →
Teamcenter管理员运维地图:备份、日志、权限与升级实战

Teamcenter管理员运维地图:备份、日志、权限与升级实战

简介:这份西门子Teamcenter管理员操作手册,面向TC系统管理员及PLM项目实施人员,系统梳理Teamcenter 11/12/13环境下的配置、管理与维护方法。手册从管理员职责切入,重点展开服务器端操作:业务建模器的模板项目创建与部…

2026/10/18 16:15:27 阅读更多 →
Pandas DataFrame排序与排名:sort_values和rank的实战区别与用法

Pandas DataFrame排序与排名:sort_values和rank的实战区别与用法

在数据分析里,排序和排名几乎是每天都要碰的操作,但很多人用着用着就混了。DataFrame的sort_values和rank,看名字都带“排”,实际干的活完全不同:一个是把整张表重新摆顺序,另一个是给每个数据打分定名次。…

2026/10/18 16:15:27 阅读更多 →
MCP异步处理破解AI读取千万级Excel超时难题

MCP异步处理破解AI读取千万级Excel超时难题

遇到一个千万级的 Excel,直接丢给 AI 分析,大概率是等到天荒地老之后,换来一句冷冰冰的“读取超时”。这个坑我踩过不止一次。后来我把方案换成了基于 MCP 的异步处理,把“一次性读完整张表”改成“提交任务、轮询进度、分批拿结果…

2026/10/18 16:15:27 阅读更多 →
医疗知识图谱问答系统开发实战:数据清洗、Neo4j入库与Flask部署

医疗知识图谱问答系统开发实战:数据清洗、Neo4j入库与Flask部署

简介:一套基于Python的医疗知识图谱知识问答系统课程设计资源包,适合知识图谱与问答方向的初学者,帮助理解医疗实体关系建模、规则式对话流程及问句查询解析。压缩包共58个文件,约20MB,核心内容涵盖设计报告、源代码、…

2026/10/18 16:14:26 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →