web-dev-qa-db-ja.com

Python=を使用して.idx3-ubyteファイルまたはGZIPから画像を抽出します

OpenCVの顔認識ツールを使用して、顔認識のための簡単な関数を作成しました。それはすべての人々からの画像でうまく動作します。

次に、人ではなく手書き文字を使用してテストを行いたいと思います。 MNISTデータセットに出くわしましたが、画像を見たことがない奇妙なファイルに保存されます。

以下からいくつかの画像を抽出するだけです。

_train-images.idx3-ubyte
_

それらを_.gif_としてフォルダに保存します

それとも、このMNISTのことを誤解していますか。はいの場合、そのようなデータセットはどこで入手できますか?

[〜#〜] edit [〜#〜]

Gzipファイルもあります。

_train-images-idx3-ubyte.gz
_

コンテンツを読み取ろうとしていますが、show()が機能せず、read()でランダムなシンボルが表示されます。

_images = gzip.open("train-images-idx3-ubyte.gz", 'rb')
print images.read()
_

[〜#〜] edit [〜#〜]

以下を使用して、いくつかの有用な出力を得ることができました。

_with gzip.open('train-images-idx3-ubyte.gz','r') as fin:
    for line in fin:
        print('got line', line)
_

どういうわけか、私はこれを画像に変換する必要があります、出力:

enter image description here

16
Roman

トレーニング/テスト画像とラベルをダウンロードします。

  • train-images-idx3-ubyte.gz:トレーニングセット画像
  • train-labels-idx1-ubyte.gz:トレーニングセットラベル
  • t10k-images-idx3-ubyte.gz:テストセットイメージ
  • t10k-labels-idx1-ubyte.gz:テストセットラベル

そして、それらをworkdirで解凍します。samples/

PyPiから python-mnist パッケージを取得します。

pip install python-mnist

mnistパッケージをインポートして、トレーニング/テストイメージを読み取ります。

from mnist import MNIST

mndata = MNIST('samples')

images, labels = mndata.load_training()
# or
images, labels = mndata.load_testing()

コンソールに画像を表示するには:

index = random.randrange(0, len(images))  # choose an index ;-)
print(mndata.display(images[index]))

次のようなものが得られます。

............................
............................
............................
............................
............................
.................@@.........
..............@@@@@.........
............@@@@............
..........@@................
..........@.................
...........@................
...........@................
...........@...@............
...........@@@@@.@..........
...........@@@...@@.........
...........@@.....@.........
..................@.........
..................@@........
..................@@........
..................@.........
.................@@.........
...........@.....@..........
...........@....@@..........
............@@@@............
.............@..............
............................
............................
............................

説明:

  • imagesリストの各imageはPython listの符号なしバイト。
  • labelsは、Python array符号なしバイトです。
39
Laurent LAPORTE

(matplotlib、gzip、numpyのみを使用)
画像データの抽出:

import gzip
f = gzip.open('train-images-idx3-ubyte.gz','r')

image_size = 28
num_images = 5

import numpy as np
f.read(16)
buf = f.read(image_size * image_size * num_images)
data = np.frombuffer(buf, dtype=np.uint8).astype(np.float32)
data = data.reshape(num_images, image_size, image_size, 1)

画像の印刷:

import matplotlib.pyplot as plt
image = np.asarray(data[2]).squeeze()
plt.imshow(image)
plt.show()

enter image description here

最初の50個のラベルを印刷します。

f = gzip.open('train-labels-idx1-ubyte.gz','r')
f.read(8)
for i in range(0,50):   
    buf = f.read(1)
    labels = np.frombuffer(buf, dtype=np.uint8).astype(np.int64)
    print(labels)
10
Punnerud

実際には、PyPIで利用可能な idx2numpy パッケージを使用できます。それはextremely使いやすく、データをnumpy配列に直接変換します。あなたがしなければならないことは次のとおりです。

データをダウンロードする

公式Webサイト からMNISTデータセットをダウンロードします。
Linuxを使用している場合は、 wget を使用してコマンドライン自体から取得できます。ただ走れ:

wget http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz

データの解凍

データを解凍または解凍します。 Linuxでは、 gzip を使用できます

最終的に、次のファイルが必要です。

data/train-images-idx3-ubyte
data/train-labels-idx1-ubyte
data/t10k-images-idx3-ubyte
data/t10k-labels-idx1-ubyte

プレフィックスdata/は、dataという名前のフォルダーに抽出したからです。あなたの質問はここまでよくできているようですので、読み続けてください。

Idx2numpyを使用する

これは、単純なpython numpy配列として解凍されたファイルからすべてを読み取るためのコードです。

import idx2numpy
import numpy as np
file = 'data/train-images-idx3-ubyte'
arr = idx2numpy.convert_from_file(file)
# arr is now a np.ndarray type of object of shape 60000, 28, 28

次のようなものを使用して、他の画像を表示するのと同じ方法で、OpenCV jutsで使用できます。

cv.imshow("Image", arr[4])

Idx2numpyをインストールするには、PyPI(pipパッケージマネージャー)を使用できます。コマンドを実行するだけです:

pip install idx2numpy
3
avneesh mishra

これを使用して、mnistデータベースをpythonの画像およびcsvラベルに抽出します。

https://github.com/sorki/python-mnist

1
Aqib Mumtaz