Python 有没有更快的方法获取MNIST数据集的本地二进制模式?
我需要知道是否有更快的方法获得LBP和MNIST数据集的结果直方图。这将用于手写文本识别,通过一个模型,我还没有决定 我已经加载了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数据集的函
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