[scikit-image] robust epipolar geometry estimation with ransac
Juan Nunez-Iglesias
jni.soma at gmail.com
Tue Mar 20 23:03:50 EDT 2018
@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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/scikit-image/attachments/20180320/171b3735/attachment.html>
More information about the scikit-image
mailing list