win10下使用GPU对dlib加速

在计算机视觉和机器学习方向有一个特别好用但是比较低调的库,也就是dlib,与opencv相比其包含了很多最新的算法,尤其是深度学习方面的,因此很有必要学习一下。恰好最近换了一台笔记本,内含一块GTX1060的显卡,可以用来更快地跑深度学习算法。以前用公司HP的工作站配置过dlib,GPU是Quadro K420,用dlib自带的人脸识别算法(ResNet)测试过,相比较1060的速度确实要快上很多。dlib、cuda和cudnn的版本经常会更新,每次重新配置环境会遇到一些问题,在这里记下来吧。

一、dlib介绍

  • 介绍

dlib是一个非常非常非常好用的机器学习库,所有的源代码都用C++实现,而且也提供了编译得到的供python使用的接口。很多算法在工业界和学术界都取得了广泛应用,有不少对实时计算的性能要求很高的场合已经用到这些了吧,比如嵌入式、手机等等。官方网址戳这里: http://dlib.net/,官方博客http://blog.dlib.net/也会经常更新一些新的算法介绍,不过博客网站可能需要翻墙,下面的评论很多~从官网的介绍可以看出来里面实现了不少像矩阵计算、图像处理、机器学习之类的算法,并且提供了好用的接口;你可以按照教程使用cmake+vs2015(这个至少需要比update3的vs版本,否则cmake会报错)编译得到lib库,然后在C++环境下对库中的算法进行使用,不过对于很多人还是喜欢用python来捣鼓~~一般情况直接用pip安装就可以了。不过非常重要的一点是,默认的安装是不带某些特殊功能的,比如使用GPU对深度学习算法进行加速,或者利用CPU架构的特性提高逻辑运算的速度,这种情况下需要手动编译了,这个在后面部分会提高怎样配置这些~ 继续阅读

Haar特征与人脸检测

计算机视觉关心的一大话题就是试图告诉机器去理解、模拟人类的视觉过程,尽管从目前来看人类还未从根本上解释这一过程,不过一些铺垫性的工作告诉我们这其中的共性,比如科学家认为人类触发视觉的过程是一个从低级到高级的过程,大脑皮层视觉细胞首先能感知到低级的边缘特征,然后这些边缘特征通过叠加可以得到浅层的“线”形或者“棒”形的特征,其次是这些特征构成的较为高级的“弯曲”特征,最后综合而成为真正意义上的高级特征,可以说卷积神经网络的成功应用是对这一方面的很好地诠释。当然,本篇文章不是来探讨深度神经网络,而是指出诸如“边缘检测”等方法在计算机视觉发展过程中的重要应用,因此想写一个系列,主要说明一下像SIFT特征、Haar特征、HOG特征、LBP特征等等非常具有代表性的技术,尽管现在的神经网络在各个领域都已非常流行,而且基于深度神经网络的算法并不需要显示的去提取某种单一的特征,但是这些经典的算法在图像预处理、目标检测或跟踪等应用中发挥除了极大的作用。在本篇文章里首先介绍基于Haar特征和Adaboost的人脸检测方法。

1. Haar特征

很多人提到人脸识别主要关心的点就是人脸分类,但是在真正进行分类之前有一个非常关键的步骤即人脸检测。在学术领域人脸检测和分类是两个截然不同的领域,而在现实生活中我们的分类工作往往难以获得比较好的人脸样本,比如在进行实时监控的时候,人脸检测面临尺度不确定、分辨率不一致、人脸角度、表情、遮挡或者光照等等因素的综合影响,因此和人脸分类动辄99+的精度相比,其前期的处理工作人脸检测显得相当重要。人脸检测有一个非常非常经典的算法,也就是2001年Viola Jones的那篇Rapid Object Detection using a Boosted cascade of simple features中提到的使用Haar特征加Adaboost级联分类器进行人脸检测的框架,这篇文章自CVPR发表以来在学术界和工业界都取得了重大成果~本文将通过这篇文章的理解做一个介绍~这个框架主要分成两个部分,一个是使用简单的Haar特征提取人脸相关区域的集合特征,另一个是使用提取特征构成的弱分类器级联,最终达到检测的目的。Haar特征本质上是一个通过矩形模板进行匹配比较的过程,对于一张人脸图像,我们直觉上想到的是其中包含一些特殊的走向的特征,比如眼眶周围水平的走向,鼻子垂直的走向,而且这些特征可以被矩阵模板进行匹配比较:对于眼眶内部的眼睛一般会比眼眶外部要黑或者深一些,鼻梁外侧比鼻梁要深,嘴唇比嘴巴外部要深一些,如下图所示:Haar人脸检测就是利用上图中小可以伸缩、可以平移地模板和人脸图像(也可以叫做人脸检测器)进行匹配,按黑白区域的像素权重计算出像素和的差值,对于某一个大小和方向的模板可以认作是一种特征,并且每一种特征都可以训练构成一个简单的弱分类器,然后利用集成学习的思想级联这些弱分类器构成强分类器进而达到检测的目的,因此从本质上看人脸检测也可以看成是一个分类的过程。但是从这个过程我们可以看出对于某个类型的矩形模板,由于方向和尺度不一而造成总的特征数目巨大,比如对于上图中的第一个模板, Rainer Lienhart计算出其包含的特征多达43200个。假设窗口大小为W\times H\这种矩形模板的大小为w\times h\其包含的特征数计算公式为XY\cdot(W+1-w\frac{x+1}{2})\cdot (H+1-h\frac{y+1}{2})\ 继续阅读

