danini / magsac Goto Github PK
View Code? Open in Web Editor NEWThe MAGSAC algorithm for robust model fitting without using an inlier-outlier threshold
License: Other
The MAGSAC algorithm for robust model fitting without using an inlier-outlier threshold
License: Other
Hi @danini and @ducha-aiki ,
I have a problem with the kind A * x = y
, where I have A and y, and I want to find x. The vector x has dimension 3, and I can get up to 110 measurements to build A
and y.
Currently, I am solving this using RANSAC available on the scikit-learn library. However, I would like to do the same with MAGSAC, which is state-of-the-art for such tasks. I tried to implement such an estimator by myself using the 2D Line example, but I couldn't find a solution.
Is it possible to solve such a problem using the public MAGSAC code? If so, can you explain where/how to modify the files?
Thank you,
Paulo Araujo
Hi,
I have been studying your paper, thanks for uploading your code with it !
I was wondering, when you apply SigmaConsensus, in the paper you use the formula (6) to compute weights, but in the code you only use the exponential part of this formula. Why is the factor \sigma^{-\rho} D(\theta, \sigma)^{\rho - 1} ignored in the computation of the weights ?
Best regards,
Clément Riu.
Hi, as mentioned in the title, is it possible to use MagSac with OpenCV to perform the following function?
H, mask_F = cv2.estimateAffinePartial2D(points0,points1, cv2.USAC_MAGSAC)
thank you.
Interesting paper, Dani, but I'm very surprised you do not compare your method to existing parameter-free RANSAC methods. For example it would be very useful to compare MAGSAC against the very successful method developed by @pmoulon:
P. Moulon, P. Monasse, R. Marlet. Adaptive Structure from Motion with a contrario mode estimation. ACCV 2012
Hi @danini,
I am trying to aplicate the magsac algorithm with my work, in a part of my work I need to estimate the fundamental matrix, but in my case I need points in 3d, because I am working with 360 images in spherical domain(I project the image points to a sphere) and my z-point is not one, I notice that in the magsac the algorithm for fundamental matrix load only 2d points. It would be great to extend to 3d points. I am trying to do that.
Or Do you have a version with 3d points for the fundamental matrix?
Greetings and thank you,
Jeffri
Is there a way to estimate Essential Matrix using DefaultEssentialMatrixEstimator() for cameras which don't have camera intrinsic matrices (for eg, 360 degree cameras)
Hi,
I think, the 3.4.6 is too strict. I haven`t checked if it would work with 3.0, but 3.4.2 is OK for sure
I am having issues building when CREATE_SAMPLE_PROJECT is set to ON.
/magsac/examples/cpp_example.cpp: In function 'void testEssentialMatrixFitting(double, double, const string&, bool, bool, double)': /magsac/examples/cpp_example.cpp:403:24: error: 'loadMatrix' is not a member of 'gcransac::utils'; did you mean 'loadMatrix'? 403 | if (!gcransac::utils::loadMatrix<double, 3, 3>(source_intrinsics_path, | ^~~~~~~~~~ In file included from /magsac/examples/cpp_example.cpp:16: /magsac/src/pymagsac/include/magsac_utils.h:115:6: note: 'loadMatrix' declared here 115 | void loadMatrix( | ^~~~~~~~~~ /magsac/examples/cpp_example.cpp:403:35: error: expected primary-expression before 'double' 403 | if (!gcransac::utils::loadMatrix<double, 3, 3>(source_intrinsics_path, | ^~~~~~ /magsac/examples/cpp_example.cpp:403:35: error: expected ')' before 'double' 403 | if (!gcransac::utils::loadMatrix<double, 3, 3>(source_intrinsics_path, | ~ ^~~~~~ | ) /magsac/examples/cpp_example.cpp:411:24: error: 'loadMatrix' is not a member of 'gcransac::utils'; did you mean 'loadMatrix'? 411 | if (!gcransac::utils::loadMatrix<double, 3, 3>(destination_intrinsics_path, | ^~~~~~~~~~ In file included from /magsac/examples/cpp_example.cpp:16: /magsac/src/pymagsac/include/magsac_utils.h:115:6: note: 'loadMatrix' declared here 115 | void loadMatrix( | ^~~~~~~~~~ /magsac/examples/cpp_example.cpp:411:35: error: expected primary-expression before 'double' 411 | if (!gcransac::utils::loadMatrix<double, 3, 3>(destination_intrinsics_path, | ^~~~~~ /magsac/examples/cpp_example.cpp:411:35: error: expected ')' before 'double' 411 | if (!gcransac::utils::loadMatrix<double, 3, 3>(destination_intrinsics_path, | ~ ^~~~~~ | ) /magsac/examples/cpp_example.cpp: In function 'void opencvEssentialMatrixFitting(double, double, const string&, bool)': /magsac/examples/cpp_example.cpp:1205:24: error: 'loadMatrix' is not a member of 'gcransac::utils'; did you mean 'loadMatrix'? 1205 | if (!gcransac::utils::loadMatrix<double, 3, 3>(source_intrinsics_path, | ^~~~~~~~~~ In file included from /magsac/examples/cpp_example.cpp:16: /magsac/src/pymagsac/include/magsac_utils.h:115:6: note: 'loadMatrix' declared here 115 | void loadMatrix( | ^~~~~~~~~~ /magsac/examples/cpp_example.cpp:1205:35: error: expected primary-expression before 'double' 1205 | if (!gcransac::utils::loadMatrix<double, 3, 3>(source_intrinsics_path, | ^~~~~~ /magsac/examples/cpp_example.cpp:1205:35: error: expected ')' before 'double' 1205 | if (!gcransac::utils::loadMatrix<double, 3, 3>(source_intrinsics_path, | ~ ^~~~~~ | ) /magsac/examples/cpp_example.cpp:1213:24: error: 'loadMatrix' is not a member of 'gcransac::utils'; did you mean 'loadMatrix'? 1213 | if (!gcransac::utils::loadMatrix<double, 3, 3>(destination_intrinsics_path, | ^~~~~~~~~~ In file included from /magsac/examples/cpp_example.cpp:16: /magsac/src/pymagsac/include/magsac_utils.h:115:6: note: 'loadMatrix' declared here 115 | void loadMatrix( | ^~~~~~~~~~ /magsac/examples/cpp_example.cpp:1213:35: error: expected primary-expression before 'double' 1213 | if (!gcransac::utils::loadMatrix<double, 3, 3>(destination_intrinsics_path, | ^~~~~~ /magsac/examples/cpp_example.cpp:1213:35: error: expected ')' before 'double' 1213 | if (!gcransac::utils::loadMatrix<double, 3, 3>(destination_intrinsics_path, | ~ ^~~~~~ | ) In file included from /magsac/graph-cut-ransac/src/pygcransac/include/estimators/fundamental_estimator.h:49, from /magsac/graph-cut-ransac/src/pygcransac/include/estimators/solver_essential_matrix_five_point_stewenius.h:37, from /magsac/src/pymagsac/src/magsac_python.cpp:3:
Hi @danini - thank you for making the code to your research available! I'm curious if you'd be willing to add an explicit license to this repository (MIT, BSD, Public Domain, etc).
Hi, @danini and @ducha-aiki ,
Thanks for sharing your great work!
Unfortunatelly, issues raised when I run the example_homography.I never modify the content of this file.
Appended is the error:
TypeError: findHomography(): incompatible function arguments. The following argument types are supported:
1. (x1y1: numpy.ndarray[float64], x2y2: numpy.ndarray[float64], w1: float, h1: float, w2: float, h2: float, use_magsac_plus_plus: bool=True, sigma_th: float=1.0, conf: float=0.99, max_iters: int=1000, partition_num: int=5) -> tuple
Hi, @danini and @ducha-aiki ,
Thanks for sharing your great work!
Unfortunatelly, issues raised when I compile it on linux machine with gcc 5.2.0. I am stuck and any advice would be appreciated!
Thanks!
Appended is the error:
$ make -j4
[ 10%] Building CXX object CMakeFiles/GraphCutRANSAC.dir/graph-cut-ransac/src/pygcransac/include/GCoptimization.cpp.o
[ 20%] Building CXX object CMakeFiles/GraphCutRANSAC.dir/graph-cut-ransac/src/pygcransac/include/graph.cpp.o
[ 30%] Building CXX object CMakeFiles/GraphCutRANSAC.dir/graph-cut-ransac/src/pygcransac/include/LinkedBlockList.cpp.o
[ 40%] Building CXX object CMakeFiles/MAGSAC.dir/include/gamma_values.cpp.o
[ 50%] Building CXX object CMakeFiles/MAGSAC.dir/include/magsac.cpp.o
[ 60%] Building CXX object CMakeFiles/MAGSAC.dir/include/model_score.cpp.o
[ 70%] Building CXX object CMakeFiles/GraphCutRANSAC.dir/graph-cut-ransac/src/pygcransac/include/maxflow.cpp.o
[ 80%] Building CXX object CMakeFiles/MAGSAC.dir/src/main.cpp.o
[ 90%] Linking CXX static library libGraphCutRANSAC.a
[ 90%] Built target GraphCutRANSAC
In file included from /home/Code/magsac/include/magsac.cpp:1:0:
/home/Code/magsac/include/magsac.h: In member function ‘bool MAGSAC<DatumType, ModelEstimator>::sigmaConsensusPlusPlus(const cv::Mat&, const gcransac::Model&, gcransac::Model&, ModelScore&, const ModelEstimator&, const ModelScore&)’:
/home/Code/magsac/include/magsac.h:743:20: error: expected unqualified-id before ‘[’ token
for (const auto &[residual, idx] : residuals)
^
/home/Code/magsac/include/magsac.h:743:20: error: expected ‘;’ before ‘[’ token
/home/Code/magsac/include/magsac.h:743:21: error: ‘residual’ was not declared in this scope
for (const auto &[residual, idx] : residuals)
^
/home/Code/magsac/include/magsac.h:743:31: error: ‘idx’ was not declared in this scope
for (const auto &[residual, idx] : residuals)
^
/home/Code/magsac/include/magsac.h: In lambda function:
/home/Code/magsac/include/magsac.h:743:36: error: expected ‘{’ before ‘:’ token
for (const auto &[residual, idx] : residuals)
^
/home/Code/magsac/include/magsac.h: In member function ‘bool MAGSAC<DatumType, ModelEstimator>::sigmaConsensusPlusPlus(const cv::Mat&, const gcransac::Model&, gcransac::Model&, ModelScore&, const ModelEstimator&, const ModelScore&)’:
/home/Code/magsac/include/magsac.h:743:36: error: expected ‘;’ before ‘:’ token
/home/Code/magsac/include/magsac.h:743:36: error: expected primary-expression before ‘:’ token
/home/Code/magsac/include/magsac.h:743:36: error: expected ‘)’ before ‘:’ token
/home/Code/magsac/include/magsac.h:743:36: error: expected primary-expression before ‘:’ token
make[2]: *** [CMakeFiles/MAGSAC.dir/include/magsac.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....
In file included from /home/Code/magsac/graph-cut-ransac/src/pygcransac/include/fundamental_estimator.h:52:0,
from /home/Code/magsac/graph-cut-ransac/src/pygcransac/include/types.h:39,
from /home/Code/magsac/graph-cut-ransac/src/pygcransac/include/utils.h:48,
from /home/Code/magsac/src/main.cpp:16:
/home/Code/magsac/graph-cut-ransac/src/pygcransac/include/GCRANSAC.h: In member function ‘void gcransac::GCRANSAC<_ModelEstimator, _NeighborhoodGraph, _ScoringFunction, _PreemptiveModelVerification>::run(const cv::Mat&, const _ModelEstimator&, gcransac::sampler::Sampler<cv::Mat, long unsigned int>, gcransac::sampler::Sampler<cv::Mat, long unsigned int>, const _NeighborhoodGraph*, gcransac::Model&, _PreemptiveModelVerification&)’:
/home/Code/magsac/graph-cut-ransac/src/pygcransac/include/GCRANSAC.h:305:8: error: expected ‘(’ before ‘constexpr’
if constexpr (!std::is_same<preemption::EmptyPreemptiveVerfication<_ModelEstimator>, _PreemptiveModelVerification>())
^
/home/Code/magsac/src/main.cpp:1181:1: error: expected ‘}’ at end of input
}
^
/home/Code/magsac/src/main.cpp:1181:1: error: expected ‘}’ at end of input
/home/Code/magsac/src/main.cpp:1181:1: error: expected ‘}’ at end of input
/home/Code/magsac/src/main.cpp: At global scope:
/home/Code/magsac/src/main.cpp:1181:1: error: expected ‘}’ at end of input
make[2]: *** [CMakeFiles/MAGSAC.dir/src/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/MAGSAC.dir/all] Error 2
make: *** [all] Error 2
Hello. Whenever I run pymagsac.findHomography' with
use_magsac_plus_plus=True` I always get really verbose prints:
Setting the core number for MAGSAC++ is deprecated.
Setting the partition number for MAGSAC++ is deprecated.
Is there a way to suppress this? I believe the prints are coming from here, but it's been hard-coded here.
Perhaps the following lines (L33-34) can be deleted if use_magsac_plus_plus
is false?
magsac->setCoreNumber(1); // The number of cores used to speed up sigma-consensus
magsac->setPartitionNumber(partition_num); // The number partitions used for speeding up sigma consensus. As the value grows, the algorithm become slower and, usually, more accurate.
I'd be happy to create a PR if you think it'd be useful.
hi @danini
CMAKE( it look fine)
-- The CXX compiler identification is GNU 9.3.0
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenCV: /home/artcs/anaconda3/envs/pymagsac (found version "3.4.2")
-- Found OpenMP_CXX: -fopenmp (found version "4.5")
-- Found OpenMP: TRUE (found version "4.5")
-- Configuring done
-- Generating done
-- Build files have been written to: /home/artcs/Downloads/magsac-master/build
but when I run make it shows:
[ 10%] Building CXX object CMakeFiles/MAGSAC.dir/include/gamma_values.cpp.o
[ 20%] Building CXX object CMakeFiles/MAGSAC.dir/include/magsac.cpp.o
In file included from /home/artcs/Downloads/magsac-master/graph-cut-ransac/src/pygcransac/include/GCoptimization.h:109,
from /home/artcs/Downloads/magsac-master/graph-cut-ransac/src/pygcransac/include/estimator.h:37,
from /home/artcs/Downloads/magsac-master/graph-cut-ransac/src/pygcransac/include/model.h:39,
from /home/artcs/Downloads/magsac-master/include/magsac.h:6,
from /home/artcs/Downloads/magsac-master/include/magsac.cpp:1:
/home/artcs/Downloads/magsac-master/graph-cut-ransac/src/pygcransac/include/energy.h: In member function ‘void Energy<captype, tcaptype, flowtype>::add_term3(Energy<captype, tcaptype, flowtype>::Var, Energy<captype, tcaptype, flowtype>::Var, Energy<captype, tcaptype, flowtype>::Var, Energy<captype, tcaptype, flowtype>::Value, Energy<captype, tcaptype, flowtype>::Value, Energy<captype, tcaptype, flowtype>::Value, Energy<captype, tcaptype, flowtype>::Value, Energy<captype, tcaptype, flowtype>::Value, Energy<captype, tcaptype, flowtype>::Value, Energy<captype, tcaptype, flowtype>::Value, Energy<captype, tcaptype, flowtype>::Value)’:
/home/artcs/Downloads/magsac-master/graph-cut-ransac/src/pygcransac/include/energy.h:262:17: warning: ISO C++17 does not allow ‘register’ storage class specifier [-Wregister]
262 | register Value pi = (E000 + E011 + E101 + E110) - (E100 + E010 + E001 + E111);
| ^~
/home/artcs/Downloads/magsac-master/graph-cut-ransac/src/pygcransac/include/energy.h:263:17: warning: ISO C++17 does not allow ‘register’ storage class specifier [-Wregister]
263 | register Value delta;
| ^~~~~
/home/artcs/Downloads/magsac-master/graph-cut-ransac/src/pygcransac/include/energy.h:264:15: warning: ISO C++17 does not allow ‘register’ storage class specifier [-Wregister]
264 | register Var u;
| ^
[ 30%] Building CXX object CMakeFiles/MAGSAC.dir/include/model_score.cpp.o
[ 40%] Building CXX object CMakeFiles/MAGSAC.dir/src/main.cpp.o
In file included from /home/artcs/Downloads/magsac-master/graph-cut-ransac/src/pygcransac/include/GCoptimization.h:109,
from /home/artcs/Downloads/magsac-master/graph-cut-ransac/src/pygcransac/include/estimator.h:37,
from /home/artcs/Downloads/magsac-master/include/magsac_utils.h:8,
from /home/artcs/Downloads/magsac-master/src/main.cpp:15:
/home/artcs/Downloads/magsac-master/graph-cut-ransac/src/pygcransac/include/energy.h: In member function ‘void Energy<captype, tcaptype, flowtype>::add_term3(Energy<captype, tcaptype, flowtype>::Var, Energy<captype, tcaptype, flowtype>::Var, Energy<captype, tcaptype, flowtype>::Var, Energy<captype, tcaptype, flowtype>::Value, Energy<captype, tcaptype, flowtype>::Value, Energy<captype, tcaptype, flowtype>::Value, Energy<captype, tcaptype, flowtype>::Value, Energy<captype, tcaptype, flowtype>::Value, Energy<captype, tcaptype, flowtype>::Value, Energy<captype, tcaptype, flowtype>::Value, Energy<captype, tcaptype, flowtype>::Value)’:
/home/artcs/Downloads/magsac-master/graph-cut-ransac/src/pygcransac/include/energy.h:262:17: warning: ISO C++17 does not allow ‘register’ storage class specifier [-Wregister]
262 | register Value pi = (E000 + E011 + E101 + E110) - (E100 + E010 + E001 + E111);
| ^~
/home/artcs/Downloads/magsac-master/graph-cut-ransac/src/pygcransac/include/energy.h:263:17: warning: ISO C++17 does not allow ‘register’ storage class specifier [-Wregister]
263 | register Value delta;
| ^~~~~
/home/artcs/Downloads/magsac-master/graph-cut-ransac/src/pygcransac/include/energy.h:264:15: warning: ISO C++17 does not allow ‘register’ storage class specifier [-Wregister]
264 | register Var u;
| ^
In file included from /home/artcs/Downloads/magsac-master/src/main.cpp:25:
/home/artcs/Downloads/magsac-master/include/estimators.h: At global scope:
/home/artcs/Downloads/magsac-master/include/estimators.h:83:22: error: ‘Model’ has not been declared
83 | bool isValidModel(Model& model_,
| ^~~~~
/home/artcs/Downloads/magsac-master/include/estimators.h:136:30: error: ‘Model’ has not been declared
136 | inline bool applyDegensac(Model& model_, // The input model to be tested
| ^~~~~
/home/artcs/Downloads/magsac-master/include/estimators.h: In member function ‘double magsac::estimator::FundamentalMatrixEstimator<MinimalSolverEngine, NonMinimalSolverEngine>::residualForScoring(const cv::Mat&, const gcransac::Model&) const’:
/home/artcs/Downloads/magsac-master/include/estimators.h:38:22: warning: there are no arguments to ‘squaredSymmetricEpipolarDistance’ that depend on a template parameter, so a declaration of ‘squaredSymmetricEpipolarDistance’ must be available [-fpermissive]
38 | return std::sqrt(squaredSymmetricEpipolarDistance(point, model.descriptor));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/artcs/Downloads/magsac-master/include/estimators.h: In member function ‘bool magsac::estimator::FundamentalMatrixEstimator<MinimalSolverEngine, NonMinimalSolverEngine>::isValidModel(int&, const cv::Mat&, const std::vector&, const size_t*, double, bool&) const’:
/home/artcs/Downloads/magsac-master/include/estimators.h:96:48: error: request for member ‘descriptor’ in ‘model’, which is of non-class type ‘int’
96 | const Eigen::Matrix3d &descriptor = model.descriptor; // The decriptor of the current model
| ^~~~~~~~~~
/home/artcs/Downloads/magsac-master/include/estimators.h:97:36: warning: there are no arguments to ‘sampleSize’ that depend on a template parameter, so a declaration of ‘sampleSize’ must be available [-fpermissive]
97 | constexpr size_t sample_size = sampleSize(); // Size of a minimal sample
| ^~~~~~~~~~
In file included from /home/artcs/anaconda3/envs/pymagsac/include/opencv2/core.hpp:52,
from /home/artcs/Downloads/magsac-master/src/main.cpp:9:
/home/artcs/Downloads/magsac-master/include/estimators.h:100:41: error: ‘minimum_inlier_ratio_in_validity_check’ was not declared in this scope
100 | MAX(sample_size, inliers_.size() * minimum_inlier_ratio_in_validity_check);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /home/artcs/Downloads/magsac-master/src/main.cpp:25:
/home/artcs/Downloads/magsac-master/include/estimators.h:108:10: warning: there are no arguments to ‘squaredSymmetricEpipolarDistance’ that depend on a template parameter, so a declaration of ‘squaredSymmetricEpipolarDistance’ must be available [-fpermissive]
108 | if (squaredSymmetricEpipolarDistance(data_.row(idx), descriptor) < squared_threshold)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/artcs/Downloads/magsac-master/include/estimators.h:122:9: error: ‘use_degensac’ was not declared in this scope
122 | if (use_degensac)
| ^~~~~~~~~~~~
/home/artcs/Downloads/magsac-master/include/estimators.h: In member function ‘bool magsac::estimator::FundamentalMatrixEstimator<MinimalSolverEngine, NonMinimalSolverEngine>::applyDegensac(int&, const cv::Mat&, const std::vector&, const size_t*, double, bool&) const’:
/home/artcs/Downloads/magsac-master/include/estimators.h:158:13: error: request for member ‘descriptor’ in ‘model’, which is of non-class type ‘int’
158 | model.descriptor.block<3, 3>(0, 0);
| ^~~~~~~~~~
/home/artcs/Downloads/magsac-master/include/estimators.h:176:30: error: request for member ‘descriptor’ in ‘model_’, which is of non-class type ‘int’
176 | epipolar_cross * model_.descriptor;
| ^~~~~~~~~~
/home/artcs/Downloads/magsac-master/include/estimators.h:235:29: warning: there are no arguments to ‘sampleSize’ that depend on a template parameter, so a declaration of ‘sampleSize’ must be available [-fpermissive]
235 | for (size_t i = 0; i < sampleSize(); ++i)
| ^~~~~~~~~~
/home/artcs/Downloads/magsac-master/include/estimators.h:269:30: error: ‘squared_homography_threshold’ was not declared in this scope
269 | if (squared_residual < squared_homography_threshold)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/artcs/Downloads/magsac-master/include/estimators.h:289:38: error: ‘HomographyEstimator’ in namespace ‘magsac::estimator’ does not name a template type
289 | static const magsac::estimator::HomographyEstimator<
| ^~~~~~~~~~~~~~~~~~~
/home/artcs/Downloads/magsac-master/include/estimators.h:301:11: error: ‘homography_estimator’ was not declared in this scope
301 | if (homography_estimator.squaredResidual(data_.row(inlier_idx), best_homography) < squared_homography_threshold)
| ^~~~~~~~~~~~~~~~~~~~
/home/artcs/Downloads/magsac-master/include/estimators.h:301:90: error: ‘squared_homography_threshold’ was not declared in this scope
301 | (homography_estimator.squaredResidual(data_.row(inlier_idx), best_homography) < squared_homography_threshold)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/artcs/Downloads/magsac-master/include/estimators.h:305:38: error: ‘homography_estimator’ was not declared in this scope
305 | if (homography_inliers.size() < homography_estimator.nonMinimalSampleSize())
| ^~~~~~~~~~~~~~~~~~~~
/home/artcs/Downloads/magsac-master/include/estimators.h:310:18: error: ‘Model’ was not declared in this scope; did you mean ‘gcransac::Model’?
310 | std::vector homographies;
| ^~~~~
| gcransac::Model
In file included from /home/artcs/Downloads/magsac-master/include/magsac_utils.h:9,
from /home/artcs/Downloads/magsac-master/src/main.cpp:15:
/home/artcs/Downloads/magsac-master/graph-cut-ransac/src/pygcransac/include/model.h:43:8: note: ‘gcransac::Model’ declared here
43 | class Model
| ^~~~~
In file included from /home/artcs/Downloads/magsac-master/src/main.cpp:25:
/home/artcs/Downloads/magsac-master/include/estimators.h:310:23: error: template argument 1 is invalid
310 | std::vector homographies;
| ^
/home/artcs/Downloads/magsac-master/include/estimators.h:310:23: error: template argument 2 is invalid
/home/artcs/Downloads/magsac-master/include/estimators.h:313:6: error: ‘homography_estimator’ was not declared in this scope
313 | homography_estimator.estimateModelNonminimal(data_, // All data points
| ^~~~~~~~~~~~~~~~~~~~
/home/artcs/Downloads/magsac-master/include/estimators.h:320:23: error: request for member ‘size’ in ‘homographies’, which is of non-class type ‘int’
320 | if (homographies.size() != 1)
| ^~~~
/home/artcs/Downloads/magsac-master/include/estimators.h:325:21: error: invalid types ‘int[int]’ for array subscript
325 | homographies[0].descriptor;
| ^
/home/artcs/Downloads/magsac-master/include/estimators.h:335:11: error: expected ‘;’ before ‘model’
335 | Model model;
| ^~~~~~
| ;
/home/artcs/Downloads/magsac-master/include/estimators.h:352:7: error: ‘model’ was not declared in this scope; did you mean ‘modfl’?
352 | model, // The estimated model
| ^~~~~
| modfl
/home/artcs/Downloads/magsac-master/include/estimators.h: In member function ‘double magsac::estimator::EssentialMatrixEstimator<MinimalSolverEngine, NonMinimalSolverEngine>::residualForScoring(const cv::Mat&, const gcransac::Model&) const’:
/home/artcs/Downloads/magsac-master/include/estimators.h:396:12: warning: there are no arguments to ‘squaredSymmetricEpipolarDistance’ that depend on a template parameter, so a declaration of ‘squaredSymmetricEpipolarDistance’ must be available [-fpermissive]
396 | return squaredSymmetricEpipolarDistance(point, model.descriptor);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/artcs/Downloads/magsac-master/include/estimators.h: In member function ‘double magsac::estimator::HomographyEstimator<MinimalSolverEngine, NonMinimalSolverEngine>::residualForScoring(const cv::Mat&, const gcransac::Model&) const’:
/home/artcs/Downloads/magsac-master/include/estimators.h:454:12: warning: there are no arguments to ‘residual’ that depend on a template parameter, so a declaration of ‘residual’ must be available [-fpermissive]
454 | return residual(point, model.descriptor);
| ^~~~~~~~
/home/artcs/Downloads/magsac-master/src/main.cpp: In function ‘void testEssentialMatrixFitting(double, double, const string&, bool, double)’:
/home/artcs/Downloads/magsac-master/src/main.cpp:430:48: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘size_t’ {aka ‘long unsigned int’} [-Wformat=]
430 | printf("\tNumber of points closer than %f is %d\n",
| ~^
| |
| int
| %ld
431 | drawing_threshold_, inlier_number);
| ~~~~~~~~~~~~~
| |
| size_t {aka long unsigned int}
/home/artcs/Downloads/magsac-master/src/main.cpp: In function ‘void opencvEssentialMatrixFitting(double, double, const string&, bool)’:
/home/artcs/Downloads/magsac-master/src/main.cpp:1160:47: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘size_t’ {aka ‘long unsigned int’} [-Wformat=]
1160 | printf("\tNumber of points closer than %f = %d\n",
| ~^
| |
| int
| %ld
1161 | threshold_, inlier_number);
| ~~~~~~~~~~~~~
| |
| size_t {aka long unsigned int}
In file included from /home/artcs/Downloads/magsac-master/src/main.cpp:17:
/home/artcs/Downloads/magsac-master/include/magsac.h: In instantiation of ‘bool MAGSAC<DatumType, ModelEstimator>::sigmaConsensus(const cv::Mat&, const gcransac::Model&, gcransac::Model&, ModelScore&, const ModelEstimator&, const ModelScore&) [with DatumType = cv::Mat; ModelEstimator = magsac::estimator::FundamentalMatrixEstimator<gcransac::estimator::solver::FundamentalMatrixSevenPointSolver, gcransac::estimator::solver::FundamentalMatrixEightPointSolver>]’:
/home/artcs/Downloads/magsac-master/include/magsac.h:266:15: required from ‘bool MAGSAC<DatumType, ModelEstimator>::run(const cv::Mat&, double, ModelEstimator&, gcransac::sampler::Sampler<cv::Mat, long unsigned int>&, gcransac::Model&, int&, ModelScore&) [with DatumType = cv::Mat; ModelEstimator = magsac::estimator::FundamentalMatrixEstimator<gcransac::estimator::solver::FundamentalMatrixSevenPointSolver, gcransac::estimator::solver::FundamentalMatrixEightPointSolver>]’
/home/artcs/Downloads/magsac-master/src/main.cpp:539:8: required from here
/home/artcs/Downloads/magsac-master/include/magsac.h:537:31: error: cannot convert ‘__gnu_cxx::__alloc_traits<std::allocatorgcransac::Model, gcransac::Model>::value_type’ {aka ‘gcransac::Model’} to ‘int&’
537 | if (sigma_models.size() == 1 && // If only a single model is estimated
In file included from /home/artcs/Downloads/magsac-master/src/main.cpp:25:
/home/artcs/Downloads/magsac-master/include/estimators.h:83:29: note: initializing argument 1 of ‘bool magsac::estimator::FundamentalMatrixEstimator<_MinimalSolverEngine, _NonMinimalSolverEngine>::isValidModel(int&, const cv::Mat&, const std::vector&, const size_t*, double, bool&) const [with MinimalSolverEngine = gcransac::estimator::solver::FundamentalMatrixSevenPointSolver; NonMinimalSolverEngine = gcransac::estimator::solver::FundamentalMatrixEightPointSolver; size_t = long unsigned int]’
83 | bool isValidModel(Model& model,
| ~~~~~~~^~~~~~
In file included from /home/artcs/Downloads/magsac-master/src/main.cpp:17:
/home/artcs/Downloads/magsac-master/include/magsac.h: In instantiation of ‘bool MAGSAC<DatumType, ModelEstimator>::sigmaConsensusPlusPlus(const cv::Mat&, const gcransac::Model&, gcransac::Model&, ModelScore&, const ModelEstimator&, const ModelScore&) [with DatumType = cv::Mat; ModelEstimator = magsac::estimator::FundamentalMatrixEstimator<gcransac::estimator::solver::FundamentalMatrixSevenPointSolver, gcransac::estimator::solver::FundamentalMatrixEightPointSolver>]’:
/home/artcs/Downloads/magsac-master/include/magsac.h:273:15: required from ‘bool MAGSAC<DatumType, ModelEstimator>::run(const cv::Mat&, double, ModelEstimator&, gcransac::sampler::Sampler<cv::Mat, long unsigned int>&, gcransac::Model&, int&, ModelScore&) [with DatumType = cv::Mat; ModelEstimator = magsac::estimator::FundamentalMatrixEstimator<gcransac::estimator::solver::FundamentalMatrixSevenPointSolver, gcransac::estimator::solver::FundamentalMatrixEightPointSolver>]’
/home/artcs/Downloads/magsac-master/src/main.cpp:539:8: required from here
/home/artcs/Downloads/magsac-master/include/magsac.h:804:27: error: cannot convert ‘gcransac::Model’ to ‘int&’
804 | estimator.isValidModel(polished_model,
| ^~~~~~~~~~~~~~
| |
| gcransac::Model
In file included from /home/artcs/Downloads/magsac-master/src/main.cpp:25:
/home/artcs/Downloads/magsac-master/include/estimators.h:83:29: note: initializing argument 1 of ‘bool magsac::estimator::FundamentalMatrixEstimator<_MinimalSolverEngine, _NonMinimalSolverEngine>::isValidModel(int&, const cv::Mat&, const std::vector&, const size_t*, double, bool&) const [with _MinimalSolverEngine = gcransac::estimator::solver::FundamentalMatrixSevenPointSolver; NonMinimalSolverEngine = gcransac::estimator::solver::FundamentalMatrixEightPointSolver; size_t = long unsigned int]’
83 | bool isValidModel(Model& model,
| ~~~~~~~^~~~~~
/home/artcs/Downloads/magsac-master/include/estimators.h: In instantiation of ‘double magsac::estimator::EssentialMatrixEstimator<_MinimalSolverEngine, _NonMinimalSolverEngine>::residualForScoring(const cv::Mat&, const gcransac::Model&) const [with MinimalSolverEngine = gcransac::estimator::solver::EssentialMatrixFivePointSteweniusSolver; NonMinimalSolverEngine = gcransac::estimator::solver::FundamentalMatrixEightPointSolver]’:
/home/artcs/Downloads/magsac-master/include/magsac.h:951:16: required from ‘void MAGSAC<DatumType, ModelEstimator>::getModelQuality(const cv::Mat&, const gcransac::Model&, const ModelEstimator&, double&, double&) [with DatumType = cv::Mat; ModelEstimator = magsac::estimator::EssentialMatrixEstimator<gcransac::estimator::solver::EssentialMatrixFivePointSteweniusSolver, gcransac::estimator::solver::FundamentalMatrixEightPointSolver>]’
/home/artcs/Downloads/magsac-master/include/magsac.h:550:3: required from ‘bool MAGSAC<DatumType, ModelEstimator>::sigmaConsensus(const cv::Mat&, const gcransac::Model&, gcransac::Model&, ModelScore&, const ModelEstimator&, const ModelScore&) [with DatumType = cv::Mat; ModelEstimator = magsac::estimator::EssentialMatrixEstimator<gcransac::estimator::solver::EssentialMatrixFivePointSteweniusSolver, gcransac::estimator::solver::FundamentalMatrixEightPointSolver>]’
/home/artcs/Downloads/magsac-master/include/magsac.h:266:15: required from ‘bool MAGSAC<DatumType, ModelEstimator>::run(const cv::Mat&, double, ModelEstimator&, gcransac::sampler::Sampler<cv::Mat, long unsigned int>&, gcransac::Model&, int&, ModelScore&) [with DatumType = cv::Mat; ModelEstimator = magsac::estimator::EssentialMatrixEstimator<gcransac::estimator::solver::EssentialMatrixFivePointSteweniusSolver, gcransac::estimator::solver::FundamentalMatrixEightPointSolver>]’
/home/artcs/Downloads/magsac-master/src/main.cpp:401:8: required from here
/home/artcs/Downloads/magsac-master/include/estimators.h:396:44: warning: ‘squaredSymmetricEpipolarDistance’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
396 | return squaredSymmetricEpipolarDistance(point, model.descriptor);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/artcs/Downloads/magsac-master/include/estimators.h:396:44: note: declarations in dependent base ‘gcransac::estimator::EssentialMatrixEstimator<gcransac::estimator::solver::EssentialMatrixFivePointSteweniusSolver, gcransac::estimator::solver::FundamentalMatrixEightPointSolver>’ are not found by unqualified lookup
/home/artcs/Downloads/magsac-master/include/estimators.h:396:44: note: use ‘this->squaredSymmetricEpipolarDistance’ instead
/home/artcs/Downloads/magsac-master/include/estimators.h: In instantiation of ‘double magsac::estimator::HomographyEstimator<_MinimalSolverEngine, _NonMinimalSolverEngine>::residualForScoring(const cv::Mat&, const gcransac::Model&) const [with MinimalSolverEngine = gcransac::estimator::solver::HomographyFourPointSolver; NonMinimalSolverEngine = gcransac::estimator::solver::HomographyFourPointSolver]’:
/home/artcs/Downloads/magsac-master/include/magsac.h:951:16: required from ‘void MAGSAC<DatumType, ModelEstimator>::getModelQuality(const cv::Mat&, const gcransac::Model&, const ModelEstimator&, double&, double&) [with DatumType = cv::Mat; ModelEstimator = magsac::estimator::HomographyEstimator<gcransac::estimator::solver::HomographyFourPointSolver, gcransac::estimator::solver::HomographyFourPointSolver>]’
/home/artcs/Downloads/magsac-master/include/magsac.h:550:3: required from ‘bool MAGSAC<DatumType, ModelEstimator>::sigmaConsensus(const cv::Mat&, const gcransac::Model&, gcransac::Model&, ModelScore&, const ModelEstimator&, const ModelScore&) [with DatumType = cv::Mat; ModelEstimator = magsac::estimator::HomographyEstimator<gcransac::estimator::solver::HomographyFourPointSolver, gcransac::estimator::solver::HomographyFourPointSolver>]’
/home/artcs/Downloads/magsac-master/include/magsac.h:266:15: required from ‘bool MAGSAC<DatumType, ModelEstimator>::run(const cv::Mat&, double, ModelEstimator&, gcransac::sampler::Sampler<cv::Mat, long unsigned int>&, gcransac::Model&, int&, ModelScore&) [with DatumType = cv::Mat; ModelEstimator = magsac::estimator::HomographyEstimator<gcransac::estimator::solver::HomographyFourPointSolver, gcransac::estimator::solver::HomographyFourPointSolver>]’
/home/artcs/Downloads/magsac-master/src/main.cpp:686:8: required from here
/home/artcs/Downloads/magsac-master/include/estimators.h:454:20: warning: ‘residual’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
454 | return residual(point, model.descriptor);
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/artcs/Downloads/magsac-master/include/estimators.h:454:20: note: declarations in dependent base ‘gcransac::estimator::RobustHomographyEstimator<gcransac::estimator::solver::HomographyFourPointSolver, gcransac::estimator::solver::HomographyFourPointSolver>’ are not found by unqualified lookup
/home/artcs/Downloads/magsac-master/include/estimators.h:454:20: note: use ‘this->residual’ instead
CMakeFiles/MAGSAC.dir/build.make:134: recipe for target 'CMakeFiles/MAGSAC.dir/src/main.cpp.o' failed
make[2]: *** [CMakeFiles/MAGSAC.dir/src/main.cpp.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/MAGSAC.dir/all' failed
make[1]: *** [CMakeFiles/MAGSAC.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
Can you give me some advice?
Thanks for your help !
Thanks a lot for your great work and code, do you have a plan to add support for rigid transformation estimation?
Best,
Xuyang
Could you please add a test in cpp_example.cpp for homography_affine_correspondence_estimator?
I follow README to install pymagsac from source. However, I cannot run the python examples. I have tried to fix bugs in the examples. However, no inlier cannot be found by
def verify_pymagsac_fundam(kps1, kps2, tentatives, use_magsac_plus_plus):
src_pts = np.float64([ kps1[m.queryIdx].pt for m in tentatives ]).reshape(-1,2)
dst_pts = np.float64([ kps2[m.trainIdx].pt for m in tentatives ]).reshape(-1,2)
src_pts = np.ascontiguousarray(src_pts)
dst_pts = np.ascontiguousarray(src_pts)
H, mask,_ = pymagsac.findFundamentalMatrix(
src_pts,
dst_pts,
2592.0,1944.0,2592.0,1944.0,
probabilities = np.ones(src_pts.shape[0]))
print (deepcopy(mask).astype(np.float32).sum(), 'inliers found')
return H, mask
Hi, first of all thanks for your repository and pybindings.
Looking at the magsac.h file, it seems that there is no sampler update inside the while loop, while this was present in GRANSAC.h.
Is this intentional?'
Thank you.
I tried building it for windows10 using VC-2015. But ran in to issues because of gflags.
It would be great if author can release windows package or even package installable via pip .
Line 817 in baede2b
I guess this is a bug? I think the score here should be squared.
Hello,everyone,Why the project I downloaded is missing some header files???????????? Can someone post me? like this:
-- The CXX compiler identification is GNU 7.5.0
-- Check for working CXX compiler: /usr/local/bin/c++
-- Check for working CXX compiler: /usr/local/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Warning (dev) at CMakeLists.txt:9 (option):
Policy CMP0077 is not set: option() honors normal variables. Run "cmake
--help-policy CMP0077" for policy details. Use the cmake_policy command to
set the policy and suppress this warning.
For compatibility with older versions of CMake, option is clearing the
normal variable 'CREATE_SAMPLE_PROJECT'.
This warning is for project developers. Use -Wno-dev to suppress it.
-- Found OpenCV: /opt/ros/kinetic (found version "3.3.1")
Found Gflags 2.2.2
-- > GFLAGS_INCLUDE_DIR: /usr/local/include
-- > GFLAGS_LIBRARIES: gflags_shared
Glog library found.
-- Found OpenMP_CXX: -fopenmp (found version "4.5")
-- Found OpenMP: TRUE (found version "4.5")
-- The C compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/local/bin/gcc
-- Check for working C compiler: /usr/local/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Found PythonInterp: /usr/bin/python3.5 (found version "3.5.1")
-- Found PythonLibs: /usr/lib/x86_64-linux-gnu/libpython3.5m.so
-- pybind11 v2.1.1
-- Performing Test HAS_CPP14_FLAG
-- Performing Test HAS_CPP14_FLAG - Success
-- Performing Test HAS_CPP11_FLAG
-- Performing Test HAS_CPP11_FLAG - Success
-- Performing Test HAS_FLTO
-- Performing Test HAS_FLTO - Success
-- LTO enabled
-- Configuring done
-- Generating done
-- Build files have been written to: /home/jjb/envirement/magsac/build
jjb@jjb:~/envirement/magsac/build$ make
Scanning dependencies of target GraphCutRANSAC
[ 5%] Building CXX object CMakeFiles/GraphCutRANSAC.dir/graph-cut-ransac/src/pygcransac/include/GCoptimization.cpp.o
[ 10%] Building CXX object CMakeFiles/GraphCutRANSAC.dir/graph-cut-ransac/src/pygcransac/include/LinkedBlockList.cpp.o
[ 15%] Building CXX object CMakeFiles/GraphCutRANSAC.dir/graph-cut-ransac/src/pygcransac/include/gamma_values.cpp.o
/home/jjb/envirement/magsac/graph-cut-ransac/src/pygcransac/include/gamma_values.cpp:1:9: 警告:#pragma once 出现在主文件中
#pragma once
^~~~
[ 21%] Building CXX object CMakeFiles/GraphCutRANSAC.dir/graph-cut-ransac/src/pygcransac/include/graph.cpp.o
[ 26%] Building CXX object CMakeFiles/GraphCutRANSAC.dir/graph-cut-ransac/src/pygcransac/include/maxflow.cpp.o
[ 31%] Building CXX object CMakeFiles/GraphCutRANSAC.dir/graph-cut-ransac/src/pygcransac/include/relative_pose/bundle.cpp.o
[ 36%] Building CXX object CMakeFiles/GraphCutRANSAC.dir/graph-cut-ransac/src/pygcransac/include/relative_pose/colmap_models.cpp.o
[ 42%] Building CXX object CMakeFiles/GraphCutRANSAC.dir/graph-cut-ransac/src/pygcransac/include/relative_pose/essential.cpp.o
[ 47%] Linking CXX static library libGraphCutRANSAC.a
[ 47%] Built target GraphCutRANSAC
Scanning dependencies of target pymagsac
[ 52%] Building CXX object CMakeFiles/pymagsac.dir/src/pymagsac/src/bindings.cpp.o
[ 57%] Building CXX object CMakeFiles/pymagsac.dir/src/pymagsac/src/magsac_python.cpp.o
/home/jjb/envirement/magsac/src/pymagsac/src/magsac_python.cpp:3:10: 致命错误:fundamental_estimator.h:没有那个文件或目录
#include "fundamental_estimator.h"
Hello Daniel,
I saw your talk at EECVC and I tried to clone your C++ MAGSAC project and get it to run on Ubuntu 18.04. I was unable to do so w/o some alterations, some notes:
1- it is not obvious from the README that one has to clone and then copy the src
folder from your graph-cut-ransac
repo to the folder in magsac/graph-cut-ransac
(which is empty when cloning magsac). By reading through the CMakeLists.txt file I figured it out and was able to configure/generate with Cmake and then build.
2- I set the CREATE_SAMPLE_PROJECT var as follows set(CREATE_SAMPLE_PROJECT
ON)` and Cmake generation failed:
CMake Error at CMakeLists.txt:105 (target_link_libraries):
Target "MAGSAC" of type EXECUTABLE may not be linked into another target.
One may link only to INTERFACE, OBJECT, STATIC or SHARED libraries, or to
executables with the ENABLE_EXPORTS property set.
I changed the target_link_libraries()
section in CREATE_SAMPLE_PROJECT
and it generated, built, and I can run it now:
target_link_libraries(SampleProject
${OpenCV_LIBS}
Eigen3::Eigen
)
A question, I see that you are linking with OpenMP, but I didn't see anywhere in the paper where you mention parallelization or implementation details (but I only did a high-level read). Is the OpenMP for speeding up the OpenCV parts of the code, or do you use parallelization currently in the MAGSAC++ algo?
Thank you for sharing your great work. I am trying to understand and utilize magsac and related functions.
What do you intend is the difference between pymagsac.findHomography() and cv2.findHomography (with the method option specified to be “cv2.USAC_MAGSAC”)?
Thank you.
Hi,
Thanks for your great work on magsac. I am trying to install magsac using pip and python 3.8. Per the pip output, I successfully installed pymagsac==0.2.0
. I've done this using the command pip3 install -e .
as well as the command pip3 install pymagsac==0.2.0
. Side note: the command in the github site pip3 install magsac
produces the error ERROR: No matching distribution found for magsac
However, when importing in python, I get the following error:
>>> import pymagsac Traceback (most recent call last): File "<stdin>", line 1, in <module> File "magsac/src/pymagsac/__init__.py", line 1, in <module> from .pymagsac import * ModuleNotFoundError: No module named 'pymagsac.pymagsac'
For what it's worth, I was unable to install using python3 ./setup.py install
or cmake
due to local issues, so I can't say for sure those would have worked for me.
Thanks for your support, apologies if I've missed something obvious!
Chris
hii, thank for your sharing,
Many of the strategies for optimizing result of the transformation estimation in the image problem.
the algorithm suitable for find SIM3 matrix from two group 3D points pair in coordinate transforamton problem?
Hello authors,
Thanks much for sharing the code.
Actually, I am looking for the code for estimating the essential matrix but fail to figure out. Do you release the code for essential matrix as described in the paper?
Hi,
your paper is very interesting, thanks for sharing the code!
Just out of curiosity. In some of my old experiments (see "noRANSAC for fundamental matrix estimation", Table 5), I found that the geometric epipolar error (i.e. sqrt(e12^2+e21^2)) is usually more robust than the symmetric epipolar error. Did you also try some kind of similar error with MAGSAC?
Thanks again,
Fabio
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.