アプリケーション開発ポータルサイト
ServerNote.NET
カテゴリー【PythonGoogle
Google ColaboratoryでCIFAR-10の画像データを抽出しドライブに保存する
POSTED BY
2023-12-31

ディープラーニングのテストをしたいとき大量のサンプル画像が必要になるが、CIFARを使うことで画像を取得できる。

https://www.cs.toronto.edu/~kriz/cifar.html

airplane,automobile,bird,cat,deer,dog,frog,horse,ship,truckという10カテゴリの画像(32×32)がそれぞれ大量に用意されている。
これはPythonから直接ロードできるバイナリ形式で提供されているが、それぞれを各画像ファイルに落としてから見やすく使いたい場合がある。
その場合は画像抽出のPythonコードを書いて保存していく。今回これをGoogle Colaboratoryで行う。

Google ColaboratoryはGmail,Google Driveと同様Googleファミリーのサービスで、オンラインでPythonのコードが実行できる。
ファイルの読み書きはGoogle Driveを介して行うので、CIFARバイナリ元データ、および画像抽出出力データはドライブに保存することになる。

1、Google Colaboratoryにて画像抽出コードの下準備

https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja

を開き、使用したい自分のGmail/Google Driveアカウントに切り替えて使い始める。

ファイル→ノートブックを新規作成で、Untitled.ipynbをsave-cifar10-images.ipynbに変更する。

左端のフォルダアイコンをクリックししばし待つと3つのアイコンが出るので右端のGoogle Driveフォルダアイコンをクリック
→このノートブックにGoogleドライブのファイルへのアクセスを許可しますか?→GOOGLEドライブに接続する。
Googleドライブをマウントしています...で完了するとディレクトリツリーが現れて、ドライブファイルが読み書きできるようになる。

drive/MyDrive/Colab Notebooks/save-cifar10-images.ipynbが作成されていることを確認する。

ColaboratoryのPythonコードからは、/content/drive/MyDrive/Colab Notebooks/ のようなパス指定でアクセスできる。

2、Google DriveにCIFAR10バイナリデータのアップロード

次に自分のGoogle Driveを開き、マイドライブ→Colab Notebooksフォルダを開く。ここにアップロードする。

CIFARのサイトからCIFAR-10 python versionをダウンロードする。

https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz

tar.gzは7-Zipかなにかでフォルダ展開する。出来上がったcifar-10-batches-pyフォルダを上記Colab Notebooksフォルダにドロップしアップロード。

3、Google Colaboratoryにて画像抽出コードを書いて実行

Google Colaboratoryのsave-cifar10-images.ipynb編集画面に戻り、再生アイコンのところに以下抽出コードを貼り付ける。

今回は、Colab Notebooks/cifar-10-batches-py/data_batch_1のバイナリデータを抽出してColab Notebooks/cifar-10-images-1フォルダに保存していくサンプルとする。

Pythonsave-cifar10-images.pyGitHub Source
from PIL import Image
import numpy as np
import os, sys

input_dir = '/content/drive/MyDrive/Colab Notebooks/cifar-10-batches-py/data_batch_1'
output_dir = '/content/drive/MyDrive/Colab Notebooks/cifar-10-images-1'
label_file = '/content/drive/MyDrive/Colab Notebooks/cifar-10-batches-py/batches.meta'

def read_bin(path):
  import pickle
  with open(path, 'rb') as f:
    r = pickle.load(f, encoding='bytes')
  return r

# 保存先ディレクトリの作成とカテゴリディレクトリの作成
try:
  os.makedirs(output_dir)
except:
  pass
labels = read_bin(label_file)
if b"label_names" in labels:
  labels = read_bin(label_file)[b"label_names"]
else:
  labels = read_bin(label_file)[b"coarse_label_names"]
for i in labels:
  try:
    dir=os.path.join(output_dir, i.decode('utf-8'))
    os.makedirs(dir)
  except:
    pass

# 画像バイナリの読み込み
images = read_bin(input_dir)
files = images[b"filenames"]
if b"labels" in images:
  image_labels = images[b"labels"]
else:
  image_labels = images[b"coarse_labels"]
image_data = images[b"data"]

# 画像ファイルとして保存
for i,_ in enumerate(files):
  file = files[i]
  image_label = image_labels[i]
  image = image_data[i]
  path = os.path.join(os.path.join(output_dir, labels[image_label].decode('utf-8'), file.decode('utf-8')))
  out_image_1 = np.reshape(image, [3, 32, 32]).transpose(1,2,0)
  out_image_2 = Image.fromarray(out_image_1)
  with open(path, mode='wb') as o:
    out_image_2.save(o)
  print("saved: {}".format(path))

再生アイコンを押すと実行され、以下のような出力とともにガンガン保存されていく。

...
saved: /content/drive/MyDrive/Colab Notebooks/cifar-10-images-1/automobile/coupe_s_001419.png
saved: /content/drive/MyDrive/Colab Notebooks/cifar-10-images-1/cat/tabby_cat_s_002128.png
saved: /content/drive/MyDrive/Colab Notebooks/cifar-10-images-1/airplane/airbus_s_000788.png
...

Google Driveに戻ってColab Notebooks/cifar-10-images-1/フォルダの中身を見て大量に画像ができていることを確認する。

※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【WEBMASTER/管理人】
自営業プログラマーです。お仕事ください!
ご連絡は以下アドレスまでお願いします★

【キーワード検索】