Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Python

Pythonで画像をcsvに変換する方法について

投稿日:2023年4月28日 更新日:

 

<目次>

(1) Pythonで画像をcsvに変換する方法について
 (1-0) やりたいこと
 (1-1) STEP1:前提(Kerasにおける画像データの取り扱い形式)
 (1-2) STEP2:変換プログラム
 (1-3) STEP3:csv変換

(1) Pythonで画像をcsvに変換する方法について

(1-0) やりたいこと

・PNGやJPGの画像データを、kerasで扱う形式(Pixel値の行列)に変換したい。
・PNGやJPGの画像データから、kerasで扱う正解データを作成したい。
 
課題となるのは、バイナリデータをどのようにして28×28などのピクセルに変換するか?といった部分です。
 
(図131)

(1-1) STEP1:前提(Kerasにおける画像データの取り扱い形式)

kerasのmodel.fitに入れるXとYはどのようなデータか?について、前提を確認しておきます。

元データ

・MNISTのデータは「784pixel+1正解値=785値」×70000行分ある。

抽出データ

fetch_openmlがXYに分解してくれるが、分解後のデータは下記のようになる。
X:(70000枚, 784ピクセル)
Y:(70000枚,)

参考

画像データ全体(70000枚)
mnist_X.shape : (70000, 784)
正解データ全体(70000個)
mnist_y.shape : (70000,)
画像データ1枚
mnist_X[0].shape : (784,) = (28×28,)
↓画像1枚のデータ
[  0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   3.  18.
  18.  18. 126. 136. 175.  26. 166. 255. 247. 127.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.  30.  36.  94. 154. 170. 253.
 253. 253. 253. 253. 225. 172. 253. 242. 195.  64.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.  49. 238. 253. 253. 253. 253. 253.
 253. 253. 253. 251.  93.  82.  82.  56.  39.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.  18. 219. 253. 253. 253. 253. 253.
 198. 182. 247. 241.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.  80. 156. 107. 253. 253. 205.
  11.   0.  43. 154.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.  14.   1. 154. 253.  90.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0. 139. 253. 190.
   2.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  11. 190. 253.
  70.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  35. 241.
 225. 160. 108.   1.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  81.
 240. 253. 253. 119.  25.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
  45. 186. 253. 253. 150.  27.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.  16.  93. 252. 253. 187.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0. 249. 253. 249.  64.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
  46. 130. 183. 253. 253. 207.   2.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  39. 148.
 229. 253. 253. 253. 250. 182.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  24. 114. 221. 253.
 253. 253. 253. 201.  78.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.  23.  66. 213. 253. 253. 253.
 253. 198.  81.   2.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.  18. 171. 219. 253. 253. 253. 253. 195.
  80.   9.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.  55. 172. 226. 253. 253. 253. 253. 244. 133.  11.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0. 136. 253. 253. 253. 212. 135. 132.  16.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.]

(1-2) STEP2:変換プログラム

Kaggleのデータを、上記のようにKerasに渡せる形式に整形する。

(1-2-1)STEP2-1:前提事項の確認

(前提)
下記のように、jpgデータが階層的に配置されている。
kaggle_download_dataset
∟train
∟test1
 
(図131)
(サンプルプログラム)
# dogs-vs-catsのデータセットをロードし、リサイズして、新しいnpy形式で保存
from os import listdir
from numpy import asarray
from numpy import save
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
# データセットの格納場所を設定
folder = './kaggle_download_dataset/train/'
photos, labels = list(), list()
# ディレクトリ内のファイルをループ
for file in listdir(folder):
    # 分類ラベルの決定
    # デフォルトは0.0(cat)
    output = 0.0
    # 画像のファイル名がdogから始まる場合
    if file.startswith('dog'):
        # 分類は1.0(dog)にする
        output = 1.0
    # 画像の読込みとリサイズ
    photo = load_img(folder + file, target_size=(200, 200))
    # numpy配列への変換
    photo = img_to_array(photo)
    # 末尾に追加
    photos.append(photo)
    labels.append(output)

# numpy配列への変換
photos = asarray(photos)
labels = asarray(labels)
print(photos.shape, labels.shape)

# リサイズした画像データ(ピクセルのマトリクス)を保存
save('dogs_vs_cats_photos.npy', photos)
save('dogs_vs_cats_labels.npy', labels)
(図133)
(処理概要)
・入力データセットの全画像をループ
・64×64×3(RGB)=12288ピクセルにリサイズ
・12288ピクセルを1つのリストに保持
・12288ピクセル+分類の正解値をcsv出力(1行1画像)
 

(1-2-2)STEP2-2:処理結果チェック

結果として、npyファイルが2つ生成されます。
_photosは入力(X)データの配列群で、_labelsは正解データ(Y)の配列群です。
 
(図132)

(1-2-3)STEP2-3:出力結果のロード方法

出力したnpyデータは下記のようにロードできます。
# npyデータをロードして形状を確認
from numpy import load
photos = load('dogs_vs_cats_photos.npy')
labels = load('dogs_vs_cats_labels.npy')
print(photos.shape, labels.shape)
形状:(25000, 200, 200, 3) (25000,)

(1-3) STEP3:csv変換

.npyではなく.csvで保存したい場合はプログラムを次のように書き換えます。
 
・Before
from numpy import save
# リサイズした画像データ(ピクセルのマトリクス)を保存
save('dogs_vs_cats_photos.npy', photos)
save('dogs_vs_cats_labels.npy', labels)
・After
from numpy import savetxt
# リサイズした画像データ(ピクセルのマトリクス)を保存
savetxt("dogs_vs_cats_photos"+str(photos.shape)+".csv", photos.flatten(), delimiter=",")
savetxt("dogs_vs_cats_labels.csv", labels, delimiter=",")

Adsense審査用広告コード


Adsense審査用広告コード


-Python
-

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Pythonのコンストラクタの基礎と「self」や「__init__」について

<目次> (1) Pythonのコンストラクタの基礎と「self」や「__init__」について  (1-1) 「__init__」やコンストラクタについて  (1-2) コンストラクタで使われる「s …

Bing AIのAPIを疎通(HelloWorld)

  <目次> (1) Bing AIのAPIを疎通(HelloWorld)  やりたいこと/概要  前提条件  STEP1:Bing Web Search APIにサインアップ  STEP2 …

PythonでSQLAlchemyを使ってOracleDBに接続する方法

(0)目次&概説 (1) 記事の目的  (1-1) 目的  (1-2) 前提条件 (2) 事前準備  (2-1) 準備1(cx_oracleパッケージの導入)   (2-1-1) インストール資源の入 …

PythonでPandasライブラリを用いてcsvファイルを読み込む方法

<目次> (1) PythonでPandasライブラリを用いてcsvファイルを読み込む方法  (1-1) 構文  (1-2) サンプルプログラム  (1-3) read_csvの主要なオプションご紹介 …

no image

Pythonでランダムな座標データを生成する方法

  <目次> (1) Pythonでランダムな座標データを生成する方法  (1-1) 使う構文  (1-2) サンプルプログラム  (1-3) 補足:データの座標を全体的にシフトしたい場合 …

  • English (United States)
  • 日本語
Top