o
    oiS9                     @   s   d Z ddlZddlmZ ddlmZmZmZ ddlZddl	m
Z
mZmZmZ ddlmZ ddlmZmZmZmZmZmZ ddlmZmZmZ d	gZG d
d	 d	eZdS )z!Module containing RANSAC modules.    N)partial)CallableOptionalTuple)DeviceModuleTensorzeros)KORNIA_CHECK_SHAPE)find_fundamentalfind_homography_dltfind_homography_dlt_iteratedfind_homography_lines_dlt"find_homography_lines_dlt_iteratedsymmetrical_epipolar_distance)#line_segment_transfer_error_one_wayoneway_transfer_errorsample_is_valid_for_homographyRANSACc                       sb  e Zd ZdZ						d/ded	ed
ededededdf fddZd0deded
edee	 de
f
ddZedededededef
ddZde
de
de
fddZde
de
d e
d	edee
e
ef f
d!d"Zde
de
dee
e
f fd#d$Zd e
de
fd%d&Zde
de
d'e
de
fd(d)Zd0de
de
d*ee
 ddfd+d,Zd0de
de
d*ee
 dee
e
f fd-d.Z  ZS )1r   a  Module for robust geometry estimation with RANSAC. https://en.wikipedia.org/wiki/Random_sample_consensus.

    Args:
        model_type: type of model to estimate: "homography", "fundamental", "fundamental_7pt",
            "homography_from_linesegments".
        inliers_threshold: threshold for the correspondence to be an inlier.
        batch_size: number of generated samples at once.
        max_iterations: maximum batches to generate. Actual number of models to try is ``batch_size * max_iterations``.
        confidence: desired confidence of the result, used for the early stopping.
        max_local_iterations: number of local optimization (polishing) iterations.

    
homography       @   
   Gz?   
model_typeinl_th
batch_sizemax_iter
confidencemax_lo_itersreturnNc                    s   t    g d| _|| _|| _|| _|| _|| _|| _|| _|  |  |  |dkr7t	| _
t| _t| _d| _dS |dkrIt| _
t| _t| _d| _dS |dkr[t| _
t| _d| _t| _dS |dkrqt| _
ttdd	| _d
| _t| _dS t| d| j )ae  Initialize the RANSAC estimator.

        Args:
            model_type: type of model to estimate: "homography", "fundamental", "fundamental_7pt",
                "homography_from_linesegments".
            inl_th: threshold for the correspondence to be an inlier.
            batch_size: number of generated samples at once.
            max_iter: maximum batches to generate. Actual number of models to try is ``batch_size * max_iter``.
            confidence: desired confidence of the result, used for the early stopping.
            max_lo_iters: number of local optimization (polishing) iterations.

        )r   fundamentalfundamental_7pthomography_from_linesegmentsr      r$   r"      r#   7POINT)method   z is unknown. Try one of N)super__init__supported_modelsr   r   r   r   r   r    r   error_fnr   minimal_solverr   polisher_solverminimal_sample_sizer   r   r   r   r   r   NotImplementedError)selfr   r   r   r   r   r    	__class__ J/home/ubuntu/.local/lib/python3.10/site-packages/kornia/geometry/ransac.pyr+   ;   sB   





zRANSAC.__init__sample_sizepop_sizedevicec                 C   s8   |du r	t d}t j|||d}|j|dd\}}|S )a  Minimal sampler, but unlike traditional RANSAC we sample in batches.

        Yields the benefit of the parallel processing, esp. on GPU.

        Args:
            sample_size: number of samples to draw from the population.
            pop_size: size of the population to sample from.
            batch_size: number of sample sets to generate.
            device: device to place the samples on.

        Returns:
            Tensor of sampled indices with shape :math:`(batch_size, sample_size)`.

        Ncpu)r9      )kdim)torchr9   randtopk)r2   r7   r8   r   r9   r?   _outr5   r5   r6   sampleu   s
   
zRANSAC.samplen_inlnum_tcconfc                 C   sR   d}||krdS | |krdS t d| t| t t|dt | | |  S )a  Update max_iter to stop iterations earlier https://en.wikipedia.org/wiki/Random_sample_consensus.

        Args:
            n_inl: number of inliers.
            num_tc: total number of correspondences.
            sample_size: size of minimal sample.
            conf: desired confidence level.

        Returns:
            Maximum number of samples needed to achieve the desired confidence.

        g&.>g      ?)mathlogminmaxpow)rD   rE   r7   rF   epsr5   r5   r6   max_samples_by_conf   s   6zRANSAC.max_samples_by_confkp1kp2c              
   C   s6   |j dd \}}| ||tj|||j|jd}|S )a  Estimate models from minimal samples.

        Args:
            kp1: source keypoints with shape :math:`(batch_size, sample_size, 2)`.
            kp2: target keypoints with shape :math:`(batch_size, sample_size, 2)`.

        Returns:
            Estimated models tensor.

        N   dtyper9   )shaper.   r>   onesrR   r9   )r2   rN   rO   r   r7   Hr5   r5   r6   estimate_model_from_minsample   s    z$RANSAC.estimate_model_from_minsamplemodelsc              	   C   s   t |jdkr|d }t |jdkr|d }|jd }| jdkr4| ||ddd||ddd|}n| ||dd||dd|}||k}||jdd}| }	||	  }
