[scikit-image] robust epipolar geometry estimation with ransac
martin sladecek
martin.sladecek at gmail.com
Wed Mar 21 18:40:21 EDT 2018
Hi Juan,
thanks for your response. I can indeed confirm that the fundamental
matrix varies as well. Here are the variances for the same experiment as
before (after normalization):
Scikit-Image variance of fundamental matrix:
[[1.462e-11 4.067e-09 3.153e-04]
[3.701e-09 2.891e-10 8.637e-06]
[2.857e-03 3.343e-05 0.000e+00]]
OpenCV variance of fundamental matrix:
[[0.000e+00 1.148e-41 0.000e+00]
[0.000e+00 0.000e+00 0.000e+00]
[2.708e-35 0.000e+00 0.000e+00]]
It makes sense to me, because the inliers should be calculated based on
how well they comply with the epipolar constraint, here represented by
the fundamental matrix.
As for the parameters, I am also uncertain whether they are the same or not.
I chose the values based on the Fundamental matrix estimation example
(in this case the images are already rectified unlike mine), and the
OpenCV Epipolar Geometry tutorial.
http://scikit-image.org/docs/dev/auto_examples/transform/plot_fundamental_matrix.html#sphx-glr-auto-examples-transform-plot-fundamental-matrix-py
https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_calib3d/py_epipolar_geometry/py_epipolar_geometry.html#epipolar-geometry
When deciding on the parameters I inspected both the cv2 and skimage APIs:
https://docs.opencv.org/3.3.1/d9/d0c/group__calib3d.html#ga30ccb52f4e726daa039fd5cb5bf0822b
http://scikit-image.org/docs/dev/api/skimage.measure.html#ransac
The OpenCV API is for C++, but the python bindings are autogenerated
from it so the parameters should be the same.
Unfortunately I don't know enough C++ to go through the the code and
understand all the differences between the two implementations.
~Martin
On 21/03/18 04:03, Juan Nunez-Iglesias wrote:
>
> @Martin, thanks for the ping. I don’t know about other devs but I’m
> easier to reach here, for sure. =) I added a comment to SO. Having
> said that I think Stéfan is more experienced with RANSAC. (My
> experience ends at having attended Stéfan’s tutorial on the topic. =P)
> But, can you confirm that the fundamental matrix is also varying
> between runs of skimage?
>
>
> Generally, I’m concerned about whether the parameters are really the
> same. I couldn’t find an API reference for cv2 so I couldn’t check for
> differences. Can you point me to how you set up the cv2 ransac parameters?
>
>
> Thanks,
>
>
> Juan.
>
>
> On 19 Mar 2018, 1:03 PM -0400, martin sladecek
> <martin.sladecek at gmail.com>, wrote:
>> Hello,
>>
>> I'm having trouble achieving robust performance with
>> `skimage.measure.ransac` when estimating fundamental matrix for a pair
>> of images.
>> I'm seeing highly varying results with different random seeds when
>> compared to OpenCV's `findFundamentalMatrix`.
>>
>> I'm running both skimage's and opencv's ransac on the same sets of
>> keypoints and with (what I'm assuming are) equivalent parameters.
>> I'm using the same image pair as OpenCV python tutorials
>> (https://github.com/abidrahmank/OpenCV2-Python-Tutorials/tree/master/data).
>>
>> Here's my demonstration script:
>>
>> import cv2
>> import numpy as np
>>
>> from skimage import io
>> from skimage.measure import ransac
>> from skimage.feature import ORB, match_descriptors
>> from skimage.transform import FundamentalMatrixTransform
>>
>> orb = ORB(n_keypoints=500)
>>
>> img1 = io.imread('images/right.jpg', as_grey=True)
>> orb.detect_and_extract(img1)
>> kp1 = orb.keypoints
>> desc1 = orb.descriptors
>>
>> img2 = io.imread('images/left.jpg', as_grey=True)
>> orb.detect_and_extract(img2)
>> kp2 = orb.keypoints
>> desc2 = orb.descriptors
>>
>> matches = match_descriptors(desc1, desc2, metric='hamming',
>> cross_check=True)
>> kp1 = kp1[matches[:, 0]]
>> kp2 = kp2[matches[:, 1]]
>>
>> n_iter = 10
>> skimage_inliers = np.empty((n_iter, len(matches)))
>> opencv_inliers = skimage_inliers.copy()
>>
>> for i in range(n_iter):
>> fmat, inliers = ransac((kp1, kp2), FundamentalMatrixTransform,
>> min_samples=8, residual_threshold=3,
>> max_trials=5000, stop_probability=0.99,
>> random_state=i)
>> skimage_inliers[i, :] = inliers
>>
>> cv2.setRNGSeed(i)
>> fmat, inliers = cv2.findFundamentalMat(kp1, kp2,
>> method=cv2.FM_RANSAC,
>> param1=3, param2=0.99)
>> opencv_inliers[i, :] = (inliers.ravel() == 1)
>>
>> skimage_sum_of_vars = np.sum(np.var(skimage_inliers, axis=0))
>> opencv_sum_of_vars = np.sum(np.var(opencv_inliers, axis=0))
>>
>> print(f'Scikit-Image sum of inlier variances:
>> {skimage_sum_of_vars:>8.3f}')
>> print(f'OpenCV sum of inlier variances: {opencv_sum_of_vars:>8.3f}')
>>
>> And the output:
>>
>> Scikit-Image sum of inlier variances: 13.240
>> OpenCV sum of inlier variances: 0.000
>>
>> I use the sum of variances of inliers obtained from different random
>> seeds as the metric of robustness.
>>
>> I would expect this number to be very close to zero, because truly
>> robust ransac should converge to the same model independently of it's
>> random initialization.
>>
>> How can I make skimage's `ransac` behave as robustly as opencv's?
>>
>> Any other tips on this subject would be greatly appreciated.
>>
>> Best regards,
>> Martin
>>
>> (I originally posted this question on stackoverflow, but I'm not getting
>> much traction there, so I figured I'd try the mailing list.)
>>
>> https://stackoverflow.com/questions/49342469/robust-epipolar-geometry-estimation-with-scikit-images-ransac
>>
>> _______________________________________________
>> scikit-image mailing list
>> scikit-image at python.org
>> https://mail.python.org/mailman/listinfo/scikit-image
>
>
> _______________________________________________
> scikit-image mailing list
> scikit-image at python.org
> https://mail.python.org/mailman/listinfo/scikit-image
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/scikit-image/attachments/20180321/911ea121/attachment.html>
More information about the scikit-image
mailing list