[dff9e0]: / __pycache__ / utils.cpython-37.pyc

Download this file

283 lines (280 with data), 32.1 kB

B

…”®e·¥ã@sØdZddlZddlZddlZddlmZddlmZddlm	Z	ddl
Z
ddlmZddl
mZddlmZddlmZddlmZddlmZddlZddlZddlZddlmZddlZddlZddlZddl Z ddlZddl!Z!ddl"Z"ddl#m#Z#ddl$Z%dd	l&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,ddl-Z-ddl.Z.ddlZ/dd
l0m1Z1m2Z2ddlm3Z3m4Z4m5Z5m6Z6ddl7m8Z8ddl9mm:Z;ddl<Z<ddl.Z.dd
lm=Z=ddlZ/ddl>m>Z>ddlm3Z3ddlZddl?m@Z@ddlAZAddlBZBddlmZddl>m>Z>ddlCmDZDddlEmFZFddlGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSddlTmUZUddlVmWZWddlXmYZYddlZm[Z[m\Z\m]Z]m^Z^m_Z_e< `¡Zae bdeajc¡Zbd€dd„Zddd„Zedd„ZfGd d!„d!e	ƒZgd"d#„Zhe i¡de'ejje)ejjfekekele(e*ekekfelekejjd'œd(d)„ƒZme i¡d‚e'ejje)ejjfe'e+e-jne,fe(eodd*œd+d,„ƒZpdƒd.d/„Zqd0d1„Zrd„d3d4„ZsGd5d6„d6ƒZte/jue/jud7œd8d9„ZvGd:d;„d;eƒZwd<d=„Zxd…d?d@„ZydAdB„ZzdCdD„Z{dEdF„Z|GdGdH„dHejj}ƒZ~ddddIdJd$e~d&dKf	dLdM„ZdNdO„Z€ddddIdJd$e~d&dKf	dPdQ„Zd†dSdT„Z‚dUdV„ZƒdWdX„Z„d‡dYdZ„Z…Gd[d\„d\ƒZ†d]d^„Z‡dˆd`da„Zˆdbdc„Z‰d‰ddde„ZŠdfdg„Z‹dhdi„ZŒdjdk„Zdldm„ZŽdŠdndo„Zd‹dpdq„ZdŒdsdt„Z‘dudv„Z’ddydz„Z“dŽd|d}„Z”d~d„Z•dS)z helper function

author junde
éN)ÚFunction)Ú_LRScheduler)Ú
DataLoader)ÚVariable)Úautograd)Údatetime)ÚUnionÚOptionalÚListÚTupleÚTextÚBinaryIO)ÚlabelÚfind_objects)ÚImageÚ	ImageDrawÚ	ImageFontÚ
ImageColor)Úvgg19)ÚOrderedDict)Útqdm)r)Ú
Discriminator)Ú
DiceCELoss)Úsliding_window_inference)Ú
AsDiscreteÚComposeÚCropForegrounddÚ
LoadImagedÚOrientationdÚ	RandFlipdÚRandCropByPosNegLabeldÚRandShiftIntensitydÚScaleIntensityRangedÚSpacingdÚ
RandRotate90dÚEnsureTyped)Úprint_config)Ú
DiceMetric)Ú	SwinUNETR)ÚThreadDataLoaderÚCacheDatasetÚload_decathlon_datalistÚdecollate_batchÚset_track_metaÚcudaTcCsš|dkr>ddlm}m}ddlm}|d||jd t¡}ntdƒt	 
¡|r–|dkrŠtjj
|d	d
„|j d¡Dƒd}|j|d
}n|j|d
}|S)z return given network
    Úsamr)ÚSamPredictorÚsam_model_registry)ÚResizeLongestSideÚvit_b)Ú
checkpointz6the network name you have entered is not supported yetÚnonecSsg|]}t|ƒ‘qS©)Úint)Ú.0Úidr6r6úB/Users/hanxuegu/Documents/Documents/bone/bone_paper_codes/utils.pyú
<listcomp>ƒszget_network.<locals>.<listcomp>ú,)Ú
device_ids)Údevice)Ú
models.samr0r1Úmodels.sam.utils.transformsr2Zsam_ckptÚtor>ÚprintÚsysÚexitÚtorchÚnnÚDataParallelÚdistributedÚsplit)ÚargsÚnetÚuse_gpuÚ
gpu_deviceÚdistributionr0r1r2r6r6r:Úget_networkss"rOcCsÔttddgddtdgdddddd	tddgdd
tddgddtddgd
ddtddgtddtddgd|j	|j	|j
fdd|jdddtddgdgddtddgdgddtddgdgddt
ddgdddtdgdddgƒ}ttddgddtdgdddddd	tddgdd
tddgddtddgd
ddtddgtddgƒ}|j}d}tj ||¡}t|ddƒ}t|ddƒ}t||ddd d!}t|d|jdd"}	t||dddd!}
t|
ddd#}tdƒ|	|||||fS)$NÚimagerT)ÚkeysÚensure_channel_firstiQÿÿÿéúggð?)rQÚa_minÚa_maxÚb_minÚb_maxÚclip)rQÚ
source_keyÚRAS)rQÚaxcodes)gø?gø?g@)ÚbilinearÚnearest)rQÚpixdimÚmodeF)rQr>Ú
track_metaér)rQÚ	label_keyÚspatial_sizeÚposÚnegÚnum_samplesÚ	image_keyÚimage_thresholdgš™™™™™¹?)rQÚspatial_axisÚprobéé)rQrjÚmax_kgà?)rQÚoffsetsrjzdataset_0.jsonÚtrainingÚ
validationéé)ÚdataÚ	transformÚ	cache_numÚ
cache_rateÚnum_workers)rwÚ
batch_sizeÚshuffle)rwrx)rrr"rrr#r%r>r Úroi_sizeÚchunkZ
num_samplerr$r!Ú	data_pathÚosÚpathÚjoinr+r*r)Úbr-)rJZtrain_transformsZval_transformsÚdata_dirZ
split_JSONÚdatasetsÚdatalistZ	val_filesZtrain_dsÚtrain_loaderZval_dsÚ
val_loaderr6r6r:Úget_decath_loader‹s’r†cCs4t t |¡t |¡¡}| ¡}| ¡}|||S)N)rEÚdotÚflattenÚnorm)Z
gram_featureAZ
gram_featureBZscaled_hsicZnormalization_xZnormalization_yr6r6r:Úcka_lossðsrŠcs*eZdZdZd‡fdd„	Zdd„Z‡ZS)ÚWarmUpLRzwarmup_training learning rate scheduler
    Args:
        optimizer: optimzier(e.g. SGD)
        total_iters: totoal_iters of warmup phase
    éÿÿÿÿcs||_tƒ ||¡dS)N)Útotal_itersÚsuperÚ__init__)ÚselfÚ	optimizerrÚ
last_epoch)Ú	__class__r6r:rþszWarmUpLR.__init__cs‡fdd„ˆjDƒS)zhwe will use the first m batches, and set the learning
        rate to base_lr * m / total_iters
        cs g|]}|ˆjˆjd‘qS)g:Œ0âŽyE>)r’r)r8Úbase_lr)rr6r:r;sz#WarmUpLR.get_lr.<locals>.<listcomp>)Úbase_lrs)rr6)rr:Úget_lrszWarmUpLR.get_lr)rŒ)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rr–Ú
