SiftGPU: A GPU Implementation of Scale Invariant Feature Transform (SIFT) 

Changchang Wu

University of North Carolina at Chapel Hill

V320 released on (12/15/08)

SIFT Implementation

SiftGPU is an implementation of SIFT [1] for GPU. Basically, GPU shaders are used in Gaussian pyramid construction, DoG keypoint detection and descriptor generation.  Not only does SiftGPU process pixels and features paralelly with GPU, this implementation also builds compact feature list by using GPU reduction [3], which changes the per-pixel processing to per-feature processing and reduces readback time. 

SiftGPU is inspired by Andrea Vedaldi's sift++[2] and Sudipta N Sinha et al's GPU-SIFT[4] . Many parameters of sift++ ( for example, number of octaves, number of DOG levels, edge threshold, etc) are also available in SiftGPU.

SiftGPU uses CG shaders to program GPUs. The shader programs are dynamically generated according to the parameters user specified. A working GLSL version  is also available in the package.

A cg-based sift matcher, SiftMatchGPU, is included in this code package. It multiplies the descriptor matrix on GPU and find the closest feature matches. The guided matching using homoraphy/fundamental matrix is also supported. 

 

Requirements

The entire functionality works fully only on hardware that supports cg profile fp40/vp40 or higher, for example, nvidia 7900, 8800. If your GPU does not support fp40/vp40, orientation computation of SIFT will be simplified, edge elimination will be ignored, and descriptor will be ignored.


SiftGPU uses CG (1.5 or higher), DevIL Image Library, GLEW and GLUT. You'll need to make sure that your system has all the dependening libraries. SiftGPU should be able to run on any operation system that supports the above libraries VC6 workspace and VS2005 solution are provided as VC\SiftGPU.dsw and VC\SiftGPU.sln .

Linux makefile is in folder Linux of the package and Xcode project is in folder Mac of the package

NOTE: To update the depending libaries, you'll need to update the header files in SiftGPU\Include\, and the windows libraries in SiftGPU\SiftGPU\Lib and SiftGPU\TestWin\Lib.

Download

The whole package SiftGPU-V320.zip (5.9MB; Including code, manual, windows binary and some test images)

Example of using siftgpu is in file SiftGPU\TestWin\src\SimpleSIFT.cpp. A complete list of changes in all previous version can be found here, and old versions of siftgpu can be found  through this link.

What's New in V319-V320
2.Fixed two bugs in texure allocation for procesing images with varying sizes.
1.Fixed a bug in processing user-specified keypoints on new images

List of improvements and new features of SiftGPU in V311-V318
9. Added function to specifiy float image data to siftgpu
8. Changed interface to handle keypoint list with UNKNOWN orientations

7. Added guided sift matching using homography or/and fundamental matrix
6. Added a cg-based sift matching implementation, check  example #7 in manual . (Thanks to Zach)
5. Added function to compute descriptors for user-specified keypoints, check  example #6 in manual .
4. Included xcode project and Mac makefile(Thanks to Perfanov and Wittenhagen)

3. Finished the GLSL implementation of SIFT (use -glsl to turn it on. not tested on ATI yet ).
2. Improved speed by %50 faster compared with V293. Look here for experiment details and explanations
1. Improved accuracy after fixing a bug in descriptor computation. Look at the evaluation below.

                                You might also be interest in SiftGPU in Matlab ported by Adam Chapman

Evaluation

Below is the comparision with Lowe's SIFT on box.pgm using the comparision code from Vedaldi's SIFT .

Below are some of our speed experiment results on V311.  More complete experiment results can be found here. (The experiment images of different sizes are all resized from this image)

The experiment below is the comparision of the new version and the old version.

 

References

[1]   D. G. Lowe. Distinctive image features from scale-invariant keypoints . International Journal of Computer Vision,  November 2004.
[2]   A. Vedaldi. sift++,   
http://vision.ucla.edu/~vedaldi/code/siftpp/siftpp.html .
[3]   G. Ziegler, et al. GPU point list generation through histogram pyramids. In Technical Report, June 2006.

[4]   Sudipta N Sinha, Jan-Michael Frahm, Marc Pollefeys and Yakup Genc, "GPU-Based Video Feature Tracking and Matching ",
        EDGE 2006, workshop on Edge Computing Using New Commodity Architectures, Chapel Hill, May 2006