teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

修正

2021/01/21 12:22

投稿

daikooooooon
daikooooooon

スコア9

answer CHANGED
@@ -31,7 +31,6 @@
31
31
  self.num_frame = num_frame
32
32
  self.transform = transform
33
33
  self.phase = phase
34
- self.LHE = Luminance_Histogram_Equalization()
35
34
 
36
35
  def __len__(self):
37
36
  return self.num_frame #################################

1

追記

2021/01/21 12:22

投稿

daikooooooon
daikooooooon

スコア9

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