o
    ߥi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init	constant_weighthasattrr   )moduleconstantr    r   d/home/ubuntu/.local/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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   r6   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.forwardr0   r   r   r&   r   r6   K   s    r6   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   r<   r   )r   r8   r   with_dcnr   conv1r    r!   r   r"   reluwith_modulated_dcngetr   conv2assets.ops.dcnr>   rA   conv2_offsetbn2
downsampler   r%   inplanesplanesr   rM   dcnr9   r<   r>   conv_opoffset_channelsrA   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)
rE   r!   rF   rD   rI   rG   rK   sigmoidrL   rM   r%   r,   residualr-   offset_maskoffsetmaskr   r   r   r.      s&   



 $




zBasicBlock.forwardr   NNr1   r2   r3   	expansionr   r.   r4   r   r   r&   r   r8   f   s    (r8   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   r9   r:   r   r   r<   r   r=   r?   r@   rB   rC   )r   r   r   r<   r   r_   Tr   )r   r^   r   rD   r   r   rE   r    r!   rG   rH   rI   rJ   r>   rA   rK   rL   conv3bn3r"   rF   rM   r   rQ   rN   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 rT   )rE   r!   rF   rD   rI   rG   rK   rU   rL   r`   ra   rM   rV   r   r   r   r.      s,   



 $







zBottleneck.forwardr[   r\   r   r   r&   r   r^      s    2r^   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   rQ         g       @rK   )%rQ   stage_with_dcnrO   r   rb   r   r   r   rE   r    r!   r"   rF   	MaxPool2dmaxpool_make_layerlayer1layer2layer3layer4modules
isinstancer   out_channelsr	   datanormal_mathsqrtfill_r   zero_r^   r8   r
   r   rK   )r%   blocklayersnum_classesrQ   rk   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   )rQ   )rO   r]   r   
Sequentialr   r    appendrange)	r%   r|   rP   blocksr   rQ   rM   r}   ir   r   r   rn   .  s(   

zResNet._make_layerc                 C   s\   |  |}| |}| |}| |}| |}| |}| |}| |}||||fS r)   )rE   r!   rF   rm   ro   rp   rq   rr   )r%   r,   x2x3x4x5r   r   r   r.   D  s   







zResNet.forward)rc   Nrd   )r   N)r1   r2   r3   r   rn   r.   r4   r   r   r&   r   rb     s    
(rb   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re   rh   ri   rj   ri   
   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scale_factormoder_   rg   r   r   r;   Tr   serialsmoothr   N      ?-C6?)&r   r   r   kr   inner_channelsr   dw_kernel_size
dw_paddingr   Upsampleup5up4up3r   in5in4in3in2r   r   r    r"   r6   Sigmoidbinarizeadaptive_init_threshthreshrs   rt   r7   r   kaiming_normal_r	   zeros_rv   rz   )r%   in_channelsr   r   r   r   r   r   r   r   argskwargsr   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   r_   r   r   Tr   r   r   )
r   r   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   rg   r   r   r   r   Tr   r   r   r   r   r   r7   r%   r   ru   r   r   inter_out_channels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binaryrg   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   
reciprocalexpr   r%   r,   yr   r   r   r         zLightSegDetector.step_functionFFFFFNNF)	r1   r2   r3   r   r   r   r.   r   r4   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   ri   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   rg   r   r   r   r   r   r   r   r   r_   r   r   r   Tr   r   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   out5out4out3out2r    r"   r7   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 )NConvr   	BatchNormr   r   )
r'   r1   findr   r   r   r	   rv   rz   r   )r%   r   	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   r_   r   r   Tr   r   )r   r   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   rg   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   )
r1   r2   r3   r   r   r   r   r.   r   r4   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rg   rg   rg   rg   r   T2   r   r   r   r   )r   Moduler   rb   r8   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%   rv   r   r   r   r   r   r.     s   zBasicModel.forwardN)r1   r2   r3   r   r.   r   r   r   r   r     s    r   c                 C   s&   |rt jj| |g|gddS t | S )NT)
device_idsoutput_devicefind_unused_parameters)r   parallelDistributedDataParallelDataParallel)modeldistributed
local_rankr   r   r   parallelize  s   
r   c                       r5   )	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   r_      r   )ri   rj   i   i   Tr   r   Nr   )r   r   r   rb   r^   r   r   r   r   r&   r   r   r        
zVLPTModel.__init__c                 C      |  | |S r)   r   r%   r,   r   r   r   r.        zVLPTModel.forwardr0   r   r   r&   r   r         
r   c                       r5   )
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
        )    re   `   rh   r	  )width_stagesinput_channelTr   re      rg   )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.forwardr0   r   r   r&   r   r    s    r  c                       r5   )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   rb   r8   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.forwardr0   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   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  )
rt   dictr  r  floatr   r   itemsr
   r  )
r%   batchr   rv   predkeyvalueloss_with_metricslossmetricsr   r   r   r.     s   


zDBModel_v2.forward)Fr   )F)r1   r2   r3   boolintr   r.   r4   r   r   r&   r   r    s    r  )r   )r   )rx   ossyscollectionsr   r   torch.nnr   	proxylessr   r    r   r   r   r   r6   r8   r^   rb   r   r   r   r   r   r  r  r  r   r   r   r   <module>   s2   

(HVN  &