o Аte\@s2ddlZddlZddlZddlmZddlZddlmZ ddl m Z e dGdddeZGdddeZGdddeZGd d d eZGd d d eZGd ddeZGdddeZGdddeZGdddeZGdddeZGdddeZGdddeZGdddeZGdddeZdS)N)Imagec@s2eZdZdZd ddZddZddZd d Zd S) ResizeaRescale the image in a sample to a given size. Args: output_size (tuple or int): Desired output size. If tuple, output is matched to output_size. If int, smaller of image edges is matched to output_size keeping aspect ratio the same. FcCs8t|ttfs Jt|tr||f|_n||_||_dSN) isinstanceinttuple output_size use_padding)selfrr r d/Users/ajkenkazin/Desktop/SAM_Track_1/Segment-and-Track-Anything/aot/dataloaders/video_transforms.py__init__s    zResize.__init__cCs|jr||S||Sr)r paddingrescale)r sampler r r __call__szResize.__call__c Cs|d}|jdd\}}|j||fkr|S|j\}}|D]O}d|vr&q||}|dks6|dks6|dkr:tj} ntj} |dksE|dkr`g} |} | D]}tj|||f| d}| |qK| }n tj|||f| d}|||<q|S)Nprev_imgmetacurr_imgref_img curr_labelZdsize interpolation)shaperkeyscv2 INTER_CUBIC INTER_NEARESTresizeappend) r rrhwnew_hnew_welemtmpflagvalnew_tmpall_tmpr r r r!s8    zResize.rescalec Cs|d}|jdd\}}|j||fkr|S|j\}}dd}|||\}} |||\} } |D]S} d| vr:q3|| } | dksJ| dksJ| dkrMd}nd }| dksW| d krug}| }|D]} tj| || | | tj|d } || q]|} n tj| || | | tj|d } | || <q3|S) NrrcSs"tjd|d}||}||fS)Nr)nprandomrandint)xx0x1r r r sep_padMszResize.padding..sep_padrrr)|thrr)value)rrrrZcopyMakeBorderZBORDER_CONSTANTr )r rrr!r"r#r$r1Ztop_padZ bottom_padleft_pad right_padr%r& pad_valuer(r)r r r rEsN    zResize.paddingNF)__name__ __module__ __qualname____doc__r rrrr r r r r s   $rc@s(eZdZdZ   d ddZddZdS) BalancedRandomCropzCrop randomly the image in a sample. Args: output_size (tuple or int): Desired output size. If int, square crop is made. dcCsTt|ttfs Jt|tr||f|_n t|dksJ||_||_||_||_dS)Nr)rrrrlenmax_step max_obj_nummin_obj_pixel_num)r rrBrCrDr r r r s   zBalancedRandomCrop.__init__cCs0|d}|jdd\}}|j\}}||kr|n|}||kr |n|}|d}|d}|d} d} d} | s| |jkr| d7} tjd||d} tjd||d} g}g}||g| D]}|| | || | |f}|t|||q]tt |d}|d dkrq2|ddkr|dd}g}|D]}t |d|k}||j kr||qt |dkrd} nd } t ||j krt||d|j }dg|}| s| |jks9g}|D]/}|d}tt |D]}||}|dkrq||k}|||tj7}q||tjq|d|d<|d|d<t |d }g|d<t|D]}|d||dq)|D]M}d |vsHd |vrJq<|d krrg}||D]}|| | || | |f}||qU|||<q<||}|| | || | |f}|||<qzs r>c@s"eZdZdZd ddZddZdS) RandomScale|Randomly resize the image and the ground truth to specified scales. Args: scales (list): the list of scales ??NcCs||_||_||_dSr) min_scale max_scale short_edge)r r`rarbr r r r s zRandomScale.__init__c Cs tj|j|j}|jdur2|d}|jdd\}}||kr)|t|j|9}n |t|j|9}|D]M}d|vr=q6||}|dksM|dksM|dkrQt j }nt j }|dks\|dkrug} |D]} t j | d|||d} | | q`| }n t j |d|||d}|||<q6|SNrrrrrr)fxfyr)r+r,uniformr`rarbrfloatrrrrrr ) r rscrRr!r"r%r&r'r(rZr r r rsB    zRandomScale.__call__)r^r_Nr[r r r r r\  r\c@s6eZdZdZdddddgfddZd d Zd d ZdS) RandomScaleV2r]g ףp= ?r^Ng?gUUUUUU?cCs||_||_||_||_dSr)r`rarbratio)r r`rarbrkr r r r &s zRandomScaleV2.__init__c CsF|d}|jdd\}}|||\}}t||}t||}|jdurO||kr=|t|j|9}|t|j|9}n|t|j|9}|t|j|9}|D]M} d| vrZqS|| } | dksj| dksj| dkrntj} ntj} | dksy| dkrg} | D]} tj| d||| d} | | q}| } n tj| d||| d} | || <qS|Src) r get_paramsrgrbrrrrrr )r rrRr!r"r#r$Zsc_xZsc_yr%r&r'r(rZr r r r0sJ      zRandomScaleV2.__call__c CsH||}dd|jD}tdD]S}|tj|jd|jd}ttj|d|d}tt t ||}tt t ||} d|krO|krcnqd| kr[|krcnq| |fSqt |t |} | t |jkr|}tt |t |j} | |fS| t |jkr|} tt | t |j}| |fS|}|} | |fS)NcSsg|]}t|qSr )r+log).0itemr r r dsz,RandomScaleV2.get_params.. rrr*)rkrOr+r,rfr`raexprroundsqrtrgminmax) r heightwidtharea log_ratio_ target_area aspect_ratior"r!in_ratior r r rlas4 0 zRandomScaleV2.get_params)r:r;r<r=r rrlr r r r rj!s  1rjc@s"eZdZdZdddZddZdS) RestrictSizer]N@@cCs(||_||_|dus|dusJdSdSr)max_short_edge max_long_edge)r rrr r r r szRestrictSize.__init__c Cs2d}|d}|jdd\}}|jdur*||kr|}n|}||jkr)t|j|}n||kr1|}n|}||jkr?t|j|}|durH|}|} n t||}t||} ||dd}| | dd} ||krn| |krn|S|D]$} d| vryqr|| } d| vrtj} ntj} tj | | |f| d} | || <qr|S)Nrrr*rrHr) rrrgrrrrrrr) r rrhrRr!r"rb long_edger#r$r%r&r'r r r rsD       zRestrictSize.__call__)Nrr[r r r r rrirc@s eZdZdZddZddZdS)RandomHorizontalFlipzVHorizontally flip the given image and ground truth randomly with a probability of 0.5.cC ||_dSrpr probr r r r  zRandomHorizontalFlip.__init__cCt|jkrD|D]8}d|vrq |dks|dkr4g}||D]}tj|dd}||q |||<q ||}tj|dd}|||<q |S)Nrrrr*ZflipCoder,rrrflipr r rr%r(rZr&r r r r     zRandomHorizontalFlip.__call__Nr[r r r r rs rc@s"eZdZdZdddZddZdS) RandomVerticalFlipzTVertically flip the given image and ground truth randomly with a probability of 0.5.333333?cCrrrrr r r r rzRandomVerticalFlip.__init__cCr)Nrrrrrrrr r r rrzRandomVerticalFlip.__call__N)rr[r r r r rs  rc@s.eZdZdddgfddZddZdd Zd S) RandomGaussianBlurr皙?g@cCstjt|g|d|_dSNr)TF RandomApplyIT GaussianBluraug)r rsigmar r r r szRandomGaussianBlur.__init__cCsv|D]4}d|vsd|vrq|dkr+g}||D] }||}||q|||<q||}||}|||<q|S)NrrHr)rapply_augmentationr rr r r rs       zRandomGaussianBlur.__call__cCs.tt|}||}tj|tjd}|S)Ndtype)r fromarrayr+rQrarrayfloat32)r r.r r r rs z%RandomGaussianBlur.apply_augmentationN)r:r;r<r rrr r r r rs rc@seZdZdddZdS)RandomGrayScale皙?cCstj|d|_dSr)rRandomGrayscalerrr r r r szRandomGrayScale.__init__N)rr:r;r<r r r r r r src@s eZdZ     dddZdS) RandomColorJitter皙?皙?rrcCs"tjt||||g|d|_dSr)rr ColorJitterr)r r brightnesscontrast saturationhuer r r r s zRandomColorJitter.__init__N)rrrrrrr r r r rsrc@s&eZdZd ddZddZddZdS) SubtractMeanImageFcCs||_||_dSr)meanchange_channels)r rrr r r r s zSubtractMeanImage.__init__cCsd|D]+}d|vr/|jr||ddddgdf||<t||tj|jtjd||<q|S)NrR)rr*rr)rrr+subtractrrr)r rr%r r r rs "zSubtractMeanImage.__call__cCsdt|jS)Nr)strr)r r r r __str__'szSubtractMeanImage.__str__Nr9)r:r;r<r rrr r r r rs  rc@seZdZdZddZdS)ToTensorz&Convert ndarrays in sample to Tensors.cCs,|D]}d|vr q||}|dks|dkr[g}|D]<}|jdkr>|ddddtjf}|d}|t|q|d}|d8}|d}|d}|t|q|}n4|jdkry|ddddtjf}|d}t|}n|d}|d8}|d}|d}t|}|||<q|S) Nrrrrrrr*o@g ףp= ?gv/?gCl?gZd;O?gy&1?g?) rndimr+newaxis transposer torch from_numpyr)r rr%r&r(rZr r r r-s8         zToTensor.__call__N)r:r;r<r=rr r r r r+s rc@s,eZdZddddgddfddZd d ZdS) MultiRestrictSizeNi Fr_TcCs(||_||_||_||_||_||_dSr)rr multi_scaler align_corners max_stride)r rrrrrrr r r r Ss  zMultiRestrictSize.__init__cCsg}|d}|jdd\}}|jD]D}d}|jdur3||kr#|}n|}||jkr3|t|j|9}||||} } d}|jdurZ| | krJ| } n| } | |jkrZ|t|j| 9}|| || } } t| |} t| |} |jr| d|jdkrtt | d|j|jd} | d|jdkrtt | d|j|jd} n(| |jdkrtt | |j|j} | |jdkrtt | |j|j} | |kr| |kr| |n9i} | D]-} d| vr|| | | <q|| }d| vr|| | | <qt j }t j|| | f|d}|| | <q| | |jrW|d }i} | D]-} d| vr;|| | | <d | | d <q$|| }|ddddd f}|| | <q$| | q|S) N current_imgrr^r*rrrHrrGTr)rrrrgrrrrr+aroundr rrrrrcopy)r rsamplesrRr!r"scalerhrbr#r$rZ new_sampler%r&r'Z now_sampler r r ras                  zMultiRestrictSize.__call__)r:r;r<r rr r r r rRs rc@seZdZddZdS) MultiToTensorcCstt|D]W}||}|D]L}d|vrq||}|dur q|jdkrB|ddddtjf}|d}t| |||<q|d}|d8}|d}|d}t||||<qq|S)Nrrrrrr) rOrArrr+rrrrr)r rrXrr%r&r r r rs&    zMultiToTensor.__call__N)r:r;r<rr r r r rs r)r,rnumpyr+PILrrZtorchvision.transforms transformsrZdataloaders.image_transformsimage_transformsrZ setNumThreadsobjectrr>r\rjrrrrrrrrrrr r r r s,    mq6^< 'c