目录
动物种类识别在野生动物监测、畜牧业管理等众多领域具有重要意义。HOG(Histogram of Oriented Gradients)特征提取方法结合支持向量机(SVM)分类器能够有效地对动物种类进行识别。HOG 特征能够很好地描述图像的局部形状和纹理信息,SVM 则是一种强大的分类算法,在高维空间中找到最优分类超平面。
1.HOG特征提取原理
基于HOG变换的图像特征提取算法,目前被广泛应用在图像识别领域,如车牌识别,人脸识别,车辆识别等。下面对HOG变换的基本原理进行介绍。HOG特征的提取其详细步骤如下:
梯度计算
细胞单元(Cell)划分
块(Block)划分和归一化
通过上述HOG向量的计算步骤可知,HOG特征向量的提取主要是基于局部图像得到的,因此其具体更强的抗干扰能力。
2.SVM分类原理
SVM方法是通过一个非线性映射p,把样本空间映射到一个高维乃至无穷维的特征空间中(Hilbert空间),使得在原来的样本空间中非线性可分的问题转化为在特征空间中的线性可分的问题.简单地说,就是升维和线性化.升维,就是把样本向高维空间做映射,一般情况下这会增加计算的复杂性,甚至会引起"维数灾难",因而人们很少问津.但是作为分类、回归等问题来说,很可能在低维样本空间无法线性处理的样本集,在高维特征空间中却可以通过一个线性超平面实现线性划分(或回归).一般的升维都会带来计算的复杂化,SVM方法巧妙地解决了这个难题:应用核函数的展开定理,就不需要知道非线性映射的显式表达式;由于是在高维特征空间中建立线性学习机,所以与线性模型相比,不但几乎不增加计算的复杂性,而且在某种程度上避免了"维数灾难".这一切要归功于核函数的展开和计算理论.
支持向量机是一种监督学习模型,主要用于分类和回归分析。对于分类问题,SVM的目标是找到一个超平面,使得不同类别的样本尽可能地被分开,并且两类样本之间的间隔最大化。设训练数据集为{(xi,yi)}i=1n,其中xi∈Rd 表示特征向量,yi∈{−1,1} 表示类别标签。
假设存在一个超平面w⋅x+b=0,其中w 是权向量,b 是偏置项。对于线性可分的情况,SVM试图找到最优的w 和b 使得间隔最大,即:
3.MATLAB程序
28------------------------------------------
% 加载之前保存的名为'model.mat'的文件,该文件中应该存储了训练好的模型(例如支持向量机模型等),加载后可在后续进行预测等操作
load model.mat
% 初始化索引变量idx为0,该变量可能用于后续图形窗口或其他计数相关操作
idx=0;
% 开始循环遍历测试图像数据存储对象TestSet中的每一张图像,length(TestSet.Files)表示获取测试图像的总数
for i = 1:length(TestSet.Files);
% 从测试图像数据存储对象TestSet中读取第i张图像,存储到Itest变量中
Itest = readimage(TestSet,i);
% 使用imresize函数将读取的第i张图像Itest按照定义好的尺寸Isz进行缩放,缩放后的图像存储到Itest2变量中
Itest2 = imresize(Itest,Isz);
% 从缩放后的第i张图像Itest2中提取方向梯度直方图(Histogram of Oriented Gradients,HOG)特征,'CellSize'参数指定了单元尺寸为[4,4],提取的特征存储在IHOG变量中
IHOG = extractHOGFeatures(Itest2,'CellSize',[4,4]);
% 使用训练好的svm_model(之前加载的模型)对提取的HOG特征IHOG进行预测,得到预测结果,预测结果存储在Predy变量中,第二个返回值这里用~表示不接收(可能存在其他返回信息但此处不需要)
[Predy,~] = predict(svm_model,IHOG);
% 判断当前图像索引i除以20的余数是否等于1,如果满足此条件,说明每到第20张图像等间隔情况(这里可用于控制图形显示等相关布局操作)
if mod(i,20)==1
% 索引变量idx自增1,用于后续区分不同组的图像展示等情况
idx=idx+1;
end
% 创建一个新的图形窗口,窗口编号由idx决定,用于展示测试图像及其预测分类结果
figure(idx);
% 将当前图形窗口划分为4行5列的子图布局,用于放置多张图像展示
subplot(4,5,mod(i,20)+1);
% 在当前子图中显示缩放后的测试图像Itest,将图像尺寸调整为256×256进行显示(这里缩放尺寸与前面处理特征时的尺寸不同,可能是为了更好的展示效果)
imshow(imresize(Itest,[256,256]));
% 获取测试图像的完整文件名(包含路径等信息),存储到Iname变量中
Iname = TestSet.Files(i);
% 使用正则表达式函数regexp,以'\'作为分隔符对文件名Iname进行分割,将分割后的结果存储在T1变量中(得到的是一个元胞数组)
T1 = regexp(Iname,'\','split');
% 使用cellfun函数对T1中的每个元胞元素计算其长度(字符个数等情况),得到每个元素长度组成的向量,存储在Lcell变量中
Lcell = cellfun('length',T1);
% 提取T1中第一个元胞元素(这里根据代码逻辑可能是文件名相关的关键部分),取其最后一个字符(通过指定索引取长度对应的位置),转换为字符形式存储在T2变量中,这里的操作可能是为了获取更简洁且有代表性的文件名用于展示等目的
T2 = char(T1{1}(1,Lcell));
% 给当前显示的图像添加标题,标题内容包含预测的分类结果(通过char函数将Predy转换为字符形式展示),格式为"分类: [预测分类]"
title(['分类: ',char(Predy)]);
% 使用fprintf函数按照指定格式输出信息到命令行窗口,格式为"[提取的文件名关键部分] = [预测分类]"并换行,用于展示每张图像的预测分类情况与对应的文件名关键信息
fprintf('%s = %s \n',T2,char(Predy));
end
4.仿真结果
5.完整程序下载
完整可运行代码,博主已上传至CSDN,使用版本为matlab2022a: