B ’Иb;ã@sþddlZddlZddlZddlZddlZddlmZddlmmZ ddl Z e  e ¡Ze ej¡e e ej¡¡ddlmZe ej ¡r”dnd¡Zddd„ZGdd „d ejƒZGd d „d ejƒZGd d „d ejƒZdd„Zdd„Zdd„Z dd„Z!dS)éN)Úvgg16ÚcudaÚcpuécsG‡fdd„dtƒ}|S)zL Get a modified VGG16-Unet model with customized input channel numbers. cseZdZ‡‡fdd„Z‡ZS)z3get_modified_vgg16_unet..Modified_VGG16UnetcstƒjˆddS)N)Ú in_channels)ÚsuperÚ__init__)Úself)Ú __class__r©ú_/home/ec2-user/SageMaker/vegetation-management-remars2022/remars2022-workshop/code/inference.pyrsz.Modified_VGG16Unet.__init__)Ú__name__Ú __module__Ú __qualname__rÚ __classcell__r )r)r r ÚModified_VGG16Unetsr)Ú VGG16Unet)rrr )rr Úget_modified_vgg16_unetsrcs$eZdZ‡fdd„Zdd„Z‡ZS)Ú DecoderBlockcs<tƒ ¡||_t tjddddt||ƒt||ƒ¡|_dS)NéZbilinearF)Z scale_factorÚmodeZ align_corners)rrrÚnnÚ SequentialZUpsampleÚConvReluÚblock)r rZmiddle_channelsZ out_channels)r r r rs  zDecoderBlock.__init__cCs | |¡S)N)r)r Úxr r r Úforward'szDecoderBlock.forward)r rrrrrr r )r r rs rcs$eZdZ‡fdd„Zdd„Z‡ZS)rcs0tƒ ¡tj||ddd|_tjdd|_dS)Nré)ÚpaddingT)Úinplace)rrrÚConv2dÚconvÚReLUÚ activation)r Úin_Úout)r r r r+s zConvRelu.__init__cCs| |¡}| |¡}|S)N)r!r#)r rr r r r0s  zConvRelu.forward)r rrrrrr r )r r r*s rcs&eZdZd‡fdd„ Zdd„Z‡ZS) rré Fcsàtƒ ¡t|dj|_t dd¡|_tjdd|_ tj |ddddd|jd <t  |jd |j |jd|j ¡|_ t  |jd |j |jd |j ¡|_ t  |jd |j |jd |j |jd|j ¡|_t  |jd|j |jd|j |jd|j ¡|_t  |jd|j |jd|j |jd|j ¡|_td|dd|dƒ|_td|d|dd|dƒ|_td|d|dd|dƒ|_td|d|dd|dƒ|_td|d|dd|ƒ|_td||ƒ|_tj |ddd|_dS)N)Ú pretrainedrT)ré@rr)Ú kernel_sizeÚstriderrééé é éééééééiéééé€)r))rrrÚfeaturesÚencoderrZ MaxPool2dÚpoolr"Úrelur rÚconv1Úconv2Úconv3Úconv4Úconv5rÚcenterÚdec5Údec4Údec3Údec2rÚdec1Úfinal)r rÚ num_filtersr')r r r r6s>    zVGG16Unet.__init__cCsÖ| |¡}| | |¡¡}| | |¡¡}| | |¡¡}| | |¡¡}| | |¡¡}| t  ||gd¡¡}|  t  ||gd¡¡} |  t  | |gd¡¡} |  t  | |gd¡¡} |  t  | |gd¡¡} | | ¡} | S)Nr)r>r?r<r@rArBrCrDÚtorchÚcatrErFrGrHrI)r rr>r?r@rArBrCrDrErFrGrHZx_outr r r r^s  zVGG16Unet.forward)rr&F)r rrrrrr r )r r r5s(rc CsRtddƒ}ttj |d¡dƒ}| tj|dd¡WdQRX| t ¡  ¡|S)Nr8)rz model.pthÚrbr)Z map_location) rÚopenÚosÚpathÚjoinZload_state_dictrKÚloadÚtoÚdeviceÚeval)Ú model_dirÚmodelÚfr r r Úmodel_fnos  rYcCs0|dks t‚t |¡d}tj|tjtd}|S)Nzapplication/jsonÚinputs)ÚdtyperT)ÚAssertionErrorÚjsonÚloadsrKÚtensorÚfloat32rT)Ú request_bodyZrequest_content_typeÚdatar r r Úinput_fnxs rcc Cs¦t ¡| ¡WdQRXg}d}xntd|jd|ƒD]X}|||jdkrh|||||…dfƒ}n|||d…dfƒ}| | ¡j ¡¡q8Wt j |dd}|S)Nrr.)Úaxis) rKZno_gradrUÚrangeÚshapeÚappendrrbÚnumpyÚnpÚ concatenate)rbrWZsubarr_preds_listZ batch_sizeZbatch_iZ subarr_predÚ subarr_predsr r r Ú predict_fn€s rlcCs|dks t‚t |¡S)Nzapplication/json)r\r]Údumps)rkÚ content_typer r r Ú output_fn–s ro)r)"r]ÚloggingÚsysrOrKZtorch.nnrZtorch.nn.functionalZ functionalÚFrhriÚ getLoggerr ÚloggerÚsetLevelÚDEBUGÚ addHandlerÚ StreamHandlerÚstdoutZtorchvision.modelsrrTrZ is_availablerÚModulerrrrYrcrlror r r r Ús(       :