質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

並列処理

複数の計算が同時に実行される手法

エスケープ処理

エスケープ処理とは、一連の文字や一文字に対して、一定の規則に従って別の意味を適用する処理過程です。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1145閲覧

pyhton 画像処理

hglkmnlkygmnl

総合スコア6

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

並列処理

複数の計算が同時に実行される手法

エスケープ処理

エスケープ処理とは、一連の文字や一文字に対して、一定の規則に従って別の意味を適用する処理過程です。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/10/02 02:39

編集2019/10/18 06:42

python

1このコードとほか3つのファイルで機械学習を行います。 2 3import numpy as np 4import pandas as pd 5import cv2 6from chainer.datasets import tuple_dataset 7from random import getrandbits 8 9#学習に関する基本情報の定義 10NUM_SHAPE = 48 #画像一辺の長さ 11TRAIN_DATA_SIZE_MAG = 2 #水増しで元のデータサイズの何倍の量まで増やすか 12 13 14#Csvファイルから画像とラベルを読み込む 15def dataFromCsv(csvfile): 16 17data = pd.read_csv(csvfile,delimiter=',') 18 19train_data = data[data['Usage']=='Training'] 20publictest_data = data[data['Usage']=='PublicTest'] 21privatetest_data = data[data['Usage']=='PrivateTest'] 22 23#1行のデータを画像のカタチにする(画像枚数、1、縦、横) 24train_x = pixelsToArray_x(train_data) 25publictest_x = pixelsToArray_x(publictest_data) 26privatetest_x = pixelsToArray_x(privatetest_data) 27 28#ラベルは["neutral","happiness","surprise","sadness","anger","disgust","fear","contempt","unknown,NA"] 29#NA以外をyに入れる 30#各画像へのラベルは合計10になるので、10で割って0-1にする 31train_y = np.array(train_data.iloc[:,2:11],dtype=np.float32)/10 32publictest_y = np.array(publictest_data.iloc[:,2:11],dtype=np.float32)/10 33privatetest_y = np.array(privatetest_data.iloc[:,2:11],dtype=np.float32)/10 34 35#水増し 36train_x,train_y = augmentation(train_x,train_y) 37 38#tuple化 39train = tuple_dataset.TupleDataset(train_x,train_y) 40publictest = tuple_dataset.TupleDataset(publictest_x,publictest_y) 41privatetest = tuple_dataset.TupleDataset(privatetest_x,privatetest_y) 42 43return train,publictest,privatetest 44 45 46#水増し(holizontal Flip,Scale augmentation) 47def augmentation(x_array,y_array,train_data_size_mag = TRAIN_DATA_SIZE_MAG): 48 49#データ変換の処理4つ 50#関数が適用されるかはランダム 51def normalization(img): 52return (img - np.mean(img))/np.std(img) 53 54def gausianNoise(img): 55MEAN = 0 56SIGMA = 15 57 58gaussfilter = np.random.normal(MEAN,SIGMA,(img.shape)) 59return img + gaussfilter 60 61def holizontalFlip(img): 62return img[:,::-1] 63 64def scaleAugmentation(img): 65SCALE_MIN = 50 66SCALE_MAX = 80 67 68#拡大処理、入力された画像サイズ48*48に対して、50*50~80*80まで拡大 69SCALE_SIZE = np.random.randint(SCALE_MIN,SCALE_MAX) 70 71#リサイズ 72scale_img = cv2.resize(img,(SCALE_SIZE,SCALE_SIZE)) 73 74top = np.random.randint(0,SCALE_SIZE-NUM_SHAPE) 75left = np.random.randint(0,SCALE_SIZE-NUM_SHAPE) 76bottom = top + NUM_SHAPE 77right = left + NUM_SHAPE 78 79return scale_img[top:bottom,left:right] 80 81 82def activateAugmentFforArray(f,x_array,activateP): 83 84#変換用関数fを画像に適用させるかどうかをランダムに決める 85def randActivateF(f,img): 86if np.random.rand()>activateP: 87return img 88return f(img) 89 90imglist = [] 91#x_arrayは[データ数,色数,縦,横]なので2回ループして画像毎の関数を(ランダムに)適用 92for imgC in x_array: 93imglist.append([randActivateF(f,img) for img in imgC]) 94 95return np.array(imglist) 96 97#変換処理対象データをtrain_data_size_mag-1用意(1セットは元の画像にするため-1) 98changed_x_array = np.concatenate([x_array]*(train_data_size_mag-1),axis=0) 99 100#変換の種類ごとにactivateAugmentFforArrayを適用して、画像の変換(もしくは無変換)を行う 101changed_x_array = activateAugmentFforArray(normalization,changed_x_array,0.2) 102changed_x_array = activateAugmentFforArray(gausianNoise,changed_x_array,0.2) 103changed_x_array = activateAugmentFforArray(holizontalFlip,changed_x_array,1) 104changed_x_array = activateAugmentFforArray(scaleAugmentation,changed_x_array,0.2) 105 106return np.concatenate([x_array,changed_x_array],axis=0).astype(np.float32),np.concatenate([y_array]*train_data_size_mag,axis=0) 107 108#1行のデータを画像の形にする 109def pixelsToArray_x(data): 110np_x = np.array([np.fromstring(image,np.float32,sep=' ')/255 for image in np.array(data['pixels'])]) 111np_x.shape =(np_x.shape[0],1,NUM_SHAPE,NUM_SHAPE) 112return np_x

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2019/10/18 05:53

質問文は編集履歴から辿れるので、消しても意味ないですよ。
guest

回答1

0

ベストアンサー

dataにキーpixelsがないためにエラーを起こしています。
したがって、pixelsToArray_x()に渡す引数dataに誤りがあります。
関数定義だけでは特定できません。

