1 // Copyright (c) 2018, ETH Zurich and UNC Chapel Hill. 2 // All rights reserved. 3 // 4 // Redistribution and use in source and binary forms, with or without 5 // modification, are permitted provided that the following conditions are met: 6 // 7 // * Redistributions of source code must retain the above copyright 8 // notice, this list of conditions and the following disclaimer. 9 // 10 // * Redistributions in binary form must reproduce the above copyright 11 // notice, this list of conditions and the following disclaimer in the 12 // documentation and/or other materials provided with the distribution. 13 // 14 // * Neither the name of ETH Zurich and UNC Chapel Hill nor the names of 15 // its contributors may be used to endorse or promote products derived 16 // from this software without specific prior written permission. 17 // 18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE 22 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 // POSSIBILITY OF SUCH DAMAGE. 29 // 30 // Author: Johannes L. Schoenberger (jsch-at-demuc-dot-de) 31 32 #ifndef COLMAP_SRC_RETRIEVAL_UTILS_H_ 33 #define COLMAP_SRC_RETRIEVAL_UTILS_H_ 34 35 #include <array> 36 #include <cmath> 37 38 namespace colmap { 39 namespace retrieval { 40 41 struct ImageScore { 42 int image_id = -1; 43 float score = 0.0f; 44 }; 45 46 // Implements the weighting function used to derive a voting weight from the 47 // Hamming distance of two binary signatures. See Eqn. 4 in 48 // Arandjelovic, Zisserman. DisLocation: Scalable descriptor distinctiveness for 49 // location recognition. ACCV 2014. 50 // The template is the length of the Hamming embedding vectors. 51 // This class is based on an original implementation by Torsten Sattler. 52 template <int N, int kSigma = 16> 53 class HammingDistWeightFunctor { 54 public: 55 static const size_t kMaxHammingDistance = static_cast<size_t>(1.5f * kSigma); 56 HammingDistWeightFunctor()57 HammingDistWeightFunctor() { 58 // Fills the look-up table. 59 const float sigma_squared = kSigma * kSigma; 60 for (int n = 0; n <= N; ++n) { 61 const float hamming_dist = static_cast<float>(n); 62 if (hamming_dist <= kMaxHammingDistance) { 63 look_up_table_.at(n) = 64 std::exp(-hamming_dist * hamming_dist / sigma_squared); 65 } else { 66 look_up_table_.at(n) = 0.0f; 67 } 68 } 69 } 70 71 // Returns the weight for Hamming distance h and standard deviation sigma. 72 // Does not perform a range check when performing the look-up. operator()73 inline float operator()(const size_t hamming_dist) const { 74 return look_up_table_.at(hamming_dist); 75 } 76 77 private: 78 // In order to avoid wasting computations, we once compute a look-up table 79 // storing all function values for all possible values of the standard 80 // deviation \sigma. This is implemented as a (N + 1) vector. 81 std::array<float, N + 1> look_up_table_; 82 }; 83 84 } // namespace retrieval 85 } // namespace colmap 86 87 #endif // COLMAP_SRC_RETRIEVAL_UTILS_H_ 88