o
    *jf                     @   sB  d dl Z d dlZd dlZd dlmZ d dlZd dlmZ ddlm	Z	 ej
Z
d#ddZd$ddZG d	d
 d
ejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZdd ZG dd dejZG dd dejZG dd  d ejZG d!d" d"ejZdS )%    N)OrderedDict   )CompactDetBackbonec                 C   s2   t j| j| t| drt j| j| d S d S )Nbias)nninitZ	constant_weighthasattrr   )moduleZconstantr    r   q/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/cv/ocr_detection/modules/dbnet.pyconstant_init   s   
r   c                 C   s   t j| |d|dddS )z3x3 convolution with padding   r   Fkernel_sizestridepaddingr   )r   Conv2d)	in_planes
out_planesr   r   r   r   conv3x3   s   r   c                       s,   e Zd Z			d fdd	Zdd Z  ZS )DwPwConvr   Fc              	      s`   t t|   tj|||||||d| _t|| _tjdd| _	tj||dddd|d| _
d S )N)groupsr   TZinplacer   r   )r   r   r   r   r   )superr   __init__r   r   	depthwiseBatchNorm2dbn1ReLUrelu1	pointwise)selfr   r   r   r   r   r   	__class__r   r   r   %   s*   zDwPwConv.__init__c                 C   ,   |  |}| |}| |}| |}|S Nr   r   r    r!   r"   xoutr   r   r   forwardA   
   



zDwPwConv.forward)r   r   F__name__
__module____qualname__r   r+   __classcell__r   r   r#   r   r   #   s    r   c                       $   e Zd Z fddZdd Z  ZS )DwPwConvTransposec                    sZ   t t|   tj|||||d| _t|| _tjdd| _	tj
||ddddd| _d S )N)r   Tr   r   r   )r   r   r   r   )r   r3   r   r   ConvTranspose2dr   r   r   r   r    r   r!   )r"   r   r   r   r   r#   r   r   r   M   s   
zDwPwConvTranspose.__init__c                 C   r%   r&   r'   r(   r   r   r   r+   \   r,   zDwPwConvTranspose.forwardr-   r   r   r#   r   r3   K   s    r3   c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )
BasicBlockr   Nc                    s
  t t|   |d u| _t|||| _t|| _tj	dd| _
d| _| jr2|dd}|dd| _| jr7|rCtj||dddd| _n5|d	d}| jsWd
dlm} |}	d}
n
d
dlm} |}	d}
tj|||
 ddd| _|	||dd|dd| _t|| _|| _|| _d S )NTr   Ffallback_on_stride	modulatedr   r   r   r   r   deformable_groupsr   
DeformConv   ModulatedDeformConv   r   r   )r   r   r9   r   )r   r5   r   with_dcnr   conv1r   r   r   r   reluwith_modulated_dcngetr   conv2assets.ops.dcnr;   r>   conv2_offsetbn2
downsampler   r"   inplanesplanesr   rJ   dcnr6   r9   r;   Zconv_opZoffset_channelsr>   r#   r   r   r   i   sL   






zBasicBlock.__init__c                 C   s   |}|  |}| |}| |}| js| |}n=| jrL| |}|d d d dd d d d f }|d d dd d d d d f  }| |||}n| |}| ||}| |}| j	d urf| 	|}||7 }| |}|S Nr<   i)
rB   r   rC   rA   rF   rD   rH   sigmoidrI   rJ   r"   r)   Zresidualr*   Zoffset_maskoffsetmaskr   r   r   r+      s&   



 $




zBasicBlock.forwardr   NNr.   r/   r0   	expansionr   r+   r1   r   r   r#   r   r5   f   s    (r5   c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )	
Bottleneck   r   Nc              	      sN  t t|   |d u| _tj||ddd| _t|| _d}d| _	| jr0|
dd}|
dd| _	| jr5|rBtj||d|ddd| _n6|
dd}| j	sVd	d
lm} |}	d}
n
d	dlm} |}	d}
tj|||
 ddd| _|	||dd||dd| _t|| _tj||d ddd| _t|d | _tjdd| _|| _|| _|| _|d u| _d S )Nr   F)r   r   r6   r7   r   r   r9   r   r:   r<   r=   r?   r@   )r   r   r   r9   r   rX   Tr   )r   rW   r   rA   r   r   rB   r   r   rD   rE   rF   rG   r;   r>   rH   rI   conv3bn3r   rC   rJ   r   rN   rK   r#   r   r   r      sb   




zBottleneck.__init__c                 C   s   |}|  |}| |}| |}| js| |}n=| jrL| |}|d d d dd d d d f }|d d dd d d d d f  }| |||}n| |}| ||}| |}| |}| 	|}| 
|}| jd uru| |}||7 }| |}|S rO   )rB   r   rC   rA   rF   rD   rH   rP   rI   rY   rZ   rJ   rQ   r   r   r   r+      s,   



 $







zBottleneck.forwardrT   rU   r   r   r#   r   rW      s    2rW   c                       s6   e Zd Z			d fdd	ZdddZd	d
 Z  ZS )ResNet  NFFFFc                    s  || _ || _d| _tt|   tjddddddd| _t	d| _
tjdd| _tjddd	d
| _| |d|d | _| j|d|d	 d|d| _| j|d|d d|d| _| j|d|d d|d| _|  D ]5}t|tjr|jd |jd	  |j }|jjdtd|  qft|t	r|jjd	 |jj  qf| j d ur|  D ]}t|t st|t!rt"|drt#|j$d qd S d S )N@   r         Fr   Tr   r   )r   r   r   r      )r   rN         g       @rH   )%rN   stage_with_dcnrL   r   r[   r   r   r   rB   r   r   r   rC   Z	MaxPool2dmaxpool_make_layerlayer1layer2layer3layer4modules
isinstancer   out_channelsr   dataZnormal_mathsqrtfill_r   Zzero_rW   r5   r	   r   rH   )r"   blocklayersZnum_classesrN   rd   mnr#   r   r   r     sH   



zResNet.__init__r   c           	   	   C   s   d }|dks| j ||j kr%ttj| j ||j d|ddt||j }g }||| j ||||d ||j | _ td|D ]}||| j ||d q?tj| S )Nr   F)r   r   r   )rN   )rL   rV   r   
Sequentialr   r   appendrange)	r"   rr   rM   blocksr   rN   rJ   rs   ir   r   r   rf   .  s(   

zResNet._make_layerc                 C   s\   |  |}| |}| |}| |}| |}| |}| |}| |}||||fS r&   )rB   r   rC   re   rg   rh   ri   rj   )r"   r)   Zx2Zx3Zx4Zx5r   r   r   r+   D  s   







zResNet.forward)r\   Nr]   )r   N)r.   r/   r0   r   rf   r+   r1   r   r   r#   r   r[     s    
(r[   c                	       sd   e Zd Zg dddddddddf	 fdd	Z			dd	d
Z		dddZdddZdd Z  ZS )LightSegDetectorr^   ra   rb   rc   rb   
   Fr   r   c
                    s  t t|   || _|| _|| _|| _|| _|	| _t	j
ddd| _t	j
ddd| _t	j
ddd| _t	j|d |d|d| _t	j|d	 |d|d| _t	j|d
 |d|d| _t	j|d |d|d| _t	t||d | j| j|dt|d t	jddt|d |d ddt|d t	jddt|d dddt	 | _|| _|r| j||||d| _|  D ]6}t|t	jst|t	jrt	j !|j" |jdurt	j #|j qt|t	jr|j"j$%d |jj$%d qdS )  
        bias: Whether conv layers have bias or not.
        adaptive: Whether to use adaptive threshold training or not.
        smooth: If true, use bilinear instead of deconv.
        serial: If true, thresh prediction will combine segmentation result as input.
           nearestZscale_factormoderX   r`   r   r   r8   Tr   serialsmoothr   N      ?-C6?)&r   r{   r   kr   inner_channelsr   dw_kernel_size
dw_paddingr   Upsampleup5up4up3r   in5in4in3in2rv   r   r   r   r3   Sigmoidbinarizeadaptive_init_threshthreshrk   rl   r4   r   kaiming_normal_r   Zzeros_rn   rq   )r"   in_channelsr   r   r   r   r   r   r   r   argskwargsrt   r#   r   r   r   T  sX   


