質問編集履歴
2
書式変更
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
pyhton 画像処理
|
test
CHANGED
@@ -1 +1,227 @@
|
|
1
|
+
```python
|
2
|
+
|
3
|
+
このコードとほか3つのファイルで機械学習を行います。
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
import numpy as np
|
8
|
+
|
9
|
+
import pandas as pd
|
10
|
+
|
11
|
+
import cv2
|
12
|
+
|
1
|
-
|
13
|
+
from chainer.datasets import tuple_dataset
|
14
|
+
|
15
|
+
from random import getrandbits
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
#学習に関する基本情報の定義
|
20
|
+
|
21
|
+
NUM_SHAPE = 48 #画像一辺の長さ
|
22
|
+
|
23
|
+
TRAIN_DATA_SIZE_MAG = 2 #水増しで元のデータサイズの何倍の量まで増やすか
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
#Csvファイルから画像とラベルを読み込む
|
30
|
+
|
31
|
+
def dataFromCsv(csvfile):
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
data = pd.read_csv(csvfile,delimiter=',')
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
train_data = data[data['Usage']=='Training']
|
40
|
+
|
41
|
+
publictest_data = data[data['Usage']=='PublicTest']
|
42
|
+
|
43
|
+
privatetest_data = data[data['Usage']=='PrivateTest']
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
#1行のデータを画像のカタチにする(画像枚数、1、縦、横)
|
48
|
+
|
49
|
+
train_x = pixelsToArray_x(train_data)
|
50
|
+
|
51
|
+
publictest_x = pixelsToArray_x(publictest_data)
|
52
|
+
|
53
|
+
privatetest_x = pixelsToArray_x(privatetest_data)
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
#ラベルは["neutral","happiness","surprise","sadness","anger","disgust","fear","contempt","unknown,NA"]
|
58
|
+
|
59
|
+
#NA以外をyに入れる
|
60
|
+
|
61
|
+
#各画像へのラベルは合計10になるので、10で割って0-1にする
|
62
|
+
|
63
|
+
train_y = np.array(train_data.iloc[:,2:11],dtype=np.float32)/10
|
64
|
+
|
65
|
+
publictest_y = np.array(publictest_data.iloc[:,2:11],dtype=np.float32)/10
|
66
|
+
|
67
|
+
privatetest_y = np.array(privatetest_data.iloc[:,2:11],dtype=np.float32)/10
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
#水増し
|
72
|
+
|
73
|
+
train_x,train_y = augmentation(train_x,train_y)
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
#tuple化
|
78
|
+
|
79
|
+
train = tuple_dataset.TupleDataset(train_x,train_y)
|
80
|
+
|
81
|
+
publictest = tuple_dataset.TupleDataset(publictest_x,publictest_y)
|
82
|
+
|
83
|
+
privatetest = tuple_dataset.TupleDataset(privatetest_x,privatetest_y)
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
return train,publictest,privatetest
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
#水増し(holizontal Flip,Scale augmentation)
|
94
|
+
|
95
|
+
def augmentation(x_array,y_array,train_data_size_mag = TRAIN_DATA_SIZE_MAG):
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
#データ変換の処理4つ
|
100
|
+
|
101
|
+
#関数が適用されるかはランダム
|
102
|
+
|
103
|
+
def normalization(img):
|
104
|
+
|
105
|
+
return (img - np.mean(img))/np.std(img)
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
def gausianNoise(img):
|
110
|
+
|
111
|
+
MEAN = 0
|
112
|
+
|
113
|
+
SIGMA = 15
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
gaussfilter = np.random.normal(MEAN,SIGMA,(img.shape))
|
118
|
+
|
119
|
+
return img + gaussfilter
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
def holizontalFlip(img):
|
124
|
+
|
125
|
+
return img[:,::-1]
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
def scaleAugmentation(img):
|
130
|
+
|
131
|
+
SCALE_MIN = 50
|
132
|
+
|
133
|
+
SCALE_MAX = 80
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
#拡大処理、入力された画像サイズ48*48に対して、50*50~80*80まで拡大
|
138
|
+
|
139
|
+
SCALE_SIZE = np.random.randint(SCALE_MIN,SCALE_MAX)
|
140
|
+
|
141
|
+
|
142
|
+
|
143
|
+
#リサイズ
|
144
|
+
|
145
|
+
scale_img = cv2.resize(img,(SCALE_SIZE,SCALE_SIZE))
|
146
|
+
|
147
|
+
|
148
|
+
|
149
|
+
top = np.random.randint(0,SCALE_SIZE-NUM_SHAPE)
|
150
|
+
|
151
|
+
left = np.random.randint(0,SCALE_SIZE-NUM_SHAPE)
|
152
|
+
|
153
|
+
bottom = top + NUM_SHAPE
|
154
|
+
|
155
|
+
right = left + NUM_SHAPE
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
return scale_img[top:bottom,left:right]
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
def activateAugmentFforArray(f,x_array,activateP):
|
166
|
+
|
167
|
+
|
168
|
+
|
169
|
+
#変換用関数fを画像に適用させるかどうかをランダムに決める
|
170
|
+
|
171
|
+
def randActivateF(f,img):
|
172
|
+
|
173
|
+
if np.random.rand()>activateP:
|
174
|
+
|
175
|
+
return img
|
176
|
+
|
177
|
+
return f(img)
|
178
|
+
|
179
|
+
|
180
|
+
|
181
|
+
imglist = []
|
182
|
+
|
183
|
+
#x_arrayは[データ数,色数,縦,横]なので2回ループして画像毎の関数を(ランダムに)適用
|
184
|
+
|
185
|
+
for imgC in x_array:
|
186
|
+
|
187
|
+
imglist.append([randActivateF(f,img) for img in imgC])
|
188
|
+
|
189
|
+
|
190
|
+
|
191
|
+
return np.array(imglist)
|
192
|
+
|
193
|
+
|
194
|
+
|
195
|
+
#変換処理対象データをtrain_data_size_mag-1用意(1セットは元の画像にするため-1)
|
196
|
+
|
197
|
+
changed_x_array = np.concatenate([x_array]*(train_data_size_mag-1),axis=0)
|
198
|
+
|
199
|
+
|
200
|
+
|
201
|
+
#変換の種類ごとにactivateAugmentFforArrayを適用して、画像の変換(もしくは無変換)を行う
|
202
|
+
|
203
|
+
changed_x_array = activateAugmentFforArray(normalization,changed_x_array,0.2)
|
204
|
+
|
205
|
+
changed_x_array = activateAugmentFforArray(gausianNoise,changed_x_array,0.2)
|
206
|
+
|
207
|
+
changed_x_array = activateAugmentFforArray(holizontalFlip,changed_x_array,1)
|
208
|
+
|
209
|
+
changed_x_array = activateAugmentFforArray(scaleAugmentation,changed_x_array,0.2)
|
210
|
+
|
211
|
+
|
212
|
+
|
213
|
+
return np.concatenate([x_array,changed_x_array],axis=0).astype(np.float32),np.concatenate([y_array]*train_data_size_mag,axis=0)
|
214
|
+
|
215
|
+
|
216
|
+
|
217
|
+
#1行のデータを画像の形にする
|
218
|
+
|
219
|
+
def pixelsToArray_x(data):
|
220
|
+
|
221
|
+
np_x = np.array([np.fromstring(image,np.float32,sep=' ')/255 for image in np.array(data['pixels'])])
|
222
|
+
|
223
|
+
np_x.shape =(np_x.shape[0],1,NUM_SHAPE,NUM_SHAPE)
|
224
|
+
|
225
|
+
return np_x
|
226
|
+
|
227
|
+
```
|
1
書式変更
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
agmerakjngkjangjkranjbnr
|
test
CHANGED
@@ -1,157 +1 @@
|
|
1
|
-
### 前提・実現したいこと
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
表情推定のシステムを作っています。
|
6
|
-
|
7
|
-
1行のデータを画像の形にする機能を実装中に以下のエラーメッセージが発生しました。
|
8
|
-
|
9
|
-
KeyErrorなので--> 108 np_x = np.array([np.fromstring(image,np.float32,sep=' ')/255 for image in np.array(data['pixels'])])
|
10
|
-
|
11
|
-
この行に間違いがあると考えています。
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
### 発生している問題・エラーメッセージ
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
```
|
20
|
-
|
21
|
-
KeyError: 'pixels'
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
1
|
+
sgrehareahoimergmaow:emhpodjmbgpoeramgpoerwmgvpoewmoigvmewv
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
KeyError Traceback (most recent call last)
|
30
|
-
|
31
|
-
5 frames
|
32
|
-
|
33
|
-
<ipython-input-29-5fdb17262fe7> in <module>()
|
34
|
-
|
35
|
-
31 if __name__ == "__main__":
|
36
|
-
|
37
|
-
32
|
38
|
-
|
39
|
-
---> 33 test("gdrive/My Drive/myferdata.csv","saved_model/myresnet.npz")
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
<ipython-input-29-5fdb17262fe7> in test(csvfile, m)
|
44
|
-
|
45
|
-
9 def test(csvfile,m):
|
46
|
-
|
47
|
-
10
|
48
|
-
|
49
|
-
---> 11 _,_,privatetest = dataFromCsv(csvfile)
|
50
|
-
|
51
|
-
12 model = Resnet.ResNet()
|
52
|
-
|
53
|
-
13
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
<ipython-input-27-68efd0820676> in dataFromCsv(csvfile)
|
58
|
-
|
59
|
-
20
|
60
|
-
|
61
|
-
21 #1行のデータを画像のカタチにする(画像枚数、1、縦、横)
|
62
|
-
|
63
|
-
---> 22 train_x = pixelsToArray_x(train_data)
|
64
|
-
|
65
|
-
23 publictest_x = pixelsToArray_x(publictest_data)
|
66
|
-
|
67
|
-
24 privatetest_x = pixelsToArray_x(privatetest_data)
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
<ipython-input-27-68efd0820676> in pixelsToArray_x(data)
|
72
|
-
|
73
|
-
106 #1行のデータを画像の形にする
|
74
|
-
|
75
|
-
107 def pixelsToArray_x(data):
|
76
|
-
|
77
|
-
--> 108 np_x = np.array([np.fromstring(image,np.float32,sep=' ')/255 for image in np.array(data['pixels'])])
|
78
|
-
|
79
|
-
109 np_x.shape =(np_x.shape[0],1,NUM_SHAPE,NUM_SHAPE)
|
80
|
-
|
81
|
-
110 return np_x
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
/usr/local/lib/python3.6/dist-packages/pandas/core/frame.py in __getitem__(self, key)
|
86
|
-
|
87
|
-
2925 if self.columns.nlevels > 1:
|
88
|
-
|
89
|
-
2926 return self._getitem_multilevel(key)
|
90
|
-
|
91
|
-
-> 2927 indexer = self.columns.get_loc(key)
|
92
|
-
|
93
|
-
2928 if is_integer(indexer):
|
94
|
-
|
95
|
-
2929 indexer = [indexer]
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
/usr/local/lib/python3.6/dist-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
|
100
|
-
|
101
|
-
2657 return self._engine.get_loc(key)
|
102
|
-
|
103
|
-
2658 except KeyError:
|
104
|
-
|
105
|
-
-> 2659 return self._engine.get_loc(self._maybe_cast_indexer(key))
|
106
|
-
|
107
|
-
2660 indexer = self.get_indexer([key], method=method, tolerance=tolerance)
|
108
|
-
|
109
|
-
2661 if indexer.ndim > 1 or indexer.size > 1:
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
KeyError: 'pixels'
|
130
|
-
|
131
|
-
```
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
### 該当のソースコード
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
```python (colaboratory)
|
140
|
-
|
141
|
-
def pixelsToArray_x(data):
|
142
|
-
|
143
|
-
np_x = np.array([np.fromstring(image,np.float32,sep=' ')/255 for image in np.array(data['pixels'])])
|
144
|
-
|
145
|
-
np_x.shape =(np_x.shape[0],1,NUM_SHAPE,NUM_SHAPE)
|
146
|
-
|
147
|
-
return np_x
|
148
|
-
|
149
|
-
```
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
### 試したこと
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
pythonの画像処理について調べました。
|