o
    J<jy$                     @   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edkre  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   SCHP/simple_extractor.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 | t j}|D ]}d|| |k< q|S )u7   특정 클래스만 흰색(mask)으로 만드는 함수   )np
zeros_likeastypeuint8)parsing_result	class_idsmaskcidr9   r9   r:   create_mask^   s   rP   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 )uB   투명하지 않은 영역만 남기도록 이미지 여백 제거r   r=   )rH   wherelenshapemaxminCROP_PADDING)
imagealphaysxsheightwidthx1y1x2y2r9   r9   r:   crop_to_alphaf   s   
ra   c                 C   sP   t |||g}t|dk| d}t |t j}||dddddf< t||S )u.   마스크를 적용하여 의류 부분 추출rG   r   Nr<   )cv2mergerH   rQ   cvtColorCOLOR_RGB2RGBAra   )original_imagerN   mask_3ch	extractedrgbar9   r9   r:   extract_partv   s   
rj   c            .   
   C   sH  t  } | jdkrtddd | jdD }t|dksJ | jtjd< tj	 s.tdt
d	}t| j d
 }t| j d }t| j d }td|| td| tjd|d d}tj| j|dd }ddlm} | }	| D ]\}
}|
dd  }||	|< qt||	 || |  tt tjg dg ddg}t| j||d}t|}tj !| j"rdd l#}|$| j" t%| j" t&|}dgdgdgdgdgdgdgdgd }t' 7 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}t0|j12 * |||||d+}t3j4|d*d,} | j5rntj 6| j"|d d- d. }!t37|!| td/|  tj 6| j|}"t89|"}#t8:|#t8j;}#t8<|#| j=d | j=d f}$td0| d1 | D ]l\}%}&t>| |&}'|'? dkr|&d }(|d d d d |(f })|)|'dk @ }*ddt3A|*   }+t|%d2d3|+d4 d5d6 tB|$|'},tj 6| j"|d d- d7|% d8 }-t8C|-t8:|,t8jD qt|%d2d9 qqW d    d S 1 sw   Y  d S ):NNoneuP   GPU 전용 실행만 허용됩니다. --gpu 값은 None이 될 수 없습니다.c                 S   s   g | ]}t |qS r9   )int).0rE   r9   r9   r:   
<listcomp>   s    zmain.<locals>.<listcomp>,r=   CUDA_VISIBLE_DEVICESuM   CUDA GPU를 사용할 수 없습니다. GPU 전용 실행만 허용됩니다.zcuda:0r   r   r   z(Evaluating total class number {} with {}zUsing device:	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scaler\   r[   bilinearT)sizemodealign_cornersr>   )r   )axisz.npyu   의류별 추출 중: z
=== u    의류 확률 ===15z : d   z6.2f%_z.pngu    : 감지 안됨)Er;   gpuRuntimeErrorsplitrR   osenvirontorchcudais_availabledevicedataset_settingsdatasetprintformatnetworks
init_modelloadmodel_restorecollectionsru   itemsload_state_dicttoeval
transformsComposeToTensor	Normalizer   	input_dirr   pathexists
output_dirshutilrmtreemakedirsrF   no_grad	enumerater   numpynnUpsample	unsqueezesqueezepermuter   datacpurH   argmaxlogitsjoinsaverb   imreadrd   COLOR_BGR2RGBresizerS   rP   sumrv   exprj   imwriteCOLOR_RGBA2BGRA).argsgpusr   r   r   r   modelrt   ru   new_state_dictkvr   ry   r   
dataloaderr   rB   clothing_classesidxbatchrW   metaimg_namecswhoutputupsampleupsample_outputlogits_resultrL   logits_result_pathoriginal_image_pathrf   original_image_resizedclothing_namerM   clothing_maskclass_idclass_scoresaverage_scoresoftmax_probclothing_imgclothing_output_pathr9   r9   r:   main   s   









$
77r   __main__)__doc__r   rb   r   r3   r   rH   PILr   r   torch.utils.datar   torchvision.transformsr   r   utils.transformsr   !datasets.simple_extractor_datasetr   rV   r   r;   rF   rP   ra   rj   r   __name__r9   r9   r9   r:   <module>   sH   
v
