
    %h$H              
          d dl Z d dlmZ d dlmc mZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ d dlmZmZ d d	lmZ d d
lmZmZ d dlmZmZmZ d dlmZ ddZ ddZ! G d dejD                  eddg d      Z# G d dejD                        Z$ G d dejD                        Z% G d dejD                  eddg d      Z&y)    N)	rearrange)	laplacian)PyTorchModelHubMixin)Config)class_labels_TR_sorted)build_backbone)BasicDecBlkResBlk)BasicLatBlk)ASPPASPPDeformable)RefinerRefinerPVTInChannels4RefUNet)	StemLayerc                     |>| j                   d   |j                   d   z  | j                   d   |j                   d   z  }}t        | |||      }|S )Nhgwgshaper   )imagegrid_hgrid_w	patch_reftransformationpatchess         1/var/www/html/mariraj/BiRefNet/models/birefnet.pyimage2patchesr!      sV    RIOOB,??RT]TcTcdfTgAg~&VDGN    c                     |D|j                   d   | d   j                   d   z  |j                   d   | d   j                   d   z  }}t        | |||      }|S )Nr   r   r   r   r   )r   r   r   r   r   r   s         r    patches2imager$      se    ",
0@0@0DDiooVXFY]def]g]m]mnp]qFqg~&VDELr"   c                   2     e Zd Zd fd	Zd Zd Zd Z xZS )BiRefNetc                 2   t         t        |           t               | _        d| _        t        | j                  j                  |      | _        | j                  j                  }| j                  j                  rXt        j                  d      | _        t        j                  t        j                  |d   t        t                           | _        | j                  j$                  rt        j                  t'        t)        | j                  j$                  j+                  d      d               D cg c]`  } t)        | j                  j$                  j+                  d      d         |d   t-        | j                  j.                        z   |d         b c} | _        t3        |      | _        | j                  j6                  r^t        j                  t        j8                  ddddd      t        j8                  ddddd      t        j:                  d	            | _        | j                  j>                  r}| j                  j>                  d
k(  r0tA        ddd| j                  jB                  dkD  rdnd      | _"        n4t)        djG                  | j                  j>                  d            | _$        | j                  jJ                  rCtM        | jO                                | jO                         D ]  \  }}d|v sd|vsd|_(         y y c c}w )N   )
pretrained)r(   r(   r   _x      Tinplaceitself   0   BNLN)in_channelsinter_channelsout_channels
norm_layerz{}({})zin_channels=3+1zbb.zrefiner.F))superr&   __init__r   configepochr   bblateral_channels_in_collectionauxiliary_classificationnnAdaptiveAvgPool2davgpool
SequentialLinearlenr   cls_headsqueeze_blockrangeevalsplitsumcxtsqueeze_moduleDecoderdecoderenderConv2dReLUdec_endrefiner   
batch_size
stem_layerformatrefiner	freeze_bbprintnamed_parametersrequires_grad)selfbb_pretrainedchannels_keyvalue	__class__s         r    r9   zBiRefNet.__init__%   sj   h&(h
 MJ;;==;;////7DLMM		(1+s+A'BCDM ;;$$"$--tDKK$=$=$C$CD$I!$LMN2 ?T[[..44T:1=>x{3t{{K_?_aijkalm2 #D
 x(;;==		!RAq)		"aAq)%DL ;;{{!!X-"+B]^sws~s~  tJ  tJ  MN  tNko  TX  #Y#HOODKK4F4FHY$Z[;;  $'')*"335 0
