質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.58%

pythonでファイルを開いて画像を表示したい

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 715

trey_0329

score 107

背景
大量の画像データを使って、画像の判定モデルを作りたいです

そのために、URL(https://www.cs.toronto.edu/~kriz/cifar.html)のファイル
CIFAR-10 python versionリンク先のcifar-10-python.tar.gzファイルをpythonで開いてdataとlabelを表示したいです。

画像の読み込み方法
CIFAR-10 python versionからcifar-10-python.tar.gzをダウンロードして、解凍し
cifar-10というファイルに移しました。
そしてサイトを参考に下記のコードで画像を読み込んでみました。

file="cifar-10"
def unpickle(file):
    import pickle
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='bytes')
    return dict

この後にどのように画像とラベルを表示すればいいかわからなくて困っています。
例えばData[0]とやると最初の画像が表示され、
Label[0]とやると最初のラベルが表示されるようにしたいです。 
画像ファイルが.jpegでないため、いろいろ調べてみましたが詰まってしまったのでこちらにて相談させて頂きました。

少々投げやりな質問ですがご教示お願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

CIFAR-10 python version をダウンロードして解凍すると、以下のフォルダが出てきます。

tree cifar-10-batches-py
cifar-10-batches-py
├── batches.meta
├── data_batch_1
├── data_batch_2
├── data_batch_3
├── data_batch_4
├── data_batch_5
├── readme.html
└── test_batch

データは pickle 形式なので、詠み込むと、dict が出てきます。このうち、キー b'labels' が0 ~ 9 のラベルの一覧、キー b'data' が画像の一覧を表します。

In other words, the first byte is the label of the first image, which is a number in the range 0-9. The next 3072 bytes are the values of the pixels of the image. The first 1024 bytes are the red channel values, the next 1024 the green, and the final 1024 the blue. The values are stored in row-major order, so the first 32 bytes are the red channel values of the first row of the image. 

画像は最初の (Channles, Height, Width) の順番の1次元配列で入っています。
なので、numpy.reshape(-1, 3, 32, 32) して、チャンネルが最後の軸の都合がいいので、numpy.moveaxis(data, 1, -1) で (サンプル数, 32, 32, 3) の配列にします。

import os
import pickle

def unpickle(path):
    with open(path, 'rb') as f:
        data = pickle.load(f, encoding='bytes')data.items()}

    return data

dataset_dir = 'cifar-10-batches-py'
train_paths = ['data_batch_1', 'data_batch_2',
         'data_batch_3', 'data_batch_4', 'data_batch_5']
test_path = 'test_batch'

data = []
labels = []

for p in train_paths:
    unpacked = unpickle(os.path.join(dataset_dir, p))
    data.extend(unpacked[b'data'])
    labels.extend(unpacked[b'labels'])

data = np.array(data).reshape(-1, 3, 32, 32)
data = np.moveaxis(data, 1, -1)  # (N, C, H, W) -> (N, H, W, C)
labels = np.array(labels)

print(data.shape, labels.shape)  # (50000, 32, 32, 3) (50000,)

Jupyter Notebook で最初の100枚を確認してみます。

import cv2
from IPython.display import Image, display

def imshow(img):
    encoded = cv2.imencode('.png', img)[1]
    display(Image(encoded))

# 最初の100枚を結合して1枚の画像にして、表示する。
first100_imgs = data[:100].reshape(10, 10, 32, 32, 3)
merged_img = np.vstack([np.hstack(h_imgs) for h_imgs in first100_imgs])
imshow(merged_img)

# 見づらいので少し拡大して見てみると
merged_img = cv2.resize(merged_img, dsize=None, fx=2.0, fy=2.0)
imshow(merged_img)

イメージ説明

イメージ説明

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/21 14:51

    tiitoiさん

    いつも大変ありがとうございます。
    お教えいたただいたコードをしっかり復習致します。

    また以前に、機械学習を勉強するには本を使ったほうが効率が良い、とアドバイス頂き、その後に何冊か購入し勉強してみました。
    ネットと違い、本(特にOrelly)だと体系的に学ぶことができ、全体像をしっかり理解できるようになりました。
    ありがとうございます。

    キャンセル

  • 2019/03/21 14:59

    技術書は少々値がはりますが、校正されているので間違いが少ないですし、体系的に学べていいですよね。
    回答のコードで疑問点があれば、お気軽に聞いてください。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る