o
    ॵi                     @   s   d dl mZ d dlmZm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 d dlmZmZ d d	lmZ d d
lmZmZ d dlmZ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)
transforms)	Pipelines)resnet)
OutputKeys)InputPipeline)	PIPELINES)	LoadImage
load_image)	ModelFileTasks)
get_logger)module_namec                       s   e Zd Zdedef f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	deeef deeef fddZ
  ZS )GeneralRecognitionPipelinemodeldevicec                    s|   t  j|d ddl}dd }dd   fdd	}d
}| j| _|t| jtj	|}|dd| _|| j| t
d dS )z
        use `model` to create a general recognition pipeline for prediction
        Args:
            model: model id on modelscope hub.
        )r   r   Nc                  [   s0   t jt jg dfddddddddd| }|S )N)         r         @   TF)radixgroupsbottleneck_width	deep_stem
stem_widthavg_downavd	avd_first)r   ResNet
Bottleneck)kwargsr    r&   h/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/pipelines/cv/general_recognition_pipeline.py
resnest101$   s   

z7GeneralRecognitionPipeline.__init__.<locals>.resnest101c                 S   s   g }|   D ]:\}}d|dd kr|dd  }dt| d vr(|dd}||v r@|| j|jkr@|| | || qd S )Nzmodule.r      z.module..)itemslistkeysreplaceshapecopy_append)
src_params	own_statecopied_keysnameparamr&   r&   r'   filter_param2   s   
z9GeneralRecognitionPipeline.__init__.<locals>.filter_paramc                    s0   d|v r|d }|   } || | | d S )N
state_dict)r8   load_state_dict)r   r2   r3   r7   r&   r'   load_pretrained>   s
   
z<GeneralRecognitionPipeline.__init__.<locals>.load_pretrainedcpuiL  )num_classeszload model done)super__init__torchr   
local_pathloadospjoinr   TORCH_MODEL_FILEloggerinfo)selfr   r   r@   r(   r;   r2   	__class__r:   r'   r?      s   z#GeneralRecognitionPipeline.__init__inputreturnc                 C   sV   t |}tjg dg dd}ttdtdt |g}||}d|i}|S )N)g
ףp=
?gv/?gCl?)gZd;O?gy&1?g?)meanstd      img)r   convert_to_imgr   	NormalizeComposeResize
CenterCropToTensor)rH   rK   rQ   	normalize	transformresultr&   r&   r'   
preprocessN   s   
z%GeneralRecognitionPipeline.preprocessc                 C   s>   dd }d}|| j | |d }t|d}|  |}d|iS )Nc                 S   s   |r|    d S |   d S )N)traineval)r   is_trainr&   r&   r'   	set_phase]   s   z5GeneralRecognitionPipeline.forward.<locals>.set_phaseFrQ   r   outputs)r   r@   	unsqueeze)rH   rK   r_   r^   rQ   	input_imgr`   r&   r&   r'   forward[   s   
z"GeneralRecognitionPipeline.forwardinputsc                 C   s   t | jd}t|ddd}| }W d    n1 sw   Y  t|d }tj|	 gtj
||d   dd gi}|S )Nzmeta_info.txtrzutf-8)encodingr`   	r   )rC   rD   rA   open	readlinesr@   maxr   SCORESitemLABELSargmaxsplit)rH   rd   label_mapping_pathflabel_mappingscorer&   r&   r'   postprocessj   s   
z&GeneralRecognitionPipeline.postprocess)__name__
__module____qualname__strr?   r	   r   r   r[   rc   rt   __classcell__r&   r&   rI   r'   r      s
    3"*r   )%os.pathpathrC   typingr   r   cv2numpynpr@   PILr   torchvisionr   modelscope.metainfor   'modelscope.models.cv.animal_recognitionr   modelscope.outputsr   modelscope.pipelines.baser	   r
   modelscope.pipelines.builderr   modelscope.preprocessorsr   r   modelscope.utils.constantr   r   modelscope.utils.loggerr   rF   register_modulegeneral_recognitionr   r&   r&   r&   r'   <module>   s(   