回答編集履歴

3

詳しく書いた

2021/04/09 05:19

投稿

BoKuToTuZenU
BoKuToTuZenU

スコア51

test CHANGED
@@ -1,21 +1,133 @@
1
+ エラーメッセージは入力が4次元を想定しているのに、3次元の入力が入ってきた
2
+
3
+ という意味です。
4
+
5
+
6
+
1
- pytorchの場合、入力は(Batch_Size, Channel, Height, Width)です。
7
+ pytorchの場合、モデルに入力するテンソルの次元は(Batch_Size, Channel, Height, Width)の4次元です。
2
8
 
3
9
  (https://discuss.pytorch.org/t/dimensions-of-an-input-image/19439)
4
10
 
5
- ですが、入力が(Channel, Height, Width)となっているため、エラーが起きていると考えられます。
11
+ ですが、ご提示いただいているコードでは入力が(Channel, Height, Width)の3次元となっているため、エラーが起きていると考えられます。
6
12
 
13
+ つまり、入力のtensorに新しい次元を足せばよいということになります。
14
+
15
+
16
+
17
+ また、画像の訓練時のサイズとデプロイ時のサイズは必ずしも一致している必要なないかと思います。
18
+
19
+ SRGANなどの学習でも,(64x64)のパッチで学習を行います。
20
+
21
+ 推論時では、元の画像の大きさをそのまま入力するやり方を取っていたはずです。
22
+
23
+
24
+
25
+
26
+
27
+ そのため、ご提示いただいていたコードであるような、
28
+
29
+ ```python
30
+
31
+ #画像の読み込みと名前,拡張子の取得
32
+
33
+ os.chdir(input_dir)
34
+
35
+ apply_img = Image.open(n).convert("RGB")
36
+
37
+ img_name, img_ext = os.path.splitext(n)
38
+
39
+ print(img_name)
40
+
41
+
42
+
43
+ #画像サイズとクロップ数の計算部分
44
+
45
+ numX = apply_img.width // sample_img.width
46
+
47
+ numY = apply_img.height // sample_img.height
48
+
49
+ crop_imgs = []
50
+
51
+ out_imgs = []
52
+
53
+
54
+
55
+ #画像を分割
56
+
57
+ for i in range(numY):
58
+
59
+ for j in range(numX):
60
+
61
+ input_img = apply_img.crop((sample_img.width * j, sample_img.height*i,
62
+
63
+ sample_img.width * j + sample_img.width, sample_img.height * i + sample_img.height))
64
+
65
+ input_img_tensor = tv.transforms.ToTensor()(input_img)
66
+
67
+ crop_imgs.append(input_img_tensor)
68
+
69
+
70
+
71
+ #分割をモデルに適用
72
+
73
+ for m in crop_imgs:
74
+
75
+ prediction = model(m)
76
+
77
+ out_imgs.append(prediction)
78
+
79
+
80
+
7
- ため、入前に、
81
+ #モデル画像を繋げ
82
+
83
+ append_imgs = out_imgs
84
+
85
+ v_img = []
86
+
87
+ for y in range(numY):
88
+
89
+ u_img = []
90
+
91
+ for x in range(numX):
92
+
93
+ num = x + y * numX
94
+
95
+ u_img.append(append_imgs[num])
96
+
97
+
98
+
99
+ imgU = cv2.hconcat(u_img)
100
+
101
+ v_img.append(imgU)
102
+
103
+
104
+
105
+ append_img = cv2.vconcat(v_img)
106
+
107
+ append_img = Image.fromarray(np.unit8(append_img))
108
+
109
+ save_name = str(n)
110
+
111
+ save_name_dir = os.path.join(save_dir, save_name)
112
+
113
+ append_img.save(save_name_dir)
8
114
 
9
115
  ```
10
116
 
11
- C, W, H = input_img_tensor.size()
117
+ のような部分は
12
-
13
- input_img = input_img_tensor.reshape(1, C, W, H)
14
118
 
15
119
  ```
16
120
 
17
- などとしてみてはいかがでしょうか?
121
+ apply_img = Image.open(n).convert("RGB")
18
122
 
123
+ input_image_tensor = tv.transforms.ToTensor()(apply_img)
124
+
125
+ input_image_tensor = torch.unsqueeze(input_image_tensor, 0)
126
+
127
+ prediction = model(m)
128
+
129
+ ```
130
+
19
- また、画像の訓練時のサイズデプロイ時のサイズは必ずしも一致している必要なないかと思います。
131
+ としアウトプットを得られるかと思います。
20
132
 
21
133
  SRGANなどの学習でも,(64x64)のパッチで学習を行い、デプロイ時はパッチを利用しないで推論していたと思います。

2

ミスを修正しました。

2021/04/09 05:19

投稿

BoKuToTuZenU
BoKuToTuZenU

スコア51

test CHANGED
@@ -8,9 +8,9 @@
8
8
 
9
9
  ```
10
10
 
11
- C, W, H = input_img.size()
11
+ C, W, H = input_img_tensor.size()
12
12
 
13
- input_img = input_img.reshape(1, C, W, H)
13
+ input_img = input_img_tensor.reshape(1, C, W, H)
14
14
 
15
15
  ```
16
16
 

1

ミスを修正しました。

2021/04/09 05:08

投稿

BoKuToTuZenU
BoKuToTuZenU

スコア51

test CHANGED
@@ -1,6 +1,8 @@
1
- pytorchの場合、入力は(Batch_Size, Channel, Width, Height)です。
1
+ pytorchの場合、入力は(Batch_Size, Channel, Height, Width)です。
2
2
 
3
+ (https://discuss.pytorch.org/t/dimensions-of-an-input-image/19439)
4
+
3
- ですが、入力が(Channel, Width, Height)となっているため、エラーが起きていると考えられます。
5
+ ですが、入力が(Channel, Height, Width)となっているため、エラーが起きていると考えられます。
4
6
 
5
7
  そのため、入力する前に、
6
8