Matlab表情识别源码详解:LBP+LPQ特征融合与SVM分类实现
简介面向Matlab平台的表情识别完整源码包适合计算机视觉、机器学习方向的学生与开发者参考。项目以Jaffe人脸库为测试数据融合LBP局部二值模式与LPQ局部相位量化特征提取、PCA降维及SVM分类实现了从图像预处理到情绪分类的完整流程。压缩包仅2.66MB共235个文件其中213张tiff图片为实验用正面人脸样本18个m文件涵盖特征提取、核函数、多分类等核心代码另附3个txt说明文档与1个asv自动保存备份。目前已有1200人学习下载整体代码结构清晰便于按模块逐段理解。通过实际运行调试可深入掌握局部纹理描述符在高维特征下的降维策略与分类器参数设计为表情识别相关课程设计或科研工作提供可直接复用的实验基础。1. 表情识别在 Matlab 里的落地姿势从 LBPLPQ 特征到 SVM 分类的完整源码拆解表情识别这个方向论文里看着高大上真落到工程上却常常卡在「特征怎么提、分类器怎么调、代码跑不通」这三道坎上。这套基于 Matlab 的表情识别源码走的是经典的 LBPLPQ 双特征融合、PCA 降维、SVM 分类的路线——不依赖深度学习框架不需要 GPU一台普通电脑就能跑通整个训练和测试流程。它解决的正是从业者最关心的那个问题在样本量不大、算力有限的环境里如何用传统方法做出可用的人脸表情分类模型。如果你正在做毕设、接横向项目或者想把表情识别快速嵌入到现有 Matlab 处理流程里这套源码值得花半小时拆一遍。2. 特征提取选型为什么是 LBPLPQ 而不是单一的 LBP 或 HOG2.1 LBP 特征的纹理刻画逻辑与参数语义LBP局部二值模式的核心思想并不复杂对图像中每个像素取其邻域内若干个采样点的灰度值与中心像素比较大小大于记为 1小于记为 0然后按固定顺序排列得到一个二进制数这个数的十进制值就是该像素的 LBP 码。代码层面Matlab 里用一句话就能算出一个像素邻域的二进制编码但真正影响识别率的其实是采样半径和采样点数这两个参数。% 计算图像的 LBP 特征图radius 为采样半径nPoints 为采样点数 function lbpImage computeLBP(img, radius, nPoints) % 将图像转为灰度并确保 double 类型 img im2double(img); % 使用圆形邻域采样边界的像素用插值处理 lbpImage zeros(size(img)); offsets zeros(nPoints, 2); for k 1:nPoints angle 2 * pi * (k - 1) / nPoints; offsets(k, 1) radius * cos(angle); offsets(k, 2) radius * sin(angle); end % 对每个采样点做偏移并比较灰度值 for k 1:nPoints % 通过 imtranslate 做亚像素平移再用插值恢复 shifted imtranslate(img, offsets(k, :), FillValues, 0); bitValue shifted img; lbpImage lbpImage (bitValue * 2^(k - 1)); end end这段代码把 LBP 计算拆成了「偏移采样」和「阈值编码」两步。参数 radius 决定纹理的尺度radius 越大捕捉到的纹理越粗糙nPoints 决定编码的精细程度通常取 8 或 16。需要说明的是这里为了演示采用 imtranslate 近似实现圆形采样实际工程中更规范的做法是直接用插值函数逐点采样但核心的编码逻辑是一致的。如果你发现识别率上不去优先检查这两组参数是否与图像分辨率匹配——比如 64×64 的人脸图像radius 取 1 或 2 就够了取大了反而丢失细节。2.2 LPQ 特征在模糊人脸场景下的互补价值LPQ局部相位量化是从频域角度提取纹理特征的方法它对图像模糊的鲁棒性明显优于 LBP。原理是在像素邻域内计算短时傅里叶变换STFT量化频域系数的相位信息并编码成直方图特征。说白了LBP 看的是「灰度变化的空间分布」LPQ 看的是「频域相位在局部区域的稳定性」——两者恰好互补。% 计算图像的 LPQ 特征描述子 function lpqFeatures computeLPQ(img, winSize) % 设置 STFT 窗口大小winSize 通常取 3、5、7 % 使用高斯窗口做加窗处理减少频谱泄漏 win fspecial(gaussian, [winSize winSize], winSize / 6); % 对图像做短时傅里叶变换取频域系数 % 计算每个像素邻域在四个频点上的相位 % 将相位量化后转换为十进制编码生成 LPQ 特征图 % 最后对特征图做分块直方图统计得到整幅图像的特征向量 endLPQ 的关键参数是 winSize它控制 STFT 分析窗的大小。窗太小频域分辨率不足窗太大局部性丢失。我在实践中一般先用 winSize 5 跑一轮 baseline再根据结果微调。与 LBP 分块统计不同LPQ 的特征维度由窗口大小和分块策略共同决定后续可以搭配 PCA 一并压缩。2.3 特征融合的两种常见方案特征融合通常有特征级融合和决策级融合两条路线。特征级融合的思路是把 LBP 和 LPQ 提取出的特征向量直接拼接形成联合特征输入分类器决策级融合则是各自训练 SVM 后对预测得分做投票或加权平均。这套源码采用的是特征级融合原因在于实现简单且便于配合 PCA 做统一的降维处理。拼接前需要注意特征缩放——LBP 直方图的值域和 LPQ 直方图的值域可能差一个数量级直接拼在一起会让数值大的特征在距离计算中占据主导所以融合前先对每组特征做 L2 归一化是必须的动作。3. PCA 降维与 SVM 分类器的配合逻辑3.1 为什么要先降维再进 SVMLBP 和 LPQ 特征拼接后的维度很容易冲到几千甚至上万维而表情识别数据集通常只有几百到几千张样本。高维度小样本的场景直接喂给 SVM 会带来两个问题一是计算复杂度高训练时间不可接受二是特征维度超过样本数量时SVM 的核函数计算容易出现过拟合泛化能力反而下降。PCA 在这里的作用不是简单地压缩数据而是把原始特征投影到方差最大的几个正交方向上用少数几个主成分保留原始特征的大部分判别信息。以这套源码为例具体用法是先对训练集的特征矩阵做主成分分析求得投影矩阵然后用这个投影矩阵同时变换训练集和测试集保证两者处于同一特征空间。% PCA 降维保留 95% 的方差贡献率 function [projData, projMatrix, meanVec] pcaProject(trainFeat, threshold) % trainFeat: 样本数 x 特征维度的矩阵 % 1. 对每个特征维度计算均值做中心化 meanVec mean(trainFeat, 1); centered trainFeat - repmat(meanVec, size(trainFeat, 1), 1); % 2. 计算协方差矩阵的特征向量与特征值 covMat centered * centered / (size(trainFeat, 1) - 1); [V, D] eig(covMat); % 3. 特征值降序排列选取累计贡献率超过阈值的成分 [sortedD, idx] sort(diag(D), descend); V V(:, idx); cumRatio cumsum(sortedD) / sum(sortedD); k find(cumRatio threshold, 1, first); % 4. 得到投影矩阵并完成变换 projMatrix V(:, 1:k); projData centered * projMatrix; end这里有两个细节值得留意第一协方差矩阵用的是 centered * centered 而非直接调用 pca 函数是因为某些版本的 Matlab 内置 pca 对内存的消耗更大手写实现便于控制中间变量第二threshold 取 0.95 并非固定规则而是经验默认值如果你发现降维后 SVM 的准确率波动剧烈可以把这个阈值调低到 0.9 观察变化。PCA 的计算结果需要保存 projMatrix 和 meanVec测试阶段用完全相同的投影参数做变换否则训练和测试的特征空间不一致识别结果就是错的。3.2 SVM 的核函数选择与参数网格搜索SVM 在这套源码里承担最终分类任务核函数的选型决定了分类边界的形式。线性核适合特征维度高且样本线性可分的情况RBF 核能处理非线性边界是表情识别这类任务中最常用的选择。RBF 核有两个核心参数C惩罚系数和 gamma核宽度。C 控制对误分类样本的惩罚力度。C 越大模型越倾向于将训练样本全部正确分类容易过拟合C 越小模型容忍度越高但可能欠拟合。gamma 决定了单个样本的影响范围——gamma 越大决策边界越复杂同样容易过拟合。网格搜索是一种不依赖人工经验的参数调优方式把 C 和 gamma 各取一组候选值排列组合用交叉验证评估每组参数的泛化表现。% SVM 参数网格搜索 CList [0.1, 1, 10, 100]; gammaList [0.001, 0.01, 0.1, 1]; bestAcc 0; bestC CList(1); bestGamma gammaList(1); for i 1:length(CList) for j 1:length(gammaList) cmd [-s 0 -t 2 -c , num2str(CList(i)), -g , num2str(gammaList(j)), -v 5]; acc svmtrain(trainLabels, trainData, cmd); if acc bestAcc bestAcc acc; bestC CList(i); bestGamma gammaList(j); end end end这里用的是 libsvm 的命令行参数风格-v 5 表示做 5 折交叉验证输出的是平均准确率。网格搜索的代价是训练时间会呈倍数增长4×4 的网格就是 16 次交叉验证在样本量达到数千时可能耗时数分钟。实际工程中我会先用大步长的粗略网格快速锁定一个较优区间再在小范围内精调。这套源码中附带的参数搜索脚本已经把常见候选值列好了直接跑通就能得到一组可用的 C 和 gamma入门阶段不用从零开始调。4. 从训练到预测完整流程与核心函数拆解4.1 训练阶段的标准流程训练流程的编排顺序决定了整个项目能不能闭环不能跳步也不能倒序。第一步是读入人脸图像并统一尺寸第二步是分别提取 LBP 和 LPQ 特征第三步是特征融合与归一化第四步是 PCA 降维第五步是把降维后的特征送进 SVM 做交叉验证训练。% 主训练脚本流程 clear; clc; % Step 1: 读取训练图像列表图像存储在 train/ 目录下按表情类别分文件夹 imgFiles dir(train/**/*.jpg); trainFeat []; trainLabels []; % Step 2: 遍历图像提取特征并拼接 for i 1:length(imgFiles) img imread(fullfile(imgFiles(i).folder, imgFiles(i).name)); img imresize(img, [64, 64]); lbpFeat extractLBPHist(img, 1, 8); lpqFeat extractLPQHist(img, 5); % 特征拼接与归一化 featVec [lbpFeat, lpqFeat]; featVec featVec / (norm(featVec) eps); trainFeat [trainFeat; featVec]; % 标签从文件夹名解析 trainLabels [trainLabels; getLabelFromPath(imgFiles(i).folder)]; end % Step 3: PCA 降维 [trainData, projMatrix, meanVec] pcaProject(trainFeat, 0.95); % Step 4: SVM 训练 model svmtrain(trainLabels, trainData, -s 0 -t 2 -c 10 -g 0.05);这段流程里需要关注的细节是特征向量按行拼接的方式。trainFeat 每新增一个样本就多一行样本量大时这种 append 操作效率不高——更高效的做法是预分配矩阵空间但对于教学和中小规模数据集这样写的可读性更好。imresize 到 64×64 是经验值太小丢失细节太大计算量不划算。getLabelFromPath 函数按文件夹名映射标签能确保标签与特征顺序严格对齐跳过这一步是训练结果错乱的常见原因。4.2 测试阶段的对称处理测试阶段最容易出的问题是开发者忘记对测试特征做训练阶段完全相同的变换。测试特征必须先减去训练集的 meanVec再乘以 projMatrix——这两个参数是训练阶段的产物必须保存下来并在测试脚本中重新加载。% 测试脚本流程 load(pcaParams.mat); % 包含 projMatrix 和 meanVec load(svmModel.mat); % 训练好的 SVM 模型 testFeat []; for i 1:length(testFiles) img imread(fullfile(testFiles(i).folder, testFiles(i).name)); img imresize(img, [64, 64]); featVec extractFeatures(img); testFeat [testFeat; featVec]; end % 使用训练集的 meanVec 做中心化再投影 testData (testFeat - repmat(meanVec, size(testFeat, 1), 1)) * projMatrix; % 预测并输出准确率 [predLabel, acc, prob] svmpredict(testLabels, testData, model);提示这里必须用训练集的 meanVec而不是用测试数据重新计算的均值。测试阶段的任何统计量只要不是来自训练集特征分布就会偏移导致识别率严重下降。4.3 源码的目录结构与各文件职责拆解这套源码时先看目录结构能省不少时间。通常一个工程合理的组织方式是main_train.m 和 main_test.m 作为入口脚本feature_extract/ 目录存放 LBP 和 LPQ 的特征提取函数pca/ 目录存放降维相关代码svm/ 目录存放训练与预测封装函数utils/ 目录存放图像预处理和文件读取工具。搞清楚每个文件被谁调用、参数从哪里传入改起代码来才不至于像在黑匣子里瞎摸。5. 表情识别源码的避坑指南五条高频踩坑记录5.1 特征尺寸不一致导致矩阵拼接报错现象运行训练脚本时程序在特征拼接这行报错提示矩阵维度不匹配。原因部分训练图像不是严格的 64×64 尺寸imresize 之后的图像尺寸虽然是统一的但 LBP 特征直方图的分块数设置不一致例如一个分块数为 4×4另一个为 6×6特征向量长度自然对不上。解决在提取特征前强制断言图像尺寸并统一分块参数。每次提取前打印特征向量长度前后对比就能定位出是哪一类特征出了问题。5.2 PCA 投影矩阵没有保存测试阶段重新计算现象训练准确率很高但测试准确率只有百分之二三十。原因测试脚本里重新调用了 pca 函数对测试数据做降维而不是加载训练阶段保存的 projMatrix。重新计算的 PCA 不一定错但它找到的主成分方向与训练阶段不一致等于把两个不同坐标系下的数据送进了同一个分类器。解决训练结束后立即用 save 命令保存 projMatrix 和 meanVec并在测试脚本中用 load 加载。这个坑是传统机器学习项目里最容易踩的没有之一。5.3 训练集和测试集数据泄露导致虚高准确率现象交叉验证准确率高得离谱超过 95%但在独立测试集上跌到 70% 左右。原因特征标准化或 PCA 是在全部数据上计算的而不是仅在训练集上计算再应用到测试集。这属于典型的数据泄露——降维方向已经偷偷看到了测试集的信息。解决严格按流程走PCA 只由训练集拟合meanVec 和 projMatrix 在训练阶段固定测试阶段不做任何重新计算。5.4 SVM 的 C 和 gamma 取默认值导致欠拟合现象换了数据集后识别率始终在 60%~70% 徘徊怎么调都上不去。原因libsvm 的默认参数是通用场景下的兜底值并不适合表情识别任务。C 太小导致模型欠拟合gamma 过大或过小都会让决策边界脱靶。解决先做一次完整的网格搜索。不要凭感觉填参数把 C 和 gamma 各安排 4~5 个候选值跑交叉验证一轮下来通常能把准确率拉高 5~10 个百分点。5.5 灰度归一化忽略人脸光照差异干扰特征提取现象在实验室数据上表现良好但换到光照不均匀的实拍数据后准确率明显下降。原因LBP 本身对单调光照变化有一定鲁棒性但 LPQ 对高频成分敏感极端光照下特征分布会偏移。解决在提取特征前对图像做直方图均衡化或者归一化到零均值单位方差。这个预处理步骤很多人会跳过但恰恰是跨数据集泛化时性价比最高的一个操作。6. 用一个混淆矩阵脚本验证你的模型真的可用训练完模型并测出准确率只是第一步真正判断模型能不能落地要看它在每个表情类别上的表现是否均衡。准确率 80% 的模型可能是「高兴」类识别得特别好而「厌恶」类基本全错——这种偏科模型在真实场景中是不可用的。我习惯在测试结束后顺手输出一张混淆矩阵热力图一眼就能看出模型在哪里犯迷糊。% 测试完成后输出混淆矩阵和分类准确率 function plotConfusionMatrix(predLabel, testLabels, classNames) % 计算混淆矩阵 [C, order] confusionmat(testLabels, predLabel); % 将矩阵归一化为百分比方便对比 C C ./ repmat(sum(C, 2), 1, size(C, 2)) * 100; % 可视化 figure; imagesc(C); colormap(parula); colorbar; xlabel(Predicted); ylabel(True); set(gca, XTick, 1:length(order), XTickLabel, classNames); set(gca, YTick, 1:length(order), YTickLabel, classNames); % 在格子中填入数值 for i 1:size(C, 1) for j 1:size(C, 2) text(j, i, sprintf(%.1f%%, C(i, j)), HorizontalAlignment, center); end end title(sprintf(Confusion Matrix - Average Accuracy: %.2f%%, mean(diag(C)))); end拿到混淆矩阵之后我的检查顺序是先看对角线上的数值是否普遍接近 90 分以上再看哪些类别的行容易被分错到邻近的列上——「惊讶」被分到「恐惧」这类近似表情之间互相混淆通常不是代码问题而是特征本身的区分度不足最后回看特征融合参数尝试调整 LBP 的 radius 或 LPQ 的 winSize让混淆最严重的那个类别得到改善而不是盲目追求整体数字的微小提升。体验表情识别从特征到分类的完整链路把这套代码跑通并且改出一版适合自己的参数组合才是拆这份源码最大的收获。希望这份拆解能帮你绕开我当年走过的弯路。本文还有配套的精品资源点击获取

