机器学习笔记(1)基本术语和一些关于图像的理解

1、基本术语

  • 数据集
    比如 (形状=’卷曲’,颜色=’黑色’,硬度=‘柔软’),( 形状=‘…’ 颜色=‘…’,硬度=’…’ )代表头发的一个数据集,里面每个数据都是这种。

  • 示例
    其中的每一条数据代表每一条数据一样,就好比 人类和我一样,人类是一个大类,而我是具体的人类(说不是的出门右转-_-)。

  • 属性
    上面数据集的 形状、颜色、硬度等等都是属性( attribute)或者说特征( feature)

  • 属性值
    以上每个属性对应的值。

  • 属性空间
    如果说上面每个属性都映射到空间的话,一个属性代表一个轴,我们同样可以把对应的属性值也建立对应的映射,这样我们就变成了一个三维空间(我的意思上面的示例,理论可以扩展为N维)

    由于空间的每一个点对应一个坐标向量,因此我们也把一个示例称为一个“特征向量”
    属性值的个数,也称为维数,如果想学术一点可以表示为:令D={xi1,xi1,xi1,xi1…..xim }表示有m个示例的数据集,并且每个示例有d个属性,xi={xi1,xi1,xi1,xi1…..xid }

所以不要老是怪相机找你的脸不准,因为在某一刻他认为是人脸的东西,提取到的特征值是和它认为的人脸特征一样的。
其实现在某些物体的识别已经不错了,我们不用去研究什么物体是什么东西,比如说人脸的检测,现在的很多模型,已经能准确检测的到人脸,

2、 方向梯度直方图(HOG)

我们都知道一幅图片其实就是一个矩阵(不知道就去面壁),我们遍历每个像素,然后根据其周围的像素,来比较像素深度,然后画个箭头来表示变暗的方向,箭头代表了梯度(所以我们要将图像变成灰度图,因为同一个人在不同的明暗条件下,图像像素值将会是不同的,不变的是明暗),具体操作:将图像分割成16*16的小方块,然后计算出主方向上的梯度,然后用方向性最强的箭头代替原来的小方块,这样我们突然(好吧,也不突然)发现图像变成了人的轮廓,原始图像就被提取出了主要特征。
其他的一些巴拉巴拉,可以参考:
HOG 特征的提取:HOG特征简单梳理
HOG 特征的提取: 基于 scikit-image
所以我们拿到Hog图像之后,就可以在图片中轻松找到脸部了。

  • 面部特征点估计
    瓦希德·卡奇米(Vahid Kazemi)和约瑟菲娜·沙利文(Josephine Sullivan)在 2014 年发明的方法
    基本思路是找到 68 个人脸上普遍存在的特征点( landmarks)——包括下巴的顶部、每只眼睛的外部轮廓、每条眉毛的内部轮廓等。接下来我们训练一个机器学习算法,让它能够在任何脸部找到这 68 个特定的点:
    机器学习笔记(1)基本术语和一些关于图像的理解
  • 脸部编码
    所以当我们发现未知的人脸和未知的人脸作比对的时候,并不是把每个人脸做比对,而是找到最接近测量数据的已知脸(比如耳朵大小、眼距、鼻子长度 ps:眉毛还是算了),所以与其说是同一张脸,不如说是最像的脸。

  • 寻找测量值
    所以这就引出了深度学习,人类更加倾向于,记住什么发型、长相这种,对于我们的计算机小可爱来说有点困难,我们要做的就是让小可爱自己去找,什么东西是自己需要的。(训练一个深度卷积神经网络)
    比如说这里有几张照片,每一张我的表情不一样,所以上面的测量值也会有区别,我们稍微调整一下之后给出大致相同的测量值(经过大数据量的重复该步骤,她就可以学会如何为每个人生成128个测量值)

机器学习人士把脸128个测量值称为一个嵌入( embedding )这样计算机把复杂的数据缩减为计算机生成的一个数列发方法
这个通过训练卷积神经网络来输出脸部嵌入的过程,需要大量的数据和强大的计算能力。即使使用昂贵的 Nvidia Telsa 显卡,你也需要大约 24 小时的连续训练,才能获得良好的准确性。

但一旦网络训练完成,它就可以为每一张脸生成测量值,即使之前它从未见过这张脸!所以这种训练只需一次即可。幸运的是,OpenFace 上面的大牛已经做完了这些,并且他们发布了几个训练过可以直接使用的网络。谢谢Brandon Amos他的团队!
所以我们需要做的,就是通过他们预训练的网络来处理我们的脸部图像,以获得 128 个测量值。
我们需要做的是训练一个分类器,它可以从一个新的测试图像中获取测量结果,并找出最匹配的那个人。分类器运行一次只需要几毫秒,分类器的结果就是人的名字!