o
    j                     @   s  d dl Z d dlZd dlZd dlZd dlZ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 d dlmZ d dlmZ ejejeZejedZejejedZd	Zejed
dZg dZg dZdZdZdZ dZ!dZ"ej#edd e
 Z$e$j%edgdgdgd G dd deZ&dd Z'dd Z(d:dd Z)d!d" Z*d#d$ Z+d%d& Z,d'd( Z-d)d* Z.d+d, Z/d-d. Z0d/d0 Z1e$2d1d2e&fd3d4Z3d5d6 Z4d7d8 Z5e6d9kre5  dS dS );    N)FastAPI)HTTPException)CORSMiddleware)Image)	BaseModelzsimple_extractor.pyoutputlipcheckpointszexp-schp-201908261155-lip.pth)         )	   
      r
   i,     r   Texist_ok*POSTzContent-Type)allow_originsallow_methodsallow_headersc                   @   s   e Zd ZU eed< dS )GenerateRequestimageN)__name__
__module____qualname__str__annotations__ r   r   %htdocs/OOTD2/segmentation/SCHP/run.pyr   (   s   
 r   c               	   C   sN   t dD ]} tjt| d}z
t| |W   S  ty"   Y qw td)Ni 05duB   사용 가능한 5자리 결과 폴더를 만들 수 없습니다.)rangeospathjoin
OUTPUT_DIRmakedirsFileExistsErrorRuntimeError)number
output_dirr   r   r    create_output_dir,   s   

r,   c                  C   s   t  } t jt d|  }t jt d|  }t j|ddd t j|ddd t j }||d< ||d< ||d< d	|d
< t j	t
jt j |dd |d< |S )Nschp_cache_schp_torch_extensions_i  T)moder   HOMEXDG_CACHE_HOMETORCH_EXTENSIONS_DIRz8.9TORCH_CUDA_ARCH_LISTPATH )r#   getuidr$   r%   tempfile
gettempdirr'   environcopydirnamesys
executablepathsepget)user_id
cache_homeextensions_direnvr   r   r    schp_env9   s   
$rD   Fc                 C   s   t jt j|dd tjdd<}t j|t j| }t	| | t
jtdtdtd|d|g
}td	| td
 tj|dtt ||d W d    d S 1 sPw   Y  d S )NTr   schp_inputs_)prefixz	--datasetz--model-restorez--input-dirz--output-dirzcmd: r5   )checkcwdrC   capture_outputtext)r#   r'   r$   r;   r7   TemporaryDirectoryr%   basenameshutilr:   r<   r=   SIMPLE_EXTRACTORDATASET
CHECKPOINTprint
subprocessrun
SCRIPT_DIRrD   )
image_pathr+   rI   	input_dirtemp_image_pathcmdr   r   r    run_schpI   s,   
	"rY   c                 C   s   t | |d t jS )N   )npisinastypeuint8)parsing_result	class_idsr   r   r    create_maske   s   ra   c                 C   sR   t j| dd\}}}}t| }td|D ]}||t jf tkr&d|||k< q|S )N   )connectivityr   rZ   )cv2connectedComponentsWithStatsr[   
zeros_liker"   CC_STAT_AREAMIN_MASK_AREA)maskcountlabelsstats_cleanedindexr   r   r    remove_small_partsi   s   
rp   c                 C   sv   t t jttf}t | t j|} t | t j|} t| } t j| |t	d} t 
| ttfd}t| dkd|tjS )N)
iterationsr   rZ   )rd   getStructuringElementMORPH_ELLIPSEMASK_KERNEL_SIZEmorphologyExMORPH_CLOSE
MORPH_OPENrp   dilateMASK_DILATE_ITERATIONSGaussianBlurMASK_BLUR_SIZEr[   wherer]   r^   )ri   kernel	soft_maskr   r   r    refine_maskt   s   r   c           
      C   s   t |dk\}}t|dkst|dkr| S |j\}}t| t d}t| t d}t| t d |}t| t d |}	| ||	||f S )Nr   r   )r[   r|   lenshapemaxminCROP_PADDING)
r   alphaysxsheightwidthx1y1x2y2r   r   r    crop_to_alpha~   s   
r   c                 C   s   t t||}|jd d |jd d kr&tj||jd |jd ftjd}t|tj}||d d d d df< t||}t	j
| |}t|t|tjsVtd| |S )N   r   r   )interpolation   zfailed to write )r   ra   r   rd   resizeINTER_NEARESTcvtColorCOLOR_RGB2RGBAr   r#   r$   r%   imwriteCOLOR_RGBA2BGRAr)   )r+   filenameimage_npr_   r`   r   r   output_pathr   r   r    	save_part   s   "
r   c                 C   s   t j|d d }t j| |d }t j|s td| tt	|
d}tt	|}|jdkrC|d d d d df }t| d||t}t| d||t}||fS )	Nz.pngu/   SCHP 파싱 결과를 찾을 수 없습니다: RGBr   r   zout_top.pngzout_bottom.png)r#   r$   rL   r%   isfiler)   r[   arrayr   openconvertndimr   TOP_CLASSESBOTTOM_CLASSES)r+   rU   stemparsing_pathr   r_   top_pathbottom_pathr   r   r    save_top_bottom   s   
r   c                 C   s   t j| tS N)r#   r$   relpathrT   r$   r   r   r    relative_path   s   r   c                 C   s   t j| r| S t jt| S r   )r#   r$   isabsr%   rT   r   r   r   r    
input_path   s   r   z	/generaterequestc              
   C   s   t | j}tj|stdd| j dt }zt||dd t||\}}W n2 t	j
yG } z|jp:|jp:t| }td|dd }~w tyZ } ztdt|dd }~ww dt|t|t|dS )	Ni  u*   입력 파일을 찾을 수 없습니다: )status_codedetailT)rI   i  success)statusr+   topbottom)r   r   r#   r$   r   r   r,   rY   r   rR   CalledProcessErrorstderrstdoutr   strip	Exceptionr   )r   rU   r+   r   r   errormessager   r   r    generate   s(   
r   c                  C   s.   t  } | jddd | jdddd |  S )NrU   u   입력 이미지 경로)helpz--outputoutputsu   출력 폴더)defaultr   )argparseArgumentParseradd_argument
parse_args)parserr   r   r    r      s   r   c                  C   sL   t  } tj| j}tj| j}t|| t|| td td| d S )Nu   SCHP 실행 완료u   결과 폴더:)	r   r#   r$   abspathrU   r   rY   r   rQ   )argsrU   r+   r   r   r    main   s   

r   __main__)F)7r   r#   rM   rR   r<   r7   rd   numpyr[   fastapir   r   fastapi.middleware.corsr   PILr   pydanticr   r$   r;   r   __file__rT   r%   rN   r&   rO   rP   r   r   rt   r{   rh   ry   r   r'   appadd_middlewarer   r,   rD   rY   ra   rp   r   r   r   r   r   r   postr   r   r   r   r   r   r   r    <module>   sh    


