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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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)
BottleneckResNet)
OutputKeys)InputPipeline)	PIPELINES)	LoadImage)Devices	ModelFileTasks)
get_logger)module_namec                       s   e Zd Z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 )AnimalRecognitionPipelinemodelc                    s   t  jdd|i| ddl}dd }dd   fdd	}| j| _|t| jtj	t
j}|d
d| _|| j| td dS )z
        use `model` to create a animal recognition pipeline for prediction
        Args:
            model: model id on modelscope hub.
        r   r   Nc                  [   s,   t t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   r   )kwargsr    r$   g/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/pipelines/cv/animal_recognition_pipeline.py
resnest101$   s   
z6AnimalRecognitionPipeline.__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   
z8AnimalRecognitionPipeline.__init__.<locals>.filter_paramc                    s0   d|v r|d }|   } || | | d S )N
state_dict)r6   load_state_dict)r   r0   r1   r5   r$   r%   load_pretrained>   s
   
z;AnimalRecognitionPipeline.__init__.<locals>.load_pretrainedi`   )num_classeszload model doner$   )super__init__torchr   
local_pathloadospjoinr   TORCH_MODEL_FILEr   cpuloggerinfo)selfr   r#   r=   r&   r9   r0   	__class__r8   r%   r<      s   z"AnimalRecognitionPipeline.__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)rF   rI   rO   	normalizetest_transformsresultr$   r$   r%   
preprocessL   s   
z$AnimalRecognitionPipeline.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   z4AnimalRecognitionPipeline.forward.<locals>.set_phaseFrO   r   outputs)r   r=   	unsqueeze)rF   rI   r]   r\   rO   	input_imgr^   r$   r$   r%   forwardY   s   
z!AnimalRecognitionPipeline.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label_mapping.txtrzutf-8)encodingr^   	r   )r@   rA   r>   open	readlinesr=   maxr	   SCORESitemLABELSargmaxsplit)rF   rb   label_mapping_pathflabel_mappingscorer$   r$   r%   postprocessh   s   
z%AnimalRecognitionPipeline.postprocess)__name__
__module____qualname__strr<   r
   r   r   rY   ra   rr   __classcell__r$   r$   rG   r%   r      s
    1"*r   )&os.pathpathr@   typingr   r   cv2numpynpr=   PILr   torchvisionr   modelscope.metainfor   'modelscope.models.cv.animal_recognitionr   r   modelscope.outputsr	   modelscope.pipelines.baser
   r   modelscope.pipelines.builderr   modelscope.preprocessorsr   modelscope.utils.constantr   r   r   modelscope.utils.loggerr   rD   register_moduleanimal_recognitionr   r$   r$   r$   r%   <module>   s(   