工作中遇到一个问题:对于同一场景,训练好的DL模型能把大部分样本分类准确,而对于少量负样本,DL会错分到另外一个对立的类中。错分的样本可以认为是难分的样本,但是我们还想知道这两种样本到底是哪里的差异导致DL做出了两种截然不同的判断?回答好这个问题就可以进一步解释DL在分类的过程中到底学习了并依赖了图像的哪些特征。
思路是先将这两种样本搜集起来,标签分别为right(分类正确)和wrong(分类出错)。首先可以从直观感受出发,看二者是否有什么明显不同;为了量化这种不同,我们需要从图像中提取一些特征。图像的特征就很多了,点特征包括SIFT,ORB,SURF等,还有局部特征,区域特征等。因为我们用到的图像纹理性较强,在这里介绍几种基于灰度共生矩阵Gray Level Co-occurrence Matrix,GLCM的特征。
从名字上可以看出,GLCM描述的对象是灰度图,“共生”则意味着需要有一个像素对,该像素对是成对出现的,矩阵则由于描述各种像素对出现的频数或者频率。所以说,灰度共生矩阵实际上是两个像素点的联合直方图。这两个像素点的关系是提前约定的,位置与的灰度值分别为m和n,m和n的取值范围会是[0~L],L是图像的灰度级。m和n构成GLCM中矩阵中的坐标,该坐标处的值则是相对位置和绝对灰度值符合约定的像素对出现的次数。
既然相对位置是提前约定的,我们可以约定几种,包括左右关系,45度,135度等,这样对于一个图像,可以得到多个灰度共生矩阵,从而实现旋转不变性。
一般不直接使用灰度共生矩阵来做特征。基于灰度共生矩阵,Haralick计算得到了14种统计量,包括对比度,熵,能量,相关性,二阶矩等。
使用python中的scikit-image包可以方便地得到GLCM及其对应的纹理特征。
from skimage.feature import greycomatrix, greycoprops
glcm = greycomatrix(glcm_window, [1], [0], symmetric = True, normed = True )
#Calculate contrast and replace center pixel
contrast = greycoprops(glcm, 'contrast')
其中greycomatrix函数,第一个参数是输入的array型的图像,第二第三个参数约束了像素的相对位置。第二第三个参数都是list,list的长度就决定了最终会得到几个GLCM,第二个参数中每个元素表示像素点对的间距,第三个参数则表示点对的方向,如np.pi/2.当symmetric是True时,意味着矩阵是对称的,这实质上是说像素点对中的两个位置是可交换的。nomed则表示是否对频数进行归一化得到频率。
基于GLCM可以计算得到矩,其实将图像看作是二维灰度密度函数,可以直接从图像中也可以计算出矩特征https://www.cnblogs.com/ronny/p/3985810.html
表示关于点的阶矩。均值、方差都是矩的特殊情况。二维离散情况下,几何矩(不减去均值)和中心矩(具备平移不变性)分别为:
表示图像均值,则在x和y方向取加权均值,从而得到图像的质心。二阶矩则可以确定图像的惯性方向。
正如方差一样,中心矩可以使用几何矩及x,y的均值表示。
Hu矩则是在普通矩的基础上构建的一个矩组(长度为7,从1到7越来越复杂),具有平移,尺度,旋转不变性,同时对噪声和模糊也具有鲁棒性。
Hu矩的缺点是不包含太多图像细节信息,高阶矩易受噪声影响。Zernike基于Zerniike多项式的正交化函数,可以构造任意高阶矩,用少量的矩来重建图像。
http://www.voidcn.com/article/p-kfrwdpkx-bye.html
http://murphylab.web.cmu.edu/publications/boland/boland_node26.html