__classcell__r6r6)r“r:r‹øsr‹cCsJ| ¡\}}}}| ||||¡}t || ¡¡}| ||||¡S)N)ÚsizeÚviewrEÚmmÚtÚdiv)ÚinputÚar€ÚcÚdÚfeaturesÚGr6r6r:Úgram_matrix	sr§rrrkF)ÚtensorÚnrowÚpaddingÚ	normalizeÚvalue_rangeÚ
scale_eachÚ	pad_valueÚreturncsrt |¡s8t|tƒr&tdd„|Dƒƒs8tdt|ƒ›ƒ‚d| ¡krZd}t 	|¡|d}t|tƒrrtj
|dd}| ¡dkrˆ| d¡}| ¡d	kr¾| 
d¡d
kr´t |||fd¡}| d¡}| ¡dkrê| 
d
¡d
krêt |||fd
¡}|dkr^| ¡}|dk	rt|tƒstd
ƒ‚dd„‰‡fdd„}	|dkrTx$|D]}
|	|
|ƒq>Wn
|	||ƒ| 
d¡d
krx| d¡S| 
d¡}t||ƒ}tt t|ƒ|¡ƒ}
t| 
d¡|ƒt| 
d	¡|ƒ}}| 
d
¡}| |||
||||f|¡}d}xtt|
ƒD]h}x`t|ƒD]T}||kr P| d
|||||¡ d|||||¡ ||¡|d
}qWqW|S)Ncss|]}t |¡VqdS)N)rEÚ	is_tensor)r8rŸr6r6r:ú	<genexpr>$szmake_grid.<locals>.<genexpr>z(tensor or list of tensors expected, got Úrangez9range will be deprecated, please use value_range instead.r)ÚdimrkrlraéTzNvalue_range has to be a tuple (min, max) if specified. min and max are numberscSs,|j||d| |¡ t||dƒ¡dS)N)ÚminÚmaxgñh㈵øä>)ÚclampÚsub_Údiv_r¶)ÚimgÚlowÚhighr6r6r:Únorm_ip@szmake_grid.<locals>.norm_ipcs>|dk	rˆ||d|dƒnˆ|t| ¡ƒt| ¡ƒƒdS)Nrra)Úfloatrµr¶)rŸr¬)r½r6r:Ú
norm_rangeDszmake_grid.<locals>.norm_range)rEr°Ú
isinstanceÚlistÚallÚ	TypeErrorÚtyperQÚwarningsÚwarnÚstackr³Ú	unsqueezerœÚcatÚcloneÚtupleÚAssertionErrorÚsqueezerµr7ÚmathÚceilr¾Únew_fullr²ÚnarrowÚcopy_)r¨r©rªr«r¬r­r®ÚkwargsÚwarningr¿rŸÚnmapsÚxmapsÚymapsÚheightÚwidthÚnum_channelsÚgridÚkÚyÚxr6)r½r:Ú	make_grids\












&
"

rß)r¨ÚfpÚformatr¯cKsXt|f|Ž}| d¡ d¡ dd¡ ddd¡ dtj¡ ¡}t	 
|¡}|j||ddS)	a"
    Save a given Tensor into an image file.
    Args:
        tensor (Tensor or list): Image to be saved. If given a mini-batch tensor,
            saves the tensor as a grid of images by calling ``make_grid``.
        fp (string or file object): A filename or a file object
        format(Optional):  If omitted, the format to use is determined from the filename extension.
            If a file object was used instead of a filename, this parameter should always be used.
        **kwargs: Other arguments are documented in ``make_grid``.
    éÿgà?rrarkÚcpu)ráN)rßÚmulÚadd_Úclamp_ÚpermuterArEÚuint8ÚnumpyrÚ	fromarrayÚsave)r¨ràrárÓrÛÚndarrÚimr6r6r:Ú
save_imagehs0
rîÚtraincCsjt d¡}d ||¡}tj ||¡}d}tjt|ƒ|dt 	¡}| 
tj¡t ¡}t 	d¡ 
|¡|S)Nz%Y-%m-%d-%H-%Mz	{}_{}.logz%(asctime)-15s %(message)s)ÚfilenameráÚ)ÚtimeÚstrftimerár}r~rÚloggingÚbasicConfigÚstrÚ	getLoggerÚsetLevelÚINFOÚ
StreamHandlerÚ
addHandler)Úlog_dirÚphaseÚtime_strZlog_fileZfinal_log_fileÚheadÚloggerÚconsoler6r6r:Ú
create_loggers

rc
Cs¼i}tj|ddtj ||¡}t tj ¡¡}| 	d¡}|d|}t |¡||d<tj |d¡}t |¡||d<tj |d¡}t |¡||d	<tj |d
¡}	t |	¡|	|d<|S)NT)Úexist_okz%Y_%m_%d_%H_%M_%SÚ_ÚprefixÚModelÚ	ckpt_pathÚLogÚlog_pathZSamplesÚsample_path)
r}Úmakedirsr~rrÚnowÚdateutilÚtzÚtzlocalró)
Úroot_dirZexp_nameZ	path_dictZexp_pathrÚ	timestamprrr	r
r6r6r:Úset_log_dirs$




rúcheckpoint.pthcCs4t |tj ||¡¡|r0t |tj |d¡¡dS)Nzcheckpoint_best.pth)rErër}r~r)ÚstatesZis_bestÚ
output_dirrðr6r6r:Úsave_checkpoint­src@sTeZdZdd„Zdd„Zdd„Zdd„Zd	d
„Zdd„Zd
d„Z	dd„Z
dd„ZdS)ÚRunningStatscCs$d|_d|_||_tj|d|_dS)Nr)Úmaxlen)ÚmeanÚrun_varÚWIN_SIZEÚcollectionsÚdequeÚwindow)rrr6r6r:rµszRunningStats.__init__cCs|j ¡d|_d|_dS)Nr)rÚclearrr)rr6r6r:r¼s
zRunningStats.clearcCst|jƒ|jkS)N)Úlenrr)rr6r6r:Úis_fullÁszRunningStats.is_fullcCs´t|jƒ|jkrj|j ¡}|j |¡|j}|j|||j7_|j||||j||7_nF|j |¡||j}|j|t|jƒ7_|j|||j7_dS)N)r rrÚpopleftÚappendrr)rrÞZ	x_removedZold_mÚdeltar6r6r:ÚpushÄs
&
zRunningStats.pushcCst|jƒr|jSdS)Ng)r rr)rr6r6r:Úget_meanÔszRunningStats.get_meancCs"t|jƒdkr|jt|jƒSdS)Nrag)r rr)rr6r6r:Úget_var×szRunningStats.get_varcCst | ¡¡S)N)rÎÚsqrtr')rr6r6r:Úget_stdÚszRunningStats.get_stdcCs
t|jƒS)N)rÁr)rr6r6r:Úget_allÝszRunningStats.get_allcCsd t|jƒ¡S)NzCurrent window values: {})rárÁr)rr6r6r:Ú__str__àszRunningStats.__str__N)r—r˜r™rrr!r%r&r'r)r*r+r6r6r6r:r´sr)ÚoutputsÚlabelscCs8d}||@ d¡}||B d¡}||||}| ¡S)Ngíµ ÷ư>)rark)Úsumr)r,r-ÚSMOOTHÚintersectionÚunionÚiour6r6r:r2ãs
r2c@s eZdZdZdd„Zdd„ZdS)Ú	DiceCoeffz"Dice coeff for individual examplescCsd| ||¡d}t | d¡| d¡¡|_t |¡t |¡||_d|j ¡||j ¡}|S)Ng-Cëâ6?rŒrk)Úsave_for_backwardrEr‡rÚinterr.r1r¾)rr¡ÚtargetÚepsrŸr6r6r:ÚforwardñszDiceCoeff.forwardcCsV|j\}}d}}|jdr@|d||j|j|j|j}|jdrNd}||fS)Nrrkra)Úsaved_variablesÚneeds_input_gradr1r5)rÚgrad_outputr¡r6Ú
grad_inputÚgrad_targetr6r6r:Úbackwardûs

$
zDiceCoeff.backwardN)r—r˜r™ršr8r>r6r6r6r:r3îs
r3cCsp|jr t d¡j|jd ¡}nt d¡ ¡}x4tt||ƒƒD]"\}}|tƒ 	|d|d¡}q>W||dS)zDice coeff for batchesra)r>r)
Úis_cudarEÚFloatTensorrAr>Úzero_Ú	enumerateÚzipr3r8)r¡r6ÚsÚir£r6r6r:Ú
dice_coeff	srFÚmultic
Csž|p|}|pd}|pd}
||
||g}|r,tnt}|	dk	rJt}||	ƒ\}
}n|||d\}
}|dkrpt|||ƒ}n&|dkr„t||ƒ}n|dkr–t||ƒ}|
|fS)Nrarl)ÚsdrGÚsegÚraw)Z	fft_imageZpixel_imageZ
init_imageÚto_valid_outÚgene_outÚraw_out)ÚwÚhrºr_rIrHÚbatchÚfftÚchannelsÚinitÚchÚshapeÚparam_fÚparamsÚmaps_fÚoutputr6r6r:Ú
para_images 
rZcs‡‡‡fdd„}|S)NcsLˆƒ}|jˆjd}tjjdd|ƒ}t ˆ|¡jddd}t ˆ|fd¡S)N)r>ra)r³T)r³Úkeepdim)rAr>rErFÚSoftmaxÚmultiplyr.rÉ)ÚmapsZ	final_seg)rºrXrIr6r:Úinner+s
zto_valid_out.<locals>.innerr6)rXrºrIr_r6)rºrXrIr:rK*srKcs‡‡fdd„}|S)Ncs$ˆƒ}|jˆjd}t ˆ|fd¡S)N)r>ra)rAr>rErÉ)r^)rºrXr6r:r_5szgene_out.<locals>.innerr6)rXrºr_r6)rºrXr:rL4srLcs‡‡fdd„}|S)Ncsˆƒ}|jˆjd}|S)N)r>)rAr>)r^)rºrXr6r:r_>szraw_out.<locals>.innerr6)rXrºr_r6)rºrXr:rM=srMc@seZdZdd„ZdS)ÚCompositeActivationcCs&t |¡}t |d||dgd¡S)Ngq=
×£på?g333333ã?ra)rEÚatanrÉ)rrÞr6r6r:r8Is
zCompositeActivation.forwardN)r—r˜r™r8r6r6r6r:r`Gsr`raé€zcuda:0c	s¾d}t |||¡}| dd¡ d| d¡¡}
| dd¡ | d¡d¡}tj|
|gdd d¡ |ddd¡ |
¡‰g}d}x²t|ƒD]¦}|}|d}|dkr d}||dkr°|}| 	d 
|¡tj |||¡f¡|	rð| 	d 
|¡tj 
|¡f¡||dkr| 	d	 
|¡|ƒf¡q„| 	d
tj ¡f¡q„Wtj t|ƒ¡ |
¡‰dd„}ˆ |¡tjj tˆ ¡ƒd 
|d¡j¡|jd
krœt‡‡fdd„|ƒnt‡‡fdd„||ƒ}ˆ ¡|fS)NgªLXèz¶û?rŒrar)r³rkzconv{}znorm{}zactv{}rYcSsLt|tjjƒrHtjj |jdt d|j	¡¡|j
dk	rHtjj |j
¡dS)Nrra)rÀrErFÚConv2drSÚnormal_ÚweightÚnpr(Úin_channelsÚbiasÚzeros_)Úmoduler6r6r:Úweights_initns 
zcppn.<locals>.weights_initrJcsˆˆƒS)Nr6r6)Úinput_tensorrKr6r:Ú<lambda>vózcppn.<locals>.<lambda>)rEÚlinspacerÚrepeatrœrÇrÈrAr²r#rárFrcÚInstanceNorm2dÚSigmoidÚ
SequentialrÚapplyrSriÚdictÚnamed_childrenreÚnetyperMrKÚ
parameters)rJrœrºrIrPÚnum_output_channelsÚnum_hidden_channelsÚ
num_layersÚ
activation_fnr«r>ÚrZcoord_rangerÞrÝÚlayersÚkernel_sizerEÚout_cÚin_crkÚoutimgr6)rlrKr:ÚcppnOs4* 
&6rƒcCs€t|d|jt d|j¡|jd}t d¡}|j|dddt d¡}t|d	|jt d|j¡|jd}|j|ddd||fS)
NÚsirenr.)rLrMrNzE./logs/siren_train_init_2022_08_19_21_00_16/Model/checkpoint_best.pthÚ
state_dictF)ÚstrictzC./logs/vae_standard_refuge1_2022_08_21_17_56_49/Model/checkpoint500Úvae)rOÚgpurEr>rMrHÚloadÚload_state_dict)rJÚwrapperr4r‡r6r6r:Ú	get_sirenys 

 rŒcsdtj d¡|ƒ}| |¡ d¡ ¡‰|jdkrBt‡‡fdd„|ƒnt‡‡fdd„||ƒ}
ˆ 	¡|
fS)Né@rŒrJcs
ˆˆdS)N)Úlatentr6r6)rŽr‹r6r:rmrnzsiren.<locals>.<lambda>)
ÚtorchvisionÚ
transformsÚResizeÚencoderrÚdetachrwrMrKrx)rJr‹r‡rºrIrPryrzr{r|r«r>Zvae_imgr‚r6)rŽr‹r:r„‰s4	r„©éc5CsÀ|dkrd}n|dkrd}n
td|ƒ|jr2|}|jr<d}t ¡}| d¡}tƒ\}}|dkrhdd„}|ƒ\}}|dkr‚dd„}||ƒ}|dkr–g}| ¡}|ƒj}|dk	r´|}n"|d	d
ksÌ|dd
krÒd
}nd}|rò| 	t
jj|dd
d¡t
 |¡}t||ƒ}t |¡}|r6|||ƒƒƒtd ||ƒ¡ƒg}y¤xœttdt|ƒdƒ|
dD]z}| ¡y|||ƒƒƒWn@tk
r¾} z |dkr®t d| ›d¡Wdd} ~ XYnX|jrx| ¡D]}!d
|!_qÒWx¾t|jƒD]°}"| ¡|}#|ƒ}$t
jdt
jd}%|%d}&|%  |j!¡}%|&  |j!¡}&||#ƒ}'|' "¡}'|' #|&¡||$ƒ}(|( "¡}(|( #|%¡t$||#j%|$j%ƒ})|) #¡|(|'|)}*|'|(}+| &¡qîWx| ¡D]}!d|!_q¬W|ƒ},||,ƒ}-|- "¡}-|-}.|-}/|ddkrtd|(›d|'›ƒtd|-›ƒ|jr.|||ƒ|j'|.}0n|||ƒ}0|0 #¡| &¡||kr^t(|ƒƒ}1|rÎ|
d )d¡d )d¡ddt*|ƒd}2||2}2|j+r¦|j+n|j,d}3t-j. /|3t*|2ƒ¡}4t0|ƒ|4ƒ| 	|1¡q^WWnNt1k
r.td |¡ƒ|rtd |||ƒ¡ƒ| 	t(|ƒƒ¡YnX|r”|
d )d¡d )d¡dd}2||2}2|j+rl|j+n|j,d}3t-j. /|3t*|2ƒ¡}4t0|ƒ|4ƒ|rªt2t(|ƒƒƒn|rºt3|ƒƒ|ƒS) NrarrŒzlabel is wrong, label isz%m-%d-%Y, %H:%M:%ScSs
t d¡S)Nrb)ÚparamrPr6r6r6r:rmÂrnzrender_vis.<locals>.<lambda>cSstjj|ddS)Ngà?)Úlr)rEÚoptimÚAdam)rWr6r6r:rmÉrnrkéàrlr\T)rœr_Ú
align_cornerszInitial loss of ad: {:.3f})Údisablez¼Some layers could not be computed because the size of the image is not big enough. It is fine, as long as the noncomputed layers are not used in the objective function(exception details: 'z'))ÚdtypeFéz loss_fake: z
, loss_real: zGenerator g_loss: ú\Ú.rz.pngr
z&Interrupted optimization at step {:d}.zLoss at step {}: {:.3f})4rBÚreverseZ
multilayerrrróÚpre_dÚcopyrUr#rErFÚUpsamplertÚcomposeÚ
hook_modelZ
objectivesZas_objectiverárr²r¶Ú	zero_gradÚRuntimeErrorrÅrÆÚdiscrxÚ
requires_gradZdrecr¨r¾r.rMrr>Úcalculate_gradient_penaltyrsÚstepÚpwÚtensor_to_img_arrayrIröZ
quickcheckZpath_helperr}r~rÚexportÚKeyboardInterruptÚshowr)5rJÚmodelZobjective_fZreal_imgrVr‘rÚ
thresholdsÚverboseÚ
preprocessÚprogressZ
show_imagerîÚ
image_nameZshow_inlineZfixed_image_sizerZraw_imgÚpromptÚsignrÚ	date_timeÚnetDZoptDrWÚimage_fÚimage_shapeÚnew_sizeZtransform_fÚhookÚimagesrEÚexÚprÚrealÚfakeÚoneZmoneZd_loss_realZd_loss_fakeZgradient_penaltyÚd_lossZ
Wasserstein_DÚfake_imagesÚg_lossZdom_lossZg_costÚlossrPÚnaZoutpathÚimg_pathr6r6r:Ú
render_visšsØ






&
 



	


, 
rÌcCs(| ¡ ¡ ¡}t |ddddg¡}|S)Nrrkrlra)rãr“rérfÚ	transpose)r¨rPr6r6r:r®ksr®cCsdt|ƒ}t|jƒdks&td |j¡ƒ‚|d tj¡}t|jƒdkrRtj|dd}t	 
|¡ ¡dS)N)rlr´z;Image should have 3 or 4 dimensions, invalid image shape {}râr´ra)Úaxis)r®r rUrÌráÚastyperfrèÚconcatenaterrêr±)r¨rPr6r6r:rqsrcCsÐ| d¡}|dkr"tj||dnª|dd…dd…dd…dd…f}|dd…ddd…dd…f d¡}t|ƒ}dt|ƒ ¡}t|jƒdksštd 	|j¡ƒ‚|d 
tj¡}|d 
tj¡}t
 |d	¡ |¡dS)
Nrarl)ràrrŒ)rlr´z;Image should have 3 or 4 dimensions, invalid image shape {}râÚL)rœÚvutilsrîrÈr®rÍr rUrÌrárÏrfrèrrêrë)r¨rËr£rPZw_mapr6r6r:r¯~s
 "r¯c@s$eZdZdd„Zdd„Zdd„ZdS)Ú
ModuleHookcCs| |j¡|_d|_d|_dS)N)Úregister_forward_hookÚhook_fnr¿rjr¥)rrjr6r6r:r szModuleHook.__init__cCs||_||_dS)N)rjr¥)rrjr¡rYr6r6r:rÕ¦szModuleHook.hook_fncCs|j ¡dS)N)r¿Úremove)rr6r6r:Úclose«szModuleHook.closeN)r—r˜r™rrÕr×r6r6r6r:rÓŸsrÓcs2tƒ‰gf‡‡fdd„	‰ˆ|ƒ‡‡fdd„}|S)NcsZt|dƒrVxJ|j ¡D]<\}}|dkr(qt|ƒˆd ||g¡<ˆ|||gdqWdS)NÚ_modulesr)r)ÚhasattrrØÚitemsrÓr)rKrÚnameÚlayer)r¥Úhook_layersr6r:rݲs
zhook_model.<locals>.hook_layerscsb|dkrˆƒ}n>|dkr,tˆ ¡ƒdj}n"|ˆksDtd|›dƒ‚ˆ|j}|dk	s^tdƒ‚|S)Nr¡r-rŒzInvalid layer zR. Retrieve the list of layers with `lucent.modelzoo.util.get_model_layers(model)`.z…There are no saved feature maps. Make sure to put the model in eval mode, like so: `model.to(device).eval()`. See README for example.)rÁÚvaluesr¥rÌ)rÜÚout)r¥r¼r6r:r¿½s
zhook_model.<locals>.hook)r)r²r¼r¿r6)r¥rÝr¼r:r¦¯s
	r¦çà?cCs| ¡\}}}	}
| ¡}t|dƒ}t |¡dks>t |¡dkrHt |¡}t ||k¡}|dkrnd|}d|}|dkrh|dd…ddd…dd…f d¡ |d|	|
¡|dd…ddd…dd…f d¡ |d|	|
¡}
}|dd…ddd…dd…f d¡ |d|	|
¡|dd…ddd…dd…f d¡ |d|	|
¡}}|d|…dd…dd…dd…f|
d|…dd…dd…dd…f|d|…dd…dd…dd…f|d|…dd…dd…dd…f|d|…dd…dd…dd…ff}t 	|
d|…dd…dd…dd…f|d|…dd…dd…dd…f|d|…dd…dd…dd…f|d|…dd…dd…dd…ffd¡}t
j|||ddnªtj
 |	|
f¡|ƒ}| d¡dkrº|dd…ddd…dd…f d¡ |d|	|
¡}|dd…ddd…dd…f d¡ |d|	|
¡}|dd…ddd…dd…f d¡ |d|	|
¡}|dkr–xrt|ƒD]d}tjr`t | ¡tjtj¡jtjd	}n$t | ¡tjtj¡jtjd	}xt|jdƒD]ö}d
||d|||dfd|||dfd…|||dfd|||dfd…f<d||d|||dfd|||dfd…|||dfd|||dfd…f<d||d|||dfd|||dfd…|||dfd|||dfd…f<q–Wq,W|d|…dd…dd…dd…f|d|…dd…dd…dd…f|d|…dd…dd…dd…ff}t 	|d¡}t
j|||dddS)Nr´rarTrkrlé
)ràr©rª)rrâ)rœÚ
get_devicerµrEr¶Úsigmoidr¨rÈÚexpandrÉrÒrîrrr‘r²rJÚthdrfÚroundrãrzÚout_sizerAr7Ú
image_sizerU)ÚimgsZ
pred_masksÚgt_masksÚ	save_pathr¡ÚpointsZthrer€r£rOrNÚdevÚrow_numZ	pred_discZpred_cupZgt_discZgt_cupÚtupr¥rErÂZpmt_idr6r6r:Ú	vis_imageÊsB


