質問編集履歴
3
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
### 前提・実現したいこと
|
2
2
|
|
3
|
-
jupyterでdarknetのyolov3を実装し、webカメラでとった2枚のステレオ画像を読み込ませて、物体検知を行い、その検知できた中の人物のみのx座標を、取得して計算を行いたいと考えています。現在は、darknet.pyの内容を書き換えて、ターミナルからpython ./python/darknet.pyで動かして2つの画像共に物体検知、中心座標ともに検出結果が出るまでには行けたのですが、そこからx座標のみを取得して計算をすることがうまく出来ずにいます。
|
3
|
+
jupyterでdarknetのyolov3を実装し、webカメラでとった2枚のステレオ画像を読み込ませて、物体検知を行い、その検知できた中の人物のみのx座標を、取得して計算を行いたいと考えています。現在は、darknet.pyの内容を書き換えて、ターミナルからpython ./python/darknet.pyで動かして2つの画像共に物体検知、中心座標ともに検出結果が出るまでには行けたのですが、そこからx座標のみを取得して計算をすることがうまく出来ずにいます。プログラミング初心者のため何をすれば良いかわかりません。そのため、こちらのサイトに質問させていただきました。以下のコードで何かおかしな点があればご指摘いただきたく存じます。
|
4
4
|
|
5
5
|
```
|
6
6
|
|
2
test
CHANGED
File without changes
|
test
CHANGED
@@ -2,36 +2,448 @@
|
|
2
2
|
|
3
3
|
jupyterでdarknetのyolov3を実装し、webカメラでとった2枚のステレオ画像を読み込ませて、物体検知を行い、その検知できた中の人物のみのx座標を、取得して計算を行いたいと考えています。現在は、darknet.pyの内容を書き換えて、ターミナルからpython ./python/darknet.pyで動かして2つの画像共に物体検知、中心座標ともに検出結果が出るまでには行けたのですが、そこからx座標のみを取得して計算をすることがうまく出来ずにいます。完全なプログラミング初心者のため何をすれば良いかわかりません。そのため、こちらのサイトに質問させていただきました。以下のコードで何かおかしな点があればご指摘いただきたく存じます。
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
■■な機能を実装中に以下のエラーメッセージが発生しました。
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
### 発生している問題・エラーメッセージ
|
12
|
-
|
13
|
-
|
14
|
-
|
15
5
|
```
|
16
6
|
|
17
7
|
エラーメッセージ
|
18
8
|
|
9
|
+
|
10
|
+
|
11
|
+
class_name= person
|
12
|
+
|
13
|
+
confidence= 0.9979870915412903
|
14
|
+
|
15
|
+
box1= (757.0997924804688, 574.14208984375, 382.11517333984375, 989.4730224609375)
|
16
|
+
|
17
|
+
class_name= chair
|
18
|
+
|
19
|
+
confidence= 0.939139187335968
|
20
|
+
|
21
|
+
box1= (456.80657958984375, 973.4913330078125, 297.5714111328125, 218.9896697998047)
|
22
|
+
|
23
|
+
class_name= diningtable
|
24
|
+
|
25
|
+
confidence= 0.867287278175354
|
26
|
+
|
27
|
+
box1= (150.55377197265625, 963.4379272460938, 279.58843994140625, 256.3335876464844)
|
28
|
+
|
29
|
+
class_name= person
|
30
|
+
|
31
|
+
confidence= 0.9986228346824646
|
32
|
+
|
33
|
+
box2= (789.9702758789062, 566.0933227539062, 352.4512939453125, 985.2094116210938)
|
34
|
+
|
35
|
+
class_name= chair
|
36
|
+
|
37
|
+
confidence= 0.9849683046340942
|
38
|
+
|
39
|
+
box2= (459.69384765625, 976.21435546875, 317.9201965332031, 218.52052307128906)
|
40
|
+
|
41
|
+
class_name= tvmonitor
|
42
|
+
|
43
|
+
confidence= 0.8856194019317627
|
44
|
+
|
45
|
+
box2= (145.66439819335938, 574.79736328125, 228.37103271484375, 259.6019592285156)
|
46
|
+
|
47
|
+
class_name= diningtable
|
48
|
+
|
49
|
+
confidence= 0.8115013837814331
|
50
|
+
|
51
|
+
box2= (172.94419860839844, 939.2078857421875, 342.9265441894531, 264.38812255859375)
|
52
|
+
|
53
|
+
Traceback (most recent call last):
|
54
|
+
|
55
|
+
File "./python/darknet.py", line 181, in <module>
|
56
|
+
|
57
|
+
D = x1 - x2
|
58
|
+
|
59
|
+
NameError: name 'x1' is not defined
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
### 該当のソースコード
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
from ctypes import *
|
70
|
+
|
71
|
+
import math
|
72
|
+
|
73
|
+
import random
|
74
|
+
|
75
|
+
import numpy as np
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
def sample(probs):
|
80
|
+
|
81
|
+
s = sum(probs)
|
82
|
+
|
83
|
+
probs = [a/s for a in probs]
|
84
|
+
|
85
|
+
r = random.uniform(0, 1)
|
86
|
+
|
87
|
+
for i in range(len(probs)):
|
88
|
+
|
89
|
+
r = r - probs[i]
|
90
|
+
|
91
|
+
if r <= 0:
|
92
|
+
|
93
|
+
return i
|
94
|
+
|
95
|
+
return len(probs)-1
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
def c_array(ctype, values):
|
100
|
+
|
101
|
+
arr = (ctype*len(values))()
|
102
|
+
|
103
|
+
arr[:] = values
|
104
|
+
|
105
|
+
return arr
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
class BOX(Structure):
|
110
|
+
|
111
|
+
_fields_ = [("x", c_float),
|
112
|
+
|
113
|
+
("y", c_float),
|
114
|
+
|
115
|
+
("w", c_float),
|
116
|
+
|
117
|
+
("h", c_float)]
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
class DETECTION(Structure):
|
122
|
+
|
123
|
+
_fields_ = [("bbox", BOX),
|
124
|
+
|
125
|
+
("classes", c_int),
|
126
|
+
|
127
|
+
("prob", POINTER(c_float)),
|
128
|
+
|
129
|
+
("mask", POINTER(c_float)),
|
130
|
+
|
131
|
+
("objectness", c_float),
|
132
|
+
|
133
|
+
("sort_class", c_int)]
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
class IMAGE(Structure):
|
140
|
+
|
141
|
+
_fields_ = [("w", c_int),
|
142
|
+
|
143
|
+
("h", c_int),
|
144
|
+
|
145
|
+
("c", c_int),
|
146
|
+
|
147
|
+
("data", POINTER(c_float))]
|
148
|
+
|
149
|
+
|
150
|
+
|
151
|
+
class METADATA(Structure):
|
152
|
+
|
153
|
+
_fields_ = [("classes", c_int),
|
154
|
+
|
155
|
+
("names", POINTER(c_char_p))]
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
#lib = CDLL("/home/pjreddie/documents/darknet/libdarknet.so", RTLD_GLOBAL)
|
164
|
+
|
165
|
+
lib = CDLL("libdarknet.so", RTLD_GLOBAL)
|
166
|
+
|
167
|
+
lib.network_width.argtypes = [c_void_p]
|
168
|
+
|
169
|
+
lib.network_width.restype = c_int
|
170
|
+
|
171
|
+
lib.network_height.argtypes = [c_void_p]
|
172
|
+
|
173
|
+
lib.network_height.restype = c_int
|
174
|
+
|
175
|
+
|
176
|
+
|
177
|
+
predict = lib.network_predict
|
178
|
+
|
179
|
+
predict.argtypes = [c_void_p, POINTER(c_float)]
|
180
|
+
|
181
|
+
predict.restype = POINTER(c_float)
|
182
|
+
|
183
|
+
|
184
|
+
|
185
|
+
set_gpu = lib.cuda_set_device
|
186
|
+
|
187
|
+
set_gpu.argtypes = [c_int]
|
188
|
+
|
189
|
+
|
190
|
+
|
191
|
+
make_image = lib.make_image
|
192
|
+
|
193
|
+
make_image.argtypes = [c_int, c_int, c_int]
|
194
|
+
|
195
|
+
make_image.restype = IMAGE
|
196
|
+
|
197
|
+
|
198
|
+
|
199
|
+
get_network_boxes = lib.get_network_boxes
|
200
|
+
|
201
|
+
get_network_boxes.argtypes = [c_void_p, c_int, c_int, c_float, c_float, POINTER(c_int), c_int, POINTER(c_int)]
|
202
|
+
|
203
|
+
get_network_boxes.restype = POINTER(DETECTION)
|
204
|
+
|
205
|
+
|
206
|
+
|
207
|
+
make_network_boxes = lib.make_network_boxes
|
208
|
+
|
209
|
+
make_network_boxes.argtypes = [c_void_p]
|
210
|
+
|
211
|
+
make_network_boxes.restype = POINTER(DETECTION)
|
212
|
+
|
213
|
+
|
214
|
+
|
215
|
+
free_detections = lib.free_detections
|
216
|
+
|
217
|
+
free_detections.argtypes = [POINTER(DETECTION), c_int]
|
218
|
+
|
219
|
+
|
220
|
+
|
221
|
+
free_ptrs = lib.free_ptrs
|
222
|
+
|
223
|
+
free_ptrs.argtypes = [POINTER(c_void_p), c_int]
|
224
|
+
|
225
|
+
|
226
|
+
|
227
|
+
network_predict = lib.network_predict
|
228
|
+
|
229
|
+
network_predict.argtypes = [c_void_p, POINTER(c_float)]
|
230
|
+
|
231
|
+
|
232
|
+
|
233
|
+
reset_rnn = lib.reset_rnn
|
234
|
+
|
235
|
+
reset_rnn.argtypes = [c_void_p]
|
236
|
+
|
237
|
+
|
238
|
+
|
239
|
+
load_net = lib.load_network
|
240
|
+
|
241
|
+
load_net.argtypes = [c_char_p, c_char_p, c_int]
|
242
|
+
|
243
|
+
load_net.restype = c_void_p
|
244
|
+
|
245
|
+
|
246
|
+
|
247
|
+
do_nms_obj = lib.do_nms_obj
|
248
|
+
|
249
|
+
do_nms_obj.argtypes = [POINTER(DETECTION), c_int, c_int, c_float]
|
250
|
+
|
251
|
+
|
252
|
+
|
253
|
+
do_nms_sort = lib.do_nms_sort
|
254
|
+
|
255
|
+
do_nms_sort.argtypes = [POINTER(DETECTION), c_int, c_int, c_float]
|
256
|
+
|
257
|
+
|
258
|
+
|
259
|
+
free_image = lib.free_image
|
260
|
+
|
261
|
+
free_image.argtypes = [IMAGE]
|
262
|
+
|
263
|
+
|
264
|
+
|
265
|
+
letterbox_image = lib.letterbox_image
|
266
|
+
|
267
|
+
letterbox_image.argtypes = [IMAGE, c_int, c_int]
|
268
|
+
|
269
|
+
letterbox_image.restype = IMAGE
|
270
|
+
|
271
|
+
|
272
|
+
|
273
|
+
load_meta = lib.get_metadata
|
274
|
+
|
275
|
+
lib.get_metadata.argtypes = [c_char_p]
|
276
|
+
|
277
|
+
lib.get_metadata.restype = METADATA
|
278
|
+
|
279
|
+
|
280
|
+
|
281
|
+
load_image = lib.load_image_color
|
282
|
+
|
283
|
+
load_image.argtypes = [c_char_p, c_int, c_int]
|
284
|
+
|
285
|
+
load_image.restype = IMAGE
|
286
|
+
|
287
|
+
|
288
|
+
|
289
|
+
rgbgr_image = lib.rgbgr_image
|
290
|
+
|
291
|
+
rgbgr_image.argtypes = [IMAGE]
|
292
|
+
|
293
|
+
|
294
|
+
|
295
|
+
predict_image = lib.network_predict_image
|
296
|
+
|
297
|
+
predict_image.argtypes = [c_void_p, IMAGE]
|
298
|
+
|
299
|
+
predict_image.restype = POINTER(c_float)
|
300
|
+
|
301
|
+
|
302
|
+
|
303
|
+
def classify(net, meta, im):
|
304
|
+
|
305
|
+
out = predict_image(net, im)
|
306
|
+
|
307
|
+
res = []
|
308
|
+
|
309
|
+
for i in range(meta.classes):
|
310
|
+
|
311
|
+
res.append((meta.names[i], out[i]))
|
312
|
+
|
313
|
+
res = sorted(res, key=lambda x: -x[1])
|
314
|
+
|
315
|
+
return res
|
316
|
+
|
317
|
+
|
318
|
+
|
319
|
+
def detect(net, meta, image, thresh=.5, hier_thresh=.5, nms=.45):
|
320
|
+
|
321
|
+
im = load_image(image, 0, 0)
|
322
|
+
|
323
|
+
num = c_int(0)
|
324
|
+
|
325
|
+
pnum = pointer(num)
|
326
|
+
|
327
|
+
predict_image(net, im)
|
328
|
+
|
329
|
+
dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, None, 0, pnum)
|
330
|
+
|
331
|
+
num = pnum[0]
|
332
|
+
|
333
|
+
if (nms): do_nms_obj(dets, num, meta.classes, nms);
|
334
|
+
|
335
|
+
|
336
|
+
|
337
|
+
res = []
|
338
|
+
|
339
|
+
for j in range(num):
|
340
|
+
|
341
|
+
for i in range(meta.classes):
|
342
|
+
|
343
|
+
if dets[j].prob[i] > 0:
|
344
|
+
|
345
|
+
b = dets[j].bbox
|
346
|
+
|
347
|
+
res.append((meta.names[i], dets[j].prob[i], (b.x, b.y, b.w, b.h)))
|
348
|
+
|
349
|
+
res = sorted(res, key=lambda x: -x[1])
|
350
|
+
|
351
|
+
free_image(im)
|
352
|
+
|
353
|
+
free_detections(dets, num)
|
354
|
+
|
355
|
+
return res
|
356
|
+
|
357
|
+
|
358
|
+
|
359
|
+
if __name__ == "__main__":
|
360
|
+
|
361
|
+
net = load_net("cfg/yolov3.cfg".encode('ascii'),"yolov3.weights".encode('ascii'), 0)
|
362
|
+
|
363
|
+
meta = load_meta("cfg/coco.data".encode('ascii'))
|
364
|
+
|
365
|
+
r1 = detect(net, meta, "path1.jpg".encode('ascii'))
|
366
|
+
|
367
|
+
r2 = detect(net, meta, "path2.jpg".encode('ascii'))
|
368
|
+
|
369
|
+
kekka1 = np.empty((10,3))
|
370
|
+
|
371
|
+
kekka2 = np.empty((10,3))
|
372
|
+
|
373
|
+
for kekka1 in r1:
|
374
|
+
|
375
|
+
print('class_name=', kekka1[0].decode('ascii'))
|
376
|
+
|
377
|
+
print('confidence=', kekka1[1])
|
378
|
+
|
379
|
+
print('box1=', kekka1[2])
|
380
|
+
|
381
|
+
|
382
|
+
|
383
|
+
if kekka1[0].decode('ascii') == "person":
|
384
|
+
|
385
|
+
kekka1[2] = bbox1(0, 1, 2, 3)
|
386
|
+
|
387
|
+
x1 = bbox1(0)
|
388
|
+
|
389
|
+
y1 = bbox1(0)
|
390
|
+
|
391
|
+
|
392
|
+
|
393
|
+
for kekka2 in r2:
|
394
|
+
|
395
|
+
print('class_name=', kekka2[0].decode('ascii'))
|
396
|
+
|
397
|
+
print('confidence=', kekka2[1])
|
398
|
+
|
399
|
+
print('box2=', kekka2[2])
|
400
|
+
|
401
|
+
|
402
|
+
|
403
|
+
if kekka1[0].decode('ascii') == "person":
|
404
|
+
|
405
|
+
kekka1[2] = bbox1(0, 1, 2, 3)
|
406
|
+
|
407
|
+
x1 = bbox1(0)
|
408
|
+
|
409
|
+
y1 = bbox1(0)
|
410
|
+
|
411
|
+
|
412
|
+
|
413
|
+
if kekka2[0].decode('ascii') == "person":
|
414
|
+
|
415
|
+
kekka2[2] = bbox2(0, 1, 2, 3)
|
416
|
+
|
417
|
+
x2 = bbox2(0)
|
418
|
+
|
419
|
+
y2 = bbox2(0)
|
420
|
+
|
421
|
+
|
422
|
+
|
423
|
+
F = 123.7
|
424
|
+
|
425
|
+
T = 0.16
|
426
|
+
|
427
|
+
|
428
|
+
|
429
|
+
D = x1 - x2
|
430
|
+
|
431
|
+
z = F*T/D
|
432
|
+
|
433
|
+
|
434
|
+
|
435
|
+
print(z)
|
436
|
+
|
437
|
+
|
438
|
+
|
439
|
+
pythonで実装しています。
|
440
|
+
|
441
|
+
|
442
|
+
|
19
443
|
```
|
20
444
|
|
21
445
|
|
22
446
|
|
23
|
-
### 該当のソースコード
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
```ここに言語名を入力
|
28
|
-
|
29
|
-
ソースコード
|
30
|
-
|
31
|
-
```
|
32
|
-
|
33
|
-
|
34
|
-
|
35
447
|
### 試したこと
|
36
448
|
|
37
449
|
|
1
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,10 +1,8 @@
|
|
1
1
|
### 前提・実現したいこと
|
2
2
|
|
3
|
+
jupyterでdarknetのyolov3を実装し、webカメラでとった2枚のステレオ画像を読み込ませて、物体検知を行い、その検知できた中の人物のみのx座標を、取得して計算を行いたいと考えています。現在は、darknet.pyの内容を書き換えて、ターミナルからpython ./python/darknet.pyで動かして2つの画像共に物体検知、中心座標ともに検出結果が出るまでには行けたのですが、そこからx座標のみを取得して計算をすることがうまく出来ずにいます。完全なプログラミング初心者のため何をすれば良いかわかりません。そのため、こちらのサイトに質問させていただきました。以下のコードで何かおかしな点があればご指摘いただきたく存じます。
|
3
4
|
|
4
5
|
|
5
|
-
ここに質問の内容を詳しく書いてください。
|
6
|
-
|
7
|
-
(例)PHP(CakePHP)で●●なシステムを作っています。
|
8
6
|
|
9
7
|
■■な機能を実装中に以下のエラーメッセージが発生しました。
|
10
8
|
|