相关新闻

计算机网络期末样卷解析:从协议行为推演到可运行模拟器

计算机网络期末样卷解析:从协议行为推演到可运行模拟器

简介:这份北师大计算机网络期末考试样卷面向高校计算机及相关专业学生,用于期末复习、自测与考点梳理,尤其适合正在备考计算机网络课程、需要系统检验知识掌握程度的读者。资源包内含1个docx文档,压缩包约769KB,内容为…

2026/10/16 17:02:59 阅读更多 →
SSH还是vsock?一文看懂Celesto宿主机与虚拟机通信通道的设计原理

SSH还是vsock?一文看懂Celesto宿主机与虚拟机通信通道的设计原理

【免费下载链接】celesto Secure and persistent computer for AI agents 项目地址: https://gitcode.com/gh_mirrors/smo/celesto 点击查看 免费下载 Celesto 是一个为 AI Agent 提供安全、持久计算机(sandbox)的开源项目。当你在宿主机上调…

2026/10/16 17:02:59 阅读更多 →
Excel VBA报表自动化:单元格处理、数据复制、格式设置与折线图实战

Excel VBA报表自动化:单元格处理、数据复制、格式设置与折线图实战

1. 从一堆零散操作说起:这套VBA组合拳到底解决什么问题日常做报表的人大概率都经历过这种场景:业务部门丢过来一个原始数据表,格式乱七八糟,列宽忽大忽小,数字和文本混在一起,日期格式五花八门。你需要把它…

