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
回答1件
あなたの回答
tips
プレビュー