回答編集履歴
9
変更!
test
CHANGED
@@ -66,7 +66,7 @@
|
|
66
66
|
|
67
67
|
```Python
|
68
68
|
|
69
|
-
|
69
|
+
gray = cv2.cvtColor(part_height, cv2.COLOR_RGB2GRAY)
|
70
70
|
|
71
71
|
```
|
72
72
|
|
8
np.einsumからnp.stackに変更
test
CHANGED
@@ -28,7 +28,9 @@
|
|
28
28
|
|
29
29
|
gray = np.ceil(np.dot(part_height[..., :3], [0.3, 0.59, 0.11]))
|
30
30
|
|
31
|
+
# 1ch => 3ch
|
32
|
+
|
31
|
-
part_height = np.
|
33
|
+
part_height = np.stack((gray,) * 3, -1)
|
32
34
|
|
33
35
|
# 戻り値に実行時間を追加
|
34
36
|
|
7
追記
test
CHANGED
@@ -60,9 +60,7 @@
|
|
60
60
|
|
61
61
|
|
62
62
|
|
63
|
-
b, あとは
|
63
|
+
b, あとはグレースケール変換部分を`cv2.cvtColor`を使ったこのような形にでも。
|
64
|
-
|
65
|
-
※このコードの場合は質問文と同じグレースケール値ではないです。
|
66
64
|
|
67
65
|
```Python
|
68
66
|
|
6
np.ceilを追加
test
CHANGED
@@ -26,7 +26,7 @@
|
|
26
26
|
|
27
27
|
part_height = img[ number : endPioint-1 ]
|
28
28
|
|
29
|
-
gray = np.dot(part_height[..., :3], [0.3, 0.59, 0.11])
|
29
|
+
gray = np.ceil(np.dot(part_height[..., :3], [0.3, 0.59, 0.11]))
|
30
30
|
|
31
31
|
part_height = np.einsum('ij,k->ijk', gray, [1, 1, 1])
|
32
32
|
|
5
追記
test
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
|
9
9
|
|
10
10
|
|
11
|
-
[
|
11
|
+
[How can I convert an RGB image into grayscale in Python?](https://stackoverflow.com/questions/12201577/how-can-i-convert-an-rgb-image-into-grayscale-in-python)を参考に。
|
12
12
|
|
13
13
|
|
14
14
|
|
@@ -26,9 +26,9 @@
|
|
26
26
|
|
27
27
|
part_height = img[ number : endPioint-1 ]
|
28
28
|
|
29
|
-
|
29
|
+
gray = np.dot(part_height[..., :3], [0.3, 0.59, 0.11])
|
30
30
|
|
31
|
-
part_height = np.einsum('ij,k->ijk',
|
31
|
+
part_height = np.einsum('ij,k->ijk', gray, [1, 1, 1])
|
32
32
|
|
33
33
|
# 戻り値に実行時間を追加
|
34
34
|
|
@@ -62,6 +62,8 @@
|
|
62
62
|
|
63
63
|
b, あとは`(0.3 * R + 0.59 * G + 0.11 * B`)の部分を`cv2.cvtColor`を使ったこのような形にでも。
|
64
64
|
|
65
|
+
※このコードの場合は質問文と同じグレースケール値ではないです。
|
66
|
+
|
65
67
|
```Python
|
66
68
|
|
67
69
|
part_height = np.einsum('ij,k->ijk', cv2.cvtColor(part_height, cv2.COLOR_RGB2GRAY), [1, 1, 1])
|
@@ -79,3 +81,29 @@
|
|
79
81
|
グレースケールデータは1次元で十分なので`as_completed`呼び出し側で一部の処理を行えば返す必要も無い気がします。
|
80
82
|
|
81
83
|
これに関しては受け渡しする`pickle`のデータ量と`as_completed`呼び出し側の`CPU`時間のトレードオフになるのではないかと、プロファイリングを複数回採ってみた方がよいと思います。
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
---
|
88
|
+
|
89
|
+
テスト中に気づいたのですが、質問文の元コードだと白色のグレースケール値が`254`になります。
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
こんな感じのハッシュ関数を作ってテストコードに入れておくのをお勧め致します。
|
94
|
+
|
95
|
+
```Python
|
96
|
+
|
97
|
+
def image_hash(img):
|
98
|
+
|
99
|
+
from hashlib import sha384
|
100
|
+
|
101
|
+
x = np.ascontiguousarray(img, dtype=np.uint8)
|
102
|
+
|
103
|
+
print(sha384(x).hexdigest())
|
104
|
+
|
105
|
+
```
|
106
|
+
|
107
|
+
◇参考情報
|
108
|
+
|
109
|
+
[Fast way to Hash Numpy objects for Caching](https://stackoverflow.com/questions/5386694/fast-way-to-hash-numpy-objects-for-caching/)
|
4
pickleで受け渡しするデータに関して追記
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
`numpy`はループで
|
5
|
+
a,`numpy`はループでピクセル単位に処理を行うと**ものすごーく時間**がかかるので。
|
6
6
|
|
7
7
|
あまりテストできてませんが。
|
8
8
|
|
@@ -60,12 +60,22 @@
|
|
60
60
|
|
61
61
|
|
62
62
|
|
63
|
-
---
|
64
|
-
|
65
|
-
あとは`(0.3 * R + 0.59 * G + 0.11 * B`)の部分を`cv2.cvtColor`を使ったこのような形にでも。
|
63
|
+
b, あとは`(0.3 * R + 0.59 * G + 0.11 * B`)の部分を`cv2.cvtColor`を使ったこのような形にでも。
|
66
64
|
|
67
65
|
```Python
|
68
66
|
|
69
67
|
part_height = np.einsum('ij,k->ijk', cv2.cvtColor(part_height, cv2.COLOR_RGB2GRAY), [1, 1, 1])
|
70
68
|
|
71
69
|
```
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
---
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
あと思いつく点としては、`changeToGray`の処理で戻り値として3次元(`RGB`)データを返していますが。
|
78
|
+
|
79
|
+
グレースケールデータは1次元で十分なので`as_completed`呼び出し側で一部の処理を行えば返す必要も無い気がします。
|
80
|
+
|
81
|
+
これに関しては受け渡しする`pickle`のデータ量と`as_completed`呼び出し側の`CPU`時間のトレードオフになるのではないかと、プロファイリングを複数回採ってみた方がよいと思います。
|
3
追記
test
CHANGED
@@ -1,6 +1,10 @@
|
|
1
|
-
|
1
|
+
> 何処がボトルネックになっているか
|
2
|
+
|
3
|
+
|
2
4
|
|
3
5
|
`numpy`はループでバイト単位に処理を行うと**ものすごーく時間**がかかるので。
|
6
|
+
|
7
|
+
あまりテストできてませんが。
|
4
8
|
|
5
9
|
|
6
10
|
|
2
変更!
test
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
あまりテストできてませんが。
|
2
2
|
|
3
|
-
numpyはループでバイト単位に処理を行うと**ものすごーく時間**がかかるので。
|
3
|
+
`numpy`はループでバイト単位に処理を行うと**ものすごーく時間**がかかるので。
|
4
4
|
|
5
5
|
|
6
6
|
|
@@ -52,4 +52,16 @@
|
|
52
52
|
|
53
53
|
|
54
54
|
|
55
|
-
※numpyマニアな方なツッコミ待ちです。
|
55
|
+
**※numpyマニアな方なツッコミ待ちです。**
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
---
|
60
|
+
|
61
|
+
あとは`(0.3 * R + 0.59 * G + 0.11 * B`)の部分を`cv2.cvtColor`を使ったこのような形にでも。
|
62
|
+
|
63
|
+
```Python
|
64
|
+
|
65
|
+
part_height = np.einsum('ij,k->ijk', cv2.cvtColor(part_height, cv2.COLOR_RGB2GRAY), [1, 1, 1])
|
66
|
+
|
67
|
+
```
|
1
ndarrayをそのまま渡すように
test
CHANGED
@@ -24,9 +24,7 @@
|
|
24
24
|
|
25
25
|
R, G, B = part_height[..., 0], part_height[..., 1], part_height[..., 2]
|
26
26
|
|
27
|
-
part_height = (0.3 * R + 0.59 * G + 0.11 * B)
|
28
|
-
|
29
|
-
part_height = np.einsum('ij,k->ijk',
|
27
|
+
part_height = np.einsum('ij,k->ijk', (0.3 * R + 0.59 * G + 0.11 * B), [1, 1, 1])
|
30
28
|
|
31
29
|
# 戻り値に実行時間を追加
|
32
30
|
|
@@ -51,3 +49,7 @@
|
|
51
49
|
+ print(exe_time)
|
52
50
|
|
53
51
|
```
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
※numpyマニアな方なツッコミ待ちです。
|