o
    ߥi@                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
mZ dZe eZee	d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)
functional)
BasicBlock
BottleneckHighResolutionModuleconv3x3皙?)BASIC
BOTTLENECKc                       s$   e Zd Z fddZdd Z  ZS )
DownSamplec              
      s>   t t|   ttj||dddddt|t | _d S )N         Fkernel_sizestridepaddingbias)	superr
   __init__nn
SequentialConv2dBatchNorm2dPReLUblock)selfin_channelsout_channels	__class__ ^/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/cv/image_try_on/landmark.pyr      s   
zDownSample.__init__c                 C   s
   |  |S )N)r   )r   xr    r    r!   forward!   s   
zDownSample.forward)__name__
__module____qualname__r   r#   __classcell__r    r    r   r!   r
      s    r
   c                       sN   e Zd Zd fdd	Zdd ZdddZ		dd
dZdd ZdddZ  Z	S )LandmarkNetr   c              
      sV  d| _ |d d }tt|   tj|dddddd| _tjdtd	| _	tjddddddd| _
tjdtd	| _tjd
d| _| tdd| _|d | _| jd t| jd    fddttD | dg| _| | j\| _}|d | _| jd t| jd    fddttD | || _| | j\| _}|d | _| jd t| jd    fddttD | || _| j| jd
d\| _}tj|d |d d |d d|d dkrdndd| _|d | _ t! | _"t#t$ddt$ddt%d|f| _&t#tjddddddtjdd dddd| _'d S )!N@   MODELEXTRAr   r   r   Fr   momentumTinplace   STAGE2NUM_CHANNELSBLOCKc                       g | ]	}|  j  qS r    	expansion.0ir   num_channelsr    r!   
<listcomp>9       z(LandmarkNet.__init__.<locals>.<listcomp>   STAGE3c                    r4   r    r5   r7   r:   r    r!   r<   D   r=   STAGE4c                    r4   r    r5   r7   r:   r    r!   r<   P   r=   )multi_scale_outputr   
NUM_JOINTSFINAL_CONV_KERNEL)r   r   r   r   r   PRETRAINED_LAYERS     )r   r   r   r       )(inplanesr   r(   r   r   r   conv1r   BN_MOMENTUMbn1conv2bn2ReLUrelu_make_layerr   layer1
stage2_cfgblocks_dictrangelen_make_transition_layertransition1_make_stagestage2
stage3_cfgtransition2stage3
stage4_cfgtransition3stage4final_layerpretrained_layersSigmoidactive_funcr   r
   AdaptiveAvgPool2d
downsampleproperty_conv)r   cfg
in_channel	class_numkwargsextrapre_stage_channelsr   r:   r!   r   '   s   
















zLandmarkNet.__init__c                 C   s  t |}t |}g }t|D ]t}||k rC|| || kr=|ttj|| || dddddt|| tjdd q|d  qg }t|d | D ],}|d }	||| kr]|| n|	}
|ttj|	|
dddddt|
tjdd qM|tj|  qt|S )	Nr   r   Fr   Tr.   r   )	rU   rT   appendr   r   r   r   rN   
ModuleList)r   num_channels_pre_layernum_channels_cur_layernum_branches_curnum_branches_pretransition_layersr9   conv3x3sj
inchannelsoutchannelsr    r    r!   rV   m   sN   


z"LandmarkNet._make_transition_layerr   c              	   C   s   d }|dks| j ||j kr(ttj| j ||j d|ddtj||j td}g }||| j ||| ||j | _ td|D ]}||| j | q@tj| S )Nr   F)r   r   r   r,   )	rH   r6   r   r   r   r   rJ   ro   rT   )r   r   planesblocksr   re   layersr9   r    r    r!   rP      s$   

zLandmarkNet._make_layerTc                 C   s   |d }|d }|d }|d }t |d  }|d }	g }
t|D ]"}|s-||d kr-d}nd	}|
t||||||	| |
d
  }q tj|
 |fS )NNUM_MODULESNUM_BRANCHES
