TensorFlowで画像をnpy形式に変換する際にOpenCVを使ってましたが、エラーで完全にはまったのでメモ。
愚かなことに、ファイル入出力関連の関数は失敗したときの例外処理をきちんとしないと完全に詰むことを忘れてました。imread関数もその一種です。
以下はtensorflow用のデータセットを作る関数です。
imread関数を読んだ後の処理は、None判定をかませて行っています。
こうしないとNoneでコケるので必ずこれを行う必要があります。
(よくよく考えたら当たり前なんだよなあ...)
import os, sys
import numpy as np
import tensorflow as tf
import cv2
# config
flags = tf.app.flags
FLAGS = flags.FLAGS
flags.DEFINE_string('imgdir', '/home/hoge/fuga/piyo', 'Image dataset path')
flags.DEFINE_string('imgclasses', 4, 'The num of image dataset classes')
IMAGE_SIZE = 84 # the size of image
TRAIN_IMG_DIRS = os.listdir(FLAGS.imgdir)
def main():
train_image, train_label = cvGetImageAndLabel()
#学習とかのコードは面倒なので略
def cvGetImageAndLabel():
images = []
labels = []
for i, d in enumerate(TRAIN_IMG_DIRS):
files = os.listdir(FLAGS.imgdir + '/' + d)
for f in files:
img = cv2.imread(FLAGS.imgdir + '/' + d + '/' + f)
# この部分でNone判定
if not img is None:
img = cv2.resize(img, (IMAGE_SIZE, IMAGE_SIZE), interpolation = cv2.INTER_AREA)
img = img.flatten().astype(np.float32)/255.0
images.append(img)
tmp = np.zeros(FLAGS.imgclasses)
tmp[i] = 1
labels.append(tmp)
return np.asarray(images, dtype=np.float32), np.asarray(labels, dtype=np.float32)
if __name__ == '__main__':
main()
コードの汚さはご愛敬です(?)
参考リンク