合并LBP和HOG特征描述符

时间:2017-01-04 06:01:31

标签: python opencv svm

从事年龄,性别评估项目。到目前为止,我已尝试使用LBP(局部二进制模式)+ SVM(支持向量机)来训练它进行性别分类,但在使用LBP + SVM时得到过多的误报,所以我尝试了HOG(梯度直方图) )+ SVM,令人惊讶的增加到90%,所以我只是将两个描述符的特征合并并使用它来训练SVM。代码如下:

    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    fd = hog(gray, orientations, pixels_per_cell, cells_per_block, visualize, normalize) #HOG descriptor here.

    hist = desc.describe(gray) #get the LBP histogram here.

    # extract the label from the image path, then update the
    # label and data lists
    labels.append(imagePath.split("/")[-2])
    data.append(fd + hist) # tried concatinate both featurs, but gives error on this line.

# train a Linear SVM on the data
model = LinearSVC(C=100.0, random_state=42)
model.fit(data, labels)

但是当尝试这一行:data.append(fd + hist)只是试图连接两个特征描述符,并抛出我的错误:

  

Traceback(最近一次调用最后一次):文件   “/home/swap/Ubuntu-Home/swap/openCV/gender_age_weight_recog/tarin.py”,

     

第41行,在       data.append(fd + hist)ValueError:操作数无法与形状一起广播(11340,)(26,)

所以有人指出我是为了将两个特征合并为单个,然后为此训练SVM。

2 个答案:

答案 0 :(得分:1)

我想出了这个问题,可以简单地堆叠numpy数组,任何类似形状的特征描述符,如HOG和LBPH在灰度图像上工作,所以在这种情况下,LBP,HOG will always be one生成的特征的深度,所以我们可以使用numpy堆叠它们,

    desc_hist = desc.describe(gray_img)
    hog_hist = hog(gray_img, orientations, pixels_per_cell, cells_per_block, 'L1', visualize, normalize)      
    feat = np.hstack([desc_hist, hog_hist])
  

但是假设有人想合并在3通道上工作的hsv直方图   图像(RGB),然后它可以被展平为1D阵列然后可以   堆叠以拥有该功能。

hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
hist = cv2.calcHist([hsv], [0, 1, 2], None, bins,
                    [0, 180, 0, 256, 0, 256])

hist = cv2.normalize(hist)

# return the flattened histogram as the feature vector
td_hist = hist.flatten()

现在,所有这些都可以像往常一样stacked

feat = np.hstack([desc_hist, hog_hist, td_hist])

答案 1 :(得分:0)

问题是您正在尝试添加两个不同大小的数组。一个数组有11340个元素,另一个有26个。你应该在存储这些值时改变逻辑而不是将它们加在一起