尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

HOG+核SVM交通标志识别:MATLAB仿真与实现详解

HOG+核SVM交通标志识别:MATLAB仿真与实现详解 简介本资源是一套基于HOG特征与核SVM的交通标志分类完整MATLAB实现方案面向机器学习初学者、智能交通系统开发者及自动驾驶算法实践者解决真实场景下交通标志识别与可视化标注问题。压缩包含704个文件701张PNG格式交通标志样本图像、2个核心训练脚本trainClassifier.m与trainStopSignClassifier.m、1个FPGA协同部署说明txt总大小8.4MB图像数据覆盖多类标志脚本封装了HOG特征提取、高斯核SVM训练、参数调优及分类结果叠加标注全流程支持MATLAB 2021a及以上版本直接运行。已有319人学习下载资源提供开箱即用的端到端代码框架、典型标志样本集、可复用的特征工程模块及硬件部署线索便于读者快速掌握传统CV机器学习在交通识别任务中的落地路径并为后续迁移至嵌入式平台如FPGA提供基础支撑。 交通标志识别这几年其实已经不算新鲜事了但如果你在学校课题、毕业设计或者竞赛里被安排到“用传统方法实现一个交通标志分类系统”那 HOG SVM 这套组合依然是绕不开的经典路线。虽然现在大家都喜欢一上来就上深度学习但 HOG 特征手工设计思路、SVM 分类器的结构化风险最小化思想是理解计算机视觉底层逻辑的必修课。这篇文章我用 MATLAB 2021a 完整走了一遍“HOG 特征提取 核 SVM 分类 交通标志图片标注结果”的仿真流程里面凡是涉及原理、参数、坑点的地方都会展开讲清楚代码可以直接抄希望你少踩几个我踩过的坑。1. 整体方案设计与思路拆解1.1 为什么交通标志识别选 HOG SVM 而不是直接上 CNN先说结论如果你的目标是把识别准确率刷到 99% 以上深度学习确实更容易达到但如果你需要快速搭建一套能够解释、可复现、文档齐全的仿真系统HOG SVM 的稳定性和可调试性远好于黑盒神经网络。HOGHistogram of Oriented Gradients方向梯度直方图的核心思想是把图像的局部梯度方向分布统计成直方图用这些分布来描述物体的轮廓和纹理形状。交通标志有一个非常适合 HOG 的特点边缘结构相对规整。无论是圆形禁令标志、三角形警告标志还是矩形指示标志它们的边框线条、内部图案都有明显的梯度方向规律。HOG 恰好能把这些方向规律编码成特征向量不受光照变化和轻微平移的影响。而核 SVM 的作用是在高维特征空间里找一个最优分类超平面。HOG 特征维度通常上千维特征分布并不线性可分直接用线性 SVM 效果一般。核函数的作用就是把原始特征映射到更高维空间让原本非线性可分的数据在映射后变得可分。这里用的是高斯径向基核RBF下面会详细讲。1.2 系统整体流程分解整个仿真流程我拆成了五个环节每个环节对应一个可独立测试的模块图像预处理读取图片、灰度化、尺寸归一化。这一步决定了 HOG 特征的稳定性和 SVM 输入维度的一致性。HOG 特征提取用 MATLAB 内置的extractHOGFeatures提取特征向量同时返回可视化结果用于人工核验。核 SVM 模型训练准备正负样本数据集构造标签用fitcsvm训练带 RBF 核的 SVM 分类器。分类预测对待检测的交通标志图片提取 HOG送入训练好的模型得到类别标签和置信分数。结果标注在原始图片上绘制检测框、类别文本和置信度直观展示算法效果。设计这套流程时有一个核心取舍把特征提取和分类器训练彻底解耦。这样即使你后面想换分类器比如换成随机森林或决策树或者换特征比如换成 LBP只需要替换对应模块即可不需要改动整体框架。2. HOG 特征提取原理解读与 MATLAB 实现2.1 HOG 特征到底在算什么初学 HOG 最容易困惑的问题是这个“梯度直方图”到底怎么来的我当年看论文看了一整天一头雾水后来自己动手算了一遍才真正明白。这里用最简单的方式给你拆开。第一步计算每个像素的梯度方向和幅值。对灰度图的每个像素点用水平算子 [-1, 0, 1] 和垂直算子 [-1, 0, 1]^T 分别计算水平梯度 Gx 和垂直梯度 Gy。然后得到该点的梯度幅值G sqrt(Gx^2 Gy^2)梯度方向theta atan2(Gy, Gx)转换为角度制范围 0~180 度不考虑方向正负第二步把图像划分成小的 cell。比如 8x8 像素为一个 cell把这些像素的梯度方向分配到 9 个 bin 中每个 bin 覆盖 20 度幅值作为加权值累加得到这个 cell 的 9 维特征向量。第三步把相邻的 cell 组合成 block 做归一化。比如 2x2 个 cell 组成一个 blockblock 内 4 个 cell 的直方图串联成 36 维向量然后做 L2 归一化。这一步是关键它能有效抑制光照变化和对比度变化对特征的影响。第四步滑动 block 遍历整幅图像把所有归一化后的特征串联起来形成最终的 HOG 特征向量。这样一串特征向量本质上是把“这幅图中哪些位置出现哪些方向的边缘”这个信息编码成了数值序列。对于交通标志这类边缘结构明显的物体这种编码非常有辨识度。2.2 MATLAB 中 extractHOGFeatures 的参数选择MATLAB 的 Computer Vision Toolbox 提供了现成的extractHOGFeatures函数但参数设置会直接影响特征维度和识别效果。我的常用配置如下% 基础参数配置 img imread(stop_sign.jpg); if size(img, 3) 3 img rgb2gray(img); end cellSize [8 8]; % 每个 cell 的像素大小常用 8 或 16 blockSize [2 2]; % 每个 block 包含的 cell 数 numBins 9; % 方向直方图的 bin 数量 [hogFeature, visImg] extractHOGFeatures(img, ... CellSize, cellSize, ... BlockSize, blockSize, ... NumBins, numBins, ... BlockOverlap, [1 1]); % block 滑动重叠量 fprintf(HOG特征维度: %d\n, numel(hogFeature));几个参数的选择逻辑分享一下CellSize 选 8x8 是绝大部分场景的默认选择。它兼顾了细节保留和特征维度。如果你用 16x16特征维度会下降但小尺寸交通标志的局部细节可能丢失用 4x4 则维度膨胀严重训练速度会非常慢。NumBins 选 9是经典论文的推荐值覆盖 0~180 度每个 bin 20 度。对交通标志的形状区分度足够。BlockOverlap决定 block 滑动的步长。默认重叠一半能减少 block 边界效应。这个函数返回的visImg是 HOG 可视化图像可以直接用imshow显示方便检查特征是否合理。我第一次跑出来看到交通标志的 HOG 可视化图边缘轮廓非常清楚基本就是一个标志外形的“线条骨架”。2.3 特征可视化与维度计算一个容易被忽视的细节是HOG 特征维度一定要在写代码前先算清楚否则后面训练 SVM 时频繁报维度不匹配错误你都不知道是哪里出了问题。维度计算公式假设输入图像尺寸为 M x N单元格尺寸为 c x c则水平和垂直方向的 cell 数量分别为 Mc floor(M/c) 和 Nc floor(N/c)。block 大小为 b x b 个 cell重叠量为 o则水平和垂直方向的 block 数量分别为Bh (Mc - b) / (b - o) 1 Bv (Nc - b) / (b - o) 1最终特征维度 Bh x Bv x b^2 x numBins。举个例子64x64 的图像cellSize [8 8]那么 Mc 8Nc 8。blockSize [2 2]BlockOverlap [1 1]则 Bh (8-2)/(2-1)1 7Bv 7。特征维度 7 x 7 x 4 x 9 1764 维。这个 1764 维是我在项目里最常用的特征长度。你可以用这段代码验证img imread(stop_sign.jpg); img imresize(img, [64 64]); if size(img, 3) 3 img rgb2gray(img); end [hogFeature, ~] extractHOGFeatures(img, CellSize, [8 8]); numel(hogFeature) % 输出 1764特别注意所有训练样本和测试样本的输入尺寸必须统一。我在项目里统一imresize到 [64 64]才能保证特征维度一致。如果你用不同尺寸的图片去提取特征SVM 会直接报错或出现不可预测的分类结果。3. 核 SVM 分类器设计与训练3.1 线性 SVM vs 核 SVM为什么必须用核很多初学者会问SVM 本身不就是线性分类器吗为什么还要用核函数这里有个关键概念需要澄清SVM 的决策边界是在特征空间中找最大间隔超平面这个“空间”可以不是原始特征空间。当数据在原始特征空间中线性不可分时我们通过核函数把它们映射到更高维的空间在映射后的空间中找超平面。核函数的巧妙之处在于你不用真的知道映射函数长什么样只需要计算两个样本在映射空间中的内积这就是“核技巧”。拿交通标志分类来说HOG 特征 1764 维不同类别之间的边界非常复杂线性 SVM 很难分好。RBF 核高斯核的表达式是K(x, x) exp(-gamma * ||x - x||^2)它能把原始特征映射到无穷维空间表达能力远强于线性核。代价是计算量更大、更容易过拟合需要通过交叉验证调参。在实际项目中我建议先用线性 SVM 跑一遍基线再用 RBF 核对比效果。如果线性核准确率已经 95% 以上优先用线性核因为模型更简单、泛化能力通常更好、训练预测更快。核 SVM 不是万能的它是你面对复杂边界时的一张王牌。3.2 训练数据准备与标签构造训练数据是交通标志分类项目的“地基”。我当时用的公开数据集是多类别交通标志图片按类别分文件夹存放。基础的准备流程如下% 数据集文件夹结构示例 % dataset/ % ├── stop/ % 停止标志 % ├── yield/ % 让行标志 % ├── pedestrian/ % 行人横道标志 % └── ... % 批量读取图像并提取特征 folderPath dataset/; categories {stop, yield, pedestrian}; allFeatures []; allLabels []; for i 1:length(categories) files dir(fullfile(folderPath, categories{i}, *.jpg)); for j 1:length(files) img imread(fullfile(folderPath, categories{i}, files(j).name)); if size(img, 3) 3 img rgb2gray(img); end img imresize(img, [64 64]); feat extractHOGFeatures(img, CellSize, [8 8]); allFeatures [allFeatures; feat]; % 累积特征矩阵 allLabels [allLabels; i]; % 类别标签用 1、2、3 end end这段代码有两个需要优化的点我在实际项目中踩过坑问题一用[allFeatures; feat]循环拼接效率极低。数据量几百张时无所谓但上千张时会非常慢。改进方法先用zeros预分配矩阵或者把特征存到 cell 数组中最后一次性cell2mat。问题二标签不能只给 1、2、3 这种整数。你要在训练前明确类别映射关系否则到测试时你得到输出标签 2根本不知道它对应哪类标志。建议用 categorical 类型allLabels categorical(allLabels, 1:3, categories);这样predict返回的标签直接就是 stop 或 yield 这样的可读字符串后面标注图片时直接拿来用非常方便。3.3 fitcsvm 参数详解与调参心得MATLAB 中训练核 SVM 用的是fitcsvm函数。我在项目中的核心训练代码如下% 训练集和测试集划分例如 80% 训练20% 测试 rng(42); % 固定随机种子保证实验可复现 cv cvpartition(length(allLabels), HoldOut, 0.2); idxTrain training(cv); idxTest test(cv); trainFeatures allFeatures(idxTrain, :); trainLabels allLabels(idxTrain); testFeatures allFeatures(idxTest, :); testLabels allLabels(idxTest); % 训练 RBF 核 SVM svmModel fitcsvm(trainFeatures, trainLabels, ... KernelFunction, rbf, ... KernelScale, auto, ... % 自动确定 gamma 值 BoxConstraint, 1, ... % 正则化参数 C Standardize, true); % 特征标准化每个关键参数我都说一下自己的理解KernelScale对应 RBF 核里的 gamma 参数KernelScale 越大gamma 越小决策边界越平滑KernelScale 越小gamma 越大边界越复杂、越容易过拟合。auto让 MATLAB 自动选择一个初始值但官方推荐用OptimizeHyperparameters自动调参。我实际跑下来auto的效果通常不错但如果追求极限准确率建议用交叉验证手动调 KernelScale 和 BoxConstraint。BoxConstraint是正则化参数它控制对误分类样本的惩罚力度。惩罚越大C 越大训练时越努力把每个样本都分对但可能过拟合惩罚越小模型越倾向于找简单边界可能会欠拟合。默认值 1 在大多数场景下是合理起点不要一上来就调大。Standardize强烈建议设为true。HOG 特征的各个维度数值范围差异很大有些维度接近于 0有些可能上百。如果不做标准化SVM 的间隔计算会被数值范围大的维度主导RBF 核的距离度量也会失衡。标准化就是让每个维度均值为 0、方差为 1这一步对核 SVM 尤其重要。训练完成后可以用crossval做 K 折交叉验证评估模型稳定性cvSVMModel crossval(svmModel, KFold, 5); loss kfoldLoss(cvSVMModel); fprintf(5折交叉验证损失: %.4f\n, loss); fprintf(交叉验证准确率: %.2f%%\n, (1 - loss) * 100);我第一次做交叉验证时准确率只有 84%后来发现是训练集里样本类别不均衡某些类别的图片数量是其他类别的 5 倍。处理类别不均衡最简单的方法是收集更多少数类样本如果数据不好收集可以考虑调整fitcsvm的Prior参数或者用fitcecoc的代价矩阵权重。3.4 多分类策略fitcecoc 才是你真正需要的这里必须说一个很多教程没有强调的点fitcsvm本身只支持二分类。但交通标志分类明显是多分类问题那怎么办MATLAB 的解决方案是使用fitcecocError-Correcting Output Codes纠错输出编码。它的核心思路是把多分类问题拆解成多个二分类子问题训练多个 SVM然后通过投票或纠错解码得到最终的类别预测。% 使用 fitcecoc 训练多分类 SVM multiSvmModel fitcecoc(trainFeatures, trainLabels, ... Learners, templateSVM(KernelFunction, rbf, ... KernelScale, auto, ... BoxConstraint, 1, ... Standardize, true), ... Coding, onevsone); % 一对一策略Coding参数有两种常用选项onevsone一对一每两个类别训练一个分类器。如果有 K 个类别则需要训练 K*(K-1)/2 个二分类器。适合类别数不多比如少于 10 类的情况每个分类器只需要少数样本训练速度快。onevsall一对多每个类别训练一个分类器区分“属于该类”和“不属于该类”。分类器数量少但每个分类器的训练数据量大且类别不均衡问题更严重。我在交通标志项目里类别数在 5 个以内实测onevsone效果好于onevsall。网上也有研究指出 OvO 对类别不均衡更鲁棒实际体验确实如此。4. 仿真测试与分类标签标注实现4.1 测试流程设计模型训练完成后测试环节我一般分成两步走先在测试集上计算整体准确率和混淆矩阵再单独挑几张图片做可视化标注。两步都能过才算项目完整。测试集评估代码如下% 使用训练好的模型预测测试集 [predictedLabels, scores] predict(multiSvmModel, testFeatures); % 计算准确率 accuracy sum(predictedLabels testLabels) / numel(testLabels); fprintf(测试集准确率: %.2f%%\n, accuracy * 100); % 混淆矩阵 confMat confusionmat(testLabels, predictedLabels); figure; confusionchart(confMat, categories);confusionchart能画出一个直观的混淆矩阵图中间对角线越亮说明分类越准。我那次跑完发现“让行标志”和“停车标志”之间有几张图片互相误判原因是这两个标志的外形轮廓相似度较高HOG 特征在低分辨率下区分度不够。解决方案是把图像分辨率提高到 96x96误判情况明显减少。4.2 在图片上绘制分类标签的三种常用方法项目名称里明确要求“在交通标志图片上贴上分类标志”这个功能 MATLAB 的工具箱函数可以实现而且代码非常简洁。根据你要标注的内容不同我总结了三套方案方案一insertObjectAnnotation——适用于检测框标签% 假设你已经通过某种方式得到了交通标志在图片中的位置 bbox bbox [x, y, width, height]; % 例如 [120, 80, 64, 64] label char(predictedLabel); % 预测得到的类别名 confidence max(scores); % 最大置信度分数 imgOut insertObjectAnnotation(img, rectangle, bbox, ... sprintf(%s (%.1f%%), label, confidence * 100), ... Color, green, FontSize, 18, TextBoxOpacity, 0.8); figure; imshow(imgOut); title(交通标志分类结果标注);方案二insertText——只需要在图片上写文字时用% 不画框直接在图片左上角写类别名 imgOut insertText(img, [10 10], sprintf(Detected: %s, label), ... FontSize, 18, TextColor, red, BoxColor, white, ... BoxOpacity, 0.8);方案三insertMarker——只需要标记中心点% 在标志中心画一个十字标记 center [x width/2, y height/2]; imgOut insertMarker(img, center, x, Size, 12, Color, red);实际项目里最常用的是方案一因为它把检测框、类别名和置信度都整合在了一张图上答辩和报告里展示效果最好。4.3 一张图的完整识别标注流程整合起来完整识别单张图片的代码流程如下function imgOut classifyTrafficSign(imgPath, multiSvmModel) % 读取并预处理 img imread(imgPath); if size(img, 3) 3 imgGray rgb2gray(img); else imgGray img; end imgResized imresize(imgGray, [64 64]); % 提取 HOG 特征 hogFeat extractHOGFeatures(imgResized, CellSize, [8 8]); % SVM 预测 [predLabel, score] predict(multiSvmModel, hogFeat); % 在原图上标注这里假设整张图就是标志区域 bbox [0, 0, size(img, 2), size(img, 1)]; imgOut insertObjectAnnotation(img, rectangle, bbox, ... sprintf(%s (%.1f%%), char(predLabel), max(score) * 100), ... Color, green, FontSize, 18, TextBoxOpacity, 0.8); end注意这里我把整张测试图片看作一个已经裁剪好的交通标志区域。如果你要做的是“在大图中检测多个标志并分别标注”就需要先做目标检测比如用滑动窗口多尺度搜索把每个候选区域提出来再逐一送入分类器。这个逻辑看着简单但滑动窗口的步长、尺度参数都会大幅影响检测速度和准确率属于另一个话题这里先不展开。4.4 批量化测试与结果汇总单张图片的函数写好之后批量化测试就非常容易了。我用dir遍历测试文件夹把每一张图的标注结果保存到输出目录testFiles dir(fullfile(test_images, *.jpg)); outputDir test_results; if ~exist(outputDir, dir) mkdir(outputDir); end for i 1:length(testFiles) imgPath fullfile(testFiles(i).folder, testFiles(i).name); imgOut classifyTrafficSign(imgPath, multiSvmModel); [~, fname, ~] fileparts(testFiles(i).name); imwrite(imgOut, fullfile(outputDir, [fname _labeled.jpg])); end批量标注完之后你可以打开输出文件夹快速浏览每一张图的标注是否正确。这种“肉眼检查”环节非常有必要因为准确率指标只能告诉你整体水平不能告诉你哪些场景下会出错。我每次看这些标注图都能发现一些有趣的问题比如某些背景纹理复杂的图会被误判成某个交通标志。这些发现往往比准确率数字更有价值。5. 常见问题与排查技巧实录5.1 MATLAB 2021a 启动报错 BLAS 加载错误 / refblas.dll这个坑比较常见运行fitcsvm或某些需要调用 BLAS 线性代数库的操作时MATLAB 直接报错提示类似“BLAS loading error”或与refblas.dll相关的问题。遇到这个错误第一步不用慌大部分情况跟 MATLAB 安装目录权限或 Intel MKL 库冲突有关跟你的算法代码没有关系。我的排查步骤是检查 MATLAB 安装路径是否包含中文或特殊字符如果有卸载重装到纯英文路径。运行version -blas查看当前使用的 BLAS 库信息确认是否是自带库。如果提示与refblas.dll相关检查系统 PATH 环境变量是否有其他软件自带的 BLAS 库干扰把冲突路径移除。在 MATLAB 中执行mex -setup重新配置编译器有时候编译器配置混乱会引发这类问题。对于项目本身我建议在代码开头加一段测试确保 BLAS 环境正常再继续跑% 快速测试 BLAS 是否正常 try A rand(100); B A * A; disp(BLAS 正常); catch ME disp([BLAS 异常: ME.message]); end5.2 HOG 特征维度爆炸怎么办特征维度太高在训练 SVM 时不仅慢还容易引发内存问题。特别是当你把图片 resize 到 128x128 时HOG 特征维度会飙升到 7452 维训练速度明显下降。解决维度爆炸有三条路降低输入图像分辨率64x64 对应 1764 维对交通标志来说基本够用。增大 CellSize从 8x8 改为 16x16维度会降为原来的四分之一。加 PCA 降维用pca函数对 HOG 特征矩阵降维保留 95% 方差通常可以把维度降到几百。我实测过对交通标志分类任务1764 维特征在 300 张训练样本上训练 RBF 核 SVM 只需要几秒钟完全没有降维的必要。如果数据量到几千张、几万张再考虑 PCA。5.3 SVM 预测结果全是同一类这是一个非常典型的“看着哪都对但结果就是不对”的问题。我用排除法整理了一个排查列表可能原因排查方法解决方案特征向量未标准化用Standardize或手动 zscore训练和预测时都做标准化标签构造错误查看unique(trainLabels)确保标签是正确的 categorical 类型训练样本类别严重不均衡打印各类别样本数收集更多少数类样本或调整权重测试图片预处理与训练不一致检查灰度化、resize统一预处理流程KernelScale 参数不合适交叉验证查看各 fold 准确率用OptimizeHyperparameters自动调参其中“测试和训练预处理不一致”是最隐蔽的坑。比如训练图片统一做了rgb2gray测试时忘了做或者训练时imresize到 64x64测试时用了不同尺寸——这些都会导致特征分布完全不对预测结果一团糟。5.4 运行速度太慢怎么优化速度优化的优先级我按实际收益排序第一优先减少输入图像尺寸。从 128x128 降到 64x64速度能快 4 倍以上准确率下降通常不到 1 个百分点。第二优先减少训练样本数量。如果数据量大可以随机抽样一部分训练先看效果再决定是否全量训练。全量训练数据量大时SVM 的二次规划求解非常耗时。第三优先考虑用线性核替代 RBF 核。线性核没有复杂的核函数计算训练和预测速度都快很多。第四优先用predict之前把特征矩阵提前算好缓存。避免测试时重复提取特征。我自己的项目经验是对交通标志分类这种小规模任务64x64 图 HOG(1764 维) RBF 核 SVM300 张训练样本训练不到 5 秒单张图片分类加标注整个过程不到 0.1 秒完全够用。5.5 一张图速查表我的完整调参建议初学者最怕的就是“参数到底怎么设”。我根据多次实验经验整理了一个推荐起点参数推荐值说明输入图像尺寸64x64平衡速度与精度CellSize[8 8]常用默认NumBins9经典配置BlockSize[2 2]经典配置KernelFunctionrbf非线性场景默认选择KernelScaleauto先用自动再微调BoxConstraint1默认起点Standardizetrue核 SVM 必开Codingonevsone类别数较少时推荐6. 进一步扩展思路与个人体会6.1 从“整图分类”到“目标检测分类”目前的方案假设图片里只有单个交通标志这是简化的仿真场景。真实场景里一张道路照片中可能同时出现多个标志而且标志只占画面的一小块区域。要做到完整识别需要先通过滑动窗口或选择性搜索生成候选区域再对每个候选区域做 HOG SVM 分类。这就是传统目标检测的思路。滑动窗口的窗口大小、步长、尺度金字塔层数都需要针对你的应用场景测试调优。6.2 从 HOG SVM 到深度学习的演进做这个项目时我同时也在对比深度学习方法。深度学习的优势在于特征自动学习不需要手工设计 HOG 参数但劣势在于需要大量标注数据、GPU 资源且可解释性差。如果你的课题属于“理解传统视觉方法并做对比实验”HOG SVM 完全可以作为基线再与 YOLO、Faster R-CNN 等做对比分析。这种“传统 深度”双轨对比的研究思路在不少论文里都是加分项。6.3 我自己反复踩过的三个坑再说一遍最后再分享几点实际经验也是一段时间反复踩过的坑第一预处理流程的一致性比参数好坏更重要。训练时怎么处理图片测试时必须一模一样处理。很多人调参半天没效果最后发现是训练和测试的预处理不一致。第二分类器准确率不等于项目完成度。这个项目要求“在图片上贴上分类标志”如果你只训练了一个准确率 98% 的模型但没有实现可视化标注项目是不完整的。先把全流程跑通再回头优化准确率。第三不要迷信某一个参数的高分。我试过把 KernelScale 微调到某个值测试集准确率从 94% 提升到 96%但交叉验证结果却变差了这就是过拟合信号。参数调优一定要用交叉验证结果做最终判断不能只看测试集。这套流程如果完整跑下来你得到的不仅是一个能运行的 MATLAB 脚本更是一套可拆解、可扩展、可解释的计算机视觉分类框架。后面不管换数据集还是换分类目标都能在半小时内迁移过去。这也是我喜欢 HOG SVM 这类传统方案的原因——结构清楚每一条逻辑都明明白白。本文还有配套的精品资源点击获取
返回列表