o
    ॵi6                     @   s   d dl Z d dlmZm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 d dlmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZ e ZejejejdG dd deZdS )    N)AnyDict)Image)	Pipelines)HRNetCrowdCounting)
OutputKeys)InputPipeline)	PIPELINES)	LoadImage)Tasks)
get_logger)module_namec                       s   e Zd Zdef fddZdd Zdd Zded	eee	f fd
dZ
deee	f d	eee	f fddZe dd Zdeee	f d	eee	f fddZ  ZS )CrowdCountingPipelinemodelc                    sd   t |ts	J dt jd|dd| td|  t|| j| _	| j	
  td dS )z8
            model: model id on modelscope hub.
        zmodel must be a single strF)r   auto_collatezloading model from dir zload model doneN )
isinstancestrsuper__init__loggerinfor   todeviceinfer_modeleval)selfr   kwargs	__class__r   c/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/pipelines/cv/crowd_counting_pipeline.pyr      s   
zCrowdCountingPipeline.__init__c                 C   s   |j d }|j d }|}|}|dkr|}d}|| | }|dkr*|}d}|| | }|dkr8|}d}|| | }|dkrF|}d}|| | }||k rU|| dkrTd}d}n
|| dkr_d}d}t|d d }t|d d }t||g|}|S )N   r   i   i  g;;@    )sizemathceil
transformsResize)r   imgheightwidthresize_heightresize_widthtmpr   r   r!   resize%   s@   

zCrowdCountingPipeline.resizec                 C   s  t dD ]}t dD ]}t|d d t|d d }}|d d |d d }}	td|d  d |d d |d   }
td|d  d |d d |d   }|dkrjtd|d  d }d}d}
n|dkrytd|d  d }|dkrtd|d  d }	d}d}n|dkrtd|d  d }	|d d d d |
|
| |||	 f  ||d | |d | d d d ||| |||	 f 7  < q
q|S )N         r"   r   )ranger%   floorr&   )r   
eval_shapeeval_ppred_mijstart_hstart_wvalid_hvalid_wpred_hpred_wr   r   r!   merge_cropsL   sT   



"

z!CrowdCountingPipeline.merge_cropsinputreturnc              
   C   s
  t |}| |}t |}|j}tdd|}|d d |d d }}g }tdD ]*}tdD ]#}	|d | |d |	 }
}||d d |
|
| ||| f  q4q.t	
|}|| j}t	|}t	dd|d d |d d f| j}||d}|S )N)g
ףp=
?gv/?gCl?)gZd;O?gy&1?g?r"   r1   r0   )r)   map)r   convert_to_imgr/   r'   ToTensorshape	Normalizer3   appendtorchstackr   r   squeezezeros)r   rA   r)   img_ori_tensor	img_shapepatch_heightpatch_widthimgsr8   r9   r:   r;   eval_imgeval_patchsprediction_mapresultr   r   r!   
preprocessk   sD   





z CrowdCountingPipeline.preprocessc                 C   s   |  |\}}tj|tj|iS N)perform_inferencer   SCORES
OUTPUT_IMG)r   rA   countsimg_datar   r   r!   forward   s   zCrowdCountingPipeline.forwardc                 C   sb   |d }|d }|  |\}}}|j}| |||}tj|ddj  |j  d d fS )Nr)   rC   )r"   r1   r0   )dimr   )r   rF   r@   rI   sumdatacpunumpy)r   r`   rS   rT   eval_prediction_eval_patchs_shaper   r   r!   rX      s   z'CrowdCountingPipeline.perform_inferenceinputsc                 C   s   |S rW   r   )r   rf   r   r   r!   postprocess   s   z!CrowdCountingPipeline.postprocess)__name__
__module____qualname__r   r   r/   r@   r   r   r   rV   r]   rI   no_gradrX   rg   __classcell__r   r   r   r!   r      s    '"
*r   ) r%   typingr   r   rb   nprI   torchvision.transformsr'   PILr   modelscope.metainfor   #modelscope.models.cv.crowd_countingr   modelscope.outputsr   modelscope.pipelines.baser   r	   modelscope.pipelines.builderr
   modelscope.preprocessors.imager   modelscope.utils.constantr   modelscope.utils.loggerr   r   register_modulecrowd_countingr   r   r   r   r!   <module>   s&   