回答編集履歴

2

修正

2021/01/21 12:22

投稿

daikooooooon
daikooooooon

スコア9

test CHANGED
@@ -64,8 +64,6 @@
64
64
 
65
65
  self.phase = phase
66
66
 
67
- self.LHE = Luminance_Histogram_Equalization()
68
-
69
67
 
70
68
 
71
69
  def __len__(self):

1

追記

2021/01/21 12:22

投稿

daikooooooon
daikooooooon

スコア9

test CHANGED
@@ -1 +1,119 @@
1
1
  追記に記載-----
2
+
3
+
4
+
5
+ ######・1/21
6
+
7
+ さらに1.5倍ほど高速化し、1つの動画に約55分という理想に近い速度で処理できるようになりました!
8
+
9
+ PILのクロップをしているあたりに時間がかかっていたので、
10
+
11
+ https://blog.shikoan.com/pytorch-extract-patches/
12
+
13
+ を参考に、フレーム画像をTensorに変換し、それからunfoldを使って一気にクロップするように変更しました
14
+
15
+ ```Python
16
+
17
+ Transformでunfoldするクラス
18
+
19
+ int(x[1])は109で、フレーム画像から画像をcropするときの画像間のstep幅
20
+
21
+ class Make_Patch:
22
+
23
+ def __init__(self, x):
24
+
25
+ self.step = int(x[1] * (224 / 256)) # resize後のstepなので、* (224 / 256)
26
+
27
+
28
+
29
+ def __call__(self, img):
30
+
31
+ imgs = img.unsqueeze(0).unfold(2, 224, self.step).unfold(3, 224, self.step).permute([0, 2, 3, 1, 4, 5]).reshape(-1, 3, 224, 224)
32
+
33
+ return imgs
34
+
35
+
36
+
37
+ Transformを変更
38
+
39
+ "test": transforms.Compose([
40
+
41
+ transforms.Resize(resize),
42
+
43
+ transforms.ToTensor(),
44
+
45
+ transforms.Normalize(mean, std),
46
+
47
+ Make_Patch(x),
48
+
49
+ ])
50
+
51
+
52
+
53
+ Datasetを変更
54
+
55
+ class Dataset(data.Dataset):
56
+
57
+ def __init__(self, cap, num_frame, transform=None, phase="test"):
58
+
59
+ self.cap = cap
60
+
61
+ self.num_frame = num_frame
62
+
63
+ self.transform = transform
64
+
65
+ self.phase = phase
66
+
67
+ self.LHE = Luminance_Histogram_Equalization()
68
+
69
+
70
+
71
+ def __len__(self):
72
+
73
+ return self.num_frame #################################
74
+
75
+
76
+
77
+ def __getitem__(self, index):
78
+
79
+ ret, self.frame = self.cap.read()
80
+
81
+ self.frame = cv2pil(self.frame)
82
+
83
+ cropped_img = self.transform(self.frame, self.phase)#######################
84
+
85
+ return cropped_img
86
+
87
+
88
+
89
+ Transformのresizeは256→224にしていたが、今回の実装ではフレーム画像をリサイズしてTensorにしてunfoldするので、1024→896にリサイズ
90
+
91
+ resize = 896 # 224/256 = 0.875, 1024*0.875 = 896
92
+
93
+
94
+
95
+ 推論部分を変更
96
+
97
+ #推論
98
+
99
+ with torch.no_grad():
100
+
101
+ for i, inputs in enumerate(tqdm(dataloader)):
102
+
103
+ inputs = inputs.reshape(-1, 3, 224, 224) # 先頭に余計な次元1があるので消す
104
+
105
+ if use_cuda:
106
+
107
+ inputs = inputs.cuda()
108
+
109
+ outputs = model(inputs)
110
+
111
+ if inputs.size()[0] == batch_size * len(x) * len(y): # フレーム数がバッチサイズで割り切れないときは、最後のイテレーションの代入はインデックス指定を変更
112
+
113
+ prob_array[i*batch_size:i*batch_size+batch_size] = softmax(outputs)[:, 1].to('cpu').detach().numpy().copy().reshape(batch_size, len(x), len(y))
114
+
115
+ else:
116
+
117
+ prob_array[i*batch_size:] = softmax(outputs)[:, 1].to('cpu').detach().numpy().copy().reshape(-1, len(x), len(y))
118
+
119
+ ```