Python 神经网络的筛选输入

Python 神经网络的筛选输入,python,opencv,neural-network,classification,sift,Python,Opencv,Neural Network,Classification,Sift,我正在尝试使用人工神经网络对图像进行分类,我想尝试的方法是: 获取特征描述符(目前使用SIFT) 用神经网络进行分类 为此,我使用OpenCV3和Python 我对机器学习比较陌生,我有以下问题- 我分析的每个图像都有不同数量的“关键点”,因此2D“描述符”数组的维度也不同。如何确定我的ANN的输入。例如,对于一个样本图像,描述符的形状是(12211128),所以我要展平这个数组并将其用作输入,在这种情况下,我必须担心每个图像的输入大小会有所不同,或者我需要为输入计算其他内容吗?如果在获取特征提

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

  • 获取特征描述符(目前使用SIFT)
  • 用神经网络进行分类
  • 为此,我使用OpenCV3和Python

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


    我分析的每个图像都有不同数量的“关键点”,因此2D“描述符”数组的维度也不同。如何确定我的ANN的输入。例如,对于一个样本图像,描述符的形状是(12211128),所以我要展平这个数组并将其用作输入,在这种情况下,我必须担心每个图像的输入大小会有所不同,或者我需要为输入计算其他内容吗?

    如果在获取特征提取程序之前对每个图像应用标准化,这将是一件好事。

    我不确定这是否是一个精确的解决方案,但这对我来说很有效。主要思想如下:

    • 将图像分割为MxN网格
    • 为每个子图像获取一组特征点
    • 连接所有子图像的结果,以获得整个图像的特征向量
    下面给出了支持代码(函数“pre_process_image”):


    然而,这是非常缓慢的。我正在研究一种使用PCA优化选择特征的方法。

    对于ANN,通常需要固定大小的输入。
    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