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)
_
どういうわけか、私はこれを画像に変換する必要があります、出力:
トレーニング/テスト画像とラベルをダウンロードします。
そして、それらを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]))
次のようなものが得られます。
............................
............................
............................
............................
............................
.................@@.........
..............@@@@@.........
............@@@@............
..........@@................
..........@.................
...........@................
...........@................
...........@...@............
...........@@@@@.@..........
...........@@@...@@.........
...........@@.....@.........
..................@.........
..................@@........
..................@@........
..................@.........
.................@@.........
...........@.....@..........
...........@....@@..........
............@@@@............
.............@..............
............................
............................
............................
説明:
list
の符号なしバイト。array
符号なしバイトです。(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()
最初の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)
実際には、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
という名前のフォルダーに抽出したからです。あなたの質問はここまでよくできているようですので、読み続けてください。
これは、単純な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
これを使用して、mnistデータベースをpythonの画像およびcsvラベルに抽出します。