o
    Ďi&                     @   s   d Z ddlZddlmZ ddlmZ ddlmZ dddZG dd	 d	ej	Z
G d
d dej	ZG dd dej	ZG dd dZdS )z
Loss functions
    N)bbox_iou)de_parallel皙?c                 C   s   dd|   d|  fS )N      ?      ? epsr   r   M/home/jeff/fluffinator/venv/lib/python3.10/site-packages/yolov5/utils/loss.py
smooth_BCE   s   r   c                       s&   e Zd Zd fdd	Zdd Z  ZS )BCEBlurWithLogitsLoss皙?c                    s"   t    tjdd| _|| _d S )Nnone)	reduction)super__init__nnBCEWithLogitsLossloss_fcnalpha)selfr   	__class__r   r
   r      s   

zBCEBlurWithLogitsLoss.__init__c                 C   sJ   |  ||}t|}|| }dt|d | jd   }||9 }| S )N   -C6?)r   torchsigmoidexpr   mean)r   predtruelossdxalpha_factorr   r   r
   forward   s   
zBCEBlurWithLogitsLoss.forward)r   __name__
__module____qualname__r   r$   __classcell__r   r   r   r
   r      s    r   c                       &   e Zd Zd fdd	Zdd Z  ZS )	FocalLoss      ?      ?c                    0   t    || _|| _|| _|j| _d| j_d S Nr   r   r   r   gammar   r   r   r   r1   r   r   r   r
   r   %      
zFocalLoss.__init__c                 C   s   |  ||}t|}|| d| d|   }|| j d| d| j   }d| | j }||| 9 }| jdkr;| S | jdkrD| S |S )Nr   r   r   sum)r   r   r   r   r1   r   r   r4   )r   r   r    r!   	pred_probp_tr#   modulating_factorr   r   r
   r$   -   s   


zFocalLoss.forwardr,   r-   r%   r   r   r   r
   r+   #       r+   c                       r*   )
QFocalLossr,   r-   c                    r.   r/   r0   r2   r   r   r
   r   C   r3   zQFocalLoss.__init__c                 C   sz   |  ||}t|}|| j d| d| j   }t|| | j }||| 9 }| jdkr2| S | jdkr;| S |S )Nr   r   r4   )	r   r   r   r   absr1   r   r   r4   )r   r   r    r!   r5   r#   r7   r   r   r
   r$   K   s   


zQFocalLoss.forwardr8   r%   r   r   r   r
   r:   A   r9   r:   c                   @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
ComputeLossFc           	      C   s  t | j}|j}tjtj|d g|dd}tjtj|d g|dd}t|	ddd\| _
| _|d }|d	krFt||t||}}t|jd
 }dg di	|jg d| _|ret|jdnd	| _||d||f\| _| _| _| _| _|j| _|j| _|j| _|j| _|| _d S )Ncls_pwdevice)
pos_weightobj_pwlabel_smoothingg        r   fl_gammar      )      @r   g?)rF   r   r-   gQ?g{Gz?   r   )next
parametersr?   hypr   r   r   tensorr   getcpcnr+   r   modelnlbalanceliststrideindexssiBCEclsBCEobjgrautobalancenancanchors)	r   rO   rY   r?   hrV   rW   gmr   r   r
   r   _   s"   "
zComputeLoss.__init__c                    s  t jd jd}t jd jd}t jd jd} ||\}}}}	t|D ]\}
}||
 \}}}}t j|jd d |j jd}|jd }|r|||||f ddd jfd\}}}}|	 d d }|	 d d |	|
  }t 
||fd}t|||
 dd	 }|d
|  7 }| d|j} jr| }|| || || || || f\}}}}} jdk rd
 j  j|  }||||||f<  jdkrt j| j jd} j|t|||
 f< | ||7 } |d |}|| j|
  7 } jr j|
 d d|     j|
< q& jr$ fdd jD  _| jd 9 }| jd 9 }| jd 9 }|jd }|| | | t 
|||f fS )Nr   r>      )dtyper?   r      r   T)CIoUr   ).r`   gH.?r   c                    s   g | ]
}| j  j  qS r   )rQ   rU   ).0xr   r   r
   
<listcomp>   s    z(ComputeLoss.__call__.<locals>.<listcomp>boxobjcls)r   zerosr?   build_targets	enumerateshapera   splitr[   r   catr   squeezer   detachclamptypesort_obj_iouargsortrX   	full_likerN   rM   rangerV   rW   rQ   rY   itemrJ   )r   ptargetslclslboxlobjtclstboxindicesr\   ipibagjgitobjnpxypwh_pclspboxioujtobjibsr   rf   r
   __call__y   sL   
*,

$
$zComputeLoss.__call__c           !      C   s  | j |jd }}g g g g f\}}}}tjd| jd}	tj|| jd |dd|}
t	||dd|
d fd}d}tj
ddgddgddgddgddgg| jd | }t| jD ]}| j| || j}}t
|g d	 |	dd
< ||	 }|r|ddd
f |d d d f  }t|d| dd | jd k }|| }|d d ddf }|	ddg | }|d |k |dk@ j\}}|d |k |dk@ j\}}tt|||||f}|d| }t|d  |d d d f  | }n|d }d}|dd\}}}}| d| j}\}}||  }|j\}} |||| d|d d |d|d d f |t	|| |fd |||  || q^||||fS )Nr      r>   r   ).Nrb   r   rD   )rE   rb   rE   rb      .r`   anchor_trE   )   r   r   )rZ   rn   r   onesr?   arangefloatviewrepeatrp   rK   rx   rP   r\   maxrJ   Tstack	ones_like
zeros_likechunklongappendclamp_)!r   rz   r{   rZ   ntr   r   r   anchgainair^   offr   r\   rn   r   rr   gxygxiklr_   offsetsbcgwhr   r   cgijr   r   r   r   r
   rl      sV   $	 $$
2zComputeLoss.build_targetsN)F)r&   r'   r(   ru   r   r   rl   r   r   r   r
   r<   [   s
    
8r<   )r   )__doc__r   torch.nnr   yolov5.utils.metricsr   yolov5.utils.torch_utilsr   r   Moduler   r+   r:   r<   r   r   r   r
   <module>   s   
