上一篇写到了SVM, 自己也花了大量的时间去看了原理。。。但总觉得没有示例的话还是有点虚。同时也一直想要做一个手势分类的项目玩。那趁自己还没有忘记,赶紧把项目给搞了,顺带巩固一下知识。使用MATLAB实现。
需要了解:
hog特征:https://blog.csdn.net/yuanjiteng/article/details/99608311
SVM分类的基本原理:https://blog.csdn.net/yuanjiteng/article/details/99413090
MATLAB使用到的函数解析:
1. imageDatastore
imageDatastore:imds = imageDatastore('./images', 'IncludeSubfolders', true, 'labelsource', 'foldernames')
创建一个图像数据储存体以处理图像集
其中第一个属性可以是文件名,可以是图片文件夹路径,可以是所有文件
第二个参数:‘IncludeSubfolders’ 是否包括子文件夹 、true/false 子文件夹递归/不递归(recusively)
参数:FileExtensions’,EXTENSIONS 要包括的文件的扩展名,比如“.png”,".jpg"
参数:‘ReadSize’,READSIZE 调用读取函数时要读取的图像文件数。默认情况下,读取大小为 1。
参数:‘LabelSource’,SOURCE LABELS 指定标签来源,默认是无,是’foldernames’就是文件夹名称做标签
参数:‘Labels’ LABELS 指定数据存储标签,LABELS是一数组或向量。
imd属性:Files ReadSize ReadFcn Lables
可以对imd执行的操作函数:
read - 读取下一个连续文件
reset - 将数据存储重置为数据的开头
preview - 从数据存储读取第一个图像
readimage - 从数据存储读取指定图像
readall - 从数据存储读取所有图像文件
partition - 返回表示单个 原始数据存储的分区部分
numpartitions - 返回合理数量的估计值分区与分区函数一起使用,
countEachLable - 计数图像数据存储中的唯一标签的数量
有一个很重要的 [imds1,imds2] = splitEachLabel(imds, p); p为小数代表百分比,p为整数代表从该整数分
extractHogFeatures
提取hog特征 使用方法 其中获得的features就是hog特征矩阵:
features = extractHOGFeatures(I)
[features, validPoints] = extractHOGFeatures(I, points)
%这个用法了解不多,对特殊的点求特征值
[..., visualization] = extractHOGFeatures(I, ...)
%一般而言使用这个,optionally returns a HOG feature visualization that can be shown using plot(visualization)
[...] = extractHOGFeatures(..., Name, Value)
其中可以设置参数和值:
CellSize 默认是[8,8]
BlockSize 默认是[2,2]
BlockOverlap 默认 ceil(BlockSize/2)
‘NumBins’ 默认9
‘UseSignedOrientation’ 默认false 代表0-180°,true就是-180-180°
使用案例:
I1 = imread('gantrycrane.png'); [hog1, visualization] = extractHOGFeatures(I1,'CellSize',[32 32]); subplot(1,2,1); imshow(I1); subplot(1,2,2); plot(visualization);
fitcecoc 这个是MATLAB自带的分类函数 用libsvm的自己了解
用法:OBJ=FITCECOC(TBL,Y)
TBL就是数据集向量 Y是标签 返回object 1v1方法
关于MATLAB其他多分类可以参考:https://cloud.tencent.com/info/b061682362bea1b7040237c09413d437.html
clear;clc
imdsTrain= imageDatastore('./trainimages', 'IncludeSubfolders', true, 'labelsource', 'foldernames');
%这里选择自己的文件夹路径,我的是文件夹trainimages里面含有left right 等图片文件夹
imdsTest = imageDatastore('./Test1'); %测试文件夹路径
Train_disp = countEachLabel(imdsTrain);
imageSize = [256,256];% 对所有图像进行此尺寸的缩放
image1 = readimage(imdsTrain,1);
scaleImage = imresize(image1,imageSize);
[features, visualization] = extractHOGFeatures(scaleImage);%获取feature的大小
numImages = length(imdsTrain.Files)%获取训练图片数
featuresTrain = zeros(numImages,size(features,2),'single'); %构造矩阵
for i = 1:numImages
imageTrain = readimage(imdsTrain,i);
imageTrain = imresize(imageTrain,imageSize);
featuresTrain(i,:) = extractHOGFeatures(imageTrain);
end %获取所有features 存储在featuresTrain中
trainLabels = imdsTrain.Labels; %训练标签
%开始训练并验证
classifer = fitcecoc(featuresTrain,trainLabels);
cvecoc = crossval(classifer);
oosLoss=kfoldLoss(cvecoc);
%%预测
numTest = length(imdsTest.Files);
for i=1:numTest
testImage = readimage(imdsTest,i);
scaleTestImage = imresize(testImage,imageSize);
featureTest = extractHOGFeatures(scaleTestImage);
[predictIndex,score] = predict(classifer,featureTest);
figure;
imshow(testImage);
title(['predictImage: ',char(predictIndex)]);
end
运行结果
oosLoss=0.0806 分类结果还行,可以接受。
如果想要进一步把训练的
MATLAB的.mat文件 转换为.yml文件,从而可以在opencv打开,参考下面:
:https://www.jianshu.com/p/ad6a2f8a3fc8
视觉图像领域的函数使用起来总是非常的复杂,其中fitcecoc函数可以实现的功能很多,想要彻底了解其用法还是去MATLAB打开文件慢慢看吧。我这只是拿来练习一下svm的使用。
实现了图片分类之后,下一步就应该是实现视频的实时读取和预测,其中又涉及到滑窗建立然后概率判断问题,再有就是GPU的使用提高效率,具体就参看hog行人检测代码。实时手势识别使用openpose在opencv实现或者yolo都是不错的选择。