2026/10/16 17:02:59 阅读更多 →

最新新闻

AI时代IT人如何修炼内核:从问题定义到判断表达的四层能力模型

AI时代IT人如何修炼内核:从问题定义到判断表达的四层能力模型

最近几个月,我身边的IT朋友聊得最多的不是某个框架的版本更新,而是同一个问题:AI时代,我们这些靠技术吃饭的人,到底还有什么价值?有个做后端的同事甚至说,他每天打开编辑器之前都要先做五分钟心…

2026/10/16 18:05:46 阅读更多 →
系统级封装SiP解读:从命名规则到选型实战一文讲透

系统级封装SiP解读:从命名规则到选型实战一文讲透

刚入行那会儿看BOM表,封装一栏简直像在猜谜。QFN、BGA、LGA、WLCSP、Fan-out、SiP、MCM……其中系统级封装(System in Package,SiP)是这几年出镜率最高、也最容易让人犯迷糊的一个词。它既不是一颗严格意义上的单体芯片&#xff0…

2026/10/16 18:05:46 阅读更多 →
NAS系统认证绕过到远程命令执行:漏洞链路分析与加固实践

NAS系统认证绕过到远程命令执行:漏洞链路分析与加固实践

朋友扔过来一个漏洞标题:“某系统 远程代码执行链:认证绕过”。说实话,这类标题这几年并不算新鲜,但我把整条链路完整复现完之后,还是有点意外——从认证态失控到系统层命令执行,中间几乎没有遇到像样的防御…

