#前提・実現したいこと
「弱異常検知」と他の異常検知、違いはなにか?
GitHub WeaklyAnomalyDetection(※詳細のコードはこちらに掲載されています)
上記サイト様を参考に、Pythonを用いて自前のデータセットで異常検知を行いたいと思い、そのために、自前のデータセットをロードできるようにしたいと考えております。
#発生している問題・エラーメッセージ
自分のデータセットの作成方法が良くなかったせいか、エラーメッセージは以下のようになっております。
Python
1--------------------------------------------------------------------------- 2ValueError Traceback (most recent call last) 3<ipython-input-15-cdc9ed56e962> in <module> 4 17 5 18 #trainデータからランダムに100個抽出 6---> 19 number = np.random.choice(np.arange(0,x_train_sum.shape[0]),100,replace=False) 7 20 8 21 x, y = [], [] 9 10mtrand.pyx in numpy.random.mtrand.RandomState.choice() 11 12ValueError: 'a' cannot be empty unless no samples are taken
ただ、上記のエラーの詳細については「試していること」でも述べさせていただきますが、過去にも質問をさせていただいており(※1)、確実ではありませんがエラーの原因については自分なりに把握をしているつもりです。
しかし、何故、異常検知のコードの方で以下のようにデータを呼び出しているにもかかわらず、x_train、y_train、x_test、y_testの全ての出力結果がprint()で確かめたところ、[](空白)となってしまうのかがわからず頭を抱えている状況です。
異常検知のコードの一部
from b_c_dataset import BCN_Dataset bell = 0#bellは0 call = 1#callは1 # dataset (x_train, y_train), (x_test, y_test) = BCN_Dataset.create_bcn()
※1:Pythonを用いて自前のデータセットで異常検知を行いたい
#コード
自前のデータセット(BCN_Dataset.py)
Python
1import matplotlib.pyplot as plt 2import os 3import cv2 4import random 5import numpy as np 6 7os.chdir('/Users/kuromaguro/desktop/弱教師あり学習') 8os.getcwd() 9 10DATADIR_train = '/Users/kuromaguro/desktop/弱教師あり学習/b_c_dataset/png/train' 11DATADIR_test = '/Users/kuromaguro/desktop/弱教師あり学習/b_c_dataset/png/test' 12CATEGORIES = ["bell", "call","noise"] #bellが0、callが1、noiseが2 13train_data = [] 14test_data = [] 15 16def create_bcn(): 17 random.shuffle(train_data) # データをシャッフル 18 x_train = [] # 画像データ 19 y_train = [] # ラベル情 20 for class_num, category in enumerate(CATEGORIES): 21 path = os.path.join(DATADIR_train, category) 22 for image_name in os.listdir(path): 23 try: 24 img_array = cv2.imread(os.path.join(path, image_name),) # 画像読み込み 25 img_resize_array = cv2.resize(img_array, (583, 438)) # 画像のリサイズ 26 train_data.append([img_resize_array, class_num]) # 画像データ、ラベル情報を追加 27 except Exception as e: 28 print(e) 29 30 for class_num, category in enumerate(CATEGORIES): 31 path = os.path.join(DATADIR_test, category) 32 for image_name in os.listdir(path): 33 try: 34 img_array = cv2.imread(os.path.join(path, image_name),) # 画像読み込み 35 img_resize_array = cv2.resize(img_array, (583, 438)) # 画像のリサイズ 36 test_data.append([img_resize_array, class_num]) # 画像データ、ラベル情報を追加 37 except Exception as e: 38 print(e) 39 40 random.shuffle(test_data) # データをシャッフル 41 x_test = [] # 画像データ 42 y_test = [] # ラベル情報 43 44 # データセット作成(train) 45 for feature, label in train_data: 46 x_train.append(feature) 47 y_train.append(label) 48 49 # データセット作成(test) 50 for feature, label in test_data: 51 x_test.append(feature) 52 y_test.append(label) 53 54 # numpy配列に変換 55 x_train = np.array(x_train) 56 y_train = np.array(y_train) 57 58 x_test =np.array(x_test) 59 y_test =np.array(y_test) 60 61 return (x_train, y_train), (x_test, y_test)
簡単に自分が作成している(つもり)のデータセットの内容を説明いたしますと、trainフォルダとtestフォルダにbell、call、noiseフォルダにそれぞれの音のスペクトログラムの画像が収納されており、そこからデータを取得し、ラベル付を行い(bellは0、callは1、noiseは2)train_dataとtest_dataを作成し、最終的にx_train、y_train、x_test、y_testを作成する、というコードです。
下記より異常検知のコードとなります
Python
1import matplotlib.pyplot as plt 2import os 3import cv2 4import random 5import numpy as np 6from keras.utils import to_categorical 7from keras.preprocessing.image import ImageDataGenerator 8 9os.chdir('/Users/kuromaguro/desktop/弱教師あり学習') 10os.getcwd() 11 12from b_c_dataset import BCN_Dataset 13 14bell = 0#bellは0 15call = 1#callは1 16 17# dataset 18(x_train, y_train), (x_test, y_test) = BCN_Dataset.create_bcn() 19 20x_train = x_train.reshape(x_train.shape[0], 583, 438, 3) 21x_test = x_test.reshape(x_test.shape[0], 583, 438, 3) 22 23x_train = x_train.astype('float32') / 255 24x_test = x_test.astype('float32') / 255 25 26#学習データ 27x_train_sum, x_train_c, x_train_b, x_test_c, x_test_b, = [], [], [], [], [] 28y_train_sum = [] 29 30for i in range(len(x_train)): 31 if y_train[i] == bell: 32 x_train_b.append(x_train[i]) 33 elif y_train[i] == call: 34 x_train_c.append(x_train[i]) 35 else: 36 x_train_sum.append(x_train[i]) 37 y_train_sum.append(y_train[i]) 38 39x_train_sum = np.array(x_train_sum) 40x_train_b = np.array(x_train_b) 41x_train_c = np.array(x_train_c) 42 43#trainデータからランダムに100個抽出 44number = np.random.choice(np.arange(0,x_train_sum.shape[0]),100,replace=False) 45 46x, y = [], [] 47 48for i in number: 49 x.append(x_train_sum[i]) 50 y.append(y_train_sum[i]) 51 52x_train_sum = np.array(x) 53y_train_sum = np.array(y) 54
参考サイト様の異常検知のコードはまだ続きがありますが、上記でエラーが発生してしまっているため、省略をさせていただいております。
#試していること
過去に私は似たような質問をさせていただいております。
Pythonの構文による出力結果の違い
回答してくださった方がおっしゃっていた、「メイン処理でdef create_bcn関数を読んでいない」(※関数名を変更しています)というお言葉から、上記のコードだとメイン関数を読んでいないため、x_train、y_train、x_test、y_testの中身が空白となり、結果、「エラーメッセージ」のところで記載したエラーが発生してしまっているのではないか、と考えております。そこで、現在、自前のデータセットの最後に、create_bcn関数を呼ぶために「create_bcn()」と記述をしたりしているのですが、上手くいっていない状況です。素人の質問で大変恐縮ではありますが、何かご助言でもいただけたらと思います。
#補足
使っているPCはmacOS Catalina バージョン10.15.5
Pythonのバージョンは3.6.5です
Jupiter notebookを使用しています
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/17 05:43