組み込みディープラーニング: 2. CIFAR10 分類タスクのデータ分析を完了する

1. タスク紹介

  • CIFAR-10 と CIFAR-100 は、 Alex Krizhevsky、Vinod Nair、および Geoffrey Hinton によって収集された画像分類データセットです。CIFAR-10 データセットには、10 のカテゴリに分割された 60,000 の 32x32 カラー画像が含まれており、それぞれに 50,000 のトレーニング画像と 10,000 のテスト画像あります。下。
    ここに画像の説明を挿入
  • CIFAR-10 は、異なる分類ネットワーク間の比較を容易にするために、ネットワーク パフォーマンスの指標としてよく使用されます。その公式ウェブサイトのダウンロード リンクは次のとおりです。ダウンロード速度が遅くなる可能性があり、科学ツールが必要になる場合があります。
    CIFAR-10 公式ウェブサイト
    Python バージョンのデータをダウンロードします。
    ここに画像の説明を挿入

2. データを分析する

  • ダウンロードした CIFAR-10 データは、以下に示すように単一のバッチ ファイルです。
    ここに画像の説明を挿入

    各バッチ ファイルには、10,000 個の画像が含まれています。その中で、data_batch_1 はトレーニング データで、10 クラス、各クラスに 1000 枚の写真が含まれており、test_batch はテスト データで、10 クラス、各クラスに 1000 枚の写真が含まれています。

  • これらの写真は、コンピューターから直接閲覧することはできないため、まず、コンピューターの閲覧に便利な JPG 形式のデータに解析する必要があります。学習済みのネットワークをテストするときは、元の画像を見て理由を調べる必要があるため、直接閲覧できる画像データが存在する必要があります。

  • データを解析するための API は公式 Web サイトで次のように提供されており、解析後に取得される型は python の dict 型です。

def unpickle(file):
    import pickle
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='bytes')
    return dict
  • フォルダーの下に新しい CIFAR10.py ファイルを作成し、vscode を介してフォルダー全体を開き、ショートカット キーを入力してから、
    ctrl + shift + p

    python:select
    のように入力して python インタープリターを選択します。
    ここに画像の説明を挿入
    ここに画像の説明を挿入
    minicoda の下でインタープリターを選択した後、トーチ ライブラリをインポートできます。次のようにエラーは報告されません:画像データの解析には opencv ライブラリが必要なので、conda を使用して opencv をインストールし、次の図に示すように
    ここに画像の説明を挿入
    コマンドを実行します: 現時点では、実行時にエラーは報告されません。vscode で、opencv が正常にインストールされたことを示します。
    pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple

    ここに画像の説明を挿入

    import cv2
  • 次に、元のファイルの情報を出力する次のコードを記述します。
import torch
def unpickle(file):
    import pickle
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='bytes')
    return dict

label_name = ["airplane","automobile","bird","cat","deer","dog","frog","horse","ship","truck"]

import glob
file_list = glob.glob(r"data_batch_*")   #获得该目录下与之文件名匹配的文件
for file_i, in file_list,file_list:
    print(file_i)
    mydict = unpickle(file_i)
    print(mydict)

以下の結果が得られます. このとき, CIFAR-10トレーニングファイルのファイル名を取得し, デコード機能によりトレーニングファイルを辞書データにデコードしました. 辞書データを出力することで, それぞれ次の 2 つのコマンド
ここに画像の説明を挿入
を追加すると、デコードされた辞書に何が含まれているかを確認できます。

print(mydict.keys())
print(len(mydict))

実行中:
ここに画像の説明を挿入
上記の情報から、各バッチ ファイルは画像を辞書として格納し、各辞書のキーと値のキーには、画像のラベル カテゴリ、データ、ファイル名、およびバッチ ラベルを含む 4 つの情報カテゴリが含まれていることがわかります。ディクショナリの値は、画像内の各カテゴリに関する情報を含むリストです。
ディクショナリのラベルに含まれる情報は、次のコマンドで印刷できます。

print(mydict[b'labels'])
print(type(mydict[b'labels']))
print(len(mydict[b'labels']))