^^š„...
&$PP\^rðc
CsÊ| ¡\}}}}|dkrÐd\}}}	}
xz|D]p}||k ¡}||k ¡}
|
 ¡}|dd…ddd…dd…f ¡ d¡}|dd…ddd…dd…f ¡ d¡}|dd…ddd…dd…f d¡ ¡ ¡ d¡}|dd…ddd…dd…f d¡ ¡ ¡ d¡}|t||ƒ7}|t||ƒ7}|	t|
dd…ddd…dd…f|dd…ddd…dd…fƒ ¡7}	|
t|
dd…ddd…dd…f|dd…ddd…dd…fƒ ¡7}
q.W|t	|ƒ|t	|ƒ|	t	|ƒ|
t	|ƒfSd\}}xÔ|D]Ì}||k ¡}||k ¡}
|
 ¡}|dd…ddd…dd…f ¡ d¡}|dd…ddd…dd…f d¡ ¡ ¡ d¡}|t||ƒ7}|t|
dd…ddd…dd…f|dd…ddd…dd…fƒ ¡7}qÞW|t	|ƒ|t	|ƒfSdS)zU
    threshold: a int or a tuple of int
    masks: [b,2,h,w]
    pred: [b,2,h,w]
    rk)rrrrNrÚint32ra)rr)
