o
    *j^                     @   s   d dl m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	  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 ejejejdG dd deZ dS )    N)AnyDict)Models)
TorchModel)MODELS)
OutputKeys)	ModelFileTasks   )build_backbone)FPNSegmentorLinearClassifier)module_namec                       sT   e Zd ZdZdef fddZdeeef fddZdd	 Z	d
d Z
dd Z  ZS )VisionMiddlewareModela  
    The implementation of 'ViM: Vision Middleware for Unified Downstream Transferring'.
        This model is dynamically initialized with the following parts:

        - backbone: the upstream pre-trained backbone model (CLIP in this code)
        - ViM: the zoo of middlestream trained ViM modules
        - ViM-aggregation: the specific aggregation weights for downstream tasks
    	model_dirc                    s  t t|   t|tj}tj|dd}|d }|d | _	|d }t
|d |d| _| j  |d }t|}	t|	D ] }
| jjj|
 j||
 d	  | jjj|
 j||
 d
  q<|d }|d }|d D ]/}t|	D ](}
| jjj|
 j||| |
 d | | jjj|
 j||| |
 d | qoqit | _i | _|d D ]S}|d }|drt| jj|| d jd d| j|< n|drt | j|< ntd|| j|  ||  | j|   ||d ! v r|d | | j|< qdS )a  
        Initialize a ViM-based Model.

        Args:
            model_dir: model id or path, where model_dir/pytorch_model.pt contains:

                - 'meta_info': basic information of ViM, e.g. task_list
                - 'backbone_weights': parameters of backbone [upstream]
                - 'ViM_weights': parameters of ViM [midstream]
                - 'ViM_agg_weights': parameters of ViM-aggregation [downstream]

        cpu)Zmap_location	meta_info	task_listbackbone_weightsZbackbone_arch)archZ
pretrainedZViM_weightsZvim_att_weightsZvim_mlp_weightsZViM_agg_weightsZViM_agg_algoZvim_att_aggZvim_mlp_agghead_weightsclszclassifier.biasr   )in_channelsZnum_classessegzTask type [{}] is not supportedZ	label_mapN)"superr   __init__ospjoinr   ZTORCH_MODEL_FILEtorchloadr   r   backboneevallenrangeZtransformerZ	resblocksZvim_attZregister_ViMZvim_mlpZregister_tasknnZ
ModuleDictheads
label_maps
startswithr   Z
output_dimshaper   NotImplementedErrorformatZload_state_dictkeys)selfr   argskwargsZ
model_pathZ
model_dictr   r   Zvim_weightsZ
num_layersZlayer_iZagg_weightsZagg_algo	task_namer   	__class__ m/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/cv/vision_middleware/model.pyr       s   






zVisionMiddlewareModel.__init__returnc                 C   s   |  | ||||S )N)postprocessforward)r,   inputsr/   r2   r2   r3   __call__j   s   zVisionMiddlewareModel.__call__c                 C   s@   || j vrtd| j  d| | j||d}| j| |}|S )z
        Dynamic Forward Function of ViM.

        Args:
            x: the input images (B, 3, H, W)
            task_name: specified task for forwarding
        ztask_name should in z
, but got )r/   )r   r)   r    r%   )r,   r7   r/   featuresoutputsr2   r2   r3   r6   n   s   
zVisionMiddlewareModel.forwardc                    s   |  \}}}}dv r{tj|dd}t|||fddd}|d   }tj|dd}	tt	t
|	d }
g g }}|
D ]$}|	|k}||   || ||   |     qA fd	d
|
D }tj|tj|tj|iS td)z
        Post-process of ViM, based on task_name.

        Args:
            inputs: batched input image (B, 3, H, W)
            outputs: batched output (format based on task_name)
            task_name (str): task name
        r   r
   )dimNZbilinearTr   c                    s   g | ]	} j  | qS r2   )r&   ).0labelr,   r/   r2   r3   
<listcomp>   s    z5VisionMiddlewareModel.postprocess.<locals>.<listcomp>z9Only segmentation task is currently supported in pipeline)sizeFZsoftmaxZinterpolatedetachr   r   ZargmaxsortedlistsetZreshapenumpyappendlongfloatsumitemr   ZMASKSZLABELSZSCORESr)   )r,   r:   r7   r/   _r   Z
img_heightZ	img_widthr   predlabelsZmasksZscoresr>   maskZlabel_namesr2   r?   r3   r5      s8   


z!VisionMiddlewareModel.postprocessc                 C   s   | j S )z?
        Get the supported tasks of current ViM model.
        )r   )r,   r2   r2   r3   	get_tasks   s   zVisionMiddlewareModel.get_tasks)__name__
__module____qualname____doc__strr   r   r   r8   r6   r5   rQ   __classcell__r2   r2   r0   r3   r      s    	J*r   )!Zos.pathpathr   typingr   r   jsonr   Ztorch.nnr$   Ztorch.nn.functionalZ
functionalrB   Zmodelscope.metainfor   Z'modelscope.models.base.base_torch_modelr   Zmodelscope.models.builderr   Zmodelscope.outputsr   Zmodelscope.utils.constantr   r	   r    r   headr   r   Zregister_moduleZimage_segmentationZvision_middlewarer   r2   r2   r2   r3   <module>   s"   