SIFT 输入到 ANN

SIFT Input to ANN

我正在尝试使用人工神经网络对图像进行分类,我想尝试的方法是:

  1. 获取特征描述符(目前使用 SIFT)
  2. 使用神经网络分类

我正在为此使用 OpenCV3 和 Python。

我对机器学习比较陌生,我有以下问题 -

我分析的每张图像都有不同数量的 'keypoints',因此二维 'descriptor' 数组的维度也不同。我如何决定我的 ANN 的输入。例如,对于一个样本图像,描述符形状是 (12211, 128) 所以我是否将这个数组展平并将其用作输入,在这种情况下我不得不担心每个图像的输入大小不同,或者我是否为输入?

如果在获取特征提取器之前对每个图像应用归一化会更好。

我不确定这是否是一个确切的解决方案,但这对我有用。主要思路如下:

  • 将您的图片分成 MxN 网格。
  • 为每个子图像获取一组特征点。
  • 连接所有子图像的结果以获得整个图像的特征向量。

支持代码大致如下(函数"pre_process_image"):

def tiles(arr, nrows, ncols):
    """
    If arr is a 2D array, the returned list contains nrowsXncols numpy arrays
    with each array preserving the "physical" layout of arr.

    When the array shape (rows, cols) are not divisible by (nrows, ncols) then
    some of the array dimensions can change according to numpy.array_split.

    """
    rows, cols, channel = arr.shape
    col_arr = np.array_split(range(cols), ncols)
    row_arr = np.array_split(range(rows), nrows)
    return [arr[r[0]: r[-1]+1, c[0]: c[-1]+1]
                     for r, c in product(row_arr, col_arr)]

def pre_process_images(data, dimensions=(28, 28)):
    images = data['image']
    features = []
    count = 1
    nrows = dimensions[0]
    ncols = dimensions[1]
    sift = cv2.xfeatures2d.SIFT_create(1)
    for arr in images:
        image_feature = []
        cut_image = tiles(arr, nrows, ncols)
        for small_image in cut_image:
            (kps, descs) = sift.detectAndCompute(im, None)
            image_feature.append(descs.flatten())
        features.append(image_feature)
        print count
        count += 1

    data['sift_features'] = features
    return data

然而,这非常慢。我正在研究一种使用 PCA 来优化 select 特性的方法。