Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Machine learning 计算固定长度的梯度直方图(HOG),而不考虑图像大小_Machine Learning_Scikit Learn_Computer Vision - Fatal编程技术网

Machine learning 计算固定长度的梯度直方图(HOG),而不考虑图像大小

Machine learning 计算固定长度的梯度直方图(HOG),而不考虑图像大小,machine-learning,scikit-learn,computer-vision,Machine Learning,Scikit Learn,Computer Vision,我正在训练一个HOG+SVM模型,我的训练数据有各种大小和纵横比。SVM模型无法在可变大小的列表上进行训练,因此我希望计算一个梯度直方图,该直方图的长度与图像大小无关 有没有聪明的办法?还是调整图像大小或填充图像更好 您可以使用cv2.resize()将图像规格化为给定的目标形状,将图像划分为所需的块数,并计算方向直方图和大小。下面是同样的一个简单实现 img = cv2.imread(filename,0) img = cv2.resize(img,(16,16)) #resize the i

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


有没有聪明的办法?还是调整图像大小或填充图像更好

您可以使用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

希望有帮助

您可以使用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

希望有帮助

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

  • 将所有图像(或图像面片)调整为固定大小,并从中提取HOG特征
  • 使用“文字/特征袋”方法,不要调整图像大小
  • 第一种方法
    1.
    非常简单,但它有一些问题
    2.
    试图解决。 首先,想一想猪描述符是做什么的。它将图像划分为固定长度的单元,计算单元梯度以生成单元直方图(基于投票)。最后,您将得到所有单元格的连接直方图,这是您的描述符

    因此,它有一个问题,因为对象(您想要检测)必须以类似的方式覆盖图像。否则,根据对象在图像中的位置,描述符的外观会有所不同

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

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

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

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

  • 将所有图像(或图像面片)调整为固定大小,并从中提取HOG特征
  • 使用“文字/特征袋”方法,不要调整图像大小
  • 第一种方法
    1.
    非常简单,但它有一些问题
    2.
    试图解决。 首先,想一想猪描述符是做什么的。它将图像划分为固定长度的单元,计算单元梯度以生成单元直方图(基于投票)。最后,您将得到所有单元格的连接直方图,这是您的描述符

    因此,它有一个问题,因为对象(您想要检测)必须以类似的方式覆盖图像。否则,根据对象在图像中的位置,描述符的外观会有所不同

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

  • 从训练集中的正面和负面图像中提取HOG特征
  • 使用像k-means这样的聚类算法来定义固定数量的
    k
    质心
  • 对于数据集中的每个图像,提取HOG特征,并将它们按元素与质心进行比较,以创建频率直方图
  • 将频率直方图用于SVM的训练,并将其用于分类阶段。这样,位置就不重要了,您将始终拥有固定大小的输入。您还将受益于尺寸的减小