机器学习和图像

       一直以为机器学习是一门很杂的学科,因为和其相关的交叉学科很多,比如统计学习、人工智能、模式识别、数据挖掘等等,在这些方向中有一个经常被忽视的那就是图像处理。图像处理本身又是一个比较大的方向,热门的图像特征检测、分类、检索、复原、去噪、增强、分割等等都属于其范畴。严格来说,图像处理拥有很久的发展史,由于图像本身拥有极强的特征结构信息,因此早期机器学习还未火热的时候图像处理就在很多行业得到了应用。最近的十年ML火热也带动了很多方向的发展,特别是在互联网、金融等行业,基于机器学习算法的推荐算法、点击预测、欺诈分类、用户流失等等方面都取得了重大成果,不过这些模型所处理的数据与图像有很大的区别,在深度学习之前未必有很多很高大上的算法能够优于传统的图像处理方法并且得到商用。在图像处理方向中,图像识别是近些年来非常火热的一个话题,特别是很多科技公司都发起了图像竞赛。图像识别并不是一个单一的方向,其应该包含前期的预处理中期的特征提取以及后期的分类,可以说图像的预处理和特征提取占据主要内容,我们通常所说的特征检测(比如人脸检测)就属于预处理的过程,不过特征检测本身又是一个很大的概念,而且关于这方面的研究和paper实在是太多太多了,因为特征检测在理论和实际运用中 都有很重要的地位。无论如何,在我看来,图像识别拥有一般数据模型无法比拟的特征优势,比如:

1.图像中像素点的局部区域信息非常丰富,如果直接用一般的机器学习模型会导致丢失这些局部关联信息,进而影响预测或者处理效果。以图像分类为例,基于局部描述特征(local descriptor)的特征提取方法取得了很多的成果,比如图像中的局部二值描述特征(LBP)、梯度特征(HOG)、旋转不变特征(SIFT)。

2.图像中的几何特征比较明显,因此在不同场景下进行不同的预测任务,通过合理地选取特征不仅能够获得很好的精度,而且可以满足较好的实时性要求。比如很经典的用于人脸检测特征Haar特征,通过使用简单的矩形特征模板匹配再通过Adaboost级联分类器,通过积分图来快速计算特征,在检测精度和实时性方面都取得了很不错的效果;Gabor特征对图像中的方向信息非常敏感,而掌纹图像恰恰包含大量的方向信息,因此使用Gabor滤波器和掌纹图像进行卷积获得方向响应再进行分类能获得不错的效果;再比如,车牌识别中,需要首先提取出车牌出的矩形区域,此时对图像边缘信息敏感的Sobel算子便派上了用场。 继续阅读

主成分分析的Python实现

       之前写的博客中提介绍了PCA 的原理,现在这里用Python实现一下吧~所用IDE为Spyder,Python版本3.5。这篇文章中用Mnist作为实验数据集,为了省事,并没有从官网中下载原始的Mnist数据,而是从kaggle上下载的。。上面的train数据和test数据(严格来说应该是验证集,并没有给出标签,而是让我们自己预测的)分别以csv格式给出,不过原始数据有点多,PC跑一些吃不消,所以只用了train中的一部分数据进行试验~首先是原始数据的读取以及初始化工作,train_num、test_num和total_num分别表示训练样本数、测试样本数以及总体样本数,这里的demo我用了其中10000个作为训练样本,10000个作为测试样本。dim为降维后的维数,也就是之前文章提到的投影向量的个数。 继续阅读

线性判别分析(Linear Discriminant Analysis)

在之前博客中介绍到了一种非常重要的用于降维的无监督学习方法主成分分析,这篇文章我们会介绍一种主要用于分类的有监督算法,即线性判别分析(LDA)。

一、LDA的分类思想

       LDA分类的思想相当朴素,即每个类同类的样本聚集,不同类的样本相互分散,这就好比学生做早操一样,老师需要把不同班学生区分开来的一个好方法就是让每个班的学生站成一队,然后每个队伍之间保持一定距离。如果考虑一个两类问题,LDA分类的示意图如图1所示。图中红色和蓝色分别表示两个不同类的样本,LDA的目的在于寻找投影变换,比如w\方向,使同类的样本投影之后同类的点靠近,反之异类点相互发散。

图1 继续阅读

主成分分析(Principal Component Analysis)

机器学习需要处理各种各样的数据,通常这些数据可以以向量的形式进行表示,现在现实环境中遇到的一大难题是数据的维数过高,导致后续处理起来时间开销消耗太大,在前面的文章中提到了一类典型的机器学习方法,也就是基于投影变换的方法。这篇文章介绍一种灰常重要的投影方法,也就是主成分分析(Principal Component Analysis, PCA)。在这一篇文章里主要弄清两个问题:一、投影的意义是什么?二、主成分分析的思想是什么?

