图像特征提取 订阅
《特征提取与图像处理》是2010年电子工业出版社出版的图书,作者是尼克松(MarkS.Nixon)。 [1] 展开全文
《特征提取与图像处理》是2010年电子工业出版社出版的图书,作者是尼克松(MarkS.Nixon)。 [1]
信息
ISBN
9787121118784
作    者
尼克松(MarkS.Nixon)
定    价
35.00元
书    名
特征提取与图像处理
出版时间
2010年10月1日
开    本
16开
出版社
电子工业出版社
特征提取与图像处理内容简介
《特征提取与图像处理(第2版)》内容简介:图像处理和计算机视觉是当前热门的研究课题。《特征提取与图像处理(第2版)》以一种简洁明白的方式为计算机视觉和图像处理领域的初学者和准专业人士提供了一个图像处理和计算机视觉技术的基础指南。读者可以基于文中给出的代码以及网站的MATLAB和Mathcad文件开发自己工作中所需的技术方法。《特征提取与图像处理(第2版)》不仅关注高层次特征提取技术,还涉及与图像获取、采样理论、点运算和低层次特征提取相关的问题和技术,构成了一个明确连贯的知识体系。在第一版的基础上,既新增加了用于低层次特征提取的曲率方法(SIFT和显著性算子)和相位一致性、几何主动轮廓、形态学,还升级了图像平滑处理(各向异性扩散)、形状骨架化、形状描述(矩)等内容。《特征提取与图像处理(第2版)》可作为高等学校电子工程、计算机科学、计算机工程等专业本科生的教材,也可以作为图像、视频信号处理,模式识别和计算机视觉研究方向的博士、硕士研究生,以及相关专业的科研工作者的参考用书。
收起全文
精华内容
下载资源
问答
  • 2018-07-14 00:49:04

    一、图像常用属性

    本节指的是一般来说,图像处理的一些角度,也是根据一些美图软件最为关注的一些图像属性:

    • 基本属性:图像亮度,对比度,色彩饱和度,清晰度(锐度)
    • 色阶:曝光、高光、阴影
    • 颜色:色温、色调 
      .

    1、图像亮度

    来源于:OpenCV改变图像或视频的亮度 
    改变亮度是在每个像素上的点操作。如果想提高亮度,必须在每个像素上加上一些常数值。 
    这里写图片描述

    上面图像的第一个像素应该是(12-20)=-8,但是我给它的值为0。这是因为像素不可能为负值。任何像素值的下限是0,上限是2^(位深)。 
    .

    二、图像基本特征

    常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。 
    参考博客:图像特征特点及其常用的特征提取与匹配方法

    1、颜色特征

    颜色对图像或图像区 域的方向、大小等变化不敏感,所以颜色特征不能很好地捕捉图像中对象的局部特征。颜色直方图是最常用的表达颜色特征的方法,其优点是不受图像旋转和平移变化的影响,进一步借助归一化还可不受图像尺度变化的影响,基缺点是没有 表达出颜色空间分布的信息。

    • 颜色直方图:

    其 优点在于:它能简单描述一幅图像中颜色的全局分布,即不同色彩在整幅图像中所占的比例,特别适用于描述那些难以自动分割的图像和不需要考虑物体空间位置的 图像。其缺点在于:它无法描述图像中颜色的局部分布及每种色彩所处的空间位置,即无法描述图像中的某一具体的对象或物体。

    最常用的颜色空间:RGB颜色空间、HSV颜色空间。 
    颜色直方图特征匹配方法:直方图相交法、距离法、中心距法、参考颜色表法、累加颜色直方图法。

    • 颜色集

    颜色直方图法是一种全局颜色特征提取与匹配方法,无法区分局部颜色信息。颜色集是对颜色直方图的一种近似首先将图像从 RGB颜色空间转化成视觉均衡的颜色空间(如 HSV 空间),并将颜色空间量化成若干个柄。然后,用色彩自动分割技术将图像分为若干区域,每个区域用量化颜色空间的某个颜色分量来索引,从而将图像表达为一个二进制的颜色索引集。在图像匹配中,比较不同图像颜色集之间的距离和色彩区域的空间关系

    • 颜色矩

    这种方法的数学基础在于:图像中任何的颜色分布均可以用它的矩来表示。此外,由于颜色分布信息主要集中在低阶矩中,因此,仅采用颜色的一阶矩(mean)、二阶矩(variance)和三阶矩(skewness)就足以表达图像的颜色分布。

    • 颜色聚合向量

    其核心思想是:将属于直方图每一个柄的像素分成两部分,如果该柄内的某些像素所占据的连续区域的面积大于给定的阈值,则该区域内的像素作为聚合像素,否则作为非聚合像素。

    • 颜色相关图

    .

    2、纹理特征

    描述了图像或图像区域所对应景物的表面性质。但由于纹理只是一种物体表面的特性,并不能完全反映出物体的本质属性, 所以仅仅利用纹理特征是无法获得高层次图像内容的。 
    与颜色特征不同,纹理特征不是基于像素点的特征,它需要在包含多个像素点的区域中进行统计计算。 
    作为一种统计特征,纹理特征常具有旋转不变性,并且对于噪声有较强的抵抗 能力。 
    但是,纹理特征也有其缺点,一个很明显的缺点是当图像的分辨率变化的时候,所计算出来的纹理可能会有较大偏差。

    在检索具有粗细、疏密等方面较大差别的纹理图像时,利用纹理特征是一种有效的方法。但当纹理之间的粗细、疏密等易于分辨的信息之间相差不大的时候,通常的纹理特征很难准确地反映出人的视觉感觉不同的纹理之间的差别。

    • (1)统计方法

    统计方法的典型代表是一种称为灰度共生矩阵的纹理特征分析方法Gotlieb 和 Kreyszig 等人在研究共生矩阵中各种统计特征基础上,通过实验,得出灰度共生矩阵的四个关键特征:能量、惯量、熵和相关性。统计方法中另一种典型方法,则是从图像的自相关函数(即图像的能量谱函数)提取纹理特征,即通过对图像的能量谱函数的计算,提取纹理的粗细度及方向性等特征参数

    • (2)几何法

    所谓几何法,是建立在纹理基元(基本的纹理元素)理论基础上的一种纹理特征分析方法。纹理基元理论认为,复杂的纹理可以由若干简单的纹理基元以一定的有规律的形式重复排列构成。在几何法中,比较有影响的算法有两种:Voronio 棋盘格特征法和结构法。

    • (3)模型法

    模型法以图像的构造模型为基础,采用模型的参数作为纹理特征。典型的方法是随机场模型法,如马尔可夫(Markov)随机场(MRF)模型法和 Gibbs 随机场模型法

    • (4)信号处理法

    纹理特征的提取与匹配主要有:灰度共生矩阵、Tamura 纹理特征、自回归纹理模型、小波变换等。

    灰度共生矩阵特征提取与匹配主要依赖于能量、惯量、熵和相关性四个参数。Tamura 纹理特征基于人类对纹理的视觉感知心理学研究,提出6种属性,即:粗糙度、对比度、方向度、线像度、规整度和粗略度。自回归纹理模型(simultaneous auto-regressive, SAR)是马尔可夫随机场(MRF)模型的一种应用实例。 
    .

    3、形状特征

    种基于形状特征的检索方法都可以比较有效地利用图像中感兴趣的目标来进行检索,但它们也有一些共同的问题,包括: 
    ①目前基于形状的检索方法还缺乏 比较完善的数学模型; 
    ②如果目标有变形时检索结果往往不太可靠; 
    ③许多形状特征仅描述了目标局部的性质,要全面描述目标常对计算时间和存储量有较高的要 求; 
    ④许多形状特征所反映的目标形状信息与人的直观感觉不完全一致,或者说,特征空间的相似性与人视觉系统感受到的相似性有差别。

    • (1)边界特征法

    该方法通过对边界特征的描述来获取图像的形状参数。其中Hough 变换检测平行直线方法和边界方向直方图方法是经典方法。Hough 变换是利用图像全局特性而将边缘像素连接起来组成区域封闭边界的一种方法,其基本思想是点—线的对偶性;边界方向直方图法首先微分图像求得图像边缘,然后,做出关于边缘大小和方向的直方图,通常的方法是构造图像灰度梯度方向矩阵。

    • (2)傅里叶形状描述符法

    傅里叶形状描述符(Fourier shape descriptors)基本思想是用物体边界的傅里叶变换作为形状描述,利用区域边界的封闭性和周期性,将二维问题转化为一维问题。

    由边界点导出三种形状表达,分别是曲率函数、质心距离、复坐标函数。

    • (3)几何参数法

    形状的表达和匹配采用更为简单的区域特征描述方法,例如采用有关形状定量测度(如矩、面积、周长等)的形状参数法(shape factor)。在 QBIC 系统中,便是利用圆度、偏心率、主轴方向和代数不变矩等几何参数,进行基于形状特征的图像检索。

    需要说明的是,形状参数的提取,必须以图像处理及图像分割为前提,参数的准确性必然受到分割效果的影响,对分割效果很差的图像,形状参数甚至无法提取。

    • (4)形状不变矩法

    利用目标所占区域的矩作为形状描述参数。

    • (5)其它方法

    近年来,在形状的表示和匹配方面的工作还包括有限元法(Finite Element Method 或 FEM)、旋转函数(Turning Function)和小波描述符(Wavelet Descriptor)等方法。

    • 基于小波和相对矩的形状特征提取与匹配

    该方法先用小波变换模极大值得到多尺度边缘图像,然后计算每一尺度的 7个不变矩,再转化为 10 个相对矩,将所有尺度上的相对矩作为图像特征向量,从而统一了区域和封闭、不封闭结构。 
    .

    4、空间关系特征

    指图像中分割出来的多个目标之间的相互的空间位置或相对方向关系,这些关系也可分为连接/邻接关系、交叠/重叠关系和包含/包 容关系等。通常空间位置信息可以分为两类:相对空间位置信息和绝对空间位置信息。 
    前一种关系强调的是目标之间的相对情况,如上下左右关系等,后一种关系强 调的是目标之间的距离大小以及方位。显而易见,由绝对空间位置可推出相对空间位置,但表达相对空间位置信息常比较简单。

    空间关系特征的使用可加强对图像内容的描述区分能力,但空间关系特征常对图像或目标的旋转、反转、尺度变化等比较敏感。另外,实际应用中,仅仅利用空间信息往往是不够的,不能有效准确地表达场景信息。为了检索,除使用空间关系特征外,还需要其它特征来配合

    提取图像空间关系特征可以有两种方法:一种方法是首先对图像进行自动分割,划分出图像中所包含的对象或颜色区域,然后根据这些区域提取图像特征,并建立索引;另一种方法则简单地将图像均匀地划分为若干规则子块,然后对每个图像子块提取特征,并建立索引。 
    .


    三、图像的统计特征

    一般图像的统计特征可以分为四类:直观性特征、灰度统计特征、变换系数特征与代数特征。 
    .

    1、直观性特征

    直观性特征主要指几何特征,几何特征比较稳定,受人脸的姿态变化与光照条件等因素的影响小,但不易抽取,而且测量精度不高,与图像处理技术密切相关。 
    .

    2、灰度统计特征

    灰度共生矩阵的四个关键特征:能量、惯量、熵和相关性。统计方法中另一种典型方法,则是从图像的自相关函数(即图像的能量谱函数)提取纹理特征,即通过对图像的能量谱函数的计算,提取纹理的粗细度及方向性等特征参数 
    .

    3、变换系数特征

    变换系数特征指先对图像进行Fourier变换、小波变换等,得到的系数后作为特征进行识别。 
    .

    4、代数特征

    代数特征是基于统计学习方法抽取的特征。代数特征具有较高的识别精度,代数特征抽取方法又可以分为两类:一种是线性投影特征抽取方法;另外一种是非线性特征抽取方法。

    习惯上,将基于主分量分析和Fisher线性鉴别分析所获得的特征抽取方法,统称为线性投影分析。

    基于线性投影分析的特征抽取方法,其基本思想是根据一定的性能目标来寻找一线性变换,把原始信号数据压缩到一个低维子空间,使数据在子空间中的分布更加紧凑,为数据的更好描述提供手段,同时计算的复杂度得到大大降低。 
    在线性投影分析中,以主分量分析(PCA,或称K-L变换)和Fisher线性鉴别分析(LDA)最具代表性,围绕这两种方法所形成的特征抽取算法,已成为模式识别领域中最为经典和广泛使用的方法。

    线性投影分析法的主要缺点为:需要对大量的已有样本进行学习,且对定位、光照与物体非线性形变敏感,因而采集条件对识别性能影响较大。

    非线性特征抽取方法也是研究的热点之一。“核技巧”最早应用在SVM中,KPCA和KFA是“核技巧”的推广应用。

    核投影方法的基本思想是将原样本空间中的样本通过某种形式的非线性映射,变换到一个高维甚至无穷维的空间,并借助于核技巧在新的空间中应用线性的分析方法求解。由于新空间中的线性方向也对应原样本空间的非线性方向,所以基于核的投影分析得出的投影方向也对应原样本空间的非线性方向。

    核投影方法也有一些弱点:几何意义不明确,无法知道样本在非显式映射后变成了什么分布模式;核函数中参数的选取没有相应选择标准,大多数只能采取经验参数选取;不适合训练样本很多的情况,原因是经过核映射后,样本的维数等于训练样本的个数,如果训练样本数目很大,核映射后的向量维数将会很高,并将遇到计算量上的难题。

    就应用领域来说,KPCA远没有PCA应用的广泛。如果作为一般性的降维KPCA确实比PCA效果好,特别是特征空间不是一般的欧式空间的时候更为明显。PCA可以通过大量的自然图片学习一个子空间,但是KPCA做不到。 
    .


    四、姿态估计问题

    姿态估计问题就是:确定某一三维目标物体的方位指向问题。姿态估计在机器人视觉、动作跟踪和单照相机定标等很多领域都有应用。

    基于视觉的姿态估计根据使用的摄像机数目又可分为单目视觉姿态估计和多目视觉姿态估计。根据算法的不同又可分为基于模型的姿态估计和基于学习的姿态估计。

    1、基于模型的姿态估计方法

    基于模型的方法通常利用物体的几何关系或者物体的特征点来估计。其基本思想是利用某种几何模型或结构来表示物体的结构和形状,并通过提取某些物体特征,在模型和图像之间建立起对应关系,然后通过几何或者其它方法实现物体空间姿态的估计。这里所使用的模型既可能是简单的几何形体,如平面、圆柱,也可能是某种几何结构,也可能是通过激光扫描或其它方法获得的三维模型。 
    基于模型的姿态估计方法是通过比对真实图像和合成图像,进行相似度计算更新物体姿态。目前基于模型的方法为了避免在全局状态空间中进行优化搜索,一般都将优化问题先降解成多个局部特征的匹配问题,非常依赖于局部特征的准确检测。当噪声较大无法提取准确的局部特征的时候,该方法的鲁棒性受到很大影响。

    2、基于学习的姿态估计方法

    基于学习的方法一般采用全局观测特征,不需检测或识别物体的局部特征,具有较好的鲁棒性。其缺点是由于无法获取在高维空间中进行连续估计所需要的密集采样,因此无法保证姿态估计的精度与连续性。 
    基于学习的方法一般采用全局观测特征,可以保证算法具有较好的鲁棒性。然而这一类方法的姿态估计精度很大程度依赖于训练的充分程度。要想比较精确地得到二维观测与三维姿态之间的对应关系,就必须获取足够密集的样本来学习决策规则和回归函数。而一般来说所需要样本的数量是随状态空间的维度指数级增加的,对于高维状态空间,事实上不可能获取进行精确估计所需要的密集采样。因此,无法得到密集采样而难以保证估计的精度与连续性,是基于学习的姿态估计方法无法克服的根本困难。

    姿态估计输出的是一个高维的姿态向量,而不是某个类别的类标。因此这一类方法需要学习的是一个从高维观测向量到高维姿态向量的映射,目前这在机器学习领域中还是一个非常困难的问题。 
    特征是描述模式的最佳方式,且我们通常认为特征的各个维度能够从不同的角度描述模式,在理想情况下,维度之间是互补完备的。 
    .


    五、图像特征提取算法类

    1、HOG特征

    方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dalal在2005的CVPR上提出的,而如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM的思路为主。 
    在一副图像中,局部目标的表象和形状(appearance and shape)能够被梯度或边缘的方向密度分布很好地描述。(本质:梯度的统计信息,而梯度主要存在于边缘的地方)。

    与其他的特征描述方法相比,HOG有很多优点。首先,由于HOG是在图像的局部方格单元上操作,所以它对图像几何的和光学的形变都能保持很好的不变性,这两种形变只会出现在更大的空间领域上。其次,在粗的空域抽样、精细的方向抽样以及较强的局部光学归一化等条件下,只要行人大体上能够保持直立的姿势,可以容许行人有一些细微的肢体动作,这些细微的动作可以被忽略而不影响检测效果。因此HOG特征是特别适合于做图像中的人体检测的。

    2、LBP特征

    LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子;它具有旋转不变性和灰度不变性等显著的优点。它是首先由T. Ojala, M.Pietikäinen, 和D. Harwood 在1994年提出,用于纹理特征提取。而且,提取的特征是图像的局部的纹理特征。 
    上述提取的LBP算子在每个像素点都可以得到一个LBP“编码”,那么,对一幅图像(记录的是每个像素点的灰度值)提取其原始的LBP算子之后,得到的原始LBP特征依然是“一幅图片”(记录的是每个像素点的LBP值)。

    LBP的应用中,如纹理分类、人脸分析等,一般都不将LBP图谱作为特征向量用于分类识别,而是采用LBP特征谱的统计直方图作为特征向量用于分类识别。 
    例如:一幅100*100像素大小的图片,划分为10*10=100个子区域(可以通过多种方式来划分区域),每个子区域的大小为10*10像素;在每个子区域内的每个像素点,提取其LBP特征,然后,建立统计直方图;这样,这幅图片就有10*10个子区域,也就有了10*10个统计直方图,利用这10*10个统计直方图,就可以描述这幅图片了。之后,我们利用各种相似性度量函数,就可以判断两幅图像之间的相似性了。 
    这里写图片描述

    3、Haar-like特征

    Haar-like特征最早是由Papageorgiou等应用于人脸表示,Viola和Jones在此基础上,使用3种类型4种形式的特征。 
    Haar特征分为三类:边缘特征、线性特征、中心特征和对角线特征,组合成特征模板。

    特征模板内有白色和黑色两种矩形,并定义该模板的特征值为白色矩形像素和减去黑色矩形像素和。Haar特征值反映了图像的灰度变化情况。例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。但矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述特定走向(水平、垂直、对角)的结构。

    通过改变特征模板的大小和位置,可在图像子窗口中穷举出大量的特征。上图的特征模板称为“特征原型”;特征原型在图像子窗口中扩展(平移伸缩)得到的特征称为“矩形特征”;矩形特征的值称为“特征值”。 
    这里写图片描述
    .

    4、其他

    • Sobel边缘检测

    Soble边缘检测算法比较简,实际应用中效率比canny边缘检测效率要高,但是边缘不如Canny检测的准确,但是很多实际应用的场合,sobel边缘却是首选,尤其是对效率要求较高,而对细纹理不太关心的时候。

    Soble边缘检测通常带有方向性,可以只检测竖直边缘或垂直边缘或都检测。

    • Canny边缘检测

    canny边缘检测实际上是一种一阶微分算子检测算法,但为什么这里拿出来说呢,因为它几乎是边缘检测算子中最为常用的一种,也是个人认为现在最优秀的边缘检测算子。Canny提出了边缘检测算子优劣评判的三条标准:

    高的检测率。边缘检测算子应该只对边缘进行响应,检测算子不漏检任何边缘,也不应该将非边缘标记为边缘。 
    精确定位。检测到的边缘与实际边缘之间的距离要尽可能的小。 
    明确的响应。对每一条边缘只有一次响应,只得到一个点。 
    Canny边缘检测之所以优秀是因为它在一阶微分算子的基础上,增加了非最大值抑制和双阈值两项改进。利用非极大值抑制不仅可以有效地抑制多响应边缘,而且还可以提高边缘的定位精度;利用双阈值可以有效减少边缘的漏检率。

    • ORB特征

    它是对FAST特征点与BREIF特征描述子的一种结合与改进,这个算法是由Ethan Rublee,Vincent Rabaud,Kurt Konolige以及Gary R.Bradski在2011年一篇名为“ORB:An Efficient Alternative to SIFT or SURF”的文章中提出。就像文章题目所写一样,ORB是除了SIFT与SURF外一个很好的选择,而且它有很高的效率,最重要的一点是它是免费的,SIFT与SURF都是有专利的,你如果在商业软件中使用,需要购买许可。

    • BRIEF特征

    可以用PCA、LDA等特征降维的方法来压缩特征描述子的维度。还有一些算法,例如LSH,将SIFT的特征描述子转换为一个二值的码串,然后这个码串用汉明距离进行特征点之间的匹配。这种方法将大大提高特征之间的匹配,因为汉明距离的计算可以用异或操作然后计算二进制位数来实现,在现代计算机结构中很方便。下面来们提取一种二值码串的特征描述子。 
    BRIEF[1]应运而生,它提供了一种计算二值串的捷径,而并不需要去计算一个类似于SIFT的特征描述子。它需要先平滑图像,然后在特征点周围选择一个Patch,在这个Patch内通过一种选定的方法来挑选出来ndnd个点对。

    .


    参考文献

    1、图像特征类: 
    关于图像特征提取 
    图像特征特点及其常用的特征提取与匹配方法

    2、图像特征提取算法: 
    目标检测的图像特征提取之(二)LBP特征 
    图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

    http://www.cnblogs.com/ronny/category/366231.html 
    .


    延伸一:K-means聚类图像压缩:色彩量化

    来源于:Image-compression-with-Kmeans-clustering: Color Quantization

    from skimage import io
    import numpy as np
    
    centers = np.load('codebook_tiger.npy')
    
    c_image = io.imread('compressed_tiger.png')
    
    image = np.zeros((c_image.shape[0],c_image.shape[1],3),dtype=np.uint8 )
    for i in range(c_image.shape[0]):
        for j in range(c_image.shape[1]):
                image[i,j,:] = centers[c_image[i,j],:]
    
    io.imsave('reconstructed_tiger.png',image);
    io.imshow(image)
    io.show()
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    效果: 
    这里写图片描述
    这里写图片描述
    .

    延伸二:车辆追踪算法大PK:SVM+HOG vs. YOLO

    云栖社区:车辆追踪算法大PK:SVM+HOG vs. YOLO 
    文章原标题《Vehicle tracking using a support vector machine vs. YOLO》,作者:Kaspar Sakmann,译者:耕牛的人,校核:主题曲(身形)。

    对于Udacity(优达学城)自动驾驶汽车纳米学位的汽车检测和跟踪项目,如果使用传统的计算机可视化技术将是一个挑战,就像方向梯度直方图(Histogram of Oriented Gradients,HOG)和其它特征组合在一起在视频里跟踪汽车一样,理想的解决方案应该是实时运行的,如>30FPS,我曾经使用线性SVM来处理视频,在一台i7 CPU计算机上得到的结果只有可怜的3FPS。最后我使用YOLO来处理视频终于通过了Udacity的项目,YOLO是一个超快的用于对象检测的卷积神经网络,如果你的GPU够快(我当时使用的是GTX 1080),视频处理的速度可以达到65FPS,比我用SVM+HOG的方法足足快20倍。

    这里写图片描述

    特征提取: 
    我使用的特征向量如下:

    • 空间特征:除了用于自检的像斑(16x16像素)外啥都没有。
    • 颜色直方图特征:捕获每个像斑的统计颜色信息,通过这种特征向量捕获的汽车颜色通常是非常饱和的。
    • 方向梯度直方图(HOG)特征:捕获每个图像通道的梯度结构,在不同的光线条件下,这种方法表现得还不错。

    在这篇博客里有关于HOG特征的详细描述,其思想始终是,在一个直方图里,在一个图像上聚集梯度,让特征向量在不同视角和光线条件下变得更加稳定。下面是HOG特征应用于有车的和没车的图像上时的可视化呈现。 
    而SVM+HOG方案需要处理大约150次。上面大家看到的视频,我还没有进行过优化,如减少图像或定义兴趣区域,或者针对汽车做特定训练。 
    在准确性相当时,YOLO比SVM+HOG要快20多倍,检测阈值可以被设置为任意置信水平,我保留默认值(50%),并且除了汽车之外不再检测其它对象,这让我相当兴奋,我将在另一个独立项目中进一步验证汽车检测的可能性。

    .

    延伸三:轻量级物体检测卷积神经网络SqueezeDet:功耗更低、识别更准确、速度更快

    本目录中的代码实现了我们论文中(https://arxiv.org/abs/1612.01051)提出的模型——一个用于自动驾驶中实时物体检测的统一、小型且低耗的完全卷积神经网络。如果我们的工作对您的研究有帮助,您可做如下引用:

    @inproceedings{squeezedet,
        Author = {Bichen Wu and Forrest Iandola and Peter H. Jin and Kurt Keutzer},
        Title = {SqueezeDet: Unified, Small, Low Power Fully Convolutional Neural Networks for Real-Time Object Detection for Autonomous Driving},
        Journal = {arXiv:1612.01051},
        Year = {2016}
    • 1
    • 2
    • 3
    • 4
    • 5

    安装

    Linux环境下可执行以下命令:

    拷贝SqueezeDet的目录:

    git clone https://github.com/BichenWuUCB/squeezeDet.git
    • 1

    我们以$SQDT_ROOT来调用SqueezeDet的顶层目录。

    (可选)设置你自己的虚拟环境:

    1.以下的操作假设运行的Python版本是Python2.7。找到你的用户主目录下,并在此创建虚拟环境。

    cd ~virtualenv env --python=python
    • 1

    2.启动虚拟环境

    source env/bin/activate
    • 1

    使用pip安装所需的Python工具包

    pip install -r requirements.txt
    • 1

    演示

    从这里(https://www.dropbox.com/s/a6t3er8f03gdl4z/model_checkpoints.tgz?dl=0)下载SqueezeDet模型的参数,解压,并将解压后的文件放在$SQDT_ROOT/data/目录下。命令行下的命令如下:

    cd $SQDT_ROOT/data/wget https://www.dropbox.com/s/a6t3er8f03gdl4z/model_checkpoints.tgztar -xzvf model_checkpoints.tgzrm model_checkpoints.tgz
    • 1

    现在我们可以运行Demo了。执行以下命令可以检测样本中的图像

    $SQDT_ROOT/data/sample.png,
    cd $SQDT_ROOT/python ./src/demo.py
    • 1
    • 2

    如果想检测其他图片,可以修改input_path=./data/*.png使其指向其他的图片。由于输入的图片会被缩放为1242x375的分辨率(KITTI图片分辨率),所以当输入图片接近此分辨率时模型的效果最佳。

    SqueezeNet实现的是实时的物体检测,因此可以用来检测一段视频。之后我们会发布检测视频的Demo。

    训练及验证

    从这里(图片:http://www.cvlibs.net/download.php?file=data_object_image_2.zip,标签:http://www.cvlibs.net/download.php?file=data_object_label_2.zip)下载KITTI物体检测的数据集,并将它们放到SQDTROOT/data/KITTI/SQDTROOT/data/KITTI/目录下,解压后会生成SQDT_ROOT/data/KITTI/training/ 和$SQDT_ROOT/data/KITTI/testing/两个子目录。

    现在,我们需要将原来的训练集重新划分为训练集和验证集。

    cd $SQDT_ROOT/data/KITTI/mkdir ImageSetscd ./ImageSetsls ../training/image_2/ | grep ".png" | sed s/.png// > trainval.txt
    • 1

    trainval.txt这个文件记录了训练集中所有图片的索引。实验中,我们随机选取trainval.txt文件里一半的索引作为新的训练集图片的索引并存到train.txt,其余的作为验证集存到val.txt。为了方便读者使用,我们编写了下面的脚本以自动完成数据集的重新划分:

    cd $SQDT_ROOT/data/python random_split_train_val.py
    • 1

    然后,我们需要从$SQDT_ROOT/data/KITTI/ImageSets下得到train.txt和val.txt。

    更多相关内容
  • 内含13种图像特征提取代码:01_Histogram、02_GLCM、03_Color、04_ShapeContext、05_SIFT、06_HOG、07_LBP、08_Gabor、09_SURF、10_Harris、11_FAST、12_BRIEF、13_ORB
  • matlab 图像特征提取代码~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  • 图像特征提取及其分类图像特征提取及其分类图像特征提取及其分类
  • 基于matlab的图像处理——纹理特征提取方法
  • 基于python的图像特征提取算法SIFT
  • matlab图像特征提取

    2013-11-13 18:37:45
    好用的matlab图像处理程序,主要是特征提取方面的
  • 图像特征提取matlab程序.pdf图像特征提取matlab程序.pdf图像特征提取matlab程序.pdf图像特征提取matlab程序.pdf图像特征提取matlab程序.pdf图像特征提取matlab程序.pdf图像特征提取matlab程序.pdf图像特征提取matlab...
  • 图像特征提取技术

    千次阅读 2021-02-02 22:36:32
    基于颜色的特征提取:颜色空间;直方图以及特征提取图像分块;颜色矩; 基于纹理的特征提取:灰度共生矩阵;tamura纹理; 基于深度神经网络的图像处理

    前 言

      图像特征提取属于图像分析的范畴, 是数字图像处理的高级阶段。本文将从理论上介绍对图片进行特征提取的几大角度,这将为后续对图片的向量化表示提供理论支撑~
      特征是某一类对象区别于其他类对象的相应(本质)特点或特性。一定意义上说,特征是通过测量或处理能够抽取的数据。对于图像而言, 每一幅图像都具有能够区别于其他类图像的自身特征,有些是可以直观地感受到的自然特征,如亮度、边缘、纹理和色彩等;有些则是需要通过变换或处理才能得到的, 如矩、直方图以及主成份等。
      须知,特征提取的目的无外乎是为了分类或者聚类,这才是我们的根本目的。

    基于颜色的特征提取

      颜色是图像非常重要的视觉特征,相对于其他特征(比如纹理和形状)而言,颜色的特征非常稳定,对于旋转和平移具有不敏感的特点。基于图像的特征提取,需要关注以下两个问题:(1)颜色空间、(2)颜色特征(直方图)

    (1)颜色空间

      图像的颜色表示可以有很多种方法,在当前,我们接触到的图像几乎都是彩色的,这涉及到颜色空间的含义,比如RGB、HSI空间等。
    在这里插入图片描述
      RGB三种颜色之间存在着高度的相关性(B-R:0.78、R-G:0.98、G-B:0.94),我不是很清楚这种相关性的计算方法,但是可能一般的图像(真正让人类不觉得碍眼的就是那若干种颜色构成的)。RGB颜色空间是一种最为基础的颜色空间,其他颜色空间可以由它而来,比如HSI颜色空间:
    在这里插入图片描述
      由于几种原色之间高度的相关性,这种颜色空间直接作为特征空间的基础是不合适的,因此有了很多种对RGB空间的非线性变化进而消除了部分相关性,但是这些变换在低强度下存在很多问题。

    (2)直方图以及特征提取

      颜色特征的表达最为常见的形式是通过颜色直方图的形式。何为颜色直方图,也就是颜色的比例分布关系,是对一幅图统计关系的表征。下图展示了灰度图像(只有一种称为灰度的颜色属性,灰度的值一般在0~L之间变化,下图是0 ~ 255)的颜色直方图:
    在这里插入图片描述
      有了颜色直方图,就有了对图像颜色的数学特征的表达方法,如何通过直方图计算图像间的相似性呢?这里常用的是一种直方图相交法:设M,N是两个含有K个BIN的直方图,它们的分量分别为M(i),N(i),其中,i=1,2,3,4,….k,则它们相交的距离为:
    在这里插入图片描述
      直方图相交是指两个直方图在每个BIN中共有的像素数目,有时候该值还可以通过除以其中一个直方图中所有的像素数目来实现标准化,从而使其值属于【0,1】范围内,即
    在这里插入图片描述
      对于RGB或者其他颜色空间,是有多个颜色直方图的,每个图都做上述操作,最后加总或者求均值都可以。
      遗憾的是,上述方法很难描述图像的空间信息,但是在前人的摸索中,有了很多带有空间信息的图像颜色表征方案,其基本的思路就是图像分块,而后按照一定的规则应用累加直方图(大多数用到颜色矩的概念):
    在这里插入图片描述
    图像分块的方法也有很多的创新,比如下面这种基于金字塔形的分块方法:
    在这里插入图片描述
    从图像的中心向整个图逐步扩大,而每一个小的子图都可进行颜色矩(或者其他数学属性,比如惯性比等)的计算并构建向量。
      那么,何为颜色矩呢?
    在这里插入图片描述
      当然还有一种比较有趣的将颜色和空间信息杂糅的方法,那就是颜色聚合向量的引入!针对颜色直方图和颜色矩无法表达图像色彩的空间位置,Pass提出图像的颜色聚合向量。将属于直方图每个bin的像素分为两部分,如果该bin内的某些像素所占的连续区域面积大于给定的阈值,则该区域内的像素作为聚合像素,否则为非聚合像素。看起来是一个不错的思路。
      构建出这样一个表示其颜色属性的特征向量之后,就可以使用传统或者深度学习的方法进行分类或者聚类等数据挖掘操作了。

    基于纹理的特征提取

      图像的纹理特征反应了图像本身的属性,但是啥是纹理好像又不是很容易描述?现有的方法主要包括统计的、结构的以及频谱的方法。

    (1)灰度共生矩阵

      灰度共生矩阵是以条件概率提取纹理的特征,探索的是在像素空间的相互关系。下面举个例子:
      左图是一个3x3的单通道像素图,图中的数字1、2、3代表相应的像素值。我们考虑从左到右两个相邻格子的计数,并且在右图的表格中进行统计。
    在这里插入图片描述
      左图中(1,2)相邻的情况出现了一次,那么对应的右表中第1列第2行的格子记为1。再举个例子,左图中(2,2)相邻的情况出现了两次,那么对应的右表中第2列第2行的格子记为2。为了避免大家没弄懂,我再举个例子,左图中(2, 3)相邻的情况一次也没有出现,那么对应的右表中第2列第3行的格子记为0。现在再看灰度矩阵的定义是不是很好理解了?以矩阵中的第一个元素p(1, 1)为例,它代表从左到右(1,1)相邻的次数除以所有矩阵中总次数的频数结果。比如这个(1,1)出现的次数为5,整个矩阵的计数总和为1000,那么这个元素的值就是0.005。
    在这里插入图片描述
      实际上,统计相邻的情况并不局限于从左到右,还包括从上到下,左对角线和右对角线。对于上述矩阵,计算下图所示的若干个统计量
    在这里插入图片描述
    在这里插入图片描述
      现在介绍一下几个统计量在图像中的含义。

    • Angular Second Moment可以用来描述图像中灰度分布的均匀程度和纹理的粗细程度。如果说灰度矩阵中各个元素的值波动不大,那么这个指标的值会比较小,反之则会比较大。如果这个值较大,则纹理比较粗,否则比较细。
    • Correlation是相关性,可以用于描述矩阵元素在行或者列方向上的相关性。如果图像具有某个方向上的纹理,则该方向上的矩阵的该指标的值会比较大。
    • Contrast对比度越大,纹理沟纹较深,图像较为清晰,反之,纹理沟纹较浅,图像较为模糊。
    • Entropy熵。该值越大,说明矩阵中元素值较为分散。如果图像中没有任何纹理,则该值较小。如果图像中的纹理复杂,则该值较大。

      你可以参考这里【Link】获得更多信息。

    (2)tamura纹理

      基于人类对纹理的视觉感知的心理学的研究,Tamura等人提出了纹理特征的表达。Tamura纹理特征的六个分量对应于心理学角度上纹理特征的六种属性,分别是粗糙度(coarseness)、对比度(contrast)、方向度(directionality)、 线像度(linelikeness)、规整度(regularity)和粗略度(roughness)。 原论文【Link

    基于深度神经网络的图像处理

      在另一篇博客里【Link

    2021年2月3日 by hash怪

    展开全文
  • 图像特征提取源码

    2016-10-27 20:38:26
    该压缩包在matlab2013a中运行并实现图像特征提取,包含四大类经典特征提取方法:SIFT特征,颜色特征,形状特征,纹理特征。每个方法文件夹内附有文档说明。最后我给出了同步PPT解说,包含原理,步骤,及运行实例和...
  • OpenCV中图像特征提取与描述

    千次阅读 2022-03-08 20:12:13
    目录图像特征提取与描述图像特征Harris和Shi-Tomas算法Harris角点检测Shi-Tomasi角点检测小结SIFT/SURF算法SIFT原理基本流程尺度空间极值检测关键点定位关键点方向确定关键点描述SURF原理小结Fast和ORB算法Fast...

    图像特征提取与描述

    主要内容是:

    • 图像的特征
    • Harris和Shi-Tomasi算法的原理及角点检测的实现
    • SIFT/SURF算法的原理及使用SIFT/SURF进行关键点的检测方法
    • Fast算法角点检测的原理角及其应用
    • ORB算法的原理,及特征点检测的实现

    图像的特征

    大多数人都玩过拼图游戏。首先拿到完整图像的碎片,然后把这些碎片以正确的方式排列起来从而重建这幅图像。如果把拼图游戏的原理写成计算机程序,那计算机就也会玩拼图游戏了。

    在拼图时,我们要寻找一些唯一的特征,这些特征要适于被跟踪,容易被比较。我们在一副图像中搜索这样的特征,找到它们,而且也能在其他图像中找到这些特征,然后再把它们拼接到一起。我们的这些能力都是天生的。

    那这些特征是什么呢?我们希望这些特征也能被计算机理解。

    如果我们深入的观察一些图像并搜索不同的区域,以下图为例:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CLCQPeEj-1646741526289)(F:\Python学习\129黑马人工智能2.0课程\学习随笔\阶段4计算机视觉与图像处理\图像处理与OpenCV随笔\第十章图像特征提取与描述随笔\笔记图片\image-20191008141826875.png)]

    在图像的上方给出了六个小图。找到这些小图在原始图像中的位置。你能找到多少正确结果呢?

    A 和 B 是平面,而且它们的图像中很多地方都存在。很难找到这些小图的准确位置。

    C 和 D 也很简单。它们是建筑的边缘。可以找到它们的近似位置,但是准确位置还是很难找到。这是因为:沿着边缘,所有的地方都一样。所以边缘是比平面更好的特征,但是还不够好。

    最后 E 和 F 是建筑的一些角点。它们能很容易的被找到。因为在角点的地方,无论你向哪个方向移动小图,结果都会有很大的不同。所以可以把它们当 成一个好的特征。为了更好的理解这个概念我们再举个更简单的例子。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qdUDffVD-1646741526290)(笔记图片/image-20191008141945745.png)]

    如上图所示,蓝色框中的区域是一个平面很难被找到和跟踪。无论向哪个方向移动蓝色框,都是一样的。对于黑色框中的区域,它是一个边缘。如果沿垂直方向移动,它会改变。但是如果沿水平方向移动就不会改变。而红色框中的角点,无论你向那个方向移动,得到的结果都不同,这说明它是唯一的。 所以,我们说角点是一个好的图像特征,也就回答了前面的问题。

    角点是图像很重要的特征,对图像图形的理解和分析有很重要的作用。角点在三维场景重建运动估计,目标跟踪、目标识别、图像配准与匹配等计算机视觉领域起着非常重要的作用。在现实世界中,角点对应于物体的拐角,道路的十字路口、丁字路口等

    那我们怎样找到这些角点呢?接下来我们使用 OpenCV 中的各种算法来查找图像的特征,并对它们进行描述。

    小结:

    图像特征:图像特征要有区分性,容易被比较。一般认为角点,斑点等是较好的图像特征

    特征检测:找到图像中的特征

    特征描述:对特征及其周围的区域进行描述

    Harris和Shi-Tomas算法

    学习目标

    • 理解Harris和Shi-Tomasi算法的原理
    • 能够利用Harris和Shi-Tomasi进行角点检测

    Harris角点检测

    Harris角点检测的思想是通过图像的局部的小窗口观察图像,角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化,如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yOXnbuXc-1646741526291)(笔记图片/image-20191008144647540.png)]

    将上述思想转换为数学形式,即将局部窗口向各个方向移动(u,v)并计算所有灰度差异的总和,表达式如下:

    E ( u , v ) = ∑ x , y w ( x , y ) [ I ( x + u , y + v ) − I ( x , y ) ] 2 E(u, v)=\sum_{x, y} w(x, y)[I(x+u, y+v)-I(x, y)]^{2} E(u,v)=x,yw(x,y)[I(x+u,y+v)I(x,y)]2

    其中I(x,y)是局部窗口的图像灰度,I(x+u,y+v)是平移后的图像灰度,w(x,y)是窗口函数,该可以是矩形窗口,也可以是对每一个像素赋予不同权重的高斯窗口,如下所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M5t4GaIT-1646741526291)(笔记图片/image-20191008153014984.png)]在这里插入图片描述

    角点检测中使E(u,v)的值最大。利用一阶泰勒展开有:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9BCm4U3s-1646741526292)(笔记图片/image-20220308154736341.png)]

    其中Ix和 Iy是沿x和y方向的导数,可用sobel算子计算。

    推导如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TxnKqc3x-1646741526293)(笔记图片/image-20191015180016665.png)]

    M矩阵决定了E(u,v)的取值,下面我们利用M来求角点,M是Ix和Iy的二次项函数,可以表示成椭圆的形状,椭圆的长短半轴由M的特征值λ1和λ2决定,方向由特征矢量决定,如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-57t0gy3p-1646741526293)(笔记图片/image-20191008160908338.png)]

    椭圆函数特征值与图像中的角点、直线(边缘)和平面之间的关系如下图所示。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fYSghOel-1646741526294)(笔记图片/image-20191008161040473.png)]

    共可分为三种情况:

    • 图像中的直线。一个特征值大,另一个特征值小,λ1>>λ2或 λ2>>λ1。椭圆函数值在某一方向上大,在其他方向上小。
    • 图像中的平面。两个特征值都小,且近似相等;椭圆函数数值在各个方向上都小。
    • 图像中的角点。两个特征值都大,且近似相等,椭圆函数在所有方向都增大

    Harris给出的角点计算方法并不需要计算具体的特征值,而是计算一个角点响应值R来判断角点。R的计算公式为:

    R = det ⁡ M − α (  trace  M ) 2 R=\operatorname{det} M-\alpha(\text { trace } M)^{2} R=detMα( trace M)2

    式中,detM为矩阵M的行列式;traceM为矩阵M的迹;α为常数,取值范围为0.04~0.06。事实上,特征是隐含在detM和traceM中,因为:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EPP9DF8O-1646741526295)(笔记图片/image-20191015181643847.png)]

    那我们怎么判断角点呢?如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fnymxFOo-1646741526296)(笔记图片/image-20191008161904372.png)]

    • 当R为大数值的正数时是角点
    • 当R为大数值的负数时是边界
    • 当R为小数是认为是平坦区域

    在OpenCV中实现Hariis检测使用的API是:

    dst=cv.cornerHarris(src, blockSize, ksize, k)
    

    参数:

    • img:数据类型为 float32 的输入图像。
    • blockSize:角点检测中要考虑的邻域大小。
    • ksize:sobel求导使用的核大小
    • k :角点检测方程中的自由参数,取值参数为 [0.04,0.06].
    import cv2 as cv
    import numpy as np 
    import matplotlib.pyplot as plt
    # 1 读取图像,并转换成灰度图像
    img = cv.imread('./image/chessboard.jpg')
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    # 2 角点检测
    # 2.1 输入图像必须是 float32
    gray = np.float32(gray)
    
    # 2.2 最后一个参数在 0.04 到 0.05 之间
    dst = cv.cornerHarris(gray,2,3,0.04)
    # 3 设置阈值,将角点绘制出来,阈值根据图像进行选择
    img[dst>0.001*dst.max()] = [0,0,255]
    # 4 图像显示
    plt.figure(figsize=(10,8),dpi=100)
    plt.imshow(img[:,:,::-1]),plt.title('Harris角点检测')
    plt.xticks([]), plt.yticks([])
    plt.show()
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aejrQNvt-1646741526297)(笔记图片/image-20191008164344988.png)]

    Harris角点检测的优缺点:

    优点:

    • 旋转不变性,椭圆转过一定角度但是其形状保持不变(特征值保持不变)
    • 对于图像灰度的仿射变化具有部分的不变性,由于仅仅使用了图像的一介导数,对于图像灰度平移变化不变;对于图像灰度尺度变化不变

    缺点:

    • 对尺度很敏感,不具备几何尺度不变性。
    • 提取的角点是像素级的

    Shi-Tomasi角点检测

    Shi-Tomasi算法是对Harris角点检测算法的改进,一般会比Harris算法得到更好的角点。Harris 算法的角点响应函数是将矩阵 M 的行列式值与 M 的迹相减,利用差值判断是否为角点。后来Shi 和Tomasi 提出改进的方法是,若矩阵M的两个特征值中较小的一个大于阈值,则认为他是角点,即:

    R = min ⁡ ( λ 1 , λ 2 ) R=\min \left(\lambda_{1}, \lambda_{2}\right) R=min(λ1,λ2)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DFUZEQdN-1646741526298)(笔记图片/image-20191008171309192.png)]

    从这幅图中,可以看出来只有当 λ1 和 λ 2 都大于最小值时,才被认为是角点。

    在OpenCV中实现Shi-Tomasi角点检测使用API:

    corners = cv2.goodFeaturesToTrack ( image, maxcorners, qualityLevel, minDistance )
    

    参数:

    • Image: 输入灰度图像
    • maxCorners : 获取角点数的数目。
    • qualityLevel:该参数指出最低可接受的角点质量水平,在0-1之间。
    • minDistance:角点之间最小的欧式距离,避免得到相邻特征点。

    返回:

    • Corners: 搜索到的角点,在这里所有低于质量水平的角点被排除掉,然后把合格的角点按质量排序,然后将质量较好的角点附近(小于最小欧式距离)的角点删掉,最后找到maxCorners个角点返回。
    import numpy as np 
    import cv2 as cv
    import matplotlib.pyplot as plt
    # 1 读取图像
    img = cv.imread('./image/tv.jpg') 
    gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    # 2 角点检测
    corners = cv.goodFeaturesToTrack(gray,1000,0.01,10)  
    # 3 绘制角点
    for i in corners:
        x,y = i.ravel()
        cv.circle(img,(x,y),2,(0,0,255),-1)
    # 4 图像展示
    plt.figure(figsize=(10,8),dpi=100)
    plt.imshow(img[:,:,::-1]),plt.title('shi-tomasi角点检测')
    plt.xticks([]), plt.yticks([])
    plt.show()
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-62FemMhq-1646741526299)(笔记图片/image-20191008174257711.png)]

    小结

    1. Harris算法

      思想:通过图像的局部的小窗口观察图像,角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化。

      API: cv.cornerHarris()

    2. Shi-Tomasi算法

      对Harris算法的改进,能够更好地检测角点

      API: cv2.goodFeatureToTrack()

    SIFT/SURF算法

    学习目标

    • 理解SIFT/SURF算法的原理,
    • 能够使用SIFT/SURF进行关键点的检测

    SIFT原理

    前面两节我们介绍了Harris和Shi-Tomasi角点检测算法,这两种算法具有旋转不变性,但不具有尺度不变性,以下图为例,在左侧小图中可以检测到角点,但是图像被放大后,在使用同样的窗口,就检测不到角点了。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C7BkR9K6-1646741526300)(笔记图片/image-20191008181535222.png)]

    所以,下面我们来介绍一种计算机视觉的算法,尺度不变特征转换即SIFT (Scale-invariant feature transform)。它用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。应用范围包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对等领域。

    SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。

    基本流程

    Lowe将SIFT算法分解为如下四步

    1. 尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯差分函数来识别潜在的对于尺度和旋转不变的关键点。
    2. 关键点定位:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。
    3. 关键点方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而保证了对于这些变换的不变性。
    4. 关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度作为关键点的描述符,它允许比较大的局部形状的变形或光照变化。

    我们就沿着Lowe的步骤,对SIFT算法的实现过程进行介绍:

    尺度空间极值检测

    在不同的尺度空间是不能使用相同的窗口检测极值点,对小的关键点使用小的窗口,对大的关键点使用大的窗口,为了达到上述目的,我们使用尺度空间滤波器。

    高斯核是唯一可以产生多尺度空间的核函数。-《Scale-space theory: A basic tool for analysing structures at different scales》。

    一个图像的尺度空间L(x,y,σ),定义为原始图像I(x,y)与一个可变尺度的2维高斯函数G(x,y,σ)卷积运算 ,即:

    L ( x , y , σ ) = G ( x , y , σ ) ∗ I ( x , y ) L(x, y, \sigma)=G(x, y, \sigma) * I(x, y) L(x,y,σ)=G(x,y,σ)I(x,y)

    其中:

    G ( x , y , σ ) = 1 2 π σ 2 e − x 2 + y 2 2 σ 2 G(x, y, \sigma)=\frac{1}{2 \pi \sigma^{2}} e^{-\frac{x^{2}+y^{2}}{2 \sigma^{2}}} G(x,y,σ)=2πσ21e2σ2x2+y2

    σ是尺度空间因子,它决定了图像的模糊的程度。在大尺度下(σ值大)表现的是图像的概貌信息,在小尺度下(σ值小)表现的是图像的细节信息。

    在计算高斯函数的离散近似时,在大概3σ距离之外的像素都可以看作不起作用,这些像素的计算也就可以忽略。所以,在实际应用中,只计算**(6σ+1)*(6σ+1)**的高斯卷积核就可以保证相关像素影响。

    下面我们构建图像的高斯金字塔,它采用高斯函数对图像进行模糊以及降采样处理得到的,高斯金字塔构建过程中,首先将图像扩大一倍,在扩大的图像的基础之上构建高斯金字塔,然后对该尺寸下图像进行高斯模糊,几幅模糊之后的图像集合构成了一个Octave,然后对该Octave下选择一幅图像进行下采样,长和宽分别缩短一倍,图像面积变为原来四分之一。这幅图像就是下一个Octave的初始图像,在初始图像的基础上完成属于这个Octave的高斯模糊处理,以此类推完成整个算法所需要的所有八度构建,这样这个高斯金字塔就构建出来了,整个流程如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c06QPKDP-1646741526300)(笔记图片/image-20191009110944907.png)]

    利用LoG(高斯拉普拉斯方法),即图像的二阶导数,可以在不同的尺度下检测图像的关键点信息,从而确定图像的特征点。但LoG的计算量大,效率低。所以我们通过两个相邻高斯尺度空间的图像的相减,得到DoG(高斯差分)来近似LoG。

    为了计算DoG我们构建高斯差分金字塔,该金字塔是在上述的高斯金字塔的基础上构建而成的,建立过程是:在高斯金字塔中每个Octave中相邻两层相减就构成了高斯差分金字塔。如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xuIzxCn4-1646741526300)(笔记图片/image-20191009113953721.png)]

    高斯差分金字塔的第1组第1层是由高斯金字塔的第1组第2层减第1组第1层得到的。以此类推,逐组逐层生成每一个差分图像,所有差分图像构成差分金字塔。概括为DOG金字塔的第o组第l层图像是有高斯金字塔的第o组第l+1层减第o组第l层得到的。后续Sift特征点的提取都是在DOG金字塔上进行的

    在 DoG 搞定之后,就可以在不同的尺度空间中搜索局部最大值了。对于图像中的一个像素点而言,它需要与自己周围的 8 邻域,以及尺度空间中上下两层中的相邻的 18(2x9)个点相比。如果是局部最大值,它就可能是一个关键点。基本上来说关键点是图像在相应尺度空间中的最好代表。如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YUry630u-1646741526301)(笔记图片/image-20191009115023016.png)]

    搜索过程从每组的第二层开始,以第二层为当前层,对第二层的DoG图像中的每个点取一个3×3的立方体,立方体上下层为第一层与第三层。这样,搜索得到的极值点既有位置坐标(DoG的图像坐标),又有空间尺度坐标(层坐标)。当第二层搜索完成后,再以第三层作为当前层,其过程与第二层的搜索类似。当S=3时,每组里面要搜索3层,所以在DOG中就有S+2层,在初使构建的金字塔中每组有S+3层。

    关键点定位

    由于DoG对噪声和边缘比较敏感,因此在上面高斯差分金字塔中检测到的局部极值点需经过进一步的检验才能精确定位为特征点。

    使用尺度空间的泰勒级数展开来获得极值的准确位置, 如果极值点的 灰度值小于阈值(一般为0.03或0.04)就会被忽略掉。 在 OpenCV 中这种阈值被称为 contrastThreshold。

    DoG 算法对边界非常敏感, 所以我们必须要把边界去除。 Harris 算法除了可以用于角点检测之外还可以用于检测边界。从 Harris 角点检测的算法中,当一个特征值远远大于另外一个特征值时检测到的是边界。那在DoG算法中欠佳的关键点在平行边缘的方向有较大的主曲率,而在垂直于边缘的方向有较小的曲率,两者的比值如果高于某个阈值(在OpenCV中叫做边界阈值),就认为该关键点为边界,将被忽略,一般将该阈值设置为10。

    将低对比度和边界的关键点去除,得到的就是我们感兴趣的关键点。

    关键点方向确定

    经过上述两个步骤,图像的关键点就完全找到了,这些关键点具有尺度不变性。为了实现旋转不变性,还需要为每个关键点分配一个方向角度,也就是根据检测到的关键点所在高斯尺度图像的邻域结构中求得一个方向基准。

    对于任一关键点,我们采集其所在高斯金字塔图像以r为半径的区域内所有像素的梯度特征(幅值和幅角),半径r为: r = 3 × 1.5 σ r = 3\times1.5\sigma r=3×1.5σ

    其中σ是关键点所在octave的图像的尺度,可以得到对应的尺度图像。

    梯度的幅值和方向的计算公式为:

    m ( x , y ) = ( L ( x + 1 , y ) − L ( x − 1 , y ) 2 + ( L ( x , y + 1 ) − L ( x , y − 1 ) ) 2 θ ( x , y ) = arctan ⁡ ( L ( x , y + 1 ) − L ( x , y − 1 ) L ( x + 1 , y ) − L ( x − 1 ) , y ) \begin{array}{c} m(x, y)=\sqrt{\left(L(x+1, y)-L(x-1, y)^{2}+(L(x, y+1)-L(x, y-1))^{2}\right.} \\ \theta(x, y)=\arctan \left(\frac{L(x, y+1)-L(x, y-1)}{L(x+1, y)-L(x-1), y}\right) \end{array} m(x,y)=(L(x+1,y)L(x1,y)2+(L(x,y+1)L(x,y1))2 θ(x,y)=arctan(L(x+1,y)L(x1),yL(x,y+1)L(x,y1))

    邻域像素梯度的计算结果如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YXDeXyta-1646741526302)(笔记图片/image-20191009143818527.png)]

    完成关键点梯度计算后,使用直方图统计关键点邻域内像素的梯度幅值和方向。具体做法是,将360°分为36柱,每10°为一柱,然后在以r为半径的区域内,将梯度方向在某一个柱内的像素找出来,然后将他们的幅值相加在一起作为柱的高度。因为在r为半径的区域内像素的梯度幅值对中心像素的贡献是不同的,因此还需要对幅值进行加权处理,采用高斯加权,方差为1.5σ。如下图所示,为简化图中只画了8个方向的直方图。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aOMVF0Lf-1646741526303)(笔记图片/image-20191009144726492.png)]

    每个特征点必须分配一个主方向,还需要一个或多个辅方向,增加辅方向的目的是为了增强图像匹配的鲁棒性。辅方向的定义是,当一个柱体的高度大于主方向柱体高度的80%时,则该柱体所代表的的方向就是给特征点的辅方向。

    直方图的峰值,即最高的柱代表的方向是特征点邻域范围内图像梯度的主方向,但该柱体代表的角度是一个范围,所以我们还要对离散的直方图进行插值拟合,以得到更精确的方向角度值。利用抛物线对离散的直方图进行拟合,如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tvI16CIU-1646741526304)(笔记图片/image-20191009150008701.png)]

    获得图像关键点主方向后,每个关键点有三个信息(x,y,σ,θ):位置、尺度、方向。由此我们可以确定一个SIFT特征区域。通常使用一个带箭头的圆或直接使用箭头表示SIFT区域的三个值:中心表示特征点位置,半径表示关键点尺度,箭头表示方向。如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SSSjCByR-1646741526304)(笔记图片/image-20191025112522974.png)]

    关键点描述

    通过以上步骤,每个关键点就被分配了位置,尺度和方向信息。接下来我们为每个关键点建立一个描述符,该描述符既具有可区分性,又具有对某些变量的不变性,如光照,视角等。而且描述符不仅仅包含关键点,也包括关键点周围对其有贡献的的像素点。主要思路就是通过将关键点周围图像区域分块,计算块内的梯度直方图,生成具有特征向量,对图像信息进行抽象。

    描述符与特征点所在的尺度有关,所以我们在关键点所在的高斯尺度图像上生成对应的描述符。以特征点为中心,将其附近邻域划分为d∗d个子区域(一般取d=4),每个子区域都是一个正方形,边长为3σ,考虑到实际计算时,需进行三次线性插值,所以特征点邻域的为 3 σ ( d + 1 ) ∗ 3 σ ( d + 1 ) 3\sigma(d+1)*3\sigma(d+1) 3σ(d+1)3σ(d+1)的范围,如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UeUD2iKa-1646741526305)(笔记图片/image-20191009161647267.png)]

    为了保证特征点的旋转不变性,以特征点为中心,将坐标轴旋转为关键点的主方向,如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6UiLjK3u-1646741526305)(笔记图片/image-20191009161756423.png)]

    计算子区域内的像素的梯度,并按照σ=0.5d进行高斯加权,然后插值计算得到每个种子点的八个方向的梯度,插值方法如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-41V1IvNb-1646741526305)(笔记图片/image-20191009162914982.png)]

    每个种子点的梯度都是由覆盖其的4个子区域插值而得的。如图中的红色点,落在第0行和第1行之间,对这两行都有贡献。对第0行第3列种子点的贡献因子为dr,对第1行第3列的贡献因子为1-dr,同理,对邻近两列的贡献因子为dc和1-dc,对邻近两个方向的贡献因子为do和1-do。则最终累加在每个方向上的梯度大小为:  weight  = w ∗ d r k ( 1 − d r ) ( 1 − k ) d c m ( 1 − d c ) 1 − m d o n ( 1 − d o ) 1 − n \text { weight }=w * d r^{k}(1-d r)^{(1-k)} d c^{m}(1-d c)^{1-m} d o^{n}(1-d o)^{1-n}  weight =wdrk(1dr)(1k)dcm(1dc)1mdon(1do)1n

    其中k,m,n为0或为1。 如上统计4∗4∗8=128个梯度信息即为该关键点的特征向量,按照特征点的对每个关键点的特征向量进行排序,就得到了SIFT特征描述向量。

    小结:SIFT在图像的不变特征提取方面拥有无与伦比的优势,但并不完美,仍然存在实时性不高,有时特征点较少,对边缘光滑的目标无法准确提取特征点等缺陷,自SIFT算法问世以来,人们就一直对其进行优化和改进,其中最著名的就是SURF算法。

    SURF原理

    使用 SIFT 算法进行关键点检测和描述的执行速度比较慢, 需要速度更快的算法。 2006 年 Bay提出了 SURF 算法,是SIFT算法的增强版,它的计算量小,运算速度快,提取的特征与SIFT几乎相同,将其与SIFT算法对比如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RRi3cHRM-1646741526306)(笔记图片/image-20191016163330835.png)]

    在OpenCV中利用SIFT检测关键点的流程如下所示:

    实例化sift

    sift = cv.xfeatures2d.SIFT_create()
    

    利用sift.detectAndCompute()检测关键点并计算

    kp,des = sift.detectAndCompute(gray,None)
    

    参数:

    • gray: 进行关键点检测的图像,注意是灰度图像

    返回:

    • kp: 关键点信息,包括位置,尺度,方向信息
    • des: 关键点描述符,每个关键点对应128个梯度信息的特征向量

    将关键点检测结果绘制在图像上

    cv.drawKeypoints(image, keypoints, outputimage, color, flags)
    

    参数:

    • image: 原始图像
    • keypoints:关键点信息,将其绘制在图像上
    • outputimage:输出图片,可以是原始图像
    • color:颜色设置,通过修改(b,g,r)的值,更改画笔的颜色,b=蓝色,g=绿色,r=红色。
    • flags:绘图功能的标识设置
      1. cv2.DRAW_MATCHES_FLAGS_DEFAULT:创建输出图像矩阵,使用现存的输出图像绘制匹配对和特征点,对每一个关键点只绘制中间点
      2. cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:不创建输出图像矩阵,而是在输出图像上绘制匹配对
      3. cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:对每一个特征点绘制带大小和方向的关键点图形
      4. cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS:单点的特征点不被绘制

    SURF算法的应用与上述流程是一致,这里就不在赘述。

    利用SIFT算法在中央电视台的图片上检测关键点,并将其绘制出来:

    import cv2 as cv 
    import numpy as np
    import matplotlib.pyplot as plt
    # 1 读取图像
    img = cv.imread('./image/tv.jpg')
    gray= cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    # 2 sift关键点检测
    # 2.1 实例化sift对象
    sift = cv.xfeatures2d.SIFT_create()
    
    # 2.2 关键点检测:kp关键点信息包括方向,尺度,位置信息,des是关键点的描述符
    kp,des=sift.detectAndCompute(gray,None)
    # 2.3 在图像上绘制关键点的检测结果
    cv.drawKeypoints(img,kp,img,flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    # 3 图像显示
    plt.figure(figsize=(8,6),dpi=100)
    plt.imshow(img[:,:,::-1]),plt.title('sift检测')
    plt.xticks([]), plt.yticks([])
    plt.show()
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yJhRF91M-1646741526306)(笔记图片/image-20191009181525538.png)]

    小结

    SIFT原理:

    • 尺度空间极值检测:构建高斯金字塔,高斯差分金字塔,检测极值点。
    • 关键点定位:去除对比度较小和边缘对极值点的影响。
    • 关键点方向确定:利用梯度直方图确定关键点的方向。
    • 关键点描述:对关键点周围图像区域分块,计算块内的梯度直方图,生成具有特征向量,对关键点信息进行描述。

    API:cv.xfeatures2d.SIFT_create()

    SURF算法:

    对SIFT算法的改进,在尺度空间极值检测,关键点方向确定,关键点描述方面都有改进,提高效率

    Fast和ORB算法

    学习目标

    • 理解Fast算法角点检测的原理,能够完成角点检测
    • 理解ORB算法的原理,能够完成特征点检测

    Fast算法

    我们前面已经介绍过几个特征检测器,它们的效果都很好,特别是SIFT和SURF算法,但是从实时处理的角度来看,效率还是太低了。为了解决这个问题,Edward Rosten和Tom Drummond在2006年提出了FAST算法,并在2010年对其进行了修正。

    FAST (全称Features from accelerated segment test)是一种用于角点检测的算法,该算法的原理是取图像中检测点,以该点为圆心的周围邻域内像素点判断检测点是否为角点,通俗的讲就是若一个像素周围有一定数量的像素与该点像素值不同,则认为其为角点

    FAST算法的基本流程

    1. 在图像中选取一个像素点 p,来判断它是不是关键点。Ip等于像素点 p的灰度值。
    2. 以r为半径画圆,覆盖p点周围的M个像素,通常情狂下,设置 r=3,则 M=16,如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TYSKKj1R-1646741526307)(笔记图片/image17.jpg)]

    1. 设置一个阈值t,如果在这 16 个像素点中存在 n 个连续像素点的灰度值都高于Ip + t,或者低于Ip - t,那么像素点 p 就被认为是一个角点。如上图中的虚线所示,n 一般取值为 12。

    2. 由于在检测特征点时是需要对图像中所有的像素点进行检测,然而图像中的绝大多数点都不是特征点,如果对每个像素点都进行上述的检测过程,那显然会浪费许多时间,因此采用一种进行非特征点判别的方法:首先对候选点的周围每个 90 度的点:1,9,5,13 进行测试(先测试 1 和 19, 如果它们符合阈值要求再测试 5 和 13)。如果 p 是角点,那么这四个点中至少有 3 个要符合阈值要求,否则直接剔除。对保留下来的点再继续进行测试(是否有 12 的点符合阈值要求)。

    虽然这个检测器的效率很高,但它有以下几条缺点:

    • 获得的候选点比较多
    • 特征点的选取不是最优的,因为它的效果取决与要解决的问题和角点的分布情况。
    • 进行非特征点判别时大量的点被丢弃
    • 检测到的很多特征点都是相邻的

    前 3 个问题可以通过机器学习的方法解决,最后一个问题可以使用非最大值抑制的方法解决。

    机器学习的角点检测器

    1. 选择一组训练图片(最好是跟最后应用相关的图片)
    2. 使用 FAST 算法找出每幅图像的特征点,对图像中的每一个特征点,将其周围的 16 个像素存储构成一个向量P。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2wDQSEL8-1646741526308)(笔记图片/image-20191010114459269.png)]

    1. 每一个特征点的 16 像素点都属于下列三类中的一种

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yTXjYytT-1646741526308)(笔记图片/image18.jpg)]

    1. 根据这些像素点的分类,特征向量 P 也被分为 3 个子集:Pd ,Ps ,Pb,

    2. 定义一个新的布尔变量Kp,如果 p 是角点就设置为 Ture,如果不是就设置为 False。

    3. 利用特征值向量p,目标值是 K p K_p Kp,训练ID3 树(决策树分类器)。

    4. 将构建好的决策树运用于其他图像的快速的检测。

    非极大值抑制

    在筛选出来的候选角点中有很多是紧挨在一起的,需要通过非极大值抑制来消除这种影响。

    为所有的候选角点都确定一个打分函数V , V的值可这样计算:先分别计算Ip与圆上16个点的像素值差值,取绝对值,再将这16个绝对值相加,就得到了V的值 V = ∑ i 16 ∣ I p − I i ∣ V=\sum_{i}^{16}\left|I_{p}-I_{i}\right| V=i16IpIi

    最后比较毗邻候选角点的 V 值,把V值较小的候选角点pass掉。

    FAST算法的思想与我们对角点的直观认识非常接近,化繁为简。FAST算法比其它角点的检测算法快,但是在噪声较高时不够稳定,这需要设置合适的阈值。

    OpenCV中的FAST检测算法是用传统方法实现的,

    实例化fast

    fast = =cv.FastFeatureDetector_create( threshold, nonmaxSuppression)
    

    参数:

    • threshold:阈值t,有默认值10
    • nonmaxSuppression:是否进行非极大值抑制,默认值True

    返回:

    • Fast:创建的FastFeatureDetector对象

    利用fast.detect检测关键点,没有对应的关键点描述

    kp = fast.detect(grayImg, None)
    

    参数:

    • gray: 进行关键点检测的图像,注意是灰度图像

    返回:

    • kp: 关键点信息,包括位置,尺度,方向信息

    将关键点检测结果绘制在图像上,与在sift中是一样的

    cv.drawKeypoints(image, keypoints, outputimage, color, flags)
    

    示例:

    import numpy as np
    import cv2 as cv
    from matplotlib import pyplot as plt
    # 1 读取图像
    img = cv.imread('./image/tv.jpg')
    # 2 Fast角点检测
    # 2.1 创建一个Fast对象,传入阈值,注意:可以处理彩色空间图像
    fast = cv.FastFeatureDetector_create(threshold=30)
    
    # 2.2 检测图像上的关键点
    kp = fast.detect(img,None)
    # 2.3 在图像上绘制关键点
    img2 = cv.drawKeypoints(img, kp, None, color=(0,0,255))
    
    # 2.4 输出默认参数
    print( "Threshold: {}".format(fast.getThreshold()) )
    print( "nonmaxSuppression:{}".format(fast.getNonmaxSuppression()) )
    print( "neighborhood: {}".format(fast.getType()) )
    print( "Total Keypoints with nonmaxSuppression: {}".format(len(kp)) )
    
    
    # 2.5 关闭非极大值抑制
    fast.setNonmaxSuppression(0)
    kp = fast.detect(img,None)
    
    print( "Total Keypoints without nonmaxSuppression: {}".format(len(kp)) )
    # 2.6 绘制为进行非极大值抑制的结果
    img3 = cv.drawKeypoints(img, kp, None, color=(0,0,255))
    
    # 3 绘制图像
    fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
    axes[0].imshow(img2[:,:,::-1])
    axes[0].set_title("加入非极大值抑制")
    axes[1].imshow(img3[:,:,::-1])
    axes[1].set_title("未加入非极大值抑制")
    plt.show()
    

    结果:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VI81ALuY-1646741526309)(笔记图片/image-20191010120822413.png)]

    ORB 算法

    SIFT和SURF算法是受专利保护的,在使用他们时我们是要付费的,但是ORB(Oriented Fast and Rotated Brief)不需要,它可以用来对图像中的关键点快速创建特征向量,并用这些特征向量来识别图像中的对象。

    ORB算法流程

    ORB算法结合了Fast和Brief算法,提出了构造金字塔,为Fast特征点添加了方向,从而使得关键点具有了尺度不变性和旋转不变性。具体流程描述如下:

    • 构造尺度金字塔,金字塔共有n层,与SIFT不同的是,每一层仅有一幅图像。第s层的尺度为: σ s = σ 0 s \sigma_{s}=\sigma_{0}^{s} σs=σ0s

    σ0是初始尺度,默认为1.2,原图在第0层。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WESFnY8x-1646741526309)(笔记图片/image-20191010145652681.png)]

    第s层图像的大小: S I Z E = ( H ∗ 1 σ s ) × ( W ∗ 1 σ s ) S I Z E=\left(H * \frac{1}{\sigma_{s}}\right) \times\left(W * \frac{1}{\sigma_{s}}\right) SIZE=(Hσs1)×(Wσs1)

    • 在不同的尺度上利用Fast算法检测特征点,采用Harris角点响应函数,根据角点的响应值排序,选取前N个特征点,作为本尺度的特征点。
    • 计算特征点的主方向,计算以特征点为圆心半径为r的圆形邻域内的灰度质心位置,将从特征点位置到质心位置的方向做特征点的主方向。

    计算方法如下:

    m p q = ∑ x , y x p y q I ( x , y ) m_{p q}=\sum_{x, y} x^{p} y^{q} I(x, y) mpq=x,yxpyqI(x,y)

    质心位置:

    C = ( m 10 m 00 , m 01 m 10 ) C=\left(\frac{m_{10}}{m_{00}}, \frac{m_{01}}{m_{10}}\right) C=(m00m10,m10m01)

    主方向:

    θ = arctan ⁡ ( m 01 , m 10 ) \theta=\arctan \left(m_{01}, m_{10}\right) θ=arctan(m01,m10)

    • 为了解决旋转不变性,将特征点的邻域旋转到主方向上利用Brief算法构建特征描述符,至此就得到了ORB的特征描述向量。

    BRIEF算法

    BRIEF是一种特征描述子提取算法,并非特征点的提取算法,一种生成二值化描述子的算法,不提取代价低,匹配只需要使用简单的汉明距离(Hamming Distance)利用比特之间的异或操作就可以完成。因此,时间代价低,空间代价低,效果还挺好是最大的优点。

    算法的步骤介绍如下

    1. 图像滤波:原始图像中存在噪声时,会对结果产生影响,所以需要对图像进行滤波,去除部分噪声。
    2. 选取点对:以特征点为中心,取S*S的邻域窗口,在窗口内随机选取N组点对,一般N=128,256,512,默认是256,关于如何选取随机点对,提供了五种形式,结果如下图所示:
      • x,y方向平均分布采样
      • x,y均服从Gauss(0,S^2/25)各向同性采样
      • x服从Gauss(0,S2/25),y服从Gauss(0,S2/100)采样
      • x,y从网格中随机获取
      • x一直在(0,0),y从网格中随机选取

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FLtmsLBb-1646741526309)(笔记图片/image-20191010153907973.png)]

    图中一条线段的两个端点就是一组点对,其中第二种方法的结果比较好。

    1. 构建描述符:假设x,y是某个点对的两个端点,p(x),p(y)是两点对应的像素值,则有:

    t ( x , y ) = { 1  ifp  ( x ) > p ( y ) 0  else  t(x, y)=\left\{\begin{array}{ll} 1 & \text { ifp }(x)>p(y) \\ 0 & \text { else } \end{array}\right. t(x,y)={10 ifp (x)>p(y) else 

    对每一个点对都进行上述的二进制赋值,形成BRIEF的关键点的描述特征向量,该向量一般为 128-512 位的字符串,其中仅包含 1 和 0,如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JzWKr10y-1646741526310)(笔记图片/image-20191010161944491.png)]

    在OPenCV中实现ORB算法,使用的是:

    实例化ORB

    orb = cv.xfeatures2d.orb_create(nfeatures)
    

    参数:

    • nfeatures: 特征点的最大数量

    利用orb.detectAndCompute()检测关键点并计算

    kp,des = orb.detectAndCompute(gray,None)
    

    参数:

    • gray: 进行关键点检测的图像,注意是灰度图像

    返回:

    • kp: 关键点信息,包括位置,尺度,方向信息
    • des: 关键点描述符,每个关键点BRIEF特征向量,二进制字符串,

    将关键点检测结果绘制在图像上

    cv.drawKeypoints(image, keypoints, outputimage, color, flags)
    

    示例:

    import numpy as np
    import cv2 as cv
    from matplotlib import pyplot as plt
    # 1 图像读取
    img = cv.imread('./image/tv.jpg')
    
    # 2 ORB角点检测
    # 2.1 实例化ORB对象
    orb = cv.ORB_create(nfeatures=500)
    # 2.2 检测关键点,并计算特征描述符
    kp,des = orb.detectAndCompute(img,None)
    
    print(des.shape)
    
    # 3 将关键点绘制在图像上
    img2 = cv.drawKeypoints(img, kp, None, color=(0,0,255), flags=0)
    
    # 4. 绘制图像
    plt.figure(figsize=(10,8),dpi=100)
    plt.imshow(img2[:,:,::-1])
    plt.xticks([]), plt.yticks([])
    plt.show()
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qMz0QrHm-1646741526310)(笔记图片/image-20191010162532196.png)]

    小结

    1. Fast算法

      原理:若一个像素周围有一定数量的像素与该点像素值不同,则认为其为角点

      API: cv.FastFeatureDetector_create()

    2. ORB算法

      原理:是FAST算法和BRIEF算法的结合

      API:cv.ORB_create()

    LBP和HOG特征算子

    学习目标

    1. 了解LBP特征的原理
    2. 了解LBP的改进算法:圆形LBP,旋转LBP和等价模式
    3. 了解HOG算法的原理
    4. 熟悉灰度图像的γ变换
    5. 了解HOG特征的提取流程
    6. 了解LBP特征的提取方法
    7. 了解HOG特征的提取方法

    LBP算法

    LBP(Local Binary Pattern)指局部二值模式,是一种用来描述图像局部特征的算子,LBP特征具有灰度不变性和旋转不变性等显著优点。它是由T. Ojala, M.Pietikäinen, 和 D. Harwood在1994年提出,由于LBP特征计算简单、效果较好,因此LBP特征在计算机视觉的许多领域都得到了广泛的应用。

    LBP特征描述

    原始的LBP算子定义为在 3 ∗ 3 3*3 33的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样, 3 ∗ 3 3*3 33邻域内的8个点经比较可产生8位二进制数(通常转换为十进制数即LBP码,共256种),即得到该窗口中心像素点的LBP值,并用这个值来反映该区域的纹理信息。如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JmPkmNhY-1646741526310)(笔记图片/image-20191107142559806.png)]

    LBP值是从左上角像素,顺时针旋转得到的结果,如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tAmfA7Wq-1646741526311)(笔记图片/image-20191107142804781.png)]

    用公式来进行定义如下所示: L B P ( x c , y c ) = ∑ p = 0 p − 1 2 p s ( i p − i c ) L B P\left(x_{c}, y_{c}\right)=\sum_{p=0}^{p-1} 2^{p} s\left(i_{p}-i_{c}\right) LBP(xc,yc)=p=0p12ps(ipic)

    其中,(xc,yc)表示 3 ∗ 3 3*3 33邻域内的中心元素,它的像素值为ic,ip代表邻域内其他像素的值。s(x)是符号函数,定义如下:

    对于一幅大小为W∗H 的图像,因为边缘的像素无法计算8位的LBP值,所以将LBP值转换为灰度图像时,它的大小是(W-2)*(H-2)。

    LBP算子利用了周围点与该点的关系对该点进行量化。量化后可以更有效地消除光照对图像的影响。只要光照的变化不足以改变两个点像素值之间的大小关系,那么LBP算子的值不会发生变化,**所以一定程度上,基于LBP的识别算法解决了光照变化的问题,**但是当图像光照变化不均匀时,各像素间的大小关系被破坏,对应的LBP模式也就发生了变化。

    原始的LBP提出后,研究人员不断对其提出了各种改进和优化。

    圆形LBP算子

    原始LBP特征使用的是固定邻域内的灰度值,当图像的尺度发生变化时,LBP特征的编码将会发生变换,LBP特征将不能正确的反映像素点周围的纹理信息,因此研究人员对其进行了改进。基本的 LBP 算子的最大缺陷在于它只覆盖了一个固定半径范围内的小区域,只局限在3*3的邻域内,对于较大图像大尺度的结构不能很好的提取需要的纹理特征,因此研究者们对LBP算子进行了扩展。

    新的LBP算子 L B P p R LBP_{p}^{R} LBPpR计算不同半径邻域大小和不同像素点数的特征值,其中P表示周围像素点个数,R表示邻域半径,同时把原来的方形邻域扩展到了圆形,下图给出了三种扩展后的LBP例子,其中,R可以是小数:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WUNVwjNP-1646741526312)(笔记图片/image-20191107144658710.png)]

    对于没有落到整数位置的点,根据轨道内离其最近的两个整数位置像素灰度值,利用双线性插值的方法可以计算它的灰度值。

    该算子的计算公式与原始的LBP描述算子计算方法相同,区别在邻域的选择上。

    旋转不变LBP特征

    从 LBP 的定义可以看出,LBP算子不是旋转不变的。图像的旋转就会得到不同的 LBP值。所以 Maenpaa等人又将 LBP算子进行了扩展,提出了具有旋转不变性的 LBP 算子,即不断旋转圆形邻域得到一系列初始定义的 LBP值,取其最小值作为该邻域的 LBP 值。即:

    L B P p , R r i = min ⁡ { R O R ( L B P p R , i ) ∣ i = 0 , 1 , … p − 1 } L B P_{p, R}^{r i}=\min \left\{R O R\left(L B P_{p}^{R}, i\right) \mid i=0,1, \ldots p-1\right\} LBPp,Rri=min{ROR(LBPpR,i)i=0,1,p1}

    其中,ROR(x,i)指沿顺时针方向旋转LBP算子i次。如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bAh4LlzH-1646741526312)(笔记图片/image-20191107150512440.png)]

    上图给出了求取旋转不变的 LBP 的过程示意图,算子下方的数字表示该算子对应的 LBP值,图中所示的 8 种 LBP模式,经过旋转不变的处理,最终得到的具有旋转不变性的 LBP值为 15。也就是说,图中的 8种 LBP 模式对应的旋转不变的 LBP模式都是 00001111。

    Uniform Pattern LBP特征

    Uniform Pattern,也被称为等价模式或均匀模式,由于一个LBP特征有多种不同的二进制形式,对于半径为R的圆形区域内含有P个采样点的LBP算子将会产生 2 P 2^P 2P种模式。很显然,随着邻域集内采样点数的增加,二进制模式的种类是以指数形式增加的。例如:5×5邻域内20个采样点,有2^20=1,048,576种二进制模式。这么多的二进制模式不利于纹理的提取、分类、识别及存取。例如,将LBP算子用于纹理分类或人脸识别时,常采用LBP模式的统计直方图来表达图像的信息,而较多的模式种类将使得数据量过大,且直方图过于稀疏。因此,需要对原始的LBP模式进行降维,使得数据量减少的情况下能最好的表示图像的信息。

    为了解决二进制模式过多的问题,提高统计性,Ojala提出了采用一种“等价模式”(Uniform Pattern)来对LBP算子的模式种类进行降维。Ojala等认为,在实际图像中,绝大多数LBP模式最多只包含两次从1到0或从0到1的跳变。因此,Ojala将“等价模式”定义为:当某个LBP所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该LBP所对应的二进制就称为一个等价模式类。如00000000(0次跳变),00000111(只含一次从0到1的跳变),10001111(先由1跳到0,再由0跳到1,共两次跳变)都是等价模式类。除等价模式类以外的模式都归为另一类,称为混合模式类,例如10010111(共四次跳变)。

    下图所示的LBP值属于等价模式类:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SFhAh8He-1646741526313)(笔记图片/image-20191107151414795.png)]

    下图中包含四次跳变,属于非等价模式。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q5FAO3tJ-1646741526313)(笔记图片/image-20191107151519089.png)]

    通过这样的改进,二进制模式的种类大大减少,而不会丢失任何信息。模式数量由原来的 2 P 2^P 2P种减少为 P ( P-1)+2种,其中P表示邻域集内的采样点数。对于3×3邻域内8个采样点来说,二进制模式由原始的256种减少为58种,即:它把值分为59类,58个uniform pattern为一类,其它的所有值为第59类。这样直方图从原来的256维变成59维。这使得特征向量的维数更少,并且可以减少高频噪声带来的影响。

    等价特征的具体实现:采样点数目为8个,即LBP特征值有2^8种,共256个值,正好对应灰度图像的0-255,因此原始的LBP特征图像是一幅正常的灰度图像,而等价模式LBP特征,根据0-1跳变次数,将这256个LBP特征值分为了59类,从跳变次数上划分:跳变0次—2个,跳变1次—0个,跳变2次—56个,跳变3次—0个,跳变4次—140个,跳变5次—0个,跳变6次—56个,跳变7次—0个,跳变8次—2个。共9种跳变情况,将这256个值进行分配,跳变小于2次的为等价模式类,共58个,他们对应的值按照从小到大分别编码为1—58,即它们在LBP特征图像中的灰度值为1—58,而除了等价模式类之外的混合模式类被编码为0,即它们在LBP特征中的灰度值为0,因此等价模式LBP特征图像整体偏暗。

    实现

    在OpenCV中实现了LBP特征的计算,但没有提供一个单独的计算LBP特征的接口。所以我们使用skimage给大家演示该算法。

    skimage即是Scikit-Image。基于python脚本语言开发的数字图片处理包,scikit-image是基于scipy的一款图像处理包,它将图片作为numpy数组进行处理。安装方法:

    pip install scikit-image
    

    skimage包的全称是scikit-image SciKit (toolkit for SciPy) ,它对scipy.ndimage进行了扩展,提供了更多的图片处理功能。它是由python语言编写的,由scipy 社区开发和维护。skimage包由许多的子模块组成,各个子模块提供不同的功能。其中feature模块进行特征检测与提取。

    使用的API是:

    skimage.feature.local_binary_pattern(image, P, R, method=‘default’)
    

    参数:

    • image: 输入的灰度图像
    • P,R: 进行LBP算子计算时的半径和像素点数
    • method: 算法类型:{‘default’, ‘ror’, ‘nri-uniform’, ‘var’}

    default: “默认”,原始的LBP特征;ror: 圆形LBP算子;nri-uniform: 等价LBP算子;var:旋转不变LBP算子

    示例:

    我们在下图中提取LBP特征:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QniurKUH-1646741526314)(笔记图片/face.jpeg)]

    import cv2 as cv
    from skimage.feature import local_binary_pattern
    import matplotlib.pyplot as plt
    # 1.读取图像
    img = cv.imread("face.jpeg")
    face = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    # 2.特征提取
    # 2.0 需要的参数
    # LBP算法中范围半径的取值
    radius = 1  
    # 领域像素点数
    n_points = 8 * radius 
    
    # 2.1 原始LBP特征
    lbp = local_binary_pattern(face, 8, 1)
    
    # 2.2 圆形LBP特征
    clbp = local_binary_pattern(face,n_points,radius,method="ror")
    
    # 2.3 旋转不变LBP特征
    varlbp = local_binary_pattern(face,n_points,radius,method="var")
    
    # 2.4 等价特征
    uniformlbp = local_binary_pattern(face,n_points,radius,method="nri-uniform")
    
    fig,axes=plt.subplots(nrows=2,ncols=2,figsize=(10,8))
    axes[0,0].imshow(lbp,'gray')
    axes[0,0].set_title("原始的LBP特征")
    axes[0,0].set_xticks([])
    axes[0,0].set_yticks([])
    axes[0,1].imshow(clbp,'gray')
    axes[0,1].set_title("圆形LBP特征")
    axes[0,1].set_xticks([])
    axes[0,1].set_yticks([])
    axes[1,0].imshow(varlbp,'gray')
    axes[1,0].set_title("旋转不变LBP特征")
    axes[1,0].set_xticks([])
    axes[1,0].set_yticks([])
    axes[1,1].imshow(uniformlbp,"gray")
    axes[1,1].set_title("等价特征")
    axes[1,1].set_xticks([])
    axes[1,1].set_yticks([])
    plt.show()
    

    检测结果如下所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BFP8g40F-1646741526314)(笔记图片/image-20191107161947626.png)]

    HOG算法

    HOG(Histogram of Oriented Gridients的简写)特征检测算法,最早是由法国研究员Dalal等在CVPR-2005上提出来的,一种解决人体目标检测的图像描述子,是一种用于表征图像局部梯度方向和梯度强度分布特性的描述符。其主要思想是:在边缘具体位置未知的情况下,边缘方向的分布也可以很好的表示行人目标的外形轮廓。

    特征提取流程

    HOG的主要思想是:在一副图像中,局部目标的表象和形状(appearance and shape)能够被梯度或边缘的方向密度分布(即梯度的统计信息,而梯度主要位于边缘的地方)很好地描述。

    HOG特征检测算法的几个步骤:颜色空间归一化—>梯度计算—>梯度方向直方图—>重叠块直方图归一化—>HOG特征。如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jLMxny2I-1646741526314)(笔记图片/image-20191107164141468.png)]

    整体流程简单描述如下:

    1. 将输入图像(你要检测的目标或者扫描窗口)灰度化,即将彩色图转换为灰度图
    2. 颜色空间归一化:采用Gamma校正法对输入图像进行颜色空间的标准化(归一化),目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰
    3. 梯度计算:计算图像每个像素的梯度(包括大小和方向);主要是为了捕获轮廓信息,同时进一步弱化光照的干扰
    4. 梯度方向直方图:将图像划分成小cells(例如8*8像素/cell), 统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的描述符
    5. 重叠直方图归一化:将每几个cell组成一个block(例如3*3个cell/block),一个block内所有cell的特征descriptor串联起来便得到该block的HOG特征描述符。
    6. HOG特征:将图像image内的所有block的HOG特征描述符串联起来就可以得到该image(你要检测的目标)的HOG特征描述符,就得到最终的可供分类使用的特征向量了

    下面我们详细介绍每一步骤的内容:

    颜色空间归一化

    为了减少光照因素的影响,首先需要将整个图像进行规范化(归一化)。在图像的纹理强度中,局部的表层曝光贡献的比重较大,所以,这种压缩处理能够有效地降低图像局部的阴影和光照变化。因为颜色信息作用不大,通常先转化为灰度图,然后在进行伽马校正。

    伽马校正能够有效的降低图像的局部阴影和光照所带来的的影响,从而降低算法对光照的敏感度,增强算法的鲁棒性。

    伽马校正使用下式所得: Y ( x , y ) = I ( x , y ) γ Y(x, y)=I(x, y)^{\gamma} Y(x,y)=I(x,y)γ

    其中,I(x,y)是图像在伽马校正前像素点(x,y)处的灰度值,Y(x,y)为标准化的像素点(x,y)处的灰度值。伽马校正如图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hMxUAan6-1646741526315)(笔记图片/image-20191107171015588.png)]

    从上图中可以看出:

    1. 当γ<1时,如上图中虚线所示,在低灰度值区域内,动态范围变大(当x在[0,0.2]时,y的范围是[0,0.5]),进而图像的对比度增强;在高灰度值区域内,动态范围变小(当x在[0.8,1]时,y的范围是[0.9,1]),图像的对比度降低;同时,图像整体的灰度值变大。
    2. 当γ>1时,如上图中实线所示,在低灰度值区域内,动态范围变小(当x在[0,0.5]时,y的范围是[0,0.2]),进而图像的对比度降低;在高灰度值区域内,动态范围变大,图像的对比度增强;同时,图像整体的灰度值变小。

    下图中左图是原图,中图是γ=1/2.2的校正结果,右图是γ=2.2的校正结果。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vR5ir9be-1646741526316)(笔记图片/image-20191107171040083.png)]

    在HOG特征提取中,γ一般取0.5,此时,图像的灰度值被拉伸,且灰度越低,拉伸的幅度越大,也就是说,对于光照较暗的图像处理较好,能较大程度提升他们的亮度。

    图像梯度计算

    边缘是由图像局部特征包括灰度、颜色和纹理的突变导致的。一幅图像中相邻的像素点之间变化比较少,区域变化比较平坦,则梯度幅值就会比较小,反之,则梯度幅值就会比较大。梯度在图像中对应的就是其一阶导数,所以图像梯度计算利用一阶微分求导处理,不仅能够捕获轮廓、人影以及一些纹理信息,还能进一步弱化光照的影响。Dalal研究了很多算子,如下表所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ep0iEs92-1646741526316)(笔记图片/image-20191115084424182.png)]

    最终表明[-1,0,1]和$[1,0,-1]^T $的效果最好,所以有梯度:

    G x ( x , y ) = I ( x + 1 , y ) − I ( x − 1 , y ) G y ( x , y ) = I ( x , y + 1 ) − I ( x , y − 1 ) \begin{aligned} G_{x}(x, y) &=I(x+1, y)-I(x-1, y) \\ G_{y}(x, y) &=I(x, y+1)-I(x, y-1) \end{aligned} Gx(x,y)Gy(x,y)=I(x+1,y)I(x1,y)=I(x,y+1)I(x,y1)

    式中,Gx,Gy,I(x,y)分别表示的是像素点(x,y)在水平方向上及垂直方向上的梯度以及像素的灰度值,其梯度的幅值及方向计算公式如下:

    G ( x , y ) = G x 2 + G y 2 α ( x , y ) = tan ⁡ − 1 ( G y G x ) \begin{array}{c} G(x, y)=\sqrt{G_{x}^{2}+G_{y}^{2}} \\ \alpha(x, y)=\tan ^{-1}\left(\frac{G_{y}}{G_{x}}\right) \end{array} G(x,y)=Gx2+Gy2 α(x,y)=tan1(GxGy)

    利用该算子计算梯度不仅效果好,而且运算量低。

    梯度直方图计算

    Dalal的研究结果表明,梯度方向为无符号且通道数为9时得到最好的检测效果,此时一个梯度方向的一个通道为180/9=20°,代表的是角度0,20,40,60…160。梯度方向矩阵中可以看到角度是0-180度,不是0-360度,这种被称之为"无符号"梯度(“unsigned” gradients)因为一个梯度和它的负数是用同一个数字表示的,也就是说一个梯度的方向以及它旋转180度之后的方向被认为是一样的,如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TgJEFDNX-1646741526316)(笔记图片/image-20191107174042837.png)]

    假设图像被分为多个cell单元,如下所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uvunXIi2-1646741526316)(笔记图片/image-20191107175236497.png)]

    每个cell单元中包含8*8个像素,如下所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e36t0yjt-1646741526317)(笔记图片/image-20191107175558831.png)]

    我们将上一步得到的梯度方向投影到9个通道中,并将梯度幅值作为投影时的权值。

    在进行梯度方向投影处理时采用加权的方式,确定某个通道的权值,如下所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CImAEI2Z-1646741526317)(笔记图片/image-20191107180300619.png)]

    还有一个细节是,如果角度大于在(160,180)之间时,角度0和180是相等的,所以,角度为165时将其按照幅值比例投影到0和160两个通道中:(180-165)/(165-160)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oAu73wkW-1646741526318)(笔记图片/image-20191107180534928.png)]

    遍历整个cell中的所有像素点,便可以得到该cell单元的梯度方向直方图:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Qh53FGu-1646741526318)(笔记图片/image-20191107180617264.png)]

    重叠块直方图归一化

    由于图像的局部曝光度以及前景与背景之间的对比度存在多样化的情况,所以梯度值的变化范围非常广,引进归一化的直方图对于检测结果的提高有着非常重要的作用。

    在上一步中我们在每一个cell单元中创建了梯度方向直方图,在这一步中我们将在block块中进行梯度直方图的归一化,每一个block是由2*2=4个cell单元构成,如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4bVGpYBP-1646741526318)(笔记图片/hog-3180128.gif)]

    在每个块中梯度直方图应该是4*9=36维的。

    在解释直方图是如何进行归一化之前,让我们看看长度为3的向量是如何进行归一化的:假设一个像素向量[128,64,32],向量的长度则为:sqrt{128^2 + 64^2 + 32^2} = 146.64 这也被称为向量的L2范数。将向量的每一个元素除以146.64得到归一化向量[0.87,0.43,0.22]。

    我们将一个block块中的梯度直方图串联成一个36*1维向量,并进行归一化,就得到了该block块内的特征,因为block块之间是有重叠的,也就是说每个cell单元中的特征会多次出现在不同的block块中。

    收集HOG特征

    上一步中我们得到一个block块的归一化后的梯度方向直方图,现在我们只需遍历检测图像中所有的块便可以得到整个图像的梯度方向直方图,这就是我们要求解的HOG特征向量。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HZsCz0UD-1646741526318)(笔记图片/image-20191108110820778.png)]

    如上图所示,block块与block块之间是可以重叠的,假设我们的检测图像大小为(64×128),其x方向的有(64−8×2)/8=7个block块,其中64为检测图像的宽度,第一个8为cell宽度,2为一个block块中的cell单元宽度,第二个8为block块的滑动增量,同理,y方向有(128−8×2)/8+1=15个block块,其中128为检测图像的高度,第一个8为cell高度,2为一个block块中的cell单元高度,第二个8为block块的滑动增量,因此一共有7×15=105 个block,每一个block中梯度直方图的维数为36,那么检测图像为(64×128)的HOG特征向量的维数为105×36=3780。将其显示在图像上如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hJKq5iYN-1646741526319)(笔记图片/image-20191108111824266.png)]

    从上图中,我们可以发现直方图的主要方向捕捉了人的外形,尤其是躯干和腿的部位。我们得到归一化的HOG特征之后,就可以使用分类器对行人进行检测,比如使用支持向量机SVM进行人与背景的分类,如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oLcae4uO-1646741526319)(笔记图片/image-20191115090149728.png)]

    HOG特征的优缺点

    HOG特征具有以下优点:

    • HOG表示的是边缘的结构特征,因此可以描述局部的形状信息
    • 位置和方向的量化在一定程度上可以一直平移和旋转带来的影响
    • 采取局部区域归一化直方图,可以部分抵消光照变换带来的影响

    它也有不少缺点:

    • 描述子生成冗长,维数较高,导致速度慢,实时性差
    • 很难处理遮挡问题
    • 由于梯度的性质,对噪声非常敏感

    实现

    OpenCV提供了计算HOG特征的API,实现HOG特征提取的流程是:

    1. 实例化HOG特征提取算子,使用的API是:
    hog = cv2.HOGDescriptor(winSize,blockSize,blockStride,cellSize,nbins)
    

    参数:

    • winSize: 检测窗口的大小
    • blockSize: block块的大小
    • blockStride: block块的滑动步长
    • cellSize: cell单元的大小
    • Nbins:统计梯度的方向的数目,一般取为9,即在一个cell单元中计算9个方向的梯度直方图

    返回:

    • hog: 实例化后的Hog特征检测对象
    • 搜索整个图像,计算图像的HOG特征,调用:
    hogDes = hog.compute(img, winStride, padding)
    

    参数:

    • img: 输入图像
    • winStrise:检测窗口的滑动步长
    • padding:填充,在图像的周围填充点对边界进行处理。

    返回:

    • hogDes: 整幅图像的HOG特征描述符,当padding为默认的(0,0)时,特征向量的维数:[(img_size - window_size) / window_stride +1 )]*(每个检测窗口中的特征维数)。

    示例:

    import cv2 as cv 
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 1.读取图像
    img = cv.imread('xingren.jpeg')
    gray= cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    
    # 2.Hog特征提取
    # 2.1 参数设置
    winSize = (64,128)
    blockSize = (16,16)
    blockStride = (8,8)
    cellSize = (8,8)
    nbins = 9
    
    # 2.2 实例化hog对象
    hog = cv.HOGDescriptor(winSize,blockSize,blockStride,cellSize,nbins)
    
    # 2.3 计算Hog特征描述符
    hogDes = hog.compute(img,winStride=(8,8))
    
    # 2.4 输出描述符的大小
    print(hogDes.size)
    

    输出结果为:578340,该图的大小为 ( 128 ∗ 256 ) (128*256) (128256),窗口大小为(64∗128) ,block块大小为(16,16),块的移动步长为 (8,8),cell单元大小为(8,8)时,每一个窗口的特征维度为3780,窗口移动步长为(8,8)时,则图像的特征的维度:

    ( 128 − 64 8 + 1 ) ∗ ( 256 − 128 8 + 1 ) ∗ 3780 = 578340 \left(\frac{128-64}{8}+1\right) *\left(\frac{256-128}{8}+1\right) * 3780=578340 (812864+1)(8256128+1)3780=578340

    小结

    1. LBP算法:

      原始LBP特征:在3∗3的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3∗3邻域内的8个点经比较可产生8位二进制数,即LBP值。

      圆形LBP算子:计算不同半径邻域大小和不同像素点数的特征值

      旋转不变LBP算子:不断旋转圆形邻域得到一系列初始定义的 LBP值,取其最小值作为该邻域的 LBP 值

      Uniform Pattern LBP特征:当某个LBP所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该LBP所对应的二进制就称为一个等价模式类。除等价模式类以外的模式都归为另一类,称为混合模式类。

      API:

      Skiimage.feature.Local_binary_pattern()

    2. HOG算法

      思想:在一副图像中,局部目标的表象和形状(appearance and shape)能够利用梯度或边缘的方向密度分布来描述。

      HOG特征检测算法的步骤:

      颜色空间归一化—>梯度计算—>梯度方向直方图—>重叠块直方图归一化—>HOG特征

      简单描述如下:

      1)将输入图像灰度化,即将彩色图转换为灰度图

      2)颜色空间归一化:采用Gamma校正法对输入图像进行颜色空间的标准化(归一化),目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰

      3)梯度计算:计算图像每个像素的梯度(包括大小和方向);主要是为了捕获轮廓信息,同时进一步弱化光照的干扰

      4)梯度方向直方图:将图像划分成小cells(例如6*6像素/cell), 统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的描述符

      5)重叠直方图归一化:将每几个cell组成一个block(例如3*3个cell/block),一个block内所有cell的特征descriptor串联起来便得到该block的HOG特征描述符。

      6)HOG特征:将图像image内的所有block的HOG特征描述符串联起来就可以得到该image的HOG特征描述符,就得到最终的可供分类使用的特征向量了。

    3. API:

      1)实例化HOG对象:

      hog = cv.HOGDescriptor()

      2)计算HOG特征描述符

      hogdes = hog.Compute()

    展开全文
  • 图像特征提取(VGG和Resnet特征提取卷积过程详解)

    万次阅读 多人点赞 2021-12-25 16:14:26
    图像特征提取(VGG和Resnet卷积过程详解) 第一章 图像特征提取认知 1.1常见算法原理和性能 众所周知,计算机不认识图像,只认识数字。为了使计算机能够“理解”图像,从而具有真正意义上的“视觉”,本章我们将研究...

    图像特征提取(VGG和Resnet算法卷积过程详解)

    第一章 图像特征提取认知

    1.1常见算法原理和性能

    众所周知,计算机不认识图像,只认识数字。为了使计算机能够“理解”图像,从而具有真正意义上的“视觉”,本章我们将研究如何从图像中提取有用的数据或信息,得到图像的“非图像” 的表示或描述,如数值、向量和符号等。这一过程就是特征提取,而提取出来的这些“非图像”的表示或描述就是特征。有了这些数值或向量形式的特征我们就可以通过训练过程教会计算机如何懂得这些特征, 从而使计算机具有识别图像的本领。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NWuPPnPC-1640420041379)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640417319980.png)]

    1.2 什么是图像特征

    特征是某一类对象区别于其他类对象的相应(本质)特点或特性, 或是这些特点和特性的集合。特征是通过测量或处理能够抽取的数据。对于图像而言, 每一幅图像都具有能够区别于其他类图像的自身特征,有些是可以直观地感受到的自然特征,如亮度、边缘、纹理和色彩等;有些则是需要通过变换或处理才能得到的, 如矩、直方图以及主成份等。

    1.3 特征向量及其几何解释

    我们常常将某一类对象的多个或多种特性组合在一起, 形成一个特征向量来代表该类对象,如果只有单个数值特征,则特征向量为一个一维向量,如果是n个特性的组合,则为一个n维特征向量。该类特征向量常常作为识别系统的输入。实际上,一个n维特征就是位于n维空间中的点,而识别分类的任务就是找到对这个n维空间的一种划分。例如要区分3种不同的鸢(yuān)尾属植物,可以选择其花瓣长度和花瓣宽度作为特征,这样就以1个2维特征代表1个植物对象,比如(5.1,3.5).如果再加上萼片长度和萼片宽度, 则每个鸢尾属植物对象由一个4维特征向置表示, 如(5.1, 3.5.1.4, 0.2)。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qkGvPrua-1640420041380)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640417445238.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Tme7jrw-1640420041381)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640417455082.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-76VvhqH5-1640420041382)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640417469257.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4sLrG3Bu-1640420041383)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640417477144.png)]

    1.4 特征提取的一般原则

    图像识别实际上是一个分类的过程,为了识别出某图像所属的类别,**我们需要将它与其他不同类别的图像区分开来。这就要求选取的特征不仅要能够很好地描述图像, 更重要的是还要能够很好地区分不同类别的图像。**我们希望选择那些在同类图像之间差异较小(较小的类内距),在不同类别的图像之间差异较大(较大的类间距)的图像特征, 我们称之为最具有区分能力(most discriminative)的特征。此外, 在特征提取中先验知识扮演着重要的角色, 如何依靠先验知识来帮助我们选择特征也是后面将持续关注的问题。

    第二章 常见特征提取算法

    2.1 常见图像特征提取的算法

    SIFT
    HOG
    ORB
    HAAR
    Deep Learning(神经网络特征提取)

    SIFT(尺度不变特征变换)

    SIFT特征提取的实质,在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出、不会因光照、仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。

    HOG(方向梯度直方图)

    HOG特征提取的实质,通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。

    SIFT和HOG的比较

    共同点:都是基于图像中梯度方向直方图的特征提取方法
    不同点:SIFT 特征通常与使用SIFT检测器得到的兴趣点一起使用。这些兴趣点与一个特定的方向和尺度相关联。通常是在对一个图像中的方形区域通过相应的方向和尺度变换后,再计算该区域的SIFT特征。HOG特征的单元大小较小,故可以保留一定的空间分辨率,同时归一化操作使该特征对局部对比度变化不敏感。

    ORB

    ORB特征描述算法的运行时间远优于SIFT算法,可用于实时性特征检测。ORB特征基于FAST角点的特征点检测与描述技术,具有尺度与旋转不变性,同时对噪声及透视仿射也具有不变性,良好的性能使得用ORB在进行特征描述时的应用场景十分广泛。

    HAAR

    人脸检测最为经典的算法Haar-like特征+Adaboost。这是最为常用的物体检测的方法(最初用于人脸检测),也是用的最多的方法。
    训练过程: 输入图像->图像预处理->提取特征->训练分类器(二分类)->得到训练好的模型;
    测试过程:输入图像->图像预处理->提取特征->导入模型->二分类(是不是所要检测的物体)。

    第三章 深度学习提取特征

    3.1 神经网络提取图像特征

    小块的图形可以由基本edge构成,更结构化,更复杂的,就需要更高层次的特征表示,高层表达由低层表达的组合而成。如图所示:这就是神经网络每层提取到的特征。由于是通过神经网络自动学习到了,因此也是无监督的特征学习过程。直观上说,就是找到make sense的小patch再将其进行combine,就得到了上一层的feature,递归地向上learning feature。在不同object上做training是,所得的edge basis 是非常相似的,但object parts和models 就会completely different了。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wQehMDyk-1640420041388)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640417905514.png)]

    3.2 认识VGG网络和Resnet网络

    VGGNet:2014年,牛津大学计算机视觉组(Visual Geometry Group)和Google DeepMind公司的研究员一起研发出了新的深度卷积神经网络:VGGNet,并取得ILSVRC2014比赛分类项目的第二名(第一名是GoogLeNet,也是同年提出的)和定位项目的第一名。由此可见,VGGNet的效果非常的好。VGGNet探索了卷积神经网络的深度与其性能之间的关系,成功地构筑了16~19层深的卷积神经网络,证明了增加网络的深度能够在一定程度上影响网络最终的性能,使错误率大幅下降,同时拓展性又很强,迁移到其它图片数据上的泛化性也非常好

    Resnet: ResNet获得2015年ImageNet比赛的冠军,主要创新点在于设计了一种使用了skip connection的残差结构,使得网络达到很深的层次,同时提升了性能。神经网络随着层数的增加,显示出退化问题,即深层次的网络反而不如稍浅层次的网络性能;而且这并非是过拟合导致的,因为在训练集上就显示出退化差距。所以,一种直觉是:如果神经网络能够轻松的实现层次间的等效映射,即一个block的输入等于这个block的输出,那么更深层次的网络也就不应该出现比浅层网络性能更差的退化问题。所以何博士等设计了一种skip connection结构,使得网络具有更强的identity mapping的能力,从而拓展了网络的深度,同时也提升了网络的性能。

    3.3 VGG16

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nC5H5J8N-1640420041391)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640418004354.png)]

    VGG16构成:13个卷积层,5个池化层,3个全连接层组成。13+3 = 16,所以叫VGG16。
    5个池化层没有计入其中。是不做运算的,为什么后面不做运算,在后面章节做解释。一张图经过多层网络提取得到的特征。

    3.4 VGG网络系列

    在这里插入图片描述

    3.5.1 卷积层怎么工作的

    卷积立体图解

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4wNYS5rw-1640420041393)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640418100419.png)]

    一副彩色图像有 RGB 三个通道,一个 (6×6) 大小的图像维度是(6×6×3),这里的 3 便对应三个通道(颜色RGB),对这样的图像进行卷积运算时,用到的过滤器的通道数必须与其一致,比如这里可以使用 一个 维度为 (3×3×3) 的过滤器,得到卷积后的图像维度为 (4×4),最后输出的维度为(4×4×2)。如果使用 (y) 个该维度的过滤器,那么卷积后的图像维度应为 (4×4×y)

    3.5.2 卷积过程平面图解

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-la2Qfouc-1640420041394)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640418216601.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z7iR7AAK-1640420041394)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640418463028.png)]

    卷积层计算:矩阵采用点乘方式,卷积核与滑动到的位置的每个元素与输入的矩阵单元相乘,每次乘积得到的结果后相加作为输出的特征矩阵的一个单元。

    前后卷积形状大小变化

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GtckMacv-1640420041395)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640418516220.png)]

    3.5.3 池化层是怎么运作的

    池化层通常有两种方式,第一种是最大池化,第二种是平均池化,在VGG16中采用的是最大池化,池化层是不参与计算的,池化层作用是降维,每一移动一个步长取最大值也就是为什么VGG16 是等于13 + 3 ,而不是13 + 3 + 5。在VGG16采用的是2x2 的矩阵,移动步长为2.

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-blbJaxOM-1640420041395)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640418623110.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z8VYAQaW-1640420041396)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640418637408.png)]

    3.5.4 全连接层工作原理

    全连接可以看成是特殊的卷积层。全连接层的每一个节点都与上一层每个节点连接,是把前一层的输出特征都综合起来,所以该层的权值参数是最多的。例如在VGG16中,第一个全连接层FC1有4096个节点,上一层POOL2是77512 = 25088个节点。由于可以把全连接层看成卷积层的一个特例,比如VGG16,POOL2到FC1层是全连接的,把pool2的输出节点按向量排列,即有25088个维,每一维大小为1*1,卷积核可以看成num_filters = 4096,channal = 25088,kernel_size = 1,stride=1,no pad。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1DOWayg7-1640420041397)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640418685404.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NyYg4tMQ-1640420041397)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640418706869.png)]

    3.5.5 VGG16网络性能评估

    VGG优点
    VGGNet的结构非常简洁,整个网络都使用了同样大小的卷积核尺寸(3x3)和最大池化尺寸(2x2)。
    几个小滤波器(3x3)卷积层的组合比一个大滤波器(5x5或7x7)卷积层好:验证了通过不断加深网络结构可以提升性能。

    VGG缺点
    VGG耗费更多计算资源,并且使用了更多的参数(这里不是3x3卷积的锅),导致更多的内存占用(140M)。其中绝大多数的参数都是来自于第一个全连接层。VGG有3个全连接层 PS:据测试发现这些全连接层即使被去除,对于性能也没有什么影响,但这样就显著降低了参数数量。注:很多pretrained的方法就是使用VGG的model(主要是16和19),VGG相对其他的方法,参数空间很大,所以train一个vgg模型通常要花费更长的时间,所幸有公开的pretrained model(预训练模型)让我们很方便的使用。

    3.6 神经网络深度增加的研究和发现

    在计算机视觉里,网络的深度是实现网络好的效果的重要因素,输入特征的“等级”随增网络深度的加深而变高。然而在网络深度不断加深的情况下,梯度消失和/爆炸成为训练深层次的网络的障碍,导致导致网络无法收敛。虽然,归一初始化,各层输入归一化,使得可以收敛的网络的深度提升为原来的十倍。虽然网络收敛了,但网络却开始退化 (增加网络层数却导致更大的误差), 如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6wIQoMak-1640420041398)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640418916400.png)]

    3.6.1 Resnet网络

    Resnet的残差单元:

    ResNet在2015年被提出,在ImageNet比赛classification任务上获得第一名,因为它“简单与实用”并存,之后很多方法都建立在ResNet50或者ResNet101的基础上完成的,检测,分割,识别等领域里得到广泛的应用。它使用了一种连接方式叫做“shortcut connection”,顾名思义,shortcut就是“抄近道”的意思,下面是这个resnet的网络结构:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nEroXGY4-1640420041399)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640418943816.png)]

    其中σ代表激活函数ReLU:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WCJ3LcvE-1640420041399)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640418983433.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kHe2losM-1640420041400)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640418993146.png)]

    当需要对输入和输出维数进行变化时(如改变通道数目),可以在shortcut时对x做一个线性变换Ws,如下式:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ANpPxTmB-1640420041400)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640419017527.png)]

    3.6.2 Resnet残差单元

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GdLhsTJc-1640420041401)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640419046787.png)]

    这两种结构分别针对ResNet34(左图)和ResNet50/101/152(右图),一般称整个结构为一个“building block” 。其中右图又称为“bottleneck design”,目的就是为了降低参数的数目,实际中,考虑计算的成本,对残差块做
    了计算优化,即将两个3x3的卷积层替换为1x1 + 3x3 + 1x1,如右图所示。新结构中的中间3x3的卷积层首先在
    一个降维1x1卷积层下减少了计算,然后在另一个1x1的卷积层下做了还原,既保持了精度又减少了计算量。
    第一个1x1的卷积把256维channel降到64维,然后在最后通过1x1卷积恢复,

    整体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的话就是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,差了16.94倍。对于常规ResNet,可以用于34层或者更少的网络中,对于Bottleneck Design的ResNet通常用于更深的如101这样的网络中,目的是减少计算和参数量。

    3.6.3 Resnet各类模型卷积参数

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uGRqaXLg-1640420041401)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640419174596.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d9QnPl7W-1640420041402)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640419183522.png)]

    3.6.4 Resnet50网络构成

    Resnet50 网络中包含了 49 个卷积层、1个全连接层。如图下图所示,Resnet50网络结构可以分成七个部分,第一部分不包含残差块,主要对输入进行卷积、正则化、激活函数、最大池化的计算。第二、三、四、五部分结构都包含了残差块。在 Resnet50 网 络 结 构 中 , 残 差 块 都 有 三 层 卷 积 , 那 网 络 总 共 有1+3×(3+4+6+3)=49个卷积层,加上最后的全连接层总共是 50 层,这也是Resnet50 名称的由来。网络的输入为 224×224×3,经过前五部分的卷积计算,输出为 7×7×2048,池化层会将其转化成一个特征向量,最后分类器会对这个特征向量进行计算并输出类别概率。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lRsVxd1X-1640420041402)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640419224934.png)]

    3.6.5 Resnet50 卷积和池化

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qXVXJLVD-1640420041403)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640419271987.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Clx1xKR6-1640420041404)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640419280783.png)]

    注意:当尺寸不被整除时,卷积向下取整,池化向上取整。

    3.6.6 Resnet与普通神经网络对比(向前传播和误差向后传播)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3N8RA4k8-1640420041405)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640419361844.png)]

    前向过程,最后的结果表示直接的前向过程,连加的运算(考虑的残差元为一个单元,残差元的内部还是两层的连
    乘),即从第l层可以直接到第L层,而传统的网络则是连乘运算,计算量明显不同。(从连乘到连加)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U7IY5Bj8-1640420041406)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640419403644.png)]

    对于残差元来说,前向过程是线性的,而且后面的输入等于输入加上每一次的残差元的结果,而普通的网络,则为每一层卷积的连乘运算;残差网络的第一大特点,反向更新解决梯度消失的问题.

    3.6.7 为什么残差网络能解决梯度消失

    BP神经网络举例,其使用sigmiod函数作为激活函数,其导数下面第二个图,最大值是0.25。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hmZFn8ho-1640420041407)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640419484155.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vFbhBCFI-1640420041408)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640419541070.png)]

    在BP网络的误差方向传导过,由求导的链式法则,对激活函数求导,随着网络层数增加,由于连乘,即使取最大值,若干个0.25相乘慢慢趋近于0,到后面梯度基本消失,权值也不再变化,即使网络再多也学不到东西。

    3.6.8 Resnet能解决梯度消失

    Resnet误差向后传播过程:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZaJieXJn-1640420041409)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640419576825.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KzEKgp2G-1640420041409)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640419614550.png)]

    可以看出反向传播的梯度由两项组成:

    1.对xl 求导,梯度为1
    2.对多层普通神经网络求导为:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JpxvdjLJ-1640420041410)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640419723501.png)]

    即使普通神经网络求导趋近0,那两项相加,那和1相加不可能为0,所以误差也能够有效传播到很深的网络,所以使用残差网络结构能够避免梯度消失的问题。

    3.6.9 Resnet网络性能评估

    在过于深的网络在反传时容易发生梯度消失,一旦某一步开始导数小于1,此后继续反传,传到前面时,用float32位数字已经无法表示梯度的变化了,相当于梯度没有改变,也就是浅层的网络学不到东西了。这是网络太深反而效果下降的原因。加入ResNet中的shortcut结构之后,在反传时,每两个block之间不仅传递了梯度,还加上了求导之前的梯度,这相当于把每一个block中向前传递的梯度人为加大了,也就会减小梯度消失的可能性,从而能够很好的学习更深层的特征。

    特征冗余:认为在正向卷积时,对每一层做卷积其实只提取了图像的一部分信息,这样一来,越到深层,原始图像信息的丢失越严重,而仅仅是对原始图像中的一小部分特征做提取。这显然会发生类似欠拟合的现象。加入shortcut结构,相当于在每个block中又加入了上一层图像的全部信息,一定程度上保留了更多的原始信息。
    总的来说,由于每做一次卷积(包括对应的激活操作)都会浪费掉一些信息:比如卷积核参数的随机性(盲目性)、激活函数的抑制作用等等。这时,ResNet中的shortcut相当于把以前处理过的信息直接再拿到现在一并处理,起到了减损的效果。对于深层特征的学习效果还是比较优越的

    3.7 Resnet50提取特征并实现图像相似性比对实操

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jPunrnaV-1640420041410)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640419916838.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0iovngT4-1640420041413)(%E5%9B%BE%E5%83%8F%E7%89%B9%E5%BE%81%E6%8F%90%E5%8F%96%EF%BC%88VGG%E5%92%8CRESNET50%EF%BC%89.assets/1640419928102.png)]
    这篇文章有没有帮到你呢,有的话欢迎关注点赞收藏哦,后续还有大波福利推送!!!!!!!!
    在这里插入图片描述

    展开全文
  • 图像特征提取方法的综述,有助于图像特征提取
  • 利用vgg6提取图像的深度特征再进行分类
  • 图像特征提取算法总汇,介绍各种图像特征提取的方法,用于进行图像匹配。当然只是抛砖引玉啦,简单介绍而已。但方法很全,适合初学者了解整个图像匹配的理论框架。
  • OpenCV图像特征提取

    千次阅读 2021-04-18 07:27:57
    图像特征提取 本章中我们将讨论如何识别并可靠稳定的跟踪连续帧中的图像特征。主要内容包括: intensity gradients and image filtering basics and the properties required to describe suitable keypoints ...
  • 特征提取,包括对图像的基本处理方法和一些典型的特征提取方法的描述
  • 智能识别系统设计---图像特征提取

    千次阅读 2021-10-05 10:46:11
    文章目录LBP特征提取介绍代码实现Gabor特征提取介绍代码实现基于颜色直方图的特征提取与反向投影介绍代码 LBP特征提取 介绍 LBP特征提取操作可以去除光照对图片的影响 对于一张单通道灰度图,我们对每一个像素进行...
  • 这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。 SIFT特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、微视角改变的容忍度也相当高...
  • 图像特征提取算法—HOG

    千次阅读 2020-11-29 12:01:09
    图像特征提取算法—HOG 一 图像基本概念 1.1特征 边缘,角,区域。但不同的目的对应着的不同的特征,边缘特征,颜色特征,梯度方向分布等。 每个物体,我们总可以用一些词语或部件来描述它,比如人脸的特征:两个...
  • 关于图像特征提取.docx关于图像特征提取.docx关于图像特征提取.docx关于图像特征提取.docx关于图像特征提取.docx关于图像特征提取.docx关于图像特征提取.docx关于图像特征提取.docx
  • 关于图像特征提取.pdf

    2022-06-18 01:55:04
    关于图像特征提取.pdf关于图像特征提取.pdf关于图像特征提取.pdf关于图像特征提取.pdf关于图像特征提取.pdf关于图像特征提取.pdf关于图像特征提取.pdf关于图像特征提取.pdf
  • 东北大学信息学院 陈东岳 魏颖 图像处理分析与识别 8.1 基本概念 8.2 边界特征的表征 8.3 边界特征的描述 8.4 区域特征的表征与描述 8.5 子空间方法 第八章 图像特征提取与分析 8.1 基本概念 特征提取在视觉系统中的...
  • 图像特征提取matlab程序.docx图像特征提取matlab程序.docx图像特征提取matlab程序.docx图像特征提取matlab程序.docx图像特征提取matlab程序.docx图像特征提取matlab程序.docx图像特征提取matlab程序.docx图像特征...
  • 现代机器学习 基于深度学习的图像特征提取.docx现代机器学习 基于深度学习的图像特征提取.docx现代机器学习 基于深度学习的图像特征提取.docx现代机器学习 基于深度学习的图像特征提取.docx现代机器学习 基于深度...
  • LBP(局部二值模式)是一种用来描述图像局部纹理特征的算子;LBP算子定义为在3*3的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,...
  • 点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达1.颜色特征提取 计算机视觉的特征提取算法研究至关重要。在一些算法中,一个高复杂度特征提取可能能够解决问题(进行目...
  • Python人脸图像特征提取(HOG、Dlib、CNN方法)一、HOG人脸图像特征提取1、HOG特征:1) 主要思想:2) 实现方法:3) 性能提高:4) 优点2、HOG特征提取算法的实现过程:二、Dlib人脸图像特征提取1.Dlib介绍2.主要特点三...
  • Python人脸图像特征提取方法

    千次阅读 2020-07-11 10:45:22
    Python人脸图像特征提取方法 一、HOG人脸图像特征提取 1、HOG特征: 1) 主要思想: 2) 实现方法: 3) 性能提高: 4) 优点 2、HOG特征提取算法的实现过程: 二、Dlib人脸图像特征提取 1.Dlib介绍 2.主要特点 三、卷积...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 282,438
精华内容 112,975
关键字:

图像特征提取

友情链接: wxbestcake-master.zip