【问题标题】:Calculate histogram of gradients (HOG) of a fixed length regardless of image size无论图像大小如何,计算固定长度的梯度直方图 (HOG)
【发布时间】:2018-05-31 10:01:13
【问题描述】:

我正在训练一个 HOG + SVM 模型,我的训练数据有各种大小和纵横比。 SVM 模型无法在可变大小的列表上进行训练,因此我希望计算一个长度相同的梯度直方图,而不管图像大小如何。

有没有聪明的方法来做到这一点?还是调整图像大小或填充它们更好?

【问题讨论】:

    标签: machine-learning scikit-learn computer-vision


    【解决方案1】:

    人们在这种情况下通常会做以下两件事之一:

    1. 将所有图像(或图像块)调整为固定大小并从中提取 HOG 特征。
    2. 使用“词袋/特征”方法,不要调整图片大小。

    第一种方法1. 很简单,但它有一些问题2. 试图解决。 首先,想想 hog 描述符的作用。它将图像划分为固定长度的单元,逐单元计算梯度以生成逐单元直方图(基于投票)。最后,您将获得所有单元格的串联直方图,这就是您的描述符。

    因此存在问题,因为(您要检测的)对象必须以类似的方式覆盖图像。否则,您的描述符看起来会有所不同,具体取决于图像内对象的位置。

    方法2.的工作原理如下:

    1. 从训练集中的正面和负面图像中提取 HOG 特征。
    2. 使用 k-means 等聚类算法定义固定数量的k 质心。
    3. 对于数据集中的每张图像,提取 HOG 特征并将它们逐元素与质心进行比较,以创建频率直方图。

    使用频率直方图训练您的 SVM,并将其用于分类阶段。这样,位置无关紧要,您将始终拥有固定大小的输入。您还将受益于尺寸的减小。

    【讨论】:

      【解决方案2】:

      您可以使用 cv2.resize() 将图像归一化为给定的目标形状,将图像划分为所需的块数并计算方向的直方图以及幅度。下面是一个简单的实现。

      img = cv2.imread(filename,0)
      img = cv2.resize(img,(16,16)) #resize the image
      
      gx = cv2.Sobel(img, cv2.CV_32F, 1, 0) #horizontal gradinets
      gy = cv2.Sobel(img, cv2.CV_32F, 0, 1) # vertical gradients
      
      mag, ang = cv2.cartToPolar(gx, gy)
      bin_n = 16 # Number of bins
      # quantizing binvalues in (0-16)
      bins = np.int32(bin_n*ang/(2*np.pi))
      
      # divide to 4 sub-squares
      s = 8 #block size
      bin_cells = bins[:s,:s],bins[s:,:s],bins[:s,s:],bins[s:,s:]
      mag_cells = mag[:s,:s], mag[s:,:s], mag[:s,s:], mag[s:,s:]
      hists = [np.bincount(b.ravel(), m.ravel(), bin_n) for b, m in zip(bin_cells,mag_cells)] 
      
      hist = np.hstack(hists) #histogram feature data to be fed to SVM model
      

      希望有帮助!

      【讨论】:

        猜你喜欢
        • 2015-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-27
        • 2016-04-23
        • 1970-01-01
        • 2014-04-02
        • 2018-03-14
        相关资源
        最近更新 更多