一、投影的意义

     前面我们提到,对于一个样本可以表示成高维特征的形式,如x=(x_{1},x_{2},...x_{n})\,其本质上是高维坐标系中的一个点,其中x_{k}\是样本点在不同维度或者特征上的取值,习惯性地我们称之为“坐标”;另外,单个的样本点还可以看成是从原点出发的一个向量,而如果我们以向量为边以样本点做各个坐标轴作垂线,也就可以得到了x_{k}\。现在我们有这样一个策略,我们原有的坐标系已经不满足需求,然后需要一组新的坐标系来替代原始的坐标系,而且新坐标体系下样本点的位置或者坐标轴的个数都有可能发生变化。直观地,以二维坐标系为例,可以看到下图中原始样本点x\,而向量w\表示为一个新的坐标系下的坐标轴,显然它只有一维,这个时候只要将x\往向量w\的方向上作垂线也就得到了在新的坐标系下的值,假设为x^{'}\,那么对于这样的操作,把原始样本x\从二维坐标系变换到新的一维坐标系的过程就是通过投影变换完成的,在这个过程中我们完成了维数约减。不过这里举的例子非常特殊,原始样本只有二维,投影(降维)之后只有一维了,而实际的投影过程可以用x^{'}=w^{^{T}}x\进行表示,其中x\in \mathbb{R}^{n\times 1}\表示原始样本,x^{'}\in \mathbb{R}^{d\times 1}\表示投影后的样本,w\in \mathbb{R}^{n\times d}\表示投影变换矩阵,这里d\也就是降维后样本的维数,其几何意义表示新的坐标系中坐标的个数,也就是用d\个坐标轴来重构原始坐标系。
继续阅读

数据降维和投影

    高维数据一直是机器学习以及相关领域所面临的一大挑战,维数太高不仅会造成计算过程的时间、空间大幅增长,还有可能由于样本规模远小于维数出现“小样本”问题,造成严重的过拟合;同时维数过高并不意味着所有的特征维数都是有用的,这样数据通常包含大量的冗余信息,对分类也是不利的。因此,在处理高维数据时我们需要把数据的维数降下来,这就是降维的过程。降维的方式有多重多样,其中一种重要的方式是寻找一个线性变换矩阵,通过这个变换矩阵可以把原始的高维样本投影到一个低维子空间。当然不同的变换矩阵能够使子空间中新的样本具有不同的特性,我们从各种tutorials、书本看到的介绍的比较频繁的有三种: 继续阅读

机器学习漫游

   最近的十年机器学习很是火热,不过从其历程来看,机器学习的历史并不短暂~从早期的感知机到八十年代火热的神经网络,再到九十年代被提出的机器学习经典算法集成学习和支持向量机。不过最近的十年可谓赶上了机器学习发展的黄金年代,即软、硬件计算条件大幅提高,尤其是现在数据量的爆发式增长让机器拥能够进行充分“学习”的资本,另一方面现在开源项目越来越多,即便一些算法的实现很复杂,小白们只需要调几个接口也能完成对海量数据的挖掘工作;早这个年代里,不同的人充斥着不同的野心,计算机科学家仍在探索人工智能的奥义,资本、媒体都在热炒机器学习概念,大数据、AI俨然成为宠儿,各行程序员也在茶余饭后多了很多谈资,似乎这也成为他们各种“炫技”的资本。

       盛名之下,其实难副,看机器学习、人工智能的发展还处在浅层,算法应用的场景也十分有限,现在火热的深度学习从本质来说并没有十分重大的理论创新,主要还是因为赶上了硬件、数据量的提升。不管怎么样,长路漫漫,一切都需要慢慢来。现在从高校进入企业的博士、教授也越来越多,不仅钱给的足,硬件条件好,又能实现自己的梦想,何乐而不为呢。不过这样一来,有多少人真是潜心在学术界有所突破呢?不过话又说回来了,毕竟像机器学习、模式识别这样的研究生课程在国内毕竟发展时间短,除了一些名校,其他学校开设这些课程的少之又少,让一些计算机学科的教授去教授统计、概率还有一些复杂的优化算法这样的课程,想都不敢想~~~~

            

        不过现在来看国内的大环境在慢慢变好,很多老师不仅自己的积累沉淀很深,也很乐意分享,特别是,我还记得去年在亚马逊买了一本南大周老师的<<机器学习>>,到手之后真的超出了预期,上面的算法介绍的比较系统,而且比较新,后面给出的附录也适合非科班同学看懂~更难得是这是一本中文的可以当成教材的书~而且从写的内容来看,真的很谦虚、严谨,总之比较推荐入门的同学看,因为除了之前一直被广为人知的还是NG的斯坦福大学Machine Learning公开课,现在终于有本好的中文图书了。
 前面似乎有些偏题了:)初衷只是想写一个机器学习系列笔记的开篇,算是对自己的一个督促吧,现在很多时候感觉脑子不动真的是要上锈了~好了不多说了,下面进入正题吧~

继续阅读