# 支持向量机+hog特征实现手势识别

SVM+hog特征实现手势识别

上一篇写到了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为整数代表从该整数分

  1. 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);

  2. fitcecoc 这个是MATLAB自带的分类函数 用libsvm的自己了解

    用法:OBJ=FITCECOC(TBL,Y) TBL就是数据集向量 Y是标签 返回object 1v1方法

    关于MATLAB其他多分类可以参考:https://cloud.tencent.com/info/b061682362bea1b7040237c09413d437.html

    分类matlab代码

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

运行结果

img

oosLoss=0.0806 分类结果还行,可以接受。

如果想要进一步把训练的

MATLAB的.mat文件 转换为.yml文件,从而可以在opencv打开,参考下面:

:https://www.jianshu.com/p/ad6a2f8a3fc8

总结

视觉图像领域的函数使用起来总是非常的复杂,其中fitcecoc函数可以实现的功能很多,想要彻底了解其用法还是去MATLAB打开文件慢慢看吧。我这只是拿来练习一下svm的使用。

实现了图片分类之后,下一步就应该是实现视频的实时读取和预测,其中又涉及到滑窗建立然后概率判断问题,再有就是GPU的使用提高效率,具体就参看hog行人检测代码。实时手势识别使用openpose在opencv实现或者yolo都是不错的选择。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章