├── LICENSE ├── README.md ├── assets ├── davis.png ├── hist.png ├── jhmdb.png ├── pipeline.png ├── results.png └── vip.png ├── data └── selected_subdirs.txt ├── engine_pretrain.py ├── main_pretrain.py ├── models ├── convnextv1_sparse.py ├── convnextv2_sparse.py ├── dataloader_mac.py ├── resnetv2_sparse.py ├── utils.py └── video_mac.py ├── scripts ├── mac_cnxv1.sh ├── mac_cnxv2.sh └── mac_rn.sh └── tools ├── convert_pth.py ├── datasets.py ├── optim_factory.py └── utils.py /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Video-MAC 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 | ## VideoMAC: **V**ideo **M**asked **A**utoencoders Meet **C**onvNets 2 | 3 | ## Abstract 4 | >Recently, the advancement of self-supervised learning techniques, like masked autoencoders (MAE), has greatly influenced visual representation learning for images and videos. 5 | Nevertheless, it is worth noting that the predominant approaches in existing masked image / video modeling rely excessively on resource-intensive vision transformers (ViTs) as the feature encoder. In this paper, we propose a new approach termed as **VideoMAC**, which combines video masked autoencoders with resource-friendly ConvNets. Specifically, VideoMAC employs symmetric masking on randomly sampled pairs of video frames. To prevent the issue of mask pattern dissipation, we utilize ConvNets which are implemented with sparse convolutional operators as encoders. Simultaneously, we present a simple yet effective masked video modeling (MVM) approach, a dual encoder architecture comprising an online encoder and an exponential moving average target encoder, aimed to facilitate inter-frame reconstruction consistency in videos. Additionally, we demonstrate that VideoMAC, empowering classical (ResNet) / modern (ConvNeXt) convolutional encoders to harness the benefits of MVM, outperforms ViT-based approaches on downstream tasks, including video object segmentation (+**5.2%** / **6.4%** J&F), body part propagation (+**6.3%** / **3.1%** mIoU), and human pose tracking (+**10.2%** / **11.1%** PCK@0.1). 6 | 7 | 8 | | ![Image 1](assets/hist.png) | ![Image 2](assets/pipeline.png) | 9 | | :---------------------------: | :-----------------------------: | 10 | | Comparison | Pipeline | 11 | 12 | 13 | >An illustration of VideoMAC for ConvNet-based MVM. During pre-training, we mask 75% of symmetric patches from two frames randomly. In our VideoMAC, the MVM of frame pairs is achieved by an online network optimized by gradients (![ ](https://via.placeholder.com/15/c5e0b4/000000?text=+), online loss ![equation](https://latex.codecogs.com/svg.latex?%5Cmathcal%7BL%7D_%7Bo%7D) 14 | ) and a target network updated by EMA (![ ](https://via.placeholder.com/15/bdd7ee/000000?text=+), target loss ![equation](https://latex.codecogs.com/svg.latex?%5Cmathcal%7BL%7D_%7Bt%7D) 15 | ). ![equation](https://latex.codecogs.com/svg.latex?%5Cmathcal%7BL%7D_%7Bc%7D) 16 | is computed as the reconstruction consistency loss between reconstructed patches of frame pairs. 17 | 18 | ## Quantitative Results 19 | ![VideoMAC_Results](assets/results.png) 20 | 21 | ## Qualitative Results 22 | | ![davis](assets/davis.png) | 23 | | :-------------------------: | 24 | | Visualization of frame reconstruction and video object segmentation on DAVIS. | 25 | 26 | | ![davis](assets/vip.png) | 27 | | :-----------------------: | 28 | | Visualization of frame reconstruction and body part propagation on VIP. | 29 | 30 | 31 | | ![davis](assets/jhmdb.png) | 32 | | :------------------------: | 33 | | Visualization of frame reconstruction and human pose tracking on JHMDB. | 34 | 35 | ## Acknowledgement 36 | This repository borrows from [CNXv2](https://github.com/facebookresearch/ConvNeXt-V2), [MAE](https://github.com/facebookresearch/mae) and [MinkowskiEngine](https://github.com/NVIDIA/MinkowskiEngine). 37 | 38 | ## License 39 | VideoMAC is released under the MIT license and inherits all licenses of the aforementioned methods. If you want to use our code for non-academic use, please check the license first. 40 | 41 | ## Citation 42 | ``` 43 | @inproceedings{pei2024videomac, 44 | title={VideoMAC: Video Masked Autoencoders Meet ConvNets}, 45 | author={Pei, Gensheng and Chen, Tao and Jiang, Xiruo and Liu, Huafeng and Sun, Zeren and Yao, Yazhou}, 46 | booktitle={CVPR}, 47 | year={2024} 48 | } 49 | ``` 50 | -------------------------------------------------------------------------------- /assets/davis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Video-MAC/VideoMAC/2a86a396bc15c5ef24385b72855297ad3d91a745/assets/davis.png -------------------------------------------------------------------------------- /assets/hist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Video-MAC/VideoMAC/2a86a396bc15c5ef24385b72855297ad3d91a745/assets/hist.png -------------------------------------------------------------------------------- /assets/jhmdb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Video-MAC/VideoMAC/2a86a396bc15c5ef24385b72855297ad3d91a745/assets/jhmdb.png -------------------------------------------------------------------------------- /assets/pipeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Video-MAC/VideoMAC/2a86a396bc15c5ef24385b72855297ad3d91a745/assets/pipeline.png -------------------------------------------------------------------------------- /assets/results.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Video-MAC/VideoMAC/2a86a396bc15c5ef24385b72855297ad3d91a745/assets/results.png -------------------------------------------------------------------------------- /assets/vip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Video-MAC/VideoMAC/2a86a396bc15c5ef24385b72855297ad3d91a745/assets/vip.png -------------------------------------------------------------------------------- /data/selected_subdirs.txt: -------------------------------------------------------------------------------- 1 | ./data/k400/train/playing_trombone/FXksPyG5zhQ_000152_000162.mp4 2 | ./data/k400/train/skiing_slalom/sEn1Y-mNctA_000006_000016.mp4 3 | ./data/k400/train/skiing_(not_slalom_or_crosscountry)/juRYa1G5dkc_000090_000100.mp4 4 | ./data/k400/train/squat/UD-vcFsqvDw_000009_000019.mp4 5 | ./data/k400/train/playing_poker/sIPJLzHXJlM_000019_000029.mp4 6 | ./data/k400/train/playing_drums/NPucKnXaA1c_000377_000387.mp4 7 | ./data/k400/train/playing_piano/cAzjDHJk6bE_000000_000010.mp4 8 | ./data/k400/train/shoveling_snow/cQH_fgBZWpA_000002_000012.mp4 9 | ./data/k400/train/tango_dancing/99UXWs0W1nU_000118_000128.mp4 10 | ./data/k400/train/dancing_macarena/rZFcb5ukf1A_000016_000026.mp4 11 | ./data/k400/train/playing_badminton/5QLZRwm54Cs_000003_000013.mp4 12 | ./data/k400/train/hopscotch/sAIqLxgDz3A_000002_000012.mp4 13 | ./data/k400/train/drop_kicking/oyLeRC_hWT0_000001_000011.mp4 14 | ./data/k400/train/cleaning_floor/DLhpyADKYKM_000184_000194.mp4 15 | ./data/k400/train/watering_plants/ly6wx9BIa1g_000037_000047.mp4 16 | ./data/k400/train/playing_harmonica/3_zk-fpr5ik_000004_000014.mp4 17 | ./data/k400/train/playing_bagpipes/u3DrWfd1Nq4_000012_000022.mp4 18 | ./data/k400/train/folding_napkins/3Su9MXt5cXI_000085_000095.mp4 19 | ./data/k400/train/dancing_charleston/YjtQEJ2rsWQ_000018_000028.mp4 20 | ./data/k400/train/cutting_watermelon/L96R5eXY9dY_000028_000038.mp4 21 | ./data/k400/train/air_drumming/nDqU-F2MAgs_000028_000038.mp4 22 | ./data/k400/train/skiing_crosscountry/ooyIroM0ELU_000037_000047.mp4 23 | ./data/k400/train/hurling_(sport)/S1fP4p7VEKk_000166_000176.mp4 24 | ./data/k400/train/tasting_beer/SG_6RgJSCHc_000006_000016.mp4 25 | ./data/k400/train/waxing_back/8XNU_xNrJN0_000025_000035.mp4 26 | ./data/k400/train/pumping_fist/fD6j6nGcAP4_000101_000111.mp4 27 | ./data/k400/train/roller_skating/DQoEYhaFenA_000195_000205.mp4 28 | ./data/k400/train/cooking_chicken/8HG_raAiRVs_000263_000273.mp4 29 | ./data/k400/train/playing_tennis/wg3WlosEBw0_000033_000043.mp4 30 | ./data/k400/train/yoga/NVe_V-PqWTw_000013_000023.mp4 31 | ./data/k400/train/crossing_river/sVYC6dXdeBw_000432_000442.mp4 32 | ./data/k400/train/washing_hands/rxWPEBuRck4_000003_000013.mp4 33 | ./data/k400/train/washing_hands/lJFjjhgPuek_000033_000043.mp4 34 | ./data/k400/train/ski_jumping/xPunW9I6NrY_000001_000011.mp4 35 | ./data/k400/train/blasting_sand/9NIOwbOeD1Q_000196_000206.mp4 36 | ./data/k400/train/tango_dancing/j4v5wquF6gc_000073_000083.mp4 37 | ./data/k400/train/reading_book/tFBSxDiQmD8_000367_000377.mp4 38 | ./data/k400/train/sharpening_pencil/lMzb5jnSd1E_000003_000013.mp4 39 | ./data/k400/train/baking_cookies/_L044cX5smk_000000_000010.mp4 40 | ./data/k400/train/blowing_glass/W06j_eenVt8_000063_000073.mp4 41 | ./data/k400/train/finger_snapping/GlgPg5D1wDU_000021_000031.mp4 42 | ./data/k400/train/playing_cello/k9WrN8t7Dms_000006_000016.mp4 43 | ./data/k400/train/busking/41-0D4FACJw_000399_000409.mp4 44 | ./data/k400/train/hula_hooping/rM9v03fO9m4_000003_000013.mp4 45 | ./data/k400/train/cleaning_windows/3pslXmiWK0s_000021_000031.mp4 46 | ./data/k400/train/windsurfing/ErOmjjRP9TQ_000077_000087.mp4 47 | ./data/k400/train/playing_recorder/M-jwyzumbE4_000001_000011.mp4 48 | ./data/k400/train/breakdancing/T7vp8YkJ3NA_000003_000013.mp4 49 | ./data/k400/train/vault/LCNjZmGu3IE_000005_000015.mp4 50 | ./data/k400/train/throwing_axe/r3YZNSMO-4U_000172_000182.mp4 51 | ./data/k400/train/marching/alVlHvXc--Q_000112_000122.mp4 52 | ./data/k400/train/swimming_breast_stroke/_IMj1vvBxLY_000007_000017.mp4 53 | ./data/k400/train/bungee_jumping/rCes2HI3LmQ_000169_000179.mp4 54 | ./data/k400/train/sled_dog_racing/YqW0yBk5bkk_000002_000012.mp4 55 | ./data/k400/train/canoeing_or_kayaking/sWQHDJ4kmEA_000175_000185.mp4 56 | ./data/k400/train/bungee_jumping/5W3iqx-j6V8_000003_000013.mp4 57 | ./data/k400/train/catching_or_throwing_baseball/HzwdG5lkNH4_000000_000010.mp4 58 | ./data/k400/train/making_pizza/btcLqtX7ukQ_000528_000538.mp4 59 | ./data/k400/train/playing_piano/9-eZxvJ02Sg_000205_000215.mp4 60 | ./data/k400/train/diving_cliff/8T54mQRkTlI_000030_000040.mp4 61 | ./data/k400/train/skiing_slalom/P19QUU2QQks_000725_000735.mp4 62 | ./data/k400/train/paragliding/1Ep1RNI0b0U_000035_000045.mp4 63 | ./data/k400/train/playing_violin/3wJbIFGDAKA_000069_000079.mp4 64 | ./data/k400/train/sailing/TM_P2ECEl8Q_000002_000012.mp4 65 | ./data/k400/train/folding_clothes/AmmUfd26djU_000004_000014.mp4 66 | ./data/k400/train/playing_basketball/ARI30DM2Qxk_000016_000026.mp4 67 | ./data/k400/train/doing_laundry/z17Ga0uTb9o_000001_000011.mp4 68 | ./data/k400/train/playing_clarinet/MYSVaABfWHs_000073_000083.mp4 69 | ./data/k400/train/carrying_baby/_6jpMTxRak0_000103_000113.mp4 70 | ./data/k400/train/cleaning_gutters/7Y1j7Dbhz5k_000039_000049.mp4 71 | ./data/k400/train/smoking_hookah/510Bm-2ttGk_000216_000226.mp4 72 | ./data/k400/train/eating_watermelon/M1z9osd3rtU_000134_000144.mp4 73 | ./data/k400/train/juggling_fire/QDuZx_jv4t8_000003_000013.mp4 74 | ./data/k400/train/making_tea/s-Qig1yxL9I_000002_000012.mp4 75 | ./data/k400/train/playing_drums/Ek4JiDq-_xQ_000108_000118.mp4 76 | ./data/k400/train/busking/VHO_4g0oTNI_000198_000208.mp4 77 | ./data/k400/train/swimming_butterfly_stroke/lSvVv-cm3h0_000002_000012.mp4 78 | ./data/k400/train/belly_dancing/7g-9PqgEFp0_000005_000015.mp4 79 | ./data/k400/train/catching_or_throwing_baseball/aXvXP2zIRjs_000006_000016.mp4 80 | ./data/k400/train/throwing_discus/aJqDMKwOEXY_000001_000011.mp4 81 | ./data/k400/train/snowkiting/aEBF6Lhx1io_000248_000258.mp4 82 | ./data/k400/train/salsa_dancing/dsba6MybZyo_000090_000100.mp4 83 | ./data/k400/train/playing_paintball/E2M64kFXN80_000027_000037.mp4 84 | ./data/k400/train/squat/Hg24umK6QUU_000003_000013.mp4 85 | ./data/k400/train/passing_American_football_(in_game)/VMIPh7WTuSU_000001_000011.mp4 86 | ./data/k400/train/playing_flute/JLyQ_QFHSrM_000057_000067.mp4 87 | ./data/k400/train/playing_chess/yecyA6PxBk4_000100_000110.mp4 88 | ./data/k400/train/high_jump/2L35wge-lrA_000035_000045.mp4 89 | ./data/k400/train/snorkeling/qroMN5ooE0s_000219_000229.mp4 90 | ./data/k400/train/playing_bagpipes/mCZlrLhsqj0_000019_000029.mp4 91 | ./data/k400/train/jumping_into_pool/i8KXkP6jajY_000003_000013.mp4 92 | ./data/k400/train/making_snowman/70ORKrIi2G0_000078_000088.mp4 93 | ./data/k400/train/shaving_head/eYP9hkcXExM_000170_000180.mp4 94 | ./data/k400/train/marching/QnLcOnL5Jag_000003_000013.mp4 95 | ./data/k400/train/throwing_axe/-unudv5SOI4_000010_000020.mp4 96 | ./data/k400/train/bench_pressing/0gAqV7aUnsA_000007_000017.mp4 97 | ./data/k400/train/brush_painting/mBzz8R69c2I_000033_000043.mp4 98 | ./data/k400/train/playing_trumpet/ox0CFuGzm-0_000008_000018.mp4 99 | ./data/k400/train/blowing_out_candles/Lc2tig7o80Q_000007_000017.mp4 100 | ./data/k400/train/bending_metal/aQg2yGBGa4w_000126_000136.mp4 101 | ./data/k400/train/sneezing/0rlW_IJNc3s_000025_000035.mp4 102 | ./data/k400/train/walking_the_dog/Bi42Fp539lk_000020_000030.mp4 103 | ./data/k400/train/catching_or_throwing_softball/a1xT-rjqB40_000009_000019.mp4 104 | ./data/k400/train/pull_ups/94yTWneEY0Q_000045_000055.mp4 105 | ./data/k400/train/blowing_out_candles/EcAeymj8v2U_000003_000013.mp4 106 | ./data/k400/train/petting_animal_(not_cat)/PReQtpkg4U8_000272_000282.mp4 107 | ./data/k400/train/cheerleading/siytP73npZQ_000000_000010.mp4 108 | ./data/k400/train/singing/NId9ueAyiO0_000020_000030.mp4 109 | ./data/k400/train/ski_jumping/mgQcU1LUkAg_000020_000030.mp4 110 | ./data/k400/train/swimming_backstroke/rm1X4w1aA38_000107_000117.mp4 111 | ./data/k400/train/crying/hNqmXuoQ3DY_000006_000016.mp4 112 | ./data/k400/train/catching_or_throwing_frisbee/kWetPWSYcWY_000004_000014.mp4 113 | ./data/k400/train/drop_kicking/6NcRpw3PNzE_000168_000178.mp4 114 | ./data/k400/train/opening_present/wPjMlGUQOzI_000000_000010.mp4 115 | ./data/k400/train/skipping_rope/Sma-ydx49eQ_000000_000010.mp4 116 | ./data/k400/train/cooking_chicken/Z2-37SFP0bM_001015_001025.mp4 117 | ./data/k400/train/cutting_pineapple/bd8eusNMq4k_000004_000014.mp4 118 | ./data/k400/train/playing_harmonica/viFdS_bwK-E_000136_000146.mp4 119 | ./data/k400/train/cleaning_floor/zgrfmBPa4_E_000080_000090.mp4 120 | ./data/k400/train/cutting_watermelon/paCXHeetIg4_000031_000041.mp4 121 | ./data/k400/train/throwing_discus/e9tNrbEJw1E_000003_000013.mp4 122 | ./data/k400/train/riding_elephant/5MtV75AJIIM_000012_000022.mp4 123 | ./data/k400/train/catching_fish/eBbyLFV2jMo_000088_000098.mp4 124 | ./data/k400/train/front_raises/Y2lsJBUhq1o_000004_000014.mp4 125 | ./data/k400/train/hopscotch/0ysbvaGmPlg_000006_000016.mp4 126 | ./data/k400/train/washing_dishes/uJHVhhJ-9IQ_000021_000031.mp4 127 | ./data/k400/train/water_sliding/b-QY23MEu2w_000022_000032.mp4 128 | ./data/k400/train/shaving_head/pW31TwmRmYw_000064_000074.mp4 129 | ./data/k400/train/playing_harp/LIH0-3RwSrQ_000007_000017.mp4 130 | ./data/k400/train/playing_trombone/qmYGC2LRkDY_000012_000022.mp4 131 | ./data/k400/train/cheerleading/hO82W1QCg1s_004058_004068.mp4 132 | ./data/k400/train/slacklining/8jsPgYp87Co_000010_000020.mp4 133 | ./data/k400/train/playing_recorder/zzPlOxmmsaM_000205_000215.mp4 134 | ./data/k400/train/sailing/Nf52epHy6Wo_000091_000101.mp4 135 | ./data/k400/train/playing_monopoly/wf_8Nrcy21c_000005_000015.mp4 136 | ./data/k400/train/clapping/GNT731Jv5CY_000022_000032.mp4 137 | ./data/k400/train/push_up/A_cX3LCjm68_000174_000184.mp4 138 | ./data/k400/train/situp/F_E2qD3NJBc_000006_000016.mp4 139 | ./data/k400/train/drawing/IPobnlpqb5M_000493_000503.mp4 140 | ./data/k400/train/massaging_person's_head/hWemyy6qa1c_000620_000630.mp4 141 | ./data/k400/train/tying_tie/UCGITlFBXx4_000242_000252.mp4 142 | ./data/k400/train/tapping_guitar/xQ8B-tBM1Co_000001_000011.mp4 143 | ./data/k400/train/playing_harp/T-AtRqXjTCQ_000080_000090.mp4 144 | ./data/k400/train/scuba_diving/q0JkeCiRsFc_000134_000144.mp4 145 | ./data/k400/train/snowkiting/yFqxRh0m_a4_000064_000074.mp4 146 | ./data/k400/train/ice_climbing/OIuK1k2g08Y_000022_000032.mp4 147 | ./data/k400/train/roller_skating/PrMVPTOliQ0_000011_000021.mp4 148 | ./data/k400/train/side_kick/XsWi_xHaTG8_000013_000023.mp4 149 | ./data/k400/train/using_remote_controller_(not_gaming)/m-VRo2E_0yc_000014_000024.mp4 150 | ./data/k400/train/playing_keyboard/D5_xKlXBKyw_000022_000032.mp4 151 | ./data/k400/train/washing_feet/lkV9qoP7G0I_000320_000330.mp4 152 | ./data/k400/train/drop_kicking/rS3sp6Qme5E_000003_000013.mp4 153 | ./data/k400/train/shoveling_snow/C3QncBth0W4_000002_000012.mp4 154 | ./data/k400/train/pumping_fist/rKPkd7R-IH4_000018_000028.mp4 155 | ./data/k400/train/cooking_chicken/dCUrQUY7j_Y_000036_000046.mp4 156 | ./data/k400/train/ripping_paper/0p5Ph99ZFXM_000037_000047.mp4 157 | ./data/k400/train/making_jewelry/Sa6VqxovP7k_000060_000070.mp4 158 | ./data/k400/train/tobogganing/_xO9ZTX9JSw_000002_000012.mp4 159 | ./data/k400/train/drumming_fingers/kkc-i4Pv_BM_000024_000034.mp4 160 | ./data/k400/train/golf_driving/cwShhyNuozw_000004_000014.mp4 161 | ./data/k400/train/cooking_chicken/nKC0vCDSfH8_000263_000273.mp4 162 | ./data/k400/train/bartending/ZT8F78EAivk_000164_000174.mp4 163 | ./data/k400/train/springboard_diving/ZUQ5k6gBG2c_000079_000089.mp4 164 | ./data/k400/train/playing_badminton/XpOTxFFmDVE_000037_000047.mp4 165 | ./data/k400/train/building_shed/S0gAmdZxJz4_000001_000011.mp4 166 | ./data/k400/train/sailing/HbbZJpygQbM_000006_000016.mp4 167 | ./data/k400/train/riding_camel/cldYF2bu0fo_000045_000055.mp4 168 | ./data/k400/train/punching_bag/Wz6XKpW_qds_000001_000011.mp4 169 | ./data/k400/train/golf_driving/kV-3tSI4eoA_000004_000014.mp4 170 | ./data/k400/train/zumba/f23BrxciW7M_000001_000011.mp4 171 | ./data/k400/train/tap_dancing/uxRYiYBUAdA_000045_000055.mp4 172 | ./data/k400/train/pushing_car/BUp1GmijYiA_000014_000024.mp4 173 | ./data/k400/train/bench_pressing/tSmRu3HCPwo_000030_000040.mp4 174 | ./data/k400/train/dancing_macarena/89zEDVXD4HQ_000058_000068.mp4 175 | ./data/k400/train/ice_skating/3O5YCQtAP4k_000237_000247.mp4 176 | ./data/k400/train/snowkiting/88VIVa15D38_000029_000039.mp4 177 | ./data/k400/train/making_pizza/lS-MjKzR4cI_000008_000018.mp4 178 | ./data/k400/train/kitesurfing/OzDnuGQjKxc_000118_000128.mp4 179 | ./data/k400/train/ski_jumping/Et1H8fpXAhc_000020_000030.mp4 180 | ./data/k400/train/ice_climbing/gSYFmiQ28g8_000010_000020.mp4 181 | ./data/k400/train/playing_harp/qVoFMtgDvPM_000059_000069.mp4 182 | ./data/k400/train/swing_dancing/X97Y2jWhdSU_000073_000083.mp4 183 | ./data/k400/train/kicking_soccer_ball/ghkRmjD9_MQ_000005_000015.mp4 184 | ./data/k400/train/washing_hands/wfR3hqeHWhw_000005_000015.mp4 185 | ./data/k400/train/throwing_discus/XN9pUYVuULA_000122_000132.mp4 186 | ./data/k400/train/doing_nails/TVsStWLw6zs_000065_000075.mp4 187 | ./data/k400/train/sled_dog_racing/T20uOqzXTn8_000093_000103.mp4 188 | ./data/k400/train/egg_hunting/j6o-tmyceMU_000058_000068.mp4 189 | ./data/k400/train/surfing_crowd/MshAos20i70_000020_000030.mp4 190 | ./data/k400/train/shaking_head/p_ZQxveyaHY_000004_000014.mp4 191 | ./data/k400/train/water_sliding/NB63JvV8QTg_000015_000025.mp4 192 | ./data/k400/train/shearing_sheep/dSbDRwXtQc4_000000_000010.mp4 193 | ./data/k400/train/pushing_car/Bhjqot6X2mY_000004_000014.mp4 194 | ./data/k400/train/water_skiing/_5Z2jLy50cA_000009_000019.mp4 195 | ./data/k400/train/getting_a_tattoo/W_T_C_ZUA7w_000015_000025.mp4 196 | ./data/k400/train/shuffling_cards/LMYU0pjOv5o_000027_000037.mp4 197 | ./data/k400/train/picking_fruit/533YDY8_H84_000011_000021.mp4 198 | ./data/k400/train/knitting/nJ_cipF-fQg_000255_000265.mp4 199 | ./data/k400/train/drinking_shots/P8dvVksmVQk_000001_000011.mp4 200 | ./data/k400/train/petting_animal_(not_cat)/nZgORbvpWK8_000248_000258.mp4 201 | ./data/k400/train/dribbling_basketball/hV7D0dJ9HRA_000027_000037.mp4 202 | ./data/k400/train/throwing_discus/voYylmCvXkg_000058_000068.mp4 203 | ./data/k400/train/washing_hands/KqgDjgbLYRo_000021_000031.mp4 204 | ./data/k400/train/dribbling_basketball/x12gbRQAkHE_000006_000016.mp4 205 | ./data/k400/train/dancing_charleston/beYYg1KMLUg_000023_000033.mp4 206 | ./data/k400/train/making_pizza/MBAW5Qw5dxw_000263_000273.mp4 207 | ./data/k400/train/waxing_chest/5nMdCNh0PnI_000011_000021.mp4 208 | ./data/k400/train/grooming_dog/2H6koOMfDr0_000004_000014.mp4 209 | ./data/k400/train/water_skiing/-Fp5reKg40w_000014_000024.mp4 210 | ./data/k400/train/tossing_coin/53QastUwyZw_000027_000037.mp4 211 | ./data/k400/train/drumming_fingers/ld_H4SaOwHE_000108_000118.mp4 212 | ./data/k400/train/krumping/HVY3eDQhRR0_000319_000329.mp4 213 | ./data/k400/train/high_kick/USgdqE8O8W0_000086_000096.mp4 214 | ./data/k400/train/washing_hair/QOFl3Ii7TNM_000096_000106.mp4 215 | ./data/k400/train/tasting_beer/diYrY40ylFU_000016_000026.mp4 216 | ./data/k400/train/crawling_baby/cfV3uk36l9k_000018_000028.mp4 217 | ./data/k400/train/waxing_eyebrows/2oYq4hR_c0Q_000249_000259.mp4 218 | ./data/k400/train/carving_pumpkin/Osq0k8WDH1w_000027_000037.mp4 219 | ./data/k400/train/sweeping_floor/lLmsT-qVAcY_000029_000039.mp4 220 | ./data/k400/train/playing_bass_guitar/PdnRbW1J9T8_000153_000163.mp4 221 | ./data/k400/train/sweeping_floor/weUIlCy99kM_000004_000014.mp4 222 | ./data/k400/train/high_jump/qKf8Eg7PUog_000014_000024.mp4 223 | ./data/k400/train/tossing_coin/9yGtinCC2FM_000218_000228.mp4 224 | ./data/k400/train/making_sushi/BYkbbd6xGNo_000129_000139.mp4 225 | ./data/k400/train/roller_skating/KDjSmj_eYCE_000073_000083.mp4 226 | ./data/k400/train/opening_present/xP81kNUGUs0_000004_000014.mp4 227 | ./data/k400/train/holding_snake/Gj9a1DUwwr0_000004_000014.mp4 228 | ./data/k400/train/playing_paintball/lkBJpsU0kkw_000229_000239.mp4 229 | ./data/k400/train/abseiling/WWBDz0UZ3Pw_000165_000175.mp4 230 | ./data/k400/train/cooking_egg/SUVk-giRxYs_000046_000056.mp4 231 | ./data/k400/train/bungee_jumping/QCXr5jC7rvA_000217_000227.mp4 232 | ./data/k400/train/crossing_river/j_VzfjT_0yo_000038_000048.mp4 233 | ./data/k400/train/surfing_water/1S665T6Ry5Y_000018_000028.mp4 234 | ./data/k400/train/golf_driving/OS63-n0lql4_000004_000014.mp4 235 | ./data/k400/train/cleaning_toilet/yw2BA9cIYcE_000177_000187.mp4 236 | ./data/k400/train/marching/UpNkX58bhR8_000104_000114.mp4 237 | ./data/k400/train/bench_pressing/JXDtY_IzwTg_000035_000045.mp4 238 | ./data/k400/train/making_pizza/3wpOeRr3hEI_000286_000296.mp4 239 | ./data/k400/train/tying_tie/DuwvmQQw7C8_000071_000081.mp4 240 | ./data/k400/train/tying_knot_(not_on_a_tie)/Au2uF38By2w_000130_000140.mp4 241 | ./data/k400/train/faceplanting/DAeLsJBXaAA_000004_000014.mp4 242 | ./data/k400/train/reading_book/whBmv_p7FFM_000137_000147.mp4 243 | ./data/k400/train/air_drumming/nRbMYiKcK1k_000000_000010.mp4 244 | ./data/k400/train/blowing_glass/iRuyZSKhHRg_000023_000033.mp4 245 | ./data/k400/train/beatboxing/c7EGprpyf4c_000514_000524.mp4 246 | ./data/k400/train/shooting_basketball/oZX4RPx4Fxc_000062_000072.mp4 247 | ./data/k400/train/tying_tie/4eAcuHwPWvg_000142_000152.mp4 248 | ./data/k400/train/bowling/TXrLr4eST7A_000002_000012.mp4 249 | ./data/k400/train/feeding_fish/HkvwdnV4RtU_000133_000143.mp4 250 | ./data/k400/train/playing_volleyball/9MARB5Ua9BA_000073_000083.mp4 251 | ./data/k400/train/extinguishing_fire/ilhR5b65gpw_000073_000083.mp4 252 | ./data/k400/train/brushing_hair/sw4M2qRmEpU_000086_000096.mp4 253 | ./data/k400/train/playing_trumpet/gYEneNdywBQ_000125_000135.mp4 254 | ./data/k400/train/headbutting/wYzsW1WCWmo_000027_000037.mp4 255 | ./data/k400/train/contact_juggling/2zVFpxMUFNY_000076_000086.mp4 256 | ./data/k400/train/flipping_pancake/fiDWAHvr0sg_000003_000013.mp4 257 | ./data/k400/train/spinning_poi/H5dmiRW2jeQ_000118_000128.mp4 258 | ./data/k400/train/tango_dancing/aylmU4a7lRM_000013_000023.mp4 259 | ./data/k400/train/breakdancing/KJM2Kzfh4a4_000003_000013.mp4 260 | ./data/k400/train/zumba/1m_T0UIdMzw_000031_000041.mp4 261 | ./data/k400/train/opening_bottle/k9Nc8S7hXyw_000004_000014.mp4 262 | ./data/k400/train/tossing_salad/L9W7TiMb7nE_000305_000315.mp4 263 | ./data/k400/train/throwing_discus/Gi8358rqaBg_000090_000100.mp4 264 | ./data/k400/train/climbing_tree/ADlVkRrXV9Q_000003_000013.mp4 265 | ./data/k400/train/playing_trumpet/VkBz7K1bFGY_000028_000038.mp4 266 | ./data/k400/train/using_computer/qJWPr0X_HoA_000007_000017.mp4 267 | ./data/k400/train/arranging_flowers/ZIaMNdk9F-I_000027_000037.mp4 268 | ./data/k400/train/pushing_cart/oFEsU6hIJxA_000008_000018.mp4 269 | ./data/k400/train/playing_guitar/bKB1HFTiI3c_000088_000098.mp4 270 | ./data/k400/train/ice_fishing/RzEAeqDU0A0_000317_000327.mp4 271 | ./data/k400/train/moving_furniture/Vgh5wR4SgtM_000010_000020.mp4 272 | ./data/k400/train/changing_oil/dap8-0qOujI_000018_000028.mp4 273 | ./data/k400/train/biking_through_snow/5DTMeQudjaI_000147_000157.mp4 274 | ./data/k400/train/cutting_watermelon/medWDhSbp8w_000007_000017.mp4 275 | ./data/k400/train/cleaning_floor/tnK6Q8XGzaY_000109_000119.mp4 276 | ./data/k400/train/checking_tires/pH_Z9Lp-SwM_000090_000100.mp4 277 | ./data/k400/train/playing_guitar/RlijDsdErDM_000455_000465.mp4 278 | ./data/k400/train/shooting_goal_(soccer)/DqdB4coea5Q_000021_000031.mp4 279 | ./data/k400/train/climbing_ladder/sBVM9N7SugU_000007_000017.mp4 280 | ./data/k400/train/snowkiting/IvIx72UI0H0_000032_000042.mp4 281 | ./data/k400/train/making_tea/Ll1j5j7DPBA_000001_000011.mp4 282 | ./data/k400/train/playing_saxophone/raMjiKhc_A0_000628_000638.mp4 283 | ./data/k400/train/windsurfing/tseoa3Nyreg_000102_000112.mp4 284 | ./data/k400/train/eating_burger/5K6GiBk7-B8_000020_000030.mp4 285 | ./data/k400/train/headbutting/xJI4PV4YYLs_000000_000010.mp4 286 | ./data/k400/train/playing_cymbals/jPghgw460XU_000008_000018.mp4 287 | ./data/k400/train/blowing_glass/vXb932C_3Vg_000128_000138.mp4 288 | ./data/k400/train/jogging/EkkDxb4rlWs_000075_000085.mp4 289 | ./data/k400/train/tango_dancing/JZwve3kIMCA_000210_000220.mp4 290 | ./data/k400/train/gymnastics_tumbling/sJ75287kJ08_000003_000013.mp4 291 | ./data/k400/train/sticking_tongue_out/Qwa3b91GqxM_000002_000012.mp4 292 | ./data/k400/train/pushing_cart/BJNogQKl8xU_000023_000033.mp4 293 | ./data/k400/train/presenting_weather_forecast/GVzOXyFycJU_000293_000303.mp4 294 | ./data/k400/train/hammer_throw/effegGXXtTc_000012_000022.mp4 295 | ./data/k400/train/playing_tennis/Uiv2IdJvv_M_000083_000093.mp4 296 | ./data/k400/train/vault/1qDAHcSQpL0_000004_000014.mp4 297 | ./data/k400/train/carrying_baby/iAQYcYCalOA_000004_000014.mp4 298 | ./data/k400/train/pull_ups/CFGjL9EhZ2w_000042_000052.mp4 299 | ./data/k400/train/sniffing/dAloPyKJfOM_000002_000012.mp4 300 | ./data/k400/train/belly_dancing/IswX9piYDkk_000035_000045.mp4 301 | ./data/k400/train/shuffling_cards/8I3L7jQ0Yos_000001_000011.mp4 302 | ./data/k400/train/pushing_car/stjtt8piXY0_000011_000021.mp4 303 | ./data/k400/train/country_line_dancing/L6A96yIsq_4_000114_000124.mp4 304 | ./data/k400/train/cooking_chicken/VvC4jKzTwWk_000175_000185.mp4 305 | ./data/k400/train/playing_saxophone/KVWNREO4TF4_000003_000013.mp4 306 | ./data/k400/train/riding_mule/mgC28GOSdRw_000003_000013.mp4 307 | ./data/k400/train/grooming_horse/epvsY7oFv4w_000000_000010.mp4 308 | ./data/k400/train/scuba_diving/6l7Dqui5Dyk_000329_000339.mp4 309 | ./data/k400/train/bending_metal/sncSZm0nVQ0_000075_000085.mp4 310 | ./data/k400/train/brushing_hair/Pnx7yZ9nsBM_000095_000105.mp4 311 | ./data/k400/train/pushing_wheelchair/imuTe7tt-eE_000077_000087.mp4 312 | ./data/k400/train/driving_tractor/i4yfLWuQm9Q_000015_000025.mp4 313 | ./data/k400/train/scuba_diving/orcF8QNkg9g_000057_000067.mp4 314 | ./data/k400/train/tap_dancing/UrN4ivtWC-Q_000073_000083.mp4 315 | ./data/k400/train/skateboarding/gNnui71QBBY_000093_000103.mp4 316 | ./data/k400/train/throwing_discus/XXizm79DpHY_000001_000011.mp4 317 | ./data/k400/train/doing_laundry/Af96X3LmXng_000056_000066.mp4 318 | ./data/k400/train/playing_chess/-HPS3F9QhFU_000066_000076.mp4 319 | ./data/k400/train/washing_hands/HdYthJ_b59E_000001_000011.mp4 320 | ./data/k400/train/cleaning_floor/Yr2fLnfLiKo_000039_000049.mp4 321 | ./data/k400/train/playing_accordion/Afq6GQjAVNI_000004_000014.mp4 322 | ./data/k400/train/blowing_out_candles/0W9deLvCCQk_000003_000013.mp4 323 | ./data/k400/train/playing_violin/4S0cEaMNtJ8_000017_000027.mp4 324 | ./data/k400/train/front_raises/UQDWHHVPVuA_000012_000022.mp4 325 | ./data/k400/train/eating_burger/Jt8QdcHkDow_000100_000110.mp4 326 | ./data/k400/train/hurling_(sport)/sDTpTVdEFuw_000361_000371.mp4 327 | ./data/k400/train/snatch_weight_lifting/UFdS_bmVnCg_000000_000010.mp4 328 | ./data/k400/train/playing_badminton/Efjuix5II1E_001125_001135.mp4 329 | ./data/k400/train/folding_napkins/DVLfN-Ba914_000026_000036.mp4 330 | ./data/k400/train/punching_person_(boxing)/XrUXyRumbI0_000328_000338.mp4 331 | ./data/k400/train/shearing_sheep/-wi7ClvUXWI_000062_000072.mp4 332 | ./data/k400/train/pumping_gas/lkOyXqccJec_000003_000013.mp4 333 | ./data/k400/train/dodgeball/GmGE7X8A8-s_000020_000030.mp4 334 | ./data/k400/train/shaving_head/O3jkkZjQJMU_000091_000101.mp4 335 | ./data/k400/train/motorcycling/Q93DB4WhMPs_000262_000272.mp4 336 | ./data/k400/train/skiing_crosscountry/kwEou7VmiFI_000010_000020.mp4 337 | ./data/k400/train/playing_cello/oYac3CIPVx8_000007_000017.mp4 338 | ./data/k400/train/clean_and_jerk/xTLi7Ae_erE_000001_000011.mp4 339 | ./data/k400/train/yoga/O7Kmjpd_l0g_000295_000305.mp4 340 | ./data/k400/train/swing_dancing/P4WSt5g9mxg_000000_000010.mp4 341 | ./data/k400/train/push_up/1CMRbaNZVvM_000058_000068.mp4 342 | ./data/k400/train/trimming_or_shaving_beard/SQj5HtOAHC4_000593_000603.mp4 343 | ./data/k400/train/arm_wrestling/owxx5iWClm8_000001_000011.mp4 344 | ./data/k400/train/playing_accordion/VVqvdpsoobI_000031_000041.mp4 345 | ./data/k400/train/cutting_pineapple/_YRVtYqx9f8_000291_000301.mp4 346 | ./data/k400/train/playing_poker/jjN1LAz0lIc_000050_000060.mp4 347 | ./data/k400/train/throwing_axe/rz24jZxD1KM_000009_000019.mp4 348 | ./data/k400/train/driving_tractor/qTzHZIvPErc_000044_000054.mp4 349 | ./data/k400/train/hammer_throw/1xZo8DECdGY_000002_000012.mp4 350 | ./data/k400/train/washing_hair/TxUxTma4F1U_000519_000529.mp4 351 | ./data/k400/train/abseiling/v6hfBCUQFxc_000087_000097.mp4 352 | ./data/k400/train/high_jump/EQhYbShbWHg_001892_001902.mp4 353 | ./data/k400/train/opening_present/znBqPfVCgjs_000124_000134.mp4 354 | ./data/k400/train/catching_fish/WnODazW29aQ_000072_000082.mp4 355 | ./data/k400/train/hula_hooping/k6hLs63PD-A_000011_000021.mp4 356 | ./data/k400/train/busking/ebWMqg9Dq2g_000056_000066.mp4 357 | ./data/k400/train/swimming_butterfly_stroke/W2vZm8RP9Vg_000000_000010.mp4 358 | ./data/k400/train/brushing_teeth/AITSF8DvYeU_000037_000047.mp4 359 | ./data/k400/train/spray_painting/vI5yLWuU7hY_000012_000022.mp4 360 | ./data/k400/train/clean_and_jerk/YJgSXFaBelY_000007_000017.mp4 361 | ./data/k400/train/sled_dog_racing/uJ6rYgtRUto_000075_000085.mp4 362 | ./data/k400/train/punching_person_(boxing)/Qv3ZYksqA0M_000072_000082.mp4 363 | ./data/k400/train/milking_cow/D1I_hENFywI_000002_000012.mp4 364 | ./data/k400/train/jogging/OhjdFKXLtiE_000001_000011.mp4 365 | ./data/k400/train/testifying/TImsk1JZJOQ_000001_000011.mp4 366 | ./data/k400/train/playing_keyboard/8xncJWSiueE_000203_000213.mp4 367 | ./data/k400/train/playing_guitar/pJYpxvlckxo_000599_000609.mp4 368 | ./data/k400/train/reading_book/ghuDkcD6RaU_000235_000245.mp4 369 | ./data/k400/train/playing_harmonica/8cQVNt3Q-F4_000024_000034.mp4 370 | ./data/k400/train/feeding_fish/89jGIurkuJY_000023_000033.mp4 371 | ./data/k400/train/side_kick/5hVKfXqglUw_000007_000017.mp4 372 | ./data/k400/train/sticking_tongue_out/hgWgNmYxQtw_000013_000023.mp4 373 | ./data/k400/train/peeling_potatoes/iv9uHPjUMxQ_000065_000075.mp4 374 | ./data/k400/train/snowkiting/HYGEnl4TZJY_000006_000016.mp4 375 | ./data/k400/train/drumming_fingers/LiTYwcYchLQ_000056_000066.mp4 376 | ./data/k400/train/marching/gD54XHA-Uew_000037_000047.mp4 377 | ./data/k400/train/setting_table/K7u_WeaPY40_000022_000032.mp4 378 | ./data/k400/train/cheerleading/0zEsUaCqn60_000001_000011.mp4 379 | ./data/k400/train/blasting_sand/R_iXs5CA9-M_000051_000061.mp4 380 | ./data/k400/train/tai_chi/wzNFyTPzd5E_000177_000187.mp4 381 | ./data/k400/train/cleaning_floor/zUkuTsL4ydc_000192_000202.mp4 382 | ./data/k400/train/canoeing_or_kayaking/GZ0mMI07gyc_000055_000065.mp4 383 | ./data/k400/train/assembling_computer/6aetM_5efn8_001797_001807.mp4 384 | ./data/k400/train/arranging_flowers/DAFyYUqTOIc_000373_000383.mp4 385 | ./data/k400/train/riding_or_walking_with_horse/VwpLNNGxB0s_000031_000041.mp4 386 | ./data/k400/train/parasailing/8ZoyVDlEfQs_000003_000013.mp4 387 | ./data/k400/train/motorcycling/viWU3TEq_74_000002_000012.mp4 388 | ./data/k400/train/dancing_charleston/Lor4TZcIVwM_000209_000219.mp4 389 | ./data/k400/train/playing_recorder/hx3tYFoGIOI_000012_000022.mp4 390 | ./data/k400/train/headbanging/dqpjHnlXDcA_000034_000044.mp4 391 | ./data/k400/train/getting_a_tattoo/yFk4CVFX1b8_000011_000021.mp4 392 | ./data/k400/train/knitting/FyYTw2O7FqE_000026_000036.mp4 393 | ./data/k400/train/baking_cookies/Wl_myLJivYE_000210_000220.mp4 394 | ./data/k400/train/blowing_out_candles/GtwcNHSR0Bg_000023_000033.mp4 395 | ./data/k400/train/paragliding/XA2j9LvPp2w_000129_000139.mp4 396 | ./data/k400/train/riding_elephant/QnJ5e215IRw_000026_000036.mp4 397 | ./data/k400/train/feeding_birds/DI-wxwha1ZY_000099_000109.mp4 398 | ./data/k400/train/cleaning_pool/bgtK9G9iyrg_000024_000034.mp4 399 | ./data/k400/train/drop_kicking/gDAFr_t2ME0_000001_000011.mp4 400 | ./data/k400/train/abseiling/HUTNkEAPmzQ_000084_000094.mp4 401 | ./data/k400/train/waxing_back/Uj_sYfbuY1k_000205_000215.mp4 402 | ./data/k400/train/fixing_hair/z0BAmnpS6yw_000157_000167.mp4 403 | ./data/k400/train/kicking_field_goal/3NSGHdxYhGQ_000007_000017.mp4 404 | ./data/k400/train/blasting_sand/3PZlkP70z6Q_000097_000107.mp4 405 | ./data/k400/train/headbanging/r2WgMV5529s_000001_000011.mp4 406 | ./data/k400/train/dining/VwIufyGuvIs_000310_000320.mp4 407 | ./data/k400/train/tap_dancing/bsN7Lx25ewU_000049_000059.mp4 408 | ./data/k400/train/cheerleading/bDPpmwL5maY_000042_000052.mp4 409 | ./data/k400/train/spraying/fEb8YyNPDhI_000097_000107.mp4 410 | ./data/k400/train/crawling_baby/Wy9mus5K9uU_000036_000046.mp4 411 | ./data/k400/train/stretching_leg/Dgx3cKcSnOI_000000_000010.mp4 412 | ./data/k400/train/dodgeball/dtljWVl-V4I_000084_000094.mp4 413 | ./data/k400/train/pushing_wheelchair/d32YDWfKsOA_000017_000027.mp4 414 | ./data/k400/train/riding_mechanical_bull/cIrWTzxfoVs_000000_000010.mp4 415 | ./data/k400/train/shooting_basketball/0aMtg1-pra8_000000_000010.mp4 416 | ./data/k400/train/yoga/1-YrRvuKUqc_000028_000038.mp4 417 | ./data/k400/train/playing_drums/hzXAY_KSPvE_000039_000049.mp4 418 | ./data/k400/train/shot_put/0ZORVHJQEpE_000003_000013.mp4 419 | ./data/k400/train/tying_tie/GmK8Ov9aCS0_000191_000201.mp4 420 | ./data/k400/train/bungee_jumping/pPxnaZ4U79E_000001_000011.mp4 421 | ./data/k400/train/ski_jumping/qdqRyBMWM6s_000053_000063.mp4 422 | ./data/k400/train/lunge/kaoruh8xaO8_000009_000019.mp4 423 | ./data/k400/train/folding_napkins/RzF59fP-1jo_000445_000455.mp4 424 | ./data/k400/train/playing_keyboard/VAwu7Iwg68A_000056_000066.mp4 425 | ./data/k400/train/playing_bass_guitar/2qzRp5d8TLM_000113_000123.mp4 426 | ./data/k400/train/headbanging/9rEFct1-YWk_000075_000085.mp4 427 | ./data/k400/train/punching_bag/-LF1BNdNeQg_000002_000012.mp4 428 | ./data/k400/train/playing_trombone/yUfXF4KRtjo_000567_000577.mp4 429 | ./data/k400/train/spray_painting/ga7k3DUh0jI_000260_000270.mp4 430 | ./data/k400/train/playing_cello/TrNZA-hUuQY_000002_000012.mp4 431 | ./data/k400/train/sled_dog_racing/SZFmSu-vjJ4_000019_000029.mp4 432 | ./data/k400/train/playing_basketball/Zs8a4T3Us1I_000001_000011.mp4 433 | ./data/k400/train/playing_harmonica/nEoj-nqQYdQ_000118_000128.mp4 434 | ./data/k400/train/tossing_salad/TJNAJhkHE4k_000094_000104.mp4 435 | ./data/k400/train/hurdling/IMEr1bnUBIw_000004_000014.mp4 436 | ./data/k400/train/plastering/c8PsU4c0a7I_000006_000016.mp4 437 | ./data/k400/train/snorkeling/QEIlhlXNs-M_000089_000099.mp4 438 | ./data/k400/train/shooting_basketball/mepi6lFUU1o_000031_000041.mp4 439 | ./data/k400/train/playing_trombone/47QpN-Ph-to_000035_000045.mp4 440 | ./data/k400/train/sharpening_knives/l9agwdXXnEg_000042_000052.mp4 441 | ./data/k400/train/front_raises/2ZK0gid5fec_000003_000013.mp4 442 | ./data/k400/train/crying/-PNcaCDLaFw_000009_000019.mp4 443 | ./data/k400/train/cleaning_shoes/1d4G2Na0vqs_000015_000025.mp4 444 | ./data/k400/train/kissing/Ob7j77SU_8I_000085_000095.mp4 445 | ./data/k400/train/doing_laundry/NztBNu21Bek_000062_000072.mp4 446 | ./data/k400/train/massaging_person's_head/VRI5eAyayZo_000345_000355.mp4 447 | ./data/k400/train/motorcycling/fYerPLHOCoM_000031_000041.mp4 448 | ./data/k400/train/watering_plants/TYNjYUAjIYo_000035_000045.mp4 449 | ./data/k400/train/jumpstyle_dancing/UgnqGnJQkDs_000001_000011.mp4 450 | ./data/k400/train/planting_trees/MJF44sChHUU_000005_000015.mp4 451 | ./data/k400/train/trapezing/6RXh0oyXHyE_000041_000051.mp4 452 | ./data/k400/train/hitting_baseball/XfbQXNv2TCk_000621_000631.mp4 453 | ./data/k400/train/playing_cello/W5UZE_C4Dk4_000000_000010.mp4 454 | ./data/k400/train/water_sliding/ymiofvuxi5k_000027_000037.mp4 455 | ./data/k400/train/making_bed/ts8xpz5Gfnc_000171_000181.mp4 456 | ./data/k400/train/flying_kite/kJXM6LAi2es_000007_000017.mp4 457 | ./data/k400/train/eating_doughnuts/BnJ024z4Mn4_000087_000097.mp4 458 | ./data/k400/train/giving_or_receiving_award/b7ZuXdlc5mI_000577_000587.mp4 459 | ./data/k400/train/pull_ups/NKT4ylACJnI_000000_000010.mp4 460 | ./data/k400/train/recording_music/hJD59enQ0O4_000001_000011.mp4 461 | ./data/k400/train/ice_fishing/AYEziFZdp-M_000024_000034.mp4 462 | ./data/k400/train/playing_saxophone/xgXlfOYfGZ0_000001_000011.mp4 463 | ./data/k400/train/ski_jumping/o9QouoYlOw8_000004_000014.mp4 464 | ./data/k400/train/slapping/OaSZZwhDDo0_000004_000014.mp4 465 | ./data/k400/train/cutting_watermelon/nptNhzUbf84_000008_000018.mp4 466 | ./data/k400/train/country_line_dancing/Fl-1W7wfK3k_000440_000450.mp4 467 | ./data/k400/train/washing_hands/g7Hf_lO2hhs_000000_000010.mp4 468 | ./data/k400/train/sharpening_pencil/sxuntmPAkjo_000018_000028.mp4 469 | ./data/k400/train/kicking_soccer_ball/PQ553um9QH4_000000_000010.mp4 470 | ./data/k400/train/riding_scooter/9b6b591H94Y_000136_000146.mp4 471 | ./data/k400/train/shining_shoes/o6pmNxuAljo_000236_000246.mp4 472 | ./data/k400/train/playing_harp/dUm8GcVpomU_000029_000039.mp4 473 | ./data/k400/train/checking_tires/28bTQiuymgs_000031_000041.mp4 474 | ./data/k400/train/laying_bricks/XlVtaE_QZjU_000161_000171.mp4 475 | ./data/k400/train/laughing/EFAurIEhAdE_000051_000061.mp4 476 | ./data/k400/train/belly_dancing/900sTBL7rUI_000128_000138.mp4 477 | ./data/k400/train/drop_kicking/5pUzceuqz-w_000000_000010.mp4 478 | ./data/k400/train/swinging_on_something/9kSg5QJ2z84_000020_000030.mp4 479 | ./data/k400/train/side_kick/1lNllJ5IESg_000000_000010.mp4 480 | ./data/k400/train/kicking_field_goal/nTPyaju9zEg_000000_000010.mp4 481 | ./data/k400/train/playing_tennis/V8q1X-CKpzY_000393_000403.mp4 482 | ./data/k400/train/abseiling/NhiwscssRb0_000169_000179.mp4 483 | ./data/k400/train/texting/OsUr8XhbG3A_000004_000014.mp4 484 | ./data/k400/train/checking_tires/QU84Ezgt72g_000105_000115.mp4 485 | ./data/k400/train/petting_cat/ThN1ni0FhN8_000043_000053.mp4 486 | ./data/k400/train/riding_mechanical_bull/JDEaFAgWNoY_000000_000010.mp4 487 | ./data/k400/train/planting_trees/kDFT-PHXO-I_000083_000093.mp4 488 | ./data/k400/train/washing_dishes/hnjP277hiWs_000014_000024.mp4 489 | ./data/k400/train/roller_skating/jlr8usSTblE_000054_000064.mp4 490 | ./data/k400/train/shuffling_cards/6X3g22u9xy0_000023_000033.mp4 491 | ./data/k400/train/eating_burger/k9b7fVSb87U_000089_000099.mp4 492 | ./data/k400/train/skateboarding/mFAKq6K0deM_000238_000248.mp4 493 | ./data/k400/train/brushing_teeth/m-VeRsi36f8_000051_000061.mp4 494 | ./data/k400/train/tobogganing/vBYs4r0kiSU_000005_000015.mp4 495 | ./data/k400/train/playing_saxophone/iYMbS6xDMzE_000061_000071.mp4 496 | ./data/k400/train/somersaulting/U6JVkSiGIoU_000001_000011.mp4 497 | ./data/k400/train/catching_or_throwing_baseball/XmDVmm7ifig_000037_000047.mp4 498 | ./data/k400/train/cooking_egg/91ctEhGwfhc_000063_000073.mp4 499 | ./data/k400/train/cartwheeling/SUXLVIOHEGI_000001_000011.mp4 500 | ./data/k400/train/baby_waking_up/mpWF-78r7R0_000001_000011.mp4 501 | ./data/k400/train/pumping_fist/SRQEHKDt5_Q_000016_000026.mp4 502 | ./data/k400/train/windsurfing/xKrpqWjK0SI_000020_000030.mp4 503 | ./data/k400/train/dancing_gangnam_style/XeVyk3JvAzU_000024_000034.mp4 504 | ./data/k400/train/counting_money/UB2teml6bTk_000014_000024.mp4 505 | ./data/k400/train/javelin_throw/N3mjBfSoPdM_000194_000204.mp4 506 | ./data/k400/train/making_sushi/lEKaN5Mu6AM_000618_000628.mp4 507 | ./data/k400/train/playing_poker/jGVtkq4UAmk_000035_000045.mp4 508 | ./data/k400/train/dunking_basketball/77zA8-fFruY_000136_000146.mp4 509 | ./data/k400/train/counting_money/haDEoNl1NN0_000288_000298.mp4 510 | ./data/k400/train/playing_trumpet/0olhNr566Z0_000018_000028.mp4 511 | ./data/k400/train/archery/GvocmM3wzM0_000024_000034.mp4 512 | ./data/k400/train/playing_harmonica/YDVwg3UNy4Q_000007_000017.mp4 513 | ./data/k400/train/presenting_weather_forecast/NxAohFYu47U_000004_000014.mp4 514 | ./data/k400/train/pull_ups/s92LydA1M68_000005_000015.mp4 515 | ./data/k400/train/dancing_charleston/MyJ-I-mNyAg_000100_000110.mp4 516 | ./data/k400/train/golf_chipping/Lq3Z3Jokazc_000056_000066.mp4 517 | ./data/k400/train/climbing_tree/jYuH_k75PAM_000007_000017.mp4 518 | ./data/k400/train/feeding_goats/NVUDSKSnhmU_000003_000013.mp4 519 | ./data/k400/train/spinning_poi/mWma2SwFHfs_000230_000240.mp4 520 | ./data/k400/train/climbing_ladder/b0wrzrHkZVI_000549_000559.mp4 521 | ./data/k400/train/playing_paintball/9iV1YGAh1pg_000088_000098.mp4 522 | ./data/k400/train/breading_or_breadcrumbing/-veWoU_yOjc_000313_000323.mp4 523 | ./data/k400/train/kissing/gkH0OzdyjRY_000420_000430.mp4 524 | ./data/k400/train/spinning_poi/3XOMRt-r18k_000162_000172.mp4 525 | ./data/k400/train/drop_kicking/a7n1NghFv8M_000000_000010.mp4 526 | ./data/k400/train/situp/Ym8oniLfKwY_000089_000099.mp4 527 | ./data/k400/train/strumming_guitar/wEBCIivKTs8_000214_000224.mp4 528 | ./data/k400/train/eating_spaghetti/tVwYHPT72Ms_000020_000030.mp4 529 | ./data/k400/train/texting/4EvMAimEl2c_000027_000037.mp4 530 | ./data/k400/train/watering_plants/Frj_rUvaBBQ_000067_000077.mp4 531 | ./data/k400/train/climbing_tree/axRmUvYiBvI_000000_000010.mp4 532 | ./data/k400/train/singing/k25Rbtq8xgM_000010_000020.mp4 533 | ./data/k400/train/throwing_discus/PlcF3tVlUFw_000009_000019.mp4 534 | ./data/k400/train/opening_bottle/FYIXv9gFiHw_000004_000014.mp4 535 | ./data/k400/train/playing_violin/QU6r3iv3bXg_000623_000633.mp4 536 | ./data/k400/train/cooking_chicken/onXWwmUiec8_000051_000061.mp4 537 | ./data/k400/train/situp/Yk8GGG_KHWo_000001_000011.mp4 538 | ./data/k400/train/cooking_egg/hCiGvnxRSmw_000117_000127.mp4 539 | ./data/k400/train/archery/J2KUXT9erug_000116_000126.mp4 540 | ./data/k400/train/playing_recorder/yuxPOjoC_9s_000019_000029.mp4 541 | ./data/k400/train/playing_accordion/iKFUWnPrD88_000460_000470.mp4 542 | ./data/k400/train/unboxing/yuTgEfsGOXA_000034_000044.mp4 543 | ./data/k400/train/tasting_food/U7P69596b6s_000319_000329.mp4 544 | ./data/k400/train/shooting_basketball/j06H8gugLDU_000029_000039.mp4 545 | ./data/k400/train/sniffing/IeO9vHVFZBY_000047_000057.mp4 546 | ./data/k400/train/tying_knot_(not_on_a_tie)/vFRg_0VXwko_000039_000049.mp4 547 | ./data/k400/train/petting_animal_(not_cat)/MgjoZa66Ydg_000041_000051.mp4 548 | ./data/k400/train/shuffling_cards/f6ZD1lDbW3M_000076_000086.mp4 549 | ./data/k400/train/slacklining/BmrNvVlWEew_000143_000153.mp4 550 | ./data/k400/train/side_kick/NFcVtRM9snU_000066_000076.mp4 551 | ./data/k400/train/slacklining/9YLkgr0EOy4_000072_000082.mp4 552 | ./data/k400/train/motorcycling/gYp5S2uVT9M_000000_000010.mp4 553 | ./data/k400/train/throwing_discus/72UO4SVoasM_000229_000239.mp4 554 | ./data/k400/train/playing_trumpet/ugLQrKRzp7U_000100_000110.mp4 555 | ./data/k400/train/breading_or_breadcrumbing/ofWcUbg3Ts8_000026_000036.mp4 556 | ./data/k400/train/belly_dancing/sk6dSAvd9kI_000048_000058.mp4 557 | ./data/k400/train/riding_mule/yWXCaQ1j-ys_000022_000032.mp4 558 | ./data/k400/train/spinning_poi/CSWUnaN6IEk_000053_000063.mp4 559 | ./data/k400/train/playing_clarinet/NUqYGc7pmfE_000222_000232.mp4 560 | ./data/k400/train/giving_or_receiving_award/92S7-sF6nh4_000161_000171.mp4 561 | ./data/k400/train/mopping_floor/izVoISZFeCE_000098_000108.mp4 562 | ./data/k400/train/unboxing/-n5SQx38lno_000042_000052.mp4 563 | ./data/k400/train/riding_camel/oVxyRMYyTpk_000009_000019.mp4 564 | ./data/k400/train/eating_carrots/y9gxk005Nlc_000236_000246.mp4 565 | ./data/k400/train/pole_vault/gWtfQki_IXQ_000003_000013.mp4 566 | ./data/k400/train/playing_didgeridoo/dyv6M0_hids_000015_000025.mp4 567 | ./data/k400/train/hula_hooping/3mZUhs1VLQI_000002_000012.mp4 568 | ./data/k400/train/dancing_ballet/7eyDYBH1tI4_000084_000094.mp4 569 | ./data/k400/train/digging/ziENL7pw3sw_000199_000209.mp4 570 | ./data/k400/train/sanding_floor/7LEIk7Ziyu8_000032_000042.mp4 571 | ./data/k400/train/watering_plants/Ve4hiEBR67s_000032_000042.mp4 572 | ./data/k400/train/bungee_jumping/zdu4lyk4xz0_000005_000015.mp4 573 | ./data/k400/train/cleaning_windows/8D53JaRR2sg_000012_000022.mp4 574 | ./data/k400/train/passing_American_football_(not_in_game)/jfvnG4M7Gkc_000013_000023.mp4 575 | ./data/k400/train/making_snowman/DU1esoZGz-I_000316_000326.mp4 576 | ./data/k400/train/swimming_butterfly_stroke/w1cg2xh4QEQ_000016_000026.mp4 577 | ./data/k400/train/extinguishing_fire/NFVlwDrEJ9g_000038_000048.mp4 578 | ./data/k400/train/yawning/F9ltZWk9UNk_000004_000014.mp4 579 | ./data/k400/train/extinguishing_fire/9OfwcKz3Ewg_000089_000099.mp4 580 | ./data/k400/train/skateboarding/5lPYzKOF094_000062_000072.mp4 581 | ./data/k400/train/smoking_hookah/TbEp71yugm4_000001_000011.mp4 582 | ./data/k400/train/filling_eyebrows/9RZ11COJYMs_000102_000112.mp4 583 | ./data/k400/train/front_raises/t-MzgW3KJ0E_000007_000017.mp4 584 | ./data/k400/train/crying/BGbMwSIXXFs_000004_000014.mp4 585 | ./data/k400/train/squat/1UDv-kWIpbk_000018_000028.mp4 586 | ./data/k400/train/skateboarding/AG8Ch9NZWC0_000155_000165.mp4 587 | ./data/k400/train/opening_present/rk2-v0OT0vk_000003_000013.mp4 588 | ./data/k400/train/paragliding/5Ur9g9yeP30_000668_000678.mp4 589 | ./data/k400/train/playing_squash_or_racquetball/NIywKuxBcQQ_000000_000010.mp4 590 | ./data/k400/train/pushing_cart/-pWAEIT0HRo_000005_000015.mp4 591 | ./data/k400/train/gymnastics_tumbling/xQcnSqpqz8M_000015_000025.mp4 592 | ./data/k400/train/playing_controller/QBpK4BKSs58_000447_000457.mp4 593 | ./data/k400/train/using_computer/RGK3dXTqFPU_000774_000784.mp4 594 | ./data/k400/train/bungee_jumping/Raui9-nf3Rw_000059_000069.mp4 595 | ./data/k400/train/golf_putting/inrRbySzL-0_000020_000030.mp4 596 | ./data/k400/train/ironing/rdc22kXrUuk_000071_000081.mp4 597 | ./data/k400/train/trimming_or_shaving_beard/yx_LWvl5REE_000054_000064.mp4 598 | ./data/k400/train/capoeira/Z6HC5IGiz6U_000021_000031.mp4 599 | ./data/k400/train/headbanging/9w1Zy5LG_lo_000003_000013.mp4 600 | ./data/k400/train/changing_oil/3Wn_aRXRdq4_000428_000438.mp4 601 | ./data/k400/train/picking_fruit/QnyaqZiioys_000098_000108.mp4 602 | ./data/k400/train/hurling_(sport)/M5OfNw6PEDg_000014_000024.mp4 603 | ./data/k400/train/passing_American_football_(in_game)/Gvs53nUj4fs_000005_000015.mp4 604 | ./data/k400/train/golf_putting/XpeJsEv4fb0_000025_000035.mp4 605 | ./data/k400/train/playing_kickball/AsygMA4mPlU_000361_000371.mp4 606 | ./data/k400/train/snorkeling/EFquDk1tiUQ_000137_000147.mp4 607 | ./data/k400/train/reading_book/qFs5LKBhcK8_000168_000178.mp4 608 | ./data/k400/train/jumping_into_pool/RwjKbYKbMfA_000003_000013.mp4 609 | ./data/k400/train/brushing_teeth/pErBXps0bJQ_000039_000049.mp4 610 | ./data/k400/train/hitting_baseball/Coj6eJDrhcQ_000034_000044.mp4 611 | ./data/k400/train/washing_dishes/hWoVvHQGHG8_000003_000013.mp4 612 | ./data/k400/train/braiding_hair/Ql1gINS0GzM_000087_000097.mp4 613 | ./data/k400/train/playing_cards/7zUL666ktPE_000136_000146.mp4 614 | ./data/k400/train/shaking_head/ELvgUR_pys0_000002_000012.mp4 615 | ./data/k400/train/kissing/1E9QtmaJwYc_000005_000015.mp4 616 | ./data/k400/train/abseiling/xYHDCgAK1qY_000008_000018.mp4 617 | ./data/k400/train/bench_pressing/5eHsO4sFIEA_000361_000371.mp4 618 | ./data/k400/train/throwing_discus/-_ilebHA71w_000002_000012.mp4 619 | ./data/k400/train/sharpening_pencil/7S3wzYsAQo8_000012_000022.mp4 620 | ./data/k400/train/sticking_tongue_out/4-4aEgmOUgY_000006_000016.mp4 621 | ./data/k400/train/catching_or_throwing_softball/Mwlp2PHtdgY_000002_000012.mp4 622 | ./data/k400/train/throwing_discus/o8pfFiKXEfY_000111_000121.mp4 623 | ./data/k400/train/playing_bass_guitar/BZaXNl4S7ew_000186_000196.mp4 624 | ./data/k400/train/shooting_goal_(soccer)/1sKTVJDctXI_000004_000014.mp4 625 | ./data/k400/train/trimming_or_shaving_beard/1e0s12MTcz4_000113_000123.mp4 626 | ./data/k400/train/changing_oil/3G4e_XNrqoE_000005_000015.mp4 627 | ./data/k400/train/playing_cards/TA4RECmaMF0_000259_000269.mp4 628 | ./data/k400/train/arm_wrestling/f2TZUGWu5Wo_000037_000047.mp4 629 | ./data/k400/train/building_cabinet/ZtXCKLdsfio_000092_000102.mp4 630 | ./data/k400/train/drinking_shots/sH-VZurC5sY_000004_000014.mp4 631 | ./data/k400/train/punching_bag/TjI5t0JAIJ0_000019_000029.mp4 632 | ./data/k400/train/juggling_fire/J-niA4RElAs_000003_000013.mp4 633 | ./data/k400/train/sticking_tongue_out/dvTaUjb-akc_000047_000057.mp4 634 | ./data/k400/train/flying_kite/J6o4OjdJWdg_000020_000030.mp4 635 | ./data/k400/train/juggling_balls/PB-9Y_dJa84_000015_000025.mp4 636 | ./data/k400/train/mowing_lawn/n6UW9o5VLGE_000000_000010.mp4 637 | ./data/k400/train/carving_pumpkin/6p7tzgVUG_8_000198_000208.mp4 638 | ./data/k400/train/capoeira/9Ewf7acZJvo_000019_000029.mp4 639 | ./data/k400/train/playing_accordion/aqNSkdugw1s_000025_000035.mp4 640 | ./data/k400/train/gymnastics_tumbling/WDsnAktr6C8_000004_000014.mp4 641 | ./data/k400/train/brushing_hair/jdAq65yxWZg_000004_000014.mp4 642 | ./data/k400/train/swimming_butterfly_stroke/zmiyhPop6GI_000002_000012.mp4 643 | ./data/k400/train/trimming_trees/JtXy6-uGkkc_000059_000069.mp4 644 | ./data/k400/train/swimming_butterfly_stroke/m-B0WtpNAY8_000005_000015.mp4 645 | ./data/k400/train/playing_paintball/Qmh6BHQIDtE_000578_000588.mp4 646 | ./data/k400/train/passing_American_football_(in_game)/mS0N2WsmsF4_000002_000012.mp4 647 | ./data/k400/train/tai_chi/cy061h50Jv4_000162_000172.mp4 648 | ./data/k400/train/windsurfing/IqMRCfgnqMU_000053_000063.mp4 649 | ./data/k400/train/playing_clarinet/UC5QXZe-_xk_000000_000010.mp4 650 | ./data/k400/train/grooming_dog/A5dvksPvo2g_000819_000829.mp4 651 | ./data/k400/train/hugging/LCcuaj-js0Q_000019_000029.mp4 652 | ./data/k400/train/playing_drums/R9P4CeDoYwQ_000205_000215.mp4 653 | ./data/k400/train/bookbinding/rJITw1HOKS4_000345_000355.mp4 654 | ./data/k400/train/presenting_weather_forecast/9GNnV6IC9yw_000045_000055.mp4 655 | ./data/k400/train/building_cabinet/qhDHYHLR4q0_000016_000026.mp4 656 | ./data/k400/train/marching/WxEwcj38h3E_000012_000022.mp4 657 | ./data/k400/train/playing_drums/CfFYHnUBccA_000015_000025.mp4 658 | ./data/k400/train/riding_or_walking_with_horse/sjQeoSKcJYw_000020_000030.mp4 659 | ./data/k400/train/bouncing_on_trampoline/YMMDvv6pbjs_000373_000383.mp4 660 | ./data/k400/train/washing_feet/xoQnV6DGf3c_000073_000083.mp4 661 | ./data/k400/train/hoverboarding/t-NZRwXxE_U_000002_000012.mp4 662 | ./data/k400/train/kissing/j5k1jxudUw4_000207_000217.mp4 663 | ./data/k400/train/giving_or_receiving_award/49dGjYIEd0E_000230_000240.mp4 664 | ./data/k400/train/eating_burger/aPcWjWpjLCI_000050_000060.mp4 665 | ./data/k400/train/cooking_chicken/8P2mxyyzZrs_000349_000359.mp4 666 | ./data/k400/train/washing_hands/lpqeHlR4-cg_000040_000050.mp4 667 | ./data/k400/train/ice_climbing/mk0kYtWXjJ8_000026_000036.mp4 668 | ./data/k400/train/applauding/ccUSiWKDkuo_000011_000021.mp4 669 | ./data/k400/train/opening_present/NaryKQfMHi0_000004_000014.mp4 670 | ./data/k400/train/tossing_coin/cM7BHG8p944_000010_000020.mp4 671 | ./data/k400/train/roller_skating/_q4rWF2wB3M_000065_000075.mp4 672 | ./data/k400/train/roller_skating/-Qa-Pl1PO-8_000093_000103.mp4 673 | ./data/k400/train/playing_accordion/XlxQcqTg-Rc_000003_000013.mp4 674 | ./data/k400/train/baking_cookies/YaMCJvAfRN0_000144_000154.mp4 675 | ./data/k400/train/cutting_pineapple/UZKg5mI7X3A_000000_000010.mp4 676 | ./data/k400/train/riding_mechanical_bull/BLfpG2nAfRM_000090_000100.mp4 677 | ./data/k400/train/sticking_tongue_out/6zMy1NcbL5Q_000152_000162.mp4 678 | ./data/k400/train/cleaning_floor/OokOW1YjFXI_000034_000044.mp4 679 | ./data/k400/train/brushing_teeth/Gl-rRsaMEY0_000037_000047.mp4 680 | ./data/k400/train/shooting_basketball/cFcYwSeMPWs_000049_000059.mp4 681 | ./data/k400/train/playing_volleyball/rh3Kg2EHhyA_000355_000365.mp4 682 | ./data/k400/train/waxing_legs/siB597QWq8U_000150_000160.mp4 683 | ./data/k400/train/headbanging/15AlcwCVWjQ_000091_000101.mp4 684 | ./data/k400/train/bungee_jumping/YvTQiQH9EOQ_000329_000339.mp4 685 | ./data/k400/train/shot_put/ie1eewuP2Kw_000012_000022.mp4 686 | ./data/k400/train/dribbling_basketball/W4bWujqZX6U_000152_000162.mp4 687 | ./data/k400/train/massaging_back/RkghdOAYKgY_000004_000014.mp4 688 | ./data/k400/train/blasting_sand/4mojOAxASZo_000099_000109.mp4 689 | ./data/k400/train/springboard_diving/uB14M35_Bos_000000_000010.mp4 690 | ./data/k400/train/dying_hair/F2iDsGsHXLU_000003_000013.mp4 691 | ./data/k400/train/crawling_baby/s-4W53pbbmg_000019_000029.mp4 692 | ./data/k400/train/bending_metal/1da2O_7L0rM_000021_000031.mp4 693 | ./data/k400/train/unboxing/H0Wn6-sTI00_000149_000159.mp4 694 | ./data/k400/train/country_line_dancing/C9NfoFUG2GM_000016_000026.mp4 695 | ./data/k400/train/opening_present/gbUs1Kol6tw_000383_000393.mp4 696 | ./data/k400/train/braiding_hair/MtKDlK2mrvs_000028_000038.mp4 697 | ./data/k400/train/playing_tennis/6hAhgEoJVH4_000013_000023.mp4 698 | ./data/k400/train/stretching_leg/2v9pfosX0Hw_000003_000013.mp4 699 | ./data/k400/train/celebrating/FeBZ7K-EsYQ_000015_000025.mp4 700 | ./data/k400/train/feeding_goats/3Z38euPxK8Y_000002_000012.mp4 701 | ./data/k400/train/shuffling_cards/RFImKIURWIs_000128_000138.mp4 702 | ./data/k400/train/front_raises/JoGO9DXEi6c_000004_000014.mp4 703 | ./data/k400/train/tossing_salad/an-7S-TR9_k_000085_000095.mp4 704 | ./data/k400/train/slapping/qOAd9RtvwR8_000005_000015.mp4 705 | ./data/k400/train/side_kick/RG7_nPvAN8k_000001_000011.mp4 706 | ./data/k400/train/playing_keyboard/ef-8QfgEAy4_000048_000058.mp4 707 | ./data/k400/train/tapping_guitar/xBgJiPxbQcE_000000_000010.mp4 708 | ./data/k400/train/checking_tires/EIdO8MfWdG4_000049_000059.mp4 709 | ./data/k400/train/golf_chipping/4A6K6_84MuE_000139_000149.mp4 710 | ./data/k400/train/washing_dishes/7hMrNlp_6Yc_000001_000011.mp4 711 | ./data/k400/train/high_jump/UEat4pJDZGI_000002_000012.mp4 712 | ./data/k400/train/playing_ice_hockey/qsA7PjQuw0E_000137_000147.mp4 713 | ./data/k400/train/rock_scissors_paper/CM0MzhHq6O8_000010_000020.mp4 714 | ./data/k400/train/long_jump/wnrs9We8sg0_000001_000011.mp4 715 | ./data/k400/train/juggling_fire/IQAtOgFugZE_000075_000085.mp4 716 | ./data/k400/train/flipping_pancake/PRlNKpG7Q6A_000000_000010.mp4 717 | ./data/k400/train/playing_bass_guitar/SWWHUgihev0_000263_000273.mp4 718 | ./data/k400/train/shoveling_snow/rtZe5fVDEAo_000023_000033.mp4 719 | ./data/k400/train/swimming_butterfly_stroke/rtI1fbz5EJ8_000003_000013.mp4 720 | ./data/k400/train/picking_fruit/XyRdro5HCio_000000_000010.mp4 721 | ./data/k400/train/shoveling_snow/ddcezLuxbJM_000154_000164.mp4 722 | ./data/k400/train/reading_book/UjCOiVHDxWM_000150_000160.mp4 723 | ./data/k400/train/bench_pressing/88VW6DU_FDY_000008_000018.mp4 724 | ./data/k400/train/baking_cookies/eGgTOkznvns_000137_000147.mp4 725 | ./data/k400/train/playing_monopoly/vjsyRzUMJ_Q_000061_000071.mp4 726 | ./data/k400/train/bench_pressing/7ZgKfs0iNS8_000000_000010.mp4 727 | ./data/k400/train/crossing_river/HmvPBQT_vzE_000003_000013.mp4 728 | ./data/k400/train/playing_controller/pUKaqMBCX3w_000255_000265.mp4 729 | ./data/k400/train/spinning_poi/TnEw6DvbM9w_000050_000060.mp4 730 | ./data/k400/train/lunge/DVxJ8ficPcI_000004_000014.mp4 731 | ./data/k400/train/snorkeling/e4fc1Q07TJE_000090_000100.mp4 732 | ./data/k400/train/archery/BKW8bLt2pwA_000012_000022.mp4 733 | ./data/k400/train/throwing_axe/zzT0jT6lO-g_000107_000117.mp4 734 | ./data/k400/train/planting_trees/u5iSQqV8OcY_000020_000030.mp4 735 | ./data/k400/train/busking/k_vl1YCEUg8_000039_000049.mp4 736 | ./data/k400/train/playing_guitar/Ky7PBJ6tTPk_000003_000013.mp4 737 | ./data/k400/train/cooking_chicken/zBVBbt6jvg0_000118_000128.mp4 738 | ./data/k400/train/grooming_horse/1jjWCAqF0Ds_000124_000134.mp4 739 | ./data/k400/train/stretching_arm/I6ik3T8T0zo_000007_000017.mp4 740 | ./data/k400/train/kissing/SJsVu8u0fxY_000000_000010.mp4 741 | ./data/k400/train/kitesurfing/sTeDdQ9ZWZQ_000149_000159.mp4 742 | ./data/k400/train/snowmobiling/CFK2hjamGTA_000003_000013.mp4 743 | ./data/k400/train/parasailing/8OioKa-E7UA_000178_000188.mp4 744 | ./data/k400/train/hitting_baseball/J76kih4001U_000130_000140.mp4 745 | ./data/k400/train/milking_cow/QPsMt2wmSfY_000017_000027.mp4 746 | ./data/k400/train/using_segway/u7Ur3qwcT2s_000009_000019.mp4 747 | ./data/k400/train/swimming_backstroke/OPXpLLrtOvI_000117_000127.mp4 748 | ./data/k400/train/baking_cookies/UxVnOPYmwXs_000169_000179.mp4 749 | ./data/k400/train/playing_bass_guitar/XvtkkYLyf9Y_000312_000322.mp4 750 | ./data/k400/train/riding_mechanical_bull/cxK1F9p6RHE_000028_000038.mp4 751 | ./data/k400/train/hoverboarding/DWIPIR-0X34_000027_000037.mp4 752 | ./data/k400/train/skipping_rope/cuLrj4k12Fg_000277_000287.mp4 753 | ./data/k400/train/eating_spaghetti/hLPd3VWyAus_000007_000017.mp4 754 | ./data/k400/train/kicking_soccer_ball/DPYPtAcobVc_000047_000057.mp4 755 | ./data/k400/train/strumming_guitar/YcbmOXVFw8o_000075_000085.mp4 756 | ./data/k400/train/drinking/5P0aeDse-Mk_000016_000026.mp4 757 | ./data/k400/train/shot_put/ymDORUGxJ8I_000043_000053.mp4 758 | ./data/k400/train/playing_harp/U7fzDddXBAc_000091_000101.mp4 759 | ./data/k400/train/punching_bag/Fn2ZtCvAkxk_000002_000012.mp4 760 | ./data/k400/train/mopping_floor/va0k9XDlKR0_000056_000066.mp4 761 | ./data/k400/train/tying_knot_(not_on_a_tie)/6Z2kiVMxVwA_000006_000016.mp4 762 | ./data/k400/train/massaging_person's_head/jESF7lIaSdw_000328_000338.mp4 763 | ./data/k400/train/cleaning_floor/Nmr8ilnQ1YQ_000000_000010.mp4 764 | ./data/k400/train/clapping/fpKGLEnXJf4_000082_000092.mp4 765 | ./data/k400/train/playing_tennis/lKj453qXpig_000714_000724.mp4 766 | ./data/k400/train/shaking_hands/B8Uf2dNAbEI_000004_000014.mp4 767 | ./data/k400/train/drumming_fingers/LSHRscNRZY4_000012_000022.mp4 768 | ./data/k400/train/shining_shoes/EQQum6aYcXM_000000_000010.mp4 769 | ./data/k400/train/playing_harp/xQR0RkcT64w_000045_000055.mp4 770 | ./data/k400/train/motorcycling/MBaN5YZxovo_000147_000157.mp4 771 | ./data/k400/train/kicking_field_goal/fYIcK0pLKmU_000067_000077.mp4 772 | ./data/k400/train/hurdling/L26o5TAE2cg_000005_000015.mp4 773 | ./data/k400/train/diving_cliff/dYmNkj40BIY_000001_000011.mp4 774 | ./data/k400/train/folding_paper/u2Sl7kMi3mg_000027_000037.mp4 775 | ./data/k400/train/laying_bricks/9eYRgZ8N5co_000012_000022.mp4 776 | ./data/k400/train/tickling/xPFdcaIFGYk_000008_000018.mp4 777 | ./data/k400/train/flipping_pancake/hz5dEktGV-8_000013_000023.mp4 778 | ./data/k400/train/playing_trombone/jlfVkMOg_Vo_000005_000015.mp4 779 | ./data/k400/train/getting_a_tattoo/ZZV0ro4Jpm4_000001_000011.mp4 780 | ./data/k400/train/hockey_stop/4bhSciBTKbE_000001_000011.mp4 781 | ./data/k400/train/abseiling/Z3_he4Ekb4A_000004_000014.mp4 782 | ./data/k400/train/swing_dancing/CBZrH_U8rm0_000037_000047.mp4 783 | ./data/k400/train/applying_cream/XQ0SH4MMImY_000014_000024.mp4 784 | ./data/k400/train/recording_music/WIssgNEXrrM_000132_000142.mp4 785 | ./data/k400/train/waiting_in_line/wzooKedC_Bk_000007_000017.mp4 786 | ./data/k400/train/checking_tires/4t2c7949GX8_000017_000027.mp4 787 | ./data/k400/train/deadlifting/X_WJPFdPd3c_000002_000012.mp4 788 | ./data/k400/train/playing_guitar/pBjmfYTdrYI_000023_000033.mp4 789 | ./data/k400/train/giving_or_receiving_award/myVFq_a16wk_000000_000010.mp4 790 | ./data/k400/train/roller_skating/r1rFeee92CM_000108_000118.mp4 791 | ./data/k400/train/water_sliding/Y3LxiI6lEdk_000115_000125.mp4 792 | ./data/k400/train/playing_recorder/2rgtfbSl4N8_000211_000221.mp4 793 | ./data/k400/train/playing_accordion/e8HirCDwcfo_000001_000011.mp4 794 | ./data/k400/train/bench_pressing/UbKDeT5N5h4_000008_000018.mp4 795 | ./data/k400/train/passing_American_football_(in_game)/f1UzpZTQn1E_000007_000017.mp4 796 | ./data/k400/train/lunge/kJsdOYcA0hQ_000002_000012.mp4 797 | ./data/k400/train/punching_bag/2BhB49WZWno_000032_000042.mp4 798 | ./data/k400/train/passing_American_football_(not_in_game)/KsET-f0B8hs_000000_000010.mp4 799 | ./data/k400/train/catching_fish/qKGCvogCWeY_000007_000017.mp4 800 | ./data/k400/train/texting/UScgY6sa25o_000006_000016.mp4 801 | ./data/k400/train/celebrating/LhHqTaG7B3E_000147_000157.mp4 802 | ./data/k400/train/swinging_legs/WJNIUG8vqrw_000000_000010.mp4 803 | ./data/k400/train/filling_eyebrows/sON2bBbiVgw_000191_000201.mp4 804 | ./data/k400/train/folding_paper/eQ_PdOcrhXU_000079_000089.mp4 805 | ./data/k400/train/hammer_throw/bvkMRG5hSu8_000015_000025.mp4 806 | ./data/k400/train/squat/Jjvcs49GNwM_000035_000045.mp4 807 | ./data/k400/train/playing_cards/Np_weC2SkFc_000146_000156.mp4 808 | ./data/k400/train/kicking_field_goal/K40_wVyH7eg_000001_000011.mp4 809 | ./data/k400/train/playing_squash_or_racquetball/yT3N3fGNMvQ_000023_000033.mp4 810 | ./data/k400/train/waxing_legs/bA9zXOleg1c_000080_000090.mp4 811 | ./data/k400/train/eating_ice_cream/vQHbWUydleY_000029_000039.mp4 812 | ./data/k400/train/celebrating/Gihv5CW9B-g_000606_000616.mp4 813 | ./data/k400/train/sled_dog_racing/r3DUMndDBdw_000569_000579.mp4 814 | ./data/k400/train/pumping_gas/fDqX7BOLgVA_000023_000033.mp4 815 | ./data/k400/train/ski_jumping/E2bokPjeIDo_000002_000012.mp4 816 | ./data/k400/train/crying/MKav96zQ4ak_000002_000012.mp4 817 | ./data/k400/train/country_line_dancing/sPzOCY2326M_000123_000133.mp4 818 | ./data/k400/train/snowboarding/_nh7qXmvM7Y_000001_000011.mp4 819 | ./data/k400/train/crawling_baby/spXUgGmezO8_000015_000025.mp4 820 | ./data/k400/train/cheerleading/4FKV6NOSnSw_000171_000181.mp4 821 | ./data/k400/train/feeding_goats/fnwmsEay0CQ_000028_000038.mp4 822 | ./data/k400/train/trapezing/KrcwyDxnroA_000006_000016.mp4 823 | ./data/k400/train/yawning/u8mEQKUTjSs_000114_000124.mp4 824 | ./data/k400/train/throwing_ball/hJeXc6JlnUY_000048_000058.mp4 825 | ./data/k400/train/carving_pumpkin/Dx8Sdc1tMv0_000003_000013.mp4 826 | ./data/k400/train/playing_harmonica/DMAccQCyGjo_000022_000032.mp4 827 | ./data/k400/train/juggling_balls/heei6xzCz5s_000273_000283.mp4 828 | ./data/k400/train/tying_bow_tie/L1gIOvEJ0hY_000013_000023.mp4 829 | ./data/k400/train/using_remote_controller_(not_gaming)/-TJSxFWnx3I_000010_000020.mp4 830 | ./data/k400/train/dunking_basketball/kd3RTJfkrpg_000022_000032.mp4 831 | ./data/k400/train/catching_or_throwing_frisbee/yi7277FYUTU_000078_000088.mp4 832 | ./data/k400/train/throwing_discus/iPVmgPcYWpM_000001_000011.mp4 833 | ./data/k400/train/using_computer/RtkdvjENZKA_000006_000016.mp4 834 | ./data/k400/train/hitting_baseball/TkYPTgsstnE_000190_000200.mp4 835 | ./data/k400/train/smoking/J01wfosQBlU_000455_000465.mp4 836 | ./data/k400/train/riding_or_walking_with_horse/gQ0BywBPK5A_000046_000056.mp4 837 | ./data/k400/train/pole_vault/EDsfBndAvhI_000007_000017.mp4 838 | ./data/k400/train/playing_trumpet/j_tSjkfrE0c_000076_000086.mp4 839 | ./data/k400/train/driving_car/sV4UtxxgVKg_000094_000104.mp4 840 | ./data/k400/train/archery/vZXCgVUDetM_000008_000018.mp4 841 | ./data/k400/train/catching_or_throwing_softball/I-IBbz4hCKs_000162_000172.mp4 842 | ./data/k400/train/shredding_paper/V1gt0K_Z-ZA_000093_000103.mp4 843 | ./data/k400/train/skiing_crosscountry/pk23yTYOKa0_000002_000012.mp4 844 | ./data/k400/train/playing_bass_guitar/NyysGodefh4_000065_000075.mp4 845 | ./data/k400/train/surfing_crowd/MTmiIUh6WHs_000039_000049.mp4 846 | ./data/k400/train/paragliding/wuZb463MINk_000131_000141.mp4 847 | ./data/k400/train/mowing_lawn/GraKLGSFt4o_000002_000012.mp4 848 | ./data/k400/train/grooming_horse/yiK3aZyM_C8_000298_000308.mp4 849 | ./data/k400/train/trimming_or_shaving_beard/dKef9hSGrI8_000558_000568.mp4 850 | ./data/k400/train/shooting_goal_(soccer)/1kZ7ese1KBQ_000008_000018.mp4 851 | ./data/k400/train/playing_chess/1Hz8mzqWG7s_000060_000070.mp4 852 | ./data/k400/train/cutting_watermelon/tuYaOC2iPpY_000020_000030.mp4 853 | ./data/k400/train/contact_juggling/fLfUZuxukNI_000130_000140.mp4 854 | ./data/k400/train/shot_put/rgBAW5ukqog_000125_000135.mp4 855 | ./data/k400/train/headbutting/SSMYwrF9m0o_000007_000017.mp4 856 | ./data/k400/train/shot_put/9tnD5BsNBUQ_000001_000011.mp4 857 | ./data/k400/train/riding_camel/nfHyp7hsVPs_000014_000024.mp4 858 | ./data/k400/train/presenting_weather_forecast/BmA2pUO0lqA_000073_000083.mp4 859 | ./data/k400/train/counting_money/HIcCRDboOH8_000005_000015.mp4 860 | ./data/k400/train/massaging_feet/Mrjlyp0vinE_000003_000013.mp4 861 | ./data/k400/train/playing_ice_hockey/Z6_jNpn3_sY_000002_000012.mp4 862 | ./data/k400/train/deadlifting/3WlS6-AvL7Q_000014_000024.mp4 863 | ./data/k400/train/cartwheeling/mQegNsvQvdY_000002_000012.mp4 864 | ./data/k400/train/pumping_fist/YnuWzFbBG2s_000001_000011.mp4 865 | ./data/k400/train/bench_pressing/pCDNrpLctr8_000059_000069.mp4 866 | ./data/k400/train/surfing_crowd/Q7Y-9q9xci0_000013_000023.mp4 867 | ./data/k400/train/punching_bag/d9b7uzN5ICQ_000002_000012.mp4 868 | ./data/k400/train/playing_paintball/HXWxd7yye8U_000195_000205.mp4 869 | ./data/k400/train/ski_jumping/zWAQAV1_-bg_000001_000011.mp4 870 | ./data/k400/train/spinning_poi/a0PFzcojMHI_000136_000146.mp4 871 | ./data/k400/train/snorkeling/ubRxJfGzZPo_000003_000013.mp4 872 | ./data/k400/train/playing_ukulele/cLXxIk6HwR4_000034_000044.mp4 873 | ./data/k400/train/using_computer/ouSHtL-1Q3w_000011_000021.mp4 874 | ./data/k400/train/cleaning_shoes/4mcjsWQE4Pc_000001_000011.mp4 875 | ./data/k400/train/breakdancing/GaoWe9GBFWg_000027_000037.mp4 876 | ./data/k400/train/shaving_head/4lRcCUMuxvI_000126_000136.mp4 877 | ./data/k400/train/holding_snake/kydf6QCQBpg_000014_000024.mp4 878 | ./data/k400/train/ice_skating/O-rT1HVSSkU_000267_000277.mp4 879 | ./data/k400/train/making_bed/M49-lieD7Bo_000374_000384.mp4 880 | ./data/k400/train/digging/Xj1Vxl3KVDI_000037_000047.mp4 881 | ./data/k400/train/playing_accordion/6WM7MIx_zb4_000003_000013.mp4 882 | ./data/k400/train/playing_drums/U3jq1bM8qsA_000220_000230.mp4 883 | ./data/k400/train/snorkeling/W33DpPkm2xA_000151_000161.mp4 884 | ./data/k400/train/catching_or_throwing_softball/k4EXaCFOzZU_000050_000060.mp4 885 | ./data/k400/train/cheerleading/kjfvC1j_fm0_000141_000151.mp4 886 | ./data/k400/train/playing_cards/rggVVofSPRc_000029_000039.mp4 887 | ./data/k400/train/riding_mule/al1zWDEqVnQ_000208_000218.mp4 888 | ./data/k400/train/dancing_ballet/Ait1hWgXVGo_000067_000077.mp4 889 | ./data/k400/train/eating_spaghetti/yA_lfu4xzQw_000002_000012.mp4 890 | ./data/k400/train/shooting_basketball/KOKz7h7HwAM_000239_000249.mp4 891 | ./data/k400/train/drawing/5SzpfQioUrA_000002_000012.mp4 892 | ./data/k400/train/squat/ZGkdt3pg3f0_000017_000027.mp4 893 | ./data/k400/train/whistling/syFSCzFcy6M_000238_000248.mp4 894 | ./data/k400/train/dancing_ballet/znh-a4wtytQ_000080_000090.mp4 895 | ./data/k400/train/playing_didgeridoo/ECISEqoxcSI_000022_000032.mp4 896 | ./data/k400/train/paragliding/c1DXGb2w_Fk_000002_000012.mp4 897 | ./data/k400/train/blowing_out_candles/GrnoLIAfeVU_000027_000037.mp4 898 | ./data/k400/train/hitting_baseball/n38f77sS0ug_000284_000294.mp4 899 | ./data/k400/train/tai_chi/vpnBkThOkIY_000395_000405.mp4 900 | ./data/k400/train/ironing/mLclsXQyPEg_000041_000051.mp4 901 | ./data/k400/train/reading_book/sSCDduQdz0k_000058_000068.mp4 902 | ./data/k400/train/chopping_wood/PDsuNO-IWu0_000107_000117.mp4 903 | ./data/k400/train/bandaging/W33Jy0bBbgI_000049_000059.mp4 904 | ./data/k400/train/scuba_diving/e-5OE-Vs5LU_000308_000318.mp4 905 | ./data/k400/train/brushing_teeth/bWbFC7lONV4_000002_000012.mp4 906 | ./data/k400/train/swinging_on_something/MujSIp5jp40_000011_000021.mp4 907 | ./data/k400/train/faceplanting/5dBPyR3MrKA_000004_000014.mp4 908 | ./data/k400/train/playing_saxophone/WoNVy6g-U_8_000009_000019.mp4 909 | ./data/k400/train/pole_vault/JO7XkPfLBLs_000003_000013.mp4 910 | ./data/k400/train/lunge/Sw3mzTkn28I_000003_000013.mp4 911 | ./data/k400/train/playing_basketball/cKIBTdKQX7M_000027_000037.mp4 912 | ./data/k400/train/pushing_wheelchair/G9t5bnS80mg_000143_000153.mp4 913 | ./data/k400/train/laughing/lre1kr7S9Ic_000352_000362.mp4 914 | ./data/k400/train/spray_painting/3qa1Nxnhrv8_000032_000042.mp4 915 | ./data/k400/train/dribbling_basketball/yq105AO1C7E_000000_000010.mp4 916 | ./data/k400/train/drinking_shots/bAqRbiF4rQQ_000000_000010.mp4 917 | ./data/k400/train/passing_American_football_(not_in_game)/Ho1BxNYR7rk_000004_000014.mp4 918 | ./data/k400/train/making_pizza/wFGMNfTBD8Q_000115_000125.mp4 919 | ./data/k400/train/extinguishing_fire/1U7nEEaryE0_000027_000037.mp4 920 | ./data/k400/train/country_line_dancing/ITMn93jk2cM_000009_000019.mp4 921 | ./data/k400/train/folding_paper/Dhl-3cbRUIc_000101_000111.mp4 922 | ./data/k400/train/playing_cello/uyrDRtLF1cU_000106_000116.mp4 923 | ./data/k400/train/playing_saxophone/7B8rIljPzQM_000162_000172.mp4 924 | ./data/k400/train/playing_trombone/uFtf0blPIKg_000016_000026.mp4 925 | ./data/k400/train/playing_ukulele/7s7xLnFsWP0_000279_000289.mp4 926 | ./data/k400/train/changing_oil/fujorDtjlUc_000472_000482.mp4 927 | ./data/k400/train/belly_dancing/mlxenrCJ_wQ_000100_000110.mp4 928 | ./data/k400/train/singing/GKntJHEySBQ_000155_000165.mp4 929 | ./data/k400/train/cracking_neck/CsJNrmbfPKw_000001_000011.mp4 930 | ./data/k400/train/golf_driving/xUDJzhgDQkc_000001_000011.mp4 931 | ./data/k400/train/yawning/gN26L2WZ3ZE_000654_000664.mp4 932 | ./data/k400/train/barbequing/4JFYAgtCRLs_000027_000037.mp4 933 | ./data/k400/train/golf_driving/nIetoBhHby8_000044_000054.mp4 934 | ./data/k400/train/ski_jumping/nySu8FEBIYo_000186_000196.mp4 935 | ./data/k400/train/spinning_poi/dhqU83hjoVA_000111_000121.mp4 936 | ./data/k400/train/parkour/egeiOXjfrgc_000002_000012.mp4 937 | ./data/k400/train/stretching_leg/YHJbvf4TW2Y_000308_000318.mp4 938 | ./data/k400/train/windsurfing/e3JqufJX9jQ_000006_000016.mp4 939 | ./data/k400/train/shaking_hands/LeDVXYOG2ug_000004_000014.mp4 940 | ./data/k400/train/training_dog/5Jxuf29lUfM_000036_000046.mp4 941 | ./data/k400/train/opening_present/iSqIFOVMJ4U_000194_000204.mp4 942 | ./data/k400/train/punching_bag/JyTcSSES5fM_000429_000439.mp4 943 | ./data/k400/train/playing_kickball/DKqNoXH4YzI_000114_000124.mp4 944 | ./data/k400/train/swimming_butterfly_stroke/OjXJ0KHRJR8_000008_000018.mp4 945 | ./data/k400/train/flipping_pancake/FBP1EJ2GZBo_000008_000018.mp4 946 | ./data/k400/train/biking_through_snow/sJvs6KWRa60_000005_000015.mp4 947 | ./data/k400/train/opening_present/z4C-oTtrj2Y_000039_000049.mp4 948 | ./data/k400/train/unboxing/WWncrvCjq24_000196_000206.mp4 949 | ./data/k400/train/chopping_wood/qPBtTAkM4wE_000073_000083.mp4 950 | ./data/k400/train/tasting_beer/G0h1cBlFIq8_000080_000090.mp4 951 | ./data/k400/train/playing_basketball/GSG5Duoe6Is_000001_000011.mp4 952 | ./data/k400/train/eating_watermelon/alL1aklDsas_000039_000049.mp4 953 | ./data/k400/train/yawning/Xky9RlAhlYc_000010_000020.mp4 954 | ./data/k400/train/catching_or_throwing_baseball/bK05D61SXmM_000046_000056.mp4 955 | ./data/k400/train/barbequing/Q159stbLAQY_000102_000112.mp4 956 | ./data/k400/train/shot_put/k3jU3n3KdVA_000004_000014.mp4 957 | ./data/k400/train/stretching_leg/r0V8uwiJybE_000001_000011.mp4 958 | ./data/k400/train/smoking_hookah/X5JhLiK97wM_000003_000013.mp4 959 | ./data/k400/train/jumpstyle_dancing/k_7b0za9KBw_000001_000011.mp4 960 | ./data/k400/train/making_a_cake/yYA_eukxxX8_000071_000081.mp4 961 | ./data/k400/train/jumping_into_pool/ZJORNQe9IVg_000221_000231.mp4 962 | ./data/k400/train/driving_tractor/sW0aXNcfDEU_000021_000031.mp4 963 | ./data/k400/train/unboxing/nLg8T116iM4_000124_000134.mp4 964 | ./data/k400/train/pull_ups/HSrGAlk5ouQ_000006_000016.mp4 965 | ./data/k400/train/tai_chi/GL3MWtPkh_8_000006_000016.mp4 966 | ./data/k400/train/catching_or_throwing_frisbee/BUkSnZ5EhmA_000000_000010.mp4 967 | ./data/k400/train/tai_chi/RSA8KqxX0YI_000093_000103.mp4 968 | ./data/k400/train/riding_or_walking_with_horse/R9PWrI1JQvM_000028_000038.mp4 969 | ./data/k400/train/somersaulting/MiN84MPUlLk_000000_000010.mp4 970 | ./data/k400/train/driving_tractor/IIsvf-BsIZ8_000036_000046.mp4 971 | ./data/k400/train/tasting_food/Xo2k-MMFhEU_000016_000026.mp4 972 | ./data/k400/train/blowing_glass/vPrAqjI7jEo_000021_000031.mp4 973 | ./data/k400/train/riding_elephant/_CpFSSNnXnA_000002_000012.mp4 974 | ./data/k400/train/laying_bricks/8FRmXkGFNzA_000103_000113.mp4 975 | ./data/k400/train/playing_harmonica/5MWGD9PaNtA_000033_000043.mp4 976 | ./data/k400/train/playing_controller/LDDgU6U4y94_000097_000107.mp4 977 | ./data/k400/train/ice_skating/FV9conjC2K8_000013_000023.mp4 978 | ./data/k400/train/mowing_lawn/eTO9nRlNzTg_000016_000026.mp4 979 | ./data/k400/train/spray_painting/JDwUdBARYpY_000122_000132.mp4 980 | ./data/k400/train/bungee_jumping/HK0ZvkNXeu8_000083_000093.mp4 981 | ./data/k400/train/triple_jump/JqQ7rgcdwiM_000002_000012.mp4 982 | ./data/k400/train/pushing_wheelchair/OUU9pBtuDdI_000018_000028.mp4 983 | ./data/k400/train/driving_tractor/Rh99XQQauHY_000019_000029.mp4 984 | ./data/k400/train/opening_bottle/MZEERAUavmk_000148_000158.mp4 985 | ./data/k400/train/flying_kite/j_--68GhQXs_000000_000010.mp4 986 | ./data/k400/train/peeling_potatoes/6UURLltL7tU_000007_000017.mp4 987 | ./data/k400/train/deadlifting/COVisA5nW9Y_000000_000010.mp4 988 | ./data/k400/train/triple_jump/Lhdc8b1MJkc_000007_000017.mp4 989 | ./data/k400/train/breakdancing/mj3vbaYxcwo_000014_000024.mp4 990 | ./data/k400/train/bookbinding/AlgneUHdEus_000138_000148.mp4 991 | ./data/k400/train/tying_bow_tie/OGepR8mw62A_000065_000075.mp4 992 | ./data/k400/train/using_computer/XwUcH51dXYc_000020_000030.mp4 993 | ./data/k400/train/rock_scissors_paper/JWgepYXaBeQ_000002_000012.mp4 994 | ./data/k400/train/stretching_arm/X2-ADQDfz-M_000037_000047.mp4 995 | ./data/k400/train/skiing_(not_slalom_or_crosscountry)/usUkySVWe5Y_000401_000411.mp4 996 | ./data/k400/train/dying_hair/qe2a7Cph1jY_000224_000234.mp4 997 | ./data/k400/train/catching_or_throwing_frisbee/UwFLiTQ4zRI_000003_000013.mp4 998 | ./data/k400/train/shoveling_snow/7BuVXd34G8A_000030_000040.mp4 999 | ./data/k400/train/using_computer/Df8qKN0H36k_000134_000144.mp4 1000 | ./data/k400/train/using_remote_controller_(not_gaming)/BZvYUO25TLU_000002_000012.mp4 1001 | ./data/k400/train/setting_table/RCpjz9aIvYo_000013_000023.mp4 1002 | ./data/k400/train/rock_scissors_paper/ibyHH6G0fck_000277_000287.mp4 1003 | ./data/k400/train/skiing_slalom/9fvf2LGLdMM_000183_000193.mp4 1004 | ./data/k400/train/archery/sZrclJsEQ9E_000002_000012.mp4 1005 | ./data/k400/train/cleaning_windows/n1mYGIucxl0_000043_000053.mp4 1006 | ./data/k400/train/making_jewelry/ab4jG-Wdsu4_000199_000209.mp4 1007 | ./data/k400/train/water_sliding/aTFQz6zvZ7Q_000085_000095.mp4 1008 | ./data/k400/train/presenting_weather_forecast/q2DEVINVkGc_000057_000067.mp4 1009 | ./data/k400/train/kissing/vEAq4dNAhis_000013_000023.mp4 1010 | ./data/k400/train/passing_American_football_(not_in_game)/EG8FQtI24oc_000041_000051.mp4 1011 | ./data/k400/train/headbanging/ez_P4Y1y95U_000003_000013.mp4 1012 | ./data/k400/train/tap_dancing/6ax7EAGFVAg_000012_000022.mp4 1013 | ./data/k400/train/bowling/nu7wUzmPGlo_000102_000112.mp4 1014 | ./data/k400/train/capoeira/UXCCADpPjHY_000248_000258.mp4 1015 | ./data/k400/train/cleaning_toilet/d4X6fO3vnRE_000003_000013.mp4 1016 | ./data/k400/train/dying_hair/tWnS_LqBPWE_000706_000716.mp4 1017 | ./data/k400/train/swimming_breast_stroke/mu8WxWoBSIk_000024_000034.mp4 1018 | ./data/k400/train/trapezing/ObsiNi-2Tl0_000196_000206.mp4 1019 | ./data/k400/train/riding_mechanical_bull/isU_y8IBFys_000045_000055.mp4 1020 | ./data/k400/train/dancing_charleston/S6I2wS10FXc_000084_000094.mp4 1021 | ./data/k400/train/playing_clarinet/B-NllEIfMug_000000_000010.mp4 1022 | ./data/k400/train/playing_chess/ekbXzK_SDEg_000020_000030.mp4 1023 | ./data/k400/train/throwing_axe/t3IGD15z3NE_000030_000040.mp4 1024 | ./data/k400/train/pushing_cart/A_cHXIpY814_000000_000010.mp4 1025 | ./data/k400/train/riding_elephant/JhP8TZwurk8_000142_000152.mp4 1026 | ./data/k400/train/arm_wrestling/wTGik6UmhwY_000004_000014.mp4 1027 | ./data/k400/train/washing_dishes/h5Et8y9vskM_000308_000318.mp4 1028 | ./data/k400/train/dancing_ballet/CSEwkXFRIZw_000120_000130.mp4 1029 | ./data/k400/train/brushing_hair/GZOrIQ4ve9U_000006_000016.mp4 1030 | ./data/k400/train/taking_a_shower/szfsZstwcqY_000002_000012.mp4 1031 | ./data/k400/train/opening_bottle/rJ7PZcjOm-8_000006_000016.mp4 1032 | ./data/k400/train/playing_monopoly/TDKBS3Io46U_000020_000030.mp4 1033 | ./data/k400/train/answering_questions/ZSTEV9l2qT8_000099_000109.mp4 1034 | ./data/k400/train/throwing_discus/rNSusXFbqXQ_000003_000013.mp4 1035 | ./data/k400/train/brushing_teeth/BvArJ0POy5Q_000025_000035.mp4 1036 | ./data/k400/train/folding_paper/5zFrWmXrJas_000094_000104.mp4 1037 | ./data/k400/train/pumping_fist/2jFINN9maKo_000010_000020.mp4 1038 | ./data/k400/train/celebrating/Ry4XIHpJ_mk_000003_000013.mp4 1039 | ./data/k400/train/juggling_fire/5iCLt7Xp-gI_000000_000010.mp4 1040 | ./data/k400/train/playing_basketball/_inLeoezp4Y_000019_000029.mp4 1041 | ./data/k400/train/playing_kickball/3GznvUGWPLQ_000026_000036.mp4 1042 | ./data/k400/train/finger_snapping/mwVut3f3Rik_000001_000011.mp4 1043 | ./data/k400/train/playing_paintball/_9F4G9gFAAo_000015_000025.mp4 1044 | ./data/k400/train/playing_harp/7mfKRF1N8sw_000001_000011.mp4 1045 | ./data/k400/train/playing_harmonica/ZhGUG3eWbAs_000003_000013.mp4 1046 | ./data/k400/train/shearing_sheep/Zp0AswAXdSM_000047_000057.mp4 1047 | ./data/k400/train/hitting_baseball/FqN63SYavVo_000003_000013.mp4 1048 | ./data/k400/train/massaging_back/Q0zbRHQMrU0_000684_000694.mp4 1049 | ./data/k400/train/yoga/Q8YotA-xr-c_000804_000814.mp4 1050 | ./data/k400/train/beatboxing/9GLzI7zJfV4_000004_000014.mp4 1051 | ./data/k400/train/playing_piano/BWTQThKl96k_000015_000025.mp4 1052 | ./data/k400/train/scuba_diving/2uqIVk32AbQ_000604_000614.mp4 1053 | ./data/k400/train/playing_violin/RzKGUfDbflg_000030_000040.mp4 1054 | ./data/k400/train/high_kick/cq6Oqw6lt58_000020_000030.mp4 1055 | ./data/k400/train/cleaning_windows/arLeRdzI1pU_000124_000134.mp4 1056 | ./data/k400/train/arranging_flowers/rsn6wYupDEc_000514_000524.mp4 1057 | ./data/k400/train/snowboarding/c66fA5EDDpc_000008_000018.mp4 1058 | ./data/k400/train/golf_driving/gltzbMgb1Cc_000003_000013.mp4 1059 | ./data/k400/train/scrambling_eggs/lybopmyyiuE_000025_000035.mp4 1060 | ./data/k400/train/blowing_out_candles/br2i-yLnCJw_000000_000010.mp4 1061 | ./data/k400/train/playing_accordion/abJxmLWZ3cM_000034_000044.mp4 1062 | ./data/k400/train/jumping_into_pool/QD_F25bQvcs_000009_000019.mp4 1063 | ./data/k400/train/playing_chess/Foho9WaH7Ys_000192_000202.mp4 1064 | ./data/k400/train/folding_napkins/62UCHhTK6mo_000116_000126.mp4 1065 | ./data/k400/train/golf_putting/m4v4WF5gMYY_000093_000103.mp4 1066 | ./data/k400/train/dancing_gangnam_style/hmL-nXOCkOg_000006_000016.mp4 1067 | ./data/k400/train/country_line_dancing/ReFdorUY2Yo_000009_000019.mp4 1068 | ./data/k400/train/tobogganing/09sJMAYdrqE_000002_000012.mp4 1069 | ./data/k400/train/javelin_throw/cuFNBh0jAvk_000131_000141.mp4 1070 | ./data/k400/train/playing_paintball/hA0cF69q9-w_000080_000090.mp4 1071 | ./data/k400/train/swimming_backstroke/ijGBuMHfZ8o_000077_000087.mp4 1072 | ./data/k400/train/canoeing_or_kayaking/Ygo9qX37aus_000001_000011.mp4 1073 | ./data/k400/train/headbutting/D0HYMnwKdsw_000007_000017.mp4 1074 | ./data/k400/train/cartwheeling/AHy2285FiCQ_000011_000021.mp4 1075 | ./data/k400/train/playing_tennis/fX3ODEnJsQw_000002_000012.mp4 1076 | ./data/k400/train/zumba/rHxw6ALSasA_000012_000022.mp4 1077 | ./data/k400/train/shaving_head/iuvn7CezjKI_000001_000011.mp4 1078 | ./data/k400/train/snatch_weight_lifting/0i0AtWrNISM_000024_000034.mp4 1079 | ./data/k400/train/triple_jump/D2hki1HYFcY_000001_000011.mp4 1080 | ./data/k400/train/snorkeling/sOHtXHT9aGQ_000026_000036.mp4 1081 | ./data/k400/train/singing/_tUi_pu-OLY_000002_000012.mp4 1082 | ./data/k400/train/juggling_fire/kXnvVtnDtX4_000047_000057.mp4 1083 | ./data/k400/train/playing_cards/3WijbFcKCH0_000038_000048.mp4 1084 | ./data/k400/train/milking_cow/Dx7nBjnj6Kc_000052_000062.mp4 1085 | ./data/k400/train/skiing_slalom/loXwIpM7vTU_000050_000060.mp4 1086 | ./data/k400/train/hula_hooping/F4lj9pyecWc_000043_000053.mp4 1087 | ./data/k400/train/playing_trumpet/PgKkdvEpfG4_000000_000010.mp4 1088 | ./data/k400/train/drawing/u9XWr3kjdb8_000105_000115.mp4 1089 | ./data/k400/train/zumba/0FfA-kyjP-E_000007_000017.mp4 1090 | ./data/k400/train/cleaning_toilet/o0WIXGyPT_E_000010_000020.mp4 1091 | ./data/k400/train/playing_tennis/L2YQRgPJdQU_000448_000458.mp4 1092 | ./data/k400/train/crying/WwP-cOBpf1c_000063_000073.mp4 1093 | ./data/k400/train/auctioning/VXJW8BdLhBw_000093_000103.mp4 1094 | ./data/k400/train/swimming_backstroke/tqQMlE9ZMmM_000016_000026.mp4 1095 | ./data/k400/train/opening_bottle/Ozu3yc1OSx8_000003_000013.mp4 1096 | ./data/k400/train/throwing_axe/m-0kL0N5h6c_000001_000011.mp4 1097 | ./data/k400/train/knitting/npEUyhNN5y8_000063_000073.mp4 1098 | ./data/k400/train/opening_bottle/gT2TCNTYThM_000004_000014.mp4 1099 | ./data/k400/train/smoking/v4MCH5lKlEM_000219_000229.mp4 1100 | ./data/k400/train/yoga/S6t5KHqoYQ8_000003_000013.mp4 1101 | ./data/k400/train/using_computer/ycscjTYCrAY_000047_000057.mp4 1102 | ./data/k400/train/punching_bag/SIW67lRsl4U_000029_000039.mp4 1103 | ./data/k400/train/opening_bottle/lwkke6TgDJw_000003_000013.mp4 1104 | ./data/k400/train/eating_spaghetti/kUQlst5MpAg_000008_000018.mp4 1105 | ./data/k400/train/bending_back/hovMp9S1cEI_000050_000060.mp4 1106 | ./data/k400/train/eating_chips/jklcDe9-Xdg_000731_000741.mp4 1107 | ./data/k400/train/kicking_soccer_ball/gA91c5miHtE_000036_000046.mp4 1108 | ./data/k400/train/playing_cymbals/05dnFrtUqDg_000087_000097.mp4 1109 | ./data/k400/train/swimming_breast_stroke/df-ygdNM-6A_000017_000027.mp4 1110 | ./data/k400/train/drumming_fingers/s9kShqkPo-0_000108_000118.mp4 1111 | ./data/k400/train/driving_car/YaTTjnl-oCU_000025_000035.mp4 1112 | ./data/k400/train/filling_eyebrows/kcG0ggTltZo_000144_000154.mp4 1113 | ./data/k400/train/blowing_glass/2k1TJ5D6c7E_000084_000094.mp4 1114 | ./data/k400/train/kicking_field_goal/F9NS3s7xQRY_000040_000050.mp4 1115 | ./data/k400/train/marching/JmZjYqcy0u4_000094_000104.mp4 1116 | ./data/k400/train/baking_cookies/A2bNrvS3lyQ_000254_000264.mp4 1117 | ./data/k400/train/hopscotch/3L0MnbQkLWM_000076_000086.mp4 1118 | ./data/k400/train/folding_paper/_ZX563Q7G0I_000094_000104.mp4 1119 | ./data/k400/train/playing_badminton/lgQcSMT4o1s_000013_000023.mp4 1120 | ./data/k400/train/changing_oil/TbUWMVcpsxA_000119_000129.mp4 1121 | ./data/k400/train/exercising_arm/CPwcMlFFUTg_000030_000040.mp4 1122 | ./data/k400/train/cheerleading/TWNtk6p9hD8_000037_000047.mp4 1123 | ./data/k400/train/flying_kite/XcCWBGG8qCs_000001_000011.mp4 1124 | ./data/k400/train/hoverboarding/S56WPhl5no0_000039_000049.mp4 1125 | ./data/k400/train/yoga/ViqcOxoRbJM_000214_000224.mp4 1126 | ./data/k400/train/kitesurfing/Nf7PQsgr9rg_000008_000018.mp4 1127 | ./data/k400/train/swimming_butterfly_stroke/I9VWpj459XQ_000015_000025.mp4 1128 | ./data/k400/train/zumba/ZPiTK8QzpoA_000048_000058.mp4 1129 | ./data/k400/train/shot_put/B38LheJ79d4_000020_000030.mp4 1130 | ./data/k400/train/brushing_teeth/GwkucVZ9LgQ_000077_000087.mp4 1131 | ./data/k400/train/playing_violin/m6ZE0ukP_p0_000000_000010.mp4 1132 | ./data/k400/train/punching_bag/ZrTGSxxK9ec_000011_000021.mp4 1133 | ./data/k400/train/cutting_watermelon/p9UpjBBtt3U_000043_000053.mp4 1134 | ./data/k400/train/auctioning/WvTbUuwqfvs_000112_000122.mp4 1135 | ./data/k400/train/marching/8cu_RqoGogk_000070_000080.mp4 1136 | ./data/k400/train/counting_money/-ZUXh0uhVwM_000402_000412.mp4 1137 | ./data/k400/train/checking_tires/1eUYPK0z8XU_000387_000397.mp4 1138 | ./data/k400/train/sneezing/L2psoSsZF0k_000000_000010.mp4 1139 | ./data/k400/train/ice_climbing/90lw6njGWKg_000038_000048.mp4 1140 | ./data/k400/train/contact_juggling/VWOzuoRZkAQ_000153_000163.mp4 1141 | ./data/k400/train/unboxing/fzWIp6ef_no_000118_000128.mp4 1142 | ./data/k400/train/riding_or_walking_with_horse/I5M0u-jMGC0_000051_000061.mp4 1143 | ./data/k400/train/shoveling_snow/kvTLclo-LJY_000021_000031.mp4 1144 | ./data/k400/train/smoking/GALMX2BO5ps_000061_000071.mp4 1145 | ./data/k400/train/playing_trombone/MT_YAO_LWL4_000000_000010.mp4 1146 | ./data/k400/train/playing_keyboard/Jt-dHvS-v9g_000022_000032.mp4 1147 | ./data/k400/train/snorkeling/lTTUQFL1ufY_000072_000082.mp4 1148 | ./data/k400/train/water_skiing/tkJeFJhRckg_000012_000022.mp4 1149 | ./data/k400/train/massaging_person's_head/m0NUeOJc31o_000091_000101.mp4 1150 | ./data/k400/train/playing_cello/w3O-rJgwLWA_000188_000198.mp4 1151 | ./data/k400/train/making_tea/pSehfTzdxe8_000060_000070.mp4 1152 | ./data/k400/train/sniffing/9_7vVLvvrsk_000031_000041.mp4 1153 | ./data/k400/train/passing_American_football_(not_in_game)/zDkcZ7fXEl0_000000_000010.mp4 1154 | ./data/k400/train/dining/dC5JEf6PZQE_000149_000159.mp4 1155 | ./data/k400/train/spray_painting/f_F-g-viudE_000048_000058.mp4 1156 | ./data/k400/train/crying/GBnd6HCgOMk_000036_000046.mp4 1157 | ./data/k400/train/feeding_goats/EeadrqLPHR0_000013_000023.mp4 1158 | ./data/k400/train/decorating_the_christmas_tree/p7NRVUU3lL0_000273_000283.mp4 1159 | ./data/k400/train/baby_waking_up/drvhBD5thZA_000037_000047.mp4 1160 | ./data/k400/train/passing_American_football_(not_in_game)/rcwy6FnyB3M_000064_000074.mp4 1161 | ./data/k400/train/riding_a_bike/dfm_-hSbujc_000088_000098.mp4 1162 | ./data/k400/train/lunge/D01q2l39wkE_000008_000018.mp4 1163 | ./data/k400/train/flying_kite/S1RtKNg6LOU_000111_000121.mp4 1164 | ./data/k400/train/cleaning_pool/ZAo3qZG6Tt4_000046_000056.mp4 1165 | ./data/k400/train/playing_trumpet/pIScQpD6yiI_000128_000138.mp4 1166 | ./data/k400/train/tango_dancing/BBNn7PuGFQ8_000038_000048.mp4 1167 | ./data/k400/train/tap_dancing/QN-WapegB_I_000020_000030.mp4 1168 | ./data/k400/train/blasting_sand/qzrjLREdgcU_000010_000020.mp4 1169 | ./data/k400/train/scuba_diving/Si4z-v_Es8Y_000036_000046.mp4 1170 | ./data/k400/train/roller_skating/XnLGPlY8DDw_000072_000082.mp4 1171 | ./data/k400/train/grooming_horse/y-JpA7VfMF8_000078_000088.mp4 1172 | ./data/k400/train/golf_chipping/-bPfpYQ1CQI_000079_000089.mp4 1173 | ./data/k400/train/dunking_basketball/91GmbttNiRY_000000_000010.mp4 1174 | ./data/k400/train/zumba/YLlHFqfAcmI_000082_000092.mp4 1175 | ./data/k400/train/knitting/qRDksKH2JAg_000156_000166.mp4 1176 | ./data/k400/train/riding_mountain_bike/IdJ57ZPJWJM_000139_000149.mp4 1177 | ./data/k400/train/motorcycling/qmgwZTo9CPs_000006_000016.mp4 1178 | ./data/k400/train/singing/aWl2ZFEshYo_000078_000088.mp4 1179 | ./data/k400/train/playing_guitar/v_Lf4gvjh2w_000183_000193.mp4 1180 | ./data/k400/train/biking_through_snow/uWZ3RlXa6aE_000008_000018.mp4 1181 | ./data/k400/train/beatboxing/9vX3KnnOIFI_000003_000013.mp4 1182 | ./data/k400/train/tap_dancing/VHL5F5ipXjM_000148_000158.mp4 1183 | ./data/k400/train/cartwheeling/tguUj42JI0c_000011_000021.mp4 1184 | ./data/k400/train/belly_dancing/ui2UMPXlKcA_000041_000051.mp4 1185 | ./data/k400/train/archery/9vAPZlhKLKk_000250_000260.mp4 1186 | ./data/k400/train/bowling/0sC0BzknJKA_000014_000024.mp4 1187 | ./data/k400/train/blowing_out_candles/Kq9UKJsdfIA_000033_000043.mp4 1188 | ./data/k400/train/shaking_head/15UdVDXXBFE_000001_000011.mp4 1189 | ./data/k400/train/front_raises/qmq7bQx6plY_000003_000013.mp4 1190 | ./data/k400/train/spinning_poi/7KD49kLBN84_000210_000220.mp4 1191 | ./data/k400/train/ironing/k47MLDJBSEw_000007_000017.mp4 1192 | ./data/k400/train/getting_a_tattoo/OlfHJR_2L7s_000081_000091.mp4 1193 | ./data/k400/train/bungee_jumping/S-k63uYgiOM_000113_000123.mp4 1194 | ./data/k400/train/dribbling_basketball/y9M1sTKxZSw_000341_000351.mp4 1195 | ./data/k400/train/crawling_baby/ZJBFyV2DqpY_000096_000106.mp4 1196 | ./data/k400/train/changing_oil/5KcR_eWEpfE_000527_000537.mp4 1197 | ./data/k400/train/long_jump/DpyFf45T_RQ_000015_000025.mp4 1198 | ./data/k400/train/somersaulting/o91b-A6pDn4_000016_000026.mp4 1199 | ./data/k400/train/squat/lM1ttV4PIP0_000067_000077.mp4 1200 | ./data/k400/train/snatch_weight_lifting/3CVYfOKc0Ek_000027_000037.mp4 1201 | ./data/k400/train/skiing_(not_slalom_or_crosscountry)/gWQG1Ph128Q_000000_000010.mp4 1202 | ./data/k400/train/deadlifting/6A3W2eoVovo_000002_000012.mp4 1203 | ./data/k400/train/using_remote_controller_(not_gaming)/TO3rvGMjfZ8_000058_000068.mp4 1204 | ./data/k400/train/water_skiing/8iYpg_4KpAg_000000_000010.mp4 1205 | ./data/k400/train/bee_keeping/WVu-_yNSLYY_000008_000018.mp4 1206 | ./data/k400/train/changing_wheel/CHE3UCzEBIY_000041_000051.mp4 1207 | ./data/k400/train/cooking_egg/zXHd1thp8mQ_000069_000079.mp4 1208 | ./data/k400/train/moving_furniture/WIAo1Zzh7wk_000036_000046.mp4 1209 | ./data/k400/train/headbanging/w4MzozJRmos_000038_000048.mp4 1210 | ./data/k400/train/crossing_river/A8bEsF3JnTU_000037_000047.mp4 1211 | ./data/k400/train/blowing_glass/Yqirj_B9vtQ_000909_000919.mp4 1212 | ./data/k400/train/spinning_poi/Ryy05q75H90_000028_000038.mp4 1213 | ./data/k400/train/smoking/VLfmcg9gQCU_000006_000016.mp4 1214 | ./data/k400/train/dodgeball/K6mZoaQNIpU_000179_000189.mp4 1215 | ./data/k400/train/sniffing/_4D9UcjJ5Ko_000040_000050.mp4 1216 | ./data/k400/train/ice_skating/iPu5EtQ1bRw_000010_000020.mp4 1217 | ./data/k400/train/scrambling_eggs/JsmNHF0J8l4_000034_000044.mp4 1218 | ./data/k400/train/skipping_rope/quoyW7FZqdI_000120_000130.mp4 1219 | ./data/k400/train/pole_vault/P7HhvGqmaPA_000002_000012.mp4 1220 | ./data/k400/train/baby_waking_up/kV6h8yQjrqs_000018_000028.mp4 1221 | ./data/k400/train/skateboarding/3HfzGNQsxw0_000098_000108.mp4 1222 | ./data/k400/train/sailing/duu9CepKJmA_000030_000040.mp4 1223 | ./data/k400/train/giving_or_receiving_award/9kPvAPnvv9M_000334_000344.mp4 1224 | ./data/k400/train/bowling/9QPuQTAkqog_000003_000013.mp4 1225 | ./data/k400/train/making_jewelry/dKk7Ir0WKZo_000347_000357.mp4 1226 | ./data/k400/train/laying_bricks/odA0OK16rDE_000228_000238.mp4 1227 | ./data/k400/train/archery/WMCehfvKp88_000059_000069.mp4 1228 | ./data/k400/train/drop_kicking/ck9p-kd6eQY_000010_000020.mp4 1229 | ./data/k400/train/shoveling_snow/uzR6LDySFDg_000033_000043.mp4 1230 | ./data/k400/train/waxing_legs/5aX7fUK_M-A_000049_000059.mp4 1231 | ./data/k400/train/abseiling/oNT_nF81-ZY_000033_000043.mp4 1232 | ./data/k400/train/feeding_birds/822GAUIMIPM_000001_000011.mp4 1233 | ./data/k400/train/filling_eyebrows/t4pOcjRJ6gc_000020_000030.mp4 1234 | ./data/k400/train/cleaning_windows/Kr5pxfhLyew_000081_000091.mp4 1235 | ./data/k400/train/cooking_egg/8-Kps3hNimQ_000150_000160.mp4 1236 | ./data/k400/train/peeling_potatoes/wJapI9zA8P0_000019_000029.mp4 1237 | ./data/k400/train/opening_bottle/0ECsvazS25g_000002_000012.mp4 1238 | ./data/k400/train/abseiling/W5GWm_g9X1s_000095_000105.mp4 1239 | ./data/k400/train/making_pizza/dsBW0bX-0xo_000000_000010.mp4 1240 | ./data/k400/train/riding_mechanical_bull/Ui0wB_rH5DM_000008_000018.mp4 1241 | ./data/k400/train/sled_dog_racing/XW1uanTCj3o_000242_000252.mp4 1242 | ./data/k400/train/feeding_goats/zoX6KMuIvOQ_000000_000010.mp4 1243 | ./data/k400/train/flipping_pancake/z2krxdQm69s_000025_000035.mp4 1244 | ./data/k400/train/ski_jumping/jK5cARmXlS4_000206_000216.mp4 1245 | ./data/k400/train/making_a_sandwich/vzz100PDBis_000007_000017.mp4 1246 | ./data/k400/train/climbing_tree/CMGmDXBhEgY_000000_000010.mp4 1247 | ./data/k400/train/playing_cards/oudJbW_zsj4_000113_000123.mp4 1248 | ./data/k400/train/clean_and_jerk/_R7eAa3jYsg_000009_000019.mp4 1249 | ./data/k400/train/snorkeling/hMUb2PHRmwQ_000014_000024.mp4 1250 | ./data/k400/train/blasting_sand/g2cH7pybmZU_000004_000014.mp4 1251 | ./data/k400/train/playing_guitar/TELaRyfa_dU_000267_000277.mp4 1252 | ./data/k400/train/bending_back/QezkC38mUgY_000002_000012.mp4 1253 | ./data/k400/train/playing_bass_guitar/4NIFd7k4f_E_000041_000051.mp4 1254 | ./data/k400/train/assembling_computer/LsiLA3OPyAg_000402_000412.mp4 1255 | ./data/k400/train/trimming_or_shaving_beard/su4JYYgxHCA_000110_000120.mp4 1256 | ./data/k400/train/sticking_tongue_out/GRd8n3k7p-A_000012_000022.mp4 1257 | ./data/k400/train/cooking_on_campfire/3wi4ZNJRrdY_000025_000035.mp4 1258 | ./data/k400/train/playing_cricket/TPucMbb_iM4_000127_000137.mp4 1259 | ./data/k400/train/biking_through_snow/3DOskOYM0qc_000138_000148.mp4 1260 | ./data/k400/train/baking_cookies/6TK8J8gJ738_000308_000318.mp4 1261 | ./data/k400/train/flipping_pancake/fbxm9TDLv8o_000003_000013.mp4 1262 | ./data/k400/train/eating_hotdog/GBNf1LPyhQ4_000069_000079.mp4 1263 | ./data/k400/train/side_kick/na645qHQf7I_000000_000010.mp4 1264 | ./data/k400/train/applying_cream/d-wFe_YQ2HI_000012_000022.mp4 1265 | ./data/k400/train/marching/wIghZqf14fw_000003_000013.mp4 1266 | ./data/k400/train/zumba/nEcxYmgejWs_000003_000013.mp4 1267 | ./data/k400/train/chopping_wood/FOFgtFpggEE_000034_000044.mp4 1268 | ./data/k400/train/stretching_arm/GBrHWmc7YSE_000061_000071.mp4 1269 | ./data/k400/train/washing_feet/qLQEocJNf6g_000152_000162.mp4 1270 | ./data/k400/train/swimming_backstroke/z90eDJ4wPzw_000000_000010.mp4 1271 | ./data/k400/train/riding_scooter/aR5oymd4f5A_000002_000012.mp4 1272 | ./data/k400/train/tapping_guitar/nn1cNp-g5No_000017_000027.mp4 1273 | ./data/k400/train/headbutting/ufnMwkQhuCk_000001_000011.mp4 1274 | ./data/k400/train/triple_jump/Oagkch7_eSo_000004_000014.mp4 1275 | ./data/k400/train/ski_jumping/aHj4l6p72ac_000004_000014.mp4 1276 | ./data/k400/train/capoeira/hXXg5zseoX4_000242_000252.mp4 1277 | ./data/k400/train/breakdancing/J0-Laz9tiHI_000037_000047.mp4 1278 | ./data/k400/train/bending_metal/3QzrwPx9fNs_000002_000012.mp4 1279 | ./data/k400/train/skiing_(not_slalom_or_crosscountry)/8p6XLuf49oI_000101_000111.mp4 1280 | ./data/k400/train/finger_snapping/Ms2thokiljE_000011_000021.mp4 1281 | ./data/k400/train/bungee_jumping/Z4yP-vmLVKk_000039_000049.mp4 1282 | ./data/k400/train/stretching_arm/mKqMRRqm_Ds_000131_000141.mp4 1283 | ./data/k400/train/trapezing/mbMMGaq4cA4_000007_000017.mp4 1284 | ./data/k400/train/news_anchoring/gxPS9QGZ9IM_000054_000064.mp4 1285 | ./data/k400/train/snowboarding/C5ZO4AqQDWs_000089_000099.mp4 1286 | ./data/k400/train/pumping_fist/Na6IIdDzf7o_000008_000018.mp4 1287 | ./data/k400/train/knitting/0-p_yudF5Ng_000109_000119.mp4 1288 | ./data/k400/train/grooming_horse/ig-g8SUByqk_000031_000041.mp4 1289 | ./data/k400/train/surfing_water/l8IEBU35YXw_000058_000068.mp4 1290 | ./data/k400/train/ripping_paper/Kph-LW_83ns_000022_000032.mp4 1291 | ./data/k400/train/baby_waking_up/b0IGLur8dGM_000076_000086.mp4 1292 | ./data/k400/train/shaving_head/LUdCac7icik_000067_000077.mp4 1293 | ./data/k400/train/biking_through_snow/JlyVqONdLNk_000029_000039.mp4 1294 | ./data/k400/train/drinking_beer/Xc1Z31ArmkE_000003_000013.mp4 1295 | ./data/k400/train/extinguishing_fire/dGI0Zs5s2SA_000014_000024.mp4 1296 | ./data/k400/train/scuba_diving/dRw3FUMtFR4_000051_000061.mp4 1297 | ./data/k400/train/dancing_macarena/kbH7f1-vNg4_000029_000039.mp4 1298 | ./data/k400/train/cartwheeling/ABgYDosePwo_000030_000040.mp4 1299 | ./data/k400/train/fixing_hair/5dVbruyVa3s_000067_000077.mp4 1300 | ./data/k400/train/marching/N_96d2kzGh0_000019_000029.mp4 1301 | ./data/k400/train/throwing_axe/Tj937SzrWm0_000019_000029.mp4 1302 | ./data/k400/train/crossing_river/9JZp6yYXVnM_000000_000010.mp4 1303 | ./data/k400/train/balloon_blowing/G3aYLd_YfGE_000155_000165.mp4 1304 | ./data/k400/train/bartending/7M6nKkuKt2k_000031_000041.mp4 1305 | ./data/k400/train/feeding_fish/RqsWnCxFJqo_000012_000022.mp4 1306 | ./data/k400/train/roller_skating/bQLJvAK3hA0_000145_000155.mp4 1307 | ./data/k400/train/diving_cliff/VhZSbeIxPNI_000013_000023.mp4 1308 | ./data/k400/train/playing_controller/dijLCRPG89A_000108_000118.mp4 1309 | ./data/k400/train/barbequing/5Kh9aIt-nDw_000002_000012.mp4 1310 | ./data/k400/train/snowkiting/EEfqg_NIgl4_000153_000163.mp4 1311 | ./data/k400/train/throwing_ball/Zl24mAiK5p8_000005_000015.mp4 1312 | ./data/k400/train/surfing_crowd/NCxlSJhOQcE_000008_000018.mp4 1313 | ./data/k400/train/using_remote_controller_(not_gaming)/fhVfY1jqfxo_000035_000045.mp4 1314 | ./data/k400/train/playing_trumpet/ofDKQoPsyB8_000013_000023.mp4 1315 | ./data/k400/train/making_pizza/vpbDmKeRzZA_000051_000061.mp4 1316 | ./data/k400/train/smoking/KJpFn6KvgG8_000050_000060.mp4 1317 | ./data/k400/train/snatch_weight_lifting/WkJyvn4JIyQ_000002_000012.mp4 1318 | ./data/k400/train/waxing_eyebrows/a-Z50-gOKpg_000250_000260.mp4 1319 | ./data/k400/train/chopping_wood/xLGFREtV0pI_000015_000025.mp4 1320 | ./data/k400/train/sharpening_pencil/z3YhIxkED1Q_000000_000010.mp4 1321 | ./data/k400/train/bobsledding/ID-Ur7TmPRs_000100_000110.mp4 1322 | ./data/k400/train/shaking_head/AYRCQsjkZaY_000000_000010.mp4 1323 | ./data/k400/train/riding_scooter/sMK76deBNAI_000017_000027.mp4 1324 | ./data/k400/train/blowing_out_candles/wr5xmUy54fA_000010_000020.mp4 1325 | ./data/k400/train/tobogganing/6EUCbyRFxxs_000003_000013.mp4 1326 | ./data/k400/train/massaging_back/gYZrEZsXL5s_000026_000036.mp4 1327 | ./data/k400/train/sharpening_pencil/yTDfAcEpVCA_000001_000011.mp4 1328 | ./data/k400/train/cartwheeling/kxJWYOgFrzs_000006_000016.mp4 1329 | ./data/k400/train/snatch_weight_lifting/fvgpW-bhLIo_000045_000055.mp4 1330 | ./data/k400/train/blowing_out_candles/rx1htlRtaXM_000032_000042.mp4 1331 | ./data/k400/train/cutting_nails/0HeSngTzpnU_000057_000067.mp4 1332 | ./data/k400/train/playing_organ/oRSYo13O5w0_000024_000034.mp4 1333 | ./data/k400/train/busking/-L2Wp5NdnLk_000033_000043.mp4 1334 | ./data/k400/train/sign_language_interpreting/Qeu96kcjYh0_000000_000010.mp4 1335 | ./data/k400/train/high_jump/BTbi-lB_KEY_000000_000010.mp4 1336 | ./data/k400/train/juggling_fire/YQiTHWZrQCo_000003_000013.mp4 1337 | ./data/k400/train/playing_recorder/QMZViVuR8Rc_000033_000043.mp4 1338 | ./data/k400/train/making_pizza/UVeQBHludGs_000443_000453.mp4 1339 | ./data/k400/train/celebrating/q0s5_d25ZOY_000467_000477.mp4 1340 | ./data/k400/train/somersaulting/NKNyVstPlvE_000032_000042.mp4 1341 | ./data/k400/train/riding_elephant/eyy3Toepdjg_000003_000013.mp4 1342 | ./data/k400/train/smoking/sEcs_Xle6CU_000019_000029.mp4 1343 | ./data/k400/train/getting_a_haircut/mAujAw06hc8_000004_000014.mp4 1344 | ./data/k400/train/waxing_legs/LPbRFXkWz50_000033_000043.mp4 1345 | ./data/k400/train/counting_money/EMm7feuwWiI_000035_000045.mp4 1346 | ./data/k400/train/tickling/JyjIY6qhuCs_000025_000035.mp4 1347 | ./data/k400/train/petting_animal_(not_cat)/U8cXBhN6-Ao_000008_000018.mp4 1348 | ./data/k400/train/shearing_sheep/_Zi1pDbtoe4_000063_000073.mp4 1349 | ./data/k400/train/ripping_paper/g25yfyMRAFY_000001_000011.mp4 1350 | ./data/k400/train/waxing_eyebrows/-phA8y2Zwtk_000115_000125.mp4 1351 | ./data/k400/train/pumping_fist/XEkvQriGerg_000029_000039.mp4 1352 | ./data/k400/train/playing_tennis/_dbH01jeTzM_000007_000017.mp4 1353 | ./data/k400/train/throwing_axe/pO8UUawY1UY_000002_000012.mp4 1354 | ./data/k400/train/country_line_dancing/fh9glXFwY90_000084_000094.mp4 1355 | ./data/k400/train/planting_trees/vmx785a9z2g_000033_000043.mp4 1356 | ./data/k400/train/feeding_birds/zW1v1dDJ3og_000015_000025.mp4 1357 | ./data/k400/train/washing_dishes/yon1lsEt7lA_000019_000029.mp4 1358 | ./data/k400/train/gymnastics_tumbling/TvL3sVWUolA_000000_000010.mp4 1359 | ./data/k400/train/playing_poker/Vc-JizjGEoY_000013_000023.mp4 1360 | ./data/k400/train/bowling/-A3CcrEtLpM_000000_000010.mp4 1361 | ./data/k400/train/curling_hair/6sQBbsDqrIY_000075_000085.mp4 1362 | ./data/k400/train/reading_newspaper/BfrOPMT6HEI_000385_000395.mp4 1363 | ./data/k400/train/dying_hair/IjHDucjI6NQ_000089_000099.mp4 1364 | ./data/k400/train/rock_scissors_paper/8WW-Emk5OwM_000012_000022.mp4 1365 | ./data/k400/train/skiing_(not_slalom_or_crosscountry)/XyEG-U3tq9Y_000018_000028.mp4 1366 | ./data/k400/train/playing_chess/ILiuMhvfTuE_000065_000075.mp4 1367 | ./data/k400/train/catching_or_throwing_baseball/zk1gQfm9Xfg_000007_000017.mp4 1368 | ./data/k400/train/setting_table/b_M03GBBAyI_000160_000170.mp4 1369 | ./data/k400/train/shoveling_snow/2l5BTtbG9wY_000086_000096.mp4 1370 | ./data/k400/train/strumming_guitar/Y60kJxPO7C8_000044_000054.mp4 1371 | ./data/k400/train/passing_American_football_(not_in_game)/wKC6VdnCmCE_000003_000013.mp4 1372 | ./data/k400/train/brushing_teeth/FEwk9MHDDqo_000001_000011.mp4 1373 | ./data/k400/train/tapping_guitar/z-APaA5LWdU_000015_000025.mp4 1374 | ./data/k400/train/tying_knot_(not_on_a_tie)/sVaskNCQJxU_000011_000021.mp4 1375 | ./data/k400/train/catching_or_throwing_softball/Nt84lOKlZ_8_000004_000014.mp4 1376 | ./data/k400/train/snorkeling/6xoJjRfHduI_000009_000019.mp4 1377 | ./data/k400/train/trapezing/7WXtNyK7Qc8_000182_000192.mp4 1378 | ./data/k400/train/cutting_pineapple/lB6pV0eGOxk_000031_000041.mp4 1379 | ./data/k400/train/knitting/ufq5tlTaACY_000053_000063.mp4 1380 | ./data/k400/train/catching_or_throwing_frisbee/idxFAQwDg-E_000002_000012.mp4 1381 | ./data/k400/train/cutting_watermelon/4GyxcFSn-Qo_000030_000040.mp4 1382 | ./data/k400/train/golf_putting/1OmrCkNLK7s_000176_000186.mp4 1383 | ./data/k400/train/snatch_weight_lifting/cATjUbtB9YY_000000_000010.mp4 1384 | ./data/k400/train/climbing_a_rope/sUb_1cNnwqc_000015_000025.mp4 1385 | ./data/k400/train/pole_vault/g9n24G-YgbI_000002_000012.mp4 1386 | ./data/k400/train/snowkiting/WVHCpzTCKjI_000004_000014.mp4 1387 | ./data/k400/train/abseiling/NmiqKGF24YE_000431_000441.mp4 1388 | ./data/k400/train/playing_guitar/q53roPd0krs_000078_000088.mp4 1389 | ./data/k400/train/riding_unicycle/6j-l6UX9S30_000007_000017.mp4 1390 | ./data/k400/train/snowkiting/g7XjF6KzKDU_000008_000018.mp4 1391 | ./data/k400/train/riding_or_walking_with_horse/RC4cLYwYUx8_000010_000020.mp4 1392 | ./data/k400/train/pushing_cart/z-1YBeL54go_000013_000023.mp4 1393 | ./data/k400/train/breakdancing/0kJZJjRXzd0_000000_000010.mp4 1394 | ./data/k400/train/paragliding/wEgvAjhccOc_000105_000115.mp4 1395 | ./data/k400/train/playing_cricket/1Vjta6CfR1U_000090_000100.mp4 1396 | ./data/k400/train/building_shed/Cd2vY8cFg6M_000010_000020.mp4 1397 | ./data/k400/train/smoking_hookah/pesd2mKmuoY_000351_000361.mp4 1398 | ./data/k400/train/milking_cow/xhJnHYtLB-o_000025_000035.mp4 1399 | ./data/k400/train/petting_cat/WuY85KBsHL0_000014_000024.mp4 1400 | ./data/k400/train/making_jewelry/maoAkgWX0ak_000213_000223.mp4 1401 | ./data/k400/train/punching_bag/q8iSxHNfIuw_000003_000013.mp4 1402 | ./data/k400/train/playing_harp/DtAqGdMYG0o_000034_000044.mp4 1403 | ./data/k400/train/eating_ice_cream/jeMBxEhSWdA_000001_000011.mp4 1404 | ./data/k400/train/tai_chi/hLqWJifeGiE_000012_000022.mp4 1405 | ./data/k400/train/grinding_meat/Bbx81w9HI_c_000021_000031.mp4 1406 | ./data/k400/train/playing_paintball/kkc7qvK6GIM_000086_000096.mp4 1407 | ./data/k400/train/ski_jumping/z2QaVGxWMKE_000001_000011.mp4 1408 | ./data/k400/train/surfing_crowd/1FrFBXf0XSQ_000002_000012.mp4 1409 | ./data/k400/train/feeding_birds/TlOmq8pplt0_000073_000083.mp4 1410 | ./data/k400/train/high_kick/R29XXB-d0eE_000133_000143.mp4 1411 | ./data/k400/train/hopscotch/8aTWUWhkWLI_000000_000010.mp4 1412 | ./data/k400/train/crossing_river/eqMxuOGNzG8_000003_000013.mp4 1413 | ./data/k400/train/snorkeling/rvoZlL3lN04_000003_000013.mp4 1414 | ./data/k400/train/archery/O6oMS5ApyXQ_000022_000032.mp4 1415 | ./data/k400/train/surfing_crowd/eWoAVoEkt24_000000_000010.mp4 1416 | ./data/k400/train/eating_chips/T10OedcYcvE_000001_000011.mp4 1417 | ./data/k400/train/spray_painting/Ds5zj-kCvbs_000029_000039.mp4 1418 | ./data/k400/train/pumping_fist/LM2rdcBhlnk_000001_000011.mp4 1419 | ./data/k400/train/snatch_weight_lifting/hPIP8aJtQTo_000003_000013.mp4 1420 | ./data/k400/train/crossing_river/V4KCWthuT68_000004_000014.mp4 1421 | ./data/k400/train/catching_or_throwing_frisbee/7GTqvD903tM_000000_000010.mp4 1422 | ./data/k400/train/playing_violin/Gol3K1ABQcY_000013_000023.mp4 1423 | ./data/k400/train/clean_and_jerk/wrj1vzVtH8s_000004_000014.mp4 1424 | ./data/k400/train/juggling_balls/1S3HeIxf5wM_000002_000012.mp4 1425 | ./data/k400/train/disc_golfing/AoDtOPEvcl8_000012_000022.mp4 1426 | ./data/k400/train/arm_wrestling/CFz0_1Nn8kQ_000006_000016.mp4 1427 | ./data/k400/train/bungee_jumping/G-T24qhcuyw_000049_000059.mp4 1428 | ./data/k400/train/driving_tractor/9mfKgO6IRkk_000002_000012.mp4 1429 | ./data/k400/train/riding_scooter/oqsMwWf91sI_000033_000043.mp4 1430 | ./data/k400/train/kicking_soccer_ball/PhdgH1iuKoI_000000_000010.mp4 1431 | ./data/k400/train/crawling_baby/eVT_5FuOIjI_000023_000033.mp4 1432 | ./data/k400/train/scrambling_eggs/yWXzx7dfWAE_000197_000207.mp4 1433 | ./data/k400/train/riding_elephant/2KxbKqxvmsI_000001_000011.mp4 1434 | ./data/k400/train/roller_skating/ZKvmnvhXd9w_000126_000136.mp4 1435 | ./data/k400/train/recording_music/YfyQz3yaAj4_000389_000399.mp4 1436 | ./data/k400/train/golf_putting/bBhLzGE9gxA_000156_000166.mp4 1437 | ./data/k400/train/reading_book/v8fH2l9K8_w_000047_000057.mp4 1438 | ./data/k400/train/mopping_floor/l0bx55g1eBA_000058_000068.mp4 1439 | ./data/k400/train/golf_putting/3ir54cPOXnE_000369_000379.mp4 1440 | ./data/k400/train/playing_violin/6XsAd7gJB6A_000023_000033.mp4 1441 | ./data/k400/train/playing_ukulele/W1HOW-Zpugw_000231_000241.mp4 1442 | ./data/k400/train/riding_a_bike/enGSVXMVQi4_000005_000015.mp4 1443 | ./data/k400/train/making_pizza/UCbDYNJtbvg_000168_000178.mp4 1444 | ./data/k400/train/planting_trees/A_Fr5Y8h_Ds_000172_000182.mp4 1445 | ./data/k400/train/high_jump/FnJP-o_fuWw_000001_000011.mp4 1446 | ./data/k400/train/checking_tires/Naskpf_DsQA_000267_000277.mp4 1447 | ./data/k400/train/playing_trombone/UhKUFBQ0nd4_000081_000091.mp4 1448 | ./data/k400/train/waxing_legs/qCLGG5JA6wM_000290_000300.mp4 1449 | ./data/k400/train/playing_clarinet/njutzWO46OI_000327_000337.mp4 1450 | ./data/k400/train/playing_drums/d6uFuadX-O0_000046_000056.mp4 1451 | ./data/k400/train/skateboarding/BoBDUq7x1vA_000264_000274.mp4 1452 | ./data/k400/train/playing_harp/4_c3tOUvwXo_000000_000010.mp4 1453 | ./data/k400/train/eating_ice_cream/0g_pK2gsW3c_000014_000024.mp4 1454 | ./data/k400/train/carrying_baby/IRdD__v-EKM_000057_000067.mp4 1455 | ./data/k400/train/playing_organ/I4u2GFwr5Xk_000052_000062.mp4 1456 | ./data/k400/train/ice_skating/hVt4iMwv_B0_000018_000028.mp4 1457 | ./data/k400/train/eating_ice_cream/Tdvp81kP9-M_000005_000015.mp4 1458 | ./data/k400/train/playing_volleyball/BdksUJ5Ah9s_000006_000016.mp4 1459 | ./data/k400/train/washing_hands/9OqYdScg6b4_000018_000028.mp4 1460 | ./data/k400/train/eating_burger/i0WPZB_-q_Q_000049_000059.mp4 1461 | ./data/k400/train/spray_painting/isv_qisJmVQ_000000_000010.mp4 1462 | ./data/k400/train/sign_language_interpreting/jJ0JynfFGgo_000124_000134.mp4 1463 | ./data/k400/train/testifying/AZCi1BxPZ7g_000324_000334.mp4 1464 | ./data/k400/train/skiing_crosscountry/IFAUJ4PXBqI_000076_000086.mp4 1465 | ./data/k400/train/passing_American_football_(not_in_game)/t4waQMPUuJk_000002_000012.mp4 1466 | ./data/k400/train/answering_questions/NpdDgASNANc_000006_000016.mp4 1467 | ./data/k400/train/mowing_lawn/GQ2losip4ds_000078_000088.mp4 1468 | ./data/k400/train/watering_plants/Z02VjQcNxv0_000012_000022.mp4 1469 | ./data/k400/train/throwing_ball/lcIgmZzbHXU_000035_000045.mp4 1470 | ./data/k400/train/presenting_weather_forecast/A3A13T_fqxs_000042_000052.mp4 1471 | ./data/k400/train/yoga/ADvd2_S6uTo_002947_002957.mp4 1472 | ./data/k400/train/crawling_baby/VE2EGWBUcY0_000005_000015.mp4 1473 | ./data/k400/train/smoking/VT8bbWpNbGk_000002_000012.mp4 1474 | ./data/k400/train/hopscotch/FvqAm-TyLC8_000001_000011.mp4 1475 | ./data/k400/train/making_a_cake/gemZSjzqTfg_000110_000120.mp4 1476 | ./data/k400/train/playing_basketball/Z5-JYDP3b_s_000009_000019.mp4 1477 | ./data/k400/train/playing_trumpet/fSWhrXyQC5w_000000_000010.mp4 1478 | ./data/k400/train/extinguishing_fire/6-pCyBFvL5o_000001_000011.mp4 1479 | ./data/k400/train/cooking_chicken/y7--GOOBiCY_000061_000071.mp4 1480 | ./data/k400/train/dancing_ballet/GABbgR4KFFA_000911_000921.mp4 1481 | ./data/k400/train/eating_ice_cream/2G-0IKeodCo_001064_001074.mp4 1482 | ./data/k400/train/getting_a_tattoo/tfcDCUtw0Ik_000144_000154.mp4 1483 | ./data/k400/train/tying_knot_(not_on_a_tie)/QctkGoJuiv0_000036_000046.mp4 1484 | ./data/k400/train/juggling_balls/kCp20IGyrYM_000006_000016.mp4 1485 | ./data/k400/train/marching/G_0wqvKCiEE_000032_000042.mp4 1486 | ./data/k400/train/playing_harp/nAT3grD013Y_000003_000013.mp4 1487 | ./data/k400/train/skateboarding/W3qBuQxCXv0_000198_000208.mp4 1488 | ./data/k400/train/chopping_wood/_guzWnDUeS8_000001_000011.mp4 1489 | ./data/k400/train/windsurfing/uOhF1uLaSBI_000133_000143.mp4 1490 | ./data/k400/train/peeling_apples/GFnziQDAJNQ_000003_000013.mp4 1491 | ./data/k400/train/extinguishing_fire/jcq-zydoxI0_000337_000347.mp4 1492 | ./data/k400/train/throwing_axe/xqYxxXr_1Kg_000012_000022.mp4 1493 | ./data/k400/train/riding_mule/HSI3hMgie8o_000005_000015.mp4 1494 | ./data/k400/train/playing_clarinet/Izf5sGMI1CY_000036_000046.mp4 1495 | ./data/k400/train/getting_a_haircut/o4SuhMcqF-Q_000002_000012.mp4 1496 | ./data/k400/train/strumming_guitar/sw_lAgQfKfQ_000001_000011.mp4 1497 | ./data/k400/train/gymnastics_tumbling/lMqVKPo_LhI_000003_000013.mp4 1498 | ./data/k400/train/playing_trombone/bP53EA8t0-Q_000008_000018.mp4 1499 | ./data/k400/train/playing_accordion/Txd6G9ElmME_000086_000096.mp4 1500 | ./data/k400/train/playing_controller/NrTUJtexBD0_000203_000213.mp4 1501 | ./data/k400/train/dancing_ballet/wjYm_PYh1oQ_000080_000090.mp4 1502 | ./data/k400/train/smoking/VVYyV9U6J2g_000074_000084.mp4 1503 | ./data/k400/train/tango_dancing/idpxVgd9Xvo_000057_000067.mp4 1504 | ./data/k400/train/playing_bass_guitar/nzEbIASP798_000115_000125.mp4 1505 | ./data/k400/train/getting_a_haircut/X_d8GIAZXMA_000042_000052.mp4 1506 | ./data/k400/train/side_kick/633aOaXd3ls_000000_000010.mp4 1507 | ./data/k400/train/shooting_basketball/lXF1BHxVa-g_000032_000042.mp4 1508 | ./data/k400/train/playing_tennis/QbvOGVXz3ks_000005_000015.mp4 1509 | ./data/k400/train/skateboarding/B906QmKLY5s_000200_000210.mp4 1510 | ./data/k400/train/riding_elephant/i271PVM7cK4_000017_000027.mp4 1511 | ./data/k400/train/making_pizza/IlK4b-K0870_000619_000629.mp4 1512 | ./data/k400/train/opening_present/EHNS2zQOD0A_000142_000152.mp4 1513 | ./data/k400/train/golf_driving/JcXmP5nwHD4_000062_000072.mp4 1514 | ./data/k400/train/kissing/yOx3EWYmXjA_000032_000042.mp4 1515 | ./data/k400/train/jumpstyle_dancing/t9Kdo_y7h34_000071_000081.mp4 1516 | ./data/k400/train/shaking_head/JrhJGbaBqVQ_000001_000011.mp4 1517 | ./data/k400/train/folding_clothes/9Fr76pSDU_I_000044_000054.mp4 1518 | ./data/k400/train/plastering/E3bkBRsw4hE_000058_000068.mp4 1519 | ./data/k400/train/situp/-ORYAyk0H0k_000309_000319.mp4 1520 | ./data/k400/train/air_drumming/ETZYds_uExg_000014_000024.mp4 1521 | ./data/k400/train/tai_chi/6Sx2raW_BCY_000095_000105.mp4 1522 | ./data/k400/train/snowboarding/TjDsv1BQugM_000221_000231.mp4 1523 | ./data/k400/train/somersaulting/RZJctA8R_g8_000161_000171.mp4 1524 | ./data/k400/train/somersaulting/9XeW9Sd112w_000003_000013.mp4 1525 | ./data/k400/train/cleaning_windows/RG1dVRHVHiw_000036_000046.mp4 1526 | ./data/k400/train/dribbling_basketball/KJEb6O-cjhU_000193_000203.mp4 1527 | ./data/k400/train/tossing_salad/1f7MagcRoK0_000013_000023.mp4 1528 | ./data/k400/train/presenting_weather_forecast/ykyRQzlEknw_000023_000033.mp4 1529 | ./data/k400/train/swinging_legs/f--G6zsv5h4_000007_000017.mp4 1530 | ./data/k400/train/ironing/ftJjSt2rk4w_000073_000083.mp4 1531 | ./data/k400/train/doing_nails/lZ74QvILXpk_000069_000079.mp4 1532 | ./data/k400/train/blowing_out_candles/Yd_1dmopDK4_000062_000072.mp4 1533 | ./data/k400/train/drinking/lISqgbD-jfo_000014_000024.mp4 1534 | ./data/k400/train/juggling_soccer_ball/qyE_oUUEP3M_000129_000139.mp4 1535 | ./data/k400/train/crossing_river/_6Ql6NWs0eM_000031_000041.mp4 1536 | ./data/k400/train/shaking_hands/HizeP_FLIAQ_000011_000021.mp4 1537 | ./data/k400/train/reading_book/EicHnDpddaA_000033_000043.mp4 1538 | ./data/k400/train/carving_pumpkin/gY9QJIHEJi4_000032_000042.mp4 1539 | ./data/k400/train/swimming_breast_stroke/UHxZaSikstg_000223_000233.mp4 1540 | ./data/k400/train/tobogganing/M9_OfrU7-AU_000020_000030.mp4 1541 | ./data/k400/train/push_up/STmXxb65D1I_000046_000056.mp4 1542 | ./data/k400/train/swing_dancing/B6Xss7Z39sc_000148_000158.mp4 1543 | ./data/k400/train/smoking/_Dz33vwfBoo_000003_000013.mp4 1544 | ./data/k400/train/building_cabinet/6eHFBiuaShk_000172_000182.mp4 1545 | ./data/k400/train/mowing_lawn/doCuFxDbehA_000000_000010.mp4 1546 | ./data/k400/train/smoking_hookah/TVfMhwine2w_000012_000022.mp4 1547 | ./data/k400/train/feeding_goats/9GHwYBinAFc_000012_000022.mp4 1548 | ./data/k400/train/contact_juggling/ZN7Ehy3xui4_000059_000069.mp4 1549 | ./data/k400/train/playing_volleyball/Y_jBvsl7xjM_000004_000014.mp4 1550 | ./data/k400/train/waxing_legs/6rIQXZRcJuY_000077_000087.mp4 1551 | ./data/k400/train/eating_hotdog/UbG4CFOOzA4_000218_000228.mp4 1552 | ./data/k400/train/tobogganing/AYxTrod0Mm0_000015_000025.mp4 1553 | ./data/k400/train/playing_recorder/2Z19-4EG6xY_000016_000026.mp4 1554 | ./data/k400/train/breading_or_breadcrumbing/OeBtEQ9NdLE_000216_000226.mp4 1555 | ./data/k400/train/unboxing/oAhMYcExxgI_000002_000012.mp4 1556 | ./data/k400/train/driving_car/o6djA03L6iI_000009_000019.mp4 1557 | ./data/k400/train/sweeping_floor/tTjsR7KLnIE_000186_000196.mp4 1558 | ./data/k400/train/peeling_apples/AVVtpcpq7_o_000030_000040.mp4 1559 | ./data/k400/train/deadlifting/Hvfs-5IoOVM_000022_000032.mp4 1560 | ./data/k400/train/diving_cliff/iTgEY9ri9hw_000000_000010.mp4 1561 | ./data/k400/train/riding_camel/ZgfbjhasMbw_000070_000080.mp4 1562 | ./data/k400/train/cartwheeling/Z0Qc99vfTSs_000000_000010.mp4 1563 | ./data/k400/train/spray_painting/ykDWWkF9_is_000025_000035.mp4 1564 | ./data/k400/train/crawling_baby/G0owEUaWrug_000001_000011.mp4 1565 | ./data/k400/train/blasting_sand/mctYaTL6gw8_000051_000061.mp4 1566 | ./data/k400/train/archery/2JyIkM_v0wA_000011_000021.mp4 1567 | ./data/k400/train/walking_the_dog/J_kav4c7IaI_000005_000015.mp4 1568 | ./data/k400/train/shearing_sheep/JzRGY5J-UOs_000006_000016.mp4 1569 | ./data/k400/train/playing_chess/PrLTjCghrfM_000016_000026.mp4 1570 | ./data/k400/train/arm_wrestling/C1SZARQs43w_000004_000014.mp4 1571 | ./data/k400/train/sled_dog_racing/iIl7Gyk5Jb0_000013_000023.mp4 1572 | ./data/k400/train/cleaning_windows/yeKMiotAjBE_000003_000013.mp4 1573 | ./data/k400/train/ice_skating/qSOkdUs86GI_000236_000246.mp4 1574 | ./data/k400/train/hula_hooping/YpaDsAwY93A_000180_000190.mp4 1575 | ./data/k400/train/tapping_pen/knNVtlMiT7A_000084_000094.mp4 1576 | ./data/k400/train/playing_harp/uEGiokCg_Rc_000058_000068.mp4 1577 | ./data/k400/train/high_jump/1lkVUYC8dWU_000052_000062.mp4 1578 | ./data/k400/train/archery/_vmkt_nn3Mo_000001_000011.mp4 1579 | ./data/k400/train/playing_cricket/ZRdXsBIqiKs_000001_000011.mp4 1580 | ./data/k400/train/playing_organ/fROvmuvhBAE_000019_000029.mp4 1581 | ./data/k400/train/riding_unicycle/g9dG8Rw15qs_000001_000011.mp4 1582 | ./data/k400/train/shearing_sheep/yat1JGlz_pY_000018_000028.mp4 1583 | ./data/k400/train/getting_a_haircut/da4lfdt02HE_000000_000010.mp4 1584 | ./data/k400/train/catching_or_throwing_frisbee/zOMtYnNUEzE_000081_000091.mp4 1585 | ./data/k400/train/playing_harmonica/efb6XXjXHO4_000002_000012.mp4 1586 | ./data/k400/train/kissing/rI9SdfQXQks_000068_000078.mp4 1587 | ./data/k400/train/riding_scooter/LMgtBR0dXwY_000095_000105.mp4 1588 | ./data/k400/train/somersaulting/sKiEjDggIZ0_000037_000047.mp4 1589 | ./data/k400/train/bouncing_on_trampoline/80-RQZYKy_8_000075_000085.mp4 1590 | ./data/k400/train/bench_pressing/X2srLUdVkTY_000016_000026.mp4 1591 | ./data/k400/train/mowing_lawn/y7DkcGe67Ho_000013_000023.mp4 1592 | ./data/k400/train/washing_dishes/Q1k42FiNNGk_000014_000024.mp4 1593 | ./data/k400/train/washing_dishes/f1dO8UGAq7A_000195_000205.mp4 1594 | ./data/k400/train/playing_recorder/iGI6zzqRPeI_000015_000025.mp4 1595 | ./data/k400/train/headbanging/fOdyQtCdbsM_000163_000173.mp4 1596 | ./data/k400/train/hurling_(sport)/sdjR8i2XQnA_000147_000157.mp4 1597 | ./data/k400/train/dunking_basketball/grTjJL9pXbo_000016_000026.mp4 1598 | ./data/k400/train/stretching_arm/uONppOa0YEM_000071_000081.mp4 1599 | ./data/k400/train/deadlifting/X_cwbPdEPJw_000093_000103.mp4 1600 | ./data/k400/train/playing_ukulele/nDFPgvogT0U_000159_000169.mp4 1601 | ./data/k400/train/archery/H5sRXRbLQp4_000003_000013.mp4 1602 | ./data/k400/train/making_a_sandwich/d_FSvA1eESo_000023_000033.mp4 1603 | ./data/k400/train/golf_driving/rZHHEKM0J3I_000009_000019.mp4 1604 | ./data/k400/train/making_bed/lNAoa7RfHQ8_000594_000604.mp4 1605 | ./data/k400/train/slapping/SLy5CzRZf88_000004_000014.mp4 1606 | ./data/k400/train/javelin_throw/JjFaIo2CZiI_000022_000032.mp4 1607 | ./data/k400/train/shooting_basketball/w01XE4G5Z_s_000117_000127.mp4 1608 | ./data/k400/train/playing_organ/3OBWQZ7b1Wo_000008_000018.mp4 1609 | ./data/k400/train/passing_American_football_(not_in_game)/SrNB_rbd2jc_000008_000018.mp4 1610 | ./data/k400/train/massaging_back/mFxMWYc0LtE_000004_000014.mp4 1611 | ./data/k400/train/playing_ukulele/ERWn0QbZuAY_000061_000071.mp4 1612 | ./data/k400/train/tango_dancing/CbJj173G5QU_000020_000030.mp4 1613 | ./data/k400/train/playing_poker/qw40-7Ffvv0_000133_000143.mp4 1614 | ./data/k400/train/juggling_balls/FawHAnYpo-c_000210_000220.mp4 1615 | ./data/k400/train/unboxing/Wu9xQMvVmak_000129_000139.mp4 1616 | ./data/k400/train/climbing_tree/wU8929T34Ao_000002_000012.mp4 1617 | ./data/k400/train/somersaulting/9hgQ1K00SYs_000001_000011.mp4 1618 | ./data/k400/train/krumping/-8kap3Yv36A_000031_000041.mp4 1619 | ./data/k400/train/strumming_guitar/zxRj58pNOrI_000001_000011.mp4 1620 | ./data/k400/train/cleaning_toilet/qiIHo6YsZU8_000032_000042.mp4 1621 | ./data/k400/train/running_on_treadmill/GXuK08CdhaI_000001_000011.mp4 1622 | ./data/k400/train/playing_paintball/-cjfVN5zZ0M_000082_000092.mp4 1623 | ./data/k400/train/celebrating/mT-GfwDIowU_000023_000033.mp4 1624 | ./data/k400/train/shaking_head/_kQCR5iinvQ_000020_000030.mp4 1625 | ./data/k400/train/cleaning_windows/ixo30kPy_vw_000000_000010.mp4 1626 | ./data/k400/train/giving_or_receiving_award/YRuUyHjPFoI_000026_000036.mp4 1627 | ./data/k400/train/brushing_teeth/36Z90gNSgDI_000049_000059.mp4 1628 | ./data/k400/train/brushing_hair/PnANXxooO1Q_000002_000012.mp4 1629 | ./data/k400/train/tobogganing/rPCct76wxuY_000010_000020.mp4 1630 | ./data/k400/train/feeding_birds/-5VuqHbo5nE_000004_000014.mp4 1631 | ./data/k400/train/jumping_into_pool/9GH551xbTwQ_000002_000012.mp4 1632 | ./data/k400/train/riding_elephant/fj-U-JZt-pk_000026_000036.mp4 1633 | ./data/k400/train/eating_spaghetti/nky18LgdLaA_000000_000010.mp4 1634 | ./data/k400/train/passing_American_football_(in_game)/9Jy4LjOMs6Q_000007_000017.mp4 1635 | ./data/k400/train/carrying_baby/JYJ6qZ2DevY_000068_000078.mp4 1636 | ./data/k400/train/headbanging/IxvMHqi_6pU_000060_000070.mp4 1637 | ./data/k400/train/playing_violin/8bPopM68jIc_000168_000178.mp4 1638 | ./data/k400/train/playing_saxophone/aVMP6Q71NH8_000048_000058.mp4 1639 | ./data/k400/train/bungee_jumping/DJm_TSiAHb8_000061_000071.mp4 1640 | ./data/k400/train/singing/lN443FkBNsw_000030_000040.mp4 1641 | ./data/k400/train/playing_recorder/SL3WV2LOn-0_000002_000012.mp4 1642 | ./data/k400/train/waxing_chest/mQnAFZaJifc_000017_000027.mp4 1643 | ./data/k400/train/throwing_ball/o3FdqObLRow_000001_000011.mp4 1644 | ./data/k400/train/cooking_chicken/CYOXkmOHexM_000209_000219.mp4 1645 | ./data/k400/train/archery/jhC-8unF8OQ_000325_000335.mp4 1646 | ./data/k400/train/washing_feet/PH20M_Z1yTo_000468_000478.mp4 1647 | ./data/k400/train/finger_snapping/eqWmQj911Kc_000000_000010.mp4 1648 | ./data/k400/train/playing_trombone/kpI0NDwV94Y_000076_000086.mp4 1649 | ./data/k400/train/golf_putting/3lOu2yhrJfE_000144_000154.mp4 1650 | ./data/k400/train/playing_trombone/NMYOtBGA1VQ_000007_000017.mp4 1651 | ./data/k400/train/sanding_floor/zf24KFzctLs_000117_000127.mp4 1652 | ./data/k400/train/playing_xylophone/vW2OrcEBTu4_000036_000046.mp4 1653 | ./data/k400/train/eating_carrots/bBCHuEDw99s_000347_000357.mp4 1654 | ./data/k400/train/pushing_cart/NAGMyTOqwWA_000000_000010.mp4 1655 | ./data/k400/train/making_a_cake/hhvgIBist0k_000120_000130.mp4 1656 | ./data/k400/train/exercising_arm/A4tWEAGitpc_000011_000021.mp4 1657 | ./data/k400/train/tango_dancing/8cuD2DIuRM8_000134_000144.mp4 1658 | ./data/k400/train/pumping_gas/ylwTaXk_JEs_000014_000024.mp4 1659 | ./data/k400/train/skipping_rope/rMatLhHAdBk_000037_000047.mp4 1660 | ./data/k400/train/tickling/aYFnwHN9JkA_000003_000013.mp4 1661 | ./data/k400/train/bobsledding/xWYUzEHs6gg_000029_000039.mp4 1662 | ./data/k400/train/kicking_soccer_ball/5cQsI2i4bDM_000010_000020.mp4 1663 | ./data/k400/train/playing_drums/mau0kYsJB6E_000000_000010.mp4 1664 | ./data/k400/train/washing_hands/7lCPAVa0gFI_000029_000039.mp4 1665 | ./data/k400/train/passing_American_football_(not_in_game)/PDgfxdVpue8_000007_000017.mp4 1666 | ./data/k400/train/pushing_cart/QIp-xeNs-Gw_000050_000060.mp4 1667 | ./data/k400/train/dancing_charleston/KFljhGVj1Mg_000024_000034.mp4 1668 | ./data/k400/train/brushing_hair/tjEVCvNFBWg_000039_000049.mp4 1669 | ./data/k400/train/eating_cake/6krwfVFg1k0_000051_000061.mp4 1670 | ./data/k400/train/windsurfing/P5Oij4caLFw_000003_000013.mp4 1671 | ./data/k400/train/building_shed/8VZdqwGNNr8_001605_001615.mp4 1672 | ./data/k400/train/braiding_hair/lMh6hC_hlhQ_000013_000023.mp4 1673 | ./data/k400/train/skiing_slalom/FOwKKiEEOo8_000023_000033.mp4 1674 | ./data/k400/train/balloon_blowing/LG1l5fAWA0Y_000150_000160.mp4 1675 | ./data/k400/train/cleaning_floor/eiDA2P47yOA_000063_000073.mp4 1676 | ./data/k400/train/arranging_flowers/AxdHIdlVXOA_000200_000210.mp4 1677 | ./data/k400/train/dancing_ballet/UaO7bS5Ky6M_000174_000184.mp4 1678 | ./data/k400/train/using_computer/juwq_j78pj4_000649_000659.mp4 1679 | ./data/k400/train/ice_skating/D1IrFpMqLyQ_000000_000010.mp4 1680 | ./data/k400/train/watering_plants/uEFVAkOkVJs_000003_000013.mp4 1681 | ./data/k400/train/snowmobiling/RtDCZxiG_2g_000019_000029.mp4 1682 | ./data/k400/train/braiding_hair/23B55vhUaSE_000373_000383.mp4 1683 | ./data/k400/train/push_up/pcskTSg4mVc_000000_000010.mp4 1684 | ./data/k400/train/riding_camel/PWhoWFk7fLM_000236_000246.mp4 1685 | ./data/k400/train/bouncing_on_trampoline/jdJmAHE3DkQ_000012_000022.mp4 1686 | ./data/k400/train/dying_hair/3xRvcUQp19Y_000002_000012.mp4 1687 | ./data/k400/train/feeding_goats/rR71SnX3K4c_000007_000017.mp4 1688 | ./data/k400/train/fixing_hair/tP4VI8EODhc_000065_000075.mp4 1689 | ./data/k400/train/throwing_discus/Y9JBQ1B9QVQ_000021_000031.mp4 1690 | ./data/k400/train/bending_back/fpu80TZK2S0_000002_000012.mp4 1691 | ./data/k400/train/swinging_on_something/35AFrS1sQVA_000104_000114.mp4 1692 | ./data/k400/train/applying_cream/4vbYtphBPG0_000028_000038.mp4 1693 | ./data/k400/train/sword_fighting/TCORzuWPjsM_000051_000061.mp4 1694 | ./data/k400/train/skiing_crosscountry/8zDs78WzZWU_000200_000210.mp4 1695 | ./data/k400/train/front_raises/viJ758ovzPM_000015_000025.mp4 1696 | ./data/k400/train/hoverboarding/tGRpphyoYYw_000004_000014.mp4 1697 | ./data/k400/train/playing_piano/s5FIzdC3Fus_000015_000025.mp4 1698 | ./data/k400/train/shot_put/n0jlRH0z710_000003_000013.mp4 1699 | ./data/k400/train/playing_badminton/zQz68KpJxZE_000147_000157.mp4 1700 | ./data/k400/train/playing_harp/EQVV4dvBWI8_000164_000174.mp4 1701 | ./data/k400/train/smoking/nSTsXKbGsH4_000033_000043.mp4 1702 | ./data/k400/train/doing_nails/MhL35iaEYCI_000352_000362.mp4 1703 | ./data/k400/train/tasting_beer/-KViqaTb4nM_000238_000248.mp4 1704 | ./data/k400/train/opening_present/7rTDMrPWeEM_000002_000012.mp4 1705 | ./data/k400/train/playing_bass_guitar/6YQpF2VpunI_000031_000041.mp4 1706 | ./data/k400/train/crying/qkzYjlueXLI_000051_000061.mp4 1707 | ./data/k400/train/playing_guitar/Z5b1vwBX7MM_000036_000046.mp4 1708 | ./data/k400/train/blowing_out_candles/Mp8LQcZsYPM_000000_000010.mp4 1709 | ./data/k400/train/golf_driving/Ap2UU_zn9sI_000003_000013.mp4 1710 | ./data/k400/train/counting_money/cApeY0r39_g_000005_000015.mp4 1711 | ./data/k400/train/texting/2ry8qTm8Kiw_000000_000010.mp4 1712 | ./data/k400/train/playing_guitar/4RM67QN9034_000181_000191.mp4 1713 | ./data/k400/train/waxing_back/AqClhqFnq-M_000176_000186.mp4 1714 | ./data/k400/train/eating_carrots/e1DJkQobt3Y_000002_000012.mp4 1715 | ./data/k400/train/water_skiing/GPgMO-r-lcc_000015_000025.mp4 1716 | ./data/k400/train/snowkiting/s5GxHp4fTog_000076_000086.mp4 1717 | ./data/k400/train/abseiling/5QfpFAp1Euo_000383_000393.mp4 1718 | ./data/k400/train/air_drumming/QRt9jHC35OE_000054_000064.mp4 1719 | ./data/k400/train/bookbinding/fEMecq0Xoaw_000080_000090.mp4 1720 | ./data/k400/train/cutting_watermelon/jwHIXpTQbIM_000018_000028.mp4 1721 | ./data/k400/train/tapping_guitar/auRCwwSsPsQ_000187_000197.mp4 1722 | ./data/k400/train/ice_skating/FeFTT6nZAco_000000_000010.mp4 1723 | ./data/k400/train/building_shed/Jcj3NO4_jz8_000855_000865.mp4 1724 | ./data/k400/train/skiing_(not_slalom_or_crosscountry)/Cn0GRR0XrMU_000114_000124.mp4 1725 | ./data/k400/train/washing_hands/pdBrKmiIDPU_000043_000053.mp4 1726 | ./data/k400/train/swimming_butterfly_stroke/PmqEYqu1f4Q_000024_000034.mp4 1727 | ./data/k400/train/biking_through_snow/hhZR1xOZSlY_000024_000034.mp4 1728 | ./data/k400/train/bartending/z2dyw9L3vh0_000129_000139.mp4 1729 | ./data/k400/train/shaving_head/IWhtGHA7OuU_000089_000099.mp4 1730 | ./data/k400/train/digging/Yao1yac9ccY_000164_000174.mp4 1731 | ./data/k400/train/washing_dishes/vMz1HQ470E8_000024_000034.mp4 1732 | ./data/k400/train/strumming_guitar/4NWujYbuJN0_000019_000029.mp4 1733 | ./data/k400/train/catching_or_throwing_softball/J6saFT3qaFA_000005_000015.mp4 1734 | ./data/k400/train/shearing_sheep/QwnvVgmuH-Y_000026_000036.mp4 1735 | ./data/k400/train/flipping_pancake/oKBG2-g3nhQ_000008_000018.mp4 1736 | ./data/k400/train/playing_didgeridoo/bL3wmGicnvs_000006_000016.mp4 1737 | ./data/k400/train/belly_dancing/Cvs0OY_ohys_000015_000025.mp4 1738 | ./data/k400/train/using_computer/bpW6P8Kzf5k_000006_000016.mp4 1739 | ./data/k400/train/surfing_crowd/ZyumEuyFkak_000000_000010.mp4 1740 | ./data/k400/train/marching/vEESAm0sYO4_000292_000302.mp4 1741 | ./data/k400/train/catching_or_throwing_softball/MHxkOL_J9d0_000000_000010.mp4 1742 | ./data/k400/train/bowling/F4i6I-SsOb8_000014_000024.mp4 1743 | ./data/k400/train/playing_clarinet/sQB2tXsONLA_000370_000380.mp4 1744 | ./data/k400/train/dancing_macarena/WwRW60B1giw_000124_000134.mp4 1745 | ./data/k400/train/paragliding/JtJs7uz9oVA_000018_000028.mp4 1746 | ./data/k400/train/archery/9fAGh6N-h4I_000021_000031.mp4 1747 | ./data/k400/train/catching_or_throwing_baseball/OyFL1sSwcPQ_000139_000149.mp4 1748 | ./data/k400/train/stomping_grapes/LaRXbnKvwSo_000016_000026.mp4 1749 | ./data/k400/train/moving_furniture/W4EHHzVotV0_000067_000077.mp4 1750 | ./data/k400/train/playing_poker/GduTBZqW654_000037_000047.mp4 1751 | ./data/k400/train/barbequing/4cMxdVgaI0s_000052_000062.mp4 1752 | ./data/k400/train/tai_chi/O0EnJO9imA0_000057_000067.mp4 1753 | ./data/k400/train/capoeira/YmbXdSgxLik_000019_000029.mp4 1754 | ./data/k400/train/ice_climbing/ZeIoLeFaRz0_000126_000136.mp4 1755 | ./data/k400/train/playing_cymbals/q3Ixtyw18OQ_000155_000165.mp4 1756 | ./data/k400/train/smoking_hookah/7N_WYSAbHv0_000062_000072.mp4 1757 | ./data/k400/train/driving_car/nwNhByHti18_000139_000149.mp4 1758 | ./data/k400/train/bowling/avRXvS0Eafo_000231_000241.mp4 1759 | ./data/k400/train/canoeing_or_kayaking/tPuJlrO7Ca8_000046_000056.mp4 1760 | ./data/k400/train/salsa_dancing/h0LAm1NwZwc_000108_000118.mp4 1761 | ./data/k400/train/dunking_basketball/q5TBF6jHA88_000002_000012.mp4 1762 | ./data/k400/train/pumping_fist/iZwgq01FBSg_000035_000045.mp4 1763 | ./data/k400/train/playing_basketball/vLA0tbNjsNg_000048_000058.mp4 1764 | ./data/k400/train/pushing_cart/aB-fDY_W4PU_000003_000013.mp4 1765 | ./data/k400/train/massaging_back/NDlqudeMzvc_000289_000299.mp4 1766 | ./data/k400/train/doing_laundry/w53BeHr4I_A_000037_000047.mp4 1767 | ./data/k400/train/windsurfing/oefpXaUHpJg_000020_000030.mp4 1768 | ./data/k400/train/massaging_back/y0T8QYYmC9M_000176_000186.mp4 1769 | ./data/k400/train/setting_table/ieEJOTKpYjk_000000_000010.mp4 1770 | ./data/k400/train/massaging_legs/aJyJ1Jo7oTA_000000_000010.mp4 1771 | -------------------------------------------------------------------------------- /engine_pretrain.py: -------------------------------------------------------------------------------- 1 | import math 2 | import sys 3 | from typing import Iterable 4 | 5 | import torch 6 | from tools import utils 7 | 8 | def train_one_epoch(model_online: torch.nn.Module, 9 | model_target: torch.nn.Module, 10 | target_without_ddp: torch.nn.Module, 11 | data_loader: Iterable, optimizer: torch.optim.Optimizer, 12 | device: torch.device, epoch: int, loss_scaler, 13 | momentum_schedule, 14 | log_writer=None, 15 | args=None): 16 | model_online.train(True) 17 | metric_logger = utils.MetricLogger(delimiter=" ") 18 | metric_logger.add_meter('lr', utils.SmoothedValue(window_size=1, fmt='{value:.6f}')) 19 | header = 'Epoch: [{}]'.format(epoch) 20 | print_freq = 20 21 | 22 | update_freq = args.update_freq 23 | 24 | optimizer.zero_grad() 25 | 26 | for data_iter_step, (samples1, samples2) in enumerate(metric_logger.log_every(data_loader, print_freq, header)): 27 | # we use a per iteration (instead of per epoch) lr scheduler 28 | if data_iter_step % update_freq == 0: 29 | utils.adjust_learning_rate(optimizer, data_iter_step / len(data_loader) + epoch, args) 30 | 31 | if not isinstance(samples1, list): 32 | samples1 = samples1.to(device, non_blocking=True) 33 | 34 | if not isinstance(samples2, list): 35 | samples2 = samples2.to(device, non_blocking=True) 36 | 37 | if args.use_amp: 38 | with torch.cuda.amp.autocast(): 39 | online_loss, online_pred, online_mask, ids_shuffle, ids_restore = \ 40 | model_online(samples1, ids_shuffle=None, ids_restore=None) 41 | with torch.no_grad(): 42 | model_target.eval() 43 | target_loss, target_pred = model_target(samples2, \ 44 | ids_shuffle=ids_shuffle, ids_restore=ids_restore) 45 | rec_cons_loss = utils.cons_loss(online_pred, online_mask, target_pred) 46 | loss = online_loss + target_loss + args.gamma * rec_cons_loss 47 | else: 48 | online_loss, online_pred, online_mask, ids_shuffle, ids_restore = \ 49 | model_online(samples1, ids_shuffle=None, ids_restore=None) 50 | with torch.no_grad(): 51 | model_target.eval() 52 | target_loss, target_pred = model_target(samples2, \ 53 | ids_shuffle=ids_shuffle, ids_restore=ids_restore) 54 | rec_cons_loss = utils.cons_loss(online_pred, online_mask, target_pred) 55 | loss = online_loss + target_loss + args.gamma * rec_cons_loss 56 | 57 | loss_value = loss.item() 58 | online_loss_value = online_loss.item() 59 | target_loss_value = target_loss.item() 60 | rec_cons_loss_value = rec_cons_loss.item() 61 | 62 | if not math.isfinite(loss_value): 63 | print("Loss is {}, stopping training".format(loss_value)) 64 | sys.exit(1) 65 | 66 | loss /= update_freq 67 | loss_scaler(loss, optimizer, parameters=model_online.parameters(), 68 | update_grad=(data_iter_step + 1) % update_freq == 0) 69 | if (data_iter_step + 1) % update_freq == 0: 70 | optimizer.zero_grad() 71 | torch.cuda.empty_cache() # clear the GPU cache at a regular interval for training ME network 72 | 73 | # EMA update for the teacher 74 | with torch.no_grad(): 75 | ms = momentum_schedule[data_iter_step] # momentum parameter 76 | if args.distributed: 77 | for param_q, param_k in zip( 78 | model_online.module.parameters(), target_without_ddp.parameters() 79 | ): 80 | param_k.data.mul_(ms).add_((1 - ms) * param_q.detach().data) 81 | else: 82 | for param_q, param_k in zip( 83 | model_online.parameters(), target_without_ddp.parameters() 84 | ): 85 | param_k.data.mul_(ms).add_((1 - ms) * param_q.detach().data) 86 | 87 | torch.cuda.synchronize() 88 | 89 | metric_logger.update(loss=loss_value) 90 | metric_logger.update(online_loss=online_loss_value) 91 | metric_logger.update(target_loss=target_loss_value) 92 | metric_logger.update(rec_cons_loss=rec_cons_loss_value) 93 | 94 | lr = optimizer.param_groups[0]["lr"] 95 | metric_logger.update(lr=lr) 96 | 97 | loss_value_reduce = utils.all_reduce_mean(loss_value) 98 | online_loss_value_reduce = utils.all_reduce_mean(online_loss_value) 99 | target_loss_value_reduce = utils.all_reduce_mean(target_loss_value) 100 | rec_cons_loss_value_reduce = utils.all_reduce_mean(rec_cons_loss_value) 101 | if log_writer is not None and (data_iter_step + 1) % update_freq == 0: 102 | """ We use epoch_1000x as the x-axis in tensorboard. 103 | This calibrates different curves when batch size changes. 104 | """ 105 | epoch_1000x = int((data_iter_step / len(data_loader) + epoch) * 1000) 106 | log_writer.update(train_loss=loss_value_reduce, head="loss", step=epoch_1000x) 107 | log_writer.update(train_loss=online_loss_value_reduce, head="online_loss", step=epoch_1000x) 108 | log_writer.update(train_loss=target_loss_value_reduce, head="target_loss", step=epoch_1000x) 109 | log_writer.update(train_loss=rec_cons_loss_value_reduce, head="rec_cons_loss", step=epoch_1000x) 110 | log_writer.update(lr=lr, head="opt", step=epoch_1000x) 111 | 112 | metric_logger.synchronize_between_processes() 113 | print("Averaged stats:", metric_logger) 114 | return {k: meter.global_avg for k, meter in metric_logger.meters.items()} -------------------------------------------------------------------------------- /main_pretrain.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import datetime 3 | import setproctitle 4 | import numpy as np 5 | import time 6 | import json 7 | import os 8 | from pathlib import Path 9 | 10 | import torch 11 | import torch.backends.cudnn as cudnn 12 | from models.dataloader_mac import YT18Dataset, K400Dataset 13 | 14 | import timm.optim.optim_factory as optim_factory 15 | 16 | import models.video_mac as video_mac 17 | from engine_pretrain import train_one_epoch 18 | 19 | 20 | from tools import utils 21 | from tools.utils import NativeScalerWithGradNormCount as NativeScaler 22 | from tools.utils import str2bool 23 | 24 | def get_args_parser(): 25 | parser = argparse.ArgumentParser('Video-MAC pre-training', add_help=False) 26 | parser.add_argument('--batch_size', default=64, type=int, 27 | help='Per GPU batch size') 28 | parser.add_argument('--epochs', default=800, type=int) 29 | parser.add_argument('--warmup_epochs', type=int, default=40, metavar='N', 30 | help='epochs to warmup LR') 31 | parser.add_argument('--update_freq', default=1, type=int, 32 | help='gradient accumulation step') 33 | parser.add_argument('--use_amp', type=str2bool, default=False) 34 | parser.add_argument('--use_wandb', type=str2bool, default=False) 35 | 36 | # Model parameters 37 | parser.add_argument('--model', default='convnets', type=str, metavar='MODEL', 38 | help='Name of model to train') 39 | parser.add_argument('--input_size', default=224, type=int, 40 | help='image input size') 41 | parser.add_argument('--mask_ratio', default=0.75, type=float, 42 | help='Masking ratio (percentage of removed patches).') 43 | parser.add_argument('--patch_size', default=32, type=int, 44 | help='Patch size') 45 | parser.add_argument('--norm_pix_loss', action='store_true', 46 | help='Use (per-patch) normalized pixels as targets for computing loss') 47 | parser.set_defaults(norm_pix_loss=True) 48 | parser.add_argument('--decoder_depth', type=int, default=1) 49 | parser.add_argument('--decoder_embed_dim', type=int, default=512) 50 | 51 | # Optimizer parameters 52 | parser.add_argument('--weight_decay', type=float, default=0.05, 53 | help='weight decay (default: 0.05)') 54 | parser.add_argument('--lr', type=float, default=None, metavar='LR', 55 | help='learning rate (absolute lr)') 56 | parser.add_argument('--blr', type=float, default=1.5e-4, metavar='LR', 57 | help='base learning rate: absolute_lr = base_lr * total_batch_size / 256') 58 | parser.add_argument('--min_lr', type=float, default=0., metavar='LR', 59 | help='lower lr bound for cyclic schedulers that hit 0') 60 | 61 | # Dataset parameters 62 | parser.add_argument('--data_path', default='/data/imagenet', type=str, 63 | help='dataset path') 64 | parser.add_argument('--output_dir', default='', 65 | help='path where to save, empty for no saving') 66 | parser.add_argument('--log_dir', default=None, 67 | help='path where to tensorboard log') 68 | parser.add_argument('--device', default='cuda', 69 | help='device to use for training / testing') 70 | parser.add_argument('--seed', default=0, type=int) 71 | parser.add_argument('--resume', default='', 72 | help='resume from checkpoint') 73 | 74 | parser.add_argument('--auto_resume', type=str2bool, default=True) 75 | parser.add_argument('--save_ckpt', type=str2bool, default=True) 76 | parser.add_argument('--save_ckpt_freq', default=5, type=int) 77 | parser.add_argument('--save_ckpt_num', default=10, type=int) 78 | 79 | parser.add_argument('--start_epoch', default=0, type=int, metavar='N', 80 | help='start epoch') 81 | parser.add_argument('--num_workers', default=16, type=int) 82 | parser.add_argument('--pin_mem', type=str2bool, default=True, 83 | help='Pin CPU memory in DataLoader for more efficient (sometimes) transfer to GPU.') 84 | 85 | # Evaluation parameters 86 | parser.add_argument('--crop_pct', type=float, default=None) 87 | 88 | # distributed training parameters 89 | parser.add_argument('--world_size', default=1, type=int, 90 | help='number of distributed processes') 91 | parser.add_argument('--local_rank', default=-1, type=int) 92 | parser.add_argument('--dist_on_itp', type=str2bool, default=False) 93 | parser.add_argument('--dist_url', default='env://', 94 | help='url used to set up distributed training') 95 | 96 | # loss balance weight gamma 97 | parser.add_argument( 98 | "--gamma", type=float, default=1.0, help="loss balance weight gamma" 99 | ) 100 | # For target encoder 101 | parser.add_argument( 102 | "--momentum_target", 103 | default=0.996, 104 | type=float, 105 | help="""Base EMA 106 | parameter for teacher update. The value is increased to 1 107 | during training with cosine schedule. 108 | We recommend setting a higher value with small batches: 109 | for example use 0.9995 with batch size of 256.""", 110 | ) 111 | return parser 112 | 113 | def main(args): 114 | # set name 115 | setproctitle.setproctitle("Video-MAC") 116 | utils.init_distributed_mode(args) 117 | 118 | print(args) 119 | device = torch.device(args.device) 120 | 121 | # fix the seed for reproducibility 122 | seed = args.seed + utils.get_rank() 123 | torch.manual_seed(seed) 124 | np.random.seed(seed) 125 | 126 | cudnn.benchmark = True 127 | 128 | # video dataset 129 | if 'yt18' in args.data_path or 'ytb18' in args.data_path: 130 | dataset_train = YT18Dataset(args.input_size, os.path.join(args.data_path, 'train')) 131 | elif 'k400' in args.data_path: 132 | dataset_train = K400Dataset(args.input_size, os.path.join(args.data_path, 'train')) 133 | 134 | num_tasks = utils.get_world_size() 135 | global_rank = utils.get_rank() 136 | 137 | sampler_train = torch.utils.data.DistributedSampler( 138 | dataset_train, num_replicas=num_tasks, rank=global_rank, shuffle=True, seed=args.seed, 139 | ) 140 | print("Sampler_train = %s" % str(sampler_train)) 141 | 142 | if global_rank == 0 and args.log_dir is not None: 143 | os.makedirs(args.log_dir, exist_ok=True) 144 | # log_writer = SummaryWriter(log_dir=args.log_dir) 145 | log_writer = utils.TensorboardLogger(log_dir=args.log_dir) 146 | else: 147 | log_writer = None 148 | 149 | data_loader_train = torch.utils.data.DataLoader( 150 | dataset_train, sampler=sampler_train, 151 | batch_size=args.batch_size, 152 | num_workers=args.num_workers, 153 | pin_memory=args.pin_mem, 154 | drop_last=True, 155 | ) 156 | 157 | # define the model 158 | model_online = video_mac.__dict__[args.model]( 159 | mask_ratio=args.mask_ratio, 160 | decoder_depth=args.decoder_depth, 161 | decoder_embed_dim=args.decoder_embed_dim, 162 | norm_pix_loss=args.norm_pix_loss, 163 | patch_size=args.patch_size, 164 | compute_loss=True) 165 | model_target = video_mac.__dict__[args.model]( 166 | mask_ratio=args.mask_ratio, 167 | decoder_depth=args.decoder_depth, 168 | decoder_embed_dim=args.decoder_embed_dim, 169 | norm_pix_loss=args.norm_pix_loss, 170 | patch_size=args.patch_size, 171 | compute_loss=False) 172 | model_online.to(device) 173 | model_target.to(device) 174 | 175 | online_without_ddp = model_online 176 | target_without_ddp = model_target 177 | n_parameters = sum(p.numel() for p in model_online.parameters() if p.requires_grad) 178 | 179 | print("Online Model = %s" % str(online_without_ddp)) 180 | print("Target Model = %s" % str(target_without_ddp)) 181 | # print('number of params:', n_parameters) 182 | 183 | eff_batch_size = args.batch_size * args.update_freq * utils.get_world_size() 184 | num_training_steps_per_epoch = len(dataset_train) // eff_batch_size 185 | 186 | if args.lr is None: 187 | args.lr = args.blr * eff_batch_size / 256 188 | 189 | print("base lr: %.2e" % (args.lr * 256 / eff_batch_size)) 190 | print("actual lr: %.2e" % args.lr) 191 | 192 | print("accumulate grad iterations: %d" % args.update_freq) 193 | print("effective batch size: %d" % eff_batch_size) 194 | 195 | if args.distributed: 196 | model_online = torch.nn.parallel.DistributedDataParallel(model_online, device_ids=[args.gpu], find_unused_parameters=False) 197 | online_without_ddp = model_online.module 198 | target_without_ddp.load_state_dict(model_online.module.state_dict()) 199 | else: 200 | target_without_ddp.load_state_dict(model_online.state_dict()) 201 | for param in model_target.parameters(): 202 | param.requires_grad = False 203 | print(f"Online and Target are built: they are both {args.model} network.") 204 | 205 | param_groups = optim_factory.param_groups_weight_decay(online_without_ddp, args.weight_decay) 206 | optimizer = torch.optim.AdamW(param_groups, lr=args.lr, betas=(0.9, 0.95)) 207 | print(optimizer) 208 | loss_scaler = NativeScaler() 209 | 210 | # momentum parameter is increased to 1. during training with a cosine 211 | # schedule 212 | momentum_schedule = utils.cosine_scheduler( 213 | args.momentum_target, 1, args.epochs, len(data_loader_train) 214 | ) 215 | 216 | utils.auto_load_model_distill( 217 | args=args, model_online=model_online, online_without_ddp=online_without_ddp, 218 | model_target=model_target, target_without_ddp=target_without_ddp, 219 | optimizer=optimizer, loss_scaler=loss_scaler) 220 | 221 | print(f"Start training for {args.epochs} epochs") 222 | start_time = time.time() 223 | for epoch in range(args.start_epoch, args.epochs): 224 | if args.distributed: 225 | data_loader_train.sampler.set_epoch(epoch) 226 | if log_writer is not None: 227 | log_writer.set_step(epoch * num_training_steps_per_epoch * args.update_freq) 228 | train_stats = train_one_epoch( 229 | model_online, model_target, target_without_ddp, 230 | data_loader_train, optimizer, device, epoch, 231 | loss_scaler, momentum_schedule, log_writer=log_writer, 232 | args=args 233 | ) 234 | if args.output_dir and args.save_ckpt: 235 | if (epoch + 1) % args.save_ckpt_freq == 0 or epoch + 1 == args.epochs: 236 | utils.save_model_distill( 237 | args=args, 238 | model_online=model_online, 239 | online_without_ddp=online_without_ddp, 240 | model_target=model_target, 241 | target_without_ddp=target_without_ddp, 242 | optimizer=optimizer, 243 | loss_scaler=loss_scaler, epoch=epoch) 244 | log_stats = {**{f'train_{k}': v for k, v in train_stats.items()}, 245 | 'epoch': epoch, 246 | 'n_parameters': n_parameters} 247 | if args.output_dir and utils.is_main_process(): 248 | if log_writer is not None: 249 | log_writer.flush() 250 | with open(os.path.join(args.output_dir, "log.txt"), mode="a", encoding="utf-8") as f: 251 | f.write(json.dumps(log_stats) + "\n") 252 | 253 | total_time = time.time() - start_time 254 | total_time_str = str(datetime.timedelta(seconds=int(total_time))) 255 | print('Training time {}'.format(total_time_str)) 256 | 257 | if __name__ == '__main__': 258 | args = get_args_parser() 259 | args = args.parse_args() 260 | if args.output_dir: 261 | Path(args.output_dir).mkdir(parents=True, exist_ok=True) 262 | main(args) -------------------------------------------------------------------------------- /models/convnextv1_sparse.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | from functools import partial 4 | from timm.models.layers import trunc_normal_ 5 | 6 | from .utils import ( 7 | LayerNorm, 8 | MinkowskiLayerNorm, 9 | MinkowskiDropPath 10 | ) 11 | from MinkowskiEngine import ( 12 | MinkowskiConvolution, 13 | MinkowskiDepthwiseConvolution, 14 | MinkowskiLinear, 15 | MinkowskiGELU, 16 | SparseTensor 17 | ) 18 | from MinkowskiOps import ( 19 | to_sparse, 20 | ) 21 | 22 | 23 | class Block(nn.Module): 24 | """ Sparse ConvNeXtV1 Block. 25 | 26 | Args: 27 | dim (int): Number of input channels. 28 | drop_path (float): Stochastic depth rate. Default: 0.0 29 | layer_scale_init_value (float): Init value for Layer Scale. Default: 1e-6. (MAE: 0) 30 | """ 31 | def __init__(self, dim, drop_path=0., layer_scale_init_value=0, D=3): 32 | super().__init__() 33 | self.dwconv = MinkowskiDepthwiseConvolution(dim, kernel_size=7, bias=True, dimension=D) 34 | self.norm = MinkowskiLayerNorm(dim, 1e-6) 35 | self.pwconv1 = MinkowskiLinear(dim, 4 * dim) 36 | self.act = MinkowskiGELU() 37 | self.pwconv2 = MinkowskiLinear(4 * dim, dim) 38 | self.drop_path = MinkowskiDropPath(drop_path) 39 | 40 | def forward(self, x): 41 | input = x 42 | x = self.dwconv(x) 43 | x = self.norm(x) 44 | x = self.pwconv1(x) 45 | x = self.act(x) 46 | x = self.pwconv2(x) 47 | 48 | x = input + self.drop_path(x) 49 | return x 50 | 51 | 52 | class SparseConvNeXtV1(nn.Module): 53 | """ Sparse ConvNeXtV1 54 | 55 | Args: 56 | in_chans (int): Number of input image channels. Default: 3 57 | num_classes (int): Number of classes for classification head. Default: 1000 58 | depths (tuple(int)): Number of blocks at each stage. Default: [3, 3, 27, 3] 59 | dims (int): Feature dimension at each stage. Default: [96, 192, 384, 768] 60 | drop_path_rate (float): Stochastic depth rate. Default: 0. 61 | head_init_scale (float): Init scaling value for classifier weights and biases. Default: 1. 62 | """ 63 | def __init__(self, 64 | in_chans=3, 65 | num_classes=1000, 66 | depths=[3, 3, 27, 3], 67 | dims=[96, 192, 384, 768], 68 | drop_path_rate=0., 69 | layer_scale_init_value=0, 70 | D=3, 71 | patch_size=32): 72 | super().__init__() 73 | self.depths = depths 74 | self.num_classes = num_classes 75 | self.patch_size = patch_size 76 | self.downsample_layers = nn.ModuleList() # stem and 3 intermediate downsampling conv layers 77 | stem = nn.Sequential( 78 | nn.Conv2d(in_chans, dims[0], kernel_size=4, stride=4), 79 | LayerNorm(dims[0], eps=1e-6, data_format="channels_first") 80 | ) 81 | self.downsample_layers.append(stem) 82 | for i in range(3): 83 | downsample_layer = nn.Sequential( 84 | MinkowskiLayerNorm(dims[i], eps=1e-6), 85 | MinkowskiConvolution(dims[i], dims[i+1], kernel_size=2, stride=2, bias=True, dimension=D) 86 | ) 87 | self.downsample_layers.append(downsample_layer) 88 | 89 | self.stages = nn.ModuleList() # 4 feature resolution stages, each consisting of multiple residual blocks 90 | dp_rates=[x.item() for x in torch.linspace(0, drop_path_rate, sum(depths))] 91 | cur = 0 92 | for i in range(4): 93 | stage = nn.Sequential( 94 | *[Block(dim=dims[i], drop_path=dp_rates[cur + j], 95 | layer_scale_init_value=layer_scale_init_value, D=D) for j in range(depths[i])] 96 | ) 97 | self.stages.append(stage) 98 | cur += depths[i] 99 | 100 | norm_layer = partial(MinkowskiLayerNorm, eps=1e-6) 101 | for i_layer in range(4): 102 | layer = norm_layer(dims[i_layer]) 103 | layer_name = f'norm{i_layer}' 104 | self.add_module(layer_name, layer) 105 | 106 | def _init_weights(self, m): 107 | if isinstance(m, MinkowskiConvolution): 108 | trunc_normal_(m.kernel, std=.02) 109 | nn.init.constant_(m.bias, 0) 110 | if isinstance(m, MinkowskiDepthwiseConvolution): 111 | trunc_normal_(m.kernel, std=.02) 112 | nn.init.constant_(m.bias, 0) 113 | if isinstance(m, MinkowskiLinear): 114 | trunc_normal_(m.linear.weight, std=.02) 115 | nn.init.constant_(m.linear.bias, 0) 116 | 117 | def upsample_mask(self, mask, scale): 118 | assert len(mask.shape) == 2 119 | p = int(mask.shape[1] ** .5) 120 | return mask.reshape(-1, p, p).\ 121 | repeat_interleave(scale, axis=1).\ 122 | repeat_interleave(scale, axis=2) 123 | 124 | def forward(self, x, mask): 125 | scale = int(x.shape[2] // self.downsample_layers[0][0].kernel_size[0] / (mask.shape[1] ** .5)) 126 | mask = self.upsample_mask(mask, scale) 127 | mask = mask.unsqueeze(1).type_as(x) 128 | 129 | # patch embedding 130 | x = self.downsample_layers[0](x) 131 | x *= (1.-mask) 132 | # sparse encoding 133 | x = to_sparse(x) 134 | for i in range(4): 135 | x = self.downsample_layers[i](x) if i > 0 else x 136 | x = self.stages[i](x) 137 | norm_layer = getattr(self, f'norm{i}') 138 | x = norm_layer(x) 139 | # densify 140 | x = x.dense()[0] 141 | return x 142 | -------------------------------------------------------------------------------- /models/convnextv2_sparse.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | from functools import partial 4 | from timm.models.layers import trunc_normal_ 5 | 6 | from .utils import ( 7 | LayerNorm, 8 | MinkowskiLayerNorm, 9 | MinkowskiGRN, 10 | MinkowskiDropPath 11 | ) 12 | from MinkowskiEngine import ( 13 | MinkowskiConvolution, 14 | MinkowskiDepthwiseConvolution, 15 | MinkowskiLinear, 16 | MinkowskiGELU, 17 | ) 18 | from MinkowskiOps import ( 19 | to_sparse, 20 | ) 21 | 22 | 23 | class Block(nn.Module): 24 | """ Sparse ConvNeXtV2 Block. 25 | 26 | Args: 27 | dim (int): Number of input channels. 28 | drop_path (float): Stochastic depth rate. Default: 0.0 29 | layer_scale_init_value (float): Init value for Layer Scale. Default: 1e-6. 30 | """ 31 | def __init__(self, dim, drop_path=0., D=3): 32 | super().__init__() 33 | self.dwconv = MinkowskiDepthwiseConvolution(dim, kernel_size=7, bias=True, dimension=D) 34 | self.norm = MinkowskiLayerNorm(dim, 1e-6) 35 | self.pwconv1 = MinkowskiLinear(dim, 4 * dim) 36 | self.act = MinkowskiGELU() 37 | self.pwconv2 = MinkowskiLinear(4 * dim, dim) 38 | self.grn = MinkowskiGRN(4 * dim) 39 | self.drop_path = MinkowskiDropPath(drop_path) 40 | 41 | def forward(self, x): 42 | input = x 43 | x = self.dwconv(x) 44 | x = self.norm(x) 45 | x = self.pwconv1(x) 46 | x = self.act(x) 47 | x = self.grn(x) 48 | x = self.pwconv2(x) 49 | x = input + self.drop_path(x) 50 | return x 51 | 52 | 53 | class SparseConvNeXtV2(nn.Module): 54 | """ Sparse ConvNeXtV2 55 | 56 | Args: 57 | in_chans (int): Number of input image channels. Default: 3 58 | num_classes (int): Number of classes for classification head. Default: 1000 59 | depths (tuple(int)): Number of blocks at each stage. Default: [3, 3, 27, 3] 60 | dims (int): Feature dimension at each stage. Default: [96, 192, 384, 768] 61 | drop_path_rate (float): Stochastic depth rate. Default: 0. 62 | head_init_scale (float): Init scaling value for classifier weights and biases. Default: 1. 63 | """ 64 | def __init__(self, 65 | in_chans=3, 66 | num_classes=1000, 67 | depths=[3, 3, 27, 3], 68 | dims=[96, 192, 384, 768], 69 | drop_path_rate=0., 70 | D=3, 71 | patch_size=32): 72 | super().__init__() 73 | self.depths = depths 74 | self.num_classes = num_classes 75 | self.patch_size = patch_size 76 | self.downsample_layers = nn.ModuleList() # stem and 3 intermediate downsampling conv layers 77 | stem = nn.Sequential( 78 | nn.Conv2d(in_chans, dims[0], kernel_size=4, stride=4), 79 | LayerNorm(dims[0], eps=1e-6, data_format="channels_first") 80 | ) 81 | self.downsample_layers.append(stem) 82 | for i in range(3): 83 | downsample_layer = nn.Sequential( 84 | MinkowskiLayerNorm(dims[i], eps=1e-6), 85 | MinkowskiConvolution(dims[i], dims[i+1], kernel_size=2, stride=2, bias=True, dimension=D) 86 | ) 87 | self.downsample_layers.append(downsample_layer) 88 | 89 | self.stages = nn.ModuleList() # 4 feature resolution stages, each consisting of multiple residual blocks 90 | dp_rates=[x.item() for x in torch.linspace(0, drop_path_rate, sum(depths))] 91 | cur = 0 92 | for i in range(4): 93 | stage = nn.Sequential( 94 | *[Block(dim=dims[i], drop_path=dp_rates[cur + j], D=D) for j in range(depths[i])] 95 | ) 96 | self.stages.append(stage) 97 | cur += depths[i] 98 | 99 | norm_layer = partial(MinkowskiLayerNorm, eps=1e-6) 100 | for i_layer in range(4): 101 | layer = norm_layer(dims[i_layer]) 102 | layer_name = f'norm{i_layer}' 103 | self.add_module(layer_name, layer) 104 | 105 | def _init_weights(self, m): 106 | if isinstance(m, MinkowskiConvolution): 107 | trunc_normal_(m.kernel, std=.02) 108 | nn.init.constant_(m.bias, 0) 109 | if isinstance(m, MinkowskiDepthwiseConvolution): 110 | trunc_normal_(m.kernel, std=.02) 111 | nn.init.constant_(m.bias, 0) 112 | if isinstance(m, MinkowskiLinear): 113 | trunc_normal_(m.linear.weight, std=.02) 114 | nn.init.constant_(m.linear.bias, 0) 115 | 116 | def upsample_mask(self, mask, scale): 117 | assert len(mask.shape) == 2 118 | p = int(mask.shape[1] ** .5) 119 | return mask.reshape(-1, p, p).\ 120 | repeat_interleave(scale, axis=1).\ 121 | repeat_interleave(scale, axis=2) 122 | 123 | def forward(self, x, mask): 124 | scale = int(x.shape[2] // self.downsample_layers[0][0].kernel_size[0] / (mask.shape[1] ** .5)) 125 | mask = self.upsample_mask(mask, scale) 126 | mask = mask.unsqueeze(1).type_as(x) 127 | 128 | # patch embedding 129 | x = self.downsample_layers[0](x) 130 | x *= (1.-mask) 131 | # sparse encoding 132 | x = to_sparse(x) 133 | for i in range(4): 134 | x = self.downsample_layers[i](x) if i > 0 else x 135 | x = self.stages[i](x) 136 | norm_layer = getattr(self, f'norm{i}') 137 | x = norm_layer(x) 138 | # densify 139 | x = x.dense()[0] 140 | return x 141 | 142 | 143 | class SparseConvNeXtV2_Isotropic(nn.Module): 144 | """ Sparse ConvNeXtV2 Isotropic 145 | 146 | Args: 147 | in_chans (int): Number of input image channels. Default: 3 148 | num_classes (int): Number of classes for classification head. Default: 1000 149 | depths (tuple(int)): Number of blocks at each stage. Default: [3, 3, 27, 3] 150 | dims (int): Feature dimension at each stage. Default: [96, 192, 384, 768] 151 | drop_path_rate (float): Stochastic depth rate. Default: 0. 152 | head_init_scale (float): Init scaling value for classifier weights and biases. Default: 1. 153 | """ 154 | def __init__(self, 155 | in_chans=3, 156 | num_classes=1000, 157 | depths=18, 158 | dims=384, 159 | drop_path_rate=0., 160 | D=3, 161 | patch_size=16): 162 | super().__init__() 163 | self.depths = depths 164 | self.num_classes = num_classes 165 | self.patch_size = patch_size 166 | self.stem = nn.Conv2d(in_chans, dims, kernel_size=patch_size, stride=patch_size) 167 | dp_rates=[x.item() for x in torch.linspace(0, drop_path_rate, depths)] 168 | self.blocks = nn.Sequential(*[Block(dim=dims, drop_path=dp_rates[i], D=D) for i in range(depths)]) 169 | 170 | self.norm = MinkowskiLayerNorm(dims, eps=1e-6) 171 | 172 | def _init_weights(self, m): 173 | if isinstance(m, MinkowskiConvolution): 174 | trunc_normal_(m.kernel, std=.02) 175 | nn.init.constant_(m.bias, 0) 176 | if isinstance(m, MinkowskiDepthwiseConvolution): 177 | trunc_normal_(m.kernel, std=.02) 178 | nn.init.constant_(m.bias, 0) 179 | if isinstance(m, MinkowskiLinear): 180 | trunc_normal_(m.linear.weight, std=.02) 181 | nn.init.constant_(m.linear.bias, 0) 182 | 183 | def reshape_mask(self, mask): 184 | assert len(mask.shape) == 2 185 | p = int(mask.shape[1] ** .5) 186 | return mask.reshape(-1, p, p) 187 | 188 | def forward(self, x, mask): 189 | mask = self.reshape_mask(mask) 190 | mask = mask.unsqueeze(1).type_as(x) 191 | 192 | # patch embedding 193 | x = self.stem(x) 194 | x *= (1.-mask) 195 | # sparse encoding 196 | x = to_sparse(x) 197 | x = self.blocks(x) 198 | x = self.norm(x) 199 | # densify 200 | x = x.dense()[0] 201 | return x -------------------------------------------------------------------------------- /models/dataloader_mac.py: -------------------------------------------------------------------------------- 1 | import os 2 | import glob 3 | import random 4 | from PIL import Image 5 | 6 | from torch.utils.data import Dataset 7 | import torchvision.transforms as transforms 8 | from torchvision.transforms import InterpolationMode 9 | from torchvision.transforms import functional as F 10 | 11 | 12 | class VideoTransform: 13 | def __init__(self, size, scale=(0.2, 1.0), ratio=(3.0 / 4.0, 4.0 / 3.0), interpolation=InterpolationMode.BICUBIC): 14 | if not isinstance(scale, tuple) or not len(scale) == 2: 15 | raise ValueError('Scale should be a tuple with two elements.') 16 | 17 | self.size = (size, size) 18 | self.scale = scale 19 | self.ratio = ratio 20 | self.interpolation = interpolation 21 | self.normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) 22 | 23 | def __call__(self, img1, img2): 24 | i, j, h, w = transforms.RandomResizedCrop.get_params(img1, self.scale, self.ratio) 25 | img1 = F.resized_crop(img1, i, j, h, w, self.size, self.interpolation) 26 | img2 = F.resized_crop(img2, i, j, h, w, self.size, self.interpolation) 27 | 28 | if random.random() < 0.5: 29 | img1 = F.hflip(img1) 30 | img2 = F.hflip(img2) 31 | 32 | img1 = self.normalize(transforms.ToTensor()(img1)) 33 | img2 = self.normalize(transforms.ToTensor()(img2)) 34 | 35 | return img1, img2 36 | 37 | 38 | class YT18Dataset(Dataset): 39 | def __init__(self, input_size, root_dir): 40 | self.input_size = input_size 41 | self.transform = VideoTransform(size=input_size) 42 | 43 | # Get all frames from all videos 44 | self.frames = [] 45 | subdirs = glob.glob(root_dir + '/*') 46 | for subdir in subdirs: 47 | frames_in_subdir = sorted(glob.glob(subdir + '/*')) 48 | # Append frame pairs (frame_i, frame_i+1) to the list 49 | for i in range(len(frames_in_subdir) - 1): 50 | self.frames.append((frames_in_subdir[i], frames_in_subdir[i+1])) 51 | 52 | def __len__(self): 53 | return len(self.frames) 54 | 55 | def __getitem__(self, idx): 56 | frame1_path, frame2_path = self.frames[idx] 57 | 58 | frame1 = Image.open(frame1_path) 59 | frame2 = Image.open(frame2_path) 60 | 61 | return self.transform(frame1, frame2) 62 | 63 | 64 | class K400Dataset(Dataset): 65 | def __init__(self, input_size, root_dir): 66 | self.root_dir = root_dir 67 | self.input_size = input_size 68 | self.transform = VideoTransform(size=input_size) 69 | 70 | selected_subdirs_file = "./data/selected_subdirs.txt" 71 | if os.path.isfile(selected_subdirs_file): 72 | with open(selected_subdirs_file, "r") as f: 73 | selected_subdirs = f.read().splitlines() 74 | else: 75 | self.subdirs = glob.glob(root_dir + '/*/*') 76 | num_selected_subdirs = len(self.subdirs) // 130 77 | selected_subdirs = random.sample(self.subdirs, num_selected_subdirs) 78 | with open(selected_subdirs_file, "w") as f: 79 | for subdir in selected_subdirs: 80 | f.write(subdir + "\n") 81 | 82 | self.frame_pairs = [] # Store frame pairs for selected subdirs 83 | 84 | for subdir in selected_subdirs: 85 | frames = os.listdir(subdir) 86 | frames.sort() 87 | for i in range(len(frames) - 1): 88 | frame1 = os.path.join(subdir, frames[i]) 89 | frame2 = os.path.join(subdir, frames[i + 1]) 90 | self.frame_pairs.append((frame1, frame2)) 91 | 92 | def __len__(self): 93 | return len(self.frame_pairs) 94 | 95 | def __getitem__(self, idx): 96 | frame1_path, frame2_path = self.frame_pairs[idx] 97 | 98 | frame1 = Image.open(frame1_path) 99 | frame2 = Image.open(frame2_path) 100 | 101 | return self.transform(frame1, frame2) 102 | -------------------------------------------------------------------------------- /models/resnetv2_sparse.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | 4 | from .utils import ( 5 | LayerNorm, 6 | MinkowskiLayerNorm 7 | ) 8 | from MinkowskiEngine import ( 9 | MinkowskiConvolution, 10 | MinkowskiGELU 11 | ) 12 | from MinkowskiOps import ( 13 | to_sparse, 14 | ) 15 | 16 | 17 | class BasicBlock(nn.Module): 18 | """ Sparse Basic Block. 19 | modified 20 | """ 21 | expansion: int = 1 22 | def __init__(self, in_channels, out_channels, stride=1, downsample=None, D=2): 23 | super().__init__() 24 | self.conv1 = MinkowskiConvolution(in_channels, out_channels, kernel_size=3, stride=stride, bias=False, dimension=D) 25 | self.norm1 = MinkowskiLayerNorm(out_channels, eps=1e-6) 26 | self.conv2 = MinkowskiConvolution(out_channels, out_channels, kernel_size=3, bias=False, dimension=D) 27 | self.norm2 = MinkowskiLayerNorm(out_channels, 1e-6) 28 | 29 | self.downsample = downsample 30 | self.stride = stride 31 | self.act = MinkowskiGELU() 32 | 33 | def forward(self, x): 34 | residual = x 35 | 36 | out = self.conv1(x) 37 | out = self.norm1(out) 38 | out = self.act(out) 39 | 40 | out = self.conv2(out) 41 | out = self.norm2(out) 42 | 43 | if self.downsample is not None: 44 | residual = self.downsample(x) 45 | 46 | out += residual 47 | out = self.act(out) 48 | return out 49 | 50 | 51 | class Bottleneck(nn.Module): 52 | """ Sparse Bottleneck Block 53 | modified 54 | """ 55 | expansion: int = 4 56 | def __init__(self, in_channels, out_channels, stride=1, downsample=None, D=2): 57 | super().__init__() 58 | self.conv1 = MinkowskiConvolution(in_channels, out_channels, kernel_size=1, bias=False, dimension=D) 59 | self.norm1 = MinkowskiLayerNorm(out_channels, eps=1e-6) 60 | self.conv2 = MinkowskiConvolution(out_channels, out_channels, kernel_size=3, stride=stride, bias=False, dimension=D) 61 | self.norm2 = MinkowskiLayerNorm(out_channels, eps=1e-6) 62 | self.conv3 = MinkowskiConvolution(out_channels, out_channels * self.expansion, kernel_size=1, bias=False, dimension=D) 63 | self.norm3 = MinkowskiLayerNorm(out_channels * self.expansion, eps=1e-6) 64 | 65 | self.downsample = downsample 66 | self.stride = stride 67 | self.act = MinkowskiGELU() 68 | 69 | def forward(self, x): 70 | residual = x 71 | 72 | out = self.conv1(x) 73 | out = self.norm1(out) 74 | out = self.act(out) 75 | 76 | out = self.conv2(out) 77 | out = self.norm2(out) 78 | out = self.act(out) 79 | 80 | out = self.conv3(out) 81 | out = self.norm3(out) 82 | 83 | if self.downsample is not None: 84 | residual = self.downsample(x) 85 | 86 | out += residual 87 | out = self.act(out) 88 | return out 89 | 90 | 91 | class SparseResNet(nn.Module): 92 | """ Sparse ResNet 93 | modified 94 | """ 95 | def __init__(self, block, layers, pretrained=False): 96 | super().__init__() 97 | self.in_channels = 64 98 | self.stem = nn.Sequential( 99 | nn.Conv2d(3, 64, kernel_size=4, stride=4), 100 | LayerNorm(64, eps=1e-6, data_format="channels_first") 101 | ) 102 | self.layer1 = self._make_layer(block, 64, layers[0]) 103 | self.layer2 = self._make_layer(block, 128, layers[1], stride=2) 104 | self.layer3 = self._make_layer(block, 256, layers[2], stride=2) 105 | self.layer4 = self._make_layer(block, 512, layers[3], stride=2) 106 | 107 | def _make_layer(self, block, out_channels, blocks, stride=1, D=2): 108 | downsample = None 109 | if stride != 1 or self.in_channels != out_channels * block.expansion: 110 | downsample = nn.Sequential( 111 | MinkowskiConvolution(self.in_channels, out_channels * block.expansion, 112 | kernel_size=1, stride=stride, bias=False, dimension=D), 113 | MinkowskiLayerNorm(out_channels * block.expansion, eps=1e-6) 114 | ) 115 | 116 | layers = [] 117 | layers.append(block(self.in_channels, out_channels, stride, downsample)) 118 | self.in_channels = out_channels * block.expansion 119 | for i in range(1, blocks): 120 | layers.append(block(self.in_channels, out_channels)) 121 | 122 | return nn.Sequential(*layers) 123 | 124 | def upsample_mask(self, mask, scale): 125 | assert len(mask.shape) == 2 126 | p = int(mask.shape[1] ** .5) 127 | return mask.reshape(-1, p, p).\ 128 | repeat_interleave(scale, axis=1).\ 129 | repeat_interleave(scale, axis=2) 130 | 131 | def forward(self, x, mask): 132 | mask = self.upsample_mask(mask, 8) 133 | mask = mask.unsqueeze(1).type_as(x) 134 | 135 | x = self.stem(x) 136 | x *= (1. - mask) 137 | # sparse encoding 138 | x = to_sparse(x) 139 | x = self.layer1(x) 140 | x = self.layer2(x) 141 | x = self.layer3(x) 142 | x = self.layer4(x) 143 | 144 | # densify 145 | x = x.dense()[0] 146 | return x 147 | -------------------------------------------------------------------------------- /models/utils.py: -------------------------------------------------------------------------------- 1 | import numpy.random as random 2 | import numpy as np 3 | import wandb 4 | import matplotlib.pyplot as plt 5 | 6 | import torch 7 | import torch.nn as nn 8 | import torch.nn.functional as F 9 | from MinkowskiEngine import SparseTensor 10 | 11 | 12 | class MinkowskiGRN(nn.Module): 13 | """ GRN layer for sparse tensors. 14 | """ 15 | def __init__(self, dim): 16 | super().__init__() 17 | self.gamma = nn.Parameter(torch.zeros(1, dim)) 18 | self.beta = nn.Parameter(torch.zeros(1, dim)) 19 | 20 | def forward(self, x): 21 | cm = x.coordinate_manager 22 | in_key = x.coordinate_map_key 23 | 24 | Gx = torch.norm(x.F, p=2, dim=0, keepdim=True) 25 | Nx = Gx / (Gx.mean(dim=-1, keepdim=True) + 1e-6) 26 | return SparseTensor( 27 | self.gamma * (x.F * Nx) + self.beta + x.F, 28 | coordinate_map_key=in_key, 29 | coordinate_manager=cm) 30 | 31 | class MinkowskiDropPath(nn.Module): 32 | """ Drop Path for sparse tensors. 33 | """ 34 | 35 | def __init__(self, drop_prob: float = 0., scale_by_keep: bool = True): 36 | super(MinkowskiDropPath, self).__init__() 37 | self.drop_prob = drop_prob 38 | self.scale_by_keep = scale_by_keep 39 | 40 | def forward(self, x): 41 | if self.drop_prob == 0. or not self.training: 42 | return x 43 | cm = x.coordinate_manager 44 | in_key = x.coordinate_map_key 45 | keep_prob = 1 - self.drop_prob 46 | mask = torch.cat([ 47 | torch.ones(len(_)) if random.uniform(0, 1) > self.drop_prob 48 | else torch.zeros(len(_)) for _ in x.decomposed_coordinates 49 | ]).view(-1, 1).to(x.device) 50 | if keep_prob > 0.0 and self.scale_by_keep: 51 | mask.div_(keep_prob) 52 | return SparseTensor( 53 | x.F * mask, 54 | coordinate_map_key=in_key, 55 | coordinate_manager=cm) 56 | 57 | class MinkowskiLayerNorm(nn.Module): 58 | """ Channel-wise layer normalization for sparse tensors. 59 | """ 60 | 61 | def __init__( 62 | self, 63 | normalized_shape, 64 | eps=1e-6, 65 | ): 66 | super(MinkowskiLayerNorm, self).__init__() 67 | self.ln = nn.LayerNorm(normalized_shape, eps=eps) 68 | def forward(self, input): 69 | output = self.ln(input.F) 70 | return SparseTensor( 71 | output, 72 | coordinate_map_key=input.coordinate_map_key, 73 | coordinate_manager=input.coordinate_manager) 74 | 75 | class LayerNorm(nn.Module): 76 | """ LayerNorm that supports two data formats: channels_last (default) or channels_first. 77 | The ordering of the dimensions in the inputs. channels_last corresponds to inputs with 78 | shape (batch_size, height, width, channels) while channels_first corresponds to inputs 79 | with shape (batch_size, channels, height, width). 80 | """ 81 | def __init__(self, normalized_shape, eps=1e-6, data_format="channels_last"): 82 | super().__init__() 83 | self.weight = nn.Parameter(torch.ones(normalized_shape)) 84 | self.bias = nn.Parameter(torch.zeros(normalized_shape)) 85 | self.eps = eps 86 | self.data_format = data_format 87 | if self.data_format not in ["channels_last", "channels_first"]: 88 | raise NotImplementedError 89 | self.normalized_shape = (normalized_shape, ) 90 | 91 | def forward(self, x): 92 | if self.data_format == "channels_last": 93 | return F.layer_norm(x, self.normalized_shape, self.weight, self.bias, self.eps) 94 | elif self.data_format == "channels_first": 95 | u = x.mean(1, keepdim=True) 96 | s = (x - u).pow(2).mean(1, keepdim=True) 97 | x = (x - u) / torch.sqrt(s + self.eps) 98 | x = self.weight[:, None, None] * x + self.bias[:, None, None] 99 | return x 100 | 101 | class GRN(nn.Module): 102 | """ GRN (Global Response Normalization) layer 103 | """ 104 | def __init__(self, dim): 105 | super().__init__() 106 | self.gamma = nn.Parameter(torch.zeros(1, 1, 1, dim)) 107 | self.beta = nn.Parameter(torch.zeros(1, 1, 1, dim)) 108 | 109 | def forward(self, x): 110 | Gx = torch.norm(x, p=2, dim=(1,2), keepdim=True) 111 | Nx = Gx / (Gx.mean(dim=-1, keepdim=True) + 1e-6) 112 | return self.gamma * (x * Nx) + self.beta + x 113 | 114 | 115 | def tensor2im(input_image, imtype=np.uint8): 116 | mean=[0.485, 0.456, 0.406] 117 | std=[0.229, 0.224, 0.225] 118 | if not isinstance(input_image, np.ndarray): 119 | if isinstance(input_image, torch.Tensor): # get the data from a variable 120 | image_tensor = input_image.data 121 | else: 122 | return input_image 123 | image_numpy = image_tensor.cpu().float().numpy() # convert it into a numpy array 124 | if image_numpy.shape[0] == 1: # grayscale to RGB 125 | image_numpy = np.tile(image_numpy, (3, 1, 1)) 126 | for i in range(len(mean)): 127 | image_numpy[i] = image_numpy[i] * std[i] + mean[i] 128 | image_numpy = image_numpy * 255 129 | image_numpy = np.transpose(image_numpy, (1, 2, 0)) # post-processing: tranpose and scaling 130 | else: # if it is a numpy array, do nothing 131 | image_numpy = input_image 132 | return image_numpy.astype(imtype) 133 | 134 | 135 | def feat2show(feat): 136 | tensor = feat.cpu() 137 | # num_channels = tensor.shape[0] 138 | num_channels = 64 139 | _, axes = plt.subplots(8, 8, figsize=(12, 12)) 140 | for channel in range(num_channels): 141 | row = int(channel / 8) 142 | col = channel % 8 143 | 144 | selected_feature = tensor[channel] 145 | selected_feature_np = selected_feature.detach().numpy() 146 | 147 | axes[row, col].imshow(selected_feature_np) 148 | axes[row, col].axis('off') 149 | plt.tight_layout() 150 | plt.show() 151 | -------------------------------------------------------------------------------- /models/video_mac.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | 4 | from MinkowskiEngine import ( 5 | MinkowskiConvolution, 6 | MinkowskiDepthwiseConvolution, 7 | MinkowskiLinear, 8 | ) 9 | 10 | from time import time 11 | from timm.models.layers import trunc_normal_, DropPath 12 | 13 | from tools import utils 14 | 15 | from .utils import LayerNorm, GRN 16 | from .convnextv1_sparse import SparseConvNeXtV1 17 | from .convnextv2_sparse import SparseConvNeXtV2 18 | from .resnetv2_sparse import SparseResNet, BasicBlock, Bottleneck 19 | 20 | 21 | class Decoder_Block(nn.Module): 22 | """ ConvNeXtV2 Block. 23 | 24 | Args: 25 | dim (int): Number of input channels. 26 | drop_path (float): Stochastic depth rate. Default: 0.0 27 | """ 28 | def __init__(self, dim, drop_path=0.): 29 | super().__init__() 30 | self.dwconv = nn.Conv2d(dim, dim, kernel_size=7, padding=3, groups=dim) # depthwise conv 31 | self.norm = LayerNorm(dim, eps=1e-6) 32 | self.pwconv1 = nn.Linear(dim, 4 * dim) # pointwise/1x1 convs, implemented with linear layers 33 | self.act = nn.GELU() 34 | self.grn = GRN(4 * dim) 35 | self.pwconv2 = nn.Linear(4 * dim, dim) 36 | self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity() 37 | 38 | def forward(self, x): 39 | input = x 40 | x = self.dwconv(x) 41 | x = x.permute(0, 2, 3, 1) # (N, C, H, W) -> (N, H, W, C) 42 | x = self.norm(x) 43 | x = self.pwconv1(x) 44 | x = self.act(x) 45 | x = self.grn(x) 46 | x = self.pwconv2(x) 47 | x = x.permute(0, 3, 1, 2) # (N, H, W, C) -> (N, C, H, W) 48 | 49 | x = input + self.drop_path(x) 50 | return x 51 | 52 | 53 | class VideoMAC(nn.Module): 54 | """ Video Masked Autoencoder Meets ConvNets 55 | """ 56 | def __init__( 57 | self, 58 | img_size=224, 59 | in_chans=3, 60 | depths=[3, 3, 27, 3], 61 | dims=[96, 192, 384, 768], 62 | decoder_depth=1, 63 | decoder_embed_dim=256, 64 | patch_size=32, 65 | mask_ratio=0.6, 66 | mode='ConvNeXtV2', 67 | norm_pix_loss=False, 68 | compute_loss=True): 69 | super().__init__() 70 | 71 | # configs 72 | self.img_size = img_size 73 | self.depths = depths 74 | self.imds = dims 75 | self.patch_size = patch_size 76 | self.mask_ratio = mask_ratio 77 | self.mode = mode 78 | self.num_patches = (img_size // patch_size) ** 2 79 | self.decoder_embed_dim = decoder_embed_dim 80 | self.decoder_depth = decoder_depth 81 | self.norm_pix_loss = norm_pix_loss 82 | self.compute_loss = compute_loss 83 | 84 | if mode == 'ConvNeXtV2': 85 | # encoder 86 | self.encoder = SparseConvNeXtV2( 87 | in_chans=in_chans, depths=depths, dims=dims, D=2, patch_size=patch_size) 88 | # decoder 89 | self.proj = nn.Conv2d( 90 | in_channels=dims[-1], out_channels=decoder_embed_dim, kernel_size=1) 91 | elif mode == 'ConvNeXtV1': 92 | # encoder 93 | self.encoder = SparseConvNeXtV1( 94 | in_chans=in_chans, depths=depths, dims=dims, D=2, patch_size=patch_size) 95 | # decoder 96 | self.proj = nn.Conv2d( 97 | in_channels=dims[-1], out_channels=decoder_embed_dim, kernel_size=1) 98 | elif mode == 'ResNet18': 99 | # encoder 100 | self.encoder = SparseResNet(BasicBlock, [2, 2, 2, 2]) 101 | # decoder 102 | self.proj = nn.Conv2d( 103 | in_channels=dims[-1], out_channels=decoder_embed_dim, kernel_size=1) 104 | elif mode == 'ResNet50': 105 | # encoder 106 | self.encoder = SparseResNet(Bottleneck, [3, 4, 6, 3]) 107 | # decoder 108 | self.proj = nn.Conv2d( 109 | in_channels=dims[-1], out_channels=decoder_embed_dim, kernel_size=1) 110 | 111 | # mask tokens 112 | self.mask_token = nn.Parameter(torch.zeros(1, decoder_embed_dim, 1, 1)) 113 | decoder = [Decoder_Block( 114 | dim=decoder_embed_dim, 115 | drop_path=0.) for i in range(decoder_depth)] 116 | self.decoder = nn.Sequential(*decoder) 117 | # pred 118 | self.pred = nn.Conv2d( 119 | in_channels=decoder_embed_dim, 120 | out_channels=patch_size ** 2 * in_chans, 121 | kernel_size=1) 122 | if mode == 'ConvNeXtV2' or mode == 'ConvNeXtV1': 123 | self.apply(self._init_weights_convnextv2) 124 | elif mode == 'ResNet18' or mode == 'ResNet50': 125 | self.apply(self._init_weights_resnet) 126 | 127 | def _init_weights_convnextv2(self, m): 128 | if isinstance(m, MinkowskiConvolution): 129 | trunc_normal_(m.kernel, std=.02) 130 | nn.init.constant_(m.bias, 0) 131 | if isinstance(m, MinkowskiDepthwiseConvolution): 132 | trunc_normal_(m.kernel) 133 | nn.init.constant_(m.bias, 0) 134 | if isinstance(m, MinkowskiLinear): 135 | trunc_normal_(m.linear.weight) 136 | nn.init.constant_(m.linear.bias, 0) 137 | if isinstance(m, nn.Conv2d): 138 | w = m.weight.data 139 | trunc_normal_(w.view([w.shape[0], -1])) 140 | nn.init.constant_(m.bias, 0) 141 | if isinstance(m, nn.LayerNorm): 142 | nn.init.constant_(m.bias, 0) 143 | nn.init.constant_(m.weight, 1.0) 144 | if hasattr(self, 'mask_token'): 145 | torch.nn.init.normal_(self.mask_token, std=.02) 146 | 147 | def _init_weights_resnet(self, m): 148 | if isinstance(m, MinkowskiConvolution): 149 | trunc_normal_(m.kernel, std=.02) 150 | # nn.init.constant_(m.bias, 0) 151 | if isinstance(m, MinkowskiLinear): 152 | trunc_normal_(m.linear.weight) 153 | nn.init.constant_(m.linear.bias, 0) 154 | if isinstance(m, nn.Conv2d): 155 | w = m.weight.data 156 | trunc_normal_(w.view([w.shape[0], -1])) 157 | # nn.init.constant_(m.bias, 0) 158 | if isinstance(m, nn.LayerNorm): 159 | nn.init.constant_(m.bias, 0) 160 | nn.init.constant_(m.weight, 1.0) 161 | if hasattr(self, 'mask_token'): 162 | torch.nn.init.normal_(self.mask_token, std=.02) 163 | 164 | def patchify(self, imgs): 165 | """ 166 | imgs: (N, 3, H, W) 167 | x: (N, L, patch_size**2 *3) 168 | """ 169 | p = self.patch_size 170 | assert imgs.shape[2] == imgs.shape[3] and imgs.shape[2] % p == 0 171 | 172 | h = w = imgs.shape[2] // p 173 | x = imgs.reshape(shape=(imgs.shape[0], 3, h, p, w, p)) 174 | x = torch.einsum('nchpwq->nhwpqc', x) 175 | x = x.reshape(shape=(imgs.shape[0], h * w, p**2 * 3)) 176 | return x 177 | 178 | def unpatchify(self, x): 179 | """ 180 | x: (N, L, patch_size**2 *3) 181 | imgs: (N, 3, H, W) 182 | """ 183 | p = self.patch_size 184 | h = w = int(x.shape[1]**.5) 185 | assert h * w == x.shape[1] 186 | 187 | x = x.reshape(shape=(x.shape[0], h, w, p, p, 3)) 188 | x = torch.einsum('nhwpqc->nchpwq', x) 189 | imgs = x.reshape(shape=(x.shape[0], 3, h * p, h * p)) 190 | return imgs 191 | 192 | def gen_random_mask(self, x, mask_ratio, ids_shuffle=None, ids_restore=None): 193 | N = x.shape[0] 194 | L = (x.shape[2] // self.patch_size) ** 2 195 | len_keep = int(L * (1 - mask_ratio)) 196 | 197 | if ids_shuffle is None or ids_restore is None: 198 | noise = torch.randn(N, L, device=x.device) 199 | # sort noise for each sample 200 | ids_shuffle = torch.argsort(noise, dim=1) 201 | ids_restore = torch.argsort(ids_shuffle, dim=1) 202 | 203 | # generate the binary mask: 0 is keep 1 is remove 204 | mask = torch.ones([N, L], device=x.device) 205 | mask[:, :len_keep] = 0 206 | # unshuffle to get the binary mask 207 | mask = torch.gather(mask, dim=1, index=ids_restore) 208 | return mask, ids_shuffle, ids_restore 209 | 210 | def upsample_mask(self, mask, scale): 211 | assert len(mask.shape) == 2 212 | p = int(mask.shape[1] ** .5) 213 | return mask.reshape(-1, p, p).\ 214 | repeat_interleave(scale, axis=1).\ 215 | repeat_interleave(scale, axis=2) 216 | 217 | def forward_encoder(self, imgs, mask_ratio, ids_shuffle=None, ids_restore=None): 218 | # generate random masks 219 | mask, ids_shuffle, ids_restore = self.gen_random_mask(imgs, mask_ratio, ids_shuffle, ids_restore) 220 | # encoding 221 | x = self.encoder(imgs, mask) 222 | return x, mask, ids_shuffle, ids_restore 223 | 224 | def forward_decoder(self, x, mask): 225 | x = self.proj(x) 226 | # append mask token 227 | # n, c, h, w = x.shape 228 | mask = self.upsample_mask(mask, int((x.shape[2] / (mask.shape[1] ** .5)))).unsqueeze(1).type_as(x) 229 | # mask = mask.reshape(-1, h, w).unsqueeze(1).type_as(x) 230 | mask_token = self.mask_token.repeat(x.shape[0], 1, x.shape[2], x.shape[3]) 231 | x = x * (1. - mask) + mask_token * mask 232 | # decoding 233 | x = self.decoder(x) 234 | # pred 235 | pred = self.pred(x) 236 | return pred 237 | 238 | def forward_loss(self, imgs, pred, mask): 239 | """ 240 | imgs: [N, 3, H, W] 241 | pred: [N, L, p*p*3] 242 | mask: [N, L], 0 is keep, 1 is remove 243 | """ 244 | if len(pred.shape) == 4: 245 | n, c, _, _ = pred.shape 246 | pred = pred.reshape(n, c, -1) 247 | pred = torch.einsum('ncl->nlc', pred) 248 | 249 | target = self.patchify(imgs) 250 | if self.norm_pix_loss: 251 | mean = target.mean(dim=-1, keepdim=True) 252 | var = target.var(dim=-1, keepdim=True) 253 | target = (target - mean) / (var + 1.e-6)**.5 254 | loss = (pred - target) ** 2 255 | loss = loss.mean(dim=-1) # [N, L], mean loss per patch 256 | 257 | loss = (loss * mask).sum() / mask.sum() # mean loss on removed patches 258 | return loss 259 | 260 | def forward(self, frames, ids_shuffle=None, ids_restore=None): 261 | # Bx3xHxW 262 | x, mask, ids_shuffle, ids_restore = self.forward_encoder(frames, self.mask_ratio, ids_shuffle, ids_restore) 263 | pred = self.forward_decoder(x, mask) 264 | loss_intra = self.forward_loss(frames, pred, mask) 265 | if self.compute_loss: 266 | return loss_intra, pred, mask, ids_shuffle, ids_restore 267 | else: 268 | return loss_intra, pred 269 | 270 | def mac_tiny(**kwargs): 271 | model = VideoMAC( 272 | depths=[3, 3, 9, 3], dims=[96, 192, 384, 768], **kwargs) 273 | return model 274 | 275 | def mac_small(**kwargs): 276 | model = VideoMAC( 277 | depths=[3, 3, 27, 3], dims=[96, 192, 384, 768], **kwargs) 278 | return model 279 | 280 | def mac_base(**kwargs): 281 | model = VideoMAC( 282 | depths=[3, 3, 27, 3], dims=[128, 256, 512, 1024], **kwargs) 283 | return model 284 | 285 | def mac_small_isotropic(**kwargs): 286 | model = VideoMAC( 287 | depths=18, dims=384, **kwargs) 288 | return model 289 | 290 | def mac_base_isotropic(**kwargs): 291 | model = VideoMAC( 292 | depths=18, dims=768, **kwargs) 293 | return model 294 | 295 | def mac_r18(**kwargs): 296 | model = VideoMAC( 297 | depths=[2, 2, 2, 2], dims=[64, 128, 256, 512], mode='ResNet18', **kwargs) 298 | return model 299 | 300 | def mac_r50(**kwargs): 301 | model = VideoMAC( 302 | depths=[3, 4, 6, 3], dims=[256, 512, 1024, 2048], mode='ResNet50', **kwargs) 303 | return model 304 | 305 | def mac_cnxv1_tiny(**kwargs): 306 | model = VideoMAC( 307 | depths=[3, 3, 9, 3], dims=[96, 192, 384, 768], mode='ConvNeXtV1', **kwargs) 308 | return model 309 | 310 | def mac_cnxv1_small(**kwargs): 311 | model = VideoMAC( 312 | depths=[3, 3, 27, 3], dims=[96, 192, 384, 768], mode='ConvNeXtV1', **kwargs) 313 | return model 314 | -------------------------------------------------------------------------------- /scripts/mac_cnxv1.sh: -------------------------------------------------------------------------------- 1 | CUDA_VISIBLE_DEVICES=0 OMP_NUM_THREADS=16 python main_pretrain.py \ 2 | --model mac_cnxv1_tiny \ 3 | --patch_size 32 \ 4 | --batch_size 256 --update_freq 1 \ 5 | --blr 1e-3 \ 6 | --mask_ratio 0.75 \ 7 | --gamma 1.0 \ 8 | --momentum_target 0.996 \ 9 | --use_amp True \ 10 | --epochs 100 \ 11 | --warmup_epochs 10 \ 12 | --data_path ./data/ytb18 \ 13 | --output_dir ./checkpoints/mac-cnxv1-tiny-r0.75 14 | 15 | CUDA_VISIBLE_DEVICES=0 OMP_NUM_THREADS=16 python main_pretrain.py \ 16 | --model mac_cnxv1_small \ 17 | --patch_size 32 \ 18 | --batch_size 256 --update_freq 1 \ 19 | --blr 1e-3 \ 20 | --mask_ratio 0.75 \ 21 | --gamma 1.0 \ 22 | --momentum_target 0.996 \ 23 | --use_amp True \ 24 | --epochs 100 \ 25 | --warmup_epochs 10 \ 26 | --data_path ./data/ytb18 \ 27 | --output_dir ./checkpoints/mac-cnxv1-small-r0.75 28 | -------------------------------------------------------------------------------- /scripts/mac_cnxv2.sh: -------------------------------------------------------------------------------- 1 | CUDA_VISIBLE_DEVICES=0 OMP_NUM_THREADS=16 python main_pretrain.py \ 2 | --model mac_tiny \ 3 | --patch_size 32 \ 4 | --batch_size 512 --update_freq 1 \ 5 | --blr 1e-3 \ 6 | --mask_ratio 0.75 \ 7 | --gamma 1.0 \ 8 | --momentum_target 0.996 \ 9 | --use_amp True \ 10 | --epochs 100 \ 11 | --warmup_epochs 10 \ 12 | --data_path ./data/ytb18 \ 13 | --output_dir ./checkpoints/mac-small-r0.75 14 | 15 | CUDA_VISIBLE_DEVICES=0 OMP_NUM_THREADS=16 python main_pretrain.py \ 16 | --model mac_small \ 17 | --patch_size 32 \ 18 | --batch_size 512 --update_freq 1 \ 19 | --blr 1e-3 \ 20 | --mask_ratio 0.75 \ 21 | --gamma 1.0 \ 22 | --momentum_target 0.996 \ 23 | --use_amp True \ 24 | --epochs 100 \ 25 | --warmup_epochs 10 \ 26 | --data_path ./data/ytb18 \ 27 | --output_dir ./checkpoints/mac-small-r0.75 28 | 29 | -------------------------------------------------------------------------------- /scripts/mac_rn.sh: -------------------------------------------------------------------------------- 1 | CUDA_VISIBLE_DEVICES=0 OMP_NUM_THREADS=16 python main_pretrain.py \ 2 | --model mac_r18 \ 3 | --patch_size 32 \ 4 | --batch_size 512 --update_freq 1 \ 5 | --blr 1e-3 \ 6 | --mask_ratio 0.75 \ 7 | --gamma 1.0 \ 8 | --momentum_target 0.996 \ 9 | --use_amp False \ 10 | --epochs 100 \ 11 | --warmup_epochs 10 \ 12 | --data_path ./data/ytb18 \ 13 | --output_dir ./checkpoints/mac-r18-r0.75 14 | 15 | CUDA_VISIBLE_DEVICES=0 OMP_NUM_THREADS=16 python main_pretrain.py \ 16 | --model mac_r50 \ 17 | --patch_size 32 \ 18 | --batch_size 512 --update_freq 1 \ 19 | --blr 1e-3 \ 20 | --mask_ratio 0.75 \ 21 | --gamma 1.0 \ 22 | --momentum_target 0.996 \ 23 | --use_amp False \ 24 | --epochs 100 \ 25 | --warmup_epochs 10 \ 26 | --data_path ./data/ytb18 \ 27 | --output_dir ./checkpoints/mac-r50-r0.75 28 | -------------------------------------------------------------------------------- /tools/convert_pth.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import torch 3 | from utils import remap_checkpoint_keys 4 | from utils import remap_checkpoint_keys_r50 5 | 6 | def main(args): 7 | checkpoint = torch.load(args.input_dir, map_location='cpu') 8 | print("Load pre-trained checkpoint from: %s" % args.input_dir) 9 | checkpoint_model = checkpoint['online_without_ddp'] 10 | # remove decoder weights 11 | checkpoint_model_keys = list(checkpoint_model.keys()) 12 | for k in checkpoint_model_keys: 13 | if 'decoder' in k or 'mask_token'in k or \ 14 | 'proj' in k or 'pred' in k: 15 | print(f"Removing key {k} from pretrained checkpoint") 16 | del checkpoint_model[k] 17 | 18 | try: 19 | checkpoint_model = remap_checkpoint_keys(checkpoint_model) 20 | except RuntimeError: 21 | checkpoint_model = remap_checkpoint_keys_r50(checkpoint_model) 22 | torch.save(checkpoint_model, args.output_dir) 23 | 24 | 25 | if __name__ == '__main__': 26 | parser = argparse.ArgumentParser('Self-supervised weights', add_help=False) 27 | parser.add_argument('--input_dir', default='./pretrain/checkpoint-99.pth', 28 | help='pretrain checkpoing') 29 | parser.add_argument('--output_dir', default='./downstream/VOS/checkpoints/mac-small.pth', 30 | help='path where to save, empty for no saving') 31 | args = parser.parse_args() 32 | main(args) -------------------------------------------------------------------------------- /tools/datasets.py: -------------------------------------------------------------------------------- 1 | import os 2 | from torchvision import datasets, transforms 3 | 4 | from timm.data.constants import \ 5 | IMAGENET_DEFAULT_MEAN, IMAGENET_DEFAULT_STD, IMAGENET_INCEPTION_MEAN, IMAGENET_INCEPTION_STD 6 | from timm.data import create_transform 7 | 8 | def build_dataset(is_train, args): 9 | transform = build_transform(is_train, args) 10 | 11 | print("Transform = ") 12 | if isinstance(transform, tuple): 13 | for trans in transform: 14 | print(" - - - - - - - - - - ") 15 | for t in trans.transforms: 16 | print(t) 17 | else: 18 | for t in transform.transforms: 19 | print(t) 20 | print("---------------------------") 21 | 22 | if args.data_set == 'CIFAR': 23 | dataset = datasets.CIFAR100(args.data_path, train=is_train, transform=transform, download=True) 24 | nb_classes = 100 25 | elif args.data_set == 'IMNET': 26 | print("reading from datapath", args.data_path) 27 | root = os.path.join(args.data_path, 'train' if is_train else 'val') 28 | dataset = datasets.ImageFolder(root, transform=transform) 29 | nb_classes = 1000 30 | elif args.data_set == "image_folder": 31 | root = args.data_path if is_train else args.eval_data_path 32 | dataset = datasets.ImageFolder(root, transform=transform) 33 | nb_classes = args.nb_classes 34 | assert len(dataset.class_to_idx) == nb_classes 35 | else: 36 | raise NotImplementedError() 37 | print("Number of the class = %d" % nb_classes) 38 | 39 | return dataset, nb_classes 40 | 41 | 42 | def build_transform(is_train, args): 43 | resize_im = args.input_size > 32 44 | imagenet_default_mean_and_std = args.imagenet_default_mean_and_std 45 | mean = IMAGENET_INCEPTION_MEAN if not imagenet_default_mean_and_std else IMAGENET_DEFAULT_MEAN 46 | std = IMAGENET_INCEPTION_STD if not imagenet_default_mean_and_std else IMAGENET_DEFAULT_STD 47 | 48 | if is_train: 49 | # this should always dispatch to transforms_imagenet_train 50 | transform = create_transform( 51 | input_size=args.input_size, 52 | is_training=True, 53 | color_jitter=args.color_jitter, 54 | auto_augment=args.aa, 55 | interpolation=args.train_interpolation, 56 | re_prob=args.reprob, 57 | re_mode=args.remode, 58 | re_count=args.recount, 59 | mean=mean, 60 | std=std, 61 | ) 62 | if not resize_im: 63 | transform.transforms[0] = transforms.RandomCrop( 64 | args.input_size, padding=4) 65 | return transform 66 | 67 | t = [] 68 | if resize_im: 69 | # warping (no cropping) when evaluated at 384 or larger 70 | if args.input_size >= 384: 71 | t.append( 72 | transforms.Resize((args.input_size, args.input_size), 73 | interpolation=transforms.InterpolationMode.BICUBIC), 74 | ) 75 | print(f"Warping {args.input_size} size input images...") 76 | else: 77 | if args.crop_pct is None: 78 | args.crop_pct = 224 / 256 79 | size = int(args.input_size / args.crop_pct) 80 | t.append( 81 | # to maintain same ratio w.r.t. 224 images 82 | transforms.Resize(size, interpolation=transforms.InterpolationMode.BICUBIC), 83 | ) 84 | t.append(transforms.CenterCrop(args.input_size)) 85 | 86 | t.append(transforms.ToTensor()) 87 | t.append(transforms.Normalize(mean, std)) 88 | return transforms.Compose(t) 89 | -------------------------------------------------------------------------------- /tools/optim_factory.py: -------------------------------------------------------------------------------- 1 | import torch 2 | from torch import optim as optim 3 | 4 | from timm.optim.adafactor import Adafactor 5 | from timm.optim.adahessian import Adahessian 6 | from timm.optim.adamp import AdamP 7 | from timm.optim.lookahead import Lookahead 8 | from timm.optim.nadam import Nadam 9 | from timm.optim.novograd import NovoGrad 10 | from timm.optim.nvnovograd import NvNovoGrad 11 | from timm.optim.radam import RAdam 12 | from timm.optim.rmsprop_tf import RMSpropTF 13 | from timm.optim.sgdp import SGDP 14 | 15 | import json 16 | 17 | try: 18 | from apex.optimizers import FusedNovoGrad, FusedAdam, FusedLAMB, FusedSGD 19 | has_apex = True 20 | except ImportError: 21 | has_apex = False 22 | 23 | 24 | def get_num_layer_for_convnext_single(var_name, depths): 25 | """ 26 | Each layer is assigned distinctive layer ids 27 | """ 28 | if var_name.startswith("downsample_layers"): 29 | stage_id = int(var_name.split('.')[1]) 30 | layer_id = sum(depths[:stage_id]) + 1 31 | return layer_id 32 | 33 | elif var_name.startswith("stages"): 34 | stage_id = int(var_name.split('.')[1]) 35 | block_id = int(var_name.split('.')[2]) 36 | layer_id = sum(depths[:stage_id]) + block_id + 1 37 | return layer_id 38 | 39 | else: 40 | return sum(depths) + 1 41 | 42 | 43 | def get_num_layer_for_convnext(var_name): 44 | """ 45 | Divide [3, 3, 27, 3] layers into 12 groups; each group is three 46 | consecutive blocks, including possible neighboring downsample layers; 47 | adapted from https://github.com/microsoft/unilm/blob/master/beit/optim_factory.py 48 | """ 49 | num_max_layer = 12 50 | if var_name.startswith("downsample_layers"): 51 | stage_id = int(var_name.split('.')[1]) 52 | if stage_id == 0: 53 | layer_id = 0 54 | elif stage_id == 1 or stage_id == 2: 55 | layer_id = stage_id + 1 56 | elif stage_id == 3: 57 | layer_id = 12 58 | return layer_id 59 | 60 | elif var_name.startswith("stages"): 61 | stage_id = int(var_name.split('.')[1]) 62 | block_id = int(var_name.split('.')[2]) 63 | if stage_id == 0 or stage_id == 1: 64 | layer_id = stage_id + 1 65 | elif stage_id == 2: 66 | layer_id = 3 + block_id // 3 67 | elif stage_id == 3: 68 | layer_id = 12 69 | return layer_id 70 | else: 71 | return num_max_layer + 1 72 | 73 | class LayerDecayValueAssigner(object): 74 | def __init__(self, values, depths=[3,3,27,3], layer_decay_type='single'): 75 | self.values = values 76 | self.depths = depths 77 | self.layer_decay_type = layer_decay_type 78 | 79 | def get_scale(self, layer_id): 80 | return self.values[layer_id] 81 | 82 | def get_layer_id(self, var_name): 83 | if self.layer_decay_type == 'single': 84 | return get_num_layer_for_convnext_single(var_name, self.depths) 85 | else: 86 | return get_num_layer_for_convnext(var_name) 87 | 88 | 89 | def get_parameter_groups(model, weight_decay=1e-5, skip_list=(), get_num_layer=None, get_layer_scale=None): 90 | parameter_group_names = {} 91 | parameter_group_vars = {} 92 | 93 | for name, param in model.named_parameters(): 94 | if not param.requires_grad: 95 | continue # frozen weights 96 | if len(param.shape) == 1 or name.endswith(".bias") or name in skip_list or \ 97 | name.endswith(".gamma") or name.endswith(".beta"): 98 | group_name = "no_decay" 99 | this_weight_decay = 0. 100 | else: 101 | group_name = "decay" 102 | this_weight_decay = weight_decay 103 | if get_num_layer is not None: 104 | layer_id = get_num_layer(name) 105 | group_name = "layer_%d_%s" % (layer_id, group_name) 106 | else: 107 | layer_id = None 108 | 109 | if group_name not in parameter_group_names: 110 | if get_layer_scale is not None: 111 | scale = get_layer_scale(layer_id) 112 | else: 113 | scale = 1. 114 | 115 | parameter_group_names[group_name] = { 116 | "weight_decay": this_weight_decay, 117 | "params": [], 118 | "lr_scale": scale 119 | } 120 | parameter_group_vars[group_name] = { 121 | "weight_decay": this_weight_decay, 122 | "params": [], 123 | "lr_scale": scale 124 | } 125 | 126 | parameter_group_vars[group_name]["params"].append(param) 127 | parameter_group_names[group_name]["params"].append(name) 128 | print("Param groups = %s" % json.dumps(parameter_group_names, indent=2)) 129 | return list(parameter_group_vars.values()) 130 | 131 | 132 | def create_optimizer(args, model, get_num_layer=None, get_layer_scale=None, filter_bias_and_bn=True, skip_list=None): 133 | opt_lower = args.opt.lower() 134 | weight_decay = args.weight_decay 135 | # if weight_decay and filter_bias_and_bn: 136 | if filter_bias_and_bn: 137 | skip = {} 138 | if skip_list is not None: 139 | skip = skip_list 140 | elif hasattr(model, 'no_weight_decay'): 141 | skip = model.no_weight_decay() 142 | parameters = get_parameter_groups(model, weight_decay, skip, get_num_layer, get_layer_scale) 143 | weight_decay = 0. 144 | else: 145 | parameters = model.parameters() 146 | 147 | if 'fused' in opt_lower: 148 | assert has_apex and torch.cuda.is_available(), 'APEX and CUDA required for fused optimizers' 149 | 150 | opt_args = dict(lr=args.lr, weight_decay=weight_decay) 151 | if hasattr(args, 'opt_eps') and args.opt_eps is not None: 152 | opt_args['eps'] = args.opt_eps 153 | if hasattr(args, 'opt_betas') and args.opt_betas is not None: 154 | opt_args['betas'] = args.opt_betas 155 | 156 | opt_split = opt_lower.split('_') 157 | opt_lower = opt_split[-1] 158 | if opt_lower == 'sgd' or opt_lower == 'nesterov': 159 | opt_args.pop('eps', None) 160 | optimizer = optim.SGD(parameters, momentum=args.momentum, nesterov=True, **opt_args) 161 | elif opt_lower == 'momentum': 162 | opt_args.pop('eps', None) 163 | optimizer = optim.SGD(parameters, momentum=args.momentum, nesterov=False, **opt_args) 164 | elif opt_lower == 'adam': 165 | optimizer = optim.Adam(parameters, **opt_args) 166 | elif opt_lower == 'adamw': 167 | optimizer = optim.AdamW(parameters, **opt_args) 168 | elif opt_lower == 'nadam': 169 | optimizer = Nadam(parameters, **opt_args) 170 | elif opt_lower == 'radam': 171 | optimizer = RAdam(parameters, **opt_args) 172 | elif opt_lower == 'adamp': 173 | optimizer = AdamP(parameters, wd_ratio=0.01, nesterov=True, **opt_args) 174 | elif opt_lower == 'sgdp': 175 | optimizer = SGDP(parameters, momentum=args.momentum, nesterov=True, **opt_args) 176 | elif opt_lower == 'adadelta': 177 | optimizer = optim.Adadelta(parameters, **opt_args) 178 | elif opt_lower == 'adafactor': 179 | if not args.lr: 180 | opt_args['lr'] = None 181 | optimizer = Adafactor(parameters, **opt_args) 182 | elif opt_lower == 'adahessian': 183 | optimizer = Adahessian(parameters, **opt_args) 184 | elif opt_lower == 'rmsprop': 185 | optimizer = optim.RMSprop(parameters, alpha=0.9, momentum=args.momentum, **opt_args) 186 | elif opt_lower == 'rmsproptf': 187 | optimizer = RMSpropTF(parameters, alpha=0.9, momentum=args.momentum, **opt_args) 188 | elif opt_lower == 'novograd': 189 | optimizer = NovoGrad(parameters, **opt_args) 190 | elif opt_lower == 'nvnovograd': 191 | optimizer = NvNovoGrad(parameters, **opt_args) 192 | elif opt_lower == 'fusedsgd': 193 | opt_args.pop('eps', None) 194 | optimizer = FusedSGD(parameters, momentum=args.momentum, nesterov=True, **opt_args) 195 | elif opt_lower == 'fusedmomentum': 196 | opt_args.pop('eps', None) 197 | optimizer = FusedSGD(parameters, momentum=args.momentum, nesterov=False, **opt_args) 198 | elif opt_lower == 'fusedadam': 199 | optimizer = FusedAdam(parameters, adam_w_mode=False, **opt_args) 200 | elif opt_lower == 'fusedadamw': 201 | optimizer = FusedAdam(parameters, adam_w_mode=True, **opt_args) 202 | elif opt_lower == 'fusedlamb': 203 | optimizer = FusedLAMB(parameters, **opt_args) 204 | elif opt_lower == 'fusednovograd': 205 | opt_args.setdefault('betas', (0.95, 0.98)) 206 | optimizer = FusedNovoGrad(parameters, **opt_args) 207 | else: 208 | assert False and "Invalid optimizer" 209 | 210 | if len(opt_split) > 1: 211 | if opt_split[0] == 'lookahead': 212 | optimizer = Lookahead(optimizer) 213 | 214 | return optimizer 215 | -------------------------------------------------------------------------------- /tools/utils.py: -------------------------------------------------------------------------------- 1 | import os 2 | import math 3 | import time 4 | from collections import defaultdict, deque 5 | import datetime 6 | import numpy as np 7 | from timm.utils import get_state_dict 8 | 9 | from pathlib import Path 10 | 11 | import torch 12 | import torch.distributed as dist 13 | # from torch._six import inf 14 | from torch import inf 15 | 16 | from tensorboardX import SummaryWriter 17 | from collections import OrderedDict 18 | 19 | def str2bool(v): 20 | """ 21 | Converts string to bool type; enables command line 22 | arguments in the format of '--arg1 true --arg2 false' 23 | """ 24 | if isinstance(v, bool): 25 | return v 26 | if v.lower() in ('yes', 'true', 't', 'y', '1'): 27 | return True 28 | elif v.lower() in ('no', 'false', 'f', 'n', '0'): 29 | return False 30 | else: 31 | raise argparse.ArgumentTypeError('Boolean value expected.') 32 | 33 | class SmoothedValue(object): 34 | """Track a series of values and provide access to smoothed values over a 35 | window or the global series average. 36 | """ 37 | 38 | def __init__(self, window_size=20, fmt=None): 39 | if fmt is None: 40 | fmt = "{median:.4f} ({global_avg:.4f})" 41 | self.deque = deque(maxlen=window_size) 42 | self.total = 0.0 43 | self.count = 0 44 | self.fmt = fmt 45 | 46 | def update(self, value, n=1): 47 | self.deque.append(value) 48 | self.count += n 49 | self.total += value * n 50 | 51 | def synchronize_between_processes(self): 52 | """ 53 | Warning: does not synchronize the deque! 54 | """ 55 | if not is_dist_avail_and_initialized(): 56 | return 57 | t = torch.tensor([self.count, self.total], dtype=torch.float64, device='cuda') 58 | dist.barrier() 59 | dist.all_reduce(t) 60 | t = t.tolist() 61 | self.count = int(t[0]) 62 | self.total = t[1] 63 | 64 | @property 65 | def median(self): 66 | d = torch.tensor(list(self.deque)) 67 | return d.median().item() 68 | 69 | @property 70 | def avg(self): 71 | d = torch.tensor(list(self.deque), dtype=torch.float32) 72 | return d.mean().item() 73 | 74 | @property 75 | def global_avg(self): 76 | return self.total / self.count 77 | 78 | @property 79 | def max(self): 80 | return max(self.deque) 81 | 82 | @property 83 | def value(self): 84 | return self.deque[-1] 85 | 86 | def __str__(self): 87 | return self.fmt.format( 88 | median=self.median, 89 | avg=self.avg, 90 | global_avg=self.global_avg, 91 | max=self.max, 92 | value=self.value) 93 | 94 | 95 | class MetricLogger(object): 96 | def __init__(self, delimiter="\t"): 97 | self.meters = defaultdict(SmoothedValue) 98 | self.delimiter = delimiter 99 | 100 | def update(self, **kwargs): 101 | for k, v in kwargs.items(): 102 | if v is None: 103 | continue 104 | if isinstance(v, torch.Tensor): 105 | v = v.item() 106 | assert isinstance(v, (float, int)) 107 | self.meters[k].update(v) 108 | 109 | def __getattr__(self, attr): 110 | if attr in self.meters: 111 | return self.meters[attr] 112 | if attr in self.__dict__: 113 | return self.__dict__[attr] 114 | raise AttributeError("'{}' object has no attribute '{}'".format( 115 | type(self).__name__, attr)) 116 | 117 | def __str__(self): 118 | loss_str = [] 119 | for name, meter in self.meters.items(): 120 | loss_str.append( 121 | "{}: {}".format(name, str(meter)) 122 | ) 123 | return self.delimiter.join(loss_str) 124 | 125 | def synchronize_between_processes(self): 126 | for meter in self.meters.values(): 127 | meter.synchronize_between_processes() 128 | 129 | def add_meter(self, name, meter): 130 | self.meters[name] = meter 131 | 132 | def log_every(self, iterable, print_freq, header=None): 133 | i = 0 134 | if not header: 135 | header = '' 136 | start_time = time.time() 137 | end = time.time() 138 | iter_time = SmoothedValue(fmt='{avg:.4f}') 139 | data_time = SmoothedValue(fmt='{avg:.4f}') 140 | space_fmt = ':' + str(len(str(len(iterable)))) + 'd' 141 | log_msg = [ 142 | header, 143 | '[{0' + space_fmt + '}/{1}]', 144 | 'eta: {eta}', 145 | '{meters}', 146 | 'time: {time}', 147 | 'data: {data}' 148 | ] 149 | if torch.cuda.is_available(): 150 | log_msg.append('max mem: {memory:.0f}') 151 | log_msg = self.delimiter.join(log_msg) 152 | MB = 1024.0 * 1024.0 153 | for obj in iterable: 154 | data_time.update(time.time() - end) 155 | yield obj 156 | iter_time.update(time.time() - end) 157 | if i % print_freq == 0 or i == len(iterable) - 1: 158 | eta_seconds = iter_time.global_avg * (len(iterable) - i) 159 | eta_string = str(datetime.timedelta(seconds=int(eta_seconds))) 160 | if torch.cuda.is_available(): 161 | print(log_msg.format( 162 | i, len(iterable), eta=eta_string, 163 | meters=str(self), 164 | time=str(iter_time), data=str(data_time), 165 | memory=torch.cuda.max_memory_allocated() / MB)) 166 | else: 167 | print(log_msg.format( 168 | i, len(iterable), eta=eta_string, 169 | meters=str(self), 170 | time=str(iter_time), data=str(data_time))) 171 | i += 1 172 | end = time.time() 173 | total_time = time.time() - start_time 174 | total_time_str = str(datetime.timedelta(seconds=int(total_time))) 175 | print('{} Total time: {} ({:.4f} s / it)'.format( 176 | header, total_time_str, total_time / len(iterable))) 177 | 178 | 179 | class TensorboardLogger(object): 180 | def __init__(self, log_dir): 181 | self.writer = SummaryWriter(logdir=log_dir) 182 | self.step = 0 183 | 184 | def set_step(self, step=None): 185 | if step is not None: 186 | self.step = step 187 | else: 188 | self.step += 1 189 | 190 | def update(self, head='scalar', step=None, **kwargs): 191 | for k, v in kwargs.items(): 192 | if v is None: 193 | continue 194 | if isinstance(v, torch.Tensor): 195 | v = v.item() 196 | assert isinstance(v, (float, int)) 197 | self.writer.add_scalar(head + "/" + k, v, self.step if step is None else step) 198 | 199 | def flush(self): 200 | self.writer.flush() 201 | 202 | 203 | class WandbLogger(object): 204 | def __init__(self, args): 205 | self.args = args 206 | 207 | try: 208 | import wandb 209 | self._wandb = wandb 210 | except ImportError: 211 | raise ImportError( 212 | "To use the Weights and Biases Logger please install wandb." 213 | "Run `pip install wandb` to install it." 214 | ) 215 | 216 | # Initialize a W&B run 217 | if self._wandb.run is None: 218 | self._wandb.init( 219 | project=args.project, 220 | config=args 221 | ) 222 | 223 | def log_epoch_metrics(self, metrics, commit=True): 224 | """ 225 | Log train/test metrics onto W&B. 226 | """ 227 | # Log number of model parameters as W&B summary 228 | self._wandb.summary['n_parameters'] = metrics.get('n_parameters', None) 229 | metrics.pop('n_parameters', None) 230 | 231 | # Log current epoch 232 | self._wandb.log({'epoch': metrics.get('epoch')}, commit=False) 233 | metrics.pop('epoch') 234 | 235 | for k, v in metrics.items(): 236 | if 'train' in k: 237 | self._wandb.log({f'Global Train/{k}': v}, commit=False) 238 | elif 'test' in k: 239 | self._wandb.log({f'Global Test/{k}': v}, commit=False) 240 | 241 | self._wandb.log({}) 242 | 243 | def log_checkpoints(self): 244 | output_dir = self.args.output_dir 245 | model_artifact = self._wandb.Artifact( 246 | self._wandb.run.id + "_model", type="model" 247 | ) 248 | 249 | model_artifact.add_dir(output_dir) 250 | self._wandb.log_artifact(model_artifact, aliases=["latest", "best"]) 251 | 252 | def set_steps(self): 253 | # Set global training step 254 | self._wandb.define_metric('Rank-0 Batch Wise/*', step_metric='Rank-0 Batch Wise/global_train_step') 255 | # Set epoch-wise step 256 | self._wandb.define_metric('Global Train/*', step_metric='epoch') 257 | self._wandb.define_metric('Global Test/*', step_metric='epoch') 258 | 259 | 260 | def setup_for_distributed(is_master): 261 | """ 262 | This function disables printing when not in master process 263 | """ 264 | import builtins as __builtin__ 265 | builtin_print = __builtin__.print 266 | 267 | def print(*args, **kwargs): 268 | force = kwargs.pop('force', False) 269 | if is_master or force: 270 | builtin_print(*args, **kwargs) 271 | 272 | __builtin__.print = print 273 | 274 | 275 | def is_dist_avail_and_initialized(): 276 | if not dist.is_available(): 277 | return False 278 | if not dist.is_initialized(): 279 | return False 280 | return True 281 | 282 | 283 | def get_world_size(): 284 | if not is_dist_avail_and_initialized(): 285 | return 1 286 | return dist.get_world_size() 287 | 288 | 289 | def get_rank(): 290 | if not is_dist_avail_and_initialized(): 291 | return 0 292 | return dist.get_rank() 293 | 294 | 295 | def is_main_process(): 296 | return get_rank() == 0 297 | 298 | 299 | def save_on_master(*args, **kwargs): 300 | if is_main_process(): 301 | torch.save(*args, **kwargs) 302 | 303 | def init_distributed_mode(args): 304 | 305 | if args.dist_on_itp: 306 | args.rank = int(os.environ['OMPI_COMM_WORLD_RANK']) 307 | args.world_size = int(os.environ['OMPI_COMM_WORLD_SIZE']) 308 | args.gpu = int(os.environ['OMPI_COMM_WORLD_LOCAL_RANK']) 309 | args.dist_url = "tcp://%s:%s" % (os.environ['MASTER_ADDR'], os.environ['MASTER_PORT']) 310 | os.environ['LOCAL_RANK'] = str(args.gpu) 311 | os.environ['RANK'] = str(args.rank) 312 | os.environ['WORLD_SIZE'] = str(args.world_size) 313 | # ["RANK", "WORLD_SIZE", "MASTER_ADDR", "MASTER_PORT", "LOCAL_RANK"] 314 | elif 'RANK' in os.environ and 'WORLD_SIZE' in os.environ: 315 | args.rank = int(os.environ["RANK"]) 316 | args.world_size = int(os.environ['WORLD_SIZE']) 317 | args.gpu = int(os.environ['LOCAL_RANK']) 318 | elif 'SLURM_PROCID' in os.environ: 319 | args.rank = int(os.environ['SLURM_PROCID']) 320 | args.gpu = args.rank % torch.cuda.device_count() 321 | 322 | os.environ['RANK'] = str(args.rank) 323 | os.environ['LOCAL_RANK'] = str(args.gpu) 324 | os.environ['WORLD_SIZE'] = str(args.world_size) 325 | else: 326 | print('Not using distributed mode') 327 | args.distributed = False 328 | return 329 | 330 | args.distributed = True 331 | 332 | torch.cuda.set_device(args.gpu) 333 | args.dist_backend = 'nccl' 334 | print('| distributed init (rank {}): {}, gpu {}'.format( 335 | args.rank, args.dist_url, args.gpu), flush=True) 336 | torch.distributed.init_process_group(backend=args.dist_backend, init_method=args.dist_url, 337 | world_size=args.world_size, rank=args.rank) 338 | torch.distributed.barrier() 339 | setup_for_distributed(args.rank == 0) 340 | 341 | def all_reduce_mean(x): 342 | world_size = get_world_size() 343 | if world_size > 1: 344 | x_reduce = torch.tensor(x).cuda() 345 | dist.all_reduce(x_reduce) 346 | x_reduce /= world_size 347 | return x_reduce.item() 348 | else: 349 | return x 350 | 351 | def load_state_dict(model, state_dict, prefix='', ignore_missing="relative_position_index"): 352 | missing_keys = [] 353 | unexpected_keys = [] 354 | error_msgs = [] 355 | # copy state_dict so _load_from_state_dict can modify it 356 | metadata = getattr(state_dict, '_metadata', None) 357 | state_dict = state_dict.copy() 358 | if metadata is not None: 359 | state_dict._metadata = metadata 360 | 361 | def load(module, prefix=''): 362 | local_metadata = {} if metadata is None else metadata.get( 363 | prefix[:-1], {}) 364 | module._load_from_state_dict( 365 | state_dict, prefix, local_metadata, True, missing_keys, unexpected_keys, error_msgs) 366 | for name, child in module._modules.items(): 367 | if child is not None: 368 | load(child, prefix + name + '.') 369 | 370 | load(model, prefix=prefix) 371 | 372 | warn_missing_keys = [] 373 | ignore_missing_keys = [] 374 | for key in missing_keys: 375 | keep_flag = True 376 | for ignore_key in ignore_missing.split('|'): 377 | if ignore_key in key: 378 | keep_flag = False 379 | break 380 | if keep_flag: 381 | warn_missing_keys.append(key) 382 | else: 383 | ignore_missing_keys.append(key) 384 | 385 | missing_keys = warn_missing_keys 386 | 387 | if len(missing_keys) > 0: 388 | print("Weights of {} not initialized from pretrained model: {}".format( 389 | model.__class__.__name__, missing_keys)) 390 | if len(unexpected_keys) > 0: 391 | print("Weights from pretrained model not used in {}: {}".format( 392 | model.__class__.__name__, unexpected_keys)) 393 | if len(ignore_missing_keys) > 0: 394 | print("Ignored weights of {} not initialized from pretrained model: {}".format( 395 | model.__class__.__name__, ignore_missing_keys)) 396 | if len(error_msgs) > 0: 397 | print('\n'.join(error_msgs)) 398 | 399 | 400 | class NativeScalerWithGradNormCount: 401 | state_dict_key = "amp_scaler" 402 | 403 | def __init__(self): 404 | self._scaler = torch.cuda.amp.GradScaler() 405 | 406 | def __call__(self, loss, optimizer, clip_grad=None, parameters=None, create_graph=False, update_grad=True): 407 | self._scaler.scale(loss).backward(create_graph=create_graph) 408 | if update_grad: 409 | if clip_grad is not None: 410 | assert parameters is not None 411 | self._scaler.unscale_(optimizer) # unscale the gradients of optimizer's assigned params in-place 412 | norm = torch.nn.utils.clip_grad_norm_(parameters, clip_grad) 413 | else: 414 | self._scaler.unscale_(optimizer) 415 | norm = get_grad_norm_(parameters) 416 | self._scaler.step(optimizer) 417 | self._scaler.update() 418 | else: 419 | norm = None 420 | return norm 421 | 422 | def state_dict(self): 423 | return self._scaler.state_dict() 424 | 425 | def load_state_dict(self, state_dict): 426 | self._scaler.load_state_dict(state_dict) 427 | 428 | 429 | def get_grad_norm_(parameters, norm_type: float = 2.0) -> torch.Tensor: 430 | if isinstance(parameters, torch.Tensor): 431 | parameters = [parameters] 432 | parameters = [p for p in parameters if p.grad is not None] 433 | norm_type = float(norm_type) 434 | if len(parameters) == 0: 435 | return torch.tensor(0.) 436 | device = parameters[0].grad.device 437 | if norm_type == inf: 438 | total_norm = max(p.grad.detach().abs().max().to(device) for p in parameters) 439 | else: 440 | total_norm = torch.norm(torch.stack([torch.norm(p.grad.detach(), norm_type).to(device) for p in parameters]), norm_type) 441 | return total_norm 442 | 443 | def save_model(args, epoch, model, model_without_ddp, optimizer, loss_scaler, model_ema=None): 444 | output_dir = Path(args.output_dir) 445 | epoch_name = str(epoch) 446 | checkpoint_paths = [output_dir / ('checkpoint-%s.pth' % epoch_name)] 447 | for checkpoint_path in checkpoint_paths: 448 | to_save = { 449 | 'model': model_without_ddp.state_dict(), 450 | 'optimizer': optimizer.state_dict(), 451 | 'epoch': epoch, 452 | 'scaler': loss_scaler.state_dict(), 453 | 'args': args, 454 | } 455 | 456 | if model_ema is not None: 457 | to_save['model_ema'] = get_state_dict(model_ema) 458 | 459 | save_on_master(to_save, checkpoint_path) 460 | 461 | if is_main_process() and isinstance(epoch, int): 462 | to_del = epoch - args.save_ckpt_num * args.save_ckpt_freq 463 | old_ckpt = output_dir / ('checkpoint-%s.pth' % to_del) 464 | if os.path.exists(old_ckpt): 465 | os.remove(old_ckpt) 466 | 467 | def save_model_distill(args, epoch, model_online, online_without_ddp, model_target, target_without_ddp, optimizer, loss_scaler): 468 | output_dir = Path(args.output_dir) 469 | epoch_name = str(epoch) 470 | checkpoint_paths = [output_dir / ('checkpoint-%s.pth' % epoch_name)] 471 | for checkpoint_path in checkpoint_paths: 472 | to_save = { 473 | "model_online": model_online.state_dict(), 474 | "model_target": model_target.state_dict(), 475 | "online_without_ddp": online_without_ddp.state_dict(), 476 | "target_without_ddp": target_without_ddp.state_dict(), 477 | "optimizer": optimizer.state_dict(), 478 | "epoch": epoch, 479 | "scaler": loss_scaler.state_dict(), 480 | "args": args, 481 | } 482 | 483 | save_on_master(to_save, checkpoint_path) 484 | 485 | if is_main_process() and isinstance(epoch, int): 486 | to_del = epoch - args.save_ckpt_num * args.save_ckpt_freq 487 | old_ckpt = output_dir / ('checkpoint-%s.pth' % to_del) 488 | if os.path.exists(old_ckpt): 489 | os.remove(old_ckpt) 490 | 491 | def auto_load_model(args, model, model_without_ddp, optimizer, loss_scaler, model_ema=None): 492 | output_dir = Path(args.output_dir) 493 | if args.auto_resume and len(args.resume) == 0: 494 | import glob 495 | all_checkpoints = glob.glob(os.path.join(output_dir, 'checkpoint-*.pth')) 496 | latest_ckpt = -1 497 | for ckpt in all_checkpoints: 498 | t = ckpt.split('-')[-1].split('.')[0] 499 | if t.isdigit(): 500 | latest_ckpt = max(int(t), latest_ckpt) 501 | if latest_ckpt >= 0: 502 | args.resume = os.path.join(output_dir, 'checkpoint-%d.pth' % latest_ckpt) 503 | print("Auto resume checkpoint: %s" % args.resume) 504 | 505 | if args.resume: 506 | if args.resume.startswith('https'): 507 | checkpoint = torch.hub.load_state_dict_from_url( 508 | args.resume, map_location='cpu', check_hash=True) 509 | else: 510 | checkpoint = torch.load(args.resume, map_location='cpu') 511 | 512 | model_without_ddp.load_state_dict(checkpoint['model']) 513 | print("Resume checkpoint %s" % args.resume) 514 | if 'optimizer' in checkpoint and 'epoch' in checkpoint: 515 | optimizer.load_state_dict(checkpoint['optimizer']) 516 | if not isinstance(checkpoint['epoch'], str): # does not support resuming with 'best', 'best-ema' 517 | args.start_epoch = checkpoint['epoch'] + 1 518 | else: 519 | assert args.eval, 'Does not support resuming with checkpoint-best' 520 | if hasattr(args, 'model_ema') and args.model_ema: 521 | if 'model_ema' in checkpoint.keys(): 522 | model_ema.ema.load_state_dict(checkpoint['model_ema']) 523 | else: 524 | model_ema.ema.load_state_dict(checkpoint['model']) 525 | if 'scaler' in checkpoint: 526 | loss_scaler.load_state_dict(checkpoint['scaler']) 527 | print("With optim & sched!") 528 | 529 | def auto_load_model_distill(args, model_online, online_without_ddp, model_target, target_without_ddp, optimizer, loss_scaler, model_ema=None): 530 | output_dir = Path(args.output_dir) 531 | if args.auto_resume and len(args.resume) == 0: 532 | import glob 533 | all_checkpoints = glob.glob(os.path.join(output_dir, 'checkpoint-*.pth')) 534 | latest_ckpt = -1 535 | for ckpt in all_checkpoints: 536 | t = ckpt.split('-')[-1].split('.')[0] 537 | if t.isdigit(): 538 | latest_ckpt = max(int(t), latest_ckpt) 539 | if latest_ckpt >= 0: 540 | args.resume = os.path.join(output_dir, 'checkpoint-%d.pth' % latest_ckpt) 541 | print("Auto resume checkpoint: %s" % args.resume) 542 | 543 | if args.resume: 544 | if args.resume.startswith('https'): 545 | checkpoint = torch.hub.load_state_dict_from_url( 546 | args.resume, map_location='cpu', check_hash=True) 547 | else: 548 | checkpoint = torch.load(args.resume, map_location='cpu') 549 | msg = model_online.load_state_dict(checkpoint['model_online']) 550 | print(msg) 551 | msg = online_without_ddp.load_state_dict(checkpoint['online_without_ddp']) 552 | print(msg) 553 | msg = model_target.load_state_dict(checkpoint["model_target"]) 554 | print(msg) 555 | msg = target_without_ddp.load_state_dict( 556 | checkpoint["target_without_ddp"]) 557 | print(msg) 558 | print("Resume checkpoint %s" % args.resume) 559 | if 'optimizer' in checkpoint and 'epoch' in checkpoint: 560 | optimizer.load_state_dict(checkpoint['optimizer']) 561 | if not isinstance(checkpoint['epoch'], str): # does not support resuming with 'best', 'best-ema' 562 | args.start_epoch = checkpoint['epoch'] + 1 563 | else: 564 | assert args.eval, 'Does not support resuming with checkpoint-best' 565 | if hasattr(args, 'model_ema') and args.model_ema: 566 | if 'model_ema' in checkpoint.keys(): 567 | model_ema.ema.load_state_dict(checkpoint['model_ema']) 568 | else: 569 | model_ema.ema.load_state_dict(checkpoint['model']) 570 | if 'scaler' in checkpoint: 571 | loss_scaler.load_state_dict(checkpoint['scaler']) 572 | print("With optim & sched!") 573 | 574 | def cosine_scheduler(base_value, final_value, epochs, niter_per_ep, warmup_epochs=0, 575 | start_warmup_value=0, warmup_steps=-1): 576 | warmup_schedule = np.array([]) 577 | warmup_iters = warmup_epochs * niter_per_ep 578 | if warmup_steps > 0: 579 | warmup_iters = warmup_steps 580 | print("Set warmup steps = %d" % warmup_iters) 581 | if warmup_epochs > 0: 582 | warmup_schedule = np.linspace(start_warmup_value, base_value, warmup_iters) 583 | 584 | iters = np.arange(epochs * niter_per_ep - warmup_iters) 585 | schedule = np.array( 586 | [final_value + 0.5 * (base_value - final_value) * (1 + math.cos(math.pi * i / (len(iters)))) for i in iters]) 587 | 588 | schedule = np.concatenate((warmup_schedule, schedule)) 589 | 590 | assert len(schedule) == epochs * niter_per_ep 591 | return schedule 592 | 593 | def adjust_learning_rate(optimizer, epoch, args): 594 | """Decay the learning rate with half-cycle cosine after warmup""" 595 | if epoch < args.warmup_epochs: 596 | lr = args.lr * epoch / args.warmup_epochs 597 | else: 598 | lr = args.min_lr + (args.lr - args.min_lr) * 0.5 * \ 599 | (1. + math.cos(math.pi * (epoch - args.warmup_epochs) / (args.epochs - args.warmup_epochs))) 600 | for param_group in optimizer.param_groups: 601 | if "lr_scale" in param_group: 602 | param_group["lr"] = lr * param_group["lr_scale"] 603 | else: 604 | param_group["lr"] = lr 605 | return lr 606 | 607 | def remap_checkpoint_keys(ckpt): 608 | new_ckpt = OrderedDict() 609 | for k, v in ckpt.items(): 610 | if k.startswith('encoder'): 611 | k = '.'.join(k.split('.')[1:]) # remove encoder in the name 612 | if k.endswith('kernel'): 613 | k = '.'.join(k.split('.')[:-1]) # remove kernel in the name 614 | new_k = k + '.weight' 615 | if len(v.shape) == 3: # resahpe standard convolution 616 | kv, in_dim, out_dim = v.shape 617 | ks = int(math.sqrt(kv)) 618 | new_ckpt[new_k] = v.permute(2, 1, 0).\ 619 | reshape(out_dim, in_dim, ks, ks).transpose(3, 2) 620 | elif len(v.shape) == 2: # reshape depthwise convolution 621 | kv, dim = v.shape 622 | ks = int(math.sqrt(kv)) 623 | new_ckpt[new_k] = v.permute(1, 0).\ 624 | reshape(dim, 1, ks, ks).transpose(3, 2) 625 | continue 626 | elif 'ln' in k or 'linear' in k: 627 | k = k.split('.') 628 | k.pop(-2) # remove ln and linear in the name 629 | new_k = '.'.join(k) 630 | else: 631 | new_k = k 632 | new_ckpt[new_k] = v 633 | 634 | # reshape grn affine parameters and biases 635 | for k, v in new_ckpt.items(): 636 | if k.endswith('bias') and len(v.shape) != 1: 637 | new_ckpt[k] = v.reshape(-1) 638 | elif 'grn' in k: 639 | new_ckpt[k] = v.unsqueeze(0).unsqueeze(1) 640 | return new_ckpt 641 | 642 | def remap_checkpoint_keys_r50(ckpt): 643 | new_ckpt = OrderedDict() 644 | for k, v in ckpt.items(): 645 | if k.startswith('encoder'): 646 | k = '.'.join(k.split('.')[1:]) # remove encoder in the name 647 | if k.endswith('kernel'): 648 | k = '.'.join(k.split('.')[:-1]) # remove kernel in the name 649 | new_k = k + '.weight' 650 | if len(v.shape) == 3: # resahpe standard convolution 651 | kv, in_dim, out_dim = v.shape 652 | ks = int(math.sqrt(kv)) 653 | new_ckpt[new_k] = v.permute(2, 1, 0).\ 654 | reshape(out_dim, in_dim, ks, ks).transpose(3, 2) 655 | elif len(v.shape) == 2: # reshape depthwise convolution 656 | v = v.unsqueeze(0) 657 | kv, in_dim, out_dim = v.shape 658 | ks = int(math.sqrt(kv)) 659 | new_ckpt[new_k] = v.permute(2, 1, 0).\ 660 | reshape(out_dim, in_dim, ks, ks).transpose(3, 2) 661 | continue 662 | elif 'ln' in k or 'linear' in k: 663 | k = k.split('.') 664 | k.pop(-2) # remove ln and linear in the name 665 | new_k = '.'.join(k) 666 | else: 667 | new_k = k 668 | new_ckpt[new_k] = v 669 | 670 | # reshape grn affine parameters and biases 671 | for k, v in new_ckpt.items(): 672 | if k.endswith('bias') and len(v.shape) != 1: 673 | new_ckpt[k] = v.reshape(-1) 674 | elif 'grn' in k: 675 | new_ckpt[k] = v.unsqueeze(0).unsqueeze(1) 676 | return new_ckpt 677 | 678 | def cons_loss(online_pred, online_mask, target_pred): 679 | # On the same masked inputs 680 | # Including the masked / unmasked patches 681 | n, c, _, _ = online_pred.shape 682 | online_pred = online_pred.reshape(n, c, -1) 683 | online_pred = torch.einsum('ncl->nlc', online_pred) 684 | target_pred = target_pred.reshape(n, c, -1) 685 | target_pred = torch.einsum('ncl->nlc', target_pred) 686 | rec_cons_loss = (online_pred - target_pred.detach()) ** 2 687 | rec_cons_loss = rec_cons_loss.mean(dim=-1) # [N, L], mean loss per patch 688 | rec_cons_loss = (rec_cons_loss * online_mask).sum() / online_mask.sum() # mean loss on removed patches 689 | return rec_cons_loss 690 | --------------------------------------------------------------------------------