Python 有没有更快的方法获取MNIST数据集的本地二进制模式?

Python 有没有更快的方法获取MNIST数据集的本地二进制模式?,python,numpy,scikit-image,tensorflow2.0,lbph-algorithm,Python,Numpy,Scikit Image,Tensorflow2.0,Lbph Algorithm,我需要知道是否有更快的方法获得LBP和MNIST数据集的结果直方图。这将用于手写文本识别,通过一个模型,我还没有决定 我已经加载了MNIST数据集,并根据tensorflow教程将其拆分为x,y训练集和x,y测试集 然后我使用了cv2来反转图像 在此基础上,我定义了一个函数,使用skimage获取LBP和输入图像的相应直方图 最后,我使用了一个经典的for循环来迭代图像,获取它们的直方图,将它们存储在一个单独的列表中,并返回新列表以及训练集和测试集的未更改标签列表 以下是加载MNIST数据集的函

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

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

然后我使用了
cv2
来反转图像

在此基础上,我定义了一个函数,使用
skimage
获取LBP和输入图像的相应直方图

最后,我使用了一个经典的
for
循环来迭代图像,获取它们的直方图,将它们存储在一个单独的列表中,并返回新列表以及训练集和测试集的未更改标签列表

以下是加载MNIST数据集的函数:

def loadDataset():
mnist=tf.keras.datasets.mnist
(x_列,y_列),(x_测试,y_测试)=列表负载数据()
#我该不该倒过来?
x_列=cv2。按位_非(x_列)
x_测试=cv2。按位_非(x_测试)
返回(x_列,y_列),(x_测试,y_测试)
以下是获取LBP和相应直方图的函数:

def getLocalBinaryPattern(img、点、半径):
lbp=特征。局部\二进制\模式(img、点、半径、方法=“统一”)
hist,u=np.直方图(lbp.ravel(),
bins=np.arange(0,点+3),
范围=(0,点数+2))
返回lbp,hist
最后是迭代图像的函数:

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
def formatDataset(数据集):
(x_序列,y_序列),(x_测试,y_测试)=数据集
x_train_hst=[]
对于范围内的i(len(x_列)):
_,hst=getLocalBinaryPattern(x_train[i],8,1)
打印(“计算训练集的LBP:{}/{}”。格式(i,len(x_-train)))
列车附加(hst)
打印(“完成训练集的LBP计算!”)
x_测试_hst=[]
对于范围内的i(len(x_测试)):
_,hst=getLocalBinaryPattern(x_检验[i],8,1)
打印(“为测试集计算LBP:{}/{}”。格式(i,len(x_测试)))
x_测试\u hst.附加(hst)
打印(“完成测试集的LBP计算!”)
打印(“完成!”)
返回(x_-train_-hst,y_-train),(x_-test_-hst,y_-test)

我知道它会很慢,事实上,它很慢。因此,我正在寻找更多的方法来加速它,或者如果已经有一个版本的数据集包含了我需要的信息。

我认为没有一种简单的方法来加速对图像的迭代。有人可能认为使用NumPy或将提高性能,但这些解决方案实际上比
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