回答編集履歴
9
変更!
answer
CHANGED
@@ -32,7 +32,7 @@
|
|
32
32
|
|
33
33
|
b, あとはグレースケール変換部分を`cv2.cvtColor`を使ったこのような形にでも。
|
34
34
|
```Python
|
35
|
-
|
35
|
+
gray = cv2.cvtColor(part_height, cv2.COLOR_RGB2GRAY)
|
36
36
|
```
|
37
37
|
|
38
38
|
---
|
8
np.einsumからnp.stackに変更
answer
CHANGED
@@ -13,7 +13,8 @@
|
|
13
13
|
endPioint = number + length if number + length < len(img) else len(img) - 1
|
14
14
|
part_height = img[ number : endPioint-1 ]
|
15
15
|
gray = np.ceil(np.dot(part_height[..., :3], [0.3, 0.59, 0.11]))
|
16
|
+
# 1ch => 3ch
|
16
|
-
part_height = np.
|
17
|
+
part_height = np.stack((gray,) * 3, -1)
|
17
18
|
# 戻り値に実行時間を追加
|
18
19
|
return number, part_height, perf_counter() - st_time
|
19
20
|
```
|
7
追記
answer
CHANGED
@@ -29,8 +29,7 @@
|
|
29
29
|
|
30
30
|
**※numpyマニアな方なツッコミ待ちです。**
|
31
31
|
|
32
|
-
b, あとは
|
32
|
+
b, あとはグレースケール変換部分を`cv2.cvtColor`を使ったこのような形にでも。
|
33
|
-
※このコードの場合は質問文と同じグレースケール値ではないです。
|
34
33
|
```Python
|
35
34
|
part_height = np.einsum('ij,k->ijk', cv2.cvtColor(part_height, cv2.COLOR_RGB2GRAY), [1, 1, 1])
|
36
35
|
```
|
6
np.ceilを追加
answer
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
st_time = perf_counter()
|
13
13
|
endPioint = number + length if number + length < len(img) else len(img) - 1
|
14
14
|
part_height = img[ number : endPioint-1 ]
|
15
|
-
gray = np.dot(part_height[..., :3], [0.3, 0.59, 0.11])
|
15
|
+
gray = np.ceil(np.dot(part_height[..., :3], [0.3, 0.59, 0.11]))
|
16
16
|
part_height = np.einsum('ij,k->ijk', gray, [1, 1, 1])
|
17
17
|
# 戻り値に実行時間を追加
|
18
18
|
return number, part_height, perf_counter() - st_time
|
5
追記
answer
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
a,`numpy`はループでピクセル単位に処理を行うと**ものすごーく時間**がかかるので。
|
4
4
|
あまりテストできてませんが。
|
5
5
|
|
6
|
-
[
|
6
|
+
[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)を参考に。
|
7
7
|
|
8
8
|
```Python
|
9
9
|
from time import perf_counter
|
@@ -12,8 +12,8 @@
|
|
12
12
|
st_time = perf_counter()
|
13
13
|
endPioint = number + length if number + length < len(img) else len(img) - 1
|
14
14
|
part_height = img[ number : endPioint-1 ]
|
15
|
-
|
15
|
+
gray = np.dot(part_height[..., :3], [0.3, 0.59, 0.11])
|
16
|
-
part_height = np.einsum('ij,k->ijk',
|
16
|
+
part_height = np.einsum('ij,k->ijk', gray, [1, 1, 1])
|
17
17
|
# 戻り値に実行時間を追加
|
18
18
|
return number, part_height, perf_counter() - st_time
|
19
19
|
```
|
@@ -30,6 +30,7 @@
|
|
30
30
|
**※numpyマニアな方なツッコミ待ちです。**
|
31
31
|
|
32
32
|
b, あとは`(0.3 * R + 0.59 * G + 0.11 * B`)の部分を`cv2.cvtColor`を使ったこのような形にでも。
|
33
|
+
※このコードの場合は質問文と同じグレースケール値ではないです。
|
33
34
|
```Python
|
34
35
|
part_height = np.einsum('ij,k->ijk', cv2.cvtColor(part_height, cv2.COLOR_RGB2GRAY), [1, 1, 1])
|
35
36
|
```
|
@@ -38,4 +39,17 @@
|
|
38
39
|
|
39
40
|
あと思いつく点としては、`changeToGray`の処理で戻り値として3次元(`RGB`)データを返していますが。
|
40
41
|
グレースケールデータは1次元で十分なので`as_completed`呼び出し側で一部の処理を行えば返す必要も無い気がします。
|
41
|
-
これに関しては受け渡しする`pickle`のデータ量と`as_completed`呼び出し側の`CPU`時間のトレードオフになるのではないかと、プロファイリングを複数回採ってみた方がよいと思います。
|
42
|
+
これに関しては受け渡しする`pickle`のデータ量と`as_completed`呼び出し側の`CPU`時間のトレードオフになるのではないかと、プロファイリングを複数回採ってみた方がよいと思います。
|
43
|
+
|
44
|
+
---
|
45
|
+
テスト中に気づいたのですが、質問文の元コードだと白色のグレースケール値が`254`になります。
|
46
|
+
|
47
|
+
こんな感じのハッシュ関数を作ってテストコードに入れておくのをお勧め致します。
|
48
|
+
```Python
|
49
|
+
def image_hash(img):
|
50
|
+
from hashlib import sha384
|
51
|
+
x = np.ascontiguousarray(img, dtype=np.uint8)
|
52
|
+
print(sha384(x).hexdigest())
|
53
|
+
```
|
54
|
+
◇参考情報
|
55
|
+
[Fast way to Hash Numpy objects for Caching](https://stackoverflow.com/questions/5386694/fast-way-to-hash-numpy-objects-for-caching/)
|
4
pickleで受け渡しするデータに関して追記
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
> 何処がボトルネックになっているか
|
2
2
|
|
3
|
-
`numpy`はループで
|
3
|
+
a,`numpy`はループでピクセル単位に処理を行うと**ものすごーく時間**がかかるので。
|
4
4
|
あまりテストできてませんが。
|
5
5
|
|
6
6
|
[行列によるグレースケール化編 ~Python画像処理の再発明家~](https://qiita.com/secang0/items/6fba02d7cc3ef34c0c31#ntsc-%E4%BF%82%E6%95%B0%E3%81%AB%E3%82%88%E3%82%8B%E5%8A%A0%E9%87%8D%E5%B9%B3%E5%9D%87%E6%B3%95)を参考に。
|
@@ -29,8 +29,13 @@
|
|
29
29
|
|
30
30
|
**※numpyマニアな方なツッコミ待ちです。**
|
31
31
|
|
32
|
-
---
|
33
|
-
あとは`(0.3 * R + 0.59 * G + 0.11 * B`)の部分を`cv2.cvtColor`を使ったこのような形にでも。
|
32
|
+
b, あとは`(0.3 * R + 0.59 * G + 0.11 * B`)の部分を`cv2.cvtColor`を使ったこのような形にでも。
|
34
33
|
```Python
|
35
34
|
part_height = np.einsum('ij,k->ijk', cv2.cvtColor(part_height, cv2.COLOR_RGB2GRAY), [1, 1, 1])
|
36
|
-
```
|
35
|
+
```
|
36
|
+
|
37
|
+
---
|
38
|
+
|
39
|
+
あと思いつく点としては、`changeToGray`の処理で戻り値として3次元(`RGB`)データを返していますが。
|
40
|
+
グレースケールデータは1次元で十分なので`as_completed`呼び出し側で一部の処理を行えば返す必要も無い気がします。
|
41
|
+
これに関しては受け渡しする`pickle`のデータ量と`as_completed`呼び出し側の`CPU`時間のトレードオフになるのではないかと、プロファイリングを複数回採ってみた方がよいと思います。
|
3
追記
answer
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
+
> 何処がボトルネックになっているか
|
2
|
+
|
3
|
+
`numpy`はループでバイト単位に処理を行うと**ものすごーく時間**がかかるので。
|
1
4
|
あまりテストできてませんが。
|
2
|
-
`numpy`はループでバイト単位に処理を行うと**ものすごーく時間**がかかるので。
|
3
5
|
|
4
6
|
[行列によるグレースケール化編 ~Python画像処理の再発明家~](https://qiita.com/secang0/items/6fba02d7cc3ef34c0c31#ntsc-%E4%BF%82%E6%95%B0%E3%81%AB%E3%82%88%E3%82%8B%E5%8A%A0%E9%87%8D%E5%B9%B3%E5%9D%87%E6%B3%95)を参考に。
|
5
7
|
|
2
変更!
answer
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
あまりテストできてませんが。
|
2
|
-
numpyはループでバイト単位に処理を行うと**ものすごーく時間**がかかるので。
|
2
|
+
`numpy`はループでバイト単位に処理を行うと**ものすごーく時間**がかかるので。
|
3
3
|
|
4
4
|
[行列によるグレースケール化編 ~Python画像処理の再発明家~](https://qiita.com/secang0/items/6fba02d7cc3ef34c0c31#ntsc-%E4%BF%82%E6%95%B0%E3%81%AB%E3%82%88%E3%82%8B%E5%8A%A0%E9%87%8D%E5%B9%B3%E5%9D%87%E6%B3%95)を参考に。
|
5
5
|
|
@@ -25,4 +25,10 @@
|
|
25
25
|
+ print(exe_time)
|
26
26
|
```
|
27
27
|
|
28
|
-
※numpyマニアな方なツッコミ待ちです。
|
28
|
+
**※numpyマニアな方なツッコミ待ちです。**
|
29
|
+
|
30
|
+
---
|
31
|
+
あとは`(0.3 * R + 0.59 * G + 0.11 * B`)の部分を`cv2.cvtColor`を使ったこのような形にでも。
|
32
|
+
```Python
|
33
|
+
part_height = np.einsum('ij,k->ijk', cv2.cvtColor(part_height, cv2.COLOR_RGB2GRAY), [1, 1, 1])
|
34
|
+
```
|
1
ndarrayをそのまま渡すように
answer
CHANGED
@@ -11,8 +11,7 @@
|
|
11
11
|
endPioint = number + length if number + length < len(img) else len(img) - 1
|
12
12
|
part_height = img[ number : endPioint-1 ]
|
13
13
|
R, G, B = part_height[..., 0], part_height[..., 1], part_height[..., 2]
|
14
|
-
part_height = (0.3 * R + 0.59 * G + 0.11 * B)
|
15
|
-
part_height = np.einsum('ij,k->ijk',
|
14
|
+
part_height = np.einsum('ij,k->ijk', (0.3 * R + 0.59 * G + 0.11 * B), [1, 1, 1])
|
16
15
|
# 戻り値に実行時間を追加
|
17
16
|
return number, part_height, perf_counter() - st_time
|
18
17
|
```
|
@@ -24,4 +23,6 @@
|
|
24
23
|
+for future in concurrent.futures.as_completed(fs):
|
25
24
|
+ line_number, part_height, exe_time = future.result()
|
26
25
|
+ print(exe_time)
|
27
|
-
```
|
26
|
+
```
|
27
|
+
|
28
|
+
※numpyマニアな方なツッコミ待ちです。
|