画像アノテーション の保存方法
ディープラーニングについて、最初によく出てくるのは、大量のデータまたは大量の画像でしょうか。持っている画像の数が多いほど、コンピュータのストレージスペースはより多くのメモリを消費する。ImageNetは、分類、検出、セグメンテーションなどのタスクのモデルをトレーニングするために収集されるよく知られた画像データベースだ。 1400万枚以上の画像が含まれている。
この記事では、画像アノテーション を保存する3つの方法をご紹介いたします。
1)png形式の画像ファイルとして保存
このディスクに 画像アノテーション を保存するには シンプルで業務効率化のために Pillowをインストールをする必要がある。
$pip install pillow
ファイルをアーカイブするには?
from PIL import Image
import csv
def store_single_disk(image, image_id, label):
Image.fromarray(image).save(disk_dir / f”{image_id}.png”)
with open(disk_dir / f”{image_id}.csv”, “wt”) as csvfile:
writer = csv.writer(
csvfile, delimiter=” “, quotechar=”|”, quoting=csv.QUOTE_MINIMAL
)
writer.writerow([label])
ディスクに保存されているデータを処理するときは、すべてのファイルを開かなくても済むように、別のファイルラベルを.csvファイルに保存する必要がある。
2) Lightning メモリマップデータベース(LMDB)に保存
LMDBは、各項目がバイト配列として格納されるキー値ストレージシステムである。キーは各画像の一意の識別子になり、値は画像自体になる。データベース全体をメモリにマップし、すべてのフェッチデータは、マップされたメモリからデータを直接返す。他のほとんどのデータベースと違いし、メモリに何もコピーすることなく、キーと値の両方のメモリアドレスへのポインタを直接返すということだ。 LMDBをインストールして試してみましょう!
$ pip install lmdb
CIFARを使って取得する
class CIFAR_Image:
def __init__(self, image, label):
# Dimensions of image for reconstruction – not really necessary
# for this dataset, but some datasets may include images of
# varying sizes
self.channels = image.shape[2]
self.size = image.shape[:2]
self.image = image.tobytes()
self.label = label
def get_image(self):
“”” Returns the image as a numpy array. “””
image = np.frombuffer(self.image, dtype=np.uint8)
return image.reshape(*self.size, self.channels)
画像アノテーション の保存
import lmdb
import pickle
def store_single_lmdb(image, image_id, label):
map_size = image.nbytes * 10
# Create a new LMDB environment
env = lmdb.open(str(lmdb_dir / f”single_lmdb”), map_size=map_size)
# Start a new write transaction
with env.begin(write=True) as txn:
# All key-value pairs need to be strings
value = CIFAR_Image(image, label)
key = f”{image_id:08}”
txn.put(key.encode(“ascii”), pickle.dumps(value))
env.close()
3) HDF5形式に保存
HDF5を使用すると、複数のデータセットを保存し、データを分割して保存できる。最初にpipをインストールしましょう。
$ pip install h5py
HDF5ファイルを作成
import numpy as np
import h5py
data_order = ‘tf’ # ‘tf’ for Tensorflow
# check the order of data and chose proper data shape to save image
train_shape = (len(train_addrs), 224, 224, 3)
val_shape = (len(val_addrs), 224, 224, 3)
test_shape = (len(test_addrs), 224, 224, 3)
# open a hdf5 file and create earrays
hdf5_file = h5py.File(hdf5_path, mode=’w’)
hdf5_file.create_dataset(“train_img”, train_shape, np.int8)
hdf5_file.create_dataset(“val_img”, val_shape, np.int8)
hdf5_file.create_dataset(“test_img”, test_shape, np.int8)
hdf5_file.create_dataset(“train_mean”, train_shape[1:], np.float32)
hdf5_file.create_dataset(“train_labels”, (len(train_addrs),), np.int8)
hdf5_file[“train_labels”][…] = train_labels
hdf5_file.create_dataset(“val_labels”, (len(val_addrs),), np.int8)
hdf5_file[“val_labels”][…] = val_labels
hdf5_file.create_dataset(“test_labels”, (len(test_addrs),), np.int8)
hdf5_file[“test_labels”][…] = test_label
ロードして保存する方法は?
mean = np.zeros(train_shape[1:], np.float32)
# loop over train addresses
for i in range(len(train_addrs)):
# print how many images are saved every 1000 images
if i % 1000 == 0 and i > 1:
print ‘Train data: {}/{}’.format(i, len(train_addrs))
# read an image and resize to (224, 224)
# cv2 load images as BGR, convert it to RGB
addr = train_addrs[i]
img = cv2.imread(addr)
img = cv2.resize(img, (224, 224), interpolation=cv2.INTER_CUBIC)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# add any image pre-processing here
# if the data order is Theano, axis orders should change
if data_order == ‘th’:
img = np.rollaxis(img, 2)
# save the image and calculate the mean so far
hdf5_file[“train_img”][i, …] = img[None]
mean += img / float(len(train_labels))
# loop over validation addresses
for i in range(len(val_addrs)):
# print how many images are saved every 1000 images
if i % 1000 == 0 and i > 1:
print ‘Validation data: {}/{}’.format(i, len(val_addrs))
# read an image and resize to (224, 224)
# cv2 load images as BGR, convert it to RGB
addr = val_addrs[i]
img = cv2.imread(addr)
img = cv2.resize(img, (224, 224), interpolation=cv2.INTER_CUBIC)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# add any image pre-processing here
# if the data order is Theano, axis orders should change
if data_order == ‘th’:
img = np.rollaxis(img, 2)
# save the image
hdf5_file[“val_img”][i, …] = img[None]
# loop over test addresses
for i in range(len(test_addrs)):
# print how many images are saved every 1000 images
if i % 1000 == 0 and i > 1:
print ‘Test data: {}/{}’.format(i, len(test_addrs))
# read an image and resize to (224, 224)
# cv2 load images as BGR, convert it to RGB
addr = test_addrs[i]
img = cv2.imread(addr)
img = cv2.resize(img, (224, 224), interpolation=cv2.INTER_CUBIC)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# add any image pre-processing here
# if the data order is Theano, axis orders should change
if data_order == ‘th’:
img = np.rollaxis(img, 2)
# save the image
hdf5_file[“test_img”][i, …] = img[None]
# save the mean and close the hdf5 file
hdf5_file[“train_mean”][…] = mean
hdf5_file.close()
アノテーションの詳細 については、こちらを参照してください。
Lotus Quality Assurance (LQA)
電話番号: (+84) 24-6660-7474
メール: [email protected]
ウェブサイト: https://www.lotus-qa.com/
Youtube: Lotus QA チャネル