【问题标题】:Is there a faster way to get the Local Binary Pattern of the MNIST dataset?有没有更快的方法来获取 MNIST 数据集的本地二进制模式?
【发布时间】:2019-09-25 12:34:48
【问题描述】:

我需要知道是否有更快的方法来获取 LBP 和生成的 MNIST 数据集直方图。这将用于手写文本识别,通过一个我还没有决定的模型..

我已经加载了 MNIST 数据集,并根据 tensorflow 教程将其拆分为 x、y 训练集和 x、y 测试集。

然后我使用cv2 反转图像。

从那里我定义了一个函数,使用skimage 来获取输入图像的 LBP 和相应的直方图

我终于使用经典的for 循环遍历图像,获取它们的直方图,将它们存储在单独的列表中,并返回新列表以及训练集和测试集的未更改标签列表。

这是加载 MNIST 数据集的函数:

def loadDataset():
    mnist = tf.keras.datasets.mnist
    (x_train, y_train), (x_test, y_test) = mnist.load_data()

    # should I invert it or not?
    x_train = cv2.bitwise_not(x_train)
    x_test = cv2.bitwise_not(x_test)

    return (x_train, y_train), (x_test, y_test)

这里是获取LBP和对应直方图的函数:

def getLocalBinaryPattern(img, points, radius):
    lbp = feature.local_binary_pattern(img, points, radius, method="uniform")
    hist, _ = np.histogram(lbp.ravel(), 
                bins=np.arange(0, points + 3),
                range=(0, points + 2))

    return lbp, hist

最后是遍历图像的函数:

def formatDataset(dataset):
    (x_train, y_train), (x_test, y_test) = dataset

    x_train_hst = []
    for i in range(len(x_train)):
        _, hst = getLocalBinaryPattern(x_train[i], 8, 1)
        print("Computing LBP for training set: {}/{}".format(i, len(x_train)))
        x_train_hst.append(hst)

    print("Done computing LBP for training set!")

    x_test_hst=[]
    for i in range(len(x_test)):
        _, hst = getLocalBinaryPattern(x_test[i], 8, 1)
        print("Computing LBP for test set: {}/{}".format(i, len(x_test)))
        x_test_hst.append(hst)

    print("Done computing LBP for test set!")

    print("Done!")

    return (x_train_hst, y_train), (x_test_hst, y_test)

我知道它会很慢,而且确实很慢。因此,我正在寻找更多方法来加快速度,或者是否已经有一个版本的数据集包含我需要的这些信息。

【问题讨论】:

    标签: python numpy scikit-image tensorflow2.0 lbph-algorithm


    【解决方案1】:

    我认为没有一种直接的方法可以加快图像的迭代速度。人们可能期望使用 NumPy 的 vectorizeapply_along_axis 会提高性能,但这些解决方案实际上比 for 循环(或列表解析)慢。

    演示

    遍历图像的不同替代方案:

    def compr(imgs):
        hists = [getLocalBinaryPattern(img, 8, 1)[1] for img in imgs]
        return hists
    
    def vect(imgs):
        lbp81riu2 = lambda img: getLocalBinaryPattern(img, 8, 1)[1]
        vec_lbp81riu2 = np.vectorize(lbp81riu2, signature='(m,n)->(k)')
        hists = vec_lbp81riu2(imgs)
        return hists
    
    def app(imgs):
        lbp81riu2 = lambda img: getLocalBinaryPattern(img.reshape(28, 28), 8, 1)[1]
        pixels = np.reshape(imgs, (len(imgs), -1))
        hists = np.apply_along_axis(lbp81riu2, 1, pixels)
        return hists
    

    结果:

    In [112]: (x_train, y_train), (x_test, y_test) = loadDataset()
    
    In [113]: %timeit -r 3 compr(x_train)
    1 loop, best of 3: 14.2 s per loop
    
    In [114]: %timeit -r 3 vect(x_train)
    1 loop, best of 3: 17.1 s per loop
    
    In [115]: %timeit -r 3 app(x_train)
    1 loop, best of 3: 14.3 s per loop
    
    In [116]: np.array_equal(compr(x_train), vect(x_train))
    Out[116]: True
    
    In [117]: np.array_equal(compr(x_train), app(x_train))
    Out[117]: True
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      • 2020-08-06
      • 2021-03-16
      • 2019-10-17
      • 1970-01-01
      • 2010-11-11
      • 2022-01-06
      相关资源
      最近更新 更多