zLightSegDetector.__init__c                 C   s   |}|r|d7 }t t j||d | j| j|dt|d t jdd| j|d |d ||dt|d t jdd| j|d d||dt  | _	| j	S )Nr   rX   r   r   Tr   r   r   )
r   rv   r   r   r   r   r   _init_upsampler   r   r"   r   r   r   r   r   r   r   r   r     s6   



zLightSegDetector._init_threshc              
   C   v   |r3|}|dkr
|}t jdddt j||ddd|dg}|dkr.|t j||ddddd t |S t ||ddS 	Nr   r`   r   r   r   r   Tr   r   r   r   rw   rv   r4   r"   r   rm   r   r   Zinter_out_channelsZmodule_listr   r   r   r     (   
	zLightSegDetector._init_upsampleNc              	   C   s   |\}}}}|  | |}	| | |}
| | |}| |}|	|
 | | }| |}| jr9t	|d}n|S | j
rh| jrh| jrVt|tj||jdd  fd}| |}| ||}|j||d |S )Nbinaryr`   r   r   thresh_binary)r   r   r   r   r   r   r   r   trainingr   r   r   torchcatr   
functionalinterpolateshaper   step_functionupdate)r"   featuresgtmasksr   c2c3c4c5p5p4p3p2fuser   resultr   r   r   r   r   r+     s(   


zLightSegDetector.forwardc                 C       t dt | j ||   S Nr   r   Z
reciprocalexpr   r"   r)   yr   r   r   r         zLightSegDetector.step_functionFFFFFNNF)	r.   r/   r0   r   r   r   r+   r   r1   r   r   r#   r   r{   R  s(    A


r{   c                       sh   e Zd Zg dddddddf fdd	Zdd Z			dd	d
Z		dddZdddZdd Z  Z	S )SegDetectorr|   rb   r}   Fc           
         sl  t t|   || _|| _tjddd| _tjddd| _tjddd| _	tj
|d |d|d| _tj
|d |d|d| _tj
|d |d|d| _tj
|d	 |d|d| _ttj
||d
 dd|dtjddd| _ttj
||d
 dd|dtjd
dd| _ttj
||d
 dd|dtjddd| _tj
||d
 dd|d| _ttj
||d
 dd|dt|d
 tjddt|d
 |d
 ddt|d
 tjddt|d
 dddt | _| j| j || _|r| j||||d| _| j| j | j| j | j| j | j| j | j| j | j| j | j| j | j| j | j| j dS )r~   r`   r   r   r   r   r   r   r   r   rX   r   r   r   Tr   r   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rv   out5out4out3out2r   r   r4   r   r   applyweights_initr   r   r   )
r"   r   r   r   r   r   r   r   r   r   r#   r   r   r     sn   zSegDetector.__init__c                 C   s\   |j j}|ddkrtj|jj d S |ddkr,|jjd |j	jd d S d S )NZConvr   Z	BatchNormr   r   )
r$   r.   findr   r   r   r   rn   rq   r   )r"   rt   	classnamer   r   r   r   -  s   zSegDetector.weights_initc                 C   s   |}|r|d7 }t t j||d dd|dt|d t jdd| j|d |d ||dt|d t jdd| j|d d||dt  | _| jS )Nr   rX   r   r   Tr   r   )r   rv   r   r   r   r   r   r   r   r   r   r   r   5  s,   

zSegDetector._init_threshc              
   C   r   r   r   r   r   r   r   r   L  r   zSegDetector._init_upsampleNc              	   C   s  |\}}}}|  |}	| |}
| |}| |}| |	|
 }| || }| || }| |	}| |}| 	|}| 
|}t||||fd}| |}| jr[t|d}n|S | jr| jr| jrxt|tj||jdd  fd}| |}| ||}|j||d |S )Nr   r   r`   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r"   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r+   g  s6   









