All Projects → alicevision → Popsift

alicevision / Popsift

Licence: mpl-2.0
PopSift is an implementation of the SIFT algorithm in CUDA.

Projects that are alternatives of or similar to Popsift

Caer
High-performance Vision library in Python. Scale your research, not boilerplate.
Stars: ✭ 452 (+74.52%)
Mutual labels:  gpu, image-processing, cuda
FLAMEGPU2
FLAME GPU 2 is a GPU accelerated agent based modelling framework for C++ and Python
Stars: ✭ 25 (-90.35%)
Mutual labels:  gpu, cuda
LuisaRender
High-Performance Multiple-Backend Renderer Based on LuisaCompute
Stars: ✭ 47 (-81.85%)
Mutual labels:  gpu, cuda
PbfVs
Implementation of Macklin, Miles, and Matthias Müller. "Position based fluids.". Visual Studio 2015 + CUDA 8.0
Stars: ✭ 100 (-61.39%)
Mutual labels:  gpu, cuda
gpu-monitor
Script to remotely check GPU servers for free GPUs
Stars: ✭ 85 (-67.18%)
Mutual labels:  gpu, cuda
bifrost
A stream processing framework for high-throughput applications.
Stars: ✭ 48 (-81.47%)
Mutual labels:  gpu, cuda
Fat-Clouds
GPU Fluid Simulation with Volumetric Rendering
Stars: ✭ 81 (-68.73%)
Mutual labels:  gpu, cuda
FGPU
No description or website provided.
Stars: ✭ 30 (-88.42%)
Mutual labels:  gpu, cuda
MatX
An efficient C++17 GPU numerical computing library with Python-like syntax
Stars: ✭ 418 (+61.39%)
Mutual labels:  gpu, cuda
lbvh
an implementation of parallel linear BVH (LBVH) on GPU
Stars: ✭ 67 (-74.13%)
Mutual labels:  gpu, cuda
QPT
[内测中]前向式Python环境快捷封装工具,快速将Python打包为EXE并添加CUDA、NoAVX等支持。
Stars: ✭ 308 (+18.92%)
Mutual labels:  gpu, cuda
briefmatch
BriefMatch real-time GPU optical flow
Stars: ✭ 36 (-86.1%)
Mutual labels:  gpu, cuda
gpubootcamp
This repository consists for gpu bootcamp material for HPC and AI
Stars: ✭ 227 (-12.36%)
Mutual labels:  gpu, cuda
monolish
monolish: MONOlithic LInear equation Solvers for Highly-parallel architecture
Stars: ✭ 166 (-35.91%)
Mutual labels:  gpu, cuda
peakperf
Achieve peak performance on x86 CPUs and NVIDIA GPUs
Stars: ✭ 33 (-87.26%)
Mutual labels:  gpu, cuda
cuda memtest
Fork of CUDA GPU memtest 👓
Stars: ✭ 68 (-73.75%)
Mutual labels:  gpu, cuda
hipacc
A domain-specific language and compiler for image processing
Stars: ✭ 72 (-72.2%)
Mutual labels:  gpu, cuda
Plotoptix
Data visualisation in Python based on OptiX 7.2 ray tracing framework.
Stars: ✭ 252 (-2.7%)
Mutual labels:  gpu, cuda
allgebra
Base container for developing C++ and Fortran HPC applications
Stars: ✭ 14 (-94.59%)
Mutual labels:  gpu, cuda
warp
continuous energy monte carlo neutron transport in general geometries on GPUs
Stars: ✭ 27 (-89.58%)
Mutual labels:  gpu, cuda

PopSift

CII Best Practices Codacy Badge

PopSift is an open-source implementation of the SIFT algorithm in CUDA. PopSift tries to stick as closely as possible to David Lowe's famous paper [1], while extracting features from an image in real-time at least on an NVidia GTX 980 Ti GPU.

HW requirements

PopSift compiles and works with NVidia cards of compute capability >= 3.0 (including the GT 650M), but the code is developed with the compute capability 5.2 card GTX 980 Ti in mind.

CUDA SDK 11 does no longer support compute capability 3.0. 3.5 is still supported with deprecation warning.

Dependencies

PopSift depends on:

  • Host compiler that supports C++14 for CUDA SDK >= 9.0 and C++11 for CUDA SDK 8

  • CUDA >= 8.0

Optionally, for the provided applications:

  • Boost >= 1.55 (required components {atomic, chrono, date-time, system, thread}-dev)

  • DevIL (libdevil-dev) can be used to load a broader range of image formats, otherwise only pgm is supported.