||	 	 }||	 }|||
fS )a  Verify models by computing inliers and selecting the best model.

        Args:
            kp1: source keypoints.
            kp2: target keypoints.
            models: candidate models to verify.
            inl_th: inlier threshold.

        Returns:
            Tuple containing:
                - Best model
                - Inlier mask for the best model
                - Score of the best model

        rP   Nr   r$   r;   r=   )
lenrS   r   r-   expandtosumargmaxitemclone)r2   rN   rO   rW   r   r   errorsinlmodels_scorebest_model_idxbest_model_score
model_bestinliers_bestr5   r5   r6   verify   s   

("
zRANSAC.verifyc                 C   s,   | j dkrt||}|| || fS ||fS )zRemove degenerate samples based on model-specific constraints.

        Args:
            kp1: source keypoints.
            kp2: target keypoints.

        Returns:
            Tuple of filtered keypoints (kp1, kp2).

        r   )r   r   )r2   rN   rO   maskr5   r5   r6   remove_bad_samples   s   

zRANSAC.remove_bad_samplesc                 C   s0   t j|ddd}| jddd dk}|| S )zRemove degenerate models based on simple heuristics.

        Args:
            models: candidate models to filter.

        Returns:
            Filtered models tensor.

        r;   rP   )dim1dim2rY   r   g-C6?)r>   diagonalabsrI   )r2   rW   main_diagonalri   r5   r5   r6   remove_bad_models   s   zRANSAC.remove_bad_modelsinliersc              
   C   sF   || d }|| d }| d}| ||tjd||j|jd}|S )a  Polish the model using inliers through local optimization.

        Args:
            kp1: source keypoints.
            kp2: target keypoints.
            inliers: boolean mask indicating inlier correspondences.

        Returns:
            Polished model tensor.

        Nr;   rQ   )sizer/   r>   rT   rR   r9   )r2   rN   rO   rq   kp1_inlkp2_inlnum_inlmodelr5   r5   r6   polish_model   s   
zRANSAC.polish_modelweightsc                 C   s   | j dv r5t|ddg t|ddg |jd |jd kr%|jd | jk r5td| j d|j d|j | j dkrjt|g d	 t|g d	 |jd |jd krZ|jd | jk rltd| j d
|j d|j dS dS )aG  Validate input tensors for shape and size requirements.

        Args:
            kp1: source keypoints.
            kp2: target keypoints.
            weights: optional correspondence weights (not used currently).

        Raises:
            ValueError: if input shapes are invalid or insufficient correspondences.

        )r   r"   N2r   zMkp1 and kp2 should be                                  equal shape at least [z+, 2],                                  got z, r$   )ry   rz   rz   z., 2, 2],                                  got N)r   r
   rS   r0   
ValueError)r2   rN   rO   rx   r5   r5   r6   validate_inputs  s8   
$
$zRANSAC.validate_inputsc                 C   s  |  ||| t| j}t|}tdd|j|jd}t|d|jtjd}t	| j
D ]}| | j|| j|j}	||	 }
||	 }| |
|\}
}t|
dkrMq)| |
|}| |}|du sbt|dkrcq)| |||| j\}}}||krt	| jD ]1}| |||}|du st|dkrqx| |||| j\}}}||kr| d }| }|}qx | }| }|}t| t||| j| j}|d | j |kr ||fS q)||fS )a  Call main forward method to execute the RANSAC algorithm.

        Args:
            kp1: source image keypoints :math:`(N, 2)`.
            kp2: distance image keypoints :math:`(N, 2)`.
            weights: optional correspondences weights. Not used now.

        Returns:
            - Estimated model, shape of :math:`(1, 3, 3)`.
            - The inlier/outlier mask, shape of :math:`(1, N)`, where N is number of input correspondences.

           rQ   r;   )r9   rR   r   N)r|   floatr0   rZ   r	   rR   r9   r>   boolranger   rC   r   rj   rV   rp   rh   r   r    rw   r`   intrM   r   )r2   rN   rO   rx   best_score_totalrE   best_model_totalinliers_best_totaliidxskp1_sampledkp2_sampledrW   rv   rq   model_scorerA   model_lo
inliers_loscore_lonew_max_iterr5   r5   r6   forward$  sN   

 zRANSAC.forward)r   r   r   r   r   r   )N)__name__
__module____qualname____doc__strr~   r   r+   r   r   r   rC   staticmethodrM   rV   r   rh   rj   rp   rw   r|   r   __classcell__r5   r5   r3   r6   r   -   sB    $: (! 0)r   rG   	functoolsr   typingr   r   r   r>   kornia.corer   r   r   r	   kornia.core.checkr
   kornia.geometryr   r   r   r   r   r   kornia.geometry.homographyr   r   r   __all__r   r5   r5   r5   r6   <module>   s    