ここに画像の説明を挿入
リスト データは labels キー値の下に保存され、リストの長さは 1000 で、リストには画像のカテゴリ番号 0 ~ 9 が含まれ、番号 0 ~ 9 は画像の 10 カテゴリであることがわかります。下図: 各バッチファイルをデコードできるように
ここに画像の説明を挿入
、得られた大量の辞書データを辞書のラベルに従ってフォルダごとに分類し、cv2 の show で画像を表示します. 以下のコードを追加します.

mydict = unpickle(file_i)
    for index_i in range(1000):
        print(label_name[mydict[b'labels'][index_i]])
        print(mydict[b'data'][index_i])
        print(mydict[b'filenames'][index_i])

上記のコードは、次のように辞書のリストに対応する画像情報を出力できます.
ここに画像の説明を挿入
情報から、画像情報が配列として保存されていることがわかります.配列情報を出力します.

print(type(mydict[b'data'][0]))

ここに画像の説明を挿入
画像情報が n 次元配列として保存されていることがわかります. numpy を導入し、次のコードで配列情報を観察します:

mydict = unpickle(file_i)
    print(mydict[b'data'][0].shape)

ここに画像の説明を挿入
配列は3072 1 の配列として保存され、3072 はちょうど 32 32 3 のデータ長であることがわかります。そのうち 32 32 は画像のサイズであり、3 は各ピクセルの RGB 情報の長さです。 numpy reshape データを介して配列を画像に復元できます。

mydict = unpickle(file_i)
    img_a = mydict[b'data'][0].reshape(32,32,3)
    print(img_a)

得られた:
ここに画像の説明を挿入
例として画像を取り、画像を表示しましょう:

import torch
import cv2
import numpy as np

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

label_name = ["airplane","automobile","bird","cat","deer","dog","frog","horse","ship","truck"]


import glob

file_list = glob.glob(r"data_batch_*")   #获得该目录下与之文件名匹配的文件
for file_i in file_list:
    print(file_i)

    mydict = unpickle(file_i)
    print(mydict[b'data'][0])
    img_a = mydict[b'data'][0].reshape(3,32,32) / 255   # CIFAR10数据集在将32*32*3图像拉伸为一维数组时,
    # 依次存放1024个R,1024个G,1014个B数据,将其reshape为(3,32,32),则一共有3层,第一层全是R,第二层全是G,第三层全是B
    img_a = np.transpose(img_a,(1,2,0)) # 翻转数据,将三层的RGB作为图像的深度
    print(img_a)
    cv2.imshow("wcc",img_a)
    userkey = cv2.waitKey()

上記のコードを実行すると、結果は次のようになります。
ここに画像の説明を挿入
ボタンを押して画像を印刷し、画像データを表示します。ここで、単一の画像データの分析が完了しました.次に、コードを変更して、ラベルに従って別のフォルダーに保存するだけで済みます.完全なコードは次のとおりです。

import torch
import cv2
import numpy as np

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

label_name = ["airplane","automobile","bird","cat","deer","dog","frog","horse","ship","truck"]


import glob
import os

file_list = glob.glob(r"data_batch_*")   #获得该目录下与之文件名匹配的文件
for file_i in file_list:
    print(file_i)

    mydict = unpickle(file_i)
    for index_i in range(10000):
        img_a = mydict[b'data'][index_i].reshape(3,32,32)# CIFAR10数据集在将32*32*3图像拉伸为一维数组时,
    # # 依次存放1024个R,1024个G,1014个B数据,将其reshape为(3,32,32),则一共有3层,第一层全是R,第二层全是G,第三层全是B
    #由于imwrite时会自动做一次归一化/255,因此这里不除以255进行归一化
        img_a = np.transpose(img_a,(1,2,0)) # 翻转数据,将三层的RGB作为图像的深度
        label_a = label_name[mydict[b'labels'][index_i]]
        a_name = mydict[b'filenames'][index_i]
        a_name = a_name.decode("utf8")
        # print("IMG_Train/{}/{}".format(label_a,a_name))
        if not os.path.exists("IMG_Train/{}".format(label_a)):
            os.mkdir("IMG_Train/{}".format(label_a))
        cv2.imwrite("IMG_Train/{}/{}".format(label_a,a_name),img_a) 

以下の通り:
ここに画像の説明を挿入
合計 50,000 データが分析されました。
同様に、10,000 個のテスト データを解析できます。

参照リンク

numpy チュートリアル
python チュートリアル
CIFAR10 解析コード

おすすめ

転載: blog.csdn.net/wcc243588569/article/details/129642660