├── LICENSE ├── README.md ├── bin └── dependencies │ ├── install_dependencies_here_linux.sh │ └── install_dependencies_here_windows.txt ├── cvpr2014_kantorov_paper.pdf ├── cvpr2014_kantorov_poster.pdf ├── examples ├── compute_fisher_vectors.sh ├── compute_mpeg_features.sh ├── hollywood2_actioncliptrain00001_h264.mp4 ├── hollywood2_actioncliptrain00001_mpeg4.avi ├── hollywood2_sample_vocabs │ ├── 10-105.hog.gmm │ ├── 106-213.hog.gmm │ ├── 214-309.mbhx.gmm │ └── 310-405.mbhy.gmm └── sample_features_mpeg4.txt.gz ├── paper ├── .gitignore ├── cvpr14.bib ├── cvpr14.tex ├── cvpr2014AuthorKit_latex │ ├── README.txt │ ├── cvpr.sty │ ├── cvpr_eso.sty │ ├── egbib.bib │ ├── egpaper_final.pdf │ ├── egpaper_final.tex │ ├── egpaper_for_review.pdf │ ├── egpaper_for_review.tex │ ├── eso-pic.sty │ └── ieee.bst ├── figures │ ├── CD-descriptor.pdf │ ├── CD-descriptor.svg │ ├── CD-descriptor2.pdf │ ├── CD-descriptor2.svg │ ├── dataset_thumb │ │ ├── hmdb │ │ │ ├── class.png │ │ │ ├── class1.png │ │ │ ├── class2.png │ │ │ ├── class3.png │ │ │ ├── class4.png │ │ │ ├── class5.png │ │ │ └── class6.png │ │ ├── hwd │ │ │ ├── Thumbs.db │ │ │ ├── class1.jpg │ │ │ ├── class2.jpg │ │ │ ├── class3.jpg │ │ │ ├── class4.jpg │ │ │ ├── class5.jpg │ │ │ └── class6.jpg │ │ ├── ucf │ │ │ ├── class1.pdf │ │ │ ├── class2.pdf │ │ │ ├── class3.pdf │ │ │ ├── class4.pdf │ │ │ ├── class5.pdf │ │ │ ├── class6.pdf │ │ │ ├── crop_class1.pdf │ │ │ ├── crop_class2.pdf │ │ │ ├── crop_class3.pdf │ │ │ ├── crop_class4.pdf │ │ │ ├── crop_class5.pdf │ │ │ └── crop_class6.pdf │ │ └── uti │ │ │ ├── class1.pdf │ │ │ ├── class2.pdf │ │ │ ├── class3.pdf │ │ │ ├── class4.pdf │ │ │ ├── class5.pdf │ │ │ ├── class6.pdf │ │ │ ├── crop_class1.pdf │ │ │ ├── crop_class2.pdf │ │ │ ├── crop_class3.pdf │ │ │ ├── crop_class4.pdf │ │ │ ├── crop_class5.pdf │ │ │ └── crop_class6.pdf │ ├── flow │ │ ├── Thumbs.db │ │ ├── actioncliptrain00009_0010.jpg │ │ ├── actioncliptrain00009_0010bright.jpg │ │ ├── actioncliptrain00534_0010.jpg │ │ ├── actioncliptrain00534_0010bright.jpg │ │ ├── bandage_1_frame_0010.jpg │ │ ├── bandage_1_frame_0010.png │ │ ├── bandage_1_frame_0020.jpeg │ │ ├── flow_actioncliptest00538_frame014.jpeg │ │ ├── flow_actioncliptest00538_frame014_mv_quant.png │ │ ├── flow_actioncliptest00538_frame014_stip_quant.png │ │ ├── flow_actioncliptest00538_frame014_traj_quant.jpeg │ │ ├── flow_actioncliptest00686_frame010.jpeg │ │ ├── flow_actioncliptest00686_frame010.png │ │ ├── flow_actioncliptest00686_frame010_mv.png │ │ ├── flow_actioncliptest00686_frame010_mv_quant.png │ │ ├── flow_actioncliptest00686_frame010_stip.png │ │ ├── flow_actioncliptest00686_frame010_stip_quant.png │ │ ├── flow_actioncliptest00686_frame010_traj.jpeg │ │ ├── flow_actioncliptest00686_frame010_traj_quant.jpeg │ │ ├── flow_actioncliptest00870_frame013.jpeg │ │ ├── flow_actioncliptest00870_frame013_mv_quant.png │ │ ├── flow_actioncliptest00870_frame013_stip_quant.png │ │ ├── flow_actioncliptest00870_frame013_traj_quant.jpeg │ │ ├── flow_actioncliptest00870_frame014_mv_quant.png │ │ ├── flow_actioncliptest00870_frame014_stip_quant.png │ │ ├── flow_actioncliptest00870_frame014_traj_quant.jpeg │ │ ├── flow_actioncliptrain00009_frame010_mpeg.png │ │ ├── flow_actioncliptrain00009_frame010_mpeg_quant.png │ │ ├── flow_actioncliptrain00009_frame010_stip.png │ │ ├── flow_actioncliptrain00009_frame010_stip_quant.png │ │ ├── flow_actioncliptrain00009_frame010_traj.jpeg │ │ ├── flow_actioncliptrain00009_frame010_traj_quant.jpeg │ │ ├── flow_actioncliptrain00534_frame010_mpeg.png │ │ ├── flow_actioncliptrain00534_frame010_mpeg_quant.png │ │ ├── flow_actioncliptrain00534_frame010_stip.png │ │ ├── flow_actioncliptrain00534_frame010_stip_quant.png │ │ ├── flow_actioncliptrain00534_frame010_traj.jpeg │ │ ├── flow_actioncliptrain00534_frame010_traj_quant.jpeg │ │ ├── flow_bandage_1_frame003_mpeg.jpeg │ │ ├── flow_bandage_1_frame003_mpeg.png │ │ ├── flow_bandage_1_frame003_mpeg_quant.jpeg │ │ ├── flow_bandage_1_frame003_mpeg_quant.png │ │ ├── flow_bandage_1_frame003_orig.jpeg │ │ ├── flow_bandage_1_frame003_orig_quant.jpeg │ │ ├── flow_bandage_1_frame003_stip.jpeg │ │ ├── flow_bandage_1_frame003_stip.png │ │ ├── flow_bandage_1_frame003_stip_quant.jpeg │ │ ├── flow_bandage_1_frame003_stip_quant.png │ │ ├── flow_bandage_1_frame003_traj.jpeg │ │ ├── flow_bandage_1_frame003_traj_quant.jpeg │ │ ├── flow_bandage_1_frame004_mpeg.jpeg │ │ ├── flow_bandage_1_frame004_mpeg.png │ │ ├── flow_bandage_1_frame004_mpeg_quant.jpeg │ │ ├── flow_bandage_1_frame004_mpeg_quant.png │ │ ├── flow_bandage_1_frame004_orig.jpeg │ │ ├── flow_bandage_1_frame004_orig_quant.jpeg │ │ ├── flow_bandage_1_frame004_stip.jpeg │ │ ├── flow_bandage_1_frame004_stip.png │ │ ├── flow_bandage_1_frame004_stip_quant.jpeg │ │ ├── flow_bandage_1_frame004_stip_quant.png │ │ ├── flow_bandage_1_frame004_traj.jpeg │ │ ├── flow_bandage_1_frame004_traj_quant.jpeg │ │ ├── flow_bandage_1_frame005_mpeg.jpeg │ │ ├── flow_bandage_1_frame005_mpeg.png │ │ ├── flow_bandage_1_frame005_mpeg_quant.jpeg │ │ ├── flow_bandage_1_frame005_mpeg_quant.png │ │ ├── flow_bandage_1_frame005_orig.jpeg │ │ ├── flow_bandage_1_frame005_orig_quant.jpeg │ │ ├── flow_bandage_1_frame005_stip.jpeg │ │ ├── flow_bandage_1_frame005_stip.png │ │ ├── flow_bandage_1_frame005_stip_quant.jpeg │ │ ├── flow_bandage_1_frame005_stip_quant.png │ │ ├── flow_bandage_1_frame005_traj.jpeg │ │ ├── flow_bandage_1_frame005_traj_quant.jpeg │ │ ├── flow_bandage_1_frame006_mpeg.jpeg │ │ ├── flow_bandage_1_frame006_mpeg.png │ │ ├── flow_bandage_1_frame006_mpeg_quant.jpeg │ │ ├── flow_bandage_1_frame006_mpeg_quant.png │ │ ├── flow_bandage_1_frame006_orig.jpeg │ │ ├── flow_bandage_1_frame006_orig_quant.jpeg │ │ ├── flow_bandage_1_frame006_stip.jpeg │ │ ├── flow_bandage_1_frame006_stip.png │ │ ├── flow_bandage_1_frame006_stip_quant.jpeg │ │ ├── flow_bandage_1_frame006_stip_quant.png │ │ ├── flow_bandage_1_frame006_traj.jpeg │ │ ├── flow_bandage_1_frame006_traj_quant.jpeg │ │ ├── flow_bandage_1_frame007_mpeg.jpeg │ │ ├── flow_bandage_1_frame007_mpeg.png │ │ ├── flow_bandage_1_frame007_mpeg_quant.jpeg │ │ ├── flow_bandage_1_frame007_mpeg_quant.png │ │ ├── flow_bandage_1_frame007_orig.jpeg │ │ ├── flow_bandage_1_frame007_orig_quant.jpeg │ │ ├── flow_bandage_1_frame007_stip.jpeg │ │ ├── flow_bandage_1_frame007_stip.png │ │ ├── flow_bandage_1_frame007_stip_quant.jpeg │ │ ├── flow_bandage_1_frame007_stip_quant.png │ │ ├── flow_bandage_1_frame007_traj.jpeg │ │ ├── flow_bandage_1_frame007_traj_quant.jpeg │ │ ├── flow_bandage_1_frame008_mpeg.jpeg │ │ ├── flow_bandage_1_frame008_mpeg.png │ │ ├── flow_bandage_1_frame008_mpeg_quant.jpeg │ │ ├── flow_bandage_1_frame008_mpeg_quant.png │ │ ├── flow_bandage_1_frame008_orig.jpeg │ │ ├── flow_bandage_1_frame008_orig_quant.jpeg │ │ ├── flow_bandage_1_frame008_stip.jpeg │ │ ├── flow_bandage_1_frame008_stip.png │ │ ├── flow_bandage_1_frame008_stip_quant.jpeg │ │ ├── flow_bandage_1_frame008_stip_quant.png │ │ ├── flow_bandage_1_frame008_traj.jpeg │ │ ├── flow_bandage_1_frame008_traj_quant.jpeg │ │ ├── flow_bandage_1_frame009_mpeg.jpeg │ │ ├── flow_bandage_1_frame009_mpeg.png │ │ ├── flow_bandage_1_frame009_mpeg_quant.jpeg │ │ ├── flow_bandage_1_frame009_mpeg_quant.png │ │ ├── flow_bandage_1_frame009_orig.jpeg │ │ ├── flow_bandage_1_frame009_orig_quant.jpeg │ │ ├── flow_bandage_1_frame009_stip.jpeg │ │ ├── flow_bandage_1_frame009_stip.png │ │ ├── flow_bandage_1_frame009_stip_quant.jpeg │ │ ├── flow_bandage_1_frame009_stip_quant.png │ │ ├── flow_bandage_1_frame009_traj.jpeg │ │ ├── flow_bandage_1_frame009_traj_quant.jpeg │ │ ├── flow_bandage_1_frame010_mpeg.jpeg │ │ ├── flow_bandage_1_frame010_mpeg.png │ │ ├── flow_bandage_1_frame010_mpeg_quant.jpeg │ │ ├── flow_bandage_1_frame010_mpeg_quant.png │ │ ├── flow_bandage_1_frame010_orig.jpeg │ │ ├── flow_bandage_1_frame010_orig_quant.jpeg │ │ ├── flow_bandage_1_frame010_stip.jpeg │ │ ├── flow_bandage_1_frame010_stip.png │ │ ├── flow_bandage_1_frame010_stip_quant.jpeg │ │ ├── flow_bandage_1_frame010_stip_quant.png │ │ ├── flow_bandage_1_frame010_traj.jpeg │ │ ├── flow_bandage_1_frame010_traj_quant.jpeg │ │ ├── flow_bandage_1_frame011_mpeg.jpeg │ │ ├── flow_bandage_1_frame011_mpeg.png │ │ ├── flow_bandage_1_frame011_mpeg_quant.jpeg │ │ ├── flow_bandage_1_frame011_mpeg_quant.png │ │ ├── flow_bandage_1_frame011_orig.jpeg │ │ ├── flow_bandage_1_frame011_orig_quant.jpeg │ │ ├── flow_bandage_1_frame011_stip.jpeg │ │ ├── flow_bandage_1_frame011_stip.png │ │ ├── flow_bandage_1_frame011_stip_quant.jpeg │ │ ├── flow_bandage_1_frame011_stip_quant.png │ │ ├── flow_bandage_1_frame011_traj.jpeg │ │ ├── flow_bandage_1_frame011_traj_quant.jpeg │ │ ├── flow_bandage_1_frame012_mpeg.jpeg │ │ ├── flow_bandage_1_frame012_mpeg.png │ │ ├── flow_bandage_1_frame012_mpeg_quant.jpeg │ │ ├── flow_bandage_1_frame012_mpeg_quant.png │ │ ├── flow_bandage_1_frame012_orig.jpeg │ │ ├── flow_bandage_1_frame012_orig_quant.jpeg │ │ ├── flow_bandage_1_frame012_stip.jpeg │ │ ├── flow_bandage_1_frame012_stip.png │ │ ├── flow_bandage_1_frame012_stip_quant.jpeg │ │ ├── flow_bandage_1_frame012_stip_quant.png │ │ ├── flow_bandage_1_frame012_traj.jpeg │ │ ├── flow_bandage_1_frame012_traj_quant.jpeg │ │ ├── flow_bandage_1_frame013_mpeg.jpeg │ │ ├── flow_bandage_1_frame013_mpeg.png │ │ ├── flow_bandage_1_frame013_mpeg_quant.jpeg │ │ ├── flow_bandage_1_frame013_mpeg_quant.png │ │ ├── flow_bandage_1_frame013_orig.jpeg │ │ ├── flow_bandage_1_frame013_orig_quant.jpeg │ │ ├── flow_bandage_1_frame013_stip.jpeg │ │ ├── flow_bandage_1_frame013_stip.png │ │ ├── flow_bandage_1_frame013_stip_quant.jpeg │ │ ├── flow_bandage_1_frame013_stip_quant.png │ │ ├── flow_bandage_1_frame013_traj.jpeg │ │ ├── flow_bandage_1_frame013_traj_quant.jpeg │ │ ├── flow_bandage_1_frame014_mpeg.jpeg │ │ ├── flow_bandage_1_frame014_mpeg.png │ │ ├── flow_bandage_1_frame014_mpeg_quant.jpeg │ │ ├── flow_bandage_1_frame014_mpeg_quant.png │ │ ├── flow_bandage_1_frame014_orig.jpeg │ │ ├── flow_bandage_1_frame014_orig_quant.jpeg │ │ ├── flow_bandage_1_frame014_stip.jpeg │ │ ├── flow_bandage_1_frame014_stip.png │ │ ├── flow_bandage_1_frame014_stip_quant.jpeg │ │ ├── flow_bandage_1_frame014_stip_quant.png │ │ ├── flow_bandage_1_frame014_traj.jpeg │ │ ├── flow_bandage_1_frame014_traj_quant.jpeg │ │ ├── flow_bandage_1_frame015_mpeg.jpeg │ │ ├── flow_bandage_1_frame015_mpeg.png │ │ ├── flow_bandage_1_frame015_mpeg_quant.jpeg │ │ ├── flow_bandage_1_frame015_mpeg_quant.png │ │ ├── flow_bandage_1_frame015_orig.jpeg │ │ ├── flow_bandage_1_frame015_orig_quant.jpeg │ │ ├── flow_bandage_1_frame015_stip.jpeg │ │ ├── flow_bandage_1_frame015_stip.png │ │ ├── flow_bandage_1_frame015_stip_quant.jpeg │ │ ├── flow_bandage_1_frame015_stip_quant.png │ │ ├── flow_bandage_1_frame015_traj.jpeg │ │ ├── flow_bandage_1_frame015_traj_quant.jpeg │ │ ├── flow_bandage_1_frame020_mpeg.png │ │ ├── flow_bandage_1_frame020_mpeg_quant.png │ │ ├── flow_bandage_1_frame020_orig.jpeg │ │ ├── flow_bandage_1_frame020_orig_quant.jpeg │ │ ├── flow_bandage_1_frame020_stip.png │ │ ├── flow_bandage_1_frame020_stip_quant.png │ │ ├── flow_bandage_1_frame020_traj.jpeg │ │ ├── flow_bandage_1_frame020_traj_quant.png │ │ ├── flow_bandage_1_frame021_mpeg.png │ │ ├── flow_bandage_1_frame021_mpeg_quant.png │ │ ├── flow_bandage_1_frame021_orig.jpeg │ │ ├── flow_bandage_1_frame021_orig_quant.jpeg │ │ ├── flow_bandage_1_frame021_stip.png │ │ ├── flow_bandage_1_frame021_stip_quant.png │ │ ├── flow_bandage_1_frame021_traj.jpeg │ │ ├── flow_bandage_1_frame021_traj_quant.png │ │ ├── flowcolorcode.jpg │ │ └── flowcolorcode_reoriented.jpg │ ├── fv │ │ └── fv_graph.m │ ├── hollywood2-flann-fps-map-crop-mod.pdf │ ├── hollywood2-flann-fps-map-crop-mod.svg │ ├── hollywood2-flann-fps-map-crop.pdf │ ├── hollywood2-flann-fps-map-kd8.pdf │ ├── hollywood2-flann-fps-map.pdf │ ├── hollywood2-per-class-barplot-crop.pdf │ ├── hollywood2-per-class-barplot.pdf │ └── pdfcrop.py └── shortstrings.bib ├── poster ├── cvpr2014_kantorov_poster.pptx ├── figures │ ├── fisher.png │ ├── fisher.svg │ ├── fisher_formula.png │ ├── heng_pie2.png │ ├── heng_pie2.svg │ ├── heng_pie3.png │ ├── heng_pie3.svg │ ├── hmdb51-table.png │ ├── hollywood2-flann-fps-map-crop-mod.pdf │ ├── hollywood2-flann-fps-map.png │ ├── hwd2-table.png │ └── ucf50-table.png └── images │ ├── bandage_1_frame_0020.jpeg │ ├── ens.jpg │ ├── logo_INRIA.png │ ├── mv_bandage_1_frame_0020.png │ └── willow2.jpg ├── repro ├── dot_kernel.py ├── hmdb-51 │ ├── Makefile │ ├── README.md │ ├── allClips.txt │ └── classify.py ├── hollywood-2 │ ├── Makefile │ ├── README.md │ ├── allClips.txt │ └── classify.py ├── report.py └── yaelfv.py ├── src ├── fastfv │ ├── Makefile │ ├── common.h │ ├── diag.h │ ├── fisher_vector.h │ └── main.cpp ├── fastvideofeat │ ├── Makefile │ ├── Makefile.nmake │ ├── common.h │ ├── descriptors.h │ ├── diag.h │ ├── main.cpp │ ├── msinttypes.h │ └── video.h ├── gmm_train.py └── util.h └── website ├── deploy.sh ├── index.html ├── preview_small.png └── teaser.jpg /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2011-2015 Vadim Kantorov 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 | # Information & Contact 2 | 3 | An earlier version of this code was used to compute the results of the following paper: 4 | 5 | >"Efficient feature extraction, encoding and classification for action recognition", 6 | Vadim Kantorov, Ivan Laptev, 7 | In Proc. Computer Vision and Pattern Recognition (CVPR), IEEE, 2014 8 | 9 | If you use this code, please cite our work: 10 | 11 | > @inproceedings{kantorov2014, 12 |       author = {Kantorov, V. and Laptev, I.}, 13 |       title = {Efficient feature extraction, encoding and classification for action recognition}, 14 |       booktitle = {Proc. Computer Vision and Pattern Recognition (CVPR), IEEE, 2014}, 15 |       year = {2014} 16 | } 17 | 18 | The paper and the poster are available at the [project webpage](http://www.di.ens.fr/willow/research/fastvideofeat) or in this repository, the binaries are published on the repository [releases page](http://github.com/vadimkantorov/cvpr2014/releases), the Hollywood-2 and HMDB-51 repro scripts are in the [repro directory] (http://github.com/vadimkantorov/cvpr2014/tree/master/repro/). 19 | 20 | Please submit bugs on [GitHub](http://github.com/vadimkantorov/cvpr2014/issues) directly. 21 | 22 | For any other question, please contact Vadim Kantorov at vadim.kantorov@inria.fr or vadim.kantorov@gmail.com. 23 | 24 | 25 | # Description and usage 26 | 27 | We release two tools in this repository. The first tool **fastvideofeat** is a motion feature extractor based on motion vectors from video compression information. The second is a fast Fisher vector computation tool **fastfv** that uses vector SSE2 CPU instructions. 28 | 29 | We also release scripts (in the *repro* directory) for reproducing our results on Hollywood-2 dataset and on HMDB-51 dataset. 30 | 31 | All code is released under the [MIT license](http://github.com/vadimkantorov/cvpr2014/blob/master/LICENSE). 32 | 33 | ### fastvideofeat 34 | 35 | The tool accepts a video file path as input and writes descriptors to standard output. 36 | ##### Command-line options: 37 | 38 | Option | Description 39 | --- | --- 40 | --disableHOG | disables HOG descriptor computation 41 | --disableHOF | disables HOF descriptor computation 42 | --disableMBH | disables MBH descriptor computation 43 | -f 1-10 | restricts descriptor computation to the given frame range 44 | 45 | **IMPORTANT** Frame range is specified in terms of PTS (presentation time stamp) which are usually equivalent to frame indices, but not always. Beware. You can inspect PTS values of the frames of the video using ffmpeg's ffprobe (fourth column): 46 | 47 | > $ ffprobe -print_format csv -show_packets -select_streams 0 video.mp4 48 | 49 | The output format (also reminded on standard error): 50 | 51 | ```#Descriptor format: xnorm ynorm tnorm pts StartPTS EndPTS Xoffset Yoffset PatchWidth PatchHeight hog (dim. 96) hof (dim. 108) mbhx (dim. 96) mbhy (dim. 96)``` 52 | 53 | + **xnorm** and **ynorm** are the normalized frame coordinates of the spatio-temporal (s-t) patch 54 | + **tnorm** and **pts** are the normalized and unnormalized frame number of the s-t patch center 55 | + **StartPTS** and **EndPTS** are the frame numbers of the first and last frames of the s-t patch 56 | + **Xoffset** and **Yoffset** are the non-normalized frame coordinates of the s-t patch 57 | + **PatchWidth** and **PatchHeight** are the non-normalized width and height of teh s-t patch 58 | + **descr** is the array of floats of concatenated descriptors. The size of this array depends on the enabled descriptor types. All values are from zero to one. The first comment line describes the enabled descriptor types, their order in the array, and the dimension of each descriptor in the array. 59 | 60 | Every line on standard output corresponds to an extracted descriptor of a patch anc consists of tab-separated floats. 61 | 62 | ##### Examples: 63 | - Compute HOG, HOF, MBH and save the descriptors in descriptors.txt: 64 | > $ ./fastvideofeat video.avi > descriptors.txt 65 | 66 | - Compute only HOF and MBH from the first 600 frames and save the descriptors in descriptors.txt: 67 | > $ ./fastvideofeat video.avi --disableHOG -f 1-600 > descriptors.txt 68 | 69 | More examples in *examples/compute_mpeg_features.sh*. 70 | 71 | ##### Video format support 72 | We've tested **fastvideofeat** only videos encoded in H.264 and MPEG-4. Whether motion vectors can be extracted and processed depends completely on FFmpeg's ability to put them into the right structures. Last time I've checked it was not working for VP9, for example. And in general, video reading depends fully on FFmpeg libraries. 73 | 74 | ### fastfv 75 | The tool accepts descriptors on the standard input and writes Fisher vector (FV) to the standard output. The tool consumes GMM vocabs saved by Yael library. A [sample script](https://github.com/vadimkantorov/cvpr2014/blob/master/src/gmm_train.py) to build GMM vocabs with Yael is provided, as well as its [usage example](https://github.com/vadimkantorov/cvpr2014/blob/master/examples/compute_fisher_vectors.sh). 76 | 77 | **IMPORTANT** The computed Fisher vectors are non-normalized, apply signed square rooting / power normalization, L2-normalization, clipping etc before training a classifier. 78 | ##### Command-line options: 79 | 80 | Option | Description 81 | --- | --- 82 | --xpos 0 | specifies the column with **x** coordinate of the s-t patch in the descriptor array 83 | --ypos 1 | specifies the column with **y** coordinate of the s-t patch in the descriptor array 84 | --tpos 2 | specifies the column with **t** coordinate of the s-t patch in the descriptor array 85 | --knn 5 | FV parts corresponding to these many closest GMM centroids will be updated during processing of every input descriptor 86 | --vocab 10-105 10-105.hog.gmm | specifies descriptor type location and path to GMM vocab. This option is mandatory, and several options of this kind are allowed. 87 | --enableflann 4 32 | use FLANN instead of knn for descriptor attribution, first argument is number of kd-trees, second argument is number of checks performed during attribution 88 | --enablespatiotemporalgrids | enables spatio-temporal grids: 1x1x1, 1x3x1, 1x1x2 89 | --enablesecondorder | enables second-order part of the Fisher vector 90 | 91 | ##### Examples: 92 | - Compute Fisher vector: 93 | > $ zcat sample_features_mpeg4.txt.gz | ../bin/fastfv --xpos 0 --ypos 1 --tpos 2 --enablespatiotemporalgrids --enableflann 4 32 --vocab 10-105 hollywood2_sample_vocabs/10-105.hog.gmm --vocab 106-213 hollywood2_sample_vocabs/106-213.hog.gmm --vocab 214-309 hollywood2_sample_vocabs/214-309.mbhx.gmm --vocab 310-405 hollywood2_sample_vocabs/310-405.mbhy.gmm > fv.txt 94 | 95 | - Build GMM vocab with Yael: 96 | > $ PYTHONPATH=$(pwd)/../bin/dependencies/yael/yael:$PYTHONPATH cat features*.gz | ../src/gmm_train.py --gmm_ncomponents 256 --vocab 10-105 10-105.hog.gmm 97 | 98 | Examples are explained in *examples/compute_fisher_vector.sh*. 99 | 100 | ##### Performance 101 | We haven't observed enabling second order boosts accuracy, so it's disabled by default. Enabling second order part increases Fisher vector size twice. 102 | 103 | Using simple knn descriptor attribution (default) beats FLANN in speed by a factor of two, yet leads to <1% accuracy degradation. It's enabled by default because of its speed. 104 | 105 | Enabling spatio-temporal grids (disabled by default) is important for maximum accuracy (~2% gain). 106 | 107 | If you use FLANN, it's the number of checks that defines speed, try reducing it to gain speed. 108 | 109 | # Building from source 110 | 111 | On both Linux and Windows, the binaries will appear in *bin* after building. By default, code links statically with dependencies below, check Makefiles for details. 112 | 113 | Dependencies for **fastvideofeat**: 114 | - opencv (http://opencv.org) 115 | - ffmpeg (http://ffmpeg.org) 116 | 117 | Dependencies for **fastfv**: 118 | - opencv (http://opencv.org) 119 | - yael (http://gforge.inria.fr/projects/yael/), ATLAS with LAPACK (required by yael) 120 | 121 | The code is known to work with OpenCV 2.4.9, FFmpeg 2.4, Yael 4.38, ATLAS 3.10.2, LAPACK 3.5.0. 122 | 123 | ### Linux 124 | Make sure you have the dependencies installed and visible to g++ (a minimal installation script is in the *bin/dependencies* directory). Build the tools by running **make**. 125 | 126 | ### Windows 127 | Only **fastvideofeat** builds and works on Windows, **fastfv** doesn't build because yael currently does not support Windows. 128 | 129 | To build **fastvideofeat**, set in Makefile the good paths to the dependencies, processor architecture and Visual C++ version, and run from an appropriate Visual Studio Developer Command Prompt (specifically, VS2013 x64 Native Tools Command Prompt worked for us): 130 | > $ nmake -f Makefile.nmake 131 | 132 | # Notes 133 | For practical usage, software needs to be modified to save and read features in some binary format, because the overhead on text file reading/writing is huge. 134 | 135 | # License and acknowledgements 136 | All code and scripts are licensed under the [MIT license](http://github.com/vadimkantorov/cvpr2014/blob/master/LICENSE). 137 | 138 | We greatly thank [Heng Wang](http://lear.inrialpes.fr/people/wang) and [his work](http://lear.inrialpes.fr/people/wang/improved_trajectories) which was of significant help. 139 | -------------------------------------------------------------------------------- /bin/dependencies/install_dependencies_here_linux.sh: -------------------------------------------------------------------------------- 1 | # This script will try to download and install from sources opencv 2.4.9 (with minimal set of modules), ffmpeg 2.4, yasm 1.3.0 (required by ffmpeg), yael 4.38, ATLAS 3.10.2 and LAPACK 3.5.0 (required by yael). 2 | # I cannot guarantee it will work on absolutely all systems, hopefully it still provides guidance. 3 | 4 | wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz 5 | tar -xf yasm-1.3.0.tar.gz 6 | cd yasm-1.3.0 7 | ./configure --prefix=$(pwd)/.. 8 | make -j4 && make install 9 | cd .. 10 | 11 | wget http://ffmpeg.org/releases/ffmpeg-2.4.tar.bz2 12 | tar -xf ffmpeg-2.4.tar.bz2 13 | cd ffmpeg-2.4 14 | ./configure --prefix=$(pwd)/.. --yasmexe=$(pwd)/../bin/yasm 15 | make -j4 && make install 16 | cd .. 17 | 18 | wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.9/opencv-2.4.9.zip 19 | unzip opencv-2.4.9.zip 20 | cd opencv-2.4.9 21 | mkdir build && cd build 22 | cmake -D CMAKE_INSTALL_PREFIX=$(pwd)/../.. -D CMAKE_BUILD_TYPE=RELEASE -D BUILD_SHARED_LIBS=OFF -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D BUILD_opencv_gpu=OFF -D BUILD_opencv_python=OFF -D BUILD_opencv_java=OFF -D BUILD_opencv_ml=OFF -D BUILD_opencv_contrib=OFF -D BUILD_opencv_ocl=OFF -D BUILD_opencv_legacy=OFF -D BUILD_opencv_nonfree=OFF -D BUILD_opencv_photo=OFF -D BUILD_opencv_video=OFF -D BUILD_opencv_stitching=OFF -D BUILD_opencv_superres=OFF -D BUILD_opencv_photo=OFF -D BUILD_opencv_objdetect=OFF -D BUILD_opencv_features2d=OFF -D BUILD_opencv_calib3d=OFF -D WITH_CUDA=OFF .. 23 | make -j4 && make install 24 | cd ../.. 25 | 26 | wget http://www.netlib.org/lapack/lapack-3.5.0.tgz 27 | wget http://downloads.sourceforge.net/project/math-atlas/Stable/3.10.2/atlas3.10.2.tar.bz2 28 | tar -xf atlas3.10.2.tar.bz2 29 | cd ATLAS 30 | mkdir build && cd build 31 | ../configure -t 0 --prefix=$(pwd)/../.. --with-netlib-lapack-tarfile=../../lapack-3.5.0.tgz 32 | make -j4 && make install 33 | cd ../.. 34 | 35 | wget https://gforge.inria.fr/frs/download.php/file/33810/yael_v438.tar.gz 36 | mkdir yael && tar -xf yael_v438.tar.gz -C yael --strip-components=1 37 | cd yael 38 | export LDFLAGS='-L../lib -lf77blas -llapack' 39 | bash configure.sh --enable-numpy 40 | make -j4 41 | cd .. 42 | -------------------------------------------------------------------------------- /bin/dependencies/install_dependencies_here_windows.txt: -------------------------------------------------------------------------------- 1 | 0. Install 7zip 2 | 3 | 1. Install OpenCV by downloading a Windows build from http://opencv.org/downloads.html 4 | We used this build: http://downloads.sourceforge.net/project/opencvlibrary/opencv-win/2.4.9/opencv-2.4.9.exe 5 | Extract the archive in the dependencies directory 6 | 7 | 2. Install FFmpeg by downloading a Windows build from http://ffmpeg.zeranoe.com/builds/win64/dev/ 8 | We used this build: http://ffmpeg.zeranoe.com/builds/win64/dev/ffmpeg-2.4.5-win64-dev.7z 9 | Extract the archive in the dependencies directory 10 | -------------------------------------------------------------------------------- /cvpr2014_kantorov_paper.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/cvpr2014_kantorov_paper.pdf -------------------------------------------------------------------------------- /cvpr2014_kantorov_poster.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/cvpr2014_kantorov_poster.pdf -------------------------------------------------------------------------------- /examples/compute_fisher_vectors.sh: -------------------------------------------------------------------------------- 1 | # Put your binaries in bin 2 | FASTFV=../bin/fastfv 3 | 4 | # Compute GMM vocabs for HOG / HOF / MBH. Lines below commented because we don't provide a feature archive. 5 | # YAELDIR=$(pwd)/../bin/dependencies/yael/yael 6 | # export PYTHONPATH=$YAELDIR:$PYTHONPATH 7 | # cat features*.gz | ../src/gmm_train.py --gmm_ncomponents 256 --vocab 10-105 10-105.hog.gmm 8 | # cat features*.gz | ../src/gmm_train.py --gmm_ncomponents 256 --vocab 106-213 106-213.hog.gmm 9 | # cat features*.gz | ../src/gmm_train.py --gmm_ncomponents 256 --vocab 214-309 214-309.mbhx.gmm 10 | # cat features*.gz | ../src/gmm_train.py --gmm_ncomponents 256 --vocab 310-405 310-405.mbhy.gmm 11 | 12 | # compute unnormalized Fisher vectors for MPEG features using precomputed vocabs 13 | # The descriptor part indices are zero-based and inclusive: 14 | # - HOG is columns [10; 105] 15 | # - HOF is columns [106; 212] 16 | # - MBHx is columns [214; 309] 17 | # - MBHy is columns [310; 405] 18 | # xnpos, ynpos, tnpos specify the columns of the spatio-temporal location of the descriptor (0, 1, 2 in our case). For MPEG features spatio-temporal coordinates are 1-normalized, so no xtot/ytot/ttot options are needed. 19 | # x/y/t-gridding is controlled by the grid options. 20 | 21 | zcat sample_features_mpeg4.txt.gz | $FASTFV --xpos 0 --ypos 1 --tpos 2 --enablespatiotemporalgrids --enableflann 4 32 --vocab 10-105 hollywood2_sample_vocabs/10-105.hog.gmm --vocab 106-213 hollywood2_sample_vocabs/106-213.hog.gmm --vocab 214-309 hollywood2_sample_vocabs/214-309.mbhx.gmm --vocab 310-405 hollywood2_sample_vocabs/310-405.mbhy.gmm > fv.txt 22 | -------------------------------------------------------------------------------- /examples/compute_mpeg_features.sh: -------------------------------------------------------------------------------- 1 | # Put your binaries in bin 2 | FASTVIDEOFEAT=../bin/fastvideofeat 3 | 4 | # compute HOG/HOF/MBH features from MPEG4-encoded video. features_mpeg4.txt should approx. match uncompressed sample_features_mpeg4.txt.gz modulo minor ffmpeg decoding changes. 5 | $FASTVIDEOFEAT hollywood2_actioncliptrain00001_mpeg4.avi > features_mpeg4.txt 6 | 7 | # compute features from first 100 frames from MPEG4-encoded video 8 | $FASTVIDEOFEAT hollywood2_actioncliptrain00001_mpeg4.avi -f 1-100 > features_mpeg4_600frames.txt 9 | 10 | # compute only HOF / MBH (no HOG) features from 11 | $FASTVIDEOFEAT hollywood2_actioncliptrain00001_h264.mp4 --disableHOG | gzip > features_h264_nohog.txt.gz 12 | -------------------------------------------------------------------------------- /examples/hollywood2_actioncliptrain00001_h264.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/examples/hollywood2_actioncliptrain00001_h264.mp4 -------------------------------------------------------------------------------- /examples/hollywood2_actioncliptrain00001_mpeg4.avi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/examples/hollywood2_actioncliptrain00001_mpeg4.avi -------------------------------------------------------------------------------- /examples/hollywood2_sample_vocabs/10-105.hog.gmm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/examples/hollywood2_sample_vocabs/10-105.hog.gmm -------------------------------------------------------------------------------- /examples/hollywood2_sample_vocabs/106-213.hog.gmm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/examples/hollywood2_sample_vocabs/106-213.hog.gmm -------------------------------------------------------------------------------- /examples/hollywood2_sample_vocabs/214-309.mbhx.gmm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/examples/hollywood2_sample_vocabs/214-309.mbhx.gmm -------------------------------------------------------------------------------- /examples/hollywood2_sample_vocabs/310-405.mbhy.gmm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/examples/hollywood2_sample_vocabs/310-405.mbhy.gmm -------------------------------------------------------------------------------- /examples/sample_features_mpeg4.txt.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/examples/sample_features_mpeg4.txt.gz -------------------------------------------------------------------------------- /paper/.gitignore: -------------------------------------------------------------------------------- 1 | *.text.bak 2 | *.aux 3 | *.bbl 4 | *.blg 5 | *.brf 6 | *.log 7 | *.synctex.gz 8 | iccv2013.pdf 9 | cvpr14.pdf 10 | -------------------------------------------------------------------------------- /paper/cvpr2014AuthorKit_latex/README.txt: -------------------------------------------------------------------------------- 1 | 2 | To make a sample CVPR paper, copy the contents of this directory 3 | somewhere, and type 4 | 5 | latex egpaper_final 6 | 7 | or 8 | 9 | pdflatex egpaper_final 10 | 11 | 12 | To make a copy with the review style (for anonymous review, and 13 | including line numbers, replace "egpaper_final" with 14 | "egpaper_for_review" in the commands above. 15 | 16 | Note that in some environments, it may be necessary to run bibtex explicitly (bibtex egpaper_final). 17 | -------------------------------------------------------------------------------- /paper/cvpr2014AuthorKit_latex/cvpr.sty: -------------------------------------------------------------------------------- 1 | % --------------------------------------------------------------- 2 | % 3 | % $Id: cvpr.sty,v 1.3 2005/10/24 19:56:15 awf Exp $ 4 | % 5 | % by Paolo.Ienne@di.epfl.ch 6 | % some mods by awf@acm.org 7 | % 8 | % --------------------------------------------------------------- 9 | % 10 | % no guarantee is given that the format corresponds perfectly to 11 | % IEEE 8.5" x 11" Proceedings, but most features should be ok. 12 | % 13 | % --------------------------------------------------------------- 14 | % with LaTeX2e: 15 | % ============= 16 | % 17 | % use as 18 | % \documentclass[times,10pt,twocolumn]{article} 19 | % \usepackage{latex8} 20 | % \usepackage{times} 21 | % 22 | % --------------------------------------------------------------- 23 | 24 | % with LaTeX 2.09: 25 | % ================ 26 | % 27 | % use as 28 | % \documentstyle[times,art10,twocolumn,latex8]{article} 29 | % 30 | % --------------------------------------------------------------- 31 | % with both versions: 32 | % =================== 33 | % 34 | % specify \cvprfinalcopy to emit the final camera-ready copy 35 | % 36 | % specify references as 37 | % \bibliographystyle{ieee} 38 | % \bibliography{...your files...} 39 | % 40 | % --------------------------------------------------------------- 41 | 42 | \usepackage{eso-pic} 43 | \usepackage{xspace} 44 | 45 | \typeout{CVPR 8.5 x 11-Inch Proceedings Style `cvpr.sty'.} 46 | 47 | % ten point helvetica bold required for captions 48 | % eleven point times bold required for second-order headings 49 | % in some sites the name of the fonts may differ, 50 | % change the name here: 51 | \font\cvprtenhv = phvb at 8pt % *** IF THIS FAILS, SEE cvpr.sty *** 52 | \font\elvbf = ptmb scaled 1100 53 | 54 | % If the above lines give an error message, try to comment them and 55 | % uncomment these: 56 | %\font\cvprtenhv = phvb7t at 8pt 57 | %\font\elvbf = ptmb7t scaled 1100 58 | 59 | % set dimensions of columns, gap between columns, and paragraph indent 60 | \setlength{\textheight}{8.875in} 61 | \setlength{\textwidth}{6.875in} 62 | \setlength{\columnsep}{0.3125in} 63 | \setlength{\topmargin}{0in} 64 | \setlength{\headheight}{0in} 65 | \setlength{\headsep}{0in} 66 | \setlength{\parindent}{1pc} 67 | \setlength{\oddsidemargin}{-.304in} 68 | \setlength{\evensidemargin}{-.304in} 69 | 70 | \newif\ifcvprfinal 71 | \cvprfinalfalse 72 | \def\cvprfinalcopy{\global\cvprfinaltrue} 73 | 74 | % memento from size10.clo 75 | % \normalsize{\@setfontsize\normalsize\@xpt\@xiipt} 76 | % \small{\@setfontsize\small\@ixpt{11}} 77 | % \footnotesize{\@setfontsize\footnotesize\@viiipt{9.5}} 78 | % \scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt} 79 | % \tiny{\@setfontsize\tiny\@vpt\@vipt} 80 | % \large{\@setfontsize\large\@xiipt{14}} 81 | % \Large{\@setfontsize\Large\@xivpt{18}} 82 | % \LARGE{\@setfontsize\LARGE\@xviipt{22}} 83 | % \huge{\@setfontsize\huge\@xxpt{25}} 84 | % \Huge{\@setfontsize\Huge\@xxvpt{30}} 85 | 86 | \def\@maketitle 87 | { 88 | \newpage 89 | \null 90 | \vskip .375in 91 | \begin{center} 92 | {\Large \bf \@title \par} 93 | % additional two empty lines at the end of the title 94 | \vspace*{24pt} 95 | { 96 | \large 97 | \lineskip .5em 98 | \begin{tabular}[t]{c} 99 | \ifcvprfinal\@author\else Anonymous CVPR submission\\ 100 | \vspace*{1pt}\\%This space will need to be here in the final copy, so don't squeeze it out for the review copy. 101 | Paper ID \cvprPaperID \fi 102 | \end{tabular} 103 | \par 104 | } 105 | % additional small space at the end of the author name 106 | \vskip .5em 107 | % additional empty line at the end of the title block 108 | \vspace*{12pt} 109 | \end{center} 110 | } 111 | 112 | \def\abstract 113 | {% 114 | \centerline{\large\bf Abstract}% 115 | \vspace*{12pt}% 116 | \it% 117 | } 118 | 119 | \def\endabstract 120 | { 121 | % additional empty line at the end of the abstract 122 | \vspace*{12pt} 123 | } 124 | 125 | \def\affiliation#1{\gdef\@affiliation{#1}} \gdef\@affiliation{} 126 | 127 | \newlength{\@ctmp} 128 | \newlength{\@figindent} 129 | \setlength{\@figindent}{1pc} 130 | 131 | \long\def\@makecaption#1#2{ 132 | \setbox\@tempboxa\hbox{\small \noindent #1.~#2} 133 | \setlength{\@ctmp}{\hsize} 134 | \addtolength{\@ctmp}{-\@figindent}\addtolength{\@ctmp}{-\@figindent} 135 | % IF longer than one indented paragraph line 136 | \ifdim \wd\@tempboxa >\@ctmp 137 | % THEN DON'T set as an indented paragraph 138 | {\small #1.~#2\par} 139 | \else 140 | % ELSE center 141 | \hbox to\hsize{\hfil\box\@tempboxa\hfil} 142 | \fi} 143 | 144 | % correct heading spacing and type 145 | \def\cvprsection{\@startsection {section}{1}{\z@} 146 | {10pt plus 2pt minus 2pt}{7pt} {\large\bf}} 147 | \def\cvprssect#1{\cvprsection*{#1}} 148 | \def\cvprsect#1{\cvprsection{\hskip -1em.~#1}} 149 | \def\section{\@ifstar\cvprssect\cvprsect} 150 | 151 | \def\cvprsubsection{\@startsection {subsection}{2}{\z@} 152 | {8pt plus 2pt minus 2pt}{6pt} {\elvbf}} 153 | \def\cvprssubsect#1{\cvprsubsection*{#1}} 154 | \def\cvprsubsect#1{\cvprsubsection{\hskip -1em.~#1}} 155 | \def\subsection{\@ifstar\cvprssubsect\cvprsubsect} 156 | 157 | %% --------- Page background marks: Ruler and confidentiality 158 | 159 | % ----- define vruler 160 | \makeatletter 161 | \newbox\cvprrulerbox 162 | \newcount\cvprrulercount 163 | \newdimen\cvprruleroffset 164 | \newdimen\cv@lineheight 165 | \newdimen\cv@boxheight 166 | \newbox\cv@tmpbox 167 | \newcount\cv@refno 168 | \newcount\cv@tot 169 | % NUMBER with left flushed zeros \fillzeros[] 170 | \newcount\cv@tmpc@ \newcount\cv@tmpc 171 | \def\fillzeros[#1]#2{\cv@tmpc@=#2\relax\ifnum\cv@tmpc@<0\cv@tmpc@=-\cv@tmpc@\fi 172 | \cv@tmpc=1 % 173 | \loop\ifnum\cv@tmpc@<10 \else \divide\cv@tmpc@ by 10 \advance\cv@tmpc by 1 \fi 174 | \ifnum\cv@tmpc@=10\relax\cv@tmpc@=11\relax\fi \ifnum\cv@tmpc@>10 \repeat 175 | \ifnum#2<0\advance\cv@tmpc1\relax-\fi 176 | \loop\ifnum\cv@tmpc<#1\relax0\advance\cv@tmpc1\relax\fi \ifnum\cv@tmpc<#1 \repeat 177 | \cv@tmpc@=#2\relax\ifnum\cv@tmpc@<0\cv@tmpc@=-\cv@tmpc@\fi \relax\the\cv@tmpc@}% 178 | % \makevruler[][][][][] 179 | \def\makevruler[#1][#2][#3][#4][#5]{\begingroup\offinterlineskip 180 | \textheight=#5\vbadness=10000\vfuzz=120ex\overfullrule=0pt% 181 | \global\setbox\cvprrulerbox=\vbox to \textheight{% 182 | {\parskip=0pt\hfuzz=150em\cv@boxheight=\textheight 183 | \cv@lineheight=#1\global\cvprrulercount=#2% 184 | \cv@tot\cv@boxheight\divide\cv@tot\cv@lineheight\advance\cv@tot2% 185 | \cv@refno1\vskip-\cv@lineheight\vskip1ex% 186 | \loop\setbox\cv@tmpbox=\hbox to0cm{{\cvprtenhv\hfil\fillzeros[#4]\cvprrulercount}}% 187 | \ht\cv@tmpbox\cv@lineheight\dp\cv@tmpbox0pt\box\cv@tmpbox\break 188 | \advance\cv@refno1\global\advance\cvprrulercount#3\relax 189 | \ifnum\cv@refno<\cv@tot\repeat}}\endgroup}% 190 | \makeatother 191 | % ----- end of vruler 192 | 193 | % \makevruler[][][][][] 194 | \def\cvprruler#1{\makevruler[12pt][#1][1][3][0.993\textheight]\usebox{\cvprrulerbox}} 195 | \AddToShipoutPicture{% 196 | \ifcvprfinal\else 197 | %\AtTextLowerLeft{% 198 | % \color[gray]{.15}\framebox(\LenToUnit{\textwidth},\LenToUnit{\textheight}){} 199 | %} 200 | \cvprruleroffset=\textheight 201 | \advance\cvprruleroffset by -3.7pt 202 | \color[rgb]{.5,.5,1} 203 | \AtTextUpperLeft{% 204 | \put(\LenToUnit{-35pt},\LenToUnit{-\cvprruleroffset}){%left ruler 205 | \cvprruler{\cvprrulercount}} 206 | \put(\LenToUnit{\textwidth\kern 30pt},\LenToUnit{-\cvprruleroffset}){%right ruler 207 | \cvprruler{\cvprrulercount}} 208 | } 209 | \def\pid{\parbox{1in}{\begin{center}\bf\sf{\small CVPR}\\\#\cvprPaperID\end{center}}} 210 | \AtTextUpperLeft{%paperID in corners 211 | \put(\LenToUnit{-65pt},\LenToUnit{45pt}){\pid} 212 | \put(\LenToUnit{\textwidth\kern-8pt},\LenToUnit{45pt}){\pid} 213 | } 214 | \AtTextUpperLeft{%confidential 215 | \put(0,\LenToUnit{1cm}){\parbox{\textwidth}{\centering\cvprtenhv 216 | CVPR 2014 Submission \#\cvprPaperID. CONFIDENTIAL REVIEW COPY. DO NOT DISTRIBUTE.}} 217 | } 218 | \fi 219 | } 220 | 221 | %%% Make figure placement a little more predictable. 222 | % We trust the user to move figures if this results 223 | % in ugliness. 224 | % Minimize bad page breaks at figures 225 | \renewcommand{\textfraction}{0.01} 226 | \renewcommand{\floatpagefraction}{0.99} 227 | \renewcommand{\topfraction}{0.99} 228 | \renewcommand{\bottomfraction}{0.99} 229 | \renewcommand{\dblfloatpagefraction}{0.99} 230 | \renewcommand{\dbltopfraction}{0.99} 231 | \setcounter{totalnumber}{99} 232 | \setcounter{topnumber}{99} 233 | \setcounter{bottomnumber}{99} 234 | 235 | % Add a period to the end of an abbreviation unless there's one 236 | % already, then \xspace. 237 | \makeatletter 238 | \DeclareRobustCommand\onedot{\futurelet\@let@token\@onedot} 239 | \def\@onedot{\ifx\@let@token.\else.\null\fi\xspace} 240 | 241 | \def\eg{\emph{e.g}\onedot} \def\Eg{\emph{E.g}\onedot} 242 | \def\ie{\emph{i.e}\onedot} \def\Ie{\emph{I.e}\onedot} 243 | \def\cf{\emph{c.f}\onedot} \def\Cf{\emph{C.f}\onedot} 244 | \def\etc{\emph{etc}\onedot} \def\vs{\emph{vs}\onedot} 245 | \def\wrt{w.r.t\onedot} \def\dof{d.o.f\onedot} 246 | \def\etal{\emph{et al}\onedot} 247 | \makeatother 248 | 249 | % --------------------------------------------------------------- 250 | -------------------------------------------------------------------------------- /paper/cvpr2014AuthorKit_latex/cvpr_eso.sty: -------------------------------------------------------------------------------- 1 | %% 2 | %% This is file `everyshi.sty', 3 | %% generated with the docstrip utility. 4 | %% 5 | %% The original source files were: 6 | %% 7 | %% everyshi.dtx (with options: `package') 8 | %% 9 | %% Copyright (C) [1994..1999] by Martin Schroeder. All rights reserved. 10 | %% 11 | %% This file is part of the EveryShi package 12 | %% 13 | %% This program may be redistributed and/or modified under the terms 14 | %% of the LaTeX Project Public License, either version 1.0 of this 15 | %% license, or (at your option) any later version. 16 | %% The latest version of this license is in 17 | %% CTAN:macros/latex/base/lppl.txt. 18 | %% 19 | %% Happy users are requested to send me a postcard. :-) 20 | %% 21 | %% The EveryShi package contains these files: 22 | %% 23 | %% everyshi.asc 24 | %% everyshi.dtx 25 | %% everyshi.dvi 26 | %% everyshi.ins 27 | %% everyshi.bug 28 | %% 29 | %% Error Reports in case of UNCHANGED versions to 30 | %% 31 | %% Martin Schr"oder 32 | %% Cr"usemannallee 3 33 | %% D-28213 Bremen 34 | %% Martin.Schroeder@ACM.org 35 | %% 36 | %% File: everyshi.dtx Copyright (C) 2001 Martin Schr\"oder 37 | \NeedsTeXFormat{LaTeX2e} 38 | \ProvidesPackage{everyshi} 39 | [2001/05/15 v3.00 EveryShipout Package (MS)] 40 | %% \CharacterTable 41 | %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z 42 | %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z 43 | %% Digits \0\1\2\3\4\5\6\7\8\9 44 | %% Exclamation \! Double quote \" Hash (number) \# 45 | %% Dollar \$ Percent \% Ampersand \& 46 | %% Acute accent \' Left paren \( Right paren \) 47 | %% Asterisk \* Plus \+ Comma \, 48 | %% Minus \- Point \. Solidus \/ 49 | %% Colon \: Semicolon \; Less than \< 50 | %% Equals \= Greater than \> Question mark \? 51 | %% Commercial at \@ Left bracket \[ Backslash \\ 52 | %% Right bracket \] Circumflex \^ Underscore \_ 53 | %% Grave accent \` Left brace \{ Vertical bar \| 54 | %% Right brace \} Tilde \~} 55 | %% 56 | %% \iffalse meta-comment 57 | %% =================================================================== 58 | %% @LaTeX-package-file{ 59 | %% author = {Martin Schr\"oder}, 60 | %% version = "3.00", 61 | %% date = "15 May 2001", 62 | %% filename = "everyshi.sty", 63 | %% address = {Martin Schr\"oder 64 | %% Cr\"usemannallee 3 65 | %% 28213 Bremen 66 | %% Germany}, 67 | %% telephone = "+49-421-2239425", 68 | %% email = "martin@oneiros.de", 69 | %% pgp-Key = "2048 bit / KeyID 292814E5", 70 | %% pgp-fingerprint = "7E86 6EC8 97FA 2995 82C3 FEA5 2719 090E", 71 | %% docstring = "LaTeX package which provides hooks into 72 | %% \cs{shipout}. 73 | %% } 74 | %% =================================================================== 75 | %% \fi 76 | 77 | \newcommand{\@EveryShipout@Hook}{} 78 | \newcommand{\@EveryShipout@AtNextHook}{} 79 | \newcommand*{\EveryShipout}[1] 80 | {\g@addto@macro\@EveryShipout@Hook{#1}} 81 | \newcommand*{\AtNextShipout}[1] 82 | {\g@addto@macro\@EveryShipout@AtNextHook{#1}} 83 | \newcommand{\@EveryShipout@Shipout}{% 84 | \afterassignment\@EveryShipout@Test 85 | \global\setbox\@cclv= % 86 | } 87 | \newcommand{\@EveryShipout@Test}{% 88 | \ifvoid\@cclv\relax 89 | \aftergroup\@EveryShipout@Output 90 | \else 91 | \@EveryShipout@Output 92 | \fi% 93 | } 94 | \newcommand{\@EveryShipout@Output}{% 95 | \@EveryShipout@Hook% 96 | \@EveryShipout@AtNextHook% 97 | \gdef\@EveryShipout@AtNextHook{}% 98 | \@EveryShipout@Org@Shipout\box\@cclv% 99 | } 100 | \newcommand{\@EveryShipout@Org@Shipout}{} 101 | \newcommand*{\@EveryShipout@Init}{% 102 | \message{ABD: EveryShipout initializing macros}% 103 | \let\@EveryShipout@Org@Shipout\shipout 104 | \let\shipout\@EveryShipout@Shipout 105 | } 106 | \AtBeginDocument{\@EveryShipout@Init} 107 | \endinput 108 | %% 109 | %% End of file `everyshi.sty'. 110 | -------------------------------------------------------------------------------- /paper/cvpr2014AuthorKit_latex/egbib.bib: -------------------------------------------------------------------------------- 1 | 2 | @misc{Authors14, 3 | author = {Authors}, 4 | title = {The frobnicatable foo filter}, 5 | note = {Face and Gesture submission ID 324. Supplied as additional material {\tt fg324.pdf}}, 6 | year = 2014 7 | } 8 | 9 | @misc{Authors14b, 10 | author = {Authors}, 11 | title = {Frobnication tutorial}, 12 | note = {Supplied as additional material {\tt tr.pdf}}, 13 | year = 2014 14 | } 15 | 16 | @article{Alpher02, 17 | author = {A. Alpher}, 18 | title = {Frobnication}, 19 | journal = {Journal of Foo}, 20 | volume = 12, 21 | number = 1, 22 | pages = {234--778}, 23 | year = 2002 24 | } 25 | 26 | @article{Alpher03, 27 | author = {A. Alpher and J.~P.~N. Fotheringham-Smythe}, 28 | title = {Frobnication revisited}, 29 | journal = {Journal of Foo}, 30 | volume = 13, 31 | number = 1, 32 | pages = {234--778}, 33 | year = 2003 34 | } 35 | 36 | @article{Alpher04, 37 | author = {A. Alpher and J.~P.~N. Fotheringham-Smythe and G. Gamow}, 38 | title = {Can a machine frobnicate?}, 39 | journal = {Journal of Foo}, 40 | volume = 14, 41 | number = 1, 42 | pages = {234--778}, 43 | year = 2004 44 | } 45 | -------------------------------------------------------------------------------- /paper/cvpr2014AuthorKit_latex/egpaper_final.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/cvpr2014AuthorKit_latex/egpaper_final.pdf -------------------------------------------------------------------------------- /paper/cvpr2014AuthorKit_latex/egpaper_for_review.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/cvpr2014AuthorKit_latex/egpaper_for_review.pdf -------------------------------------------------------------------------------- /paper/figures/CD-descriptor.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/CD-descriptor.pdf -------------------------------------------------------------------------------- /paper/figures/CD-descriptor2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/CD-descriptor2.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/hmdb/class.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/hmdb/class.png -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/hmdb/class1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/hmdb/class1.png -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/hmdb/class2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/hmdb/class2.png -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/hmdb/class3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/hmdb/class3.png -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/hmdb/class4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/hmdb/class4.png -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/hmdb/class5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/hmdb/class5.png -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/hmdb/class6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/hmdb/class6.png -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/hwd/Thumbs.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/hwd/Thumbs.db -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/hwd/class1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/hwd/class1.jpg -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/hwd/class2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/hwd/class2.jpg -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/hwd/class3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/hwd/class3.jpg -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/hwd/class4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/hwd/class4.jpg -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/hwd/class5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/hwd/class5.jpg -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/hwd/class6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/hwd/class6.jpg -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/ucf/class1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/ucf/class1.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/ucf/class2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/ucf/class2.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/ucf/class3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/ucf/class3.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/ucf/class4.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/ucf/class4.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/ucf/class5.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/ucf/class5.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/ucf/class6.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/ucf/class6.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/ucf/crop_class1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/ucf/crop_class1.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/ucf/crop_class2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/ucf/crop_class2.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/ucf/crop_class3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/ucf/crop_class3.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/ucf/crop_class4.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/ucf/crop_class4.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/ucf/crop_class5.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/ucf/crop_class5.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/ucf/crop_class6.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/ucf/crop_class6.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/uti/class1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/uti/class1.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/uti/class2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/uti/class2.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/uti/class3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/uti/class3.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/uti/class4.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/uti/class4.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/uti/class5.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/uti/class5.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/uti/class6.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/uti/class6.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/uti/crop_class1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/uti/crop_class1.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/uti/crop_class2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/uti/crop_class2.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/uti/crop_class3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/uti/crop_class3.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/uti/crop_class4.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/uti/crop_class4.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/uti/crop_class5.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/uti/crop_class5.pdf -------------------------------------------------------------------------------- /paper/figures/dataset_thumb/uti/crop_class6.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/dataset_thumb/uti/crop_class6.pdf -------------------------------------------------------------------------------- /paper/figures/flow/Thumbs.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/Thumbs.db -------------------------------------------------------------------------------- /paper/figures/flow/actioncliptrain00009_0010.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/actioncliptrain00009_0010.jpg -------------------------------------------------------------------------------- /paper/figures/flow/actioncliptrain00009_0010bright.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/actioncliptrain00009_0010bright.jpg -------------------------------------------------------------------------------- /paper/figures/flow/actioncliptrain00534_0010.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/actioncliptrain00534_0010.jpg -------------------------------------------------------------------------------- /paper/figures/flow/actioncliptrain00534_0010bright.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/actioncliptrain00534_0010bright.jpg -------------------------------------------------------------------------------- /paper/figures/flow/bandage_1_frame_0010.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/bandage_1_frame_0010.jpg -------------------------------------------------------------------------------- /paper/figures/flow/bandage_1_frame_0010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/bandage_1_frame_0010.png -------------------------------------------------------------------------------- /paper/figures/flow/bandage_1_frame_0020.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/bandage_1_frame_0020.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptest00538_frame014.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptest00538_frame014.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptest00538_frame014_mv_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptest00538_frame014_mv_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptest00538_frame014_stip_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptest00538_frame014_stip_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptest00538_frame014_traj_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptest00538_frame014_traj_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptest00686_frame010.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptest00686_frame010.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptest00686_frame010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptest00686_frame010.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptest00686_frame010_mv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptest00686_frame010_mv.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptest00686_frame010_mv_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptest00686_frame010_mv_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptest00686_frame010_stip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptest00686_frame010_stip.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptest00686_frame010_stip_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptest00686_frame010_stip_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptest00686_frame010_traj.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptest00686_frame010_traj.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptest00686_frame010_traj_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptest00686_frame010_traj_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptest00870_frame013.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptest00870_frame013.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptest00870_frame013_mv_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptest00870_frame013_mv_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptest00870_frame013_stip_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptest00870_frame013_stip_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptest00870_frame013_traj_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptest00870_frame013_traj_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptest00870_frame014_mv_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptest00870_frame014_mv_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptest00870_frame014_stip_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptest00870_frame014_stip_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptest00870_frame014_traj_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptest00870_frame014_traj_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptrain00009_frame010_mpeg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptrain00009_frame010_mpeg.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptrain00009_frame010_mpeg_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptrain00009_frame010_mpeg_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptrain00009_frame010_stip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptrain00009_frame010_stip.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptrain00009_frame010_stip_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptrain00009_frame010_stip_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptrain00009_frame010_traj.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptrain00009_frame010_traj.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptrain00009_frame010_traj_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptrain00009_frame010_traj_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptrain00534_frame010_mpeg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptrain00534_frame010_mpeg.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptrain00534_frame010_mpeg_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptrain00534_frame010_mpeg_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptrain00534_frame010_stip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptrain00534_frame010_stip.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptrain00534_frame010_stip_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptrain00534_frame010_stip_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptrain00534_frame010_traj.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptrain00534_frame010_traj.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_actioncliptrain00534_frame010_traj_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_actioncliptrain00534_frame010_traj_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame003_mpeg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame003_mpeg.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame003_mpeg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame003_mpeg.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame003_mpeg_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame003_mpeg_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame003_mpeg_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame003_mpeg_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame003_orig.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame003_orig.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame003_orig_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame003_orig_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame003_stip.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame003_stip.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame003_stip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame003_stip.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame003_stip_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame003_stip_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame003_stip_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame003_stip_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame003_traj.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame003_traj.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame003_traj_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame003_traj_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame004_mpeg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame004_mpeg.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame004_mpeg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame004_mpeg.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame004_mpeg_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame004_mpeg_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame004_mpeg_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame004_mpeg_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame004_orig.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame004_orig.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame004_orig_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame004_orig_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame004_stip.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame004_stip.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame004_stip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame004_stip.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame004_stip_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame004_stip_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame004_stip_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame004_stip_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame004_traj.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame004_traj.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame004_traj_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame004_traj_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame005_mpeg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame005_mpeg.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame005_mpeg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame005_mpeg.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame005_mpeg_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame005_mpeg_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame005_mpeg_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame005_mpeg_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame005_orig.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame005_orig.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame005_orig_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame005_orig_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame005_stip.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame005_stip.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame005_stip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame005_stip.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame005_stip_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame005_stip_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame005_stip_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame005_stip_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame005_traj.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame005_traj.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame005_traj_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame005_traj_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame006_mpeg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame006_mpeg.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame006_mpeg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame006_mpeg.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame006_mpeg_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame006_mpeg_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame006_mpeg_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame006_mpeg_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame006_orig.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame006_orig.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame006_orig_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame006_orig_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame006_stip.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame006_stip.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame006_stip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame006_stip.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame006_stip_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame006_stip_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame006_stip_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame006_stip_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame006_traj.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame006_traj.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame006_traj_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame006_traj_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame007_mpeg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame007_mpeg.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame007_mpeg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame007_mpeg.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame007_mpeg_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame007_mpeg_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame007_mpeg_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame007_mpeg_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame007_orig.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame007_orig.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame007_orig_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame007_orig_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame007_stip.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame007_stip.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame007_stip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame007_stip.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame007_stip_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame007_stip_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame007_stip_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame007_stip_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame007_traj.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame007_traj.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame007_traj_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame007_traj_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame008_mpeg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame008_mpeg.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame008_mpeg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame008_mpeg.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame008_mpeg_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame008_mpeg_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame008_mpeg_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame008_mpeg_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame008_orig.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame008_orig.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame008_orig_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame008_orig_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame008_stip.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame008_stip.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame008_stip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame008_stip.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame008_stip_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame008_stip_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame008_stip_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame008_stip_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame008_traj.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame008_traj.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame008_traj_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame008_traj_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame009_mpeg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame009_mpeg.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame009_mpeg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame009_mpeg.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame009_mpeg_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame009_mpeg_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame009_mpeg_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame009_mpeg_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame009_orig.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame009_orig.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame009_orig_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame009_orig_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame009_stip.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame009_stip.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame009_stip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame009_stip.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame009_stip_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame009_stip_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame009_stip_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame009_stip_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame009_traj.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame009_traj.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame009_traj_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame009_traj_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame010_mpeg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame010_mpeg.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame010_mpeg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame010_mpeg.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame010_mpeg_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame010_mpeg_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame010_mpeg_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame010_mpeg_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame010_orig.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame010_orig.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame010_orig_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame010_orig_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame010_stip.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame010_stip.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame010_stip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame010_stip.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame010_stip_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame010_stip_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame010_stip_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame010_stip_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame010_traj.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame010_traj.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame010_traj_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame010_traj_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame011_mpeg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame011_mpeg.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame011_mpeg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame011_mpeg.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame011_mpeg_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame011_mpeg_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame011_mpeg_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame011_mpeg_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame011_orig.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame011_orig.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame011_orig_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame011_orig_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame011_stip.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame011_stip.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame011_stip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame011_stip.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame011_stip_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame011_stip_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame011_stip_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame011_stip_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame011_traj.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame011_traj.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame011_traj_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame011_traj_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame012_mpeg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame012_mpeg.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame012_mpeg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame012_mpeg.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame012_mpeg_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame012_mpeg_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame012_mpeg_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame012_mpeg_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame012_orig.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame012_orig.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame012_orig_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame012_orig_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame012_stip.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame012_stip.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame012_stip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame012_stip.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame012_stip_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame012_stip_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame012_stip_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame012_stip_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame012_traj.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame012_traj.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame012_traj_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame012_traj_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame013_mpeg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame013_mpeg.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame013_mpeg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame013_mpeg.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame013_mpeg_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame013_mpeg_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame013_mpeg_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame013_mpeg_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame013_orig.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame013_orig.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame013_orig_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame013_orig_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame013_stip.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame013_stip.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame013_stip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame013_stip.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame013_stip_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame013_stip_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame013_stip_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame013_stip_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame013_traj.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame013_traj.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame013_traj_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame013_traj_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame014_mpeg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame014_mpeg.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame014_mpeg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame014_mpeg.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame014_mpeg_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame014_mpeg_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame014_mpeg_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame014_mpeg_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame014_orig.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame014_orig.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame014_orig_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame014_orig_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame014_stip.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame014_stip.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame014_stip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame014_stip.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame014_stip_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame014_stip_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame014_stip_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame014_stip_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame014_traj.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame014_traj.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame014_traj_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame014_traj_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame015_mpeg.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame015_mpeg.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame015_mpeg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame015_mpeg.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame015_mpeg_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame015_mpeg_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame015_mpeg_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame015_mpeg_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame015_orig.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame015_orig.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame015_orig_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame015_orig_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame015_stip.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame015_stip.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame015_stip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame015_stip.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame015_stip_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame015_stip_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame015_stip_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame015_stip_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame015_traj.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame015_traj.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame015_traj_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame015_traj_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame020_mpeg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame020_mpeg.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame020_mpeg_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame020_mpeg_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame020_orig.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame020_orig.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame020_orig_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame020_orig_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame020_stip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame020_stip.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame020_stip_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame020_stip_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame020_traj.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame020_traj.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame020_traj_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame020_traj_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame021_mpeg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame021_mpeg.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame021_mpeg_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame021_mpeg_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame021_orig.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame021_orig.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame021_orig_quant.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame021_orig_quant.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame021_stip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame021_stip.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame021_stip_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame021_stip_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame021_traj.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame021_traj.jpeg -------------------------------------------------------------------------------- /paper/figures/flow/flow_bandage_1_frame021_traj_quant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flow_bandage_1_frame021_traj_quant.png -------------------------------------------------------------------------------- /paper/figures/flow/flowcolorcode.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flowcolorcode.jpg -------------------------------------------------------------------------------- /paper/figures/flow/flowcolorcode_reoriented.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/flow/flowcolorcode_reoriented.jpg -------------------------------------------------------------------------------- /paper/figures/fv/fv_graph.m: -------------------------------------------------------------------------------- 1 | % 2 | % bar plot with per-class AP results for HWD2 3 | % 4 | 5 | 6 | if 1 % FLANN 7 | 8 | % Quantization for actioncliptest00775 1347 frames, 53.8 sec. (380014 features) 9 | % 10 | % kd(4) + checks(32) 25.71 secs -> 52.3921 fps (mAP 0.564032) 11 | % kd(4) + checks(16) 15.80 sec. -> 85.2532 (mAP 0.557820) 12 | % kd(4) + checks(8) 10.82 secs -> 124.4917 (mAP 0.552988) 13 | % kd(4) + checks(4) 7.57 secs -> 177.9392 (mAP 0.542571) 14 | % kd(2) + checks(16) 16.56 secs -> 81.3406 (mAP 0.556588) 15 | % kd(2) + checks(8) 11.13 secs -> 121.0243 (mAP 0.549832) 16 | % kd(2) + checks(4) 6.36 secs -> 211.7925 (mAP 0.538391) 17 | % 18 | %% 19 | % 20 | % NN time estimation: 21 | %a=single(rand(4000,100)); 22 | %b=single(rand(38000,100)); 23 | %tic, d=eucliddist(b,a); [mv,mi]=min(d,[],2); toc 24 | %Elapsed time is 3.114615 seconds. 25 | % 26 | % 3.114615 * 4 * 10 = 124.5846 secs -> 10.8119 fps (mAP 0.562) 27 | 28 | nn=[10.8119 0.562]; 29 | fv = [1347 / 243.59, 0.575457]; 30 | 31 | %kd8checks={'ch(32)','ch(16)','ch(8)','ch(4)'}; 32 | kd8=[34.6272 0.563959 33 | 57.1732 0.560811 34 | 102.2003 0.553482 35 | 116.9271 0.526568]; 36 | 37 | %kd4checks={'ch(32)','ch(16)','ch(8)','ch(4)'}; 38 | kd4=[52.3921 0.564032 39 | 85.2532 0.557820 40 | 124.4917 0.552988 41 | 177.9392 0.542571]; 42 | 43 | %kd2checks={'ch(32)','ch(16)','ch(8)','ch(4)'}; 44 | kd2=[60.7578 0.552528 45 | 81.3406 0.556588 46 | 121.0243 0.549832 47 | 211.7925 0.538391]; 48 | 49 | %fv5checks = {'ch(32)','ch(16)','ch(8)','ch(4)'}; 50 | fv5 = [40.892532 0.582075 51 | 56.407035 0.571156 52 | 69.325785 0.566866 53 | 72.419355 0.558892]; 54 | %fv1checks = {'ch(32)','ch(16)','ch(8)','ch(4)'}; 55 | fv1 = [ 60.053500 0.567833 56 | 94.129979 0.563006 57 | 131.286550 0.561079 58 | 167.537313 0.553502]; 59 | 60 | %5_4_32 22.870000 10.070000 32.940000 40.892532 mAP 0.582075 (c =1e-3) 61 | %5_4_16 13.890000 9.990000 23.880000 56.407035 mAP 0.571156 (c=1) 62 | %5_4_8 9.000000 10.430000 19.430000 69.325785 mAP 0.566866 (c=1) 63 | %5_4_4 6.720000 11.880000 18.600000 72.419355 mAP 0.558892 (c=1) 64 | 65 | %1_4_32 19.780000 2.650000 22.430000 60.053500 mAP 0.567833 (c=1) 66 | %1_4_16 11.580000 2.730000 14.310000 94.129979 mAP 0.563006 (c=0.1-1) 67 | %1_4_8 7.540000 2.720000 10.260000 131.286550 mAP 0.561079 (c=1) 68 | %1_4_4 5.300000 2.740000 8.040000 167.537313 mAP 0.553502 (c=1) 69 | 70 | clf 71 | plot(nn(1),nn(2),'kx','LineWidth',5,'MarkerSize',25); hold on, 72 | plot(fv(1),fv(2),'gx','LineWidth',5,'MarkerSize',25); hold on, 73 | %plot(kd8(:,1),kd8(:,2),'mx-','LineWidth',7,'MarkerSize',25); hold on, 74 | 75 | plot(kd4(:,1),kd4(:,2),'rx-','LineWidth',5,'MarkerSize',25); hold on, 76 | plot(kd2(:,1),kd2(:,2),'bx-','LineWidth',5,'MarkerSize',25); hold on, 77 | plot(fv5(:,1),fv5(:,2),'mx-','LineWidth',5,'MarkerSize',25); hold on, 78 | plot(fv1(:,1),fv1(:,2),'cx-','LineWidth',5,'MarkerSize',25); hold on, 79 | 80 | %leg={'NN','FLANN kd(8)','FLANN kd(4)','FLANN kd(2)', 'FV knn(5)', 'FV knn(1)'}; 81 | leg={'NN', 'FV noopt', 'FLANN kd(4)','FLANN kd(2)', 'FV kd(4)', 'VLAD kd(1)'}; 82 | grid on, set(gca,'FontSize',18), xlabel('FPS'), ylabel('mAP'); 83 | legend(leg) 84 | 85 | %for i=1:length(kd4checks) 86 | % text(kd4(i,1),kd4(i,2)+.003,kd4checks{i},'FontSize',18); 87 | %end 88 | 89 | %for i=1:length(kd2checks) 90 | % text(kd2(i,1)-20,kd2(i,2)-.003,kd2checks{i},'FontSize',18); 91 | %end 92 | 93 | %for i=1:length(fv5checks) 94 | % text(kd2(i,1)-20,fv5(i,2)-.003,kd2checks{i},'FontSize',18); 95 | %end 96 | 97 | figure(gcf) 98 | 99 | set(gca,'Position',[0.2 .25 .7 .65]) 100 | print('-dpdf',['../hollywood2-flann-fps-map.pdf']) 101 | 102 | end 103 | 104 | if 0 % per-class accuracy on Hollywood2 105 | 106 | % CD features HOF+MBHx+MBHy+HOG 107 | cdall=[0.25999 0.893469 0.603643 0.728326 0.490113 0.389536 0.327611 0.659212 0.730111 0.669413 0.293175 0.698907]; 108 | 109 | % TD features HOF+MBHx+MBHy+HOG 110 | dtall=[0.360152 0.890615 0.568082 0.769611 0.58314 0.345157 0.565624 0.667069 0.810321 0.693584 0.241237 0.702005]; 111 | 112 | clf, 113 | bar([cdall mean(cdall); dtall mean(dtall)]') 114 | colormap(autumn) 115 | set(gca,'FontSize',14) 116 | set(gca,'XTickLabel',{}) 117 | set(gca,'Position',[0.13 .25 .775 .45]) 118 | ylabel('Average Precision') 119 | grid on 120 | 121 | cl={'AnswerPhone','DriveCar','Eat','FightPerson','GetOutCar','HandShake','HugPerson','Kiss','Run','SitDown','SitUp','StandUp','All'}; 122 | 123 | for i=1:length(cl) 124 | ht=text(i,-.04,cl{i}); 125 | set(ht,'FontSize',14,'Rotation',45,'HorizontalAlignment','right'); 126 | end 127 | 128 | leg={'CD - HOF+MBHx+MBHy+HOG', 'DT - HOF+MBHx+MBHy+HOG'}; 129 | legend(leg) 130 | 131 | %print('-dpdf',[respath '/' 'hollywood2-per-class-barplot.pdf']) 132 | end 133 | -------------------------------------------------------------------------------- /paper/figures/hollywood2-flann-fps-map-crop-mod.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/hollywood2-flann-fps-map-crop-mod.pdf -------------------------------------------------------------------------------- /paper/figures/hollywood2-flann-fps-map-crop.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/hollywood2-flann-fps-map-crop.pdf -------------------------------------------------------------------------------- /paper/figures/hollywood2-flann-fps-map-kd8.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/hollywood2-flann-fps-map-kd8.pdf -------------------------------------------------------------------------------- /paper/figures/hollywood2-flann-fps-map.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/hollywood2-flann-fps-map.pdf -------------------------------------------------------------------------------- /paper/figures/hollywood2-per-class-barplot-crop.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/hollywood2-per-class-barplot-crop.pdf -------------------------------------------------------------------------------- /paper/figures/hollywood2-per-class-barplot.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/paper/figures/hollywood2-per-class-barplot.pdf -------------------------------------------------------------------------------- /paper/figures/pdfcrop.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/python 2 | 3 | # Script that remove margins from pdf files 4 | # 5 | # Originally found on http://www.mobileread.com/forums/showthread.php?t=25565 6 | 7 | import getopt, sys 8 | from pyPdf import PdfFileWriter, PdfFileReader 9 | 10 | def usage (): 11 | print """sjvr767\'s PDF Cropping Script. 12 | Example: 13 | my_pdf_crop.py -s -p 0.5 -i input.pdf -o output.pdf 14 | my_pdf_crop.py --skip --percent 0.5 -input input.pdf -output output.pdf 15 | \n 16 | REQUIRED OPTIONS: 17 | -p\t--percent 18 | The factor by which to crop. Must be positive and less than or equal to 1. 19 | 20 | -i\t--input 21 | The path to the file to be cropped. 22 | \n 23 | OPTIONAL: 24 | -s\t--skip 25 | Skip the first page. Ouptut file will not contain the first page of the input file. 26 | 27 | -o\t--output 28 | Specify the name and path of the output file. If none specified, the script appends \'cropped\' to the file name. 29 | 30 | -m\t--margin 31 | Specify additional absolute cropping, for fine tuning results. 32 | \t-m "left top right bottom" 33 | """ 34 | sys.exit(0) 35 | 36 | def cut_length(dictionary, key, factor): 37 | cut_factor = 1-factor 38 | cut = float(dictionary[key])*cut_factor 39 | cut = cut / 4 40 | return cut 41 | 42 | def new_coords(dictionary, key, cut, margin, code = "tl"): 43 | if code == "tl": 44 | if key == "x": 45 | return abs(float(dictionary[key])+(cut+margin["l"])) 46 | else: 47 | return abs(float(dictionary[key])-(cut+margin["t"])) 48 | elif code == "tr": 49 | if key == "x": 50 | return abs(float(dictionary[key])-(cut+margin["r"])) 51 | else: 52 | return abs(float(dictionary[key])-(cut+margin["t"])) 53 | elif code == "bl": 54 | if key == "x": 55 | return abs(float(dictionary[key])+(cut+margin["l"])) 56 | else: 57 | return abs(float(dictionary[key])+(cut+margin["b"])) 58 | else: 59 | if key == "x": 60 | return abs(float(dictionary[key])-(cut+margin["r"])) 61 | else: 62 | return abs(float(dictionary[key])+(cut+margin["b"])) 63 | 64 | try: 65 | opts, args = getopt.getopt(sys.argv[1:], "sp:i:o:m:", ["skip", "percent=", "input=", "output=", "margin="]) 66 | except getopt.GetoptError, err: 67 | # print help information and exit: 68 | print str(err) # will print something like "option -a not recognized" 69 | usage() 70 | sys.exit(2) 71 | 72 | skipone = 0 73 | 74 | for a in opts[:]: 75 | if a[0] == '-s' or a[0]=='--skip': 76 | skipone = 1 77 | 78 | factor = 0.8 #default scaling factor 79 | 80 | for a in opts[:]: 81 | if a[0] == '-p' or a[0]=='--factor': 82 | if a[1] != None: 83 | try: 84 | factor = float(a[1]) 85 | except TypeError: 86 | print "Factor must be a number." 87 | sys.exit(2) #exit if no appropriate input file 88 | 89 | input_file = None #no defualt input file 90 | 91 | for a in opts[:]: 92 | if a[0] == '-i' or a[0]=='--input': 93 | if a[1] != None: 94 | try: 95 | if a[1][-4:]=='.pdf': 96 | input_file = a[1] 97 | else: 98 | print "Input file must be a PDF." 99 | sys.exit(2) #exit if no appropriate input file 100 | except TypeError: 101 | print "Input file must be a PDF." 102 | sys.exit(2) #exit if no appropriate input file 103 | except IndexError: 104 | print "Input file must be a PDF." 105 | sys.exit(2) #exit if no appropriate input file 106 | else: 107 | print "Please speicfy an input file." 108 | sys.exit(2) #exit if no appropriate input file 109 | 110 | output_file = "%s_cropped.pdf" %input_file[:-4] #default output 111 | 112 | for a in opts[:]: 113 | if a[0] == '-o' or a[0]=='--output': 114 | if a[1]!= None: 115 | try: 116 | if a[1][-4:]=='.pdf': 117 | output_file = a[1] 118 | else: 119 | print "Output file must be a PDF." 120 | except TypeError: 121 | print "Output file must be a PDF." 122 | except IndexError: 123 | print "Output file must be a PDF." 124 | 125 | margin = {"l": 0, "t": 0, "r": 0, "b": 0} 126 | 127 | for a in opts[:]: 128 | if a[0] == '-m' or a[0]=='--margin': 129 | if a[1]!= None: 130 | m_temp = a[1].strip("\"").split() 131 | margin["l"] = float(m_temp[0]) 132 | margin["t"] = float(m_temp[1]) 133 | margin["r"] = float(m_temp[2]) 134 | margin["b"] = float(m_temp[3]) 135 | else: 136 | print "Error" 137 | 138 | input1 = PdfFileReader(file(input_file, "rb")) 139 | 140 | output = PdfFileWriter() 141 | outputstream = file(output_file, "wb") 142 | 143 | pages = input1.getNumPages() 144 | 145 | top_right = {'x': input1.getPage(1).mediaBox.getUpperRight_x(), 'y': input1.getPage(1).mediaBox.getUpperRight_y()} 146 | top_left = {'x': input1.getPage(1).mediaBox.getUpperLeft_x(), 'y': input1.getPage(1).mediaBox.getUpperLeft_y()} 147 | bottom_right = {'x': input1.getPage(1).mediaBox.getLowerRight_x(), 'y': input1.getPage(1).mediaBox.getLowerRight_y()} 148 | bottom_left = {'x': input1.getPage(1).mediaBox.getLowerLeft_x(), 'y': input1.getPage(1).mediaBox.getLowerLeft_y()} 149 | 150 | print('Page dim.\t%f by %f' %(top_right['x'], top_right['y'])) 151 | 152 | cut = cut_length(top_right, 'x', factor) 153 | 154 | new_tr = (new_coords(top_right, 'x', cut, margin, code = "tr"), new_coords(top_right, 'y', cut, margin, code = "tr")) 155 | new_br = (new_coords(bottom_right, 'x', cut, margin, code = "br"), new_coords(bottom_right, 'y', cut, margin, code = "br" )) 156 | new_tl = (new_coords(top_left, 'x', cut, margin, code = "tl"), new_coords(top_left, 'y', cut, margin, code = "tl")) 157 | new_bl = (new_coords(bottom_left, 'x', cut, margin, code = "bl"), new_coords(bottom_left, 'y', cut, margin, code = "bl")) 158 | 159 | if skipone == 0: 160 | for i in range(0, pages): 161 | page = input1.getPage(i) 162 | page.mediaBox.upperLeft = new_tl 163 | page.mediaBox.upperRight = new_tr 164 | page.mediaBox.lowerLeft = new_bl 165 | page.mediaBox.lowerRight = new_br 166 | output.addPage(page) 167 | else: 168 | for i in range(1, pages): 169 | page = input1.getPage(i) 170 | page.mediaBox.upperLeft = new_tl 171 | page.mediaBox.upperRight = new_tr 172 | page.mediaBox.lowerLeft = new_bl 173 | page.mediaBox.lowerRight = new_br 174 | output.addPage(page) 175 | 176 | output.write(outputstream) 177 | outputstream.close() 178 | -------------------------------------------------------------------------------- /poster/cvpr2014_kantorov_poster.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/poster/cvpr2014_kantorov_poster.pptx -------------------------------------------------------------------------------- /poster/figures/fisher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/poster/figures/fisher.png -------------------------------------------------------------------------------- /poster/figures/fisher.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 14 | 16 | 18 | 19 | 21 | image/svg+xml 22 | 24 | 25 | 26 | 27 | 28 | 31 | 35 | 39 | 43 | 48 | 53 | 58 | 62 | 66 | 70 | 74 | 78 | 82 | 87 | 92 | 97 | 102 | 107 | 112 | 117 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /poster/figures/fisher_formula.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/poster/figures/fisher_formula.png -------------------------------------------------------------------------------- /poster/figures/heng_pie2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/poster/figures/heng_pie2.png -------------------------------------------------------------------------------- /poster/figures/heng_pie3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/poster/figures/heng_pie3.png -------------------------------------------------------------------------------- /poster/figures/heng_pie3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 26 | 31 | 36 | 42 | 45 | 50 | 51 | 52 | 58 | 61 | 66 | 67 | 68 | 74 | 77 | 82 | 83 | 84 | 85 | 107 | 109 | 110 | 112 | image/svg+xml 113 | 115 | 116 | 117 | 118 | 119 | 124 | 129 | 134 | 139 | 144 | 1% 150 | 151 | 152 | -------------------------------------------------------------------------------- /poster/figures/hmdb51-table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/poster/figures/hmdb51-table.png -------------------------------------------------------------------------------- /poster/figures/hollywood2-flann-fps-map-crop-mod.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/poster/figures/hollywood2-flann-fps-map-crop-mod.pdf -------------------------------------------------------------------------------- /poster/figures/hollywood2-flann-fps-map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/poster/figures/hollywood2-flann-fps-map.png -------------------------------------------------------------------------------- /poster/figures/hwd2-table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/poster/figures/hwd2-table.png -------------------------------------------------------------------------------- /poster/figures/ucf50-table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/poster/figures/ucf50-table.png -------------------------------------------------------------------------------- /poster/images/bandage_1_frame_0020.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/poster/images/bandage_1_frame_0020.jpeg -------------------------------------------------------------------------------- /poster/images/ens.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/poster/images/ens.jpg -------------------------------------------------------------------------------- /poster/images/logo_INRIA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/poster/images/logo_INRIA.png -------------------------------------------------------------------------------- /poster/images/mv_bandage_1_frame_0020.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/poster/images/mv_bandage_1_frame_0020.png -------------------------------------------------------------------------------- /poster/images/willow2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/poster/images/willow2.jpg -------------------------------------------------------------------------------- /repro/dot_kernel.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | 3 | import os 4 | import sys 5 | import itertools 6 | import numpy as np 7 | import numpy.linalg as linalg 8 | 9 | IN = [os.path.join(sys.argv[1], x[:-1] + '.txt') for x in open(sys.argv[2])] 10 | 11 | skipComments = lambda path: itertools.ifilter(lambda x: not x.startswith('#'), open(path)) 12 | ks = [None]*len(list(skipComments(IN[0]))) 13 | streams = map(skipComments, IN) 14 | 15 | def fv_norm(fv): 16 | fv = np.clip(fv, -1000, 1000) 17 | fv = np.sign(fv) * np.sqrt(np.abs(fv)) 18 | fv /= (1e-4 + linalg.norm(fv)) 19 | return fv 20 | 21 | for i in range(len(ks)): 22 | x = np.vstack(tuple([fv_norm(np.fromstring(s.next(), dtype = np.float32, sep = '\t')) for s in streams])) 23 | ks[i] = np.dot(x, x.T) 24 | 25 | res = reduce(np.add, ks) 26 | np.savetxt(sys.stdout, res, fmt = '%.6f', delimiter = '\t') 27 | -------------------------------------------------------------------------------- /repro/hmdb-51/Makefile: -------------------------------------------------------------------------------- 1 | # Parameter settings 2 | FV_GMM_NCOMPONENTS = 256 3 | FASTFV_KNN = 5 4 | 5 | # uncomment next three lines to enable flann 6 | #FASTFV_FLANN_NTREES = 4 7 | #FASTFV_FLANN_NCOMPARISONS = 32 8 | #FASTFV_QUANTIZER = --enableflann $(FASTFV_FLANN_NTREES) $(FASTFV_FLANN_NCOMPARISONS) 9 | 10 | # comment next line to disable s-t grids 11 | FV_SPATIO_TEMPORAL_GRIDS = --enablespatiotemporalgrids 12 | 13 | # comment next line and uncomment the one after to use yael 14 | FV = $(FASTFV) 15 | #FV = ../yaelfv.py 16 | 17 | # Tools paths 18 | FASTVIDEOFEAT = ../../bin/fastvideofeat 19 | FASTFV = ../../bin/fastfv 20 | YAELDIR = ../../bin/dependencies/yael/yael 21 | export PYTHONPATH := $(shell pwd)/$(YAELDIR):$(PYTHONPATH) 22 | 23 | # repro below 24 | clipFile = allClips.txt 25 | allClips = $(shell cat $(clipFile)) 26 | 27 | videoDir = data/dataset/avi 28 | evalDir = data/dataset/testTrainMulti_7030_splits 29 | recodedDir = data/dataset/avi_recoded 30 | 31 | dataset = $(addprefix $(videoDir)/, $(allClips)) 32 | features = $(addprefix data/features/, $(addsuffix .txt, $(allClips))) 33 | features_sampled = data/features_sampled.txt 34 | vocabs = $(addprefix data/vocabs/, 10-105.hog.gmm 106-213.hog.gmm 214-309.mbhx.gmm 310-405.mbhy.gmm) 35 | fisher_vectors = $(addprefix data/fisher_vectors/, $(addsuffix .txt, $(allClips))) 36 | kernel = data/kernel.txt 37 | classification = data/classification.txt 38 | report = data/report.txt 39 | artefactDirs = data/features data/vocabs data/fisher_vectors data/dataset/avi_recoded logs/features logs/fisher_vectors logs/vocabs logs/recoding 40 | 41 | log = $(subst data, logs, $@).log 42 | vocab = $(basename $(basename $(notdir $(1)))) $(1) 43 | 44 | all: $(report) 45 | echo "Report on HMDB-51 classification task." 46 | echo "Reported accuracies are accuracies on dataset splits." 47 | echo "" 48 | cat $(report) 49 | 50 | $(artefactDirs) data/dataset: 51 | mkdir -p $@ 52 | 53 | $(dataset): $(videoDir) 54 | 55 | $(features): $(dataset) | $(artefactDirs) 56 | ffmpeg -y -an -i $(videoDir)/$(basename $(notdir $@)) -vcodec libxvid -q:v 1 $(recodedDir)/$(basename $(notdir $@)) > $(subst features,recoding, $(log)) 2>&1 57 | $(FASTVIDEOFEAT) $(recodedDir)/$(basename $(notdir $@)) > $@ 2> $(log) 58 | 59 | $(features_sampled): $(features) 60 | awk '{ if (rand() <= .01) print }' data/features/* > $@ 61 | 62 | $(vocabs): $(features_sampled) 63 | cat $(features_sampled) | ../../src/gmm_train.py --gmm_ncomponents $(FV_GMM_NCOMPONENTS) --vocab $(call vocab, $@) > $(log) 2>&1 64 | 65 | $(fisher_vectors): $(features) $(vocabs) 66 | cat $(subst fisher_vectors,features, $@) | $(FV) --xpos 0 --ypos 1 --tpos 2 --knn $(FASTFV_KNN) $(FASTFV_QUANTIZER) $(FV_SPATIO_TEMPORAL_GRIDS) $(foreach g, $(vocabs), --vocab $(call vocab, $(g))) > $@ 2> $(log) 67 | 68 | $(kernel) : $(fisher_vectors) 69 | ../dot_kernel.py data/fisher_vectors $(clipFile) > $@ 70 | 71 | $(classification) : $(kernel) 72 | cat $(kernel) | ./classify.py $(evalDir) $(clipFile) > $@ 73 | 74 | $(report): $(classification) 75 | ../report.py > $@ 76 | 77 | $(videoDir): | data/dataset 78 | wget http://www.rarlab.com/rar/rarlinux-3.9.1.tar.gz 79 | wget http://serre-lab.clps.brown.edu/wp-content/uploads/2013/10/hmdb51_org.rar 80 | wget http://serre-lab.clps.brown.edu/wp-content/uploads/2013/10/test_train_splits.rar 81 | mkdir -p $(videoDir) 82 | tar -C data/dataset -xf rarlinux-3.9.1.tar.gz 83 | data/dataset/rar/unrar x test_train_splits.rar data/dataset 84 | data/dataset/rar/unrar x hmdb51_org.rar $(videoDir) 85 | data/dataset/rar/unrar x '$(videoDir)/*.rar' $(videoDir) 86 | find $(videoDir) -name '*.avi' -exec bash -c 'mv "{}" $(videoDir)/$$(echo $$(basename "{}") | sed "s/[][;()&?!]/_/g")' \; 2> /dev/null 87 | rm rarlinux-3.9.1.tar.gz hmdb51_org.rar test_train_splits.rar $(videoDir)/*.rar 88 | 89 | clean: 90 | rm -rf $(artefactDirs) $(features_sampled) $(kernel) $(classification) $(report) 91 | -------------------------------------------------------------------------------- /repro/hmdb-51/README.md: -------------------------------------------------------------------------------- 1 | # Reproducing HMDB-51 results 2 | 3 | ## Prerequisites 4 | - 64-bit *nix, 800 Gb of free disk space, several gigs of RAM 5 | - Python, NumPy, scikits-learn, PyYAML, ffmpeg with libxvid 6 | 7 | ## Instructions 8 | 9 | Make sure all prerequisites are in place. Put the tools binaries in *bin* (you can get them from the [releases page](http://github.com/vadimkantorov/cvpr2014/releases)), and then run the repro with: 10 | > $ make --jobs 8 11 | 12 | The script will automatically download the HMDB-51 dataset and rar decompressor that are required for evaluation. 13 | You can adjust the number of cores used for parallel execution. In about an hour the scripts will fill the data and logs directories. After execution you will see a report like: 14 | ``` 15 | Report on HMDB-51 classification task. 16 | Reported accuracies are accuracies on dataset splits. 17 | 18 | Average frame count: 95 19 | Average frame size: 366x240 20 | Average descriptor count: 62462 21 | 22 | All fps are reported without taking file reading and writing into account, howevere, video decoding is included. 23 | 24 | Features (HOF, HOG, MBH enabled): 25 | Average total fps: 775.76 26 | Average HOG fps: 3807.06 27 | Average HOF fps: 4364.18 28 | Average MBH fps: 2840.89 29 | 30 | Fisher vectors (components: 256, s-t grids enabled: True, knn: 5, second order enabled: False, FLANN trees: -1, FLANN comparisons: -1): 31 | Average total fps: 632.27 32 | 33 | Classification: 34 | split_0 0.4588 35 | split_1 0.4359 36 | split_2 0.4595 37 | 38 | mean: 0.4514 39 | ``` 40 | 41 | To remove all produced items (no worry, it will not remove the downloaded Hollywood-2 dataset), run: 42 | > $ make clean 43 | 44 | # Notes 45 | The code recodes HMDB-51 videos with libxvid to produce reasonable motion vectors, as original videos in HMDB-51 are quite messy. 46 | Key parameters are specified on top of the Makefile and explained in the [Performance section](https://github.com/vadimkantorov/cvpr2014/#performance). You could play with them, hopefully everything will still work. 47 | Features and Fisher vectors are not compressed for the sake of script clarity. For practical usage, feel free to modify the script to use gzip compression or modify the tools to output floats in binary format. 48 | -------------------------------------------------------------------------------- /repro/hmdb-51/classify.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | 3 | import os 4 | import sys 5 | import itertools 6 | import numpy as np 7 | from sklearn.svm import SVC 8 | 9 | EVAL_DIR, allClips = sys.argv[1], map(lambda l: l[:-1], open(sys.argv[2])) 10 | all_k = np.loadtxt(sys.stdin) 11 | 12 | classLabels = sorted(set([f.split('_test_split')[0] for f in os.listdir(EVAL_DIR) if '_test_split' in f])) 13 | def read_split(SPLIT_IND): 14 | fixClipName = lambda x: reduce(lambda acc, ch: acc.replace(ch, '_'), '][;()&?!', x) 15 | train, test = [], [] 16 | for classLabel in classLabels: 17 | d = dict(map(str.split, open(os.path.join(EVAL_DIR, '%s_test_split%d.txt' % (classLabel, 1 + SPLIT_IND))))) 18 | train += [(fixClipName(k), classLabel) for k, v in d.items() if v == '1'] 19 | test += [(fixClipName(k), classLabel) for k, v in d.items() if v == '2'] 20 | 21 | return (train, test) 22 | 23 | splits = map(read_split, range(3)) 24 | slice_kernel = lambda inds1, inds2: all_k[np.ix_(map(allClips.index, inds1), map(allClips.index, inds2))] 25 | REG_C = 1.0 26 | 27 | def svm_train_test(train_k, test_k, ytrain, REG_C): 28 | model = SVC(kernel = 'precomputed', C = REG_C, max_iter = 10000) 29 | model.fit(train_k, ytrain) 30 | 31 | flatten = lambda ls: list(itertools.chain(*ls)) 32 | train_conf, test_conf = map(flatten, map(model.decision_function, [train_k, test_k])) 33 | return train_conf, test_conf 34 | 35 | def one_vs_rest(SPLIT_IND): 36 | calc_accuracy = lambda chosen, true: sum([int(true[i] == chosen[i]) for i in range(len(chosen))]) / float(len(chosen)) 37 | partition = lambda f, ls: (filter(f, ls), list(itertools.ifilterfalse(f, ls))) 38 | train, test = splits[SPLIT_IND] 39 | xtest, ytest = zip(*test) 40 | 41 | confs = [] 42 | for i, classLabel in enumerate(classLabels): 43 | postrain, negtrain = partition(lambda x: x[1] == classLabel, train) 44 | xtrain = zip(*(postrain + negtrain))[0] 45 | ytrain = [1]*len(postrain) + [-1]*len(negtrain) 46 | train_k, test_k = map(lambda x: slice_kernel(x, xtrain), [xtrain, xtest]) 47 | train_conf, test_conf = svm_train_test(train_k, test_k, ytrain, REG_C) 48 | confs.append(test_conf) 49 | 50 | ntest = len(test) 51 | chosen = [max([(confs[k][i], k) for k in range(len(classLabels))])[1] for i in range(ntest)] 52 | true = [classLabels.index(test[i][1]) for i in range(ntest)] 53 | return calc_accuracy(chosen, true) 54 | 55 | aps = [] 56 | for SPLIT_IND in range(len(splits)): 57 | test_ap = one_vs_rest(SPLIT_IND) 58 | aps.append(test_ap) 59 | print '%-15s: %.4f' % ('split_%d' % SPLIT_IND, test_ap) 60 | 61 | print '\nmean: %.4f' % np.mean(aps) 62 | -------------------------------------------------------------------------------- /repro/hollywood-2/Makefile: -------------------------------------------------------------------------------- 1 | # Parameter settings 2 | FV_GMM_NCOMPONENTS = 256 3 | FASTFV_KNN = 5 4 | 5 | # uncomment next three lines to enable flann 6 | #FASTFV_FLANN_NTREES = 4 7 | #FASTFV_FLANN_NCOMPARISONS = 32 8 | #FASTFV_QUANTIZER = --enableflann $(FASTFV_FLANN_NTREES) $(FASTFV_FLANN_NCOMPARISONS) 9 | 10 | # comment next line to disable s-t grids 11 | FV_SPATIO_TEMPORAL_GRIDS = --enablespatiotemporalgrids 12 | 13 | # comment next line and uncomment the one after to use yael 14 | FV = $(FASTFV) 15 | #FV = ../yaelfv.py 16 | 17 | # Tools paths 18 | FASTVIDEOFEAT = ../../bin/fastvideofeat 19 | FASTFV = ../../bin/fastfv 20 | YAELDIR = ../../bin/dependencies/yael/yael 21 | export PYTHONPATH := $(shell pwd)/$(YAELDIR):$(PYTHONPATH) 22 | 23 | # repro below 24 | clipFile = allClips.txt 25 | allClips = $(shell cat $(clipFile)) 26 | 27 | videoDir = data/dataset/Hollywood2/AVIClips 28 | evalDir = data/dataset/Hollywood2/ClipSets 29 | dataset = $(addprefix $(videoDir)/, $(allClips)) 30 | features = $(addprefix data/features/, $(addsuffix .txt, $(allClips))) 31 | features_sampled = data/features_sampled.txt 32 | vocabs = $(addprefix data/vocabs/, 10-105.hog.gmm 106-213.hog.gmm 214-309.mbhx.gmm 310-405.mbhy.gmm) 33 | fisher_vectors = $(addprefix data/fisher_vectors/, $(addsuffix .txt, $(allClips))) 34 | kernel = data/kernel.txt 35 | vlfeat = vlfeat-0.9.19/toolbox/plotop/vl_pr.m 36 | classification = data/classification.txt 37 | report = data/report.txt 38 | artefactDirs = data/features data/vocabs data/fisher_vectors logs/features logs/fisher_vectors logs/vocabs 39 | 40 | log = $(subst data, logs, $@).log 41 | vocab = $(basename $(basename $(notdir $(1)))) $(1) 42 | 43 | all: $(report) 44 | echo "Report on Hollywood-2 classification task." 45 | echo "Reported accuracies are average precision values." 46 | echo "" 47 | cat $(report) 48 | 49 | $(artefactDirs) data/dataset: 50 | mkdir -p $@ 51 | 52 | $(dataset): $(videoDir) 53 | 54 | $(features): $(dataset) | $(artefactDirs) 55 | $(FASTVIDEOFEAT) $(videoDir)/$(basename $(notdir $@)) > $@ 2> $(log) 56 | 57 | $(features_sampled): $(features) 58 | awk '{ if (rand() <= .01) print }' data/features/actioncliptrain* > $@ 59 | 60 | $(vocabs): $(features_sampled) 61 | cat $(features_sampled) | ../../src/gmm_train.py --gmm_ncomponents $(FV_GMM_NCOMPONENTS) --vocab $(call vocab, $@) > $(log) 2>&1 62 | 63 | $(fisher_vectors): $(features) $(vocabs) 64 | cat $(subst fisher_vectors,features, $@) | $(FV) --xpos 0 --ypos 1 --tpos 2 --knn $(FASTFV_KNN) $(FASTFV_QUANTIZER) $(FV_SPATIO_TEMPORAL_GRIDS) $(foreach g, $(vocabs), --vocab $(call vocab, $(g))) > $@ 2> $(log) 65 | 66 | $(kernel) : $(fisher_vectors) 67 | ../dot_kernel.py data/fisher_vectors $(clipFile) > $@ 68 | 69 | $(classification) : $(kernel) $(vlfeat) 70 | cat $(kernel) | ./classify.py $(evalDir) $(clipFile) > $@ 71 | 72 | $(report): $(classification) 73 | ../report.py > $@ 74 | 75 | $(videoDir): | data/dataset 76 | wget ftp://ftp.irisa.fr/local/vistas/actions/Hollywood2-actions.tar.gz 77 | tar -C data/dataset -xf Hollywood2-actions.tar.gz 78 | rm Hollywood2-actions.tar.gz 79 | 80 | $(vlfeat): 81 | wget https://github.com/vlfeat/vlfeat/archive/v0.9.19.tar.gz 82 | tar -xf v0.9.19.tar.gz 83 | rm v0.9.19.tar.gz 84 | 85 | clean: 86 | rm -rf $(artefactDirs) $(features_sampled) $(kernel) $(classification) $(report) 87 | -------------------------------------------------------------------------------- /repro/hollywood-2/README.md: -------------------------------------------------------------------------------- 1 | # Reproducing Hollywood-2 results 2 | 3 | ## Prerequisites 4 | - 64-bit *nix, 800 Gb of free disk space, several gigs of RAM 5 | - Python, NumPy, scikits-learn, PyYAML, oct2py, octave 6 | 7 | ## Instructions 8 | 9 | Make sure all prerequisites are in place. Put the tools binaries in *bin* (you can get them from the [releases page](http://github.com/vadimkantorov/cvpr2014/releases)), and then run the repro with: 10 | > $ make --jobs 8 11 | 12 | The script will automatically download the Hollywood-2 dataset and VLfeat 0.9.19 that are required for evaluation. 13 | You can adjust the number of cores used for parallel execution. In about an hour the scripts will fill the data and logs directories. After execution you will see a report like: 14 | ``` 15 | Report on Hollywood-2 classification task. 16 | Reported accuracies are average precision values. 17 | 18 | Average frame count: 285 19 | Average frame size: 609x338 20 | Average descriptor count: 596177 21 | 22 | All fps are reported without taking file reading and writing into account, howevere, video decoding is included. 23 | 24 | Features (HOF, HOG, MBH enabled): 25 | Average total fps: 333.96 26 | Average HOG fps: 602.25 27 | Average HOF fps: 635.79 28 | Average MBH fps: 519.70 29 | 30 | Fisher vectors (components: 256, s-t grids enabled: True, knn: 5, second order enabled: False, FLANN trees: -1, FLANN comparisons: -1): 31 | Average total fps: 227.36 32 | 33 | Classification: 34 | AnswerPhone 0.3210 35 | DriveCar 0.8927 36 | Eat 0.6064 37 | FightPerson 0.7101 38 | GetOutCar 0.5536 39 | HandShake 0.3737 40 | HugPerson 0.4174 41 | Kiss 0.6345 42 | Run 0.7090 43 | SitDown 0.7708 44 | SitUp 0.2522 45 | StandUp 0.7445 46 | 47 | mean: 0.5822 48 | ``` 49 | 50 | To remove all produced items (no worry, it will not remove the downloaded Hollywood-2 dataset), run: 51 | > $ make clean 52 | 53 | # Notes 54 | Key parameters are specified on top of the Makefile and explained in the [Performance section](https://github.com/vadimkantorov/cvpr2014/#performance). You could play with them, hopefully everything will still work. 55 | Features and Fisher vectors are not compressed for the sake of script clarity. For practical usage, feel free to modify the script to use gzip compression or modify the tools to output floats in binary format. 56 | -------------------------------------------------------------------------------- /repro/hollywood-2/classify.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | 3 | import os 4 | import re 5 | import sys 6 | import itertools 7 | import numpy as np 8 | from sklearn.cross_validation import StratifiedKFold 9 | from sklearn.svm import SVC 10 | from oct2py import octave 11 | 12 | EVAL_DIR, allClipsNoExt = sys.argv[1], map(lambda l: os.path.splitext(l[:-1])[0], open(sys.argv[2])) 13 | all_k = np.loadtxt(sys.stdin) 14 | 15 | CS = np.logspace(-6, 2, 10) 16 | 17 | classLabels = sorted(set([x.split('_')[0] for x in os.listdir(EVAL_DIR) if re.match('[A-Z].+_(train|test)\.txt', x)])) 18 | hwd2_labels = lambda pref, classLabel: map(np.array, zip(*np.genfromtxt(os.path.join(EVAL_DIR, '%s_%s.txt' % (classLabel, pref)), dtype = None))) 19 | slice_kernel = lambda inds1, inds2: all_k[np.ix_(map(allClipsNoExt.index, inds1), map(allClipsNoExt.index, inds2))] 20 | 21 | octave.addpath('vlfeat-0.9.19/toolbox/misc') 22 | octave.addpath('vlfeat-0.9.19/toolbox/plotop') 23 | 24 | def svm_train_test(train_k, test_k, ytrain, ytest, REG_C): 25 | ytrain = list(ytrain) 26 | 27 | model = SVC(kernel = 'precomputed', C = REG_C, max_iter = 10000) 28 | model.fit(train_k, ytrain) 29 | 30 | flatten = lambda ls: list(itertools.chain(*ls)) 31 | train_conf, test_conf = map(flatten, map(model.decision_function, [train_k, test_k])) 32 | 33 | rec, prec, trainInfo = octave.vl_pr(ytrain, train_conf) 34 | rec, prec, testInfo = octave.vl_pr(ytest, test_conf) 35 | 36 | return trainInfo['auc_pa08'], testInfo['auc_pa08'] 37 | 38 | aps = [] 39 | for CLS_LAB in classLabels: 40 | xtrain_orig, ytrain_orig = hwd2_labels('train', CLS_LAB) 41 | xtest_orig, ytest_orig = hwd2_labels('test', CLS_LAB) 42 | 43 | skf = StratifiedKFold(ytrain_orig, n_folds = 5) 44 | 45 | val_aps = np.zeros((len(skf), len(CS))) 46 | for i, (train_ind, val_ind) in enumerate(skf): 47 | xtrain, xval = xtrain_orig[train_ind], xtrain_orig[val_ind] 48 | ytrain, yval = ytrain_orig[train_ind], ytrain_orig[val_ind] 49 | 50 | train_k, val_k = slice_kernel(xtrain, xtrain), slice_kernel(xval, xtrain) 51 | for j, REG_C in enumerate(CS): 52 | train_ap, val_ap = svm_train_test(train_k, val_k, ytrain, yval, REG_C) 53 | val_aps[i, j] = val_ap 54 | 55 | val_map = val_aps.mean(0) 56 | 57 | REG_C = CS[val_map.argmax()] 58 | train_k_orig, test_k_orig = slice_kernel(xtrain_orig, xtrain_orig), slice_kernel(xtest_orig, xtrain_orig) 59 | train_ap, test_ap = svm_train_test(train_k_orig, test_k_orig, ytrain_orig, ytest_orig, REG_C) 60 | aps.append(test_ap) 61 | print '%-15s: %.4f' % (CLS_LAB, test_ap) 62 | 63 | print '\nmean: %.4f' % np.mean(aps) 64 | -------------------------------------------------------------------------------- /repro/report.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | 3 | import os 4 | import sys 5 | import yaml 6 | import numpy as np 7 | 8 | featuresDir = 'logs/features' 9 | features = [yaml.load(''.join([l for l in open(os.path.join(featuresDir, logFile)) if not l.startswith('[')])) for logFile in sorted(os.listdir(featuresDir))] 10 | 11 | fisher_vectorsDir = 'logs/fisher_vectors' 12 | fisher_vectors = [yaml.load(open(os.path.join(fisher_vectorsDir, logFile)).read()) for logFile in sorted(os.listdir(fisher_vectorsDir))] 13 | 14 | classification = yaml.load(open('data/classification.txt').read()) 15 | 16 | print 'Average frame count: %d' % np.mean([y['Frame count'] for y in features]) 17 | print 'Average frame size: %dx%d' % tuple(map(lambda x: np.mean([float(y['Original frame size'].split('x')[x]) for y in features]), range(2))) 18 | print 'Average descriptor count: %d' % np.mean([y['Calls.ComputeDescriptor'] for y in features]) 19 | print '' 20 | print 'All fps are reported without taking file reading and writing into account, howevere, video decoding is included.' 21 | print '' 22 | print 'Features (%s enabled):' % ', '.join([k for k, v in features[0]['Enabled descriptors'].items() if v]) 23 | print ' Average total fps: %.2f' % np.mean([y['Fps'] for y in features]) 24 | 25 | print ' Average HOG fps: %.2f' % np.mean([y['Frame count'] / float(0.01 + y['Reading (sec)'] + y['Interp (sec)']['HOG'] + y['IntHist (sec)']['HOG'] + y['Desc (sec)']['HOG']) for y in features]) 26 | print ' Average HOF fps: %.2f' % np.mean([y['Frame count'] / float(0.01 + y['Reading (sec)'] + y['Interp (sec)']['HOFMBH'] + y['IntHist (sec)']['HOF'] + y['Desc (sec)']['HOF']) for y in features]) 27 | print ' Average MBH fps: %.2f' % np.mean([y['Frame count'] / float(0.01 + y['Reading (sec)'] + y['Interp (sec)']['HOFMBH'] + y['IntHist (sec)']['MBH'] + y['Desc (sec)']['MBH']) for y in features]) 28 | print '' 29 | print 'Fisher vectors (components: %d, s-t grids enabled: %s, knn: %s, second order enabled: %s, FLANN trees: %s, FLANN comparisons: %s):' % (fisher_vectors[0]['10-105']['k'], fisher_vectors[0]['Enable spatio-temporal grids (1x1x1, 1x3x1, 1x1x2)'], fisher_vectors[0].get('K_nn', 'N/A'), fisher_vectors[0]['Enable second order'], fisher_vectors[0].get('FLANN trees', -1), fisher_vectors[0].get('FLANN checks', -1)) 30 | print ' Average total fps: %.2lf' % np.mean([y['Frame count'] / float(z.get('Copying (sec)', 0) + z.get('Flann (sec)', 0) + z.get('Assigning (sec)', 0)) for y, z in zip(features, fisher_vectors)]) 31 | print '' 32 | print 'Classification:' 33 | for k in sorted(set(classification) - set(['mean'])): 34 | print ' %-15s\t%.4f' % (k, classification[k]) 35 | print '' 36 | print ' mean: %.4f' % classification['mean'] 37 | -------------------------------------------------------------------------------- /repro/yaelfv.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import os 4 | import sys 5 | import time 6 | import itertools 7 | import argparse 8 | import numpy as np 9 | import yael 10 | 11 | parser = argparse.ArgumentParser() 12 | parser.add_argument('--xpos', type = int, required = True) 13 | parser.add_argument('--ypos', type = int, required = True) 14 | parser.add_argument('--tpos', type = int, required = True) 15 | parser.add_argument('--vocab', action = 'append', nargs = 2, required = True) 16 | parser.add_argument('--enablesecondorder', action = 'store_true') 17 | parser.add_argument('--enablespatiotemporalgrids', action = 'store_true') 18 | 19 | args, unknown = parser.parse_args() 20 | 21 | flags = yael.GMM_FLAGS_MU 22 | if args.enablesecondorder: 23 | flags |= yael.GMM_FLAGS_SIGMA 24 | 25 | parts = [] 26 | for p in args.vocab: 27 | cutFrom, cutTo = map(int, p[0].split('-')) 28 | gmm = yael.gmm_read(open(p[1], 'r')) 29 | fvSize = yael.gmm_fisher_sizeof(gmm, flags) 30 | parts.append((cutFrom, cutTo, fvSize, gmm, os.path.basename(p[1]))) 31 | 32 | print >> sys.stderr, '%d-%d: {d: %d, k: %d, fvSize: %d}' % (cutFrom, cutTo, gmm.d, gmm.k, fvSize); 33 | 34 | nx, ny, nt = (1, 3, 2) if args.enablespatiotemporalgrids else (1, 1, 1) 35 | nxyt = nx * ny * nt 36 | mesh = list(itertools.product(range(nx), range(ny), range(nt))) 37 | 38 | buffer = np.zeros((nx, ny, nt, 10000, 500), dtype = np.float32) 39 | acc = np.zeros((nx, ny, nt, sum([fvSize for cutFrom, cutTo, fvSize, gmm, partName in parts])), dtype = np.float32) 40 | cnt = np.zeros((nx, ny, nt), dtype = int) 41 | ndescr = np.zeros_like(cnt) 42 | 43 | def flushBuffer(x, y, t): 44 | c = int(cnt[x, y, t]) 45 | fvs = [] 46 | for cutFrom, cutTo, fvSize, gmm, partName in parts: 47 | desc = np.ascontiguousarray(buffer[x, y, t, :c, cutFrom:(1 + cutTo)]) 48 | fv = yael.fvec_new_0(fvSize) 49 | yael.gmm_fisher(c, yael.FloatArray.acquirepointer(yael.numpy_to_fvec(desc)), gmm, flags, fv) 50 | fvs.append(yael.fvec_to_numpy(fv, fvSize).flatten()) 51 | 52 | ndescr[x, y, t] += c 53 | cnt[x, y, t] = 0 54 | return np.sqrt(c) * np.hstack(tuple(fvs)) 55 | 56 | timerCopying, timerAssigning = 0.0, 0.0 57 | 58 | for line in sys.stdin: 59 | descr = np.fromstring(line, sep = '\t', dtype = np.float32) 60 | 61 | x = min(nx - 1, int(nx * descr[args.xnpos])) 62 | y = min(ny - 1, int(ny * descr[args.ynpos])) 63 | t = min(nt - 1, int(nt * descr[args.tnpos])) 64 | 65 | tic = time.clock() 66 | buffer[x, y, t, cnt[x, y, t], :descr.size] = descr 67 | cnt[x, y, t] += 1 68 | timerCopying += time.clock() - tic 69 | 70 | if cnt[x, y , t] == buffer[x, y, t].shape[0]: 71 | tic = time.clock() 72 | acc[x, y, t] += flushBuffer(x, y, t) 73 | timerAssigning += time.clock() - tic 74 | 75 | for x, y, t in mesh: 76 | if cnt[x, y, t] > 0: 77 | tic = time.clock() 78 | acc[x, y, t] += flushBuffer(x, y, t) 79 | timerAssigning += time.clock() - tic 80 | 81 | if args.enablespatiotemporalgrids: 82 | res = np.empty((nx + ny + nt, acc.shape[-1]), dtype = np.float32) 83 | res[1] = acc[0, 0, 0] + acc[0, 0, 1] 84 | res[2] = acc[0, 1, 0] + acc[0, 1, 1] 85 | res[3] = acc[0, 2, 0] + acc[0, 2, 1] 86 | res[4] = aсс[0, 0, 0] + acc[0, 1, 0] + acc[0, 2, 0] 87 | res[5] = acc[0, 0, 1] + acc[0, 1, 1] + acc[0, 2, 1] 88 | res[0] = res[4] + res[5] 89 | else: 90 | res = acc[0, 0, 0, np.newaxis] 91 | 92 | for cutFrom, cutTo, fvSize, gmm, partName in parts: 93 | begin, end = end, end + fvSize 94 | 95 | print '#FV %dx1x1x %s (%d-%d), 0-0-0' % (nx, partName, cutFrom, cutTo) 96 | np.savetxt(sys.stdout, res[0][begin:end], fmt = '%.6f', newline = '\t') 97 | print '' 98 | 99 | if args.enablespatiotemporalgrids: 100 | for j in range(ny): 101 | print '#FV 1x%dx1x %s (%d-%d), 0-%d-0' % (ny, partName, cutFrom, cutTo, j) 102 | np.savetxt(sys.stdout, res[1 + j][begin:end], fmt = '%.6f', newline = '\t') 103 | print '' 104 | 105 | for j in range(nt): 106 | print '#FV 1x1x%dx %s (%d-%d), 0-0-%d' % (nt, partName, cutFrom, cutTo, j) 107 | np.savetxt(sys.stdout, res[4 + j][begin:end], fmt = '%.6f', newline = '\t') 108 | print '' 109 | 110 | print >> sys.stderr, 'Enable spatio-temporal grids (1x1x1, 1x3x1, 1x1x2): %s' % args.enablespatiotemporalgrids 111 | print >> sys.stderr, 'Enable second order: %s' % args.enablesecondorder 112 | print >> sys.stderr, 'Copying (sec): %.4f' % timerCopying 113 | print >> sys.stderr, 'Assigning (sec): %.4f' % timerAssigning 114 | -------------------------------------------------------------------------------- /src/fastfv/Makefile: -------------------------------------------------------------------------------- 1 | # Will link statically with OpenCV, Yael, ATLAS, gfortran. To link dynamically, remove "-Wl,-Bstatic" and "-Wl,-Bdynamic" 2 | 3 | CFLAGS = -O3 -msse3 -std=c++0x 4 | LDFLAGS = -lopencv_flann -lopencv_core -Wl,-Bstatic -lyael -lgomp -llapack -lf77blas -lcblas -latlas -lgfortran -Wl,-Bdynamic -lpthread -lz -lm -lc -lrt 5 | INSTALLED_DEPS = -I../../bin/dependencies/include -L../../bin/dependencies/lib -I../../bin/dependencies/yael -L../../bin/dependencies/yael/yael 6 | BIN = ../../bin/fastfv 7 | 8 | all: $(SOURCE_FILES) 9 | g++ main.cpp -o $(BIN) $(CFLAGS) $(LDFLAGS) $(INSTALLED_DEPS) 10 | clean: 11 | rm $(BIN) 12 | -------------------------------------------------------------------------------- /src/fastfv/common.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | using namespace std; 6 | 7 | #ifndef __GRID_PART_H__ 8 | #define __GRID_PART_H__ 9 | 10 | struct Grid 11 | { 12 | int nx, ny, nt; 13 | 14 | char ToString[20]; 15 | int TotalCells; 16 | 17 | int CellIndex(float x, float y, float t) 18 | { 19 | int xind = min(nx - 1, int(nx * x)); 20 | int yind = min(ny - 1, int(ny * y)); 21 | int tind = min(nt - 1, int(nt * t)); 22 | return Pos(xind, yind, tind); 23 | } 24 | 25 | int Pos(int xind, int yind, int tind) 26 | { 27 | return tind + yind * nt + xind * ny * nt; 28 | } 29 | 30 | Grid(int nx = 1, int ny = 1, int nt = 1) : nx(nx), ny(ny), nt(nt) 31 | { 32 | TotalCells = nx*ny*nt; 33 | sprintf(ToString, "%dx%dx%d", nx, ny, nt); 34 | } 35 | }; 36 | 37 | struct Part 38 | { 39 | string VocabPath; 40 | int FeatStart; 41 | int FeatEnd; 42 | 43 | int Size; 44 | string ToString; 45 | 46 | Part(int featStart, int featEnd, string vocabPath) : FeatStart(featStart), FeatEnd(featEnd), VocabPath(vocabPath) 47 | { 48 | Size = FeatEnd - FeatStart + 1; 49 | 50 | ToString = VocabPath.substr(1 + VocabPath.find_last_of("/\\")); 51 | ToString = ToString.substr(0, ToString.find_first_of(".")); 52 | } 53 | }; 54 | 55 | #endif 56 | -------------------------------------------------------------------------------- /src/fastfv/diag.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #include "../util.h" 5 | #include "common.h" 6 | 7 | using namespace std; 8 | 9 | #ifndef __DIAG_H__ 10 | #define __DIAG_H__ 11 | 12 | struct Diag 13 | { 14 | Timer Vocab, Reading, Writing, FLANN, Assigning, Copying, Total, ComputeGamma, UpdateFv; 15 | int OpCount, DescriptorCnt; 16 | 17 | void Print(vector& parts) 18 | { 19 | log("Vocab reading and construction (sec): %.2lf", Vocab.TotalInSeconds()); 20 | log("Reading (sec): %.2lf", Reading.TotalInSeconds()); 21 | log("Writing (sec): %.2lf", Writing.TotalInSeconds()); 22 | log("Flann (sec): %.2lf", FLANN.TotalInSeconds()); 23 | log("Assigning (sec): %.2lf", Assigning.TotalInSeconds()); 24 | log("ComputeGamma (sec): %.2lf", ComputeGamma.TotalInSeconds()); 25 | log("UpdateFv (sec): %.2lf", UpdateFv.TotalInSeconds()); 26 | 27 | log("Copying (sec): %.2lf", Copying.TotalInSeconds()); 28 | log("Total (sec): %.2lf", Total.TotalInSeconds()); 29 | log("Ops: %d", OpCount); 30 | log("Descriptors: %d", DescriptorCnt); 31 | fprintf(stderr, "Part sizes: ["); 32 | for(int i = 0; i < parts.size(); i++) 33 | fprintf(stderr, "%d, ", parts[i].Size); 34 | log("]"); 35 | } 36 | 37 | Diag() : OpCount(0), DescriptorCnt(0) {} 38 | }; 39 | Diag TIMERS; 40 | 41 | #endif 42 | -------------------------------------------------------------------------------- /src/fastfv/fisher_vector.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | extern "C" 6 | { 7 | #include 8 | #include 9 | } 10 | 11 | #include "diag.h" 12 | 13 | using namespace std; 14 | using namespace cv; 15 | 16 | #ifndef __SPM_FV_H__ 17 | #define __SPM_FV_H__ 18 | 19 | struct GmmVocab 20 | { 21 | int k; 22 | Mat_ mu, sigma, w; 23 | 24 | GmmVocab(string vocabPath) 25 | { 26 | FILE* f = fopen(vocabPath.c_str(), "r"); 27 | if(f == NULL) 28 | throw std::runtime_error("GMM vocab (" + vocabPath + ") doesn't exist or can't be opened."); 29 | 30 | gmm_t* g = gmm_read(f); 31 | fclose(f); 32 | 33 | k = g->k; 34 | int d = g->d; 35 | 36 | w = Mat_(k, 1, g->w, Mat::AUTO_STEP); 37 | mu = Mat_(k, d, g->mu, Mat::AUTO_STEP); 38 | sigma = Mat_(k, d, g->sigma, Mat::AUTO_STEP); 39 | 40 | float minLambda = 1e-4; 41 | for(int i = 0; i < sigma.rows; i++) 42 | for(int j = 0; j < sigma.cols; j++) 43 | sigma(i, j) = sigma(i, j) + minLambda; 44 | } 45 | }; 46 | 47 | struct SpmFisherVector 48 | { 49 | SpmFisherVector(bool enableGrids, GmmVocab& vocab, Part part, int k_nn, bool do_sigma) 50 | : w(vocab.w), d(part.Size), k(vocab.k), k_nn(k_nn), part(part), do_sigma(do_sigma) 51 | { 52 | mu = vocab.mu; 53 | sigma = vocab.sigma; 54 | 55 | assert((uintptr_t(mu.ptr()) % 16) == 0 && mu.cols % 4 == 0); 56 | assert((uintptr_t(sigma.ptr()) % 16) == 0 && sigma.cols % 4 == 0); 57 | assert(d % 4 == 0); 58 | 59 | grid = enableGrids ? Grid(1, 3, 2) : Grid(1, 1, 1); 60 | int fvSize = (do_sigma ? 2 : 1) * (part.Size * vocab.k); 61 | eff_FV = Mat_::zeros(grid.TotalCells, fvSize); 62 | 63 | ComputeGammaPrecalc(); 64 | log("%d-%d: {d: %d, k: %d, k_nn: %d, fvSize: %d, size(ToString): %d, shape(mu): %dx%d, shape(sigma): %dx%d, shape(w): %dx%d}", part.FeatStart, part.FeatEnd, d, k, k_nn, fvSize, ToString.size(), vocab.mu.rows, vocab.mu.cols, vocab.sigma.rows, vocab.sigma.cols, vocab.w.rows, vocab.w.cols); 65 | } 66 | 67 | void Update(float x, float y, float t, float* descr, int* nn) 68 | { 69 | assert((uintptr_t(descr) % 16) == 0); 70 | 71 | TIMERS.ComputeGamma.Start(); 72 | ComputeGamma(descr, nn); 73 | TIMERS.ComputeGamma.Stop(); 74 | TIMERS.UpdateFv.Start(); 75 | UpdateFv(descr, nn, eff_FV.ptr(grid.CellIndex(x, y, t))); 76 | TIMERS.UpdateFv.Stop(); 77 | } 78 | 79 | void ComputeGamma(float* descr, int* nn) 80 | { 81 | float maxval = -1e30; 82 | for (int z = 0 ; z < k_nn ; z++) 83 | { 84 | int j = nn[z]; 85 | float* ptr_mu = mu.ptr(j); 86 | float* ptr_sigma_m1 = sigma_m1.ptr(j); 87 | 88 | //below the vectorized code for: 89 | //float dtmp = 0; 90 | //for (int l = 0 ; l < d ; l++) 91 | // dtmp += sqr (descr[l] - mu(j, l)) * sigma_m1(j, l); 92 | __m128 sum = _mm_setzero_ps(); 93 | for(int l = 0; l < d; l += 4) 94 | { 95 | //assert((uintptr_t)(void*)(ptr_mu + l) % 16 == 0); 96 | //TODO: change all loadu to load!!!!! 97 | __m128 descr_l = _mm_load_ps(descr + l); 98 | __m128 sigma_m1_l = _mm_load_ps(ptr_sigma_m1 + l); 99 | __m128 mu_l = _mm_load_ps(ptr_mu + l); 100 | 101 | __m128 sub = _mm_sub_ps(descr_l, mu_l); 102 | __m128 sqrd= _mm_mul_ps(sub, sub); 103 | sqrd = _mm_mul_ps(sqrd, sigma_m1_l); 104 | sum = _mm_add_ps(sum, sqrd); 105 | } 106 | sum = _mm_hadd_ps(sum, sum); 107 | sum = _mm_hadd_ps(sum, sum); 108 | float dtmp = _mm_cvtss_f32(sum); 109 | 110 | gamma[z] = logdetnr[j] - 0.5 * dtmp; 111 | if(gamma[z] > maxval) maxval = gamma[z]; 112 | } 113 | 114 | float s = 0.0; 115 | for(int z = 0; z < k_nn; z++) { 116 | gamma[z] = exp(gamma[z] - maxval); 117 | s += gamma[z]; 118 | } 119 | 120 | float is = 1.0 / s; 121 | for(int z = 0; z < k_nn; z++) 122 | gamma[z] *= is; 123 | } 124 | 125 | void UpdateFv(float* descr, int* nn, float* fv) 126 | { 127 | for(int i = 0; i < k_nn; i++) 128 | { 129 | int j = nn[i]; 130 | float g = gamma[i]; 131 | float* ptr_fv_mu = fv + (0) + j*d; 132 | float* ptr_fv_sigma = fv + (d*k) + j*d; 133 | float* ptr_mu = mu.ptr(j); 134 | float* ptr_sigma = sigma.ptr(j); 135 | 136 | //below the vectorized version of: 137 | //for(int l = 0; l < d; l++) 138 | // ptr_fv[l] += g*(descr[l] - ptr_mu[l]); 139 | 140 | __m128 g_l = _mm_set1_ps(g); 141 | for(int l = 0; l < d; l += 4) 142 | { 143 | __m128 descr_l = _mm_load_ps(descr + l); 144 | __m128 mu_l = _mm_load_ps(ptr_mu + l); 145 | __m128 fv_l = _mm_load_ps(ptr_fv_mu + l); 146 | 147 | __m128 sub = _mm_sub_ps(descr_l, mu_l); 148 | __m128 res_mu = _mm_add_ps(fv_l, _mm_mul_ps(sub, g_l)); 149 | _mm_store_ps(ptr_fv_mu + l, res_mu); 150 | 151 | if(do_sigma) 152 | { 153 | __m128 sigma_l = _mm_load_ps(ptr_sigma + l); 154 | __m128 sq1 = _mm_add_ps(sub, sigma_l); 155 | __m128 sq2 = _mm_sub_ps(sub, sigma_l); 156 | __m128 res_sigma = _mm_mul_ps(sq1, sq2); 157 | _mm_store_ps(ptr_fv_sigma + l, res_sigma); 158 | } 159 | } 160 | } 161 | } 162 | 163 | void ComputeGammaPrecalc() 164 | { 165 | logdetnr = fvec_new(k); 166 | for (int j = 0 ; j < k ; j++) { 167 | logdetnr[j] = -d / 2.0 * log (2 * M_PI); 168 | for (int l = 0 ; l < d ; l++) 169 | logdetnr[j] -= 0.5 * log (sigma(j, l)); 170 | logdetnr[j] += log(w(0, j)); 171 | } 172 | p = fvec_new(1*k); 173 | gamma = fvec_new(1*k_nn); 174 | pow(sigma, -1, sigma_m1); 175 | } 176 | 177 | void Done() 178 | { 179 | for(int i = 0; i < eff_FV.rows; i++) 180 | { 181 | for(int j = 0; j < k; j++) 182 | { 183 | for(int l = 0; l < d; l++) 184 | { 185 | eff_FV(i, j*d + l) *= sigma_m1(j, l); 186 | if(do_sigma) 187 | eff_FV(i, d*k + j*d + l) *= (sigma_m1(j, l) * sigma_m1(j, l)); 188 | } 189 | } 190 | } 191 | 192 | if(grid.nx == 1 && grid.ny == 1 && grid.nt == 1) 193 | { 194 | FV = eff_FV; 195 | ToString.push_back(format("#FV %s %s (%d-%d), 0-0-0", grid.ToString, part.ToString.c_str(), part.FeatStart, part.FeatEnd)); 196 | } 197 | else 198 | { 199 | FV = Mat_::zeros(grid.nx + grid.ny + grid.nt, eff_FV.cols); 200 | 201 | ToString.push_back(format("#FV 1x1x1 %s (%d-%d), 0-0-0", part.ToString.c_str(), part.FeatStart, part.FeatEnd)); 202 | 203 | for(int i = 0; i < grid.ny; i++) 204 | { 205 | ToString.push_back(format("#FV 1x3x1 %s (%d-%d), 0-%d-0", part.ToString.c_str(), part.FeatStart, part.FeatEnd, i)); 206 | FV.row(1 + i) = eff_FV.row(grid.Pos(0, i, 0)) + eff_FV.row(grid.Pos(0, i, 1)); 207 | } 208 | 209 | for(int i = 0; i < grid.nt; i++) 210 | { 211 | ToString.push_back(format("#FV 1x1x2 %s (%d-%d), 0-0-%d", part.ToString.c_str(), part.FeatStart, part.FeatEnd, i)); 212 | FV.row(4 + i) = eff_FV.row(grid.Pos(0, 0, i)) + eff_FV.row(grid.Pos(0, 1, i)) + eff_FV.row(grid.Pos(0, 2, i)); 213 | } 214 | 215 | FV.row(0) = FV.row(4) + FV.row(5); 216 | } 217 | } 218 | 219 | float* gamma, *logdetnr, *lg; 220 | Mat_ mu, sigma, w, sigma_m1; 221 | Mat_ FV, eff_FV; 222 | vector ToString; 223 | Grid grid; 224 | Part part; 225 | int d; 226 | int k; 227 | int k_nn; 228 | float* p; 229 | bool do_sigma; 230 | }; 231 | 232 | #endif 233 | 234 | -------------------------------------------------------------------------------- /src/fastfv/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | 15 | #include "../util.h" 16 | #include "diag.h" 17 | #include "fisher_vector.h" 18 | #include "common.h" 19 | 20 | extern "C" 21 | { 22 | #include 23 | #include 24 | } 25 | 26 | using namespace cv; 27 | using namespace cv::flann; 28 | using namespace std; 29 | 30 | struct Options 31 | { 32 | vector Parts; 33 | 34 | int XnPos, YnPos, TnPos; 35 | int K_nn; 36 | int FlannKdTrees, FlannChecks; 37 | bool DoSigma, EnableGrids; 38 | 39 | Options(int argc, char* argv[]) 40 | { 41 | K_nn = 5; 42 | EnableGrids = DoSigma = false; 43 | FlannKdTrees = FlannChecks = -1; 44 | XnPos = YnPos = TnPos = -1; 45 | 46 | for(int i = 1; i < argc; i++) 47 | { 48 | if(strcmp(argv[i], "--knn") == 0) 49 | { 50 | K_nn = atoi(argv[i+1]); 51 | i++; 52 | } 53 | else if(strcmp(argv[i], "--enableflann") == 0) 54 | { 55 | FlannKdTrees = 4; 56 | FlannChecks = 32; 57 | 58 | if(i + 2 < argc && sscanf(argv[i + 1], "%d", &FlannKdTrees) == 1 && sscanf(argv[i + 2], "%d", &FlannChecks) == 1) 59 | { 60 | i += 2; 61 | } 62 | } 63 | else if(strcmp(argv[i], "--enablesecondorder") == 0) 64 | { 65 | DoSigma = true; 66 | } 67 | else if(strcmp(argv[i], "--xpos") == 0) 68 | { 69 | XnPos = atoi(argv[i + 1]); 70 | i++; 71 | } 72 | else if(strcmp(argv[i], "--ypos") == 0) 73 | { 74 | YnPos = atoi(argv[i + 1]); 75 | i++; 76 | } 77 | else if(strcmp(argv[i], "--tpos") == 0) 78 | { 79 | TnPos = atoi(argv[i + 1]); 80 | i++; 81 | } 82 | else if(strcmp(argv[i], "--enablespatiotemporalgrids") == 0) 83 | { 84 | EnableGrids = true; 85 | } 86 | else if(strcmp(argv[i], "--vocab") == 0) 87 | { 88 | int a, b; 89 | sscanf(argv[i+1], "%d-%d", &a, &b); 90 | Part p(a, b, argv[i + 2]); 91 | Parts.push_back(p); 92 | i += 2; 93 | } 94 | else 95 | throw runtime_error("Unknown option: " + string(argv[i])); 96 | } 97 | 98 | 99 | log("# Options:"); 100 | for(int i = 0; i < Parts.size(); i++) 101 | { 102 | log("# %d-%d\t'%s'", Parts[i].FeatStart, Parts[i].FeatEnd, Parts[i].VocabPath.c_str()); 103 | } 104 | log("K_nn: %d", K_nn); 105 | log("pos: {XnPos: %d, YnPos: %d, TnPos: %d}", XnPos, YnPos, TnPos); 106 | log("FLANN: {trees: %d, checks: %d}", FlannKdTrees, FlannChecks); 107 | log("Enable second order: %s", DoSigma ? "yes" : "no"); 108 | log("Enable spatio-temporal grids (1x1x1, 1x3x1, 1x1x2): %s", EnableGrids ? "yes" : "no"); 109 | 110 | assert(XnPos != -1); 111 | assert(YnPos != -1); 112 | assert(TnPos != -1); 113 | assert(Parts.size() > 0); 114 | } 115 | }; 116 | 117 | int ReadBlock(float* features, int rows, int cols) 118 | { 119 | const int MAX_LINE_LEN = 10000000; 120 | static char S[MAX_LINE_LEN]; 121 | char sep[] = " \n\t"; 122 | int cnt = 0; 123 | 124 | while(fgets(S, MAX_LINE_LEN - 1, stdin)) 125 | { 126 | char *t = strtok(S, sep); 127 | if(t == NULL || strlen(t) == 0) 128 | break; 129 | 130 | for(int j = 0; t != NULL; j++) 131 | { 132 | *(features + cnt*cols + j) = atof(t); 133 | t = strtok(NULL, sep); 134 | } 135 | 136 | cnt++; 137 | if(cnt == rows) 138 | break; 139 | } 140 | 141 | return cnt; 142 | } 143 | 144 | int main(int argc, char* argv[]) 145 | { 146 | TIMERS.Total.Start(); 147 | Options opts(argc, argv); 148 | setNumThreads(1); 149 | vector& parts = opts.Parts; 150 | 151 | TIMERS.Vocab.Start(); 152 | KDTreeIndexParams ass_indexParams(opts.FlannKdTrees != -1 ? opts.FlannKdTrees : 4); 153 | SearchParams ass_pars(opts.FlannChecks != -1 ? opts.FlannChecks : 32); 154 | 155 | vector vocabs; 156 | vector > indices; 157 | vector spms; 158 | 159 | for(int i = 0; i < parts.size(); i++) 160 | { 161 | Part& p = parts[i]; 162 | GmmVocab vocab(p.VocabPath); 163 | vocabs.push_back(vocab); 164 | indices.push_back(make_shared(vocab.mu, ass_indexParams)); 165 | spms.push_back(SpmFisherVector(opts.EnableGrids, vocab, p, opts.K_nn, opts.DoSigma)); 166 | } 167 | TIMERS.Vocab.Stop(); 168 | log("# Vocab loaded"); 169 | 170 | Mat_ features(1000, 500); 171 | Mat_ assigned(features.rows, opts.K_nn); 172 | Mat_ dists_dummy(features.rows, opts.K_nn); 173 | 174 | int cnt; 175 | while((cnt = ReadBlock(features.ptr(), features.rows, features.cols)) > 0) 176 | { 177 | log("# read block of %d", cnt); 178 | TIMERS.DescriptorCnt += cnt; 179 | 180 | for(int partInd = 0; partInd < parts.size(); partInd++) 181 | { 182 | TIMERS.Copying.Start(); 183 | Mat_ fts = features(Range::all(), Range(parts[partInd].FeatStart, 1 + parts[partInd].FeatEnd)).clone(); 184 | TIMERS.Copying.Stop(); 185 | 186 | TIMERS.FLANN.Start(); 187 | if(opts.FlannKdTrees != -1 && opts.FlannChecks != -1) 188 | { 189 | shared_ptr ass_index = indices[partInd]; 190 | ass_index->knnSearch(fts, assigned, dists_dummy, opts.K_nn, ass_pars); 191 | } 192 | else 193 | { 194 | Mat mu = vocabs[partInd].mu; 195 | knn_full (2, fts.rows, mu.rows, mu.cols, opts.K_nn, mu.ptr(), fts.ptr(), NULL, assigned.ptr(), dists_dummy.ptr()); 196 | } 197 | TIMERS.FLANN.Stop(); 198 | 199 | TIMERS.Assigning.Start(); 200 | for(int i = 0; i < cnt; i++) 201 | { 202 | spms[partInd].Update(features(i, opts.XnPos), features(i, opts.YnPos), features(i, opts.TnPos), fts.ptr(i), assigned.ptr(i)); 203 | } 204 | TIMERS.Assigning.Stop(); 205 | TIMERS.OpCount += cnt; 206 | } 207 | } 208 | 209 | for(int i = 0; i < parts.size(); i++) 210 | { 211 | TIMERS.Assigning.Start(); 212 | spms[i].Done(); 213 | TIMERS.Assigning.Stop(); 214 | 215 | TIMERS.Writing.Start(); 216 | Mat fv = spms[i].FV; 217 | for(int j = 0; j < fv.rows; j++) 218 | { 219 | printf("# %s\n", spms[i].ToString[j].c_str()); 220 | float* v = fv.ptr(j); 221 | for(int k = 0; k < fv.cols; k++) 222 | printf("%.6f ", v[k]); 223 | printf("\n"); 224 | } 225 | TIMERS.Writing.Stop(); 226 | } 227 | 228 | TIMERS.Total.Stop(); 229 | TIMERS.Print(parts); 230 | } 231 | -------------------------------------------------------------------------------- /src/fastvideofeat/Makefile: -------------------------------------------------------------------------------- 1 | # Will link statically with OpenCV, FFmpeg 2 | 3 | CFLAGS = -O3 -D__STDC_CONSTANT_MACROS 4 | LDFLAGS = -lopencv_imgproc -lopencv_core -lswscale -lavdevice -lavformat -lavcodec -lswresample -lavutil -lpthread -lbz2 -lz -lc -lrt 5 | INSTALLED_DEPS = -I../../bin/dependencies/include -L../../bin/dependencies/lib 6 | BIN = ../../bin/fastvideofeat 7 | 8 | all: 9 | g++ main.cpp -o $(BIN) $(CFLAGS) $(LDFLAGS) $(INSTALLED_DEPS) 10 | clean: 11 | rm $(BIN) 12 | -------------------------------------------------------------------------------- /src/fastvideofeat/Makefile.nmake: -------------------------------------------------------------------------------- 1 | OPENCV_DIR = ../../bin/dependencies/opencv/build 2 | FFMPEG_DIR = ../../bin/dependencies/ffmpeg-2.4.5-win64-dev 3 | VC_VERSION = vc12 4 | OPENCV_ARCH = x64 5 | 6 | LIBINCLUDE = /I$(OPENCV_DIR)/include /I$(FFMPEG_DIR)/include /I. 7 | LIBPATH = /LIBPATH:$(OPENCV_DIR)/$(OPENCV_ARCH)/$(VC_VERSION)/staticlib /LIBPATH:$(FFMPEG_DIR)/lib 8 | LIBS = zlib.lib opencv_core249.lib opencv_imgproc249.lib avcodec.lib avformat.lib avutil.lib swscale.lib swresample.lib 9 | BIN = ../../bin/fastvideofeat.exe 10 | 11 | all: 12 | if exist msinttypes.h (rename msinttypes.h inttypes.h) 13 | cl /MT /EHsc $(LIBINCLUDE) main.cpp /link $(LIBS) $(LIBPATH) /OUT:$(BIN) 14 | 15 | clean: 16 | del $(BIN) 17 | -------------------------------------------------------------------------------- /src/fastvideofeat/common.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include "diag.h" 3 | #include 4 | 5 | using namespace cv; 6 | 7 | #ifndef __COMMON_H__ 8 | #define __COMMON_H__ 9 | 10 | Mat InterpolateFrom16to8(Mat src, Size afterInterpolation, double fscale = 1) 11 | { 12 | Mat dst(afterInterpolation, src.type()); 13 | resize(src, dst, dst.size()); 14 | return dst * fscale; 15 | } 16 | 17 | struct Frame 18 | { 19 | Mat_ Dx; 20 | Mat_ Dy; 21 | Mat_ Missing; 22 | Mat RawImage; 23 | int FrameIndex; 24 | int64_t PTS; 25 | bool NoMotionVectors; 26 | char PictType; 27 | 28 | Frame(int frameIndex, Mat dx, Mat dy, Mat missing) 29 | : FrameIndex(frameIndex), Dx(dx), Dy(dy), Missing(missing), NoMotionVectors(false), PTS(-1), PictType('?') 30 | { 31 | } 32 | 33 | Frame(int frameIndex = -1) : FrameIndex(frameIndex), NoMotionVectors(true), PTS(-1), PictType('?') 34 | { 35 | } 36 | 37 | static Frame Null(int frameIndex) 38 | { 39 | return Frame(frameIndex); 40 | } 41 | 42 | void Interpolate(Size afterInterpolation, double fscale) 43 | { 44 | if(!NoMotionVectors) 45 | { 46 | TIMERS.InterpolationHOFMBH.Start(); 47 | Dx = InterpolateFrom16to8(Dx, afterInterpolation, fscale); 48 | Dy = InterpolateFrom16to8(Dy, afterInterpolation, fscale); 49 | TIMERS.InterpolationHOFMBH.Stop(); 50 | } 51 | 52 | if(RawImage.data) 53 | { 54 | TIMERS.InterpolationHOG.Start(); 55 | Mat rawImageResized; 56 | resize(RawImage, rawImageResized, afterInterpolation); 57 | cvtColor(rawImageResized, RawImage, CV_BGR2GRAY); 58 | TIMERS.InterpolationHOG.Stop(); 59 | } 60 | } 61 | }; 62 | 63 | void PrintIntegerArray(Mat& m) 64 | { 65 | int* ptr_m = m.ptr(); 66 | for(int i = 0; i < m.size().area(); i++) 67 | { 68 | printf("%d\t", ptr_m[i]); 69 | } 70 | } 71 | 72 | void PrintFloatArray(Mat& m) 73 | { 74 | float* ptr_m = m.ptr(); 75 | for(int i = 0; i < m.size().area(); i++) 76 | { 77 | printf("%.6f\t", ptr_m[i]); 78 | } 79 | } 80 | 81 | void PrintDoubleArray(Mat& m) 82 | { 83 | double* ptr_m = m.ptr(); 84 | for(int i = 0; i < m.size().area(); i++) 85 | { 86 | printf("%.6lf\t", ptr_m[i]); 87 | } 88 | } 89 | 90 | struct DescInfo 91 | { 92 | int nBins; // number of bins for vector quantization 93 | bool signedGradient; // 0: 180 degree; 1: 360 degree 94 | int norm; // 1: L1 normalization; 2: L2 normalization 95 | float threshold; //threshold for normalization 96 | bool applyThresholding; // whether thresholding or not 97 | int nxCells; // number of cells in x direction 98 | int nyCells; 99 | int ntCells; 100 | int dim; // dimension of the descriptor 101 | int fullDim; 102 | bool enabled; 103 | 104 | DescInfo(int nBins, 105 | bool applyThresholding, 106 | int nt_cell, 107 | bool enabled, 108 | float threshold = 0.16, 109 | bool signedGradient = true, 110 | int nxy_cell = 2): 111 | nBins(nBins), 112 | threshold(threshold), 113 | applyThresholding(applyThresholding), 114 | signedGradient(signedGradient), 115 | nxCells(nxy_cell), 116 | nyCells(nxy_cell), 117 | ntCells(nt_cell), 118 | norm(NORM_L2), 119 | enabled(enabled) 120 | { 121 | dim = nBins*nxCells*nyCells; 122 | fullDim = dim * ntCells; 123 | } 124 | 125 | void ResetPatchDescriptorBuffer(float* res) 126 | { 127 | memset(res, 0, fullDim * sizeof(float)); 128 | } 129 | }; 130 | 131 | #endif 132 | -------------------------------------------------------------------------------- /src/fastvideofeat/diag.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #include "../util.h" 5 | 6 | #ifndef __DIAG_H__ 7 | #define __DIAG_H__ 8 | 9 | struct Diag 10 | { 11 | Timer HogComputation; 12 | Timer HofComputation; 13 | Timer MbhComputation; 14 | Timer InterpolationHOFMBH; 15 | Timer InterpolationHOG; 16 | 17 | Timer DescriptorComputation; 18 | Timer DescriptorQuerying; 19 | 20 | Timer HofQuerying; 21 | Timer MbhQuerying; 22 | Timer HogQuerying; 23 | 24 | Timer Everything; 25 | Timer ReadingAndDecoding; 26 | Timer Writing; 27 | 28 | int CallsComputeDescriptor; 29 | int SkippedFrames; 30 | 31 | Diag() : CallsComputeDescriptor(0), SkippedFrames(0) {} 32 | 33 | void Print(int frameCount) 34 | { 35 | log("Reading (sec): %.2lf", ReadingAndDecoding.TotalInSeconds()); 36 | 37 | log("Interp (sec): {total: %.2lf, HOG: %.2lf, HOFMBH: %.2lf}", 38 | InterpolationHOFMBH.TotalInSeconds() + InterpolationHOG.TotalInSeconds(), 39 | InterpolationHOG.TotalInSeconds(), 40 | InterpolationHOFMBH.TotalInSeconds()); 41 | 42 | log("IntHist (sec): {total: %.2lf, HOG: %.2lf, HOF: %.2lf, MBH: %.2lf}", 43 | DescriptorComputation.TotalInSeconds(), 44 | HogComputation.TotalInSeconds(), 45 | HofComputation.TotalInSeconds(), 46 | MbhComputation.TotalInSeconds()); 47 | 48 | log("Desc (sec): {total: %.2lf, HOG: %.2lf, HOF: %.2lf, MBH: %.2lf}", 49 | DescriptorQuerying.TotalInSeconds(), 50 | HogQuerying.TotalInSeconds(), 51 | HofQuerying.TotalInSeconds(), 52 | MbhQuerying.TotalInSeconds()); 53 | 54 | log("Writing (sec): %.2lf", Writing.TotalInSeconds()); 55 | 56 | double totalWithoutWriting = Everything.TotalInSeconds() - Writing.TotalInSeconds(); 57 | log("Total (sec): %.2lf", totalWithoutWriting); 58 | log("Total (with writing, sec): %.2lf", Everything.TotalInSeconds()); 59 | 60 | log("Fps: %.2lf", frameCount / totalWithoutWriting); 61 | log("Calls.ComputeDescriptor: %d", CallsComputeDescriptor); 62 | log("Frames.Skipped: %d", SkippedFrames); 63 | } 64 | } TIMERS; 65 | 66 | #endif 67 | -------------------------------------------------------------------------------- /src/fastvideofeat/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | #include "../util.h" 9 | #include "video.h" 10 | #include "descriptors.h" 11 | #include "diag.h" 12 | 13 | #include 14 | #include 15 | 16 | using namespace std; 17 | using namespace cv; 18 | 19 | struct Options 20 | { 21 | string VideoPath; 22 | bool HogEnabled, HofEnabled, MbhEnabled; 23 | bool Dense; 24 | bool Interpolation; 25 | 26 | vector GoodPts; 27 | 28 | Options(int argc, char* argv[]) 29 | { 30 | HogEnabled = HofEnabled = MbhEnabled = true; 31 | Dense = false; 32 | Interpolation = true; 33 | for(int i = 1; i < argc; i++) 34 | { 35 | if(strcmp(argv[i], "--disableHOG") == 0) 36 | HogEnabled = false; 37 | else if(strcmp(argv[i], "--disableHOF") == 0) 38 | HofEnabled = false; 39 | else if(strcmp(argv[i], "--disableMBH") == 0) 40 | MbhEnabled = false; 41 | else if(strcmp(argv[i], "-f") == 0) 42 | { 43 | int b, e; 44 | sscanf(argv[i+1], "%d-%d", &b, &e); 45 | for(int j = b; j <= e; j++) 46 | GoodPts.push_back(j); 47 | i++; 48 | } 49 | else 50 | VideoPath = string(argv[i]); 51 | } 52 | 53 | if(!ifstream(VideoPath.c_str()).good()) 54 | throw runtime_error("Video doesn't exist or can't be opened: " + VideoPath); 55 | } 56 | }; 57 | 58 | int main(int argc, char* argv[]) 59 | { 60 | Options opts(argc, argv); 61 | setNumThreads(1); 62 | 63 | const int nt_cell = 3; 64 | const int tStride = 5; 65 | vector patchSizes; 66 | patchSizes.push_back(Size(32, 32)); 67 | patchSizes.push_back(Size(48, 48)); 68 | 69 | DescInfo hofInfo(8+1, true, nt_cell, opts.HofEnabled); 70 | DescInfo mbhInfo(8, false, nt_cell, opts.MbhEnabled); 71 | DescInfo hogInfo(8, false, nt_cell, opts.HogEnabled); 72 | 73 | TIMERS.ReadingAndDecoding.Start(); 74 | FrameReader rdr(opts.VideoPath, hogInfo.enabled); 75 | TIMERS.ReadingAndDecoding.Stop(); 76 | 77 | Size frameSizeAfterInterpolation = 78 | opts.Interpolation 79 | ? Size(2*rdr.DownsampledFrameSize.width - 1, 2*rdr.DownsampledFrameSize.height - 1) 80 | : rdr.DownsampledFrameSize; 81 | int cellSize = rdr.OriginalFrameSize.width / frameSizeAfterInterpolation.width; 82 | double fscale = 1 / 8.0; 83 | 84 | log("Input video: %s", opts.VideoPath.c_str()); 85 | log("Enabled descriptors: {HOG: %s, HOF: %s, MBH: %s}", opts.HogEnabled ? "yes" : "no", opts.HofEnabled ? "yes" : "no", opts.MbhEnabled ? "yes" : "no"); 86 | fprintf(stderr, "Frame restrictions: ["); 87 | for(int i = 0; i < opts.GoodPts.size(); i++) 88 | fprintf(stderr, "%d, ", opts.GoodPts[i]); 89 | log("]"); 90 | log("Frame count: %d", rdr.FrameCount); 91 | log("Original frame size: %dx%d", rdr.OriginalFrameSize.width, rdr.OriginalFrameSize.height); 92 | log("Downsampled: %dx%d", rdr.DownsampledFrameSize.width, rdr.DownsampledFrameSize.height); 93 | log("After interpolation: %dx%d", frameSizeAfterInterpolation.width, frameSizeAfterInterpolation.height); 94 | log("CellSize: %d", cellSize); 95 | 96 | HofMbhBuffer buffer(hogInfo, hofInfo, mbhInfo, nt_cell, tStride, frameSizeAfterInterpolation, fscale, rdr.FrameCount, true); 97 | buffer.PrintFileHeader(); 98 | 99 | TIMERS.Everything.Start(); 100 | Mat prevRawImageGray, currentRawImageGray; 101 | while(true) 102 | { 103 | Frame frame = rdr.Read(); 104 | if(frame.PTS == -1) 105 | break; 106 | 107 | log("# read frame pts=%d, mvs=%s, type=%c", frame.PTS, frame.NoMotionVectors ? "no" : "yes", frame.PictType); 108 | 109 | if(opts.GoodPts.empty() || count(opts.GoodPts.begin(), opts.GoodPts.end(), frame.PTS) == 1) 110 | { 111 | TIMERS.DescriptorComputation.Start(); 112 | 113 | if(frame.NoMotionVectors || (hogInfo.enabled && frame.RawImage.empty())) 114 | { 115 | TIMERS.SkippedFrames++; 116 | continue; 117 | } 118 | 119 | frame.Interpolate(frameSizeAfterInterpolation, fscale); 120 | //buffer.Update(frame, 1 / fscale * 1 / fscale); 121 | buffer.Update(frame, 1); 122 | TIMERS.DescriptorComputation.Stop(); 123 | 124 | if(buffer.AreDescriptorsReady) 125 | { 126 | for(int k = 0; k < patchSizes.size(); k++) 127 | { 128 | int blockWidth = patchSizes[k].width / cellSize; 129 | int blockHeight = patchSizes[k].height / cellSize; 130 | int xStride = opts.Dense ? 1 : blockWidth / 2; 131 | int yStride = opts.Dense ? 1 : blockHeight / 2; 132 | buffer.PrintFullDescriptor(blockWidth, blockHeight, xStride, yStride); 133 | } 134 | } 135 | } 136 | } 137 | TIMERS.Everything.Stop(); 138 | TIMERS.Print(rdr.FrameCount); 139 | } 140 | -------------------------------------------------------------------------------- /src/fastvideofeat/msinttypes.h: -------------------------------------------------------------------------------- 1 | // ISO C9x compliant inttypes.h for Microsoft Visual Studio 2 | // Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 3 | // 4 | // Copyright (c) 2006-2013 Alexander Chemeris 5 | // 6 | // Redistribution and use in source and binary forms, with or without 7 | // modification, are permitted provided that the following conditions are met: 8 | // 9 | // 1. Redistributions of source code must retain the above copyright notice, 10 | // this list of conditions and the following disclaimer. 11 | // 12 | // 2. Redistributions in binary form must reproduce the above copyright 13 | // notice, this list of conditions and the following disclaimer in the 14 | // documentation and/or other materials provided with the distribution. 15 | // 16 | // 3. Neither the name of the product nor the names of its contributors may 17 | // be used to endorse or promote products derived from this software 18 | // without specific prior written permission. 19 | // 20 | // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 21 | // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 22 | // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 23 | // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25 | // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 26 | // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 27 | // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 28 | // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 29 | // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | // 31 | /////////////////////////////////////////////////////////////////////////////// 32 | 33 | #ifndef _MSC_VER // [ 34 | #error "Use this header only with Microsoft Visual C++ compilers!" 35 | #endif // _MSC_VER ] 36 | 37 | #ifndef _MSC_INTTYPES_H_ // [ 38 | #define _MSC_INTTYPES_H_ 39 | 40 | #if _MSC_VER > 1000 41 | #pragma once 42 | #endif 43 | 44 | #include "stdint.h" 45 | 46 | // 7.8 Format conversion of integer types 47 | 48 | typedef struct { 49 | intmax_t quot; 50 | intmax_t rem; 51 | } imaxdiv_t; 52 | 53 | // 7.8.1 Macros for format specifiers 54 | 55 | #if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 56 | 57 | // The fprintf macros for signed integers are: 58 | #define PRId8 "d" 59 | #define PRIi8 "i" 60 | #define PRIdLEAST8 "d" 61 | #define PRIiLEAST8 "i" 62 | #define PRIdFAST8 "d" 63 | #define PRIiFAST8 "i" 64 | 65 | #define PRId16 "hd" 66 | #define PRIi16 "hi" 67 | #define PRIdLEAST16 "hd" 68 | #define PRIiLEAST16 "hi" 69 | #define PRIdFAST16 "hd" 70 | #define PRIiFAST16 "hi" 71 | 72 | #define PRId32 "I32d" 73 | #define PRIi32 "I32i" 74 | #define PRIdLEAST32 "I32d" 75 | #define PRIiLEAST32 "I32i" 76 | #define PRIdFAST32 "I32d" 77 | #define PRIiFAST32 "I32i" 78 | 79 | #define PRId64 "I64d" 80 | #define PRIi64 "I64i" 81 | #define PRIdLEAST64 "I64d" 82 | #define PRIiLEAST64 "I64i" 83 | #define PRIdFAST64 "I64d" 84 | #define PRIiFAST64 "I64i" 85 | 86 | #define PRIdMAX "I64d" 87 | #define PRIiMAX "I64i" 88 | 89 | #define PRIdPTR "Id" 90 | #define PRIiPTR "Ii" 91 | 92 | // The fprintf macros for unsigned integers are: 93 | #define PRIo8 "o" 94 | #define PRIu8 "u" 95 | #define PRIx8 "x" 96 | #define PRIX8 "X" 97 | #define PRIoLEAST8 "o" 98 | #define PRIuLEAST8 "u" 99 | #define PRIxLEAST8 "x" 100 | #define PRIXLEAST8 "X" 101 | #define PRIoFAST8 "o" 102 | #define PRIuFAST8 "u" 103 | #define PRIxFAST8 "x" 104 | #define PRIXFAST8 "X" 105 | 106 | #define PRIo16 "ho" 107 | #define PRIu16 "hu" 108 | #define PRIx16 "hx" 109 | #define PRIX16 "hX" 110 | #define PRIoLEAST16 "ho" 111 | #define PRIuLEAST16 "hu" 112 | #define PRIxLEAST16 "hx" 113 | #define PRIXLEAST16 "hX" 114 | #define PRIoFAST16 "ho" 115 | #define PRIuFAST16 "hu" 116 | #define PRIxFAST16 "hx" 117 | #define PRIXFAST16 "hX" 118 | 119 | #define PRIo32 "I32o" 120 | #define PRIu32 "I32u" 121 | #define PRIx32 "I32x" 122 | #define PRIX32 "I32X" 123 | #define PRIoLEAST32 "I32o" 124 | #define PRIuLEAST32 "I32u" 125 | #define PRIxLEAST32 "I32x" 126 | #define PRIXLEAST32 "I32X" 127 | #define PRIoFAST32 "I32o" 128 | #define PRIuFAST32 "I32u" 129 | #define PRIxFAST32 "I32x" 130 | #define PRIXFAST32 "I32X" 131 | 132 | #define PRIo64 "I64o" 133 | #define PRIu64 "I64u" 134 | #define PRIx64 "I64x" 135 | #define PRIX64 "I64X" 136 | #define PRIoLEAST64 "I64o" 137 | #define PRIuLEAST64 "I64u" 138 | #define PRIxLEAST64 "I64x" 139 | #define PRIXLEAST64 "I64X" 140 | #define PRIoFAST64 "I64o" 141 | #define PRIuFAST64 "I64u" 142 | #define PRIxFAST64 "I64x" 143 | #define PRIXFAST64 "I64X" 144 | 145 | #define PRIoMAX "I64o" 146 | #define PRIuMAX "I64u" 147 | #define PRIxMAX "I64x" 148 | #define PRIXMAX "I64X" 149 | 150 | #define PRIoPTR "Io" 151 | #define PRIuPTR "Iu" 152 | #define PRIxPTR "Ix" 153 | #define PRIXPTR "IX" 154 | 155 | // The fscanf macros for signed integers are: 156 | #define SCNd8 "d" 157 | #define SCNi8 "i" 158 | #define SCNdLEAST8 "d" 159 | #define SCNiLEAST8 "i" 160 | #define SCNdFAST8 "d" 161 | #define SCNiFAST8 "i" 162 | 163 | #define SCNd16 "hd" 164 | #define SCNi16 "hi" 165 | #define SCNdLEAST16 "hd" 166 | #define SCNiLEAST16 "hi" 167 | #define SCNdFAST16 "hd" 168 | #define SCNiFAST16 "hi" 169 | 170 | #define SCNd32 "ld" 171 | #define SCNi32 "li" 172 | #define SCNdLEAST32 "ld" 173 | #define SCNiLEAST32 "li" 174 | #define SCNdFAST32 "ld" 175 | #define SCNiFAST32 "li" 176 | 177 | #define SCNd64 "I64d" 178 | #define SCNi64 "I64i" 179 | #define SCNdLEAST64 "I64d" 180 | #define SCNiLEAST64 "I64i" 181 | #define SCNdFAST64 "I64d" 182 | #define SCNiFAST64 "I64i" 183 | 184 | #define SCNdMAX "I64d" 185 | #define SCNiMAX "I64i" 186 | 187 | #ifdef _WIN64 // [ 188 | # define SCNdPTR "I64d" 189 | # define SCNiPTR "I64i" 190 | #else // _WIN64 ][ 191 | # define SCNdPTR "ld" 192 | # define SCNiPTR "li" 193 | #endif // _WIN64 ] 194 | 195 | // The fscanf macros for unsigned integers are: 196 | #define SCNo8 "o" 197 | #define SCNu8 "u" 198 | #define SCNx8 "x" 199 | #define SCNX8 "X" 200 | #define SCNoLEAST8 "o" 201 | #define SCNuLEAST8 "u" 202 | #define SCNxLEAST8 "x" 203 | #define SCNXLEAST8 "X" 204 | #define SCNoFAST8 "o" 205 | #define SCNuFAST8 "u" 206 | #define SCNxFAST8 "x" 207 | #define SCNXFAST8 "X" 208 | 209 | #define SCNo16 "ho" 210 | #define SCNu16 "hu" 211 | #define SCNx16 "hx" 212 | #define SCNX16 "hX" 213 | #define SCNoLEAST16 "ho" 214 | #define SCNuLEAST16 "hu" 215 | #define SCNxLEAST16 "hx" 216 | #define SCNXLEAST16 "hX" 217 | #define SCNoFAST16 "ho" 218 | #define SCNuFAST16 "hu" 219 | #define SCNxFAST16 "hx" 220 | #define SCNXFAST16 "hX" 221 | 222 | #define SCNo32 "lo" 223 | #define SCNu32 "lu" 224 | #define SCNx32 "lx" 225 | #define SCNX32 "lX" 226 | #define SCNoLEAST32 "lo" 227 | #define SCNuLEAST32 "lu" 228 | #define SCNxLEAST32 "lx" 229 | #define SCNXLEAST32 "lX" 230 | #define SCNoFAST32 "lo" 231 | #define SCNuFAST32 "lu" 232 | #define SCNxFAST32 "lx" 233 | #define SCNXFAST32 "lX" 234 | 235 | #define SCNo64 "I64o" 236 | #define SCNu64 "I64u" 237 | #define SCNx64 "I64x" 238 | #define SCNX64 "I64X" 239 | #define SCNoLEAST64 "I64o" 240 | #define SCNuLEAST64 "I64u" 241 | #define SCNxLEAST64 "I64x" 242 | #define SCNXLEAST64 "I64X" 243 | #define SCNoFAST64 "I64o" 244 | #define SCNuFAST64 "I64u" 245 | #define SCNxFAST64 "I64x" 246 | #define SCNXFAST64 "I64X" 247 | 248 | #define SCNoMAX "I64o" 249 | #define SCNuMAX "I64u" 250 | #define SCNxMAX "I64x" 251 | #define SCNXMAX "I64X" 252 | 253 | #ifdef _WIN64 // [ 254 | # define SCNoPTR "I64o" 255 | # define SCNuPTR "I64u" 256 | # define SCNxPTR "I64x" 257 | # define SCNXPTR "I64X" 258 | #else // _WIN64 ][ 259 | # define SCNoPTR "lo" 260 | # define SCNuPTR "lu" 261 | # define SCNxPTR "lx" 262 | # define SCNXPTR "lX" 263 | #endif // _WIN64 ] 264 | 265 | #endif // __STDC_FORMAT_MACROS ] 266 | 267 | // 7.8.2 Functions for greatest-width integer types 268 | 269 | // 7.8.2.1 The imaxabs function 270 | #define imaxabs _abs64 271 | 272 | // 7.8.2.2 The imaxdiv function 273 | 274 | // This is modified version of div() function from Microsoft's div.c found 275 | // in %MSVC.NET%\crt\src\div.c 276 | #ifdef STATIC_IMAXDIV // [ 277 | static 278 | #else // STATIC_IMAXDIV ][ 279 | _inline 280 | #endif // STATIC_IMAXDIV ] 281 | imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) 282 | { 283 | imaxdiv_t result; 284 | 285 | result.quot = numer / denom; 286 | result.rem = numer % denom; 287 | 288 | if (numer < 0 && result.rem > 0) { 289 | // did division wrong; must fix up 290 | ++result.quot; 291 | result.rem -= denom; 292 | } 293 | 294 | return result; 295 | } 296 | 297 | // 7.8.2.3 The strtoimax and strtoumax functions 298 | #define strtoimax _strtoi64 299 | #define strtoumax _strtoui64 300 | 301 | // 7.8.2.4 The wcstoimax and wcstoumax functions 302 | #define wcstoimax _wcstoi64 303 | #define wcstoumax _wcstoui64 304 | 305 | 306 | #endif // _MSC_INTTYPES_H_ ] 307 | -------------------------------------------------------------------------------- /src/fastvideofeat/video.h: -------------------------------------------------------------------------------- 1 | #ifdef _MSC_VER 2 | #include "inttypes.h" 3 | #endif 4 | 5 | #include 6 | 7 | extern "C" 8 | { 9 | #include 10 | #include 11 | #include 12 | #include 13 | } 14 | 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include "common.h" 21 | #include "diag.h" 22 | #include 23 | 24 | using namespace std; 25 | using namespace cv; 26 | 27 | #ifndef __FRAME_READER_H__ 28 | #define __FRAME_READER_H__ 29 | 30 | struct MotionVector 31 | { 32 | int X,Y; 33 | float Dx,Dy; 34 | 35 | int Mx, My; 36 | char TypeCode, SegmCode; 37 | 38 | static const int NO_MV = -10000; 39 | 40 | bool NoMotionVector() 41 | { 42 | return (Dx == NO_MV && Dy == NO_MV) || (Dx == -NO_MV && Dy == -NO_MV); 43 | } 44 | 45 | bool IsIntra() 46 | { 47 | return TypeCode == 'P' || TypeCode == 'A' || TypeCode == 'i' || TypeCode == 'I'; 48 | } 49 | }; 50 | 51 | struct FrameReader 52 | { 53 | static const int gridStep = 16; 54 | Size DownsampledFrameSize; 55 | Size OriginalFrameSize; 56 | int FrameCount; 57 | int frameIndex; 58 | int64_t prev_pts; 59 | bool ReadRawImages; 60 | 61 | AVFrame *pFrame; 62 | AVFormatContext *pFormatCtx; 63 | SwsContext *img_convert_ctx; 64 | AVStream *video_st; 65 | AVIOContext *pAvioContext; 66 | uint8_t *pAvio_buffer; 67 | FILE* in; 68 | AVFrame rgb_picture; 69 | int videoStream; 70 | 71 | void print_ffmpeg_error(int err) // copied from cmdutils.c 72 | { 73 | char errbuf[128]; 74 | const char *errbuf_ptr = errbuf; 75 | 76 | if (av_strerror(err, errbuf, sizeof(errbuf)) < 0) 77 | errbuf_ptr = strerror(AVUNERROR(err)); 78 | av_log(NULL, AV_LOG_ERROR, "print_ffmpeg_error: %s\n", errbuf_ptr); 79 | } 80 | 81 | FrameReader(string videoPath, bool readRawImages) 82 | { 83 | ReadRawImages = readRawImages; 84 | pAvioContext = NULL; 85 | pAvio_buffer = NULL; 86 | in = NULL; 87 | frameIndex = 1; 88 | videoStream = -1; 89 | pFormatCtx = avformat_alloc_context(); 90 | 91 | av_register_all(); 92 | 93 | int err = 0; 94 | 95 | if ((err = avformat_open_input(&pFormatCtx, videoPath.c_str(), NULL, NULL)) != 0) 96 | { 97 | print_ffmpeg_error(err); 98 | throw std::runtime_error("Couldn't open file"); 99 | } 100 | 101 | if ((err = avformat_find_stream_info(pFormatCtx, NULL)) < 0) 102 | { 103 | print_ffmpeg_error(err); 104 | throw std::runtime_error("Stream information not found"); 105 | } 106 | 107 | for(int i = 0; i < pFormatCtx->nb_streams; i++) 108 | { 109 | AVCodecContext *enc = pFormatCtx->streams[i]->codec; 110 | if( AVMEDIA_TYPE_VIDEO == enc->codec_type && videoStream < 0) 111 | { 112 | // don't care FF_DEBUG_VIS_MV_B_BACK 113 | //enc->debug_mv = FF_DEBUG_VIS_MV_P_FOR | FF_DEBUG_VIS_MV_B_FOR; 114 | //enc->debug |= FF_DEBUG_DCT_COEFF; 115 | 116 | AVCodec *pCodec = avcodec_find_decoder(enc->codec_id); 117 | 118 | //if (pCodec->capabilities & CODEC_CAP_TRUNCATED) 119 | // pCodecCtx->flags |= CODEC_FLAG_TRUNCATED; 120 | AVDictionary *opts = NULL; 121 | av_dict_set(&opts, "flags2", "+export_mvs", 0); 122 | if (!pCodec || avcodec_open2(enc, pCodec, &opts) < 0) 123 | throw std::runtime_error("Codec not found or cannot open codec"); 124 | 125 | videoStream = i; 126 | video_st = pFormatCtx->streams[i]; 127 | //pFrame = avcodec_alloc_frame(); 128 | pFrame = av_frame_alloc(); 129 | 130 | int cols = enc->width; 131 | int rows = enc->height; 132 | 133 | FrameCount = video_st->nb_frames; 134 | if(FrameCount == 0) 135 | { 136 | double frameScale = av_q2d (video_st->time_base) * av_q2d (video_st->r_frame_rate); 137 | FrameCount = (double)video_st->duration * frameScale; 138 | } 139 | 140 | DownsampledFrameSize = Size(cols / gridStep, rows / gridStep); 141 | OriginalFrameSize = Size(cols, rows); 142 | 143 | PixelFormat target = PIX_FMT_BGR24; 144 | img_convert_ctx = sws_getContext(video_st->codec->width, 145 | video_st->codec->height, 146 | video_st->codec->pix_fmt, 147 | video_st->codec->width, 148 | video_st->codec->height, 149 | target, 150 | SWS_BICUBIC, 151 | NULL, NULL, NULL); 152 | 153 | avpicture_fill( (AVPicture*)&rgb_picture, NULL, 154 | target, cols, rows ); 155 | 156 | //av_log_set_level(AV_LOG_QUIET); 157 | //av_log_set_callback(av_null_log_callback); 158 | break; 159 | } 160 | } 161 | if(videoStream == -1) 162 | throw std::runtime_error("Video stream not found"); 163 | } 164 | 165 | bool GetNextFrame() 166 | { 167 | static bool initialized = false; 168 | static AVPacket pkt, pktCopy; 169 | 170 | while(true) 171 | { 172 | if(initialized) 173 | { 174 | if(process_frame(&pktCopy)) 175 | return true; 176 | else 177 | { 178 | av_free_packet(&pkt); 179 | initialized = false; 180 | } 181 | } 182 | 183 | int ret = av_read_frame(pFormatCtx, &pkt); 184 | if(ret != 0) 185 | break; 186 | 187 | initialized = true; 188 | pktCopy = pkt; 189 | if(pkt.stream_index != videoStream ) 190 | { 191 | av_free_packet(&pkt); 192 | initialized = false; 193 | continue; 194 | } 195 | } 196 | 197 | return process_frame(&pkt); 198 | } 199 | 200 | 201 | bool process_frame(AVPacket *pkt) 202 | { 203 | av_frame_unref(pFrame); 204 | 205 | int got_frame = 0; 206 | int ret = avcodec_decode_video2(video_st->codec, pFrame, &got_frame, pkt); 207 | if (ret < 0) 208 | return false; 209 | 210 | ret = FFMIN(ret, pkt->size); /* guard against bogus return values */ 211 | pkt->data += ret; 212 | pkt->size -= ret; 213 | return got_frame > 0; 214 | } 215 | 216 | void PutMotionVectorInMatrix(MotionVector& mv, Frame& f) 217 | { 218 | int i_16 = mv.Y / gridStep; 219 | int j_16 = mv.X / gridStep; 220 | 221 | i_16 = max(0, min(i_16, DownsampledFrameSize.height-1)); 222 | j_16 = max(0, min(j_16, DownsampledFrameSize.width-1)); 223 | 224 | if(mv.NoMotionVector()) 225 | { 226 | f.Missing(i_16,j_16) = true; 227 | } 228 | else 229 | { 230 | f.Dx(i_16, j_16) = mv.Dx; 231 | f.Dy(i_16, j_16) = mv.Dy; 232 | } 233 | } 234 | 235 | void InitMotionVector(MotionVector& mv, int sx, int sy, int dx, int dy) 236 | { 237 | //inverting vectors to match optical flow directions 238 | dx = -dx; 239 | dy = -dy; 240 | 241 | mv.X = sx; 242 | mv.Y = sy; 243 | mv.Dx = dx; 244 | mv.Dy = dy; 245 | mv.Mx = -1; 246 | mv.My = -1; 247 | mv.TypeCode = '?'; 248 | mv.SegmCode = '?'; 249 | } 250 | 251 | void ReadMotionVectors(Frame& f) 252 | { 253 | // reading motion vectors, see ff_print_debug_info2 in ffmpeg's libavcodec/mpegvideo.c for reference and a fresh doc/examples/extract_mvs.c 254 | AVFrameSideData* sd = av_frame_get_side_data(pFrame, AV_FRAME_DATA_MOTION_VECTORS); 255 | 256 | AVMotionVector* mvs = (AVMotionVector*)sd->data; 257 | int mbcount = sd->size / sizeof(AVMotionVector); 258 | MotionVector mv; 259 | for(int i = 0; i < mbcount; i++) 260 | { 261 | AVMotionVector& mb = mvs[i]; 262 | InitMotionVector(mv, mb.src_x, mb.src_y, mb.dst_x - mb.src_x, mb.dst_y - mb.src_y); 263 | PutMotionVectorInMatrix(mv, f); 264 | } 265 | } 266 | 267 | void ReadRawImage(Frame& res) 268 | { 269 | rgb_picture.data[0] = res.RawImage.ptr(); 270 | sws_scale(img_convert_ctx, pFrame->data, 271 | pFrame->linesize, 0, 272 | video_st->codec->height, 273 | rgb_picture.data, rgb_picture.linesize); 274 | } 275 | 276 | Frame Read() 277 | { 278 | TIMERS.ReadingAndDecoding.Start(); 279 | Frame res(frameIndex, Mat_::zeros(DownsampledFrameSize), Mat_::zeros(DownsampledFrameSize), Mat_::zeros(DownsampledFrameSize)); 280 | res.RawImage = Mat(OriginalFrameSize, CV_8UC3); 281 | 282 | bool read = GetNextFrame(); 283 | if(read) 284 | { 285 | res.NoMotionVectors = av_frame_get_side_data(pFrame, AV_FRAME_DATA_MOTION_VECTORS) == NULL; 286 | res.PictType = av_get_picture_type_char(pFrame->pict_type); 287 | //fragile, consult fresh f_select.c and ffprobe.c when updating ffmpeg 288 | res.PTS = pFrame->pkt_pts != AV_NOPTS_VALUE ? pFrame->pkt_pts : (pFrame->pkt_dts != AV_NOPTS_VALUE ? pFrame->pkt_dts : prev_pts + 1); 289 | prev_pts = res.PTS; 290 | if(!res.NoMotionVectors) 291 | ReadMotionVectors(res); 292 | if(ReadRawImages) 293 | ReadRawImage(res); 294 | } 295 | else 296 | { 297 | res = Frame(res.FrameIndex); 298 | res.PTS = -1; 299 | } 300 | 301 | TIMERS.ReadingAndDecoding.Stop(); 302 | 303 | frameIndex++; 304 | return res; 305 | } 306 | 307 | ~FrameReader() 308 | { 309 | //causes double free error. av_free(pFrame); 310 | //sws_freeContext(img_convert_ctx); 311 | /*avcodec_close(video_st->codec); 312 | av_close_input_file(pFormatCtx);*/ 313 | /*if(pAvio_buffer) 314 | av_free(pAvio_buffer);*/ 315 | /*if(pAvioContext) 316 | av_free(pAvioContext);*/ 317 | if(in) 318 | fclose(in); 319 | } 320 | }; 321 | 322 | #endif 323 | -------------------------------------------------------------------------------- /src/gmm_train.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | 3 | import sys 4 | import argparse 5 | import numpy as np 6 | import yael 7 | 8 | parser = argparse.ArgumentParser() 9 | parser.add_argument('--gmm_ncomponents', type = int, required = True) 10 | parser.add_argument('--vocab', nargs = 2, required = True) 11 | args = parser.parse_args() 12 | cutFrom, cutTo = map(int, args.vocab[0].split('-')) 13 | 14 | data = np.loadtxt(sys.stdin, dtype = np.float32, usecols = range(cutFrom, 1 + cutTo)) 15 | 16 | npoints, nfeatures = data.shape 17 | niter = 50 18 | nthreads = 1 19 | seed = 0 20 | redo = 1 21 | flags = yael.GMM_FLAGS_W 22 | gmm = yael.gmm_learn(nfeatures, npoints, args.gmm_ncomponents, niter, yael.FloatArray.acquirepointer(yael.numpy_to_fvec(data)), nthreads, seed, redo, flags) 23 | 24 | yael.gmm_write(gmm, open(args.vocab[1], 'w')) 25 | -------------------------------------------------------------------------------- /src/util.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | #ifndef __UTIL_H__ 7 | #define __UTIL_H__ 8 | 9 | 10 | struct Timer 11 | { 12 | clock_t before; 13 | clock_t total; 14 | 15 | Timer() : before(0), total(0) {} 16 | void Start() 17 | { 18 | before = clock(); 19 | } 20 | 21 | void Stop() 22 | { 23 | total += clock() - before; 24 | } 25 | 26 | double TotalInSeconds() 27 | { 28 | return double(total) / CLOCKS_PER_SEC; 29 | } 30 | 31 | double TotalInMilliseconds() 32 | { 33 | double CLOCKS_PER_MSEC = CLOCKS_PER_SEC / 1000.0; 34 | return double(total) / CLOCKS_PER_MSEC; 35 | } 36 | }; 37 | 38 | void log(const char* fmt, ...) 39 | { 40 | FILE* out = stderr; 41 | va_list argp; 42 | va_start(argp, fmt); 43 | vfprintf(out, fmt, argp); 44 | va_end(argp); 45 | fprintf(out, "\n"); 46 | fflush(out); 47 | } 48 | 49 | #endif 50 | -------------------------------------------------------------------------------- /website/deploy.sh: -------------------------------------------------------------------------------- 1 | scp index.html preview_small.png teaser.jpg di.ens.fr:/users/thetis/willow/www/research/fastvideofeat 2 | -------------------------------------------------------------------------------- /website/preview_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/website/preview_small.png -------------------------------------------------------------------------------- /website/teaser.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vadimkantorov/fastvideofeat/4547157ed61e528e571ca5c5c74f249e460b33b4/website/teaser.jpg --------------------------------------------------------------------------------