投稿2019/10/02 03:21

qax

総合スコア622

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hglkmnlkygmnl

2019/10/02 03:29 編集

回答ありがとうございます。 以下にコードを示します。 このコードとほか3つのファイルで機械学習を行います。 import numpy as np import pandas as pd import cv2 from chainer.datasets import tuple_dataset from random import getrandbits #学習に関する基本情報の定義 NUM_SHAPE = 48 #画像一辺の長さ TRAIN_DATA_SIZE_MAG = 2 #水増しで元のデータサイズの何倍の量まで増やすか #Csvファイルから画像とラベルを読み込む def dataFromCsv(csvfile): data = pd.read_csv(csvfile,delimiter=',') train_data = data[data['Usage']=='Training'] publictest_data = data[data['Usage']=='PublicTest'] privatetest_data = data[data['Usage']=='PrivateTest'] #1行のデータを画像のカタチにする(画像枚数、1、縦、横) train_x = pixelsToArray_x(train_data) publictest_x = pixelsToArray_x(publictest_data) privatetest_x = pixelsToArray_x(privatetest_data) #ラベルは["neutral","happiness","surprise","sadness","anger","disgust","fear","contempt","unknown,NA"] #NA以外をyに入れる #各画像へのラベルは合計10になるので、10で割って0-1にする train_y = np.array(train_data.iloc[:,2:11],dtype=np.float32)/10 publictest_y = np.array(publictest_data.iloc[:,2:11],dtype=np.float32)/10 privatetest_y = np.array(privatetest_data.iloc[:,2:11],dtype=np.float32)/10 #水増し train_x,train_y = augmentation(train_x,train_y) #tuple化 train = tuple_dataset.TupleDataset(train_x,train_y) publictest = tuple_dataset.TupleDataset(publictest_x,publictest_y) privatetest = tuple_dataset.TupleDataset(privatetest_x,privatetest_y) return train,publictest,privatetest #水増し(holizontal Flip,Scale augmentation) def augmentation(x_array,y_array,train_data_size_mag = TRAIN_DATA_SIZE_MAG): #データ変換の処理4つ #関数が適用されるかはランダム def normalization(img): return (img - np.mean(img))/np.std(img) def gausianNoise(img): MEAN = 0 SIGMA = 15 gaussfilter = np.random.normal(MEAN,SIGMA,(img.shape)) return img + gaussfilter def holizontalFlip(img): return img[:,::-1] def scaleAugmentation(img): SCALE_MIN = 50 SCALE_MAX = 80 #拡大処理、入力された画像サイズ48*48に対して、50*50~80*80まで拡大 SCALE_SIZE = np.random.randint(SCALE_MIN,SCALE_MAX) #リサイズ scale_img = cv2.resize(img,(SCALE_SIZE,SCALE_SIZE)) top = np.random.randint(0,SCALE_SIZE-NUM_SHAPE) left = np.random.randint(0,SCALE_SIZE-NUM_SHAPE) bottom = top + NUM_SHAPE right = left + NUM_SHAPE return scale_img[top:bottom,left:right] def activateAugmentFforArray(f,x_array,activateP): #変換用関数fを画像に適用させるかどうかをランダムに決める def randActivateF(f,img): if np.random.rand()>activateP: return img return f(img) imglist = [] #x_arrayは[データ数,色数,縦,横]なので2回ループして画像毎の関数を(ランダムに)適用 for imgC in x_array: imglist.append([randActivateF(f,img) for img in imgC]) return np.array(imglist) #変換処理対象データをtrain_data_size_mag-1用意(1セットは元の画像にするため-1) changed_x_array = np.concatenate([x_array]*(train_data_size_mag-1),axis=0) #変換の種類ごとにactivateAugmentFforArrayを適用して、画像の変換(もしくは無変換)を行う changed_x_array = activateAugmentFforArray(normalization,changed_x_array,0.2) changed_x_array = activateAugmentFforArray(gausianNoise,changed_x_array,0.2) changed_x_array = activateAugmentFforArray(holizontalFlip,changed_x_array,1) changed_x_array = activateAugmentFforArray(scaleAugmentation,changed_x_array,0.2) return np.concatenate([x_array,changed_x_array],axis=0).astype(np.float32),np.concatenate([y_array]*train_data_size_mag,axis=0) #1行のデータを画像の形にする def pixelsToArray_x(data): np_x = np.array([np.fromstring(image,np.float32,sep=' ')/255 for image in np.array(data['pixels'])]) np_x.shape =(np_x.shape[0],1,NUM_SHAPE,NUM_SHAPE) return np_x
qax

2019/10/02 04:07

train_data にキー"pixels"が無いようですね。 以下2点確認をしてみてください。 (1) CSVファイルにPixels列があるか。 (2) CSVファイルのヘッダ行が2行以上で構成されていないか。
hglkmnlkygmnl

2019/10/02 07:25

Usageの列にtrainingとprivate test, public testの種類があり、Image nameには画像の名前で、neutral , happiness , surprise, sadness, anger, disgust , fear , contempt , unknown, NFには各値があります。 なので、pixelsの列はありません。ヘッダはこの一行です。
qax

2019/10/02 11:09

train_dataはDataFrameですから、それを渡しているdataもDataFrameです。 data['pixels']を実行するためには、dataにカラム名がpixelsの列がなければなりません。 dataにカラム名pixelsがあるというのはすなわち、csvファイルにpixelsの列かあるということです。 よって、csvファイルにpixelsがないのであれば当然動きません
hglkmnlkygmnl

2019/10/02 12:02

つまり、csvファイルにpixelsの列を新たに作るのと良いですか? それとも、別の手法でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問