从静态图像中识别目标一直是计算机视觉比较热门和有挑战性的课题,目前最受欢迎的方法非深度学习莫属,但是其检测速度和大数据量的需求也一直存在着很大的问题。其实,传统的机器学习在某些目标检测方面不但有着不逊于深度学习的准确度,而且检测速度和数据量的需求比深度学习要好一些。今天,我们就来聊一下在传统机器学习方面,基于dlib库的“比心”动作的识别。
对于动作的识别可以采取目标检测的方法,主要是先收集动作样本,接着对训练样本提取特征,然后基于这些特征进行SVM训练得到模型,最后基于这个模型对图像中的动作进行检测。其训练的流程图如下:
1.收集样本,标注并处理样本。对收集到的包含比心动作的样本进行标注,主要是用长方形把这个动作框起来,并把这个长方形的左上角坐标以及长宽和此文件的名字写入一个xml文件,训练的时候只需要读入xml文件即可。处理样本主要是对样本进行一些图像处理操作,比如镜像处理、加噪声,其作用是为了增强数据集。
2.金字塔下采样,提取fhog特征。金字塔下采样基于给定的一个采样因子,对图像进行下采样,也就是给定一个因数对图像不断进行缩小,构成多级金字塔,以适应不同尺寸的动作。不断缩小的终止条件就是图像大小小于扫描窗口的大小,这个扫描窗口就是一个n*n的大小的矩阵在图像上不停的滑动,然后根据模型判断此窗口的特征是否符合“比心”动作的特征。而提取的特征使用fhog特征来表示的,fhog是hog特征的变形,hog特征是方向梯度直方图,最简单的方向梯度的计算方式如下:
3.SVM训练。对提取到的fhog特征基于SVM也就是支持向量机进行训练,SVM对特征进行训练分类一般来说分为线性问题和非线性问题。而线性分类中可分为线性可分和线性不可分,线性可分可以简单理解为如下图:
也就是找到一个超平面将不同类别的样本点区分开,也就是图中的斜线将黄色矩形框和绿色原点区分开,其中最靠近斜线的两边样本点再平面之间的距离越大,那么这个分类的确信度就越高,那么得到的这个超平面称之为最优超平面。对于线性不可分的情况就是在此基础上加入某个惩罚因子进行调节,使得误分类的点尽可能少,两平面的距离尽可能的大。而对于非线性的问题主要是通过空间变换将低维空间映射到高维空间后进行线性可分,如下图所示:
左图中的椭圆平面就是右图中的直线。
4. 通过SVM训练分类得到“比心”动作识别的模型。而检测过程就是先输入图像,然后缩放图像,通过滑动窗口扫描整个图像,对滑动窗口中的图像提取特征,调用模型判断该特征是否属于“比心”动作的特征,最后将符合的特征图像聚合成一个图像,用矩形框画出来,检测效果如下图所示:
不管是深度学习还是传统机器学习,只要是有监督的学习,基本上都是分为训练和检测两部分,训练部分主要是收集样本、提取特征和训练分类。一般来说,在同等条件下,传统机器学习速度上要快于深度学习,但是准确率可能会稍逊深度学习。而“比心”动作的特征比较明显,所以,在传统机器学习的算法下,其准确率还是不错的。
整理 | 包包