NUM_BLOCKSr2   r3   FUSE_METHODr   FTrn   )rS   rT   ro   r   get_num_inchannelsr   r   )r   layer_confignum_inchannelsrA   num_modulesnum_branches
num_blocksr;   r   fuse_methodmodulesr9   reset_multi_scale_outputr    r    r!   rX      s&   zLandmarkNet._make_stagec                 C   s  |  |}| |}| |}| |}| |}| |}| |}g }t| jd D ]}| j| d ur@|	| j| | q,|	| q,| 
|}g }t| jd D ]}| j| d urj|	| j| |d  qT|	||  qT| |}g }t| jd D ]}| j| d ur|	| j| |d  q|	||  q| |}|d }| |d }| |}| |}t| |dddd}||fS )Nr~   rn   r   r   r   r   )rI   rK   rO   rL   rM   rQ   rT   rR   rW   ro   rY   rZ   r[   r\   r]   r^   r_   r`   rc   re   torchsqueezerf   permute)r   r"   x_listr9   y_list
property_xr    r    r!   r#      sF   












zLandmarkNet.forward c                 C   p  t d |  D ]b}t|tjr0tjj|jdd |	 D ]\}}|dv r.tj
|jd qq	t|tjrGtj
|jd tj
|jd q	t|tjrktjj|jdd |	 D ]\}}|dv rjtj
|jd qZq	tj|rt|}t d| i }| D ]\}}|dd | jv s| jd d	kr|||< q| j|d
d d S |rt d td|d S Nz(=> init weights from normal distributionMbP?)stdrm   r   r   z=> loading pretrained model {}.*F)strictz,=> please download pre-trained models first!z{} is not exist!loggerinfor   
isinstancer   r   initnormal_weightnamed_parameters	constant_r   r   ConvTranspose2dospathisfiler   loadformatitemssplitra   load_state_dicterror
ValueErrorr   
pretrainedmname_pretrained_state_dictneed_init_state_dictr    r    r!   init_weights   @   


zLandmarkNet.init_weights)r   r   )r   )Tr   )
r$   r%   r&   r   rV   rP   rX   r#   r   r'   r    r    r   r!   r(   %   s    F
&
,r(   c                       s2   e Zd ZdZ fddZdd Zd	ddZ  ZS )
VTONLandmarkz)initialize the try on landmark model
    c                    s"  t t|   ddddddddddd	dd
dddddddddddddddddgddgdg dddddddgdd gd!d"dd#dg d$g d%d!d"d#ddg d&g d'd!d"d(d)	d*diddd+d,d-d.d/d0d1gd2d3d4d5dd6dddddd7dddddd8d9}t|d#dd:| _t|d;d<| _d| _d S )=NTF)	BENCHMARKDETERMINISTICENABLEDr   z	(0,1,2,3)outputlog   d   mpiijpg   g      z
data/mpii/   g      ?validtrain)	COLOR_RGBDATASETDATA_FORMATFLIPNUM_JOINTS_HALF_BODYPROB_HALF_BODYROOT
ROT_FACTORSCALE_FACTORTEST_SET	TRAIN_SET
pose_hrnetrG   z.models/pytorch/imagenet/hrnet_w48-8ef0771d.pthgaussianr>   r)   r   )rI   rK   rL   rM   rQ   rW   rY   r[   r\   r^   r_   r   r   r0   0   `   SUM)r}   r~   r3   r   r2   r   r   )r0   r0   r0   )r   r   rF   )r0   r0   r0   r0   )r   r   rF   rE   )rD   rC   r1   r?   r@   )	INIT_WEIGHTSNAMErB   
PRETRAINEDTARGET_TYPE
IMAGE_SIZEHEATMAP_SIZESIGMAr+   USE_TARGET_WEIGHTr      adamr   r         g-C6?gGz?g        g?)BATCH_SIZE_PER_GPUSHUFFLEBEGIN_EPOCH	END_EPOCH	OPTIMIZERLR	LR_FACTORLR_STEPWDGAMMA1GAMMA2MOMENTUMNESTEROV)r   
MODEL_FILE	FLIP_TESTPOST_PROCESSSHIFT_HEATMAP)DEBUGSAVE_BATCH_IMAGES_GTSAVE_BATCH_IMAGES_PREDSAVE_HEATMAPS_GTSAVE_HEATMAPS_PRED)AUTO_RESUMECUDNNDATA_DIRGPUS
OUTPUT_DIRLOG_DIRWORKERS
PRINT_FREQr   r*   LOSSTRAINTESTr   )rh   ri   &   )rh   )r   r   r   r(   	stage1Net	stage2Netstage)r   rj   rg   r   r    r!   r     s   		,h
zVTONLandmark.__init__c           
      C   s   |  |\}}| jdkr<tj|dd}tj|dddd}||dd }t|||gd}| |\}}	||||	fS ||fS )Nr   r   )dimr0   bilinearT)scale_factormodealign_corners)	r  r  r   argmaxFupsample	unsqueezecatr  )
r   clothperson
c_landmark
c_property
pred_class	c_heatmapinput2
p_landmark
p_propertyr    r    r!   r#     s   
zVTONLandmark.forwardr   c                 C   r   r   r   r   r    r    r!   r     r   zVTONLandmark.init_weightsr   )r$   r%   r&   __doc__r   r#   r   r'   r    r    r   r!   r     s
    or   )loggingr   r   torch.nnr   r   r  :modelscope.models.cv.body_2d_keypoints.hrnet_basic_modulesr   r   r   r   rJ   	getLoggerr$   r   rS   Moduler
   r(   r   r    r    r    r!   <module>   s   

 k