从.mat文件提取HOG特征并应用fitcecoc SVM一对一分类器的报错排查与标签设置咨询
问题分析与修复方案
咱们先拆解你遇到的核心问题:一是标签获取的逻辑错误,二是HOG特征提取的调用方式有误,一步步来修正代码。
一、错误根源:标签获取的问题
你写的traininglabels=traindb.Labels;会触发报错,因为traindb只是个字符串(你的训练文件夹路径),根本不是结构体或带属性的对象,自然不能用点.来索引Labels。标签的获取得根据你的实际情况选择方式:
方式1:从每个.mat文件内读取标签
如果每个训练用的.mat文件本身就存储了标签(比如每个文件里有个叫label的变量),加载文件时一并读取即可:
CS = [16,16]; traindb = 'D:\matprog\matfiles\trainfiles'; filePattern = fullfile(traindb, '*.mat'); matFiles = dir(filePattern); % 提前初始化特征和标签容器,比循环内拼接更高效 trainingfeatures = []; traininglabels = []; for i = 1:length(matFiles) baseFileName = fullfile(traindb, matFiles(i).name); % 加载mat文件,假设内部图像存在变量img,标签存在变量label loaded_data = load(baseFileName); img = loaded_data.img; current_label = loaded_data.label; % 提取HOG特征:注意函数名是extractHOGFeatures(MATLAB区分大小写),参数要传图像矩阵 hog_feat = extractHOGFeatures(img, 'CellSize', CS); % 将当前样本的特征和标签加入集合 trainingfeatures = [trainingfeatures; hog_feat]; traininglabels = [traininglabels; current_label]; end
方式2:从文件名提取标签
如果你的.mat文件名本身包含类别信息(比如cat_001.mat、dog_002.mat这类命名规则),可以直接从文件名中提取标签:
% 在循环内部,加载文件之后执行 [~, file_name, ~] = fileparts(matFiles(i).name); % 假设文件名用下划线分隔,第一个部分为类别名称 current_label = split(file_name, '_'){1};
二、HOG特征提取的修正
你原来的extractHogfeatures(ref_files,'cellsize',CS)存在两个问题:
- MATLAB中该函数的正确名称是
extractHOGFeatures(大小写敏感,不能写错); - 第一个参数必须传入图像矩阵,而非
load返回的结构体。你需要先从加载的结构体中取出图像变量(比如上面代码中的img),再传入HOG函数。
三、训练SVM分类器
等特征和标签都正确生成后,训练代码即可正常运行:
classifier = fitcecoc(trainingfeatures, traininglabels);
额外优化小建议
- 预分配内存:如果已知训练样本总数和HOG特征维度,可以提前为
trainingfeatures和traininglabels分配空间(比如trainingfeatures = zeros(length(matFiles), feat_dim);),能大幅提升循环运行效率; - 图像预处理:如果你的图像是彩色图,建议先转成灰度图再提取HOG:
img = rgb2gray(img);,HOG对灰度图的处理效果更稳定; - 异常检查:可以添加判断逻辑(比如
if ~isfield(loaded_data, 'img')),避免因某个.mat文件缺失图像变量导致程序崩溃。
内容的提问来源于stack exchange,提问作者Santhu Athidi
相关产品推荐
相关产品推荐

