Google Colaboratory便利ですね。
Google Colaboratoryで、データセットを作成したく、色々と試してみました。
正直、これで良いのかまだ、不明なところがあるのですが、ひとまず、紹介です。
やることをざっくりと分けると、下記フローでした。
(1):画像データ一覧をZipファイルに圧縮
(2):ZipファイルをGoogle Colaboratoryへアップロード
(3):Google Colaboratoryで、zipファイルを解凍
(4):Zipファイル内の画像データのファイルパス一覧を取得
(5):画像のFilePathを個別に取得
(6):画像データをNumPy配列ndarrayとして取得
(7):画像のリサイズ
(8):NumPy配列ndarrayとして、データセットとして保存
(1):画像データ一覧をZipファイルに圧縮
これは、普通にやってください。
※犬の画像を3枚取得して。ファイル名を(a.png, b.png, c.png)としました。
※Zipファイル名をdataset_vol2.zipとしました
(2):ZipファイルをGoogle Colaboratoryへアップロード
ZipファイルをGoogle Colaboratoryへアップロードします。
Colaboratoryファイルの、左部を開くとアップロードという箇所があるので、ここから、zipファイルをアップロードします。
(3):Google Colaboratoryで、zipファイルを解凍
Colaboratoryで、Zipファイルを解凍する際はZipファイルがある場所まで移動しましょう。
まずは、自分が何処の階層にいるのかを確認しましょう。
!ls
dataset_vol2.zip
sample_data
dataset_vol2.zip がある階層です。
それでは、解凍していきましょう。
解凍するコマンドは、!unzip です。
!unzip dataset_vol2.zip
Archive: dataset_vol2.zip
creating: dataset_vol2/
inflating: dataset_vol2/b.png
creating: __MACOSX/
creating: __MACOSX/dataset_vol2/
inflating: __MACOSX/dataset_vol2/._b.png
inflating: dataset_vol2/c.png
inflating: __MACOSX/dataset_vol2/._c.png
inflating: dataset_vol2/a.png
inflating: __MACOSX/dataset_vol2/._a.png
これで、Zipファイルが解凍されました。
(4):Zipファイル内の画像データのファイルパス一覧を取得
解凍したファイルの中へ移動していきましょう。
#ファイル移動
%cd dataset_vol2
!ls
a.png b.png c.png
(5):画像のFilePathを個別に取得
必要なライブラリをimportします。
import matplotlib.pyplot as plt
import os
import cv2
import glob
import numpy as np
フォルダの中のファイルPath一覧を取得する方法として、
Pythonのglobモジュールを活用しました。 詳しくは、下記を参考にしてます。
ワイルドカード(*)などを使って柔軟にFilePathを取得できるので、便利ですね。
▼Pythonで条件を満たすパスの一覧を再帰的に取得するglobの使い方
https://note.nkmk.me/python-glob-usage/
また、現在位置は、dataset_vol2の中にいるので、
このままでも問題ないですが、globを使う際には、取得したいファイルの中に移動してあげるのがいいでしょう。
そのために、コマンドじゃなく、ファイル階層を移動できる下記を使いました。
os.chdir(“Path名称”)
#階層移動
os.chdir("/content/dataset_vol2")
#階層内のPathを全取得
path = glob.glob("*")
print(path)
[‘a.png’, ‘c.png’, ‘b.png’]
もちろん、今回はファイル名を(a.png, b.png, c.png)にしたので、
当たり前の結果ですが、データ個数が多くなれば必要な作業です。
(6):画像データをNumPy配列ndarrayとして取得
(7):画像のリサイズ
(8):NumPy配列ndarrayとして、データセットとして保存
ここからは、一気にデータセット作成までいきましょう。
#データセットを格納する変数
training_data = []
#リサイズ後のサイズ
IMG_SIZE = 350
#個別のFilePathに対して処理していきます。
for p in path:
pathEach = p
print(pathEach)
#NumPy配列ndarrayとして読み込まれ、ndarrayを画像として保存
imageTTTT = cv2.imread(pathEach,cv2.IMREAD_GRAYSCALE)
#画像のりサイズ
img_resize_array = cv2.resize(imageTTTT, (IMG_SIZE, IMG_SIZE))
print(imageTTTT)
print(img_resize_array.dtype)
training_data.append(img_resize_array)
plt.imshow(img_resize_array, cmap="gray")
plt.show()
print("=============")
cv2.imreadを解説します。
OpenCVライブラリでは、様々なことができます。
imreadメソッドで、画像ファイルを読み込み、
NumPy配列ndarrayとして読み込まれ、ndarrayを画像として保存することができます。
ndarray型については、下記記事にも書きましたので参照下さい。
▼Numpyのarray・ndarrayって何。 簡単に説明します。
http://prglog.info/home/?p=29
imreadの詳細については、下記参考
▼Python, OpenCVで画像ファイルの読み込み、保存
https://note.nkmk.me/python-opencv-imread-imwrite/
print(training_data)
[array([[ 36, 36, 36, …, 191, 193, 193],
[ 36, 36, 36, …, 191, 192, 192],
[ 36, 36, 36, …, 190, 190, 190],
…,
[223, 221, 220, …, 225, 226, 228],
[225, 223, 222, …, 226, 228, 230],
[227, 225, 224, …, 228, 230, 232]], dtype=uint8), array([[ 84, 83, 82, …, 29, 27, 27],
[ 93, 92, 91, …, 34, 33, 32],
[102, 102, 101, …, 38, 37, 36],
…,
[126, 117, 110, …, 128, 133, 121],
[123, 117, 116, …, 134, 138, 127],
[119, 118, 122, …, 138, 142, 132]], dtype=uint8), array([[158, 158, 158, …, 142, 144, 147],
[158, 158, 158, …, 144, 146, 148],
[158, 158, 157, …, 146, 148, 149],
…,
[211, 208, 208, …, 212, 212, 211],
[219, 217, 217, …, 208, 207, 206],
[224, 223, 223, …, 205, 203, 203]], dtype=uint8)]
ここで、完了かなと思います。
ただ、他の記事を見てみると、ここからarrayメソッドを使って、ndarray型にデータを変換していたりします。
training_data = np.array(training_data)
print(training_data)
[[[ 36 36 36 … 191 193 193]
[ 36 36 36 … 191 192 192]
[ 36 36 36 … 190 190 190]
…
[223 221 220 … 225 226 228]
[225 223 222 … 226 228 230]
[227 225 224 … 228 230 232]]
[[ 84 83 82 … 29 27 27]
[ 93 92 91 … 34 33 32]
[102 102 101 … 38 37 36]
…
[126 117 110 … 128 133 121]
[123 117 116 … 134 138 127]
[119 118 122 … 138 142 132]]
[[158 158 158 … 142 144 147]
[158 158 158 … 144 146 148]
[158 158 157 … 146 148 149]
…
[211 208 208 … 212 212 211]
[219 217 217 … 208 207 206]
[224 223 223 … 205 203 203]]]
これで、ndarray型のデータが出来上がったということなのでしょうか。
ここは少し理解が浅いところですので、調べてみます。