o
    2:j$                      @   s
  d 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ZddlmZ ddlmZ dZd	d	gd
g ddddgdg ddddgdg dddZdd Zdd Zdd Zdd Zdd Zdd Zdd  Zed!kre  dS dS )"a!  
@Author  :   Peike Li
@Contact :   peike.li@yahoo.com
@File    :   simple_extractor.py
@Time    :   8/30/19 8:59 PM
@Desc    :   Simple Extractor
@License :   This source code is licensed under the license found in the
             LICENSE file in the root directory of this source tree.
    N)Image)tqdm)
DataLoader)transform_logits)SimpleFolderDataset   i     )
BackgroundHatHairGlove
SunglassesUpper-clothesDressCoatSocksPants	JumpsuitsScarfSkirtFaceLeft-arm	Right-armLeft-leg	Right-leg	Left-shoe
Right-shoe)
input_sizenum_classeslabeli      )r	   r
   r   r   r   r   r   r   Beltr   r   r   r   r   r   r   Bagr      )r	   HeadTorsoz
Upper Armsz
Lower Armsz
Upper Legsz
Lower Legslipatrpascalc                  C   s   t jdd} | jdtdg dd | jdtdd	d
 | jdtddd
 | jdtddd
 | jdtddd
 | jddddd |  S )zbParse all the arguments provided from the CLI.
    Returns:
      A list of parsed arguments.
    z!Self Correction for Human Parsing)descriptionz	--datasetr'   r&   )typedefaultchoicesz--model-restore z$restore pretrained model parameters.)r+   r,   helpz--gpu0zchoose gpu device.z--input-dirzpath of input image folder.z--output-dirzpath of output image folder.z--logits
store_trueFzwhether to save the logits.)actionr,   r/   )argparseArgumentParseradd_argumentstr
parse_args)parser r9   &htdocs/OOTD3/SCHP/simple_extractor2.pyget_arguments5   s   r;   c                 C   s   | }dg|d  }t d|D ]f}|}d||d d < d||d d < d||d d < d}|rt||d d   |d? d@ d| > O  < ||d d   |d? d@ d| > O  < ||d d   |d? d@ d| > O  < |d7 }|dL }|s.q|S )z Returns the color map for visualizing the segmentation mask.
    Args:
        num_cls: Number of classes
    Returns:
        The color map
    r            r#   )range)num_clsnpalettejlabir9   r9   r:   get_paletteF   s"   (((rF   c                 C   s*   t j| t jd}|D ]}d|| |k< q
|S )Ndtype   )np
zeros_likeuint8)parsing_result	class_idsmaskclass_idr9   r9   r:   create_mask^   s   rQ   c                 C   s:   |j d d \}}| j ||fkr| S tj| ||ftjdS )Nr>   )interpolation)shapecv2resizeINTER_NEAREST)rO   imageheightwidthr9   r9   r:   resize_mask_to_imageg   s   rZ   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=   )rJ   wherelenrS   maxminCROP_PADDING)
rW   alphaysxsrX   rY   x1y1x2y2r9   r9   r:   crop_to_alphap   s   
rg   c                 C   sZ   t || }t|||g}t|dk| d}t|tj}||d d d d df< t||S )NrI   r   r<   )rZ   rT   mergerJ   r[   cvtColorCOLOR_RGB2RGBArg   )original_imagerO   mask_3ch	extractedrgbar9   r9   r:   extract_part   s   

ro   c            +   
   C   s  t  } | jdkotj }| jdkr+dd | jdD }t|dks%J | jtjd< t	|r1dnd}t
d	|  t| j d
 }t| j d }t| j d }t
d|| tjd|d d}tj| j|dd }ddlm}	 |	 }
| D ]\}}|dd  }||
|< qw||
 || |  tt tjg dg ddg}t| j||d}t|}tj | j!st"| j! t#|}dgdgdgdgdgdgdgdgd}t$ % t%t&|D ]\}}|\}}|d  d }|d! ' d }|d" ' d }|d# ' d }|d$ ' d }|||}tj(j)|d%d&d'}||d d( d *d}|+ }|,dd)d}t-|j./ ' |||||d*}t0j1|d)d+} tj2| j!|d d, d- }!t34t0j5| t0j6d.}"|"7| |"8|! | j9rtj2| j!|d d, d/ }#t08|#| tj2| j|}$t:;|$t:j<}%|%d u rt
d0|$  qt:=|%t:j>}%| D ]E\}&}'t?| |'}(|(@ dkrt
|&d1d2 qtA|%|(})tj2| j!|d d, d3|& d- }*t:B|*t:=|)t:jC t
|&d1d4 qqW d    d S 1 sw   Y  d S )5NNonec                 S   s   g | ]}t |qS r9   )int).0rE   r9   r9   r:   
<listcomp>   s    zmain.<locals>.<listcomp>,r=   CUDA_VISIBLE_DEVICEScudacpuzUsing device: r   r   r   z(Evaluating total class number {} with {}	resnet101)r   
pretrained)map_location
state_dictr   )OrderedDictr#   )gCl?gv/?g
ףp=
?)g?gy&1?gZd;O?)meanstd)rootr   	transform      	   
      r   )hatupper_clothesdresscoatpants	jumpsuitsscarfskirtnamecenterscalerY   rX   bilinearT)sizemodealign_cornersr>   )r   )axisz.pngrG   z.npyu-   원본 이미지를 읽을 수 없습니다: 15u    : 감지 안됨_u    : 저장 완료)Dr;   gputorchrv   is_availablesplitr\   osenvirondeviceprintdataset_settingsdatasetformatnetworks
init_modelloadmodel_restorecollectionsr|   itemsload_state_dicttoeval
transformsComposeToTensor	Normalizer   	input_dirr   pathexists
output_dirmakedirsrF   no_grad	enumerater   numpynnUpsample	unsqueezesqueezepermuter   datarw   rJ   argmaxjoinr   	fromarrayasarrayrL   
putpalettesavelogitsrT   imreadIMREAD_COLORri   COLOR_BGR2RGBrQ   sumro   imwriteCOLOR_RGBA2BGRA)+argsuse_cudagpusr   r   r   r   modelr{   r|   new_state_dictkvr   r   r   
dataloaderrB   clothing_classesidxbatchrW   metaimg_namecswhoutputupsampleupsample_outputlogits_resultrM   parsing_result_path
output_imglogits_result_pathoriginal_image_pathrk   clothing_namerN   clothing_maskclothing_imageclothing_output_pathr9   r9   r:   main   s   








$
--r   __main__)__doc__r   rT   r   r3   r   rJ   PILr   r   torch.utils.datar   torchvision.transformsr   r   utils.transformsr   !datasets.simple_extractor_datasetr   r_   r   r;   rF   rQ   rZ   rg   ro   r   __name__r9   r9   r9   r:   <module>   sJ   
			d