2026/10/16 18:05:46 阅读更多 →
Linux环境下Bytebase安装部署实战:数据库变更管理工具落地指南

Linux环境下Bytebase安装部署实战:数据库变更管理工具落地指南

接手一个新团队,我习惯先看数据库,不看代码。这不是职业病,是被事故教育过的。之前在某个项目里,测试环境的库和线上库的字段总是对不上,每次发版全靠 DBA 手动比对 SQL,结果有一次因为一条 ALTER TABLE 漏…

2026/10/16 18:05:46 阅读更多 →
Python 3.2.2 实用边界与安全替代方案

Python 3.2.2 实用边界与安全替代方案

简介:本资源提供Python 3.2.2官方Windows安装包及配套说明文档,面向编程初学者、教学实践者及需兼容旧项目环境的开发者,解决特定历史版本Python的获取与本地部署问题。压缩包为ZIP格式,共2个文件:16.72MB的python-3.2…

2026/10/16 18:05:46 阅读更多 →
碰碰好评卡系统开发实战 核心逻辑实现与上线运维完整指南

碰碰好评卡系统开发实战 核心逻辑实现与上线运维完整指南

碰碰好评卡系统开发实战 核心逻辑实现与上线运维完整指南 碰碰好评卡是当前电商、本地生活、到店服务场景下广泛应用的用户反馈激励工具,相比于传统的线下好评激励方式,具备可追踪、合规性强、数据可量化的优势,能够帮助商家高效收集真实用户…

2026/10/16 18:04:45 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →