以前まで以下のコードを用いて顔認証を実行できていたのですが、突然エラーが発生し使えなくなりました。
コード自体は編集していないのになぜなのでしょうか?
(追記)
今まではFaceEditedというフォルダに顔の写真を入れていたのですが、今回は眼だけを切り抜いて入れています。どうやらそれが原因のようです。調べてみると画像をnumpy配列に変換した後、そのnumpy配列をtensorへと変換することが出来ていないようです。tf.convert_to_tensorというコードを使えば変換できるということはわかるのですが、どのようにコードをかけばよいのでしょうか。ご教示ください。
from google.colab import drive drive.mount('/content/drive') from __future__ import print_function from keras.utils.np_utils import to_categorical from keras.layers import Activation, Conv2D, Dense, Flatten, MaxPooling2D from keras.models import Sequential import numpy as np import shutil import random import cv2 import glob import os import matplotlib.pyplot as plt '''顔認識したい人の名前を定義する''' # 顔認識する対象を決定(検索ワードを入力) SearchName = ["A","B","C","D"] # 画像の取得枚数の上限 ImgNumber =100 # CNNで学習するときの画像のサイズを設定(サイズが大きいと学習に時間がかかる) ImgSize=(128,128) input_shape=(128,128,3) for name in SearchName: in_dir = '/content/drive/My Drive/FaceEdited/'+name in_jpg=os.listdir(in_dir) #img_file_name_listをシャッフル、そのうち2割をtest_imageディテクトリに入れる random.shuffle(in_jpg) os.makedirs('/content/drive/My Drive/test/' + name, exist_ok=True) for t in range(len(in_jpg)//5): shutil.move("/content/drive/My Drive/FaceEdited/"+name+"/"+str(in_jpg[t]), "/content/drive/My Drive/test/"+name) X_train = [] Y_train = [] for i in range(len(SearchName)): img_file_name_list=os.listdir('/content/drive/My Drive/FaceEdited/'+SearchName[i]) print(img_file_name_list) print("{}:トレーニング用の写真の数は{}枚です。".format(SearchName[i],len(img_file_name_list))) for j in range(0,len(img_file_name_list)-1): n=os.path.join('/content/drive/My Drive/FaceEdited/'+SearchName[i]+"/",img_file_name_list[j]) img = cv2.imread(n) if img is None: print('image' + str(j) + ':NoImage') continue else: r,g,b = cv2.split(img) img = cv2.merge([r,g,b]) X_train.append(img) Y_train.append(i) print("") # テストデータのラベル付け X_test = [] # 画像データ読み込み Y_test = [] # ラベル(名前) for i in range(len(SearchName)): img_file_name_list=os.listdir("/content/drive/My Drive/test/"+SearchName[i]) print("{}:テスト用の写真の数は{}枚です。".format(SearchName[i],len(img_file_name_list))) for j in range(0,len(img_file_name_list)-1): n=os.path.join("/content/drive/My Drive/test/"+SearchName[i]+"/",img_file_name_list[j]) img = cv2.imread(n) if img is None: print('image' + str(j) + ':NoImage') continue else: r,g,b = cv2.split(img) img = cv2.merge([r,g,b]) X_test.append(img) Y_test.append(i) X_train=np.array(X_train) X_test=np.array(X_test) y_train = to_categorical(Y_train) y_test = to_categorical(Y_test) model = Sequential() model.add(Conv2D(input_shape=input_shape, filters=32,kernel_size=(3, 3), strides=(1, 1), padding="same")) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(filters=32, kernel_size=(3, 3), strides=(1, 1), padding="same")) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(filters=32, kernel_size=(3, 3), strides=(1, 1), padding="same")) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(256)) model.add(Activation("sigmoid")) model.add(Dense(128)) model.add(Activation('sigmoid')) # 分類したい人数を入れる model.add(Dense(len(SearchName))) model.add(Activation('softmax')) # コンパイル model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy']) history = model.fit(X_train, y_train, batch_size=70, epochs=50, verbose=1, validation_data=(X_test, y_test)) # 汎化制度の評価・表示 score = model.evaluate(X_test, y_test, batch_size=32, verbose=0) print('validation loss:{0[0]}\nvalidation accuracy:{0[1]}'.format(score)) #acc, val_accのプロット} plt.plot(history.history["accuracy"], label="accuracy", ls="-", marker="o") plt.plot(history.history["val_accuracy"], label="val_accuracy", ls="-", marker="x") plt.ylabel("accuracy") plt.xlabel("epoch") plt.legend(loc="best") plt.show() #モデルを保存 model.save("MyModel.h5")
実行結果が以下になります。
Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True). ['(12).jpg', '(1).jpg', '(0).jpg', '(15).jpg', '(14).jpg', '(13).jpg', '(8).jpg', '(6).jpg'] A:トレーニング用の写真の数は8枚です。 ['(18).jpg', '(13).jpg', '(12).jpg', '(1).jpg', '(0).jpg', '(7).jpg', '(23).jpg', '(22).jpg'] B:トレーニング用の写真の数は8枚です。 ['(15).jpg', '(11).jpg', '(10).jpg', '(1).jpg', '(3).jpg', '(19).jpg', '(18).jpg', '(17).jpg'] C:トレーニング用の写真の数は8枚です。 ['(23).jpg', '(21).jpg', '(18).jpg', '(17).jpg', '(16).jpg', '(8).jpg', '(4).jpg', '(3).jpg'] D:トレーニング用の写真の数は8枚です。 A:テスト用の写真の数は16枚です。 B:テスト用の写真の数は16枚です。 C:テスト用の写真の数は16枚です。 D:テスト用の写真の数は16枚です。 --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-2-12f67ddaedf6> in <module>() 106 107 history = model.fit(X_train, y_train, batch_size=70, --> 108 epochs=50, verbose=1, validation_data=(X_test, y_test)) 109 110 13 frames /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/constant_op.py in convert_to_eager_tensor(value, ctx, dtype) 96 dtype = dtypes.as_dtype(dtype).as_datatype_enum 97 ctx.ensure_initialized() ---> 98 return ops.EagerTensor(value, ctx.device_name, dtype) 99 100 ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type numpy.ndarray).
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。