rœr¾rãrérÏrÍr2rFÚitemr )ÚpredZtrue_mask_pÚ	thresholdr€r£rOrNZiou_dZiou_cZ	disc_diceZcup_diceÚthZ
gt_vmask_pÚvpredZ	vpred_cpuZ	disc_predZcup_predZ	disc_maskZcup_maskZeiouZedicer6r6r:Úeval_seg÷s4
&&00BF,
&0Hr÷cs‡‡‡fdd„}|S)NcsR|ˆƒˆ|ˆƒd ¡}t t |ˆƒdd¡¡}|d|}||ˆS)Nrrkgíµ ÷ư>)r.rEr()ÚTr‡ÚmagZcossim)rPÚ
cossim_powrÜr6r:r_)szdot_compare.<locals>.innerr6)rÜrPrúr_r6)rPrúrÜr:Údot_compare(srûcCsd|jj}| d¡dkr,tj |jjdd¡n4| d¡dkr`tj |jjdd¡tj |j	jd¡dS)NÚConvrŒgg{®Gáz”?Ú	BatchNormgð?r)
r“r—ÚfindrFrSrdrersÚ	constant_rh)ÚmÚ	classnamer6r6r:Úinit_D0srcCs6tdƒ t¡}d}d}tj| ¡||dfd}||fS)Nrlgà?gñh㈵øô>g+‡ÙÎ÷ï?)r—Úbetas)rrAr>r˜r™rx)r»Úbeta1Zdis_lrÚ
optimizerDr6r6r:r¢8s
r¢c
Cs t ¡}tj|jfdtjtd}||ƒ d¡}|||ƒ}| ¡| 	¡ 
¡}	| d¡|| ¡ƒ d¡}|||ƒ}
|
 ¡| 	¡ 
¡}||
}| 
¡||	|fS)Ngð?)rr>rŒg)rFÚBCELossrEÚfullr€r¾r>rr>rròÚfill_r“r¬)
rJr»rrÃrÄÚ	criterionrrYZ	errD_realZD_xZ	errD_fakeZD_G_z1ZerrDr6r6r:Úupdate_d@s


r
cCsÂt tjddd¡ dd¡}| tj| d¡| d¡| d¡¡jtd}||d||jtd}t	|dd}||ƒ}t
j||t | ¡¡jtddddd}|j
ddd	dd ¡d
}|S)Nrarrkrl)r>T)rª)r,ÚinputsÚgrad_outputsÚcreate_graphÚretain_graph)r³rá)rEr@rJr€Úuniform_rärœrAr>rrÚgradÚonesr‰r)r»Zreal_imagesrÇÚetaÚinterpolatedZprob_interpolatedÚ	gradientsZgrad_penaltyr6r6r:r«Zs,r«cCs"t ||k¡}|tj t|ƒ¡S)N)rfÚargwhereÚrandomÚrandintr )ÚmaskÚpoint_labelsÚinoutÚindicesr6r6r:Úrandom_clickpsrcCsdg}g}| ¡\}}}}}	|dd…ddd…dd…dd…f}xöt|	ƒD]ê}
g}g}x¬t|ƒD] }
||
dd…dd…|
f}t |¡}| d¡dkr®t d|d¡j|jd}|}n:t |¡}||d|df}t 	|¡}||kjtj
d}| |¡| |¡q\Wtj|dd}tj|dd}| |¡| |¡qFWtj|dd}tj|dd}| 
d¡}|||fS)Nr)rk)r>ra)r)r³rŒ)rœr²rEÚnonzerorrAr>rÚchoiceÚ
zeros_liker¾r#rÇrÈ)rºÚmskZpt_labelZpt_listZmsk_listr€r£rOrNr¤rEZ	pt_list_sZ
msk_list_sÚjZmsk_srZrandom_indexZnew_srÚptsZmsksÚptr6r6r:Úgenerate_click_promptus6"





r$皙™™™™é?cCs\t t |¡tjtj¡\}}| ¡}t ||d||¡t t |¡|t |¡d|d¡}|S)zKDraw edges of contour 'c' from segmented image 's' onto 'm' in colour 'RGB'rŒrar)	Úcv2ÚfindContoursrfrèÚ	RETR_LISTÚCHAIN_APPROX_SIMPLEr£ÚdrawContoursÚaddWeighted)rrDÚRGBrœr¢ÚcontoursrZm_oldr6r6r:ÚdrawContour›s
"r.cCs6t t ||¡¡}t |¡t |¡|d}||S)Ng:Œ0âŽyE>)rfr.Úbitwise_and)ÚpmÚgtr¢r€r6r6r:ÚIOUªsr2©g
×£p=
ß?gÉv¾Ÿ/Ý?g–C‹lçûÙ?©gZd;ßOÍ?gyé&1¬Ì?gÍÌÌÌÌÌÌ?cCsltj||j|jd}tj||j|jd}|jdkr@| ddd¡}|jdkrX| ddd¡}| |¡ |¡|S)N)rr>rarŒ)rEÚ	as_tensorrr>ÚndimrÚmul_rå)r¨rÚstdr6r6r:Úinverse_normalize°s

r9écCs^tjdtd}t||ƒ\}}x<td|dƒD]*}t ||k¡}t|dƒ|kr,d||<q,W|S)zÏ
    Removes small objects from a 2D array using only NumPy.

    :param array_2d: Input 2D array.
    :param min_size: Minimum size of objects to keep.
    :return: 2D array with small objects removed.
    )rlrl)rrar)rfrr7rr²Úwherer )Zarray_2dÚmin_sizeÚ	structureÚlabeledÚncomponentsrEÚ	locationsr6r6r:Úremove_small_objects¼s	rAcCs”|j\}}}}t |||f¡}xpt|ƒD]d}||}xV|D]N}	t|	dƒt|	dƒt|	dƒt|	dƒf\}
}}}
d||||
…|
|…f<q:Wq(W|S)Nrrarkrl)rUrEÚzerosr²r7)Úboxesrér€rrNrOZbox_maskrÜZk_boxÚboxÚx1Úy1Úx2Úy2r6r6r:Úcreate_box_maskÐs
4rI)TrT)rrrkFNFr)N)rï)r)	NNrGNNNFNN)NNNr”TTTTFNFNraNN)N)FNrà)rar)rara)ra)r%)r3r4)r:)–ršrCrérEÚtorch.nnrFÚtorch.autogradrÚtorch.optim.lr_schedulerrrÚtorchvision.transformsrÚtorch.optimr˜Ztorchvision.utilsÚutilsrÒÚtorch.utils.datarrrrrÎÚPILÚmatplotlib.pyplotÚpyplotÚpltÚseabornZsnsrrôr&r}ròrÚdateutil.tzr
Útypingrr	r
rrr
ÚpathlibrÅrfÚ
scipy.ndimagerrrrrrZtorchvision.modelsrÚtorch.nn.functionalÚ
functionalÚFÚcfgrrZmodels.discriminatorrÚshutilÚtempfileZmonai.lossesrÚmonai.inferersrÚmonai.transformsrrrrrrr r!r"r#r$r%Úmonai.configr&Ú
monai.metricsr'Úmonai.networks.netsr(Ú
monai.datar)r*r+r,r-Ú
parse_argsrJr>rMrOr†rŠr‹r§Úno_gradÚTensorr7ÚboolrßÚPathrörîrrrrÚarrayr2r3rFrZrKrLrMÚModuler`rƒrŒr„rÌr®rr¯rÓr¦rðr÷rûrr¢r
r«rr$r.r2r9rArIr6r6r6r:Ú<module>sø 8
e,F(

/


	
)
?
!
-1


&