UC<Jc$9*/E'0 !+2s   5A%Lc                 	   | j                   j                  dv rm| j                  j                  |      }| j                  j                  |      }| j                  j	                  |      }| j                  j                  |      }n| j                  |      \  }}}}| j                   j                  r|j                  \  }}}}	t        j                  ||dz  |	dz  fdd      }
| j                   j                  dk(  r| j                   j                  dv rm| j                  j                  |
      }| j                  j                  |      }| j                  j	                  |      }| j                  j                  |      }n| j                  |
      \  }}}}t        j                  |t        j                  ||j                  dd  dd      gd      }t        j                  |t        j                  ||j                  dd  dd      gd      }t        j                  |t        j                  ||j                  dd  dd      gd      }t        j                  |t        j                  ||j                  dd  dd      gd      }n| j                   j                  d	k(  r| j                  |
      \  }}}}|t        j                  ||j                  dd  dd      z   }|t        j                  ||j                  dd  dd      z   }|t        j                  ||j                  dd  dd      z   }|t        j                  ||j                  dd  dd      z   }| j                  rS| j                   j                  r=| j                  | j                  |      j!                  |j                  d
   d            nd }| j                   j"                  rt        j                  g t        j                  ||j                  dd  dd      t        j                  ||j                  dd  dd      t        j                  ||j                  dd  dd      gt%        | j                   j"                         d  |d      }||||f|fS )N)vgg16vgg16bnresnet50   bilinearTsizemodealign_cornerscatr(   dimaddr   r   )r:   r<   conv1conv2conv3conv4mul_scl_iptr   Finterpolatetorchrm   trainingr>   rE   rA   viewrK   rD   )r\   xx1x2x3x4BCHW	x_pyramidx1_x2_x3_x4_class_predss                   r    forward_enczBiRefNet.forward_encP   s   ;;>>==q!Bb(92b@Q2X\X_X_XeXefhXiSU!WWQZNBB;;""JAq!Qaq!tQTl[_`I{{&&%/;;>>%EE''--	2C$''--:LCTXT[T[TaTabeTfcnrnunun{n{|  oAhk)-);&Cc3YYAMM#BHHQRLzim$nouvwYYAMM#BHHQRLzim$nouvwYYAMM#BHHQRLzim$nouvwYYAMM#BHHQRLzim$nouvw((E1%)WWY%7"S#s!--"((12,Z_cdd!--"((12,Z_cdd!--"((12,Z_cdd!--"((12,Z_cddOS}}aealal  bF  bFdmmDLL$4$9$9"((1+r$JK  LP;;??brxx|*\`abrxx|*\`abrxx|*\`a 4;;??++,	.  
B BB,,r"   c                 ~   | j                  |      \  \  }}}}}| j                  j                  r| j                  |      }|||||g}| j                  rV| j                  j
                  r@|j                  t        t        j                  |d      j                  d      d             | j                  |      }||fS )Nr(   rn      )kernel_size)r   r:   rF   rL   ry   out_refappendr   rx   mean	unsqueezerN   )	r\   r{   r|   r}   r~   r   r   featuresscaled_predss	            r    forward_orizBiRefNet.forward_oriv   s    (,(8(8(;%RR+;;$$$$R(Br2r2&==T[[00OOIejj&:&D&DQ&GUVWX||H-[((r"   c                 T    | j                  |      \  }}|g}| j                  r||gS |S N)r   ry   )r\   r{   r   r   class_preds_lsts        r    forwardzBiRefNet.forward   s4    $($4$4Q$7!k&-26--o.Q\Qr"   T)__name__
__module____qualname__r9   r   r   r   __classcell__rb   s   @r    r&   r&      s    )0V$-L
)Rr"   r&   birefnetz&https://github.com/ZhengPeng7/BiRefNet)zImage SegmentationzBackground RemovalzMask GenerationzDichotomous Image SegmentationzCamouflaged Object DetectionzSalient Object Detection)library_namerepo_urltagsc                   $     e Zd Z fdZd Z xZS )rM   c           	         t         t        |           t               | _        t        | j                  j                        }t        | j                  j                        }| j                  j                  r| j                  j                  | _
        d}t        }d}d} || j                  rdnd||d   dz  g|   |      | _         || j                  rdnd||d   dz  g|   |      | _         || j                  rd	nd||d   dz  g|   |      | _         || j                  rd
nd||d   dz  g|   |      | _         || j                  rdnd||d   dz  g|   |      | _        nd | _
         ||d   | j                  j                  r|d   dz  g   ndz   |d         | _         ||d   | j                  j                  r|d   dz  g   ndz   |d         | _         ||d   | j                  j                  r|d   dz  g   ndz   |d         | _         ||d   | j                  j                  r|d   dz  g   ndz   |d   dz        | _        t+        j,                  t+        j.                  |d   dz  | j                  j                  r|d   dz  g   ndz   dddd            | _         ||d   |d         | _         ||d   |d         | _         ||d   |d         | _        | j                  j8                  rBt+        j.                  |d   dddd      | _        t+        j.                  |d   dddd      | _        t+        j.                  |d   dddd      | _        | j                  j@                  rd}t+        j,                  t+        j.                  |d   |ddd      | j                  jB                  dkD  rt+        jD                  |      nt+        jF                         t+        jH                  d            | _%        t+        j,                  t+        j.                  |d   |ddd      | j                  jB                  dkD  rt+        jD                  |      nt+        jF                         t+        jH                  d            | _&        t+        j,                  t+        j.                  |d   |ddd      | j                  jB                  dkD  rt+        jD                  |      nt+        jF                         t+        jH                  d            | _'        t+        j,                  t+        j.                  |dddd            | _(        t+        j,                  t+        j.                  |dddd            | _)        t+        j,                  t+        j.                  |dddd            | _*        t+        j,                  t+        j.                  |dddd            | _+        t+        j,                  t+        j.                  |dddd            | _,        t+        j,                  t+        j.                  |dddd            | _-        y y y )N@   r(   i   r,   r      )r5   i      r1   rg   r+   Tr-   ).r8   rM   r9   r   r:   rH   dec_blklat_blkdec_iptdec_ipt_splitrI   SimpleConvsipt_blk5ipt_blk4ipt_blk3ipt_blk2ipt_blk1decoder_block4decoder_block3decoder_block2decoder_block1r?   rB   rP   	conv_out1lateral_block4lateral_block3lateral_block2ms_supervisionconv_ms_spvn_4conv_ms_spvn_3conv_ms_spvn_2r   rT   BatchNorm2dIdentityrQ   gdt_convs_4gdt_convs_3gdt_convs_2gdt_convs_pred_4gdt_convs_pred_3gdt_convs_pred_2gdt_convs_attn_4gdt_convs_attn_3gdt_convs_attn_2)
r\   r^   DecoderBlockLateralBlock	N_dec_iptDBlockicipt_cha_opt_Nrb   s
            r    r9   zDecoder.__init__   s   gt%'hDKK//0DKK//0;;22DJI FBK"djj7a)XVW[Z[^A\]hAiz|}DM"TZZ6QHUVKYZN@[\g@hy{|DM"TZZ6QHUVKYZN@[\g@hy{|DM"TZZ6QHUVKYZN@[\g@hy{|DM"TZZ6QHUVKYZN@[\g@hy{|DMDJ*8A;dhdododwdwHQKQRN8ST_8`}~+  BJ  KL  BM  N*8A;dhdododwdwHQKQRN8ST_8`}~+  BJ  KL  BM  N*8A;dhdododwdwHQKQRN8ST_8`}~+  BJ  KL  BM  N*8A;dhdododwdwHQKQRN8ST_8`}~+  BJ  KL  BM  OP  BP  Qryy!amqmxmx  nA  nA)XVW[Z[^A\]hAi  GH  2I  KL  NO  QR  TU  (V  W*8A;D*8A;D*8A;D;;%%"$))HQKAq!"DD"$))HQKAq!"DD"$))HQKAq!"DD{{""#%==8A;AqRS1Tlplwlw  mC  mC  FG  mGVXVdVdegVh  MO  MX  MX  MZ  \^  \c  \c  lp  \q  $r #%==8A;AqRS1Tlplwlw  mC  mC  FG  mGVXVdVdegVh  MO  MX  MX  MZ  \^  \c  \c  lp  \q  $r #%==8A;AqRS1Tlplwlw  mC  mC  FG  mGVXVdVdegVh  MO  MX  MX  MZ  \^  \c  \c  lp  \q  $r (*biiAq!Q6O(P%(*biiAq!Q6O(P%(*biiAq!Q6O(P%(*biiAq!Q6O(P%(*biiAq!Q6O(P%(*biiAq!Q6O(P% # &r"   c                 F   | j                   r$| j                  j                  rg }g }|\  }}}}}}	n|\  }}}}}g }
| j                  j                  rg| j                  rt        ||d      n|}t        j                  || j                  t        j                  ||j                  dd  dd            fd      }| j                  |      }| j                  j                  r| j                   r| j                  |      nd }| j                  j                  r| j                  |      }| j                   r^|}	t        j                  ||	j                  dd  dd      z  }j!                  |       | j#                  |      }j!                  |       | j%                  |      j'                         }||z  }t        j                  ||j                  dd  dd      }|| j)                  |      z   }| j                  j                  rg| j                  rt        ||d      n|}t        j                  || j+                  t        j                  ||j                  dd  dd            fd      }| j-                  |      }| j                  j                  r| j                   r| j/                  |      nd }| j                  j                  r| j1                  |      }| j                   r^|}	t        j                  ||	j                  dd  dd      z  }j!                  |       | j3                  |      }j!                  |       | j5                  |      j'                         }||z  }t        j                  ||j                  dd  dd      }|| j7                  |      z   }| j                  j                  rg| j                  rt        ||d      n|}t        j                  || j9                  t        j                  ||j                  dd  dd            fd      }| j;                  |      }| j                  j                  r| j                   r| j=                  |      nd }| j                  j                  r| j?                  |      }| j                   r^|} 	t        j                  | |	j                  dd  dd      z  }!j!                  |!       | jA                  |      }"j!                  |"       | jC                  |      j'                         }#||#z  }t        j                  ||j                  dd  dd      }|| jE                  |      z   }$| j                  j                  rg| j                  rt        ||$d      n|}t        j                  |$| jG                  t        j                  ||j                  dd  dd            fd      }$| jI                  |$      }$t        j                  |$|j                  dd  dd      }$| j                  j                  rg| j                  rt        ||$d      n|}t        j                  |$| jK                  t        j                  ||j                  dd  dd            fd      }$| jM                  |$      }%| j                  j                  r?| j                   r3|
j!                  |       |
j!                  |       |
j!                  |       |
j!                  |%       | j                  j                  r| j                   s|
S g|
fS )N$b c (hg h) (wg w) -> b (c hg wg) h wr   r   rg   rh   Tri   r(   )'ry   r:   r   r   rI   r!   rx   rm   r   rv   rw   r   r   r   r   r   r   r   r   sigmoidr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )&r\   r   outs_gdt_predouts_gdt_labelr{   r|   r}   r~   r   gdt_gtoutspatches_batchp4m4p4_gdtm4_diagdt_label_main_4
gdt_pred_4
gdt_attn_4_p4_p3p3m3p3_gdtm3_diagdt_label_main_3
gdt_pred_3
gdt_attn_3_p2p2m2p2_gdtm2_diagdt_label_main_2
gdt_pred_2
gdt_attn_2_p1p1_outs&                                         r    r   zDecoder.forward   s   ==T[[00MN(0%Ar2r2v (Ar2r2;;uyuuM!rJpq  FGMBammMPRPXPXYZY[P\cm  ~B  /C  !D  E  GH  IB  $(,(B(Bt}}T  $Z^;;%%b)F}}#)AMM&v||TUTVGW^hx|,}#} %%&67!226:
$$Z0..v6>>@JjBmmBRXXab\
RVWD''++;;vz  wA  wAM!sKqr  GHM))S$--mRTRZRZ[\[]R^eo  @D  1E  #F  G  IJ  KC  %(,(B(Bt}}T  $Z^;;%%b)F}} #)AMM&v||TUTVGW^hx|,}#} %%&67 "226:
$$Z0..v6>>@J jBmmBRXXab\
RVWD''++;;vz  wA  wAM!sKqr  GHM))S$--mRTRZRZ[\[]R^eo  @D  1E  #F  G  IJ  KC  %(,(B(Bt}}T  $Z^;;%%b)F}}#)AMM&v||TUTVGW^hx|,}#} %%&67!226:
$$Z0..v6>>@JjBmmBRXXab\
RVWD''++;;vz  wA  wAM!sKqr  GHM))S$--mRTRZRZ[\[]R^eo  @D  1E  #F  G  IJ  KC!!#&mmCaggabk
RVW;;vz  wA  wAM!sKqr  GHM))S$--mRSRYRYZ[Z\R]dn  C  1D  #E  F  HI  JC$;;%%$--KKOKKOKKOF KK//DMMto-YgIhjnHoor"   r   r   r   r9   r   r   r   s   @r    rM   rM      s    /Qb]pr"   rM   c                   6     e Zd Z	 ddededdf fdZd Z xZS )r   r4   r6   returnNc                     t         |           t        j                  ||ddd      | _        t        j                  ||ddd      | _        y )Nr,   r(   )r8   r9   r?   rP   rq   conv_out)r\   r4   r6   r5   rb   s       r    r9   zSimpleConvs.__init__  s@     	YY{NAq!D
		.,1aHr"   c                 B    | j                  | j                  |            S r   )r   rq   )r\   r{   s     r    r   zSimpleConvs.forward"  s    }}TZZ]++r"   )r   )r   r   r   intr9   r   r   r   s   @r    r   r     s,    BDII.1I	I,r"   r   c                   &     e Zd Zd fd	Zd Z xZS )BiRefNetC2Fc           
      v   t         t        |           t               | _        d| _        d| _        t        d      | _        t        d      | _	        t        j                  ddddd      | _        t        j                  t        j                  ddddd      t        j                  ddddd            | _        y )Nr(   r0   T)r]   r,   r   r+   )r8   r   r9   r   r:   r;   gridr&   model_coarse
model_finer?   rP   input_mixerrB   output_mixer_merge_post)r\   r]   rb   s     r    r9   zBiRefNetC2F.__init__0  s    k4)+h
	$48"699Q1a3')}}RYYq"aA5NPRPYPYZ\^_abdeghPi'j$r"   c                    |j                         }t        j                  || j                  j                  d d d   D cg c]  }|| j
                  z   c}dd      }| j                  r| j                  |      \  }}n| j                  |      }t        ||d      }t        j                  | j                  j                  r| j                  s|d   n|d   d   |j                  dd  dd      }t        ||d      }t        j                  ||gd	      }	| j                  |	      }
t        ||
d
      }| j                  r| j                  |
      \  }}n| j                  |
      }| j                  r| j                  j                  ri|\  \  }}}|\  \  }}}t        |      D ]:  \  }}| j!                  t#        || j
                  | j
                  d            ||<   < ||z   ||z   g||z   fgS ||D cg c]4  }| j!                  t#        || j
                  | j
                  d            6 c}z   gS ||D cg c]4  }| j!                  t#        || j
                  | j
                  d            6 c}z   S c c}w c c}w c c}w )Nr   rh   Tri   $b c (hg h) (wg w) -> (b hg wg) c h wr   r(   rg   rn   r   $(b hg wg) c h w -> b c (hg h) (wg w))r   r   r   )clonerv   rw   r:   rj   r   ry   r   r!   r   r   rx   rm   r   r   	enumerater  r$   )r\   r{   x_orisr   r   x_HR_patchespredpred_patchestx_HRscaled_preds_HRclass_preds_lst_HRr   r   r   outs_gdt_pred_HRouts_gdt_label_HRouts_HRidx_outout_HRscaled_pred_HRs                         r    r   zBiRefNetC2F.forward:  s    	MM!9I9I$B$9O"PA1dii<"PWaquv==,0,=,=a,@)L/,,Q/L$UaHno}}dkk6I6Idmm\"-bnopbqrtbu  }B  }H  }H  IJ  IK  }L  S]  mq  r$TQGmnII|\2:"$TTJpq==26//$2G/O/"ood3O=={{""8D5/AP>5!#4w'0'9 vOGV'+'C'CMRXaeajajsws|s|  Nt  Eu  (vGG$v'*::NM^<^_aehoaop  sB  C  C !  Ra  $b  @ND$@$@~fjfofox|  yB  yB  Sy  Bz  %{  $b  b# 
    Q`  #a  M4#?#?neienenw{  xA  xA  Rx  Ay  $z  #a  a  a? #Q6 $b #as   I=
:9J?9Jr   r   r   s   @r    r   r   )  s    k"ar"   r   birefnet_c2fz*https://github.com/ZhengPeng7/BiRefNet_C2F)rg   rg   Nr  )rg   rg   Nr  )'rx   torch.nnr?   torch.nn.functional
functionalrv   einopsr   kornia.filtersr   huggingface_hubr   r:   r   datasetr   models.backbones.build_backboner   models.modules.decoder_blocksr	   r
   models.modules.lateral_blocksr   models.modules.asppr   r   models.refinement.refinerr   r   r   models.refinement.stem_layerr   r!   r$   Moduler&   rM   r   r    r"   r    <module>r&     s         $ 0  * : = 5 4 M M 2gRII5 
ggRTOpbii Opd	,")) 	,3aII9 
g3ar"   