zSegDetector.forwardc                 C   r   r   r   r   r   r   r   r     r   zSegDetector.step_functionr   r   r   )
r.   r/   r0   r   r   r   r   r+   r   r1   r   r   r#   r   r     s&    C



"r   c                   @   s   e Zd Zdd Zdd ZdS )
BasicModelc                 O   sD   t j|  ttg dfi || _tdg dddd|| _d S )Nr`   r`   r`   r`   r|   T2   r   r   r   r   )r   Moduler   r[   r5   backboner   decoderr"   r   r   r   r   r   r     s   
zBasicModel.__init__c                 O   s   | j | |g|R i |S r&   r   r   )r"   rn   r   r   r   r   r   r+     s   zBasicModel.forwardN)r.   r/   r0   r   r+   r   r   r   r   r     s    r   c                 C   s&   |rt jj| |g|gddS t | S )NT)Z
device_idsZoutput_deviceZfind_unused_parameters)r   ZparallelZDistributedDataParallelZDataParallel)modeldistributed
local_rankr   r   r   parallelize  s   
r   c                       r2   )	VLPTModelc                    F   t t|   ttg dfi || _tdg dddd|| _dS )zy
        VLPT-STD pretrained DBNet-resnet50 model,
        paper reference: https://arxiv.org/pdf/2204.13867.pdf
        )r   rX      r   )rb   rc   i   i   Tr   r   Nr   )r   r   r   r[   rW   r   r   r   r   r#   r   r   r        
zVLPTModel.__init__c                 C      |  | |S r&   r   r"   r)   r   r   r   r+        zVLPTModel.forwardr-   r   r   r#   r   r         
r   c                       r2   )
DBNasModelc              	      sN   t t|   tdg ddd|| _tdg ddddddd	|| _d
S )z
        DB-NAS model
        )    r^   `   ra   r   )Zwidth_stagesZinput_channelTr   r^      r`   )r   r   r   r   r   r   Nr   )r   r   r   r   r   r{   r   r   r#   r   r   r     s    zDBNasModel.__init__c                 C   r   r&   r   r   r   r   r   r+     r   zDBNasModel.forwardr-   r   r   r#   r   r     s    r   c                       r2   )DBModelc                    r   )}
        DBNet-resnet18 model without deformable conv,
        paper reference: https://arxiv.org/pdf/1911.08947.pdf
        r   r|   Tr   r   Nr   )r   r   r   r[   r5   r   r   r   r   r#   r   r   r     r   zDBModel.__init__c                 C   r   r&   r   r   r   r   r   r+     r   zDBModel.forwardr-   r   r   r#   r   r     r   r   c                       s6   e Zd Z		d	dedef fddZd
ddZ  ZS )
DBModel_v2Fr   r   r   c                    sh   t t|   ddlm} t|i || _t| j||| _| | _t| j||| _|| _	| 
| j	 dS )r   r   )L1BalanceCELossN)r   r   r   Zseg_detector_lossr   r   r   r   	criteriondeviceto)r"   r   r   r   r   r   r   r#   r   r   r     s   
zDBModel_v2.__init__c           
      C   s   t |tr|d | j}n|| j}| }| j|| jd}| jrL| D ]\}}|d ur<t|dr<|| j||< q'| 	||}|\}}	|||	fS |S )Nimage)r   r   )
rl   dictr   r   floatr   r   itemsr	   r   )
r"   batchr   rn   predkeyvalueZloss_with_metricsZlossZmetricsr   r   r   r+     s   


zDBModel_v2.forward)Fr   )F)r.   r/   r0   boolintr   r+   r1   r   r   r#   r   r     s    r   )r   )r   )ro   ossyscollectionsr   r   Ztorch.nnr   Z	proxylessr   r   r   r   r   r   r3   r5   rW   r[   r{   r   r   r   r   r   r   r   r   r   r   r   <module>   s2   

(HVN  &