質問編集履歴
5
タイトル修正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
GPU上で、ImageからTensorに変換できません(GluonCV、Mxnet)
|
test
CHANGED
File without changes
|
4
ソースコード修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
```Python
|
16
16
|
|
17
|
-
def
|
17
|
+
def retrieve(self,video):
|
18
18
|
|
19
19
|
retval, image = video.retrieve()
|
20
20
|
|
@@ -38,7 +38,7 @@
|
|
38
38
|
|
39
39
|
self.video.grab()
|
40
40
|
|
41
|
-
frame = self.
|
41
|
+
frame = self.retrieve(self.video)
|
42
42
|
|
43
43
|
frame = cv2.resize(frame, dsize=(320, 320))
|
44
44
|
|
@@ -64,11 +64,11 @@
|
|
64
64
|
|
65
65
|
###################
|
66
66
|
|
67
|
-
class_IDs, scores, bounding_boxs, frame = self.
|
67
|
+
class_IDs, scores, bounding_boxs, frame = self.detect(frame)## ここでエラーになる
|
68
|
-
|
69
|
-
|
70
|
-
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
-
def
|
71
|
+
def detect(self,image):
|
72
72
|
|
73
73
|
image, org = self.transform_test(mx.nd.array(image),self.data_shape, max_size=self.data_shape)
|
74
74
|
|
@@ -178,7 +178,7 @@
|
|
178
178
|
|
179
179
|
|
180
180
|
|
181
|
-
該当のソースコードの`class_IDs, scores, bounding_boxs, frame = self.
|
181
|
+
該当のソースコードの`class_IDs, scores, bounding_boxs, frame = self.detect(frame)`をコメントアウトして、######で挟んだものをコメントアウトなくすと、以下のエラーになります
|
182
182
|
|
183
183
|
|
184
184
|
|
3
やってみたこと追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -46,19 +46,77 @@
|
|
46
46
|
|
47
47
|
with mx.Context(mx.gpu()):
|
48
48
|
|
49
|
+
###################
|
50
|
+
|
49
|
-
print(frame.shape)# (320, 320, 3)
|
51
|
+
#print(frame.shape)# (320, 320, 3)
|
50
|
-
|
52
|
+
|
51
|
-
image_np = mx.nd.array(frame)
|
53
|
+
#image_np = mx.nd.array(frame)
|
52
|
-
|
54
|
+
|
53
|
-
print(image_np.shape)# (320, 320, 3)
|
55
|
+
#print(image_np.shape)# (320, 320, 3)
|
54
|
-
|
56
|
+
|
55
|
-
print(len(image_np))# 320
|
57
|
+
#print(len(image_np))# 320
|
56
|
-
|
58
|
+
|
57
|
-
image_np_expanded = image_np.expand_dims(0)
|
59
|
+
#image_np_expanded = image_np.expand_dims(0)
|
58
|
-
|
60
|
+
|
59
|
-
print(image_np_expanded.shape)# (1, 320, 320, 3)
|
61
|
+
#print(image_np_expanded.shape)# (1, 320, 320, 3)
|
60
|
-
|
62
|
+
|
61
|
-
class_IDs, scores, bounding_boxs = self.net(image_np_expanded)
|
63
|
+
#class_IDs, scores, bounding_boxs = self.net(image_np_expanded)
|
64
|
+
|
65
|
+
###################
|
66
|
+
|
67
|
+
class_IDs, scores, bounding_boxs, frame = self._detect(frame)## ここでエラーになる
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
def _detect(self,image):
|
72
|
+
|
73
|
+
image, org = self.transform_test(mx.nd.array(image),self.data_shape, max_size=self.data_shape)
|
74
|
+
|
75
|
+
class_IDs, scores, bounding_boxs = self.net(image)
|
76
|
+
|
77
|
+
return class_IDs, scores, bounding_boxs, org
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
def transform_test(self,imgs, short, max_size=1024, mean=(0.485, 0.456, 0.406),
|
82
|
+
|
83
|
+
std=(0.229, 0.224, 0.225)):
|
84
|
+
|
85
|
+
if isinstance(imgs, mx.nd.NDArray):
|
86
|
+
|
87
|
+
imgs = [imgs]
|
88
|
+
|
89
|
+
for im in imgs:
|
90
|
+
|
91
|
+
assert isinstance(im, mx.nd.NDArray), "Expect NDArray, got {}".format(type(im))
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
tensors = []
|
96
|
+
|
97
|
+
origs = []
|
98
|
+
|
99
|
+
for img in imgs:
|
100
|
+
|
101
|
+
orig_img = img.asnumpy().astype('uint8')
|
102
|
+
|
103
|
+
#img = mx.nd.image.to_tensor(img)
|
104
|
+
|
105
|
+
transformer = transforms.ToTensor()
|
106
|
+
|
107
|
+
img = transformer(img)## ここでエラーになる
|
108
|
+
|
109
|
+
img = mx.nd.image.normalize(img, mean=mean, std=std)
|
110
|
+
|
111
|
+
tensors.append(img.expand_dims(0))
|
112
|
+
|
113
|
+
origs.append(orig_img)
|
114
|
+
|
115
|
+
if len(tensors) == 1:
|
116
|
+
|
117
|
+
return tensors[0], origs[0]
|
118
|
+
|
119
|
+
return tensors, origs
|
62
120
|
|
63
121
|
```
|
64
122
|
|
@@ -68,67 +126,59 @@
|
|
68
126
|
|
69
127
|
|
70
128
|
|
71
|
-
``
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
ctypes.byref(out_stypes)))
|
126
|
-
|
127
|
-
File "/home/ubuntu/anaconda3/envs/mxnet_p36/lib/python3.6/site-packages/mxnet/base.py", line 252, in check_call
|
128
|
-
|
129
|
-
raise MXNetError(py_str(_LIB.MXGetLastError()))
|
130
|
-
|
131
|
-
```
|
129
|
+
`mxnet.base.MXNetError: [09:51:33] src/imperative/imperative.cc:79: Operator _image_to_tensor is not implemented for GPU.`
|
130
|
+
|
131
|
+
|
132
|
+
|
133
|
+
GPUだとTensorに変更する事ができないようなのですが、どうすればいいでしょうか?
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
## やってみた事
|
138
|
+
|
139
|
+
|
140
|
+
|
141
|
+
### その1
|
142
|
+
|
143
|
+
|
144
|
+
|
145
|
+
書き方を変えてみました。
|
146
|
+
|
147
|
+
|
148
|
+
|
149
|
+
以下をコメントアウトし、
|
150
|
+
|
151
|
+
`transformer = transforms.ToTensor()`
|
152
|
+
|
153
|
+
`img = transformer(img)`
|
154
|
+
|
155
|
+
|
156
|
+
|
157
|
+
以下をコメントアウトなくしても
|
158
|
+
|
159
|
+
`#img = mx.nd.image.to_tensor(img)`
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
同等のエラー
|
164
|
+
|
165
|
+
`mxnet.base.MXNetError: [09:51:33] src/imperative/imperative.cc:79: Operator _image_to_tensor is not implemented for GPU.`
|
166
|
+
|
167
|
+
が出ます。
|
168
|
+
|
169
|
+
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
### その2
|
174
|
+
|
175
|
+
|
176
|
+
|
177
|
+
tensorに変換しないようにしてみました。
|
178
|
+
|
179
|
+
|
180
|
+
|
181
|
+
該当のソースコードの`class_IDs, scores, bounding_boxs, frame = self._detect(frame)`をコメントアウトして、######で挟んだものをコメントアウトなくすと、以下のエラーになります
|
132
182
|
|
133
183
|
|
134
184
|
|
@@ -136,10 +186,6 @@
|
|
136
186
|
|
137
187
|
|
138
188
|
|
139
|
-
まず`[]`と`()`でなぜずれているのでしょうか?
|
140
|
-
|
141
|
-
また、`(32,320,3,3)`で`32`,`320`,`3`,`3`はそれぞれ何を意味しているのでしょうか?
|
142
|
-
|
143
189
|
|
144
190
|
|
145
191
|
|
2
エラー内容追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -68,6 +68,70 @@
|
|
68
68
|
|
69
69
|
|
70
70
|
|
71
|
+
```ここに言語を入力
|
72
|
+
|
73
|
+
File "/home/ubuntu/anaconda3/envs/mxnet_p36/lib/python3.6/site-packages/mxnet/gluon/block.py", line 540, in __call__
|
74
|
+
|
75
|
+
out = self.forward(*args)
|
76
|
+
|
77
|
+
File "/home/ubuntu/anaconda3/envs/mxnet_p36/lib/python3.6/site-packages/mxnet/gluon/block.py", line 917, in forward
|
78
|
+
|
79
|
+
return self.hybrid_forward(ndarray, x, *args, **params)
|
80
|
+
|
81
|
+
File "/home/ubuntu/anaconda3/envs/mxnet_p36/lib/python3.6/site-packages/gluoncv/model_zoo/yolo/yolo3.py", line 325, in hybrid_forward
|
82
|
+
|
83
|
+
x = stage(x)
|
84
|
+
|
85
|
+
File "/home/ubuntu/anaconda3/envs/mxnet_p36/lib/python3.6/site-packages/mxnet/gluon/block.py", line 540, in __call__
|
86
|
+
|
87
|
+
out = self.forward(*args)
|
88
|
+
|
89
|
+
File "/home/ubuntu/anaconda3/envs/mxnet_p36/lib/python3.6/site-packages/mxnet/gluon/block.py", line 917, in forward
|
90
|
+
|
91
|
+
return self.hybrid_forward(ndarray, x, *args, **params)
|
92
|
+
|
93
|
+
File "/home/ubuntu/anaconda3/envs/mxnet_p36/lib/python3.6/site-packages/mxnet/gluon/nn/basic_layers.py", line 117, in hybrid_forward
|
94
|
+
|
95
|
+
x = block(x)
|
96
|
+
|
97
|
+
File "/home/ubuntu/anaconda3/envs/mxnet_p36/lib/python3.6/site-packages/mxnet/gluon/block.py", line 540, in __call__
|
98
|
+
|
99
|
+
out = self.forward(*args)
|
100
|
+
|
101
|
+
File "/home/ubuntu/anaconda3/envs/mxnet_p36/lib/python3.6/site-packages/mxnet/gluon/block.py", line 917, in forward
|
102
|
+
|
103
|
+
return self.hybrid_forward(ndarray, x, *args, **params)
|
104
|
+
|
105
|
+
File "/home/ubuntu/anaconda3/envs/mxnet_p36/lib/python3.6/site-packages/mxnet/gluon/nn/basic_layers.py", line 117, in hybrid_forward
|
106
|
+
|
107
|
+
x = block(x)
|
108
|
+
|
109
|
+
File "/home/ubuntu/anaconda3/envs/mxnet_p36/lib/python3.6/site-packages/mxnet/gluon/block.py", line 540, in __call__
|
110
|
+
|
111
|
+
out = self.forward(*args)
|
112
|
+
|
113
|
+
File "/home/ubuntu/anaconda3/envs/mxnet_p36/lib/python3.6/site-packages/mxnet/gluon/block.py", line 917, in forward
|
114
|
+
|
115
|
+
return self.hybrid_forward(ndarray, x, *args, **params)
|
116
|
+
|
117
|
+
File "/home/ubuntu/anaconda3/envs/mxnet_p36/lib/python3.6/site-packages/mxnet/gluon/nn/conv_layers.py", line 133, in hybrid_forward
|
118
|
+
|
119
|
+
act = getattr(F, self._op_name)(x, weight, name='fwd', **self._kwargs)
|
120
|
+
|
121
|
+
File "<string>", line 167, in Convolution
|
122
|
+
|
123
|
+
File "/home/ubuntu/anaconda3/envs/mxnet_p36/lib/python3.6/site-packages/mxnet/_ctypes/ndarray.py", line 92, in _imperative_invoke
|
124
|
+
|
125
|
+
ctypes.byref(out_stypes)))
|
126
|
+
|
127
|
+
File "/home/ubuntu/anaconda3/envs/mxnet_p36/lib/python3.6/site-packages/mxnet/base.py", line 252, in check_call
|
128
|
+
|
129
|
+
raise MXNetError(py_str(_LIB.MXGetLastError()))
|
130
|
+
|
131
|
+
```
|
132
|
+
|
133
|
+
|
134
|
+
|
71
135
|
`mxnet.base.MXNetError: Shape inconsistent, Provided = [32,3,3,3], inferred shape=(32,320,3,3)`
|
72
136
|
|
73
137
|
|
1
該当のソースコードの追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -14,6 +14,20 @@
|
|
14
14
|
|
15
15
|
```Python
|
16
16
|
|
17
|
+
def _retrieve(self,video):
|
18
|
+
|
19
|
+
retval, image = video.retrieve()
|
20
|
+
|
21
|
+
if retval:
|
22
|
+
|
23
|
+
return image
|
24
|
+
|
25
|
+
else:
|
26
|
+
|
27
|
+
raise ValueError('retrieve from bad video')
|
28
|
+
|
29
|
+
|
30
|
+
|
17
31
|
def show(self):
|
18
32
|
|
19
33
|
|
@@ -27,8 +41,6 @@
|
|
27
41
|
frame = self._retrieve(self.video)
|
28
42
|
|
29
43
|
frame = cv2.resize(frame, dsize=(320, 320))
|
30
|
-
|
31
|
-
sec = i*self.frame_sec
|
32
44
|
|
33
45
|
# Actual detection
|
34
46
|
|