o
    ߥi                      @   s   d dl mZ d dlZd dlZd dlm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 G d	d
 d
e	Z		dddZdddZdS )    N)
TorchModel)build_backbone)
build_head)
build_neck)DetectionOutput   )parse_configc                       sF   e Zd ZdZdef fddZdd Zdd Zd	d
 Zdd Z	  Z
S )SingleStageDetectorz2
    The base class of single stage detector.
    	model_dirc                    s  t  j|g|R i | t|| j}t|}|| _t||jj}t||jj	}t
t|d| _|jj| _|jjj| _|jjj| _|jjj| _d| jjjjv rat|| jjjj| jjj_t| jjj| _t| jjj| _t| jjj| _d| j_| | j d| _ | !| dS )z#
        init model by cfg
        rbTinyNASFN)"super__init__ospjoinconfig_namer   cfgmodelname	class_mappickleloadopen	label_mapdatasetsize_divisibilitysize_divisibleheadnum_classesnms_conf_thre	conf_threnms_iou_threnms_threbackbonestructure_filer   r   neckr   nmsapplyinit_bnonnx_exportload_pretrain_model)selfr
   argskwargsconfig_pathconfig
model_pathr   	__class__ c/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/cv/tinynas_detection/detector.pyr      s,   
zSingleStageDetector.__init__c                 C   sl   t j|dd}d|v r|d }nd|v r|d }i }| D ]\}}|dd}|||< q| j|dd d S )	Ncpu)map_locationr   
state_dictzmodule. T)strict)torchr   itemsreplaceload_state_dict)r+   pretrain_modelckptr7   new_state_dictkvr3   r3   r4   r*   8   s   

z'SingleStageDetector.load_pretrain_modelc                 C   s*   |  D ]}t|tjrd|_d|_qd S )NgMbP?gQ?)modules
isinstancennBatchNorm2depsmomentum)r+   Mmr3   r3   r4   r(   D   s   zSingleStageDetector.init_bnc                 C   sP   | j rd S | |}| |}| |\}}tj||dd| jf gdd}|S )N.r   )dim)trainingr#   r%   r   r:   catr   )r+   x
cls_scores
bbox_preds
predictionr3   r3   r4   forwardJ   s   

zSingleStageDetector.forwardc                    sh    j r|S t| j j j\}}}|  }|  }|  } fdd|D }t|||dS )Nc                    s"   g | ]} j |d   d d qS )r   r   r   )r   ).0idxr+   r3   r4   
<listcomp>^   s   " z3SingleStageDetector.postprocess.<locals>.<listcomp>)boxesscores	class_ids)r)   postprocess_gfocalr   r    r"   r5   numpyr   )r+   predsbboxesrY   
labels_idxlabelsr3   rV   r4   postprocessU   s   
zSingleStageDetector.postprocess)__name__
__module____qualname____doc__strr   r*   r(   rS   ra   __classcell__r3   r3   r1   r4   r	      s    r	   d   c              	   C   s4  | d}| jd dkr| | ddd}n| dddf | d|d}|}||k}	t|t|	|	|	|	fddd}|durM||dddf  }t||	}|	jdddddf }
| dkr|| 	d}| j	d	tj
d
}
| 	d	}|||
fS tj|||
|}|dkr|d| }|| || |
| fS )a  NMS for multi-class bboxes.

    Args:
        multi_bboxes (Tensor): shape (n, #class*4) or (n, 4)
        multi_scores (Tensor): shape (n, #class), where the last column
            contains scores of the background class, but this will be ignored.
        score_thr (float): bbox threshold, bboxes with scores lower than it
            will not be considered.
        nms_thr (float): NMS IoU threshold
        max_num (int): if there are more than max_num bboxes after NMS,
            only top max_num will be kept.
        score_factors (Tensor): The factors multiplied to scores before
            applying NMS

    Returns:
        tuple: (bboxes, labels), tensors of shape (k, 5) and (k, 1). Labels             are 0-based.
    r      r   rK   NF)as_tuple)r      )r   )dtype)sizeshapeviewexpandr:   masked_selectstacknonzeronumel	new_zeroslongtorchvisionopsbatched_nms)multi_bboxesmulti_scores	score_thriou_thrmax_numscore_factorsr   r^   rY   
valid_maskr`   keepr3   r3   r4   multiclass_nmsg   s:   



r   皙?ffffff?c                 C   sx   | j d dks	J t| D ])\}}|dsq|d d d df }|d d dd f }t||||d\}}	}
q||	|
fS )Nr   r   ri   i  )rn   	enumeraterm   r   )rR   r   r    r"   i
image_predrz   r{   
detectionsrY   r`   r3   r3   r4   r[      s   

r[   )rh   N)r   r   )os.pathpathr   r   r:   torch.nnrE   rw   'modelscope.models.base.base_torch_modelr   Amodelscope.models.cv.tinynas_detection.damo.base_models.backbonesr   =modelscope.models.cv.tinynas_detection.damo.base_models.headsr   =modelscope.models.cv.tinynas_detection.damo.base_models.necksr   modelscope.outputs.cv_outputsr   utilsr   r	   r   r[   r3   r3   r3   r4   <module>   s    U
@