Build

In order to build the library you can run:

mkdir build && cd build
cmake ..
make
make install

Some build options are available:

  • PopSift_BUILD_EXAMPLES (default: ON) enable building the applications that showcase the use of the library.

  • BUILD_SHARED_LIBS (default: ON) controls the type of library to build (ON for shared libraries, OFF for static)

Continuous integration:

  • Build Status master branch.
  • Build Status develop branch.
  • Build status develop branch.

Usage

The main artifact created is libpopsift. If enabled, the test application popsift-demo is created as well. Calling popsift-demo without parameters shows the options.

Using PopSift as third party

To integrate PopSift into other software, link with libpopsift. If your are using CMake for building your project you can easily add PopSift to your project. Once you have built and installed PopSift in a directory (say, <prefix>), in your CMakeLists.txt file just add the dependency

# Find the package from the PopSiftConfig.cmake
# in <prefix>/lib/cmake/PopSift/. Under the namespace PopSift::
# it exposes the target popsift that allows you to compile
# and link with the library
find_package(PopSift CONFIG REQUIRED)
...
# suppose you want to try it out in a executable
add_executable(poptest yourfile.cpp)
# add link to the library
target_link_libraries(poptest PUBLIC PopSift::popsift)

Then, in order to build just pass the location of PopSiftConfig.cmake from the cmake command line:

cmake .. -DPopSift_DIR=<prefix>/lib/cmake/PopSift/

Calling the API

The caller must create a popart::Config struct (documented in src/sift/sift_conf.h) to control the behaviour of the PopSift, and instantiate an object of class PopSift (found in src/sift/popsift.h).

After this, images can be enqueued for SIFT extraction using (enqueue()). A valid input is a single plane of grayscale values located in host memory. They can passed as a pointer to unsigned char, with a value range from 0 to 255, or as a pointer to float, with a value range from 0.0f to 1.0f.

Only host memory limits the number of images that can be enqueued. The enqueue function returns a pointer to a SiftJob immediately and performs the feature extraction asynchronously. The memory of the image passed to enqueue remains the caller's responsibility. Calling SiftJob::get on the returned job blocks until features are extracted, and returns them.

Features offer iterators that iterate over objects of type Feature. Both classes are documented in sift_extremum.h. Each feature represents a feature point in the coordinate system of the input image, providing X and Y coordinates and scale (sigma), as well as several alternative descriptors for the feature point (according to Lowe, 15% of the feature points should be expected to have 2 or more descriptors).

In an alternate, deprecated, blocking API, init() must be called to pass image width and height to PopSift, followed by a call to executed() that takes image data and returns the extracted features. execute() is synchronous and blocking.

As far as we know, no implementation that is faster than PopSift at the time of PopSift's release comes under a license that allows commercial use and sticks close to the original paper at the same time as well. PopSift can be configured at runtime to use constants that affect it behaviours. In particular, users can choose to generate results very similar to VLFeat or results that are closer (but not as close) to the SIFT implementation of the OpenCV extras. We acknowledge that there is at least one SIFT implementation that is vastly faster, but it makes considerable sacrifices in terms of accuracy and compatibility.

License

PopSift is licensed under MPL v2 license. SIFT was patented in the United States from 1999-03-08 to 2020-03-28. See the patent link for more information. PopSift license only concerns the PopSift source code and does not release users of this code from any requirements that may arise from patents.

Cite Us

If you use PopSift for your publication, please cite us as:

@inproceedings{Griwodz2018Popsift,
	 author = {Griwodz, Carsten and Calvet, Lilian and Halvorsen, P{\aa}l},
	 title = {Popsift: A Faithful SIFT Implementation for Real-time Applications},
	 booktitle = {Proceedings of the 9th {ACM} Multimedia Systems Conference},
	 series = {MMSys '18},
	 year = {2018},
	 isbn = {978-1-4503-5192-8},
	 location = {Amsterdam, Netherlands},
	 pages = {415--420},
	 numpages = {6},
	 doi = {10.1145/3204949.3208136},
	 acmid = {3208136},
	 publisher = {ACM},
	 address = {New York, NY, USA},
}

Acknowledgements

PopSift was developed within the project POPART, which has been funded by the European Commission in the Horizon 2020 framework.


[1]: Lowe, D. G. (2004). Distinctive Image Features from Scale-Invariant Keypoints. International Journal of Computer Vision, 60(2), 91–110. doi:10.1023/B:VISI.0000029664.99615.94

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].