├── LICENSE ├── README.md ├── config.py ├── dataset.py ├── list ├── gt-sh.npy ├── gt-ucf.npy ├── shanghai-test.list ├── shanghai-train.list ├── ucf-test.list └── ucf-train.list ├── main.py ├── misc.py ├── model.py ├── option.py ├── requirements.txt ├── samplers.py ├── scripts ├── train_ssrl_stage1.sh ├── train_ssrl_stage2.sh ├── train_ssrl_stage3.sh └── train_ssrl_stage4.sh ├── test.py ├── train.py └── utils.py /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Guoqiu Li 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SSRL 2 | This repository is an official implementation of the paper Scale-aware Spatio-temporal Relation Learning for Video Anomaly Detection 3 | 4 | ## Introduction 5 | **Abstract.** Recent progress in video anomaly detection (VAD) has shown that feature discrimination is the key to effectively distinguishing anomalies from normal events. 6 | We observe that many anomalous events occur in limited local regions, and the severe background noise increases the difficulty of feature learning. 7 | In this paper, we propose a scale-aware weakly supervised learning approach to capture local and salient anomalous patterns from the background, using only coarse video-level labels as supervision. 8 | We achieve this by segmenting frames into non-overlapping patches and then capturing inconsistencies among different regions through our patch spatial relation (PSR) module, which consists of self-attention mechanisms and dilated convolutions. 9 | To address the scale variation of anomalies and enhance the robustness of our method, a multi-scale patch aggregation method is further introduced to enable local-to-global spatial perception by merging features of patches with different scales. 10 | Considering the importance of temporal cues, we extend the relation modeling from the spatial domain to the spatio-temporal domain with the help of the existing video temporal relation network to effectively encode the spatio-temporal dynamics in the video. 11 | Experimental results show that our proposed method achieves new state-of-the-art performance on UCF-Crime and ShanghaiTech benchmarks. 12 | 13 | ## License 14 | 15 | This project is released under the [MIT license](./LICENSE). 16 | 17 | ## Installation 18 | 19 | ### Requirements 20 | 21 | * Linux, CUDA>=9.2 22 | 23 | * Python>=3.5 24 | 25 | We recommend you to use Anaconda to create a conda environment: 26 | ```bash 27 | conda create -n ssrl python=3.7 28 | ``` 29 | Then, activate the environment: 30 | ```bash 31 | conda activate ssrl 32 | ``` 33 | 34 | * PyTorch>=1.5.1, torchvision>=0.6.1 (following instructions [here](https://pytorch.org/)) 35 | 36 | For example, if your CUDA version is 9.2, you could install pytorch and torchvision as following: 37 | ```bash 38 | conda install pytorch=1.5.1 torchvision=0.6.1 cudatoolkit=9.2 -c pytorch 39 | ``` 40 | 41 | * Other requirements 42 | ```bash 43 | pip install -r requirements.txt 44 | ``` 45 | 46 | ## Usage 47 | 48 | ### Dataset preparation 49 | 50 | Please download extracted i3d features and checkpoints for ShanghaiTech and UCF-Crime dataset from [Baidu Wangpan (extract code: wxxy)](https://pan.baidu.com/s/1gWotx_lzjBbCFx1xcPHGzQ) and put them under the coderoot. 51 | 52 | ### Training 53 | 54 | #### Training on single node 55 | 56 | Step-by-step training: 57 | 58 | ```bash 59 | sh scripts/train_ssrl_stage1.sh 60 | 61 | sh scripts/train_ssrl_stage2.sh 62 | 63 | sh scripts/train_ssrl_stage3.sh 64 | 65 | sh scripts/train_ssrl_stage4.sh 66 | ``` 67 | 68 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import os 3 | 4 | class Config(object): 5 | def __init__(self, args): 6 | self.lr = eval(args.lr) 7 | self.lr_str = args.lr 8 | 9 | def __str__(self): 10 | attrs = vars(self) 11 | attr_lst = sorted(attrs.keys()) 12 | return '\n'.join("- %s: %s" % (item, attrs[item]) for item in attr_lst if item != 'lr') 13 | 14 | -------------------------------------------------------------------------------- /dataset.py: -------------------------------------------------------------------------------- 1 | import torch.utils.data as data 2 | import numpy as np 3 | from utils import process_feat 4 | import torch 5 | 6 | class Dataset(data.Dataset): 7 | def __init__(self, args, is_normal=True, transform=None, test_mode=False): 8 | self.is_normal = is_normal 9 | self.model_name = args.model_name 10 | self.dataset = args.dataset 11 | self.patch_mode = args.patch_mode 12 | self.data_dir = args.data_dir 13 | self.num_segments = args.num_segments 14 | if self.dataset == 'shanghai': 15 | if test_mode: 16 | self.rgb_list_file = 'list/shanghai-test.list' 17 | else: 18 | self.rgb_list_file = 'list/shanghai-train.list' 19 | else: 20 | if test_mode: 21 | self.rgb_list_file = 'list/ucf-test.list' 22 | else: 23 | self.rgb_list_file = 'list/ucf-train.list' 24 | 25 | self.tranform = transform 26 | self.test_mode = test_mode 27 | self._parse_list() 28 | self.num_frame = 0 29 | self.labels = None 30 | 31 | 32 | def _parse_list(self): 33 | self.list = list(open(self.rgb_list_file)) 34 | self.patch_list = [] 35 | data_root = self.data_dir 36 | if self.test_mode is False: 37 | if self.dataset == 'shanghai': 38 | if self.is_normal: 39 | self.list = self.list[63:] 40 | 41 | else: 42 | self.list = self.list[:63] 43 | 44 | for i in range(len(self.list)): 45 | self.list[i] = data_root + 'SH_Train_i3d/' + self.list[i] 46 | 47 | 48 | 49 | elif self.dataset == 'ucf': 50 | if self.is_normal: 51 | self.list = self.list[810:] 52 | else: 53 | self.list = self.list[:810] 54 | for i in range(len(self.list)): 55 | self.list[i] = data_root + 'UCF_Train_i3d_32/' + self.list[i] 56 | 57 | else: 58 | if self.dataset == 'shanghai': 59 | for i in range(len(self.list)): 60 | self.list[i] = data_root + 'SH_Test_i3d/' + self.list[i] 61 | 62 | 63 | elif self.dataset == 'ucf': 64 | for i in range(len(self.list)): 65 | self.list[i] = data_root + 'UCF_Test_i3d/' + self.list[i] 66 | 67 | 68 | def __getitem__(self, index): 69 | label = self.get_label() # get video level label 0/1 70 | features = np.load(self.list[index].strip('\n'), allow_pickle=True) 71 | features = np.array(features, dtype=np.float32) 72 | 73 | if self.tranform is not None: 74 | features = self.tranform(features) 75 | if self.test_mode: 76 | return features,index 77 | else: 78 | if self.dataset == 'shanghai': 79 | #process 10-cropped snippet feature 80 | features = features.transpose(1, 0, 2) # [10, B, T, F] 81 | divided_features = [] 82 | for feature in features: 83 | feature = process_feat(feature, self.num_segments) # divide a video into 32 segments 84 | divided_features.append(feature) 85 | divided_features = np.array(divided_features, dtype=np.float32) 86 | else: 87 | divided_features = features 88 | 89 | return divided_features, label 90 | 91 | def get_label(self): 92 | 93 | if self.is_normal: 94 | label = torch.tensor(0.0) 95 | else: 96 | label = torch.tensor(1.0) 97 | 98 | return label 99 | 100 | def __len__(self): 101 | return len(self.list) 102 | 103 | def get_num_frames(self): 104 | return self.num_frame 105 | 106 | 107 | 108 | class Multi_Dataset(data.Dataset): 109 | def __init__(self, args, is_normal=True, transform=None, test_mode=False): 110 | self.is_normal = is_normal 111 | self.model_name = args.model_name 112 | self.dataset = args.dataset 113 | self.multi_patch_mode = args.multi_patch_mode 114 | self.multi_patch_size = args.multi_patch_size 115 | self.data_dir = args.data_dir 116 | self.num_segments = args.num_segments 117 | if self.dataset == 'shanghai': 118 | if test_mode: 119 | self.rgb_list_file = 'list/shanghai-test.list' 120 | else: 121 | self.rgb_list_file = 'list/shanghai-train.list' 122 | else: 123 | if test_mode: 124 | self.rgb_list_file = 'list/ucf-test.list' 125 | else: 126 | self.rgb_list_file = 'list/ucf-train.list' 127 | 128 | self.tranform = transform 129 | self.test_mode = test_mode 130 | self._parse_list() 131 | self.num_frame = 0 132 | self.labels = None 133 | 134 | def _parse_list(self): 135 | self.list = list(open(self.rgb_list_file)) 136 | self.patch_list = {} 137 | data_root = self.data_dir 138 | if self.test_mode is False: 139 | if self.dataset == 'shanghai': 140 | if self.is_normal: 141 | self.list = self.list[63:] 142 | else: 143 | self.list = self.list[:63] 144 | for i in range(len(self.list)): 145 | self.list[i] = data_root + 'SH_Train_i3d/' + self.list[i] 146 | for size in self.multi_patch_size: 147 | self.patch_list[str(size)] = [data_root + 'SH_PATCH'+str(size)+'_i3d/' + video_name.split('/')[-1].replace('_i3d','_patch'+str(size)+'_i3d') for video_name in self.list] 148 | 149 | 150 | elif self.dataset == 'ucf': 151 | if self.is_normal: 152 | self.list = self.list[810:] 153 | else: 154 | self.list = self.list[:810] 155 | for i in range(len(self.list)): 156 | self.list[i] = data_root + 'UCF_Train_i3d_32/' + self.list[i] 157 | for size in self.multi_patch_size: 158 | self.patch_list[str(size)] = [video_name.replace('_i3d','_patch'+str(size)+'_i3d') for video_name in self.list] 159 | 160 | else: 161 | if self.dataset == 'shanghai': 162 | for i in range(len(self.list)): 163 | self.list[i] = data_root + 'SH_Test_i3d/' + self.list[i] 164 | for size in self.multi_patch_size: 165 | self.patch_list[str(size)] = [data_root + 'SH_PATCH'+str(size)+'_i3d/' + video_name.split('/')[-1].replace('_i3d','_patch'+str(size)+'_i3d') for video_name in self.list] 166 | 167 | 168 | elif self.dataset == 'ucf': 169 | for i in range(len(self.list)): 170 | self.list[i] = data_root + 'UCF_Test_i3d/' + self.list[i] 171 | for size in self.multi_patch_size: 172 | self.patch_list[str(size)] = [video_name.replace('_i3d','_patch' + str(size) + '_i3d') for video_name in self.list] 173 | 174 | def __getitem__(self, index): 175 | 176 | label = self.get_label() # get video level label 0/1 177 | features = np.load(self.list[index].strip('\n'), allow_pickle=True) 178 | features = np.array(features, dtype=np.float32) 179 | 180 | if self.multi_patch_mode: 181 | patch_feat_all = [] 182 | for key in self.patch_list.keys(): 183 | feat = np.load(self.patch_list[key][index].strip('\n'), allow_pickle=True) 184 | patch_feat = np.array(feat,dtype=np.float32) 185 | patch_feat_all.append(patch_feat) 186 | if self.test_mode or self.dataset == 'shanghai': 187 | patch_feat_all = np.concatenate(patch_feat_all, axis=1) 188 | features = np.concatenate((features, patch_feat_all), axis=1) 189 | else: 190 | patch_feat_all = np.concatenate(patch_feat_all, axis=0) 191 | features = np.concatenate((features, patch_feat_all), axis=0) 192 | 193 | 194 | if self.tranform is not None: 195 | features = self.tranform(features) 196 | if self.test_mode: 197 | return features, index 198 | else: 199 | if self.dataset == 'shanghai': 200 | features = features.transpose(1, 0, 2) # [10, B, T, F] 201 | divided_features = [] 202 | for feature in features: 203 | feature = process_feat(feature, self.num_segments) # divide a video into 32 segments 204 | divided_features.append(feature) 205 | divided_features = np.array(divided_features, dtype=np.float32) 206 | else: 207 | divided_features = features 208 | 209 | return divided_features, label 210 | 211 | def get_label(self): 212 | 213 | if self.is_normal: 214 | label = torch.tensor(0.0) 215 | else: 216 | label = torch.tensor(1.0) 217 | 218 | return label 219 | 220 | def __len__(self): 221 | return len(self.list) 222 | 223 | def get_num_frames(self): 224 | return self.num_frame 225 | 226 | -------------------------------------------------------------------------------- /list/gt-sh.npy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nutuniv/SSRL/5e1f312d75d304f035543a49957bbe6fb19c7870/list/gt-sh.npy -------------------------------------------------------------------------------- /list/gt-ucf.npy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nutuniv/SSRL/5e1f312d75d304f035543a49957bbe6fb19c7870/list/gt-ucf.npy -------------------------------------------------------------------------------- /list/shanghai-test.list: -------------------------------------------------------------------------------- 1 | 01_0015_i3d.npy 2 | 01_0025_i3d.npy 3 | 01_0027_i3d.npy 4 | 01_0028_i3d.npy 5 | 01_0051_i3d.npy 6 | 01_0052_i3d.npy 7 | 01_0053_i3d.npy 8 | 01_0055_i3d.npy 9 | 01_0056_i3d.npy 10 | 01_0064_i3d.npy 11 | 01_0135_i3d.npy 12 | 01_0136_i3d.npy 13 | 01_0139_i3d.npy 14 | 01_0141_i3d.npy 15 | 01_0162_i3d.npy 16 | 01_0177_i3d.npy 17 | 02_0161_i3d.npy 18 | 03_0031_i3d.npy 19 | 03_0032_i3d.npy 20 | 03_0033_i3d.npy 21 | 03_0059_i3d.npy 22 | 04_0004_i3d.npy 23 | 04_0011_i3d.npy 24 | 04_0012_i3d.npy 25 | 04_0046_i3d.npy 26 | 05_0017_i3d.npy 27 | 05_0019_i3d.npy 28 | 05_0023_i3d.npy 29 | 06_0144_i3d.npy 30 | 06_0153_i3d.npy 31 | 07_0006_i3d.npy 32 | 07_0008_i3d.npy 33 | 07_0048_i3d.npy 34 | 08_0058_i3d.npy 35 | 08_0077_i3d.npy 36 | 08_0080_i3d.npy 37 | 08_0157_i3d.npy 38 | 08_0158_i3d.npy 39 | 10_0038_i3d.npy 40 | 10_0042_i3d.npy 41 | 12_0142_i3d.npy 42 | 12_0151_i3d.npy 43 | 12_0173_i3d.npy 44 | 12_0174_i3d.npy 45 | 01_001_i3d.npy 46 | 01_004_i3d.npy 47 | 01_006_i3d.npy 48 | 01_008_i3d.npy 49 | 01_012_i3d.npy 50 | 01_018_i3d.npy 51 | 01_021_i3d.npy 52 | 01_026_i3d.npy 53 | 01_027_i3d.npy 54 | 01_028_i3d.npy 55 | 01_030_i3d.npy 56 | 01_032_i3d.npy 57 | 01_034_i3d.npy 58 | 01_038_i3d.npy 59 | 01_039_i3d.npy 60 | 01_040_i3d.npy 61 | 01_043_i3d.npy 62 | 01_045_i3d.npy 63 | 01_047_i3d.npy 64 | 01_050_i3d.npy 65 | 01_052_i3d.npy 66 | 01_053_i3d.npy 67 | 01_055_i3d.npy 68 | 01_056_i3d.npy 69 | 01_057_i3d.npy 70 | 01_058_i3d.npy 71 | 01_059_i3d.npy 72 | 01_061_i3d.npy 73 | 01_064_i3d.npy 74 | 01_065_i3d.npy 75 | 01_071_i3d.npy 76 | 01_072_i3d.npy 77 | 01_074_i3d.npy 78 | 01_075_i3d.npy 79 | 01_076_i3d.npy 80 | 01_077_i3d.npy 81 | 01_078_i3d.npy 82 | 01_079_i3d.npy 83 | 01_080_i3d.npy 84 | 01_081_i3d.npy 85 | 01_082_i3d.npy 86 | 02_001_i3d.npy 87 | 02_003_i3d.npy 88 | 02_007_i3d.npy 89 | 02_008_i3d.npy 90 | 02_009_i3d.npy 91 | 02_012_i3d.npy 92 | 02_015_i3d.npy 93 | 03_002_i3d.npy 94 | 03_005_i3d.npy 95 | 04_002_i3d.npy 96 | 04_005_i3d.npy 97 | 04_007_i3d.npy 98 | 04_008_i3d.npy 99 | 04_011_i3d.npy 100 | 04_014_i3d.npy 101 | 04_016_i3d.npy 102 | 04_017_i3d.npy 103 | 04_018_i3d.npy 104 | 05_004_i3d.npy 105 | 05_005_i3d.npy 106 | 05_009_i3d.npy 107 | 05_010_i3d.npy 108 | 05_013_i3d.npy 109 | 05_016_i3d.npy 110 | 05_018_i3d.npy 111 | 05_021_i3d.npy 112 | 05_023_i3d.npy 113 | 05_025_i3d.npy 114 | 05_026_i3d.npy 115 | 05_028_i3d.npy 116 | 05_030_i3d.npy 117 | 05_033_i3d.npy 118 | 05_034_i3d.npy 119 | 05_038_i3d.npy 120 | 05_039_i3d.npy 121 | 05_041_i3d.npy 122 | 05_043_i3d.npy 123 | 05_044_i3d.npy 124 | 05_045_i3d.npy 125 | 05_048_i3d.npy 126 | 05_049_i3d.npy 127 | 05_054_i3d.npy 128 | 05_056_i3d.npy 129 | 05_057_i3d.npy 130 | 05_058_i3d.npy 131 | 05_060_i3d.npy 132 | 05_061_i3d.npy 133 | 05_062_i3d.npy 134 | 05_064_i3d.npy 135 | 05_065_i3d.npy 136 | 06_003_i3d.npy 137 | 06_006_i3d.npy 138 | 06_009_i3d.npy 139 | 06_011_i3d.npy 140 | 06_015_i3d.npy 141 | 06_017_i3d.npy 142 | 06_018_i3d.npy 143 | 06_020_i3d.npy 144 | 06_021_i3d.npy 145 | 06_022_i3d.npy 146 | 06_026_i3d.npy 147 | 06_028_i3d.npy 148 | 06_029_i3d.npy 149 | 06_030_i3d.npy 150 | 07_002_i3d.npy 151 | 07_005_i3d.npy 152 | 07_008_i3d.npy 153 | 08_001_i3d.npy 154 | 08_002_i3d.npy 155 | 08_004_i3d.npy 156 | 08_006_i3d.npy 157 | 08_007_i3d.npy 158 | 08_008_i3d.npy 159 | 08_010_i3d.npy 160 | 08_011_i3d.npy 161 | 08_016_i3d.npy 162 | 08_021_i3d.npy 163 | 08_023_i3d.npy 164 | 08_024_i3d.npy 165 | 08_025_i3d.npy 166 | 08_028_i3d.npy 167 | 08_029_i3d.npy 168 | 08_030_i3d.npy 169 | 08_032_i3d.npy 170 | 08_034_i3d.npy 171 | 08_037_i3d.npy 172 | 08_043_i3d.npy 173 | 08_045_i3d.npy 174 | 08_046_i3d.npy 175 | 08_047_i3d.npy 176 | 08_048_i3d.npy 177 | 09_002_i3d.npy 178 | 09_003_i3d.npy 179 | 09_005_i3d.npy 180 | 09_007_i3d.npy 181 | 10_004_i3d.npy 182 | 10_005_i3d.npy 183 | 10_008_i3d.npy 184 | 10_009_i3d.npy 185 | 10_011_i3d.npy 186 | 11_003_i3d.npy 187 | 11_004_i3d.npy 188 | 11_005_i3d.npy 189 | 11_006_i3d.npy 190 | 12_001_i3d.npy 191 | 12_004_i3d.npy 192 | 12_007_i3d.npy 193 | 12_008_i3d.npy 194 | 12_011_i3d.npy 195 | 12_012_i3d.npy 196 | 12_015_i3d.npy 197 | 13_001_i3d.npy 198 | 13_005_i3d.npy 199 | 13_006_i3d.npy 200 | -------------------------------------------------------------------------------- /list/shanghai-train.list: -------------------------------------------------------------------------------- 1 | 01_0014_i3d.npy 2 | 01_0016_i3d.npy 3 | 01_0026_i3d.npy 4 | 01_0029_i3d.npy 5 | 01_0030_i3d.npy 6 | 01_0054_i3d.npy 7 | 01_0063_i3d.npy 8 | 01_0073_i3d.npy 9 | 01_0076_i3d.npy 10 | 01_0129_i3d.npy 11 | 01_0130_i3d.npy 12 | 01_0131_i3d.npy 13 | 01_0132_i3d.npy 14 | 01_0133_i3d.npy 15 | 01_0134_i3d.npy 16 | 01_0138_i3d.npy 17 | 01_0140_i3d.npy 18 | 01_0163_i3d.npy 19 | 02_0128_i3d.npy 20 | 02_0164_i3d.npy 21 | 03_0035_i3d.npy 22 | 03_0036_i3d.npy 23 | 03_0039_i3d.npy 24 | 03_0041_i3d.npy 25 | 03_0060_i3d.npy 26 | 03_0061_i3d.npy 27 | 04_0001_i3d.npy 28 | 04_0003_i3d.npy 29 | 04_0010_i3d.npy 30 | 04_0013_i3d.npy 31 | 04_0050_i3d.npy 32 | 05_0018_i3d.npy 33 | 05_0020_i3d.npy 34 | 05_0021_i3d.npy 35 | 05_0022_i3d.npy 36 | 05_0024_i3d.npy 37 | 06_0145_i3d.npy 38 | 06_0147_i3d.npy 39 | 06_0150_i3d.npy 40 | 06_0155_i3d.npy 41 | 07_0005_i3d.npy 42 | 07_0007_i3d.npy 43 | 07_0009_i3d.npy 44 | 07_0047_i3d.npy 45 | 07_0049_i3d.npy 46 | 08_0044_i3d.npy 47 | 08_0078_i3d.npy 48 | 08_0079_i3d.npy 49 | 08_0156_i3d.npy 50 | 08_0159_i3d.npy 51 | 08_0178_i3d.npy 52 | 08_0179_i3d.npy 53 | 09_0057_i3d.npy 54 | 10_0037_i3d.npy 55 | 10_0074_i3d.npy 56 | 10_0075_i3d.npy 57 | 11_0176_i3d.npy 58 | 12_0143_i3d.npy 59 | 12_0148_i3d.npy 60 | 12_0149_i3d.npy 61 | 12_0152_i3d.npy 62 | 12_0154_i3d.npy 63 | 12_0175_i3d.npy 64 | 01_002_i3d.npy 65 | 01_003_i3d.npy 66 | 01_005_i3d.npy 67 | 01_007_i3d.npy 68 | 01_009_i3d.npy 69 | 01_010_i3d.npy 70 | 01_011_i3d.npy 71 | 01_013_i3d.npy 72 | 01_014_i3d.npy 73 | 01_015_i3d.npy 74 | 01_016_i3d.npy 75 | 01_017_i3d.npy 76 | 01_019_i3d.npy 77 | 01_020_i3d.npy 78 | 01_022_i3d.npy 79 | 01_023_i3d.npy 80 | 01_024_i3d.npy 81 | 01_025_i3d.npy 82 | 01_029_i3d.npy 83 | 01_031_i3d.npy 84 | 01_033_i3d.npy 85 | 01_035_i3d.npy 86 | 01_036_i3d.npy 87 | 01_037_i3d.npy 88 | 01_041_i3d.npy 89 | 01_042_i3d.npy 90 | 01_044_i3d.npy 91 | 01_046_i3d.npy 92 | 01_048_i3d.npy 93 | 01_049_i3d.npy 94 | 01_051_i3d.npy 95 | 01_054_i3d.npy 96 | 01_060_i3d.npy 97 | 01_062_i3d.npy 98 | 01_063_i3d.npy 99 | 01_066_i3d.npy 100 | 01_067_i3d.npy 101 | 01_068_i3d.npy 102 | 01_069_i3d.npy 103 | 01_070_i3d.npy 104 | 01_073_i3d.npy 105 | 01_083_i3d.npy 106 | 02_002_i3d.npy 107 | 02_004_i3d.npy 108 | 02_005_i3d.npy 109 | 02_006_i3d.npy 110 | 02_010_i3d.npy 111 | 02_011_i3d.npy 112 | 02_013_i3d.npy 113 | 02_014_i3d.npy 114 | 03_001_i3d.npy 115 | 03_003_i3d.npy 116 | 03_004_i3d.npy 117 | 03_006_i3d.npy 118 | 04_001_i3d.npy 119 | 04_003_i3d.npy 120 | 04_004_i3d.npy 121 | 04_006_i3d.npy 122 | 04_009_i3d.npy 123 | 04_010_i3d.npy 124 | 04_012_i3d.npy 125 | 04_013_i3d.npy 126 | 04_015_i3d.npy 127 | 04_019_i3d.npy 128 | 04_020_i3d.npy 129 | 05_001_i3d.npy 130 | 05_002_i3d.npy 131 | 05_003_i3d.npy 132 | 05_006_i3d.npy 133 | 05_007_i3d.npy 134 | 05_008_i3d.npy 135 | 05_011_i3d.npy 136 | 05_012_i3d.npy 137 | 05_014_i3d.npy 138 | 05_015_i3d.npy 139 | 05_017_i3d.npy 140 | 05_019_i3d.npy 141 | 05_020_i3d.npy 142 | 05_022_i3d.npy 143 | 05_024_i3d.npy 144 | 05_027_i3d.npy 145 | 05_029_i3d.npy 146 | 05_031_i3d.npy 147 | 05_032_i3d.npy 148 | 05_035_i3d.npy 149 | 05_036_i3d.npy 150 | 05_037_i3d.npy 151 | 05_040_i3d.npy 152 | 05_042_i3d.npy 153 | 05_046_i3d.npy 154 | 05_047_i3d.npy 155 | 05_050_i3d.npy 156 | 05_051_i3d.npy 157 | 05_052_i3d.npy 158 | 05_053_i3d.npy 159 | 05_055_i3d.npy 160 | 05_059_i3d.npy 161 | 05_063_i3d.npy 162 | 05_066_i3d.npy 163 | 06_001_i3d.npy 164 | 06_002_i3d.npy 165 | 06_004_i3d.npy 166 | 06_005_i3d.npy 167 | 06_007_i3d.npy 168 | 06_008_i3d.npy 169 | 06_010_i3d.npy 170 | 06_012_i3d.npy 171 | 06_013_i3d.npy 172 | 06_014_i3d.npy 173 | 06_016_i3d.npy 174 | 06_019_i3d.npy 175 | 06_023_i3d.npy 176 | 06_024_i3d.npy 177 | 06_025_i3d.npy 178 | 06_027_i3d.npy 179 | 07_001_i3d.npy 180 | 07_003_i3d.npy 181 | 07_004_i3d.npy 182 | 07_006_i3d.npy 183 | 07_007_i3d.npy 184 | 08_003_i3d.npy 185 | 08_005_i3d.npy 186 | 08_009_i3d.npy 187 | 08_012_i3d.npy 188 | 08_013_i3d.npy 189 | 08_014_i3d.npy 190 | 08_015_i3d.npy 191 | 08_017_i3d.npy 192 | 08_018_i3d.npy 193 | 08_019_i3d.npy 194 | 08_020_i3d.npy 195 | 08_022_i3d.npy 196 | 08_026_i3d.npy 197 | 08_027_i3d.npy 198 | 08_031_i3d.npy 199 | 08_033_i3d.npy 200 | 08_035_i3d.npy 201 | 08_036_i3d.npy 202 | 08_038_i3d.npy 203 | 08_039_i3d.npy 204 | 08_040_i3d.npy 205 | 08_041_i3d.npy 206 | 08_042_i3d.npy 207 | 08_044_i3d.npy 208 | 08_049_i3d.npy 209 | 09_001_i3d.npy 210 | 09_004_i3d.npy 211 | 09_006_i3d.npy 212 | 09_008_i3d.npy 213 | 09_009_i3d.npy 214 | 09_010_i3d.npy 215 | 10_001_i3d.npy 216 | 10_002_i3d.npy 217 | 10_003_i3d.npy 218 | 10_006_i3d.npy 219 | 10_007_i3d.npy 220 | 10_010_i3d.npy 221 | 11_001_i3d.npy 222 | 11_002_i3d.npy 223 | 11_007_i3d.npy 224 | 11_008_i3d.npy 225 | 11_009_i3d.npy 226 | 11_010_i3d.npy 227 | 12_002_i3d.npy 228 | 12_003_i3d.npy 229 | 12_005_i3d.npy 230 | 12_006_i3d.npy 231 | 12_009_i3d.npy 232 | 12_010_i3d.npy 233 | 12_013_i3d.npy 234 | 12_014_i3d.npy 235 | 13_002_i3d.npy 236 | 13_003_i3d.npy 237 | 13_004_i3d.npy 238 | 13_007_i3d.npy 239 | -------------------------------------------------------------------------------- /list/ucf-test.list: -------------------------------------------------------------------------------- 1 | Abuse028_x264_i3d.npy 2 | Abuse030_x264_i3d.npy 3 | Arrest001_x264_i3d.npy 4 | Arrest007_x264_i3d.npy 5 | Arrest024_x264_i3d.npy 6 | Arrest030_x264_i3d.npy 7 | Arrest039_x264_i3d.npy 8 | Arson007_x264_i3d.npy 9 | Arson009_x264_i3d.npy 10 | Arson010_x264_i3d.npy 11 | Arson011_x264_i3d.npy 12 | Arson016_x264_i3d.npy 13 | Arson018_x264_i3d.npy 14 | Arson022_x264_i3d.npy 15 | Arson035_x264_i3d.npy 16 | Arson041_x264_i3d.npy 17 | Assault006_x264_i3d.npy 18 | Assault010_x264_i3d.npy 19 | Assault011_x264_i3d.npy 20 | Burglary005_x264_i3d.npy 21 | Burglary017_x264_i3d.npy 22 | Burglary018_x264_i3d.npy 23 | Burglary021_x264_i3d.npy 24 | Burglary024_x264_i3d.npy 25 | Burglary032_x264_i3d.npy 26 | Burglary033_x264_i3d.npy 27 | Burglary035_x264_i3d.npy 28 | Burglary037_x264_i3d.npy 29 | Burglary061_x264_i3d.npy 30 | Burglary076_x264_i3d.npy 31 | Burglary079_x264_i3d.npy 32 | Burglary092_x264_i3d.npy 33 | Explosion002_x264_i3d.npy 34 | Explosion004_x264_i3d.npy 35 | Explosion007_x264_i3d.npy 36 | Explosion008_x264_i3d.npy 37 | Explosion010_x264_i3d.npy 38 | Explosion011_x264_i3d.npy 39 | Explosion013_x264_i3d.npy 40 | Explosion016_x264_i3d.npy 41 | Explosion017_x264_i3d.npy 42 | Explosion020_x264_i3d.npy 43 | Explosion021_x264_i3d.npy 44 | Explosion022_x264_i3d.npy 45 | Explosion025_x264_i3d.npy 46 | Explosion027_x264_i3d.npy 47 | Explosion028_x264_i3d.npy 48 | Explosion029_x264_i3d.npy 49 | Explosion033_x264_i3d.npy 50 | Explosion035_x264_i3d.npy 51 | Explosion036_x264_i3d.npy 52 | Explosion039_x264_i3d.npy 53 | Explosion043_x264_i3d.npy 54 | Fighting003_x264_i3d.npy 55 | Fighting018_x264_i3d.npy 56 | Fighting033_x264_i3d.npy 57 | Fighting042_x264_i3d.npy 58 | Fighting047_x264_i3d.npy 59 | RoadAccidents001_x264_i3d.npy 60 | RoadAccidents002_x264_i3d.npy 61 | RoadAccidents004_x264_i3d.npy 62 | RoadAccidents009_x264_i3d.npy 63 | RoadAccidents010_x264_i3d.npy 64 | RoadAccidents011_x264_i3d.npy 65 | RoadAccidents012_x264_i3d.npy 66 | RoadAccidents016_x264_i3d.npy 67 | RoadAccidents017_x264_i3d.npy 68 | RoadAccidents019_x264_i3d.npy 69 | RoadAccidents020_x264_i3d.npy 70 | RoadAccidents021_x264_i3d.npy 71 | RoadAccidents022_x264_i3d.npy 72 | RoadAccidents121_x264_i3d.npy 73 | RoadAccidents122_x264_i3d.npy 74 | RoadAccidents123_x264_i3d.npy 75 | RoadAccidents124_x264_i3d.npy 76 | RoadAccidents125_x264_i3d.npy 77 | RoadAccidents127_x264_i3d.npy 78 | RoadAccidents128_x264_i3d.npy 79 | RoadAccidents131_x264_i3d.npy 80 | RoadAccidents132_x264_i3d.npy 81 | RoadAccidents133_x264_i3d.npy 82 | Robbery048_x264_i3d.npy 83 | Robbery050_x264_i3d.npy 84 | Robbery102_x264_i3d.npy 85 | Robbery106_x264_i3d.npy 86 | Robbery137_x264_i3d.npy 87 | Shooting002_x264_i3d.npy 88 | Shooting004_x264_i3d.npy 89 | Shooting007_x264_i3d.npy 90 | Shooting008_x264_i3d.npy 91 | Shooting010_x264_i3d.npy 92 | Shooting011_x264_i3d.npy 93 | Shooting013_x264_i3d.npy 94 | Shooting015_x264_i3d.npy 95 | Shooting018_x264_i3d.npy 96 | Shooting019_x264_i3d.npy 97 | Shooting021_x264_i3d.npy 98 | Shooting022_x264_i3d.npy 99 | Shooting024_x264_i3d.npy 100 | Shooting026_x264_i3d.npy 101 | Shooting028_x264_i3d.npy 102 | Shooting032_x264_i3d.npy 103 | Shooting033_x264_i3d.npy 104 | Shooting034_x264_i3d.npy 105 | Shooting037_x264_i3d.npy 106 | Shooting043_x264_i3d.npy 107 | Shooting046_x264_i3d.npy 108 | Shooting047_x264_i3d.npy 109 | Shooting048_x264_i3d.npy 110 | Shoplifting001_x264_i3d.npy 111 | Shoplifting004_x264_i3d.npy 112 | Shoplifting005_x264_i3d.npy 113 | Shoplifting007_x264_i3d.npy 114 | Shoplifting010_x264_i3d.npy 115 | Shoplifting015_x264_i3d.npy 116 | Shoplifting016_x264_i3d.npy 117 | Shoplifting017_x264_i3d.npy 118 | Shoplifting020_x264_i3d.npy 119 | Shoplifting021_x264_i3d.npy 120 | Shoplifting022_x264_i3d.npy 121 | Shoplifting027_x264_i3d.npy 122 | Shoplifting028_x264_i3d.npy 123 | Shoplifting029_x264_i3d.npy 124 | Shoplifting031_x264_i3d.npy 125 | Shoplifting033_x264_i3d.npy 126 | Shoplifting034_x264_i3d.npy 127 | Shoplifting037_x264_i3d.npy 128 | Shoplifting039_x264_i3d.npy 129 | Shoplifting044_x264_i3d.npy 130 | Shoplifting049_x264_i3d.npy 131 | Stealing019_x264_i3d.npy 132 | Stealing036_x264_i3d.npy 133 | Stealing058_x264_i3d.npy 134 | Stealing062_x264_i3d.npy 135 | Stealing079_x264_i3d.npy 136 | Vandalism007_x264_i3d.npy 137 | Vandalism015_x264_i3d.npy 138 | Vandalism017_x264_i3d.npy 139 | Vandalism028_x264_i3d.npy 140 | Vandalism036_x264_i3d.npy 141 | Normal_Videos_003_x264_i3d.npy 142 | Normal_Videos_006_x264_i3d.npy 143 | Normal_Videos_010_x264_i3d.npy 144 | Normal_Videos_014_x264_i3d.npy 145 | Normal_Videos_015_x264_i3d.npy 146 | Normal_Videos_018_x264_i3d.npy 147 | Normal_Videos_019_x264_i3d.npy 148 | Normal_Videos_024_x264_i3d.npy 149 | Normal_Videos_025_x264_i3d.npy 150 | Normal_Videos_027_x264_i3d.npy 151 | Normal_Videos_033_x264_i3d.npy 152 | Normal_Videos_034_x264_i3d.npy 153 | Normal_Videos_041_x264_i3d.npy 154 | Normal_Videos_042_x264_i3d.npy 155 | Normal_Videos_048_x264_i3d.npy 156 | Normal_Videos_050_x264_i3d.npy 157 | Normal_Videos_051_x264_i3d.npy 158 | Normal_Videos_056_x264_i3d.npy 159 | Normal_Videos_059_x264_i3d.npy 160 | Normal_Videos_063_x264_i3d.npy 161 | Normal_Videos_067_x264_i3d.npy 162 | Normal_Videos_070_x264_i3d.npy 163 | Normal_Videos_100_x264_i3d.npy 164 | Normal_Videos_129_x264_i3d.npy 165 | Normal_Videos_150_x264_i3d.npy 166 | Normal_Videos_168_x264_i3d.npy 167 | Normal_Videos_175_x264_i3d.npy 168 | Normal_Videos_182_x264_i3d.npy 169 | Normal_Videos_189_x264_i3d.npy 170 | Normal_Videos_196_x264_i3d.npy 171 | Normal_Videos_203_x264_i3d.npy 172 | Normal_Videos_210_x264_i3d.npy 173 | Normal_Videos_217_x264_i3d.npy 174 | Normal_Videos_224_x264_i3d.npy 175 | Normal_Videos_246_x264_i3d.npy 176 | Normal_Videos_247_x264_i3d.npy 177 | Normal_Videos_248_x264_i3d.npy 178 | Normal_Videos_251_x264_i3d.npy 179 | Normal_Videos_289_x264_i3d.npy 180 | Normal_Videos_310_x264_i3d.npy 181 | Normal_Videos_312_x264_i3d.npy 182 | Normal_Videos_317_x264_i3d.npy 183 | Normal_Videos_345_x264_i3d.npy 184 | Normal_Videos_352_x264_i3d.npy 185 | Normal_Videos_360_x264_i3d.npy 186 | Normal_Videos_365_x264_i3d.npy 187 | Normal_Videos_401_x264_i3d.npy 188 | Normal_Videos_417_x264_i3d.npy 189 | Normal_Videos_439_x264_i3d.npy 190 | Normal_Videos_452_x264_i3d.npy 191 | Normal_Videos_453_x264_i3d.npy 192 | Normal_Videos_478_x264_i3d.npy 193 | Normal_Videos_576_x264_i3d.npy 194 | Normal_Videos_597_x264_i3d.npy 195 | Normal_Videos_603_x264_i3d.npy 196 | Normal_Videos_606_x264_i3d.npy 197 | Normal_Videos_621_x264_i3d.npy 198 | Normal_Videos_634_x264_i3d.npy 199 | Normal_Videos_641_x264_i3d.npy 200 | Normal_Videos_656_x264_i3d.npy 201 | Normal_Videos_686_x264_i3d.npy 202 | Normal_Videos_696_x264_i3d.npy 203 | Normal_Videos_702_x264_i3d.npy 204 | Normal_Videos_704_x264_i3d.npy 205 | Normal_Videos_710_x264_i3d.npy 206 | Normal_Videos_717_x264_i3d.npy 207 | Normal_Videos_722_x264_i3d.npy 208 | Normal_Videos_725_x264_i3d.npy 209 | Normal_Videos_745_x264_i3d.npy 210 | Normal_Videos_758_x264_i3d.npy 211 | Normal_Videos_778_x264_i3d.npy 212 | Normal_Videos_780_x264_i3d.npy 213 | Normal_Videos_781_x264_i3d.npy 214 | Normal_Videos_782_x264_i3d.npy 215 | Normal_Videos_783_x264_i3d.npy 216 | Normal_Videos_798_x264_i3d.npy 217 | Normal_Videos_801_x264_i3d.npy 218 | Normal_Videos_828_x264_i3d.npy 219 | Normal_Videos_831_x264_i3d.npy 220 | Normal_Videos_866_x264_i3d.npy 221 | Normal_Videos_867_x264_i3d.npy 222 | Normal_Videos_868_x264_i3d.npy 223 | Normal_Videos_869_x264_i3d.npy 224 | Normal_Videos_870_x264_i3d.npy 225 | Normal_Videos_871_x264_i3d.npy 226 | Normal_Videos_872_x264_i3d.npy 227 | Normal_Videos_873_x264_i3d.npy 228 | Normal_Videos_874_x264_i3d.npy 229 | Normal_Videos_875_x264_i3d.npy 230 | Normal_Videos_876_x264_i3d.npy 231 | Normal_Videos_877_x264_i3d.npy 232 | Normal_Videos_878_x264_i3d.npy 233 | Normal_Videos_879_x264_i3d.npy 234 | Normal_Videos_880_x264_i3d.npy 235 | Normal_Videos_881_x264_i3d.npy 236 | Normal_Videos_882_x264_i3d.npy 237 | Normal_Videos_883_x264_i3d.npy 238 | Normal_Videos_884_x264_i3d.npy 239 | Normal_Videos_885_x264_i3d.npy 240 | Normal_Videos_886_x264_i3d.npy 241 | Normal_Videos_887_x264_i3d.npy 242 | Normal_Videos_888_x264_i3d.npy 243 | Normal_Videos_889_x264_i3d.npy 244 | Normal_Videos_890_x264_i3d.npy 245 | Normal_Videos_891_x264_i3d.npy 246 | Normal_Videos_892_x264_i3d.npy 247 | Normal_Videos_893_x264_i3d.npy 248 | Normal_Videos_894_x264_i3d.npy 249 | Normal_Videos_895_x264_i3d.npy 250 | Normal_Videos_896_x264_i3d.npy 251 | Normal_Videos_897_x264_i3d.npy 252 | Normal_Videos_898_x264_i3d.npy 253 | Normal_Videos_899_x264_i3d.npy 254 | Normal_Videos_900_x264_i3d.npy 255 | Normal_Videos_901_x264_i3d.npy 256 | Normal_Videos_902_x264_i3d.npy 257 | Normal_Videos_903_x264_i3d.npy 258 | Normal_Videos_904_x264_i3d.npy 259 | Normal_Videos_905_x264_i3d.npy 260 | Normal_Videos_906_x264_i3d.npy 261 | Normal_Videos_907_x264_i3d.npy 262 | Normal_Videos_908_x264_i3d.npy 263 | Normal_Videos_909_x264_i3d.npy 264 | Normal_Videos_910_x264_i3d.npy 265 | Normal_Videos_911_x264_i3d.npy 266 | Normal_Videos_912_x264_i3d.npy 267 | Normal_Videos_913_x264_i3d.npy 268 | Normal_Videos_914_x264_i3d.npy 269 | Normal_Videos_915_x264_i3d.npy 270 | Normal_Videos_923_x264_i3d.npy 271 | Normal_Videos_924_x264_i3d.npy 272 | Normal_Videos_925_x264_i3d.npy 273 | Normal_Videos_926_x264_i3d.npy 274 | Normal_Videos_927_x264_i3d.npy 275 | Normal_Videos_928_x264_i3d.npy 276 | Normal_Videos_929_x264_i3d.npy 277 | Normal_Videos_930_x264_i3d.npy 278 | Normal_Videos_931_x264_i3d.npy 279 | Normal_Videos_932_x264_i3d.npy 280 | Normal_Videos_933_x264_i3d.npy 281 | Normal_Videos_934_x264_i3d.npy 282 | Normal_Videos_935_x264_i3d.npy 283 | Normal_Videos_936_x264_i3d.npy 284 | Normal_Videos_937_x264_i3d.npy 285 | Normal_Videos_938_x264_i3d.npy 286 | Normal_Videos_939_x264_i3d.npy 287 | Normal_Videos_940_x264_i3d.npy 288 | Normal_Videos_941_x264_i3d.npy 289 | Normal_Videos_943_x264_i3d.npy 290 | Normal_Videos_944_x264_i3d.npy 291 | -------------------------------------------------------------------------------- /list/ucf-train.list: -------------------------------------------------------------------------------- 1 | Abuse001_x264_i3d.npy 2 | Abuse002_x264_i3d.npy 3 | Abuse003_x264_i3d.npy 4 | Abuse004_x264_i3d.npy 5 | Abuse005_x264_i3d.npy 6 | Abuse006_x264_i3d.npy 7 | Abuse007_x264_i3d.npy 8 | Abuse008_x264_i3d.npy 9 | Abuse009_x264_i3d.npy 10 | Abuse010_x264_i3d.npy 11 | Abuse011_x264_i3d.npy 12 | Abuse012_x264_i3d.npy 13 | Abuse013_x264_i3d.npy 14 | Abuse014_x264_i3d.npy 15 | Abuse015_x264_i3d.npy 16 | Abuse016_x264_i3d.npy 17 | Abuse017_x264_i3d.npy 18 | Abuse018_x264_i3d.npy 19 | Abuse019_x264_i3d.npy 20 | Abuse020_x264_i3d.npy 21 | Abuse021_x264_i3d.npy 22 | Abuse022_x264_i3d.npy 23 | Abuse023_x264_i3d.npy 24 | Abuse024_x264_i3d.npy 25 | Abuse025_x264_i3d.npy 26 | Abuse026_x264_i3d.npy 27 | Abuse027_x264_i3d.npy 28 | Abuse029_x264_i3d.npy 29 | Abuse031_x264_i3d.npy 30 | Abuse032_x264_i3d.npy 31 | Abuse033_x264_i3d.npy 32 | Abuse034_x264_i3d.npy 33 | Abuse035_x264_i3d.npy 34 | Abuse036_x264_i3d.npy 35 | Abuse037_x264_i3d.npy 36 | Abuse038_x264_i3d.npy 37 | Abuse039_x264_i3d.npy 38 | Abuse040_x264_i3d.npy 39 | Abuse041_x264_i3d.npy 40 | Abuse042_x264_i3d.npy 41 | Abuse043_x264_i3d.npy 42 | Abuse044_x264_i3d.npy 43 | Abuse045_x264_i3d.npy 44 | Abuse046_x264_i3d.npy 45 | Abuse047_x264_i3d.npy 46 | Abuse048_x264_i3d.npy 47 | Abuse049_x264_i3d.npy 48 | Abuse050_x264_i3d.npy 49 | Arrest002_x264_i3d.npy 50 | Arrest003_x264_i3d.npy 51 | Arrest004_x264_i3d.npy 52 | Arrest005_x264_i3d.npy 53 | Arrest006_x264_i3d.npy 54 | Arrest008_x264_i3d.npy 55 | Arrest009_x264_i3d.npy 56 | Arrest010_x264_i3d.npy 57 | Arrest011_x264_i3d.npy 58 | Arrest012_x264_i3d.npy 59 | Arrest013_x264_i3d.npy 60 | Arrest014_x264_i3d.npy 61 | Arrest015_x264_i3d.npy 62 | Arrest016_x264_i3d.npy 63 | Arrest017_x264_i3d.npy 64 | Arrest018_x264_i3d.npy 65 | Arrest019_x264_i3d.npy 66 | Arrest020_x264_i3d.npy 67 | Arrest021_x264_i3d.npy 68 | Arrest022_x264_i3d.npy 69 | Arrest023_x264_i3d.npy 70 | Arrest025_x264_i3d.npy 71 | Arrest026_x264_i3d.npy 72 | Arrest027_x264_i3d.npy 73 | Arrest028_x264_i3d.npy 74 | Arrest029_x264_i3d.npy 75 | Arrest031_x264_i3d.npy 76 | Arrest032_x264_i3d.npy 77 | Arrest033_x264_i3d.npy 78 | Arrest034_x264_i3d.npy 79 | Arrest035_x264_i3d.npy 80 | Arrest036_x264_i3d.npy 81 | Arrest037_x264_i3d.npy 82 | Arrest038_x264_i3d.npy 83 | Arrest040_x264_i3d.npy 84 | Arrest041_x264_i3d.npy 85 | Arrest042_x264_i3d.npy 86 | Arrest043_x264_i3d.npy 87 | Arrest044_x264_i3d.npy 88 | Arrest046_x264_i3d.npy 89 | Arrest047_x264_i3d.npy 90 | Arrest048_x264_i3d.npy 91 | Arrest049_x264_i3d.npy 92 | Arrest050_x264_i3d.npy 93 | Arrest051_x264_i3d.npy 94 | Arson001_x264_i3d.npy 95 | Arson002_x264_i3d.npy 96 | Arson003_x264_i3d.npy 97 | Arson005_x264_i3d.npy 98 | Arson006_x264_i3d.npy 99 | Arson008_x264_i3d.npy 100 | Arson012_x264_i3d.npy 101 | Arson013_x264_i3d.npy 102 | Arson014_x264_i3d.npy 103 | Arson015_x264_i3d.npy 104 | Arson017_x264_i3d.npy 105 | Arson019_x264_i3d.npy 106 | Arson020_x264_i3d.npy 107 | Arson021_x264_i3d.npy 108 | Arson023_x264_i3d.npy 109 | Arson024_x264_i3d.npy 110 | Arson025_x264_i3d.npy 111 | Arson026_x264_i3d.npy 112 | Arson027_x264_i3d.npy 113 | Arson028_x264_i3d.npy 114 | Arson029_x264_i3d.npy 115 | Arson030_x264_i3d.npy 116 | Arson031_x264_i3d.npy 117 | Arson032_x264_i3d.npy 118 | Arson034_x264_i3d.npy 119 | Arson036_x264_i3d.npy 120 | Arson037_x264_i3d.npy 121 | Arson038_x264_i3d.npy 122 | Arson039_x264_i3d.npy 123 | Arson040_x264_i3d.npy 124 | Arson042_x264_i3d.npy 125 | Arson044_x264_i3d.npy 126 | Arson045_x264_i3d.npy 127 | Arson046_x264_i3d.npy 128 | Arson047_x264_i3d.npy 129 | Arson048_x264_i3d.npy 130 | Arson049_x264_i3d.npy 131 | Arson050_x264_i3d.npy 132 | Arson051_x264_i3d.npy 133 | Arson052_x264_i3d.npy 134 | Arson053_x264_i3d.npy 135 | Assault001_x264_i3d.npy 136 | Assault002_x264_i3d.npy 137 | Assault003_x264_i3d.npy 138 | Assault004_x264_i3d.npy 139 | Assault005_x264_i3d.npy 140 | Assault007_x264_i3d.npy 141 | Assault008_x264_i3d.npy 142 | Assault009_x264_i3d.npy 143 | Assault012_x264_i3d.npy 144 | Assault013_x264_i3d.npy 145 | Assault014_x264_i3d.npy 146 | Assault015_x264_i3d.npy 147 | Assault016_x264_i3d.npy 148 | Assault017_x264_i3d.npy 149 | Assault018_x264_i3d.npy 150 | Assault019_x264_i3d.npy 151 | Assault020_x264_i3d.npy 152 | Assault022_x264_i3d.npy 153 | Assault023_x264_i3d.npy 154 | Assault024_x264_i3d.npy 155 | Assault025_x264_i3d.npy 156 | Assault026_x264_i3d.npy 157 | Assault027_x264_i3d.npy 158 | Assault028_x264_i3d.npy 159 | Assault029_x264_i3d.npy 160 | Assault030_x264_i3d.npy 161 | Assault031_x264_i3d.npy 162 | Assault032_x264_i3d.npy 163 | Assault033_x264_i3d.npy 164 | Assault034_x264_i3d.npy 165 | Assault035_x264_i3d.npy 166 | Assault036_x264_i3d.npy 167 | Assault037_x264_i3d.npy 168 | Assault038_x264_i3d.npy 169 | Assault039_x264_i3d.npy 170 | Assault040_x264_i3d.npy 171 | Assault041_x264_i3d.npy 172 | Assault042_x264_i3d.npy 173 | Assault044_x264_i3d.npy 174 | Assault045_x264_i3d.npy 175 | Assault046_x264_i3d.npy 176 | Assault047_x264_i3d.npy 177 | Assault048_x264_i3d.npy 178 | Assault049_x264_i3d.npy 179 | Assault050_x264_i3d.npy 180 | Assault051_x264_i3d.npy 181 | Assault052_x264_i3d.npy 182 | Burglary001_x264_i3d.npy 183 | Burglary002_x264_i3d.npy 184 | Burglary003_x264_i3d.npy 185 | Burglary004_x264_i3d.npy 186 | Burglary006_x264_i3d.npy 187 | Burglary007_x264_i3d.npy 188 | Burglary008_x264_i3d.npy 189 | Burglary009_x264_i3d.npy 190 | Burglary010_x264_i3d.npy 191 | Burglary011_x264_i3d.npy 192 | Burglary012_x264_i3d.npy 193 | Burglary013_x264_i3d.npy 194 | Burglary014_x264_i3d.npy 195 | Burglary015_x264_i3d.npy 196 | Burglary016_x264_i3d.npy 197 | Burglary019_x264_i3d.npy 198 | Burglary020_x264_i3d.npy 199 | Burglary022_x264_i3d.npy 200 | Burglary023_x264_i3d.npy 201 | Burglary025_x264_i3d.npy 202 | Burglary026_x264_i3d.npy 203 | Burglary027_x264_i3d.npy 204 | Burglary028_x264_i3d.npy 205 | Burglary029_x264_i3d.npy 206 | Burglary030_x264_i3d.npy 207 | Burglary031_x264_i3d.npy 208 | Burglary034_x264_i3d.npy 209 | Burglary036_x264_i3d.npy 210 | Burglary038_x264_i3d.npy 211 | Burglary039_x264_i3d.npy 212 | Burglary040_x264_i3d.npy 213 | Burglary041_x264_i3d.npy 214 | Burglary042_x264_i3d.npy 215 | Burglary043_x264_i3d.npy 216 | Burglary044_x264_i3d.npy 217 | Burglary045_x264_i3d.npy 218 | Burglary046_x264_i3d.npy 219 | Burglary047_x264_i3d.npy 220 | Burglary048_x264_i3d.npy 221 | Burglary049_x264_i3d.npy 222 | Burglary050_x264_i3d.npy 223 | Burglary051_x264_i3d.npy 224 | Burglary052_x264_i3d.npy 225 | Burglary053_x264_i3d.npy 226 | Burglary054_x264_i3d.npy 227 | Burglary055_x264_i3d.npy 228 | Burglary056_x264_i3d.npy 229 | Burglary057_x264_i3d.npy 230 | Burglary058_x264_i3d.npy 231 | Burglary059_x264_i3d.npy 232 | Burglary060_x264_i3d.npy 233 | Burglary062_x264_i3d.npy 234 | Burglary063_x264_i3d.npy 235 | Burglary064_x264_i3d.npy 236 | Burglary065_x264_i3d.npy 237 | Burglary066_x264_i3d.npy 238 | Burglary067_x264_i3d.npy 239 | Burglary068_x264_i3d.npy 240 | Burglary069_x264_i3d.npy 241 | Burglary070_x264_i3d.npy 242 | Burglary071_x264_i3d.npy 243 | Burglary072_x264_i3d.npy 244 | Burglary073_x264_i3d.npy 245 | Burglary074_x264_i3d.npy 246 | Burglary075_x264_i3d.npy 247 | Burglary077_x264_i3d.npy 248 | Burglary078_x264_i3d.npy 249 | Burglary080_x264_i3d.npy 250 | Burglary081_x264_i3d.npy 251 | Burglary082_x264_i3d.npy 252 | Burglary083_x264_i3d.npy 253 | Burglary084_x264_i3d.npy 254 | Burglary085_x264_i3d.npy 255 | Burglary086_x264_i3d.npy 256 | Burglary087_x264_i3d.npy 257 | Burglary088_x264_i3d.npy 258 | Burglary089_x264_i3d.npy 259 | Burglary090_x264_i3d.npy 260 | Burglary091_x264_i3d.npy 261 | Burglary093_x264_i3d.npy 262 | Burglary094_x264_i3d.npy 263 | Burglary095_x264_i3d.npy 264 | Burglary096_x264_i3d.npy 265 | Burglary097_x264_i3d.npy 266 | Burglary098_x264_i3d.npy 267 | Burglary099_x264_i3d.npy 268 | Burglary100_x264_i3d.npy 269 | Explosion001_x264_i3d.npy 270 | Explosion003_x264_i3d.npy 271 | Explosion005_x264_i3d.npy 272 | Explosion006_x264_i3d.npy 273 | Explosion009_x264_i3d.npy 274 | Explosion012_x264_i3d.npy 275 | Explosion014_x264_i3d.npy 276 | Explosion015_x264_i3d.npy 277 | Explosion018_x264_i3d.npy 278 | Explosion019_x264_i3d.npy 279 | Explosion023_x264_i3d.npy 280 | Explosion024_x264_i3d.npy 281 | Explosion026_x264_i3d.npy 282 | Explosion030_x264_i3d.npy 283 | Explosion032_x264_i3d.npy 284 | Explosion034_x264_i3d.npy 285 | Explosion037_x264_i3d.npy 286 | Explosion038_x264_i3d.npy 287 | Explosion040_x264_i3d.npy 288 | Explosion041_x264_i3d.npy 289 | Explosion042_x264_i3d.npy 290 | Explosion044_x264_i3d.npy 291 | Explosion045_x264_i3d.npy 292 | Explosion046_x264_i3d.npy 293 | Explosion047_x264_i3d.npy 294 | Explosion048_x264_i3d.npy 295 | Explosion050_x264_i3d.npy 296 | Explosion051_x264_i3d.npy 297 | Explosion052_x264_i3d.npy 298 | Fighting002_x264_i3d.npy 299 | Fighting004_x264_i3d.npy 300 | Fighting005_x264_i3d.npy 301 | Fighting006_x264_i3d.npy 302 | Fighting007_x264_i3d.npy 303 | Fighting008_x264_i3d.npy 304 | Fighting009_x264_i3d.npy 305 | Fighting010_x264_i3d.npy 306 | Fighting011_x264_i3d.npy 307 | Fighting012_x264_i3d.npy 308 | Fighting013_x264_i3d.npy 309 | Fighting014_x264_i3d.npy 310 | Fighting015_x264_i3d.npy 311 | Fighting016_x264_i3d.npy 312 | Fighting017_x264_i3d.npy 313 | Fighting019_x264_i3d.npy 314 | Fighting020_x264_i3d.npy 315 | Fighting021_x264_i3d.npy 316 | Fighting022_x264_i3d.npy 317 | Fighting023_x264_i3d.npy 318 | Fighting024_x264_i3d.npy 319 | Fighting025_x264_i3d.npy 320 | Fighting026_x264_i3d.npy 321 | Fighting027_x264_i3d.npy 322 | Fighting028_x264_i3d.npy 323 | Fighting029_x264_i3d.npy 324 | Fighting030_x264_i3d.npy 325 | Fighting031_x264_i3d.npy 326 | Fighting032_x264_i3d.npy 327 | Fighting034_x264_i3d.npy 328 | Fighting035_x264_i3d.npy 329 | Fighting036_x264_i3d.npy 330 | Fighting037_x264_i3d.npy 331 | Fighting038_x264_i3d.npy 332 | Fighting039_x264_i3d.npy 333 | Fighting040_x264_i3d.npy 334 | Fighting041_x264_i3d.npy 335 | Fighting043_x264_i3d.npy 336 | Fighting044_x264_i3d.npy 337 | Fighting045_x264_i3d.npy 338 | Fighting046_x264_i3d.npy 339 | Fighting048_x264_i3d.npy 340 | Fighting049_x264_i3d.npy 341 | Fighting050_x264_i3d.npy 342 | Fighting051_x264_i3d.npy 343 | RoadAccidents003_x264_i3d.npy 344 | RoadAccidents005_x264_i3d.npy 345 | RoadAccidents006_x264_i3d.npy 346 | RoadAccidents007_x264_i3d.npy 347 | RoadAccidents008_x264_i3d.npy 348 | RoadAccidents013_x264_i3d.npy 349 | RoadAccidents014_x264_i3d.npy 350 | RoadAccidents015_x264_i3d.npy 351 | RoadAccidents018_x264_i3d.npy 352 | RoadAccidents023_x264_i3d.npy 353 | RoadAccidents024_x264_i3d.npy 354 | RoadAccidents025_x264_i3d.npy 355 | RoadAccidents026_x264_i3d.npy 356 | RoadAccidents027_x264_i3d.npy 357 | RoadAccidents028_x264_i3d.npy 358 | RoadAccidents029_x264_i3d.npy 359 | RoadAccidents030_x264_i3d.npy 360 | RoadAccidents031_x264_i3d.npy 361 | RoadAccidents032_x264_i3d.npy 362 | RoadAccidents033_x264_i3d.npy 363 | RoadAccidents034_x264_i3d.npy 364 | RoadAccidents035_x264_i3d.npy 365 | RoadAccidents036_x264_i3d.npy 366 | RoadAccidents037_x264_i3d.npy 367 | RoadAccidents038_x264_i3d.npy 368 | RoadAccidents039_x264_i3d.npy 369 | RoadAccidents040_x264_i3d.npy 370 | RoadAccidents041_x264_i3d.npy 371 | RoadAccidents042_x264_i3d.npy 372 | RoadAccidents043_x264_i3d.npy 373 | RoadAccidents044_x264_i3d.npy 374 | RoadAccidents046_x264_i3d.npy 375 | RoadAccidents047_x264_i3d.npy 376 | RoadAccidents048_x264_i3d.npy 377 | RoadAccidents049_x264_i3d.npy 378 | RoadAccidents050_x264_i3d.npy 379 | RoadAccidents051_x264_i3d.npy 380 | RoadAccidents052_x264_i3d.npy 381 | RoadAccidents053_x264_i3d.npy 382 | RoadAccidents054_x264_i3d.npy 383 | RoadAccidents055_x264_i3d.npy 384 | RoadAccidents056_x264_i3d.npy 385 | RoadAccidents057_x264_i3d.npy 386 | RoadAccidents058_x264_i3d.npy 387 | RoadAccidents059_x264_i3d.npy 388 | RoadAccidents060_x264_i3d.npy 389 | RoadAccidents061_x264_i3d.npy 390 | RoadAccidents062_x264_i3d.npy 391 | RoadAccidents063_x264_i3d.npy 392 | RoadAccidents064_x264_i3d.npy 393 | RoadAccidents065_x264_i3d.npy 394 | RoadAccidents066_x264_i3d.npy 395 | RoadAccidents067_x264_i3d.npy 396 | RoadAccidents068_x264_i3d.npy 397 | RoadAccidents069_x264_i3d.npy 398 | RoadAccidents070_x264_i3d.npy 399 | RoadAccidents071_x264_i3d.npy 400 | RoadAccidents072_x264_i3d.npy 401 | RoadAccidents073_x264_i3d.npy 402 | RoadAccidents074_x264_i3d.npy 403 | RoadAccidents075_x264_i3d.npy 404 | RoadAccidents076_x264_i3d.npy 405 | RoadAccidents077_x264_i3d.npy 406 | RoadAccidents078_x264_i3d.npy 407 | RoadAccidents079_x264_i3d.npy 408 | RoadAccidents080_x264_i3d.npy 409 | RoadAccidents081_x264_i3d.npy 410 | RoadAccidents082_x264_i3d.npy 411 | RoadAccidents083_x264_i3d.npy 412 | RoadAccidents084_x264_i3d.npy 413 | RoadAccidents085_x264_i3d.npy 414 | RoadAccidents086_x264_i3d.npy 415 | RoadAccidents087_x264_i3d.npy 416 | RoadAccidents088_x264_i3d.npy 417 | RoadAccidents089_x264_i3d.npy 418 | RoadAccidents090_x264_i3d.npy 419 | RoadAccidents091_x264_i3d.npy 420 | RoadAccidents092_x264_i3d.npy 421 | RoadAccidents093_x264_i3d.npy 422 | RoadAccidents094_x264_i3d.npy 423 | RoadAccidents095_x264_i3d.npy 424 | RoadAccidents096_x264_i3d.npy 425 | RoadAccidents097_x264_i3d.npy 426 | RoadAccidents098_x264_i3d.npy 427 | RoadAccidents099_x264_i3d.npy 428 | RoadAccidents100_x264_i3d.npy 429 | RoadAccidents101_x264_i3d.npy 430 | RoadAccidents102_x264_i3d.npy 431 | RoadAccidents103_x264_i3d.npy 432 | RoadAccidents104_x264_i3d.npy 433 | RoadAccidents105_x264_i3d.npy 434 | RoadAccidents106_x264_i3d.npy 435 | RoadAccidents107_x264_i3d.npy 436 | RoadAccidents108_x264_i3d.npy 437 | RoadAccidents109_x264_i3d.npy 438 | RoadAccidents110_x264_i3d.npy 439 | RoadAccidents111_x264_i3d.npy 440 | RoadAccidents112_x264_i3d.npy 441 | RoadAccidents113_x264_i3d.npy 442 | RoadAccidents114_x264_i3d.npy 443 | RoadAccidents115_x264_i3d.npy 444 | RoadAccidents116_x264_i3d.npy 445 | RoadAccidents117_x264_i3d.npy 446 | RoadAccidents118_x264_i3d.npy 447 | RoadAccidents119_x264_i3d.npy 448 | RoadAccidents120_x264_i3d.npy 449 | RoadAccidents126_x264_i3d.npy 450 | RoadAccidents129_x264_i3d.npy 451 | RoadAccidents130_x264_i3d.npy 452 | RoadAccidents134_x264_i3d.npy 453 | RoadAccidents135_x264_i3d.npy 454 | RoadAccidents136_x264_i3d.npy 455 | RoadAccidents137_x264_i3d.npy 456 | RoadAccidents138_x264_i3d.npy 457 | RoadAccidents139_x264_i3d.npy 458 | RoadAccidents140_x264_i3d.npy 459 | RoadAccidents141_x264_i3d.npy 460 | RoadAccidents142_x264_i3d.npy 461 | RoadAccidents143_x264_i3d.npy 462 | RoadAccidents144_x264_i3d.npy 463 | RoadAccidents145_x264_i3d.npy 464 | RoadAccidents146_x264_i3d.npy 465 | RoadAccidents147_x264_i3d.npy 466 | RoadAccidents148_x264_i3d.npy 467 | RoadAccidents149_x264_i3d.npy 468 | RoadAccidents150_x264_i3d.npy 469 | RoadAccidents151_x264_i3d.npy 470 | Robbery001_x264_i3d.npy 471 | Robbery002_x264_i3d.npy 472 | Robbery003_x264_i3d.npy 473 | Robbery004_x264_i3d.npy 474 | Robbery005_x264_i3d.npy 475 | Robbery006_x264_i3d.npy 476 | Robbery007_x264_i3d.npy 477 | Robbery008_x264_i3d.npy 478 | Robbery009_x264_i3d.npy 479 | Robbery010_x264_i3d.npy 480 | Robbery011_x264_i3d.npy 481 | Robbery012_x264_i3d.npy 482 | Robbery013_x264_i3d.npy 483 | Robbery014_x264_i3d.npy 484 | Robbery015_x264_i3d.npy 485 | Robbery016_x264_i3d.npy 486 | Robbery017_x264_i3d.npy 487 | Robbery018_x264_i3d.npy 488 | Robbery019_x264_i3d.npy 489 | Robbery020_x264_i3d.npy 490 | Robbery021_x264_i3d.npy 491 | Robbery022_x264_i3d.npy 492 | Robbery023_x264_i3d.npy 493 | Robbery024_x264_i3d.npy 494 | Robbery025_x264_i3d.npy 495 | Robbery026_x264_i3d.npy 496 | Robbery027_x264_i3d.npy 497 | Robbery028_x264_i3d.npy 498 | Robbery029_x264_i3d.npy 499 | Robbery030_x264_i3d.npy 500 | Robbery031_x264_i3d.npy 501 | Robbery032_x264_i3d.npy 502 | Robbery033_x264_i3d.npy 503 | Robbery034_x264_i3d.npy 504 | Robbery035_x264_i3d.npy 505 | Robbery036_x264_i3d.npy 506 | Robbery037_x264_i3d.npy 507 | Robbery038_x264_i3d.npy 508 | Robbery039_x264_i3d.npy 509 | Robbery040_x264_i3d.npy 510 | Robbery041_x264_i3d.npy 511 | Robbery042_x264_i3d.npy 512 | Robbery043_x264_i3d.npy 513 | Robbery044_x264_i3d.npy 514 | Robbery045_x264_i3d.npy 515 | Robbery046_x264_i3d.npy 516 | Robbery047_x264_i3d.npy 517 | Robbery049_x264_i3d.npy 518 | Robbery051_x264_i3d.npy 519 | Robbery052_x264_i3d.npy 520 | Robbery053_x264_i3d.npy 521 | Robbery054_x264_i3d.npy 522 | Robbery055_x264_i3d.npy 523 | Robbery056_x264_i3d.npy 524 | Robbery057_x264_i3d.npy 525 | Robbery058_x264_i3d.npy 526 | Robbery059_x264_i3d.npy 527 | Robbery060_x264_i3d.npy 528 | Robbery061_x264_i3d.npy 529 | Robbery062_x264_i3d.npy 530 | Robbery063_x264_i3d.npy 531 | Robbery064_x264_i3d.npy 532 | Robbery065_x264_i3d.npy 533 | Robbery066_x264_i3d.npy 534 | Robbery067_x264_i3d.npy 535 | Robbery068_x264_i3d.npy 536 | Robbery069_x264_i3d.npy 537 | Robbery070_x264_i3d.npy 538 | Robbery071_x264_i3d.npy 539 | Robbery072_x264_i3d.npy 540 | Robbery073_x264_i3d.npy 541 | Robbery074_x264_i3d.npy 542 | Robbery075_x264_i3d.npy 543 | Robbery076_x264_i3d.npy 544 | Robbery077_x264_i3d.npy 545 | Robbery078_x264_i3d.npy 546 | Robbery079_x264_i3d.npy 547 | Robbery080_x264_i3d.npy 548 | Robbery081_x264_i3d.npy 549 | Robbery082_x264_i3d.npy 550 | Robbery083_x264_i3d.npy 551 | Robbery084_x264_i3d.npy 552 | Robbery085_x264_i3d.npy 553 | Robbery086_x264_i3d.npy 554 | Robbery087_x264_i3d.npy 555 | Robbery088_x264_i3d.npy 556 | Robbery089_x264_i3d.npy 557 | Robbery090_x264_i3d.npy 558 | Robbery091_x264_i3d.npy 559 | Robbery092_x264_i3d.npy 560 | Robbery093_x264_i3d.npy 561 | Robbery094_x264_i3d.npy 562 | Robbery095_x264_i3d.npy 563 | Robbery096_x264_i3d.npy 564 | Robbery097_x264_i3d.npy 565 | Robbery098_x264_i3d.npy 566 | Robbery099_x264_i3d.npy 567 | Robbery100_x264_i3d.npy 568 | Robbery101_x264_i3d.npy 569 | Robbery103_x264_i3d.npy 570 | Robbery104_x264_i3d.npy 571 | Robbery105_x264_i3d.npy 572 | Robbery107_x264_i3d.npy 573 | Robbery108_x264_i3d.npy 574 | Robbery109_x264_i3d.npy 575 | Robbery110_x264_i3d.npy 576 | Robbery111_x264_i3d.npy 577 | Robbery112_x264_i3d.npy 578 | Robbery113_x264_i3d.npy 579 | Robbery114_x264_i3d.npy 580 | Robbery115_x264_i3d.npy 581 | Robbery116_x264_i3d.npy 582 | Robbery117_x264_i3d.npy 583 | Robbery118_x264_i3d.npy 584 | Robbery119_x264_i3d.npy 585 | Robbery120_x264_i3d.npy 586 | Robbery121_x264_i3d.npy 587 | Robbery122_x264_i3d.npy 588 | Robbery123_x264_i3d.npy 589 | Robbery124_x264_i3d.npy 590 | Robbery125_x264_i3d.npy 591 | Robbery126_x264_i3d.npy 592 | Robbery127_x264_i3d.npy 593 | Robbery128_x264_i3d.npy 594 | Robbery129_x264_i3d.npy 595 | Robbery130_x264_i3d.npy 596 | Robbery131_x264_i3d.npy 597 | Robbery132_x264_i3d.npy 598 | Robbery133_x264_i3d.npy 599 | Robbery134_x264_i3d.npy 600 | Robbery135_x264_i3d.npy 601 | Robbery136_x264_i3d.npy 602 | Robbery138_x264_i3d.npy 603 | Robbery139_x264_i3d.npy 604 | Robbery140_x264_i3d.npy 605 | Robbery141_x264_i3d.npy 606 | Robbery142_x264_i3d.npy 607 | Robbery143_x264_i3d.npy 608 | Robbery144_x264_i3d.npy 609 | Robbery145_x264_i3d.npy 610 | Robbery146_x264_i3d.npy 611 | Robbery147_x264_i3d.npy 612 | Robbery148_x264_i3d.npy 613 | Robbery149_x264_i3d.npy 614 | Robbery150_x264_i3d.npy 615 | Shooting001_x264_i3d.npy 616 | Shooting003_x264_i3d.npy 617 | Shooting005_x264_i3d.npy 618 | Shooting006_x264_i3d.npy 619 | Shooting009_x264_i3d.npy 620 | Shooting012_x264_i3d.npy 621 | Shooting014_x264_i3d.npy 622 | Shooting017_x264_i3d.npy 623 | Shooting020_x264_i3d.npy 624 | Shooting023_x264_i3d.npy 625 | Shooting025_x264_i3d.npy 626 | Shooting027_x264_i3d.npy 627 | Shooting029_x264_i3d.npy 628 | Shooting030_x264_i3d.npy 629 | Shooting031_x264_i3d.npy 630 | Shooting036_x264_i3d.npy 631 | Shooting038_x264_i3d.npy 632 | Shooting039_x264_i3d.npy 633 | Shooting040_x264_i3d.npy 634 | Shooting041_x264_i3d.npy 635 | Shooting042_x264_i3d.npy 636 | Shooting044_x264_i3d.npy 637 | Shooting050_x264_i3d.npy 638 | Shooting051_x264_i3d.npy 639 | Shooting052_x264_i3d.npy 640 | Shooting053_x264_i3d.npy 641 | Shooting054_x264_i3d.npy 642 | Shoplifting003_x264_i3d.npy 643 | Shoplifting006_x264_i3d.npy 644 | Shoplifting008_x264_i3d.npy 645 | Shoplifting009_x264_i3d.npy 646 | Shoplifting012_x264_i3d.npy 647 | Shoplifting013_x264_i3d.npy 648 | Shoplifting014_x264_i3d.npy 649 | Shoplifting018_x264_i3d.npy 650 | Shoplifting019_x264_i3d.npy 651 | Shoplifting024_x264_i3d.npy 652 | Shoplifting025_x264_i3d.npy 653 | Shoplifting026_x264_i3d.npy 654 | Shoplifting030_x264_i3d.npy 655 | Shoplifting032_x264_i3d.npy 656 | Shoplifting036_x264_i3d.npy 657 | Shoplifting038_x264_i3d.npy 658 | Shoplifting040_x264_i3d.npy 659 | Shoplifting041_x264_i3d.npy 660 | Shoplifting042_x264_i3d.npy 661 | Shoplifting043_x264_i3d.npy 662 | Shoplifting045_x264_i3d.npy 663 | Shoplifting047_x264_i3d.npy 664 | Shoplifting048_x264_i3d.npy 665 | Shoplifting050_x264_i3d.npy 666 | Shoplifting051_x264_i3d.npy 667 | Shoplifting052_x264_i3d.npy 668 | Shoplifting053_x264_i3d.npy 669 | Shoplifting054_x264_i3d.npy 670 | Shoplifting055_x264_i3d.npy 671 | Stealing002_x264_i3d.npy 672 | Stealing003_x264_i3d.npy 673 | Stealing004_x264_i3d.npy 674 | Stealing006_x264_i3d.npy 675 | Stealing007_x264_i3d.npy 676 | Stealing008_x264_i3d.npy 677 | Stealing009_x264_i3d.npy 678 | Stealing010_x264_i3d.npy 679 | Stealing011_x264_i3d.npy 680 | Stealing012_x264_i3d.npy 681 | Stealing013_x264_i3d.npy 682 | Stealing014_x264_i3d.npy 683 | Stealing015_x264_i3d.npy 684 | Stealing016_x264_i3d.npy 685 | Stealing017_x264_i3d.npy 686 | Stealing018_x264_i3d.npy 687 | Stealing020_x264_i3d.npy 688 | Stealing021_x264_i3d.npy 689 | Stealing022_x264_i3d.npy 690 | Stealing023_x264_i3d.npy 691 | Stealing024_x264_i3d.npy 692 | Stealing025_x264_i3d.npy 693 | Stealing026_x264_i3d.npy 694 | Stealing027_x264_i3d.npy 695 | Stealing028_x264_i3d.npy 696 | Stealing029_x264_i3d.npy 697 | Stealing030_x264_i3d.npy 698 | Stealing031_x264_i3d.npy 699 | Stealing032_x264_i3d.npy 700 | Stealing035_x264_i3d.npy 701 | Stealing037_x264_i3d.npy 702 | Stealing042_x264_i3d.npy 703 | Stealing043_x264_i3d.npy 704 | Stealing044_x264_i3d.npy 705 | Stealing045_x264_i3d.npy 706 | Stealing046_x264_i3d.npy 707 | Stealing047_x264_i3d.npy 708 | Stealing048_x264_i3d.npy 709 | Stealing049_x264_i3d.npy 710 | Stealing050_x264_i3d.npy 711 | Stealing051_x264_i3d.npy 712 | Stealing052_x264_i3d.npy 713 | Stealing053_x264_i3d.npy 714 | Stealing054_x264_i3d.npy 715 | Stealing055_x264_i3d.npy 716 | Stealing057_x264_i3d.npy 717 | Stealing059_x264_i3d.npy 718 | Stealing060_x264_i3d.npy 719 | Stealing061_x264_i3d.npy 720 | Stealing063_x264_i3d.npy 721 | Stealing065_x264_i3d.npy 722 | Stealing066_x264_i3d.npy 723 | Stealing067_x264_i3d.npy 724 | Stealing068_x264_i3d.npy 725 | Stealing069_x264_i3d.npy 726 | Stealing070_x264_i3d.npy 727 | Stealing071_x264_i3d.npy 728 | Stealing072_x264_i3d.npy 729 | Stealing073_x264_i3d.npy 730 | Stealing074_x264_i3d.npy 731 | Stealing075_x264_i3d.npy 732 | Stealing077_x264_i3d.npy 733 | Stealing078_x264_i3d.npy 734 | Stealing080_x264_i3d.npy 735 | Stealing081_x264_i3d.npy 736 | Stealing082_x264_i3d.npy 737 | Stealing083_x264_i3d.npy 738 | Stealing084_x264_i3d.npy 739 | Stealing086_x264_i3d.npy 740 | Stealing087_x264_i3d.npy 741 | Stealing088_x264_i3d.npy 742 | Stealing089_x264_i3d.npy 743 | Stealing091_x264_i3d.npy 744 | Stealing092_x264_i3d.npy 745 | Stealing093_x264_i3d.npy 746 | Stealing094_x264_i3d.npy 747 | Stealing095_x264_i3d.npy 748 | Stealing096_x264_i3d.npy 749 | Stealing097_x264_i3d.npy 750 | Stealing098_x264_i3d.npy 751 | Stealing100_x264_i3d.npy 752 | Stealing101_x264_i3d.npy 753 | Stealing102_x264_i3d.npy 754 | Stealing103_x264_i3d.npy 755 | Stealing104_x264_i3d.npy 756 | Stealing105_x264_i3d.npy 757 | Stealing106_x264_i3d.npy 758 | Stealing107_x264_i3d.npy 759 | Stealing108_x264_i3d.npy 760 | Stealing109_x264_i3d.npy 761 | Stealing110_x264_i3d.npy 762 | Stealing111_x264_i3d.npy 763 | Stealing112_x264_i3d.npy 764 | Stealing113_x264_i3d.npy 765 | Stealing114_x264_i3d.npy 766 | Vandalism001_x264_i3d.npy 767 | Vandalism002_x264_i3d.npy 768 | Vandalism003_x264_i3d.npy 769 | Vandalism004_x264_i3d.npy 770 | Vandalism005_x264_i3d.npy 771 | Vandalism006_x264_i3d.npy 772 | Vandalism008_x264_i3d.npy 773 | Vandalism009_x264_i3d.npy 774 | Vandalism010_x264_i3d.npy 775 | Vandalism011_x264_i3d.npy 776 | Vandalism012_x264_i3d.npy 777 | Vandalism013_x264_i3d.npy 778 | Vandalism014_x264_i3d.npy 779 | Vandalism016_x264_i3d.npy 780 | Vandalism018_x264_i3d.npy 781 | Vandalism019_x264_i3d.npy 782 | Vandalism020_x264_i3d.npy 783 | Vandalism021_x264_i3d.npy 784 | Vandalism022_x264_i3d.npy 785 | Vandalism023_x264_i3d.npy 786 | Vandalism024_x264_i3d.npy 787 | Vandalism025_x264_i3d.npy 788 | Vandalism026_x264_i3d.npy 789 | Vandalism027_x264_i3d.npy 790 | Vandalism029_x264_i3d.npy 791 | Vandalism030_x264_i3d.npy 792 | Vandalism031_x264_i3d.npy 793 | Vandalism032_x264_i3d.npy 794 | Vandalism033_x264_i3d.npy 795 | Vandalism034_x264_i3d.npy 796 | Vandalism035_x264_i3d.npy 797 | Vandalism037_x264_i3d.npy 798 | Vandalism038_x264_i3d.npy 799 | Vandalism039_x264_i3d.npy 800 | Vandalism040_x264_i3d.npy 801 | Vandalism041_x264_i3d.npy 802 | Vandalism042_x264_i3d.npy 803 | Vandalism043_x264_i3d.npy 804 | Vandalism044_x264_i3d.npy 805 | Vandalism045_x264_i3d.npy 806 | Vandalism046_x264_i3d.npy 807 | Vandalism047_x264_i3d.npy 808 | Vandalism048_x264_i3d.npy 809 | Vandalism049_x264_i3d.npy 810 | Vandalism050_x264_i3d.npy 811 | Normal_Videos001_x264_i3d.npy 812 | Normal_Videos002_x264_i3d.npy 813 | Normal_Videos004_x264_i3d.npy 814 | Normal_Videos005_x264_i3d.npy 815 | Normal_Videos007_x264_i3d.npy 816 | Normal_Videos008_x264_i3d.npy 817 | Normal_Videos009_x264_i3d.npy 818 | Normal_Videos011_x264_i3d.npy 819 | Normal_Videos012_x264_i3d.npy 820 | Normal_Videos013_x264_i3d.npy 821 | Normal_Videos016_x264_i3d.npy 822 | Normal_Videos017_x264_i3d.npy 823 | Normal_Videos020_x264_i3d.npy 824 | Normal_Videos021_x264_i3d.npy 825 | Normal_Videos022_x264_i3d.npy 826 | Normal_Videos023_x264_i3d.npy 827 | Normal_Videos026_x264_i3d.npy 828 | Normal_Videos028_x264_i3d.npy 829 | Normal_Videos029_x264_i3d.npy 830 | Normal_Videos030_x264_i3d.npy 831 | Normal_Videos031_x264_i3d.npy 832 | Normal_Videos032_x264_i3d.npy 833 | Normal_Videos035_x264_i3d.npy 834 | Normal_Videos036_x264_i3d.npy 835 | Normal_Videos037_x264_i3d.npy 836 | Normal_Videos038_x264_i3d.npy 837 | Normal_Videos039_x264_i3d.npy 838 | Normal_Videos040_x264_i3d.npy 839 | Normal_Videos043_x264_i3d.npy 840 | Normal_Videos044_x264_i3d.npy 841 | Normal_Videos045_x264_i3d.npy 842 | Normal_Videos046_x264_i3d.npy 843 | Normal_Videos047_x264_i3d.npy 844 | Normal_Videos049_x264_i3d.npy 845 | Normal_Videos052_x264_i3d.npy 846 | Normal_Videos053_x264_i3d.npy 847 | Normal_Videos054_x264_i3d.npy 848 | Normal_Videos055_x264_i3d.npy 849 | Normal_Videos057_x264_i3d.npy 850 | Normal_Videos058_x264_i3d.npy 851 | Normal_Videos060_x264_i3d.npy 852 | Normal_Videos061_x264_i3d.npy 853 | Normal_Videos062_x264_i3d.npy 854 | Normal_Videos064_x264_i3d.npy 855 | Normal_Videos065_x264_i3d.npy 856 | Normal_Videos066_x264_i3d.npy 857 | Normal_Videos068_x264_i3d.npy 858 | Normal_Videos069_x264_i3d.npy 859 | Normal_Videos071_x264_i3d.npy 860 | Normal_Videos072_x264_i3d.npy 861 | Normal_Videos073_x264_i3d.npy 862 | Normal_Videos074_x264_i3d.npy 863 | Normal_Videos075_x264_i3d.npy 864 | Normal_Videos076_x264_i3d.npy 865 | Normal_Videos077_x264_i3d.npy 866 | Normal_Videos078_x264_i3d.npy 867 | Normal_Videos079_x264_i3d.npy 868 | Normal_Videos080_x264_i3d.npy 869 | Normal_Videos081_x264_i3d.npy 870 | Normal_Videos082_x264_i3d.npy 871 | Normal_Videos083_x264_i3d.npy 872 | Normal_Videos084_x264_i3d.npy 873 | Normal_Videos085_x264_i3d.npy 874 | Normal_Videos086_x264_i3d.npy 875 | Normal_Videos087_x264_i3d.npy 876 | Normal_Videos088_x264_i3d.npy 877 | Normal_Videos089_x264_i3d.npy 878 | Normal_Videos090_x264_i3d.npy 879 | Normal_Videos091_x264_i3d.npy 880 | Normal_Videos092_x264_i3d.npy 881 | Normal_Videos093_x264_i3d.npy 882 | Normal_Videos094_x264_i3d.npy 883 | Normal_Videos095_x264_i3d.npy 884 | Normal_Videos096_x264_i3d.npy 885 | Normal_Videos097_x264_i3d.npy 886 | Normal_Videos098_x264_i3d.npy 887 | Normal_Videos099_x264_i3d.npy 888 | Normal_Videos101_x264_i3d.npy 889 | Normal_Videos102_x264_i3d.npy 890 | Normal_Videos103_x264_i3d.npy 891 | Normal_Videos104_x264_i3d.npy 892 | Normal_Videos105_x264_i3d.npy 893 | Normal_Videos106_x264_i3d.npy 894 | Normal_Videos107_x264_i3d.npy 895 | Normal_Videos108_x264_i3d.npy 896 | Normal_Videos109_x264_i3d.npy 897 | Normal_Videos110_x264_i3d.npy 898 | Normal_Videos111_x264_i3d.npy 899 | Normal_Videos112_x264_i3d.npy 900 | Normal_Videos113_x264_i3d.npy 901 | Normal_Videos114_x264_i3d.npy 902 | Normal_Videos115_x264_i3d.npy 903 | Normal_Videos116_x264_i3d.npy 904 | Normal_Videos117_x264_i3d.npy 905 | Normal_Videos118_x264_i3d.npy 906 | Normal_Videos119_x264_i3d.npy 907 | Normal_Videos120_x264_i3d.npy 908 | Normal_Videos121_x264_i3d.npy 909 | Normal_Videos122_x264_i3d.npy 910 | Normal_Videos123_x264_i3d.npy 911 | Normal_Videos124_x264_i3d.npy 912 | Normal_Videos125_x264_i3d.npy 913 | Normal_Videos126_x264_i3d.npy 914 | Normal_Videos127_x264_i3d.npy 915 | Normal_Videos128_x264_i3d.npy 916 | Normal_Videos130_x264_i3d.npy 917 | Normal_Videos131_x264_i3d.npy 918 | Normal_Videos132_x264_i3d.npy 919 | Normal_Videos133_x264_i3d.npy 920 | Normal_Videos134_x264_i3d.npy 921 | Normal_Videos135_x264_i3d.npy 922 | Normal_Videos136_x264_i3d.npy 923 | Normal_Videos137_x264_i3d.npy 924 | Normal_Videos138_x264_i3d.npy 925 | Normal_Videos139_x264_i3d.npy 926 | Normal_Videos140_x264_i3d.npy 927 | Normal_Videos141_x264_i3d.npy 928 | Normal_Videos142_x264_i3d.npy 929 | Normal_Videos143_x264_i3d.npy 930 | Normal_Videos144_x264_i3d.npy 931 | Normal_Videos145_x264_i3d.npy 932 | Normal_Videos146_x264_i3d.npy 933 | Normal_Videos147_x264_i3d.npy 934 | Normal_Videos148_x264_i3d.npy 935 | Normal_Videos149_x264_i3d.npy 936 | Normal_Videos151_x264_i3d.npy 937 | Normal_Videos152_x264_i3d.npy 938 | Normal_Videos153_x264_i3d.npy 939 | Normal_Videos154_x264_i3d.npy 940 | Normal_Videos155_x264_i3d.npy 941 | Normal_Videos156_x264_i3d.npy 942 | Normal_Videos157_x264_i3d.npy 943 | Normal_Videos158_x264_i3d.npy 944 | Normal_Videos159_x264_i3d.npy 945 | Normal_Videos160_x264_i3d.npy 946 | Normal_Videos161_x264_i3d.npy 947 | Normal_Videos162_x264_i3d.npy 948 | Normal_Videos163_x264_i3d.npy 949 | Normal_Videos164_x264_i3d.npy 950 | Normal_Videos165_x264_i3d.npy 951 | Normal_Videos166_x264_i3d.npy 952 | Normal_Videos167_x264_i3d.npy 953 | Normal_Videos169_x264_i3d.npy 954 | Normal_Videos170_x264_i3d.npy 955 | Normal_Videos171_x264_i3d.npy 956 | Normal_Videos172_x264_i3d.npy 957 | Normal_Videos173_x264_i3d.npy 958 | Normal_Videos174_x264_i3d.npy 959 | Normal_Videos176_x264_i3d.npy 960 | Normal_Videos177_x264_i3d.npy 961 | Normal_Videos178_x264_i3d.npy 962 | Normal_Videos179_x264_i3d.npy 963 | Normal_Videos180_x264_i3d.npy 964 | Normal_Videos181_x264_i3d.npy 965 | Normal_Videos183_x264_i3d.npy 966 | Normal_Videos184_x264_i3d.npy 967 | Normal_Videos185_x264_i3d.npy 968 | Normal_Videos186_x264_i3d.npy 969 | Normal_Videos187_x264_i3d.npy 970 | Normal_Videos188_x264_i3d.npy 971 | Normal_Videos190_x264_i3d.npy 972 | Normal_Videos191_x264_i3d.npy 973 | Normal_Videos192_x264_i3d.npy 974 | Normal_Videos193_x264_i3d.npy 975 | Normal_Videos194_x264_i3d.npy 976 | Normal_Videos195_x264_i3d.npy 977 | Normal_Videos197_x264_i3d.npy 978 | Normal_Videos198_x264_i3d.npy 979 | Normal_Videos199_x264_i3d.npy 980 | Normal_Videos200_x264_i3d.npy 981 | Normal_Videos201_x264_i3d.npy 982 | Normal_Videos202_x264_i3d.npy 983 | Normal_Videos204_x264_i3d.npy 984 | Normal_Videos205_x264_i3d.npy 985 | Normal_Videos206_x264_i3d.npy 986 | Normal_Videos207_x264_i3d.npy 987 | Normal_Videos208_x264_i3d.npy 988 | Normal_Videos209_x264_i3d.npy 989 | Normal_Videos211_x264_i3d.npy 990 | Normal_Videos212_x264_i3d.npy 991 | Normal_Videos213_x264_i3d.npy 992 | Normal_Videos214_x264_i3d.npy 993 | Normal_Videos215_x264_i3d.npy 994 | Normal_Videos216_x264_i3d.npy 995 | Normal_Videos218_x264_i3d.npy 996 | Normal_Videos219_x264_i3d.npy 997 | Normal_Videos220_x264_i3d.npy 998 | Normal_Videos221_x264_i3d.npy 999 | Normal_Videos222_x264_i3d.npy 1000 | Normal_Videos223_x264_i3d.npy 1001 | Normal_Videos225_x264_i3d.npy 1002 | Normal_Videos226_x264_i3d.npy 1003 | Normal_Videos227_x264_i3d.npy 1004 | Normal_Videos228_x264_i3d.npy 1005 | Normal_Videos229_x264_i3d.npy 1006 | Normal_Videos230_x264_i3d.npy 1007 | Normal_Videos231_x264_i3d.npy 1008 | Normal_Videos232_x264_i3d.npy 1009 | Normal_Videos233_x264_i3d.npy 1010 | Normal_Videos234_x264_i3d.npy 1011 | Normal_Videos235_x264_i3d.npy 1012 | Normal_Videos236_x264_i3d.npy 1013 | Normal_Videos237_x264_i3d.npy 1014 | Normal_Videos238_x264_i3d.npy 1015 | Normal_Videos239_x264_i3d.npy 1016 | Normal_Videos240_x264_i3d.npy 1017 | Normal_Videos241_x264_i3d.npy 1018 | Normal_Videos242_x264_i3d.npy 1019 | Normal_Videos243_x264_i3d.npy 1020 | Normal_Videos244_x264_i3d.npy 1021 | Normal_Videos245_x264_i3d.npy 1022 | Normal_Videos249_x264_i3d.npy 1023 | Normal_Videos250_x264_i3d.npy 1024 | Normal_Videos252_x264_i3d.npy 1025 | Normal_Videos253_x264_i3d.npy 1026 | Normal_Videos254_x264_i3d.npy 1027 | Normal_Videos255_x264_i3d.npy 1028 | Normal_Videos256_x264_i3d.npy 1029 | Normal_Videos257_x264_i3d.npy 1030 | Normal_Videos258_x264_i3d.npy 1031 | Normal_Videos259_x264_i3d.npy 1032 | Normal_Videos260_x264_i3d.npy 1033 | Normal_Videos261_x264_i3d.npy 1034 | Normal_Videos262_x264_i3d.npy 1035 | Normal_Videos263_x264_i3d.npy 1036 | Normal_Videos264_x264_i3d.npy 1037 | Normal_Videos265_x264_i3d.npy 1038 | Normal_Videos266_x264_i3d.npy 1039 | Normal_Videos267_x264_i3d.npy 1040 | Normal_Videos268_x264_i3d.npy 1041 | Normal_Videos269_x264_i3d.npy 1042 | Normal_Videos270_x264_i3d.npy 1043 | Normal_Videos271_x264_i3d.npy 1044 | Normal_Videos272_x264_i3d.npy 1045 | Normal_Videos273_x264_i3d.npy 1046 | Normal_Videos274_x264_i3d.npy 1047 | Normal_Videos275_x264_i3d.npy 1048 | Normal_Videos276_x264_i3d.npy 1049 | Normal_Videos277_x264_i3d.npy 1050 | Normal_Videos278_x264_i3d.npy 1051 | Normal_Videos279_x264_i3d.npy 1052 | Normal_Videos280_x264_i3d.npy 1053 | Normal_Videos281_x264_i3d.npy 1054 | Normal_Videos282_x264_i3d.npy 1055 | Normal_Videos283_x264_i3d.npy 1056 | Normal_Videos284_x264_i3d.npy 1057 | Normal_Videos285_x264_i3d.npy 1058 | Normal_Videos286_x264_i3d.npy 1059 | Normal_Videos287_x264_i3d.npy 1060 | Normal_Videos288_x264_i3d.npy 1061 | Normal_Videos290_x264_i3d.npy 1062 | Normal_Videos291_x264_i3d.npy 1063 | Normal_Videos292_x264_i3d.npy 1064 | Normal_Videos293_x264_i3d.npy 1065 | Normal_Videos294_x264_i3d.npy 1066 | Normal_Videos295_x264_i3d.npy 1067 | Normal_Videos296_x264_i3d.npy 1068 | Normal_Videos297_x264_i3d.npy 1069 | Normal_Videos298_x264_i3d.npy 1070 | Normal_Videos299_x264_i3d.npy 1071 | Normal_Videos300_x264_i3d.npy 1072 | Normal_Videos301_x264_i3d.npy 1073 | Normal_Videos302_x264_i3d.npy 1074 | Normal_Videos303_x264_i3d.npy 1075 | Normal_Videos304_x264_i3d.npy 1076 | Normal_Videos305_x264_i3d.npy 1077 | Normal_Videos306_x264_i3d.npy 1078 | Normal_Videos307_x264_i3d.npy 1079 | Normal_Videos308_x264_i3d.npy 1080 | Normal_Videos309_x264_i3d.npy 1081 | Normal_Videos311_x264_i3d.npy 1082 | Normal_Videos313_x264_i3d.npy 1083 | Normal_Videos314_x264_i3d.npy 1084 | Normal_Videos315_x264_i3d.npy 1085 | Normal_Videos316_x264_i3d.npy 1086 | Normal_Videos318_x264_i3d.npy 1087 | Normal_Videos319_x264_i3d.npy 1088 | Normal_Videos320_x264_i3d.npy 1089 | Normal_Videos321_x264_i3d.npy 1090 | Normal_Videos322_x264_i3d.npy 1091 | Normal_Videos323_x264_i3d.npy 1092 | Normal_Videos324_x264_i3d.npy 1093 | Normal_Videos325_x264_i3d.npy 1094 | Normal_Videos326_x264_i3d.npy 1095 | Normal_Videos327_x264_i3d.npy 1096 | Normal_Videos328_x264_i3d.npy 1097 | Normal_Videos329_x264_i3d.npy 1098 | Normal_Videos330_x264_i3d.npy 1099 | Normal_Videos331_x264_i3d.npy 1100 | Normal_Videos332_x264_i3d.npy 1101 | Normal_Videos333_x264_i3d.npy 1102 | Normal_Videos334_x264_i3d.npy 1103 | Normal_Videos335_x264_i3d.npy 1104 | Normal_Videos336_x264_i3d.npy 1105 | Normal_Videos337_x264_i3d.npy 1106 | Normal_Videos338_x264_i3d.npy 1107 | Normal_Videos339_x264_i3d.npy 1108 | Normal_Videos340_x264_i3d.npy 1109 | Normal_Videos341_x264_i3d.npy 1110 | Normal_Videos342_x264_i3d.npy 1111 | Normal_Videos343_x264_i3d.npy 1112 | Normal_Videos344_x264_i3d.npy 1113 | Normal_Videos346_x264_i3d.npy 1114 | Normal_Videos347_x264_i3d.npy 1115 | Normal_Videos348_x264_i3d.npy 1116 | Normal_Videos349_x264_i3d.npy 1117 | Normal_Videos350_x264_i3d.npy 1118 | Normal_Videos351_x264_i3d.npy 1119 | Normal_Videos353_x264_i3d.npy 1120 | Normal_Videos354_x264_i3d.npy 1121 | Normal_Videos355_x264_i3d.npy 1122 | Normal_Videos356_x264_i3d.npy 1123 | Normal_Videos357_x264_i3d.npy 1124 | Normal_Videos358_x264_i3d.npy 1125 | Normal_Videos359_x264_i3d.npy 1126 | Normal_Videos361_x264_i3d.npy 1127 | Normal_Videos362_x264_i3d.npy 1128 | Normal_Videos363_x264_i3d.npy 1129 | Normal_Videos364_x264_i3d.npy 1130 | Normal_Videos366_x264_i3d.npy 1131 | Normal_Videos367_x264_i3d.npy 1132 | Normal_Videos368_x264_i3d.npy 1133 | Normal_Videos369_x264_i3d.npy 1134 | Normal_Videos370_x264_i3d.npy 1135 | Normal_Videos371_x264_i3d.npy 1136 | Normal_Videos372_x264_i3d.npy 1137 | Normal_Videos373_x264_i3d.npy 1138 | Normal_Videos374_x264_i3d.npy 1139 | Normal_Videos375_x264_i3d.npy 1140 | Normal_Videos376_x264_i3d.npy 1141 | Normal_Videos377_x264_i3d.npy 1142 | Normal_Videos378_x264_i3d.npy 1143 | Normal_Videos379_x264_i3d.npy 1144 | Normal_Videos380_x264_i3d.npy 1145 | Normal_Videos381_x264_i3d.npy 1146 | Normal_Videos382_x264_i3d.npy 1147 | Normal_Videos383_x264_i3d.npy 1148 | Normal_Videos384_x264_i3d.npy 1149 | Normal_Videos385_x264_i3d.npy 1150 | Normal_Videos386_x264_i3d.npy 1151 | Normal_Videos387_x264_i3d.npy 1152 | Normal_Videos388_x264_i3d.npy 1153 | Normal_Videos389_x264_i3d.npy 1154 | Normal_Videos390_x264_i3d.npy 1155 | Normal_Videos391_x264_i3d.npy 1156 | Normal_Videos392_x264_i3d.npy 1157 | Normal_Videos393_x264_i3d.npy 1158 | Normal_Videos394_x264_i3d.npy 1159 | Normal_Videos395_x264_i3d.npy 1160 | Normal_Videos396_x264_i3d.npy 1161 | Normal_Videos397_x264_i3d.npy 1162 | Normal_Videos398_x264_i3d.npy 1163 | Normal_Videos399_x264_i3d.npy 1164 | Normal_Videos400_x264_i3d.npy 1165 | Normal_Videos402_x264_i3d.npy 1166 | Normal_Videos403_x264_i3d.npy 1167 | Normal_Videos404_x264_i3d.npy 1168 | Normal_Videos405_x264_i3d.npy 1169 | Normal_Videos406_x264_i3d.npy 1170 | Normal_Videos407_x264_i3d.npy 1171 | Normal_Videos408_x264_i3d.npy 1172 | Normal_Videos409_x264_i3d.npy 1173 | Normal_Videos410_x264_i3d.npy 1174 | Normal_Videos411_x264_i3d.npy 1175 | Normal_Videos412_x264_i3d.npy 1176 | Normal_Videos413_x264_i3d.npy 1177 | Normal_Videos414_x264_i3d.npy 1178 | Normal_Videos415_x264_i3d.npy 1179 | Normal_Videos416_x264_i3d.npy 1180 | Normal_Videos418_x264_i3d.npy 1181 | Normal_Videos419_x264_i3d.npy 1182 | Normal_Videos420_x264_i3d.npy 1183 | Normal_Videos421_x264_i3d.npy 1184 | Normal_Videos422_x264_i3d.npy 1185 | Normal_Videos423_x264_i3d.npy 1186 | Normal_Videos424_x264_i3d.npy 1187 | Normal_Videos425_x264_i3d.npy 1188 | Normal_Videos426_x264_i3d.npy 1189 | Normal_Videos427_x264_i3d.npy 1190 | Normal_Videos428_x264_i3d.npy 1191 | Normal_Videos429_x264_i3d.npy 1192 | Normal_Videos430_x264_i3d.npy 1193 | Normal_Videos431_x264_i3d.npy 1194 | Normal_Videos432_x264_i3d.npy 1195 | Normal_Videos433_x264_i3d.npy 1196 | Normal_Videos434_x264_i3d.npy 1197 | Normal_Videos435_x264_i3d.npy 1198 | Normal_Videos436_x264_i3d.npy 1199 | Normal_Videos437_x264_i3d.npy 1200 | Normal_Videos438_x264_i3d.npy 1201 | Normal_Videos440_x264_i3d.npy 1202 | Normal_Videos441_x264_i3d.npy 1203 | Normal_Videos442_x264_i3d.npy 1204 | Normal_Videos443_x264_i3d.npy 1205 | Normal_Videos444_x264_i3d.npy 1206 | Normal_Videos445_x264_i3d.npy 1207 | Normal_Videos446_x264_i3d.npy 1208 | Normal_Videos447_x264_i3d.npy 1209 | Normal_Videos448_x264_i3d.npy 1210 | Normal_Videos449_x264_i3d.npy 1211 | Normal_Videos450_x264_i3d.npy 1212 | Normal_Videos451_x264_i3d.npy 1213 | Normal_Videos454_x264_i3d.npy 1214 | Normal_Videos455_x264_i3d.npy 1215 | Normal_Videos456_x264_i3d.npy 1216 | Normal_Videos457_x264_i3d.npy 1217 | Normal_Videos458_x264_i3d.npy 1218 | Normal_Videos459_x264_i3d.npy 1219 | Normal_Videos460_x264_i3d.npy 1220 | Normal_Videos461_x264_i3d.npy 1221 | Normal_Videos462_x264_i3d.npy 1222 | Normal_Videos463_x264_i3d.npy 1223 | Normal_Videos464_x264_i3d.npy 1224 | Normal_Videos465_x264_i3d.npy 1225 | Normal_Videos466_x264_i3d.npy 1226 | Normal_Videos467_x264_i3d.npy 1227 | Normal_Videos468_x264_i3d.npy 1228 | Normal_Videos469_x264_i3d.npy 1229 | Normal_Videos470_x264_i3d.npy 1230 | Normal_Videos471_x264_i3d.npy 1231 | Normal_Videos472_x264_i3d.npy 1232 | Normal_Videos473_x264_i3d.npy 1233 | Normal_Videos474_x264_i3d.npy 1234 | Normal_Videos475_x264_i3d.npy 1235 | Normal_Videos476_x264_i3d.npy 1236 | Normal_Videos477_x264_i3d.npy 1237 | Normal_Videos479_x264_i3d.npy 1238 | Normal_Videos480_x264_i3d.npy 1239 | Normal_Videos481_x264_i3d.npy 1240 | Normal_Videos482_x264_i3d.npy 1241 | Normal_Videos483_x264_i3d.npy 1242 | Normal_Videos484_x264_i3d.npy 1243 | Normal_Videos485_x264_i3d.npy 1244 | Normal_Videos486_x264_i3d.npy 1245 | Normal_Videos487_x264_i3d.npy 1246 | Normal_Videos488_x264_i3d.npy 1247 | Normal_Videos489_x264_i3d.npy 1248 | Normal_Videos490_x264_i3d.npy 1249 | Normal_Videos491_x264_i3d.npy 1250 | Normal_Videos492_x264_i3d.npy 1251 | Normal_Videos493_x264_i3d.npy 1252 | Normal_Videos494_x264_i3d.npy 1253 | Normal_Videos495_x264_i3d.npy 1254 | Normal_Videos496_x264_i3d.npy 1255 | Normal_Videos497_x264_i3d.npy 1256 | Normal_Videos498_x264_i3d.npy 1257 | Normal_Videos499_x264_i3d.npy 1258 | Normal_Videos500_x264_i3d.npy 1259 | Normal_Videos501_x264_i3d.npy 1260 | Normal_Videos502_x264_i3d.npy 1261 | Normal_Videos503_x264_i3d.npy 1262 | Normal_Videos504_x264_i3d.npy 1263 | Normal_Videos505_x264_i3d.npy 1264 | Normal_Videos506_x264_i3d.npy 1265 | Normal_Videos507_x264_i3d.npy 1266 | Normal_Videos508_x264_i3d.npy 1267 | Normal_Videos509_x264_i3d.npy 1268 | Normal_Videos510_x264_i3d.npy 1269 | Normal_Videos511_x264_i3d.npy 1270 | Normal_Videos512_x264_i3d.npy 1271 | Normal_Videos513_x264_i3d.npy 1272 | Normal_Videos514_x264_i3d.npy 1273 | Normal_Videos515_x264_i3d.npy 1274 | Normal_Videos516_x264_i3d.npy 1275 | Normal_Videos517_x264_i3d.npy 1276 | Normal_Videos518_x264_i3d.npy 1277 | Normal_Videos519_x264_i3d.npy 1278 | Normal_Videos520_x264_i3d.npy 1279 | Normal_Videos521_x264_i3d.npy 1280 | Normal_Videos522_x264_i3d.npy 1281 | Normal_Videos523_x264_i3d.npy 1282 | Normal_Videos524_x264_i3d.npy 1283 | Normal_Videos525_x264_i3d.npy 1284 | Normal_Videos526_x264_i3d.npy 1285 | Normal_Videos527_x264_i3d.npy 1286 | Normal_Videos528_x264_i3d.npy 1287 | Normal_Videos529_x264_i3d.npy 1288 | Normal_Videos530_x264_i3d.npy 1289 | Normal_Videos531_x264_i3d.npy 1290 | Normal_Videos532_x264_i3d.npy 1291 | Normal_Videos533_x264_i3d.npy 1292 | Normal_Videos534_x264_i3d.npy 1293 | Normal_Videos535_x264_i3d.npy 1294 | Normal_Videos536_x264_i3d.npy 1295 | Normal_Videos537_x264_i3d.npy 1296 | Normal_Videos538_x264_i3d.npy 1297 | Normal_Videos539_x264_i3d.npy 1298 | Normal_Videos540_x264_i3d.npy 1299 | Normal_Videos541_x264_i3d.npy 1300 | Normal_Videos542_x264_i3d.npy 1301 | Normal_Videos543_x264_i3d.npy 1302 | Normal_Videos544_x264_i3d.npy 1303 | Normal_Videos545_x264_i3d.npy 1304 | Normal_Videos546_x264_i3d.npy 1305 | Normal_Videos547_x264_i3d.npy 1306 | Normal_Videos548_x264_i3d.npy 1307 | Normal_Videos549_x264_i3d.npy 1308 | Normal_Videos550_x264_i3d.npy 1309 | Normal_Videos551_x264_i3d.npy 1310 | Normal_Videos552_x264_i3d.npy 1311 | Normal_Videos553_x264_i3d.npy 1312 | Normal_Videos554_x264_i3d.npy 1313 | Normal_Videos555_x264_i3d.npy 1314 | Normal_Videos556_x264_i3d.npy 1315 | Normal_Videos557_x264_i3d.npy 1316 | Normal_Videos558_x264_i3d.npy 1317 | Normal_Videos559_x264_i3d.npy 1318 | Normal_Videos560_x264_i3d.npy 1319 | Normal_Videos561_x264_i3d.npy 1320 | Normal_Videos562_x264_i3d.npy 1321 | Normal_Videos563_x264_i3d.npy 1322 | Normal_Videos564_x264_i3d.npy 1323 | Normal_Videos565_x264_i3d.npy 1324 | Normal_Videos566_x264_i3d.npy 1325 | Normal_Videos567_x264_i3d.npy 1326 | Normal_Videos568_x264_i3d.npy 1327 | Normal_Videos569_x264_i3d.npy 1328 | Normal_Videos570_x264_i3d.npy 1329 | Normal_Videos571_x264_i3d.npy 1330 | Normal_Videos572_x264_i3d.npy 1331 | Normal_Videos573_x264_i3d.npy 1332 | Normal_Videos574_x264_i3d.npy 1333 | Normal_Videos575_x264_i3d.npy 1334 | Normal_Videos577_x264_i3d.npy 1335 | Normal_Videos578_x264_i3d.npy 1336 | Normal_Videos579_x264_i3d.npy 1337 | Normal_Videos580_x264_i3d.npy 1338 | Normal_Videos581_x264_i3d.npy 1339 | Normal_Videos582_x264_i3d.npy 1340 | Normal_Videos583_x264_i3d.npy 1341 | Normal_Videos584_x264_i3d.npy 1342 | Normal_Videos585_x264_i3d.npy 1343 | Normal_Videos586_x264_i3d.npy 1344 | Normal_Videos587_x264_i3d.npy 1345 | Normal_Videos588_x264_i3d.npy 1346 | Normal_Videos589_x264_i3d.npy 1347 | Normal_Videos590_x264_i3d.npy 1348 | Normal_Videos591_x264_i3d.npy 1349 | Normal_Videos592_x264_i3d.npy 1350 | Normal_Videos593_x264_i3d.npy 1351 | Normal_Videos594_x264_i3d.npy 1352 | Normal_Videos595_x264_i3d.npy 1353 | Normal_Videos596_x264_i3d.npy 1354 | Normal_Videos598_x264_i3d.npy 1355 | Normal_Videos599_x264_i3d.npy 1356 | Normal_Videos600_x264_i3d.npy 1357 | Normal_Videos601_x264_i3d.npy 1358 | Normal_Videos602_x264_i3d.npy 1359 | Normal_Videos604_x264_i3d.npy 1360 | Normal_Videos605_x264_i3d.npy 1361 | Normal_Videos607_x264_i3d.npy 1362 | Normal_Videos608_x264_i3d.npy 1363 | Normal_Videos609_x264_i3d.npy 1364 | Normal_Videos610_x264_i3d.npy 1365 | Normal_Videos611_x264_i3d.npy 1366 | Normal_Videos612_x264_i3d.npy 1367 | Normal_Videos613_x264_i3d.npy 1368 | Normal_Videos614_x264_i3d.npy 1369 | Normal_Videos615_x264_i3d.npy 1370 | Normal_Videos616_x264_i3d.npy 1371 | Normal_Videos617_x264_i3d.npy 1372 | Normal_Videos618_x264_i3d.npy 1373 | Normal_Videos619_x264_i3d.npy 1374 | Normal_Videos620_x264_i3d.npy 1375 | Normal_Videos622_x264_i3d.npy 1376 | Normal_Videos623_x264_i3d.npy 1377 | Normal_Videos624_x264_i3d.npy 1378 | Normal_Videos625_x264_i3d.npy 1379 | Normal_Videos626_x264_i3d.npy 1380 | Normal_Videos627_x264_i3d.npy 1381 | Normal_Videos628_x264_i3d.npy 1382 | Normal_Videos629_x264_i3d.npy 1383 | Normal_Videos630_x264_i3d.npy 1384 | Normal_Videos631_x264_i3d.npy 1385 | Normal_Videos632_x264_i3d.npy 1386 | Normal_Videos633_x264_i3d.npy 1387 | Normal_Videos635_x264_i3d.npy 1388 | Normal_Videos636_x264_i3d.npy 1389 | Normal_Videos637_x264_i3d.npy 1390 | Normal_Videos638_x264_i3d.npy 1391 | Normal_Videos639_x264_i3d.npy 1392 | Normal_Videos640_x264_i3d.npy 1393 | Normal_Videos642_x264_i3d.npy 1394 | Normal_Videos643_x264_i3d.npy 1395 | Normal_Videos644_x264_i3d.npy 1396 | Normal_Videos645_x264_i3d.npy 1397 | Normal_Videos646_x264_i3d.npy 1398 | Normal_Videos647_x264_i3d.npy 1399 | Normal_Videos648_x264_i3d.npy 1400 | Normal_Videos649_x264_i3d.npy 1401 | Normal_Videos650_x264_i3d.npy 1402 | Normal_Videos651_x264_i3d.npy 1403 | Normal_Videos652_x264_i3d.npy 1404 | Normal_Videos653_x264_i3d.npy 1405 | Normal_Videos654_x264_i3d.npy 1406 | Normal_Videos655_x264_i3d.npy 1407 | Normal_Videos657_x264_i3d.npy 1408 | Normal_Videos658_x264_i3d.npy 1409 | Normal_Videos659_x264_i3d.npy 1410 | Normal_Videos660_x264_i3d.npy 1411 | Normal_Videos661_x264_i3d.npy 1412 | Normal_Videos662_x264_i3d.npy 1413 | Normal_Videos663_x264_i3d.npy 1414 | Normal_Videos664_x264_i3d.npy 1415 | Normal_Videos665_x264_i3d.npy 1416 | Normal_Videos666_x264_i3d.npy 1417 | Normal_Videos667_x264_i3d.npy 1418 | Normal_Videos668_x264_i3d.npy 1419 | Normal_Videos669_x264_i3d.npy 1420 | Normal_Videos670_x264_i3d.npy 1421 | Normal_Videos671_x264_i3d.npy 1422 | Normal_Videos672_x264_i3d.npy 1423 | Normal_Videos673_x264_i3d.npy 1424 | Normal_Videos674_x264_i3d.npy 1425 | Normal_Videos675_x264_i3d.npy 1426 | Normal_Videos676_x264_i3d.npy 1427 | Normal_Videos677_x264_i3d.npy 1428 | Normal_Videos678_x264_i3d.npy 1429 | Normal_Videos679_x264_i3d.npy 1430 | Normal_Videos680_x264_i3d.npy 1431 | Normal_Videos681_x264_i3d.npy 1432 | Normal_Videos682_x264_i3d.npy 1433 | Normal_Videos683_x264_i3d.npy 1434 | Normal_Videos684_x264_i3d.npy 1435 | Normal_Videos685_x264_i3d.npy 1436 | Normal_Videos687_x264_i3d.npy 1437 | Normal_Videos688_x264_i3d.npy 1438 | Normal_Videos689_x264_i3d.npy 1439 | Normal_Videos690_x264_i3d.npy 1440 | Normal_Videos691_x264_i3d.npy 1441 | Normal_Videos692_x264_i3d.npy 1442 | Normal_Videos693_x264_i3d.npy 1443 | Normal_Videos694_x264_i3d.npy 1444 | Normal_Videos695_x264_i3d.npy 1445 | Normal_Videos697_x264_i3d.npy 1446 | Normal_Videos698_x264_i3d.npy 1447 | Normal_Videos699_x264_i3d.npy 1448 | Normal_Videos700_x264_i3d.npy 1449 | Normal_Videos701_x264_i3d.npy 1450 | Normal_Videos703_x264_i3d.npy 1451 | Normal_Videos705_x264_i3d.npy 1452 | Normal_Videos706_x264_i3d.npy 1453 | Normal_Videos707_x264_i3d.npy 1454 | Normal_Videos708_x264_i3d.npy 1455 | Normal_Videos709_x264_i3d.npy 1456 | Normal_Videos711_x264_i3d.npy 1457 | Normal_Videos712_x264_i3d.npy 1458 | Normal_Videos713_x264_i3d.npy 1459 | Normal_Videos714_x264_i3d.npy 1460 | Normal_Videos715_x264_i3d.npy 1461 | Normal_Videos716_x264_i3d.npy 1462 | Normal_Videos718_x264_i3d.npy 1463 | Normal_Videos719_x264_i3d.npy 1464 | Normal_Videos720_x264_i3d.npy 1465 | Normal_Videos721_x264_i3d.npy 1466 | Normal_Videos723_x264_i3d.npy 1467 | Normal_Videos724_x264_i3d.npy 1468 | Normal_Videos726_x264_i3d.npy 1469 | Normal_Videos727_x264_i3d.npy 1470 | Normal_Videos728_x264_i3d.npy 1471 | Normal_Videos729_x264_i3d.npy 1472 | Normal_Videos730_x264_i3d.npy 1473 | Normal_Videos731_x264_i3d.npy 1474 | Normal_Videos732_x264_i3d.npy 1475 | Normal_Videos733_x264_i3d.npy 1476 | Normal_Videos734_x264_i3d.npy 1477 | Normal_Videos735_x264_i3d.npy 1478 | Normal_Videos736_x264_i3d.npy 1479 | Normal_Videos737_x264_i3d.npy 1480 | Normal_Videos738_x264_i3d.npy 1481 | Normal_Videos739_x264_i3d.npy 1482 | Normal_Videos740_x264_i3d.npy 1483 | Normal_Videos741_x264_i3d.npy 1484 | Normal_Videos742_x264_i3d.npy 1485 | Normal_Videos743_x264_i3d.npy 1486 | Normal_Videos744_x264_i3d.npy 1487 | Normal_Videos746_x264_i3d.npy 1488 | Normal_Videos747_x264_i3d.npy 1489 | Normal_Videos748_x264_i3d.npy 1490 | Normal_Videos749_x264_i3d.npy 1491 | Normal_Videos750_x264_i3d.npy 1492 | Normal_Videos751_x264_i3d.npy 1493 | Normal_Videos752_x264_i3d.npy 1494 | Normal_Videos753_x264_i3d.npy 1495 | Normal_Videos754_x264_i3d.npy 1496 | Normal_Videos755_x264_i3d.npy 1497 | Normal_Videos756_x264_i3d.npy 1498 | Normal_Videos757_x264_i3d.npy 1499 | Normal_Videos759_x264_i3d.npy 1500 | Normal_Videos760_x264_i3d.npy 1501 | Normal_Videos761_x264_i3d.npy 1502 | Normal_Videos762_x264_i3d.npy 1503 | Normal_Videos763_x264_i3d.npy 1504 | Normal_Videos764_x264_i3d.npy 1505 | Normal_Videos765_x264_i3d.npy 1506 | Normal_Videos766_x264_i3d.npy 1507 | Normal_Videos767_x264_i3d.npy 1508 | Normal_Videos768_x264_i3d.npy 1509 | Normal_Videos769_x264_i3d.npy 1510 | Normal_Videos770_x264_i3d.npy 1511 | Normal_Videos771_x264_i3d.npy 1512 | Normal_Videos772_x264_i3d.npy 1513 | Normal_Videos773_x264_i3d.npy 1514 | Normal_Videos774_x264_i3d.npy 1515 | Normal_Videos775_x264_i3d.npy 1516 | Normal_Videos776_x264_i3d.npy 1517 | Normal_Videos777_x264_i3d.npy 1518 | Normal_Videos779_x264_i3d.npy 1519 | Normal_Videos784_x264_i3d.npy 1520 | Normal_Videos785_x264_i3d.npy 1521 | Normal_Videos786_x264_i3d.npy 1522 | Normal_Videos787_x264_i3d.npy 1523 | Normal_Videos788_x264_i3d.npy 1524 | Normal_Videos789_x264_i3d.npy 1525 | Normal_Videos790_x264_i3d.npy 1526 | Normal_Videos791_x264_i3d.npy 1527 | Normal_Videos792_x264_i3d.npy 1528 | Normal_Videos793_x264_i3d.npy 1529 | Normal_Videos794_x264_i3d.npy 1530 | Normal_Videos795_x264_i3d.npy 1531 | Normal_Videos796_x264_i3d.npy 1532 | Normal_Videos797_x264_i3d.npy 1533 | Normal_Videos799_x264_i3d.npy 1534 | Normal_Videos800_x264_i3d.npy 1535 | Normal_Videos802_x264_i3d.npy 1536 | Normal_Videos803_x264_i3d.npy 1537 | Normal_Videos804_x264_i3d.npy 1538 | Normal_Videos805_x264_i3d.npy 1539 | Normal_Videos806_x264_i3d.npy 1540 | Normal_Videos807_x264_i3d.npy 1541 | Normal_Videos808_x264_i3d.npy 1542 | Normal_Videos809_x264_i3d.npy 1543 | Normal_Videos810_x264_i3d.npy 1544 | Normal_Videos811_x264_i3d.npy 1545 | Normal_Videos812_x264_i3d.npy 1546 | Normal_Videos813_x264_i3d.npy 1547 | Normal_Videos814_x264_i3d.npy 1548 | Normal_Videos815_x264_i3d.npy 1549 | Normal_Videos816_x264_i3d.npy 1550 | Normal_Videos817_x264_i3d.npy 1551 | Normal_Videos818_x264_i3d.npy 1552 | Normal_Videos819_x264_i3d.npy 1553 | Normal_Videos820_x264_i3d.npy 1554 | Normal_Videos821_x264_i3d.npy 1555 | Normal_Videos822_x264_i3d.npy 1556 | Normal_Videos823_x264_i3d.npy 1557 | Normal_Videos824_x264_i3d.npy 1558 | Normal_Videos825_x264_i3d.npy 1559 | Normal_Videos826_x264_i3d.npy 1560 | Normal_Videos827_x264_i3d.npy 1561 | Normal_Videos829_x264_i3d.npy 1562 | Normal_Videos830_x264_i3d.npy 1563 | Normal_Videos832_x264_i3d.npy 1564 | Normal_Videos833_x264_i3d.npy 1565 | Normal_Videos834_x264_i3d.npy 1566 | Normal_Videos835_x264_i3d.npy 1567 | Normal_Videos836_x264_i3d.npy 1568 | Normal_Videos837_x264_i3d.npy 1569 | Normal_Videos838_x264_i3d.npy 1570 | Normal_Videos839_x264_i3d.npy 1571 | Normal_Videos840_x264_i3d.npy 1572 | Normal_Videos841_x264_i3d.npy 1573 | Normal_Videos842_x264_i3d.npy 1574 | Normal_Videos843_x264_i3d.npy 1575 | Normal_Videos844_x264_i3d.npy 1576 | Normal_Videos845_x264_i3d.npy 1577 | Normal_Videos846_x264_i3d.npy 1578 | Normal_Videos847_x264_i3d.npy 1579 | Normal_Videos848_x264_i3d.npy 1580 | Normal_Videos849_x264_i3d.npy 1581 | Normal_Videos850_x264_i3d.npy 1582 | Normal_Videos851_x264_i3d.npy 1583 | Normal_Videos852_x264_i3d.npy 1584 | Normal_Videos853_x264_i3d.npy 1585 | Normal_Videos854_x264_i3d.npy 1586 | Normal_Videos855_x264_i3d.npy 1587 | Normal_Videos856_x264_i3d.npy 1588 | Normal_Videos857_x264_i3d.npy 1589 | Normal_Videos858_x264_i3d.npy 1590 | Normal_Videos859_x264_i3d.npy 1591 | Normal_Videos860_x264_i3d.npy 1592 | Normal_Videos861_x264_i3d.npy 1593 | Normal_Videos862_x264_i3d.npy 1594 | Normal_Videos863_x264_i3d.npy 1595 | Normal_Videos864_x264_i3d.npy 1596 | Normal_Videos865_x264_i3d.npy 1597 | Normal_Videos916_x264_i3d.npy 1598 | Normal_Videos917_x264_i3d.npy 1599 | Normal_Videos918_x264_i3d.npy 1600 | Normal_Videos919_x264_i3d.npy 1601 | Normal_Videos920_x264_i3d.npy 1602 | Normal_Videos921_x264_i3d.npy 1603 | Normal_Videos922_x264_i3d.npy 1604 | Normal_Videos942_x264_i3d.npy 1605 | Normal_Videos945_x264_i3d.npy 1606 | Normal_Videos946_x264_i3d.npy 1607 | Normal_Videos947_x264_i3d.npy 1608 | Normal_Videos948_x264_i3d.npy 1609 | Normal_Videos949_x264_i3d.npy 1610 | Normal_Videos950_x264_i3d.npy 1611 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | from torch.utils.data.dataloader import DataLoader 2 | import torch.optim as optim 3 | from model import Model 4 | from dataset import Dataset,Multi_Dataset 5 | from train import train 6 | from test import test 7 | import option 8 | from tqdm import tqdm 9 | from utils import * 10 | from config import * 11 | import misc 12 | from misc import * 13 | import samplers 14 | 15 | 16 | def dir_prepare(args): 17 | param_str = get_timestamp() 18 | logger_dir = args.save_dir+'logs/'+args.dataset+'/'+ param_str + '/' 19 | ckpt_dir = args.save_dir+'ckpts/'+args.dataset+'/' + param_str + '/' 20 | mkdir(logger_dir) 21 | mkdir(ckpt_dir) 22 | logger_path=logger_dir+args.model_name+'{}.log'.format(param_str) 23 | logger=get_logger(logger_path) 24 | logger.info('Train this model at time {}'.format(get_timestamp())) 25 | log_param(logger, args) 26 | 27 | return logger,param_str,ckpt_dir 28 | 29 | 30 | if __name__ == '__main__': 31 | args = option.parser.parse_args() 32 | misc.init_distributed_mode(args) 33 | print("git:\n {}\n".format(misc.get_sha())) 34 | 35 | config = Config(args) 36 | set_seeds(args.seed) 37 | logger, param_str, ckpt_dir = dir_prepare(args) 38 | 39 | model = Model(args, args.feature_size, args.batch_size, args.num_segments) 40 | 41 | if args.last_stage_ckpt: 42 | pretrained_state_dict = torch.load(args.last_stage_ckpt) 43 | model_state_dict = model.state_dict() 44 | model_state_dict.update(pretrained_state_dict) 45 | if args.train_part: 46 | for key, value in model.named_parameters(): 47 | if key in pretrained_state_dict.keys(): 48 | value.requires_grad = False 49 | 50 | for name, value in model.named_parameters(): 51 | if value.requires_grad: 52 | logger.info(name) 53 | device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') 54 | if args.checkpoint: 55 | model.load_state_dict(torch.load(args.checkpoint)) 56 | print('load checkpoint') 57 | model = model.cuda() 58 | if args.train_part: 59 | param_dict = [ 60 | { 61 | "params":[p for n,p in model.named_parameters() if "patch_to_clip" in n or "linear_out" in n or 'clip_to_clip' in n and p.requires_grad], 62 | "lr": config.lr[0] 63 | }, 64 | { 65 | "params": [p for n, p in model.named_parameters() if 66 | "Aggregate_patch" in n and p.requires_grad], 67 | # "lr": config.lr[0]*0.1 68 | "lr": config.lr[0] 69 | } 70 | ] 71 | optimizer = optim.Adam(param_dict,lr=config.lr[0], weight_decay=0.005) 72 | else: 73 | optimizer = optim.Adam(model.parameters(), 74 | lr=config.lr[0], weight_decay=0.005) 75 | 76 | model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu]) 77 | Dataset = Multi_Dataset if args.multi_patch_mode else Dataset 78 | 79 | norm_dataset = Dataset(args,test_mode=False,is_normal=True) 80 | abnorm_dataset = Dataset(args,test_mode=False,is_normal=False) 81 | test_dataset = Dataset(args,test_mode=True) 82 | if args.distributed: 83 | norm_sampler = samplers.DistributedSampler(norm_dataset) 84 | abnorm_sampler = samplers.DistributedSampler(abnorm_dataset) 85 | test_sampler = samplers.DistributedSampler(test_dataset,shuffle=False) 86 | train_nloader = DataLoader(norm_dataset, batch_size=args.batch_size, sampler=norm_sampler, 87 | num_workers=args.workers, 88 | drop_last=True,pin_memory=False ) 89 | train_aloader = DataLoader(abnorm_dataset, batch_size=args.batch_size, 90 | sampler=abnorm_sampler, 91 | num_workers=args.workers, 92 | drop_last=True, pin_memory=False) 93 | 94 | test_loader = DataLoader(test_dataset, batch_size=1, sampler=test_sampler, num_workers=args.workers, 95 | drop_last=False, pin_memory=False) 96 | 97 | test_info = {"epoch": [], "test_AUC": []} 98 | best_AUC = -1 99 | auc = test(test_loader, model, args, device,logger) 100 | 101 | for step in tqdm( 102 | range(1, args.max_epoch + 1), 103 | total=args.max_epoch, 104 | dynamic_ncols=True 105 | ): 106 | if step > 1 and config.lr[step - 1] != config.lr[step - 2]: 107 | for param_group in optimizer.param_groups: 108 | param_group["lr"] = config.lr[step - 1] 109 | 110 | if (step - 1) % len(train_nloader) == 0: 111 | loadern_iter = iter(train_nloader) 112 | norm_sampler.set_epoch(step) 113 | 114 | if (step - 1) % len(train_aloader) == 0: 115 | loadera_iter = iter(train_aloader) 116 | abnorm_sampler.set_epoch(step) 117 | 118 | train(args,loadern_iter, loadera_iter, model, args.batch_size, optimizer, device) 119 | 120 | test_step = 5 121 | if step % test_step == 0 and step > 50: 122 | synchronize() 123 | 124 | auc = test(test_loader, model, args, device,logger) 125 | if not is_main_process(): 126 | continue 127 | test_info["epoch"].append(step) 128 | test_info["test_AUC"].append(auc) 129 | 130 | if test_info["test_AUC"][-1] > best_AUC: 131 | best_AUC = test_info["test_AUC"][-1] 132 | torch.save(model.module.state_dict(),ckpt_dir + args.model_name + param_str + '_step{}.pkl'.format(step)) 133 | torch.save(model.module.state_dict(),ckpt_dir + 'best_auc.pkl') 134 | logger.info('epoch:{} auc\t{:.4f}'.format( test_info["epoch"][-1], test_info["test_AUC"][-1])) 135 | logger.info('best_auc\t{:.4f}'.format( best_AUC)) 136 | 137 | -------------------------------------------------------------------------------- /misc.py: -------------------------------------------------------------------------------- 1 | # ------------------------------------------------------------------------ 2 | # Deformable DETR 3 | # Copyright (c) 2020 SenseTime. All Rights Reserved. 4 | # Licensed under the Apache License, Version 2.0 [see LICENSE for details] 5 | # ------------------------------------------------------------------------ 6 | # Modified from DETR (https://github.com/facebookresearch/detr) 7 | # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved 8 | # ------------------------------------------------------------------------ 9 | 10 | """ 11 | Misc functions, including distributed helpers. 12 | 13 | Mostly copy-paste from torchvision references. 14 | """ 15 | import os 16 | import subprocess 17 | import time 18 | from collections import defaultdict, deque 19 | import datetime 20 | import pickle 21 | from typing import Optional, List 22 | 23 | import torch 24 | import torch.nn as nn 25 | import torch.distributed as dist 26 | from torch import Tensor 27 | 28 | import torchvision 29 | 30 | def synchronize(): 31 | """ 32 | Helper function to synchronize (barrier) among all processes when 33 | using distributed training 34 | """ 35 | if not dist.is_available(): 36 | return 37 | if not dist.is_initialized(): 38 | return 39 | world_size = dist.get_world_size() 40 | if world_size == 1: 41 | return 42 | dist.barrier() 43 | 44 | class SmoothedValue(object): 45 | """Track a series of values and provide access to smoothed values over a 46 | window or the global series average. 47 | """ 48 | 49 | def __init__(self, window_size=20, fmt=None): 50 | if fmt is None: 51 | fmt = "{median:.4f} ({global_avg:.4f})" 52 | self.deque = deque(maxlen=window_size) 53 | self.total = 0.0 54 | self.count = 0 55 | self.fmt = fmt 56 | 57 | def update(self, value, n=1): 58 | self.deque.append(value) 59 | self.count += n 60 | self.total += value * n 61 | 62 | def synchronize_between_processes(self): 63 | """ 64 | Warning: does not synchronize the deque! 65 | """ 66 | if not is_dist_avail_and_initialized(): 67 | return 68 | t = torch.tensor([self.count, self.total], dtype=torch.float64, device='cuda') 69 | dist.barrier() 70 | dist.all_reduce(t) 71 | t = t.tolist() 72 | self.count = int(t[0]) 73 | self.total = t[1] 74 | 75 | @property 76 | def median(self): 77 | d = torch.tensor(list(self.deque)) 78 | return d.median().item() 79 | 80 | @property 81 | def avg(self): 82 | d = torch.tensor(list(self.deque), dtype=torch.float32) 83 | return d.mean().item() 84 | 85 | @property 86 | def global_avg(self): 87 | return self.total / self.count 88 | 89 | @property 90 | def max(self): 91 | return max(self.deque) 92 | 93 | @property 94 | def value(self): 95 | return self.deque[-1] 96 | 97 | def __str__(self): 98 | return self.fmt.format( 99 | median=self.median, 100 | avg=self.avg, 101 | global_avg=self.global_avg, 102 | max=self.max, 103 | value=self.value) 104 | 105 | 106 | def all_gather(data): 107 | """ 108 | Run all_gather on arbitrary picklable data (not necessarily tensors) 109 | Args: 110 | data: any picklable object 111 | Returns: 112 | list[data]: list of data gathered from each rank 113 | """ 114 | world_size = get_world_size() 115 | if world_size == 1: 116 | return [data] 117 | 118 | # serialized to a Tensor 119 | buffer = pickle.dumps(data) 120 | storage = torch.ByteStorage.from_buffer(buffer) 121 | tensor = torch.ByteTensor(storage).to("cuda") 122 | 123 | # obtain Tensor size of each rank 124 | local_size = torch.tensor([tensor.numel()], device="cuda") 125 | size_list = [torch.tensor([0], device="cuda") for _ in range(world_size)] 126 | dist.all_gather(size_list, local_size) 127 | size_list = [int(size.item()) for size in size_list] 128 | max_size = max(size_list) 129 | 130 | # receiving Tensor from all ranks 131 | # we pad the tensor because torch all_gather does not support 132 | # gathering tensors of different shapes 133 | tensor_list = [] 134 | for _ in size_list: 135 | tensor_list.append(torch.empty((max_size,), dtype=torch.uint8, device="cuda")) 136 | if local_size != max_size: 137 | padding = torch.empty(size=(max_size - local_size,), dtype=torch.uint8, device="cuda") 138 | tensor = torch.cat((tensor, padding), dim=0) 139 | dist.all_gather(tensor_list, tensor) 140 | 141 | data_list = [] 142 | for size, tensor in zip(size_list, tensor_list): 143 | buffer = tensor.cpu().numpy().tobytes()[:size] 144 | data_list.append(pickle.loads(buffer)) 145 | 146 | return data_list 147 | 148 | 149 | def reduce_dict(input_dict, average=True): 150 | """ 151 | Args: 152 | input_dict (dict): all the values will be reduced 153 | average (bool): whether to do average or sum 154 | Reduce the values in the dictionary from all processes so that all processes 155 | have the averaged results. Returns a dict with the same fields as 156 | input_dict, after reduction. 157 | """ 158 | world_size = get_world_size() 159 | if world_size < 2: 160 | return input_dict 161 | with torch.no_grad(): 162 | names = [] 163 | values = [] 164 | # sort the keys so that they are consistent across processes 165 | for k in sorted(input_dict.keys()): 166 | names.append(k) 167 | values.append(input_dict[k]) 168 | values = torch.stack(values, dim=0) 169 | dist.all_reduce(values) 170 | if average: 171 | values /= world_size 172 | reduced_dict = {k: v for k, v in zip(names, values)} 173 | return reduced_dict 174 | 175 | 176 | class MetricLogger(object): 177 | def __init__(self, delimiter="\t"): 178 | self.meters = defaultdict(SmoothedValue) 179 | self.delimiter = delimiter 180 | 181 | def update(self, **kwargs): 182 | for k, v in kwargs.items(): 183 | if isinstance(v, torch.Tensor): 184 | v = v.item() 185 | assert isinstance(v, (float, int)) 186 | self.meters[k].update(v) 187 | 188 | def __getattr__(self, attr): 189 | if attr in self.meters: 190 | return self.meters[attr] 191 | if attr in self.__dict__: 192 | return self.__dict__[attr] 193 | raise AttributeError("'{}' object has no attribute '{}'".format( 194 | type(self).__name__, attr)) 195 | 196 | def __str__(self): 197 | loss_str = [] 198 | for name, meter in self.meters.items(): 199 | loss_str.append( 200 | "{}: {}".format(name, str(meter)) 201 | ) 202 | return self.delimiter.join(loss_str) 203 | 204 | def synchronize_between_processes(self): 205 | for meter in self.meters.values(): 206 | meter.synchronize_between_processes() 207 | 208 | def add_meter(self, name, meter): 209 | self.meters[name] = meter 210 | 211 | def log_every(self, iterable, print_freq, header=None): 212 | i = 0 213 | if not header: 214 | header = '' 215 | start_time = time.time() 216 | end = time.time() 217 | iter_time = SmoothedValue(fmt='{avg:.4f}') 218 | data_time = SmoothedValue(fmt='{avg:.4f}') 219 | space_fmt = ':' + str(len(str(len(iterable)))) + 'd' 220 | if torch.cuda.is_available(): 221 | log_msg = self.delimiter.join([ 222 | header, 223 | '[{0' + space_fmt + '}/{1}]', 224 | 'eta: {eta}', 225 | '{meters}', 226 | 'time: {time}', 227 | 'data: {data}', 228 | 'max mem: {memory:.0f}' 229 | ]) 230 | else: 231 | log_msg = self.delimiter.join([ 232 | header, 233 | '[{0' + space_fmt + '}/{1}]', 234 | 'eta: {eta}', 235 | '{meters}', 236 | 'time: {time}', 237 | 'data: {data}' 238 | ]) 239 | MB = 1024.0 * 1024.0 240 | for obj in iterable: 241 | data_time.update(time.time() - end) 242 | yield obj 243 | iter_time.update(time.time() - end) 244 | if i % print_freq == 0 or i == len(iterable) - 1: 245 | eta_seconds = iter_time.global_avg * (len(iterable) - i) 246 | eta_string = str(datetime.timedelta(seconds=int(eta_seconds))) 247 | if torch.cuda.is_available(): 248 | print(log_msg.format( 249 | i, len(iterable), eta=eta_string, 250 | meters=str(self), 251 | time=str(iter_time), data=str(data_time), 252 | memory=torch.cuda.max_memory_allocated() / MB)) 253 | else: 254 | print(log_msg.format( 255 | i, len(iterable), eta=eta_string, 256 | meters=str(self), 257 | time=str(iter_time), data=str(data_time))) 258 | i += 1 259 | end = time.time() 260 | total_time = time.time() - start_time 261 | total_time_str = str(datetime.timedelta(seconds=int(total_time))) 262 | print('{} Total time: {} ({:.4f} s / it)'.format( 263 | header, total_time_str, total_time / len(iterable))) 264 | 265 | 266 | def get_sha(): 267 | cwd = os.path.dirname(os.path.abspath(__file__)) 268 | 269 | def _run(command): 270 | return subprocess.check_output(command, cwd=cwd).decode('ascii').strip() 271 | sha = 'N/A' 272 | diff = "clean" 273 | branch = 'N/A' 274 | try: 275 | sha = _run(['git', 'rev-parse', 'HEAD']) 276 | subprocess.check_output(['git', 'diff'], cwd=cwd) 277 | diff = _run(['git', 'diff-index', 'HEAD']) 278 | diff = "has uncommited changes" if diff else "clean" 279 | branch = _run(['git', 'rev-parse', '--abbrev-ref', 'HEAD']) 280 | except Exception: 281 | pass 282 | message = f"sha: {sha}, status: {diff}, branch: {branch}" 283 | return message 284 | 285 | 286 | def collate_fn(batch): 287 | batch = list(zip(*batch)) 288 | batch[0] = nested_tensor_from_tensor_list(batch[0]) 289 | return tuple(batch) 290 | 291 | 292 | def _max_by_axis(the_list): 293 | # type: (List[List[int]]) -> List[int] 294 | maxes = the_list[0] 295 | for sublist in the_list[1:]: 296 | for index, item in enumerate(sublist): 297 | maxes[index] = max(maxes[index], item) 298 | return maxes 299 | 300 | 301 | def nested_tensor_from_tensor_list(tensor_list: List[Tensor]): 302 | # TODO make this more general 303 | if tensor_list[0].ndim == 3: 304 | # TODO make it support different-sized images 305 | max_size = _max_by_axis([list(img.shape) for img in tensor_list]) 306 | # min_size = tuple(min(s) for s in zip(*[img.shape for img in tensor_list])) 307 | batch_shape = [len(tensor_list)] + max_size 308 | b, c, h, w = batch_shape 309 | dtype = tensor_list[0].dtype 310 | device = tensor_list[0].device 311 | tensor = torch.zeros(batch_shape, dtype=dtype, device=device) 312 | mask = torch.ones((b, h, w), dtype=torch.bool, device=device) 313 | for img, pad_img, m in zip(tensor_list, tensor, mask): 314 | pad_img[: img.shape[0], : img.shape[1], : img.shape[2]].copy_(img) 315 | m[: img.shape[1], :img.shape[2]] = False 316 | else: 317 | raise ValueError('not supported') 318 | return NestedTensor(tensor, mask) 319 | 320 | 321 | class NestedTensor(object): 322 | def __init__(self, tensors, mask: Optional[Tensor]): 323 | self.tensors = tensors 324 | self.mask = mask 325 | 326 | def to(self, device, non_blocking=False): 327 | # type: (Device) -> NestedTensor # noqa 328 | cast_tensor = self.tensors.to(device, non_blocking=non_blocking) 329 | mask = self.mask 330 | if mask is not None: 331 | assert mask is not None 332 | cast_mask = mask.to(device, non_blocking=non_blocking) 333 | else: 334 | cast_mask = None 335 | return NestedTensor(cast_tensor, cast_mask) 336 | 337 | def record_stream(self, *args, **kwargs): 338 | self.tensors.record_stream(*args, **kwargs) 339 | if self.mask is not None: 340 | self.mask.record_stream(*args, **kwargs) 341 | 342 | def decompose(self): 343 | return self.tensors, self.mask 344 | 345 | def __repr__(self): 346 | return str(self.tensors) 347 | 348 | 349 | def setup_for_distributed(is_master): 350 | """ 351 | This function disables printing when not in master process 352 | """ 353 | import builtins as __builtin__ 354 | builtin_print = __builtin__.print 355 | 356 | def print(*args, **kwargs): 357 | force = kwargs.pop('force', False) 358 | if is_master or force: 359 | builtin_print(*args, **kwargs) 360 | 361 | __builtin__.print = print 362 | 363 | 364 | def is_dist_avail_and_initialized(): 365 | if not dist.is_available(): 366 | return False 367 | if not dist.is_initialized(): 368 | return False 369 | return True 370 | 371 | 372 | def get_world_size(): 373 | if not is_dist_avail_and_initialized(): 374 | return 1 375 | return dist.get_world_size() 376 | 377 | 378 | def get_rank(): 379 | if not is_dist_avail_and_initialized(): 380 | return 0 381 | return dist.get_rank() 382 | 383 | 384 | def get_local_size(): 385 | if not is_dist_avail_and_initialized(): 386 | return 1 387 | return int(os.environ['LOCAL_SIZE']) 388 | 389 | 390 | def get_local_rank(): 391 | if not is_dist_avail_and_initialized(): 392 | return 0 393 | return int(os.environ['LOCAL_RANK']) 394 | 395 | 396 | def is_main_process(): 397 | return get_rank() == 0 398 | 399 | 400 | def save_on_master(*args, **kwargs): 401 | if is_main_process(): 402 | torch.save(*args, **kwargs) 403 | 404 | 405 | def init_distributed_mode(args): 406 | if 'RANK' in os.environ and 'WORLD_SIZE' in os.environ: 407 | args.rank = int(os.environ["RANK"]) 408 | args.world_size = int(os.environ['WORLD_SIZE']) 409 | args.gpu = int(os.environ['LOCAL_RANK']) 410 | args.dist_url = 'env://' 411 | os.environ['LOCAL_SIZE'] = str(torch.cuda.device_count()) 412 | elif 'SLURM_PROCID' in os.environ: 413 | proc_id = int(os.environ['SLURM_PROCID']) 414 | ntasks = int(os.environ['SLURM_NTASKS']) 415 | node_list = os.environ['SLURM_NODELIST'] 416 | num_gpus = torch.cuda.device_count() 417 | addr = subprocess.getoutput( 418 | 'scontrol show hostname {} | head -n1'.format(node_list)) 419 | os.environ['MASTER_PORT'] = os.environ.get('MASTER_PORT', '29500') 420 | os.environ['MASTER_ADDR'] = addr 421 | os.environ['WORLD_SIZE'] = str(ntasks) 422 | os.environ['RANK'] = str(proc_id) 423 | os.environ['LOCAL_RANK'] = str(proc_id % num_gpus) 424 | os.environ['LOCAL_SIZE'] = str(num_gpus) 425 | args.dist_url = 'env://' 426 | args.world_size = ntasks 427 | args.rank = proc_id 428 | args.gpu = proc_id % num_gpus 429 | else: 430 | print('Not using distributed mode') 431 | args.distributed = False 432 | return 433 | 434 | args.distributed = True 435 | 436 | torch.cuda.set_device(args.gpu) 437 | args.dist_backend = 'nccl' 438 | print('| distributed init (rank {}): {}'.format( 439 | args.rank, args.dist_url), flush=True) 440 | torch.distributed.init_process_group(backend=args.dist_backend, init_method=args.dist_url, 441 | world_size=args.world_size, rank=args.rank) 442 | torch.distributed.barrier() 443 | setup_for_distributed(args.rank == 0) 444 | 445 | 446 | @torch.no_grad() 447 | def accuracy(output, target, topk=(1,)): 448 | """Computes the precision@k for the specified values of k""" 449 | if target.numel() == 0: 450 | return [torch.zeros([], device=output.device)] 451 | maxk = max(topk) 452 | batch_size = target.size(0) 453 | 454 | _, pred = output.topk(maxk, 1, True, True) 455 | pred = pred.t() 456 | correct = pred.eq(target.view(1, -1).expand_as(pred)) 457 | 458 | res = [] 459 | for k in topk: 460 | correct_k = correct[:k].view(-1).float().sum(0) 461 | res.append(correct_k.mul_(100.0 / batch_size)) 462 | return res 463 | 464 | 465 | def get_total_grad_norm(parameters, norm_type=2): 466 | parameters = list(filter(lambda p: p.grad is not None, parameters)) 467 | norm_type = float(norm_type) 468 | device = parameters[0].grad.device 469 | total_norm = torch.norm(torch.stack([torch.norm(p.grad.detach(), norm_type).to(device) for p in parameters]), 470 | norm_type) 471 | return total_norm 472 | 473 | def inverse_sigmoid(x, eps=1e-5): 474 | x = x.clamp(min=0, max=1) 475 | x1 = x.clamp(min=eps) 476 | x2 = (1 - x).clamp(min=eps) 477 | return torch.log(x1/x2) 478 | 479 | -------------------------------------------------------------------------------- /model.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import torch.nn.init as torch_init 4 | import torch.nn.functional as F 5 | 6 | def weight_init(m): 7 | classname = m.__class__.__name__ 8 | if classname.find('Conv') != -1 or classname.find('Linear') != -1: 9 | torch_init.xavier_uniform_(m.weight) 10 | if m.bias is not None: 11 | m.bias.data.fill_(0) 12 | 13 | class _NonLocalBlockND(nn.Module): 14 | def __init__(self, in_channels, inter_channels=None, dimension=3, sub_sample=True, bn_layer=True): 15 | super(_NonLocalBlockND, self).__init__() 16 | 17 | assert dimension in [1, 2, 3] 18 | 19 | self.dimension = dimension 20 | self.sub_sample = sub_sample 21 | 22 | self.in_channels = in_channels 23 | self.inter_channels = inter_channels 24 | 25 | if self.inter_channels is None: 26 | self.inter_channels = in_channels // 2 27 | if self.inter_channels == 0: 28 | self.inter_channels = 1 29 | 30 | if dimension == 3: 31 | conv_nd = nn.Conv3d 32 | max_pool_layer = nn.MaxPool3d(kernel_size=(1, 2, 2)) 33 | bn = nn.BatchNorm3d 34 | elif dimension == 2: 35 | conv_nd = nn.Conv2d 36 | max_pool_layer = nn.MaxPool2d(kernel_size=(2, 2)) 37 | bn = nn.BatchNorm2d 38 | else: 39 | conv_nd = nn.Conv1d 40 | max_pool_layer = nn.MaxPool1d(kernel_size=(2)) 41 | bn = nn.BatchNorm1d 42 | 43 | self.g = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels, 44 | kernel_size=1, stride=1, padding=0) 45 | 46 | if bn_layer: 47 | self.W = nn.Sequential( 48 | conv_nd(in_channels=self.inter_channels, out_channels=self.in_channels, 49 | kernel_size=1, stride=1, padding=0), 50 | bn(self.in_channels) 51 | ) 52 | nn.init.constant_(self.W[1].weight, 0) 53 | nn.init.constant_(self.W[1].bias, 0) 54 | else: 55 | self.W = conv_nd(in_channels=self.inter_channels, out_channels=self.in_channels, 56 | kernel_size=1, stride=1, padding=0) 57 | nn.init.constant_(self.W.weight, 0) 58 | nn.init.constant_(self.W.bias, 0) 59 | 60 | self.theta = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels, 61 | kernel_size=1, stride=1, padding=0) 62 | 63 | self.phi = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels, 64 | kernel_size=1, stride=1, padding=0) 65 | 66 | if sub_sample: 67 | self.g = nn.Sequential(self.g, max_pool_layer) 68 | self.phi = nn.Sequential(self.phi, max_pool_layer) 69 | 70 | def forward(self, x, return_nl_map=False): 71 | """ 72 | :param x: (b, c, t, h, w) 73 | :param return_nl_map: if True return z, nl_map, else only return z. 74 | :return: 75 | """ 76 | 77 | batch_size = x.size(0) 78 | 79 | g_x = self.g(x).view(batch_size, self.inter_channels, -1) 80 | g_x = g_x.permute(0, 2, 1) 81 | 82 | theta_x = self.theta(x).view(batch_size, self.inter_channels, -1) 83 | theta_x = theta_x.permute(0, 2, 1) 84 | phi_x = self.phi(x).view(batch_size, self.inter_channels, -1) 85 | 86 | f = torch.matmul(theta_x, phi_x) 87 | N = f.size(-1) 88 | f_div_C = f / N 89 | 90 | y = torch.matmul(f_div_C, g_x) 91 | y = y.permute(0, 2, 1).contiguous() 92 | y = y.view(batch_size, self.inter_channels, *x.size()[2:]) 93 | W_y = self.W(y) 94 | z = W_y + x 95 | 96 | if return_nl_map: 97 | return z, f_div_C 98 | return z 99 | 100 | 101 | class NONLocalBlock1D(_NonLocalBlockND): 102 | def __init__(self, in_channels, inter_channels=None, sub_sample=True, bn_layer=True): 103 | super(NONLocalBlock1D, self).__init__(in_channels, 104 | inter_channels=inter_channels, 105 | dimension=1, sub_sample=sub_sample, 106 | bn_layer=bn_layer) 107 | 108 | 109 | 110 | class Aggregate(nn.Module): 111 | def __init__(self, len_feature): 112 | super(Aggregate, self).__init__() 113 | bn = nn.BatchNorm1d 114 | self.len_feature = len_feature 115 | self.out_len = len_feature//4 116 | self.conv_1 = nn.Sequential( 117 | nn.Conv1d(in_channels=len_feature, out_channels=self.out_len, kernel_size=3, 118 | stride=1,dilation=1, padding=1), 119 | nn.ReLU(), 120 | bn(self.out_len) 121 | ) 122 | self.conv_2 = nn.Sequential( 123 | nn.Conv1d(in_channels=len_feature, out_channels=self.out_len, kernel_size=3, 124 | stride=1, dilation=2, padding=2), 125 | nn.ReLU(), 126 | bn(self.out_len) 127 | ) 128 | self.conv_3 = nn.Sequential( 129 | nn.Conv1d(in_channels=len_feature, out_channels=self.out_len, kernel_size=3, 130 | stride=1, dilation=4, padding=4), 131 | nn.ReLU(), 132 | bn(self.out_len) 133 | ) 134 | self.conv_4 = nn.Sequential( 135 | nn.Conv1d(in_channels=len_feature, out_channels=self.out_len, kernel_size=1, 136 | stride=1, padding=0, bias = False), 137 | nn.ReLU(), 138 | ) 139 | self.conv_5 = nn.Sequential( 140 | nn.Conv1d(in_channels=len_feature, out_channels=len_feature, kernel_size=3, 141 | stride=1, padding=1, bias=False), 142 | nn.ReLU(), 143 | nn.BatchNorm1d(len_feature), 144 | ) 145 | 146 | self.non_local = NONLocalBlock1D(self.out_len, sub_sample=False, bn_layer=True) 147 | 148 | 149 | 150 | 151 | def forward(self, x): 152 | # x: (B, T, F) 153 | out = x.permute(0, 2, 1) 154 | residual = out 155 | 156 | out1 = self.conv_1(out) 157 | out2 = self.conv_2(out) 158 | 159 | out3 = self.conv_3(out) 160 | out_d = torch.cat((out1, out2, out3), dim = 1) 161 | out = self.conv_4(out) 162 | out = self.non_local(out) 163 | out = torch.cat((out_d, out), dim=1) 164 | out = self.conv_5(out) # fuse all the features together 165 | out = out + residual 166 | out = out.permute(0, 2, 1) 167 | # out: (B, T, 1) 168 | 169 | return out 170 | 171 | 172 | class Classfier(nn.Module): 173 | def __init__(self,n_features): 174 | super(Classfier,self).__init__() 175 | self.fc1 = nn.Linear(n_features, 512) 176 | self.fc2 = nn.Linear(512, 128) 177 | self.fc3 = nn.Linear(128, 1) 178 | 179 | self.drop_out = nn.Dropout(0.7) 180 | self.relu = nn.ReLU() 181 | self.sigmoid = nn.Sigmoid() 182 | def forward(self,features): 183 | scores = self.relu(self.fc1(features)) 184 | scores = self.drop_out(scores) 185 | scores = self.relu(self.fc2(scores)) 186 | scores = self.drop_out(scores) 187 | scores = self.sigmoid(self.fc3(scores)) 188 | return scores 189 | 190 | 191 | 192 | class Model(nn.Module): 193 | def __init__(self,args, n_features, batch_size,num_segments): 194 | super(Model, self).__init__() 195 | self.batch_size = batch_size 196 | self.num_segments = num_segments 197 | self.dataset = args.dataset 198 | self.k_abn = self.num_segments // 10 199 | self.k_nor = self.num_segments // 10 200 | self.model_name = args.model_name 201 | 202 | if args.model_name == 'ssrl_stage1': 203 | self.Aggregate_clip = Aggregate(len_feature=n_features) 204 | 205 | elif args.model_name in ['ssrl_stage2', 'ssrl_stage3', 'ssrl_stage4']: 206 | self.multi_patch_size = args.multi_patch_size 207 | Aggregate_patch = [] 208 | patch_to_clip = [] 209 | linear_out = [] 210 | for size in self.multi_patch_size: 211 | Aggregate_patch.append(Aggregate(len_feature=2048)) 212 | patch_to_clip.append(self.build_patch_to_clip(patch_size=size)) 213 | linear_out.append(self.build_linear_out(patch_size=size)) 214 | 215 | self.Aggregate_patch = nn.ModuleList(Aggregate_patch) 216 | self.patch_to_clip = nn.ModuleList(patch_to_clip) 217 | self.linear_out = nn.ModuleList(linear_out) 218 | self.Aggregate_clip = Aggregate(len_feature=2048) 219 | 220 | self.drop_out = nn.Dropout(0.7) 221 | self.classfier = Classfier(n_features) 222 | self.relu = nn.ReLU() 223 | self.apply(weight_init) 224 | 225 | def build_patch_to_clip(self,dim_in=2048,dim_out=1024,patch_size=35): 226 | return nn.Sequential( 227 | nn.Conv2d(in_channels=dim_in, out_channels=dim_out, kernel_size=3, stride=1, padding=1 if patch_size == 23 else 0 ), 228 | nn.ReLU(), 229 | nn.BatchNorm2d(dim_out), 230 | ) 231 | def build_linear_out(self,dim_out=2048,patch_size=35): 232 | dim_in = {"23":6144,"35":3072,"47":10240} 233 | return nn.Linear(dim_in[str(patch_size)],dim_out) 234 | 235 | def forward(self, inputs): 236 | 237 | k_abn = self.k_abn 238 | k_nor = self.k_nor 239 | 240 | out = inputs 241 | bs, ncrops, t, f = out.size() 242 | 243 | if self.model_name == 'ssrl_stage1': 244 | out = out.view(-1, t, f) 245 | out = self.Aggregate_clip(out) 246 | 247 | elif self.model_name in ['ssrl_stage2', 'ssrl_stage3', 'ssrl_stage4']: 248 | input_clip = out[:,:10,:,:] 249 | patch_size_split = [(size//10)*(size%10) for size in self.multi_patch_size] 250 | input_patch = list(torch.split(out[:,10:,:,:],patch_size_split ,dim=1)) 251 | for i , size in enumerate(self.multi_patch_size): 252 | input_patch[i] = self.Aggregate_patch[i](input_patch[i].permute(0,2,1,3).reshape(bs*t,-1,f)) 253 | input_patch[i] = input_patch[i].permute(0,2,1).view(bs*t,f,size//10,size%10) 254 | input_patch[i] = self.patch_to_clip[i](input_patch[i]).reshape(bs,t,-1) 255 | input_patch[i] = self.relu(self.linear_out[i](input_patch[i])) 256 | if size == 47: 257 | input_patch[i] = self.drop_out(input_patch[i]) 258 | 259 | input_clip = input_clip + input_patch[i].unsqueeze(1) 260 | 261 | out = self.Aggregate_clip(input_clip.reshape(-1,t,f)) 262 | ncrops = 10 263 | 264 | out = self.drop_out(out) 265 | features = out 266 | scores = self.classfier(features) 267 | scores = scores.view(bs, ncrops, -1).mean(1) 268 | scores = scores.unsqueeze(dim=2) 269 | 270 | 271 | normal_features = features[0:self.batch_size*ncrops] 272 | normal_scores = scores[0:self.batch_size] 273 | 274 | abnormal_features = features[self.batch_size*ncrops:] 275 | abnormal_scores = scores[self.batch_size:] 276 | 277 | feat_magnitudes = torch.norm(features, p=2, dim=2) 278 | feat_magnitudes = feat_magnitudes.view(bs, ncrops, -1).mean(1) 279 | nfea_magnitudes = feat_magnitudes[0:self.batch_size] # normal feature magnitudes 280 | afea_magnitudes = feat_magnitudes[self.batch_size:] # abnormal feature magnitudes 281 | n_size = nfea_magnitudes.shape[0] 282 | 283 | if nfea_magnitudes.shape[0] == 1: # this is for inference, the batch size is 1 284 | afea_magnitudes = nfea_magnitudes 285 | abnormal_scores = normal_scores 286 | abnormal_features = normal_features 287 | 288 | select_idx = torch.ones_like(nfea_magnitudes).cuda() 289 | select_idx = self.drop_out(select_idx) 290 | 291 | ####### process abnormal videos -> select top3 feature magnitude ####### 292 | afea_magnitudes_drop = afea_magnitudes * select_idx 293 | idx_abn = torch.topk(afea_magnitudes_drop, k_abn, dim=1)[1] 294 | idx_abn_feat = idx_abn.unsqueeze(2).expand([-1, -1, abnormal_features.shape[2]]) 295 | 296 | abnormal_features = abnormal_features.view(n_size, ncrops, t, f) 297 | abnormal_features = abnormal_features.permute(1, 0, 2,3) 298 | 299 | total_select_abn_feature = torch.zeros(0).cuda() 300 | for abnormal_feature in abnormal_features: 301 | feat_select_abn = torch.gather(abnormal_feature, 1, idx_abn_feat) # top 3 features magnitude in abnormal bag 302 | total_select_abn_feature = torch.cat((total_select_abn_feature, feat_select_abn)) 303 | 304 | idx_abn_score = idx_abn.unsqueeze(2).expand([-1, -1, abnormal_scores.shape[2]]) 305 | score_abnormal = torch.mean(torch.gather(abnormal_scores, 1, idx_abn_score), dim=1) # top 3 scores in abnormal bag based on the top-3 magnitude 306 | 307 | 308 | ####### process normal videos -> select top3 feature magnitude ####### 309 | 310 | select_idx_normal = torch.ones_like(nfea_magnitudes).cuda() 311 | select_idx_normal = self.drop_out(select_idx_normal) 312 | nfea_magnitudes_drop = nfea_magnitudes * select_idx_normal 313 | idx_normal = torch.topk(nfea_magnitudes_drop, k_nor, dim=1)[1] 314 | idx_normal_feat = idx_normal.unsqueeze(2).expand([-1, -1, normal_features.shape[2]]) 315 | 316 | normal_features = normal_features.view(n_size, ncrops, t, f) 317 | normal_features = normal_features.permute(1, 0, 2, 3) 318 | 319 | total_select_nor_feature = torch.zeros(0).cuda() 320 | for nor_fea in normal_features: 321 | feat_select_normal = torch.gather(nor_fea, 1, idx_normal_feat) # top 3 features magnitude in normal bag (hard negative) 322 | total_select_nor_feature = torch.cat((total_select_nor_feature, feat_select_normal)) 323 | 324 | idx_normal_score = idx_normal.unsqueeze(2).expand([-1, -1, normal_scores.shape[2]]) 325 | score_normal = torch.mean(torch.gather(normal_scores, 1, idx_normal_score), dim=1) # top 3 scores in normal bag 326 | 327 | feat_select_abn = total_select_abn_feature 328 | feat_select_normal = total_select_nor_feature 329 | 330 | 331 | return score_abnormal, score_normal, feat_select_abn, feat_select_normal, feat_select_abn, feat_select_abn, scores, feat_select_abn, feat_select_abn, feat_magnitudes 332 | -------------------------------------------------------------------------------- /option.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | 3 | parser = argparse.ArgumentParser(description='SSRL') 4 | parser.add_argument('--local_rank', type = int, default = 0) 5 | parser.add_argument('--data_dir', type = str, default = './dataset/' ) 6 | parser.add_argument('--feature_size', type = int, default = 2048, help = 'size of feature (default: 2048)') 7 | parser.add_argument('--lr', type = str, default='[0.001]*150000', help = 'learning rates for steps(list form)') 8 | parser.add_argument('--batch_size', type = int, default = 4, help = 'number of instances in a batch of data') 9 | parser.add_argument('--workers', default = 2,type = int, help = 'number of workers in dataloader') 10 | parser.add_argument('--model_name', type = str,default = 'ssrl', help = 'name to save model') 11 | parser.add_argument('--pretrained_ckpt', default = None, help = 'ckpt for pretrained model') 12 | parser.add_argument('--dataset', default = 'shanghai', help = 'dataset to train on') 13 | parser.add_argument('--max_epoch', type = int, default = 150000, help = 'maximum iteration to train (default: 150000)') 14 | parser.add_argument('--seed', type = int, default = 10, help = 'seeds') 15 | parser.add_argument('--num_segments',type = int, default = 32, help = 'number of segments per video') 16 | parser.add_argument('--checkpoint', type = str, default = None, help = 'checkpoint file') 17 | parser.add_argument('--last_stage_ckpt', type = str, default = None, help = 'last training stage checkpoint file') 18 | parser.add_argument('--save_dir',type = str, default = 'output/', help = 'dir to save ckpt and logs') 19 | parser.add_argument('--patch_mode', dest = 'patch_mode', action = 'store_true') 20 | parser.add_argument('--train_part', dest = 'train_part', action = 'store_true') 21 | parser.add_argument('--multi_patch_mode', dest = 'multi_patch_mode', action = 'store_true') 22 | parser.add_argument('--multi_patch_size', type = int, nargs = '+', default = [23,35,47]) 23 | parser.set_defaults(train_part = False) 24 | parser.set_defaults(patch_mode = False) 25 | parser.set_defaults(multi_patch_mode = False) 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | tqdm 2 | scikit-learn -------------------------------------------------------------------------------- /samplers.py: -------------------------------------------------------------------------------- 1 | # ------------------------------------------------------------------------ 2 | # Deformable DETR 3 | # Copyright (c) 2020 SenseTime. All Rights Reserved. 4 | # Licensed under the Apache License, Version 2.0 [see LICENSE for details] 5 | # ------------------------------------------------------------------------ 6 | # Modified from codes in torch.utils.data.distributed 7 | # ------------------------------------------------------------------------ 8 | 9 | import os 10 | import math 11 | import torch 12 | import torch.distributed as dist 13 | from torch.utils.data.sampler import Sampler 14 | 15 | 16 | class DistributedSampler(Sampler): 17 | """Sampler that restricts data loading to a subset of the dataset. 18 | It is especially useful in conjunction with 19 | :class:`torch.nn.parallel.DistributedDataParallel`. In such case, each 20 | process can pass a DistributedSampler instance as a DataLoader sampler, 21 | and load a subset of the original dataset that is exclusive to it. 22 | .. note:: 23 | Dataset is assumed to be of constant size. 24 | Arguments: 25 | dataset: Dataset used for sampling. 26 | num_replicas (optional): Number of processes participating in 27 | distributed training. 28 | rank (optional): Rank of the current process within num_replicas. 29 | """ 30 | 31 | def __init__(self, dataset, num_replicas=None, rank=None, local_rank=None, local_size=None, shuffle=True): 32 | if num_replicas is None: 33 | if not dist.is_available(): 34 | raise RuntimeError("Requires distributed package to be available") 35 | num_replicas = dist.get_world_size() 36 | if rank is None: 37 | if not dist.is_available(): 38 | raise RuntimeError("Requires distributed package to be available") 39 | rank = dist.get_rank() 40 | self.dataset = dataset 41 | self.num_replicas = num_replicas 42 | self.rank = rank 43 | self.epoch = 0 44 | self.num_samples = int(math.ceil(len(self.dataset) * 1.0 / self.num_replicas)) 45 | self.total_size = self.num_samples * self.num_replicas 46 | self.shuffle = shuffle 47 | 48 | def __iter__(self): 49 | if self.shuffle: 50 | # deterministically shuffle based on epoch 51 | g = torch.Generator() 52 | g.manual_seed(self.epoch) 53 | indices = torch.randperm(len(self.dataset), generator=g).tolist() 54 | else: 55 | indices = torch.arange(len(self.dataset)).tolist() 56 | 57 | # add extra samples to make it evenly divisible 58 | indices += indices[: (self.total_size - len(indices))] 59 | assert len(indices) == self.total_size 60 | 61 | # subsample 62 | offset = self.num_samples * self.rank 63 | indices = indices[offset : offset + self.num_samples] 64 | assert len(indices) == self.num_samples 65 | 66 | return iter(indices) 67 | 68 | def __len__(self): 69 | return self.num_samples 70 | 71 | def set_epoch(self, epoch): 72 | self.epoch = epoch 73 | 74 | 75 | class NodeDistributedSampler(Sampler): 76 | """Sampler that restricts data loading to a subset of the dataset. 77 | It is especially useful in conjunction with 78 | :class:`torch.nn.parallel.DistributedDataParallel`. In such case, each 79 | process can pass a DistributedSampler instance as a DataLoader sampler, 80 | and load a subset of the original dataset that is exclusive to it. 81 | .. note:: 82 | Dataset is assumed to be of constant size. 83 | Arguments: 84 | dataset: Dataset used for sampling. 85 | num_replicas (optional): Number of processes participating in 86 | distributed training. 87 | rank (optional): Rank of the current process within num_replicas. 88 | """ 89 | 90 | def __init__(self, dataset, num_replicas=None, rank=None, local_rank=None, local_size=None, shuffle=True): 91 | if num_replicas is None: 92 | if not dist.is_available(): 93 | raise RuntimeError("Requires distributed package to be available") 94 | num_replicas = dist.get_world_size() 95 | if rank is None: 96 | if not dist.is_available(): 97 | raise RuntimeError("Requires distributed package to be available") 98 | rank = dist.get_rank() 99 | if local_rank is None: 100 | local_rank = int(os.environ.get('LOCAL_RANK', 0)) 101 | if local_size is None: 102 | local_size = int(os.environ.get('LOCAL_SIZE', 1)) 103 | self.dataset = dataset 104 | self.shuffle = shuffle 105 | self.num_replicas = num_replicas 106 | self.num_parts = local_size 107 | self.rank = rank 108 | self.local_rank = local_rank 109 | self.epoch = 0 110 | self.num_samples = int(math.ceil(len(self.dataset) * 1.0 / self.num_replicas)) 111 | self.total_size = self.num_samples * self.num_replicas 112 | 113 | self.total_size_parts = self.num_samples * self.num_replicas // self.num_parts 114 | 115 | def __iter__(self): 116 | if self.shuffle: 117 | # deterministically shuffle based on epoch 118 | g = torch.Generator() 119 | g.manual_seed(self.epoch) 120 | indices = torch.randperm(len(self.dataset), generator=g).tolist() 121 | else: 122 | indices = torch.arange(len(self.dataset)).tolist() 123 | indices = [i for i in indices if i % self.num_parts == self.local_rank] 124 | 125 | # add extra samples to make it evenly divisible 126 | indices += indices[:(self.total_size_parts - len(indices))] 127 | assert len(indices) == self.total_size_parts 128 | 129 | # subsample 130 | indices = indices[self.rank // self.num_parts:self.total_size_parts:self.num_replicas // self.num_parts] 131 | assert len(indices) == self.num_samples 132 | 133 | return iter(indices) 134 | 135 | def __len__(self): 136 | return self.num_samples 137 | 138 | def set_epoch(self, epoch): 139 | self.epoch = epoch 140 | -------------------------------------------------------------------------------- /scripts/train_ssrl_stage1.sh: -------------------------------------------------------------------------------- 1 | python -m torch.distributed.launch --nproc_per_node=8 main.py --dataset shanghai --lr [0.001]*150000 --max_epoch 150000 --model_name ssrl_stage1 --save_dir output/ssrl_stage1/ -------------------------------------------------------------------------------- /scripts/train_ssrl_stage2.sh: -------------------------------------------------------------------------------- 1 | python -m torch.distributed.launch --nproc_per_node=8 main.py --dataset shanghai --lr [0.001]*150000 --max_epoch 150000 --model_name ssrl_stage2 --save_dir output/ssrl_stage2/ --multi_patch_mode --train_part --last_stage_ckpt 'last_ckpts/best_auc_stage1.pkl' --multi_patch_size 23 2 | # You can save the best model trained in stage1 as 'last_ckpts/best_auc_stage1.pkl' -------------------------------------------------------------------------------- /scripts/train_ssrl_stage3.sh: -------------------------------------------------------------------------------- 1 | python -m torch.distributed.launch --nproc_per_node=8 main.py --dataset shanghai --lr [0.001]*150000 --max_epoch 150000 --model_name ssrl_stage3 --save_dir output/ssrl_stage3/ --multi_patch_mode --train_part --last_stage_ckpt 'last_ckpts/best_auc_stage2.pkl' --multi_patch_size 23 35 -------------------------------------------------------------------------------- /scripts/train_ssrl_stage4.sh: -------------------------------------------------------------------------------- 1 | python -m torch.distributed.launch --nproc_per_node=8 main.py --dataset shanghai --lr [0.001]*150000 --max_epoch 150000 --model_name ssrl_stage4 --save_dir output/ssrl_stage4/ --multi_patch_mode --train_part --last_stage_ckpt 'last_ckpts/best_auc_stage3.pkl' --multi_patch_size 23 35 47 -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | import torch 2 | from sklearn.metrics import auc, roc_curve, precision_recall_curve 3 | import numpy as np 4 | from misc import all_gather,is_main_process,get_world_size,synchronize 5 | 6 | 7 | def _accumulate_predictions_from_multiple_gpus(predictions_per_gpu): 8 | all_predictions = all_gather(predictions_per_gpu) 9 | if not is_main_process(): 10 | return 11 | # merge the list of dicts 12 | predictions = {} 13 | for p in all_predictions: 14 | predictions.update(p) 15 | # convert a dict where the key is the index in a list 16 | image_ids = list(sorted(predictions.keys())) 17 | # convert to a list 18 | predictions = [predictions[i] for i in image_ids] 19 | return predictions 20 | 21 | def test(dataloader, model, args, device,logger): 22 | with torch.no_grad(): 23 | model.eval() 24 | pred = {} 25 | for i, (input,index) in enumerate(dataloader): 26 | input = input.to(device) 27 | input = input.permute(0, 2, 1, 3) 28 | score_abnormal, score_normal, feat_select_abn, feat_select_normal, feat_abn_bottom, feat_select_normal_bottom, logits, \ 29 | scores_nor_bottom, scores_nor_abn_bag, feat_magnitudes = model(inputs=input) 30 | logits = torch.squeeze(logits, 1) 31 | logits = torch.mean(logits, 0) 32 | sig = logits 33 | pred.update({index.cpu().detach().numpy()[0]:list(sig.cpu().detach().numpy())}) 34 | torch.cuda.empty_cache() 35 | 36 | synchronize() 37 | predictions = _accumulate_predictions_from_multiple_gpus(pred) 38 | if not is_main_process(): 39 | return 40 | pred = [] 41 | for i in range(len(predictions)): 42 | pred = pred + predictions[i] 43 | 44 | if args.dataset == 'shanghai': 45 | gt = np.load('list/gt-sh.npy') 46 | else: 47 | gt = np.load('list/gt-ucf.npy') 48 | 49 | pred = np.repeat(np.array(pred), 16) 50 | 51 | fpr, tpr, threshold = roc_curve(list(gt), pred) 52 | rec_auc = auc(fpr, tpr) 53 | logger.info('[test]: auc\t{:.4f}'.format( rec_auc)) 54 | precision, recall, th = precision_recall_curve(list(gt), pred) 55 | return rec_auc 56 | 57 | -------------------------------------------------------------------------------- /train.py: -------------------------------------------------------------------------------- 1 | import torch 2 | from torch.nn import MSELoss 3 | 4 | 5 | 6 | def sparsity(arr, batch_size, lamda2): 7 | loss = torch.mean(torch.norm(arr, dim=0)) 8 | return lamda2*loss 9 | 10 | 11 | def smooth(arr, lamda1): 12 | arr2 = torch.zeros_like(arr) 13 | arr2[:-1] = arr[1:] 14 | arr2[-1] = arr[-1] 15 | 16 | loss = torch.sum((arr2-arr)**2) 17 | 18 | return lamda1*loss 19 | 20 | 21 | def l1_penalty(var): 22 | return torch.mean(torch.norm(var, dim=0)) 23 | 24 | 25 | class SigmoidMAELoss(torch.nn.Module): 26 | def __init__(self): 27 | super(SigmoidMAELoss, self).__init__() 28 | from torch.nn import Sigmoid 29 | self.__sigmoid__ = Sigmoid() 30 | self.__l1_loss__ = MSELoss() 31 | 32 | def forward(self, pred, target): 33 | return self.__l1_loss__(pred, target) 34 | 35 | 36 | class SigmoidCrossEntropyLoss(torch.nn.Module): 37 | # Implementation Reference: http://vast.uccs.edu/~adhamija/blog/Caffe%20Custom%20Layer.html 38 | def __init__(self): 39 | super(SigmoidCrossEntropyLoss, self).__init__() 40 | 41 | def forward(self, x, target): 42 | tmp = 1 + torch.exp(- torch.abs(x)) 43 | return torch.abs(torch.mean(- x * target + torch.clamp(x, min=0) + torch.log(tmp))) 44 | 45 | 46 | class RTFM_loss(torch.nn.Module): 47 | def __init__(self, alpha, margin): 48 | super(RTFM_loss, self).__init__() 49 | self.alpha = alpha 50 | self.margin = margin 51 | self.sigmoid = torch.nn.Sigmoid() 52 | self.mae_criterion = SigmoidMAELoss() 53 | self.criterion = torch.nn.BCELoss() 54 | 55 | def forward(self, score_normal, score_abnormal, nlabel, alabel, feat_n, feat_a): 56 | label = torch.cat((nlabel, alabel), 0) 57 | score_abnormal = score_abnormal 58 | score_normal = score_normal 59 | 60 | score = torch.cat((score_normal, score_abnormal), 0) 61 | score = score.squeeze() 62 | 63 | label = label.cuda() 64 | 65 | loss_cls = self.criterion(score, label) # BCE loss in the score space 66 | 67 | loss_abn = torch.abs(self.margin - torch.norm(torch.mean(feat_a, dim=1), p=2, dim=1)) 68 | 69 | loss_nor = torch.norm(torch.mean(feat_n, dim=1), p=2, dim=1) 70 | 71 | loss_rtfm = torch.mean((loss_abn + loss_nor) ** 2) 72 | 73 | loss_total = loss_cls + self.alpha * loss_rtfm 74 | 75 | return loss_total 76 | 77 | 78 | def train(args,nloader, aloader, model, batch_size, optimizer, device): 79 | with torch.set_grad_enabled(True): 80 | model.train() 81 | 82 | ninput, nlabel = next(nloader) 83 | ainput, alabel = next(aloader) 84 | 85 | input = torch.cat((ninput, ainput), 0).to(device) 86 | 87 | if args.train_part: 88 | #freeze bn 89 | model.module.Aggregate_clip.eval() 90 | if args.multi_patch_mode: 91 | frozen_patch_size = args.multi_patch_size.copy() 92 | frozen_patch_size.pop() 93 | for i ,size in enumerate(frozen_patch_size): 94 | model.module.Aggregate_patch[i].eval() 95 | model.module.patch_to_clip[i].eval() 96 | 97 | 98 | score_abnormal, score_normal, feat_select_abn, feat_select_normal, feat_abn_bottom, \ 99 | feat_normal_bottom, scores, scores_nor_bottom, scores_nor_abn_bag, _ = model(input) # b*32 x 2048 100 | 101 | scores = scores.view(batch_size * args.num_segments * 2, -1) 102 | scores = scores.squeeze() 103 | abn_scores = scores[batch_size * args.num_segments:] 104 | 105 | nlabel = nlabel[0:batch_size] 106 | alabel = alabel[0:batch_size] 107 | 108 | loss_criterion = RTFM_loss(0.0001, 100) 109 | loss_sparse = sparsity(abn_scores, batch_size, 8e-3) 110 | loss_smooth = smooth(abn_scores, 8e-4) 111 | cost = loss_criterion(score_normal, score_abnormal, nlabel, alabel, feat_select_normal, feat_select_abn) + loss_smooth + loss_sparse 112 | optimizer.zero_grad() 113 | cost.backward() 114 | optimizer.step() 115 | 116 | 117 | -------------------------------------------------------------------------------- /utils.py: -------------------------------------------------------------------------------- 1 | import torch.nn 2 | import numpy as np 3 | import logging 4 | import random 5 | import os 6 | import torch 7 | import time 8 | 9 | def process_feat(feat, length): 10 | new_feat = np.zeros((length, feat.shape[1])).astype(np.float32) 11 | 12 | r = np.linspace(0, len(feat), length+1, dtype=np.int) 13 | for i in range(length): 14 | if r[i]!=r[i+1]: 15 | new_feat[i,:] = np.mean(feat[r[i]:r[i+1],:], 0) 16 | else: 17 | new_feat[i,:] = feat[r[i],:] 18 | return new_feat 19 | 20 | 21 | def minmax_norm(act_map, min_val=None, max_val=None): 22 | if min_val is None or max_val is None: 23 | relu = torch.nn.ReLU() 24 | max_val = relu(torch.max(act_map, dim=0)[0]) 25 | min_val = relu(torch.min(act_map, dim=0)[0]) 26 | 27 | delta = max_val - min_val 28 | delta[delta <= 0] = 1 29 | ret = (act_map - min_val) / delta 30 | 31 | ret[ret > 1] = 1 32 | ret[ret < 0] = 0 33 | 34 | return ret 35 | 36 | 37 | 38 | class AverageMeter(object): 39 | def __init__(self): 40 | self.reset() 41 | def reset(self): 42 | self.vals=[] 43 | 44 | def __format__(self, format_spec): 45 | f=0 46 | if len(self.vals)!=0: 47 | f=(sum(self.vals)/len(self.vals)) 48 | return ('{:'+format_spec+'}').format(f) 49 | 50 | def val(self): 51 | if len(self.vals) != 0: 52 | f = sum(self.vals) / len(self.vals) 53 | else: 54 | f=0 55 | return f 56 | 57 | def update(self,val): 58 | if isinstance(val,np.ndarray): 59 | self.vals.append(val[0]) 60 | elif isinstance(val,np.float64): 61 | self.vals.append(val) 62 | else: 63 | self.vals.append(val.detach().cpu().item()) 64 | 65 | def show_params(args): 66 | params=vars(args) 67 | keys=sorted(params.keys()) 68 | 69 | for k in keys: 70 | print(k,'\t',params[k]) 71 | 72 | def get_logger(filename, verbosity=1, name=None): 73 | level_dict = {0: logging.DEBUG, 1: logging.INFO, 2: logging.WARNING} 74 | formatter = logging.Formatter( 75 | "[%(asctime)s] %(message)s" 76 | ) 77 | logger = logging.getLogger(name) 78 | logger.setLevel(level_dict[verbosity]) 79 | 80 | fh = logging.FileHandler(filename, "w") 81 | fh.setFormatter(formatter) 82 | logger.addHandler(fh) 83 | 84 | sh = logging.StreamHandler() 85 | sh.setFormatter(formatter) 86 | logger.addHandler(sh) 87 | 88 | return logger 89 | 90 | def log_param(logger,args): 91 | params=vars(args) 92 | keys=sorted(params.keys()) 93 | for k in keys: 94 | logger.info('{}\t{}'.format(k,params[k])) 95 | 96 | def get_timestamp(): 97 | return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) 98 | 99 | def mkdir(dir): 100 | if not os.path.exists(dir): 101 | try:os.makedirs(dir) 102 | except:pass 103 | 104 | def set_seeds(seed): 105 | print('set seed {}'.format(seed)) 106 | random.seed(seed) 107 | os.environ['PYTHONHASHSEED']=str(seed) 108 | np.random.seed(seed) 109 | torch.manual_seed(seed) 110 | torch.cuda.manual_seed(seed) 111 | torch.cuda.manual_seed_all(seed) 112 | 113 | 114 | def get_epoch_idx(epoch,milestones): 115 | count=0 116 | for milestone in milestones: 117 | if epoch>milestone: 118 | count+=1 119 | return count 120 | 121 | 122 | def weights_normal_init(model, dev=0.01): 123 | import torch 124 | from torch import nn 125 | 126 | # torch.manual_seed(2020) 127 | # torch.cuda.manual_seed_all(2020) 128 | if isinstance(model, list): 129 | for m in model: 130 | weights_normal_init(m, dev) 131 | else: 132 | for m in model.modules(): 133 | if isinstance(m, nn.Conv2d): 134 | torch.nn.init.kaiming_normal(m.weight) 135 | elif isinstance(m, nn.Linear): 136 | torch.nn.init.kaiming_normal(m.weight) 137 | if m.bias!=None: 138 | m.bias.data.fill_(0) --------------------------------------------------------------------------------