Explicación detallada y mejora de yolov5.

https://github.com/z1069614715/objectdetection_script

Mejora de YOLOV5 - Asignación óptima de transporte

La asignación de transporte óptimo (OTA) es una mejora en YOLOv5. Es un mejor marco de detección de objetivos que puede aumentar considerablemente la velocidad de detección al tiempo que garantiza la precisión de la detección.

En el marco tradicional de detección de objetivos, el algoritmo húngaro generalmente se usa para hacer coincidir el objetivo y el marco de detección. Aunque este algoritmo puede encontrar la coincidencia óptima, en aplicaciones prácticas, debido al cálculo excesivo de la coincidencia, la velocidad de detección suele ser demasiado lenta.

El algoritmo OTA presenta un nuevo método de medición de distancia entre el objetivo y el marco de detección, que puede hacer coincidir el objetivo y el marco de detección más rápidamente sin aumentar la cantidad de cálculo. Específicamente, el algoritmo OTA convierte la distancia entre el objetivo y el marco de detección en una distribución de probabilidad y luego hace coincidir el objetivo con el marco de detección minimizando la distancia de Wasserstein entre las dos distribuciones de probabilidad. Debido a la pequeña cantidad de cálculo de la distancia de Wasserstein, el algoritmo OTA puede mejorar en gran medida la velocidad de detección.

Además de acelerar la velocidad de detección, el algoritmo OTA también puede mejorar la precisión de detección. El algoritmo húngaro tradicional puede tomar algunas coincidencias inexactas como coincidencias óptimas, lo que resulta en una disminución de la precisión de detección. Al minimizar la distancia de Wasserstein entre dos distribuciones de probabilidad, el algoritmo OTA puede evitar esta situación hasta cierto punto y mejorar la precisión de detección.

En general, el algoritmo OTA es una mejora importante en YOLOv5. Al introducir un nuevo método de medición de distancia entre el objetivo y el cuadro de detección, puede realizar el objetivo y la detección más rápidamente sin aumentar la cantidad de cálculo. La coincidencia de cuadros mejora la velocidad de detección. y precisión.
La siguiente es la implementación del código y la fórmula del algoritmo OTA:

Fórmula:
Primero, define dos distribuciones ppp yqqq , representan la distribución de distancia entre el cuadro objetivo y el cuadro predicho, respectivamente. Entonces, el emparejamiento óptimo se puede expresar como el siguiente problema:

min ⁡ T ∈ Ψ mi ( yo , j ) ∼ T [ di , j ] \min_{T\in\Psi} \mathbb{E}{(i,j)\sim T}[d{i,j}]T Ψminutomi ( yo ,j )T [ d yo ,j ]

Entre ellos, di , j d_{i,j}dyo , jIndica la distancia entre el cuadro objetivo y el cuadro predicho, TTT representa la matriz coincidente,Ψ \PsiΨ representa el conjunto de todas las matrices legales coincidentes. mi ( yo , j ) ∼ T [ di , j ] \mathbb{E}{(i,j)\sim T}[d{i,j}]mi ( yo ,j )T [ d yo ,j ] en la matriz correspondienteTTBajo las restricciones de T , el valor esperado de la distancia entre el cuadro objetivo y el cuadro predicho.

Para transformar la distancia entre el cuadro objetivo y el cuadro de predicción en una distribución de probabilidad, defina C ∈ R n × m C\in\mathbb{R}^{n\times m}CRn × m es la matriz de distancia, dondennn representa el número de cajas de destino,mmm representa el número de cajas pronosticadas. Cij C_{ij}CyoIndica el iiEl cuadro i target y eljjthLa distancia entre j cajas pronosticadas.

La matriz de distancia CCC se transforma en una distribución de probabilidadP ∈ R n × m P\in\mathbb{R}^{n\times m}PAGRn × mQ ∈ R n × m Q\in\mathbb{R}^{n\times m}qRn × m , dondeP ij P_{ij}PAGyoIndica el iiEl cuadro i target y eljjthLa probabilidad coincidente de j casillas de predicción,Q ij Q_{ij}qyoIndica el iiEl cuadro i target y eljjthLa probabilidad de que las casillas predichas j no coincidan. Luego están:

PAGS ij = expansión ⁡ ( - C ij / τ ) ∑ k = 1 metro expansión ⁡ ( - C ik / τ ) P_{ij} = \frac{\exp(-C_{ij}/\tau)}{\sum_ {k=1}^m\exp(-C_{ik}/\tau)}PAGyo=k = 1mExp ( Ci/ t )Exp ( Cyo/ t ).

Q ij = expansión ⁡ ( - C ij / τ ) ∑ k = 1 norte expansión ⁡ ( - C kj / τ ) Q_{ij} = \frac{\exp(-C_{ij}/\tau)}{\sum_ {k=1}^n\exp(-C_{kj}/\tau)}qyo=k = 1nExp ( Ckj/ t )Exp ( Cyo/ t ).

Entre ellos, τ \tauτ es un parámetro de temperatura que controla la suavidad de la distribución de probabilidad.

Finalmente, el PPP yQQSustituyendo Q en la fórmula de la distancia de Wasserstein se puede resolver el problema de minimizar la distancia de Wasserstein:

min ⁡ T ∈ Ψ ∑ yo = 1 norte ∑ j = 1 metro T ij C ij \min_{T\in\Psi} \sum_{i=1}^n\sum_{j=1}^m T_{ij} C_{ij}T Ψminutoyo = 1nj = 1mTyoCyo

s . t. T 1 norte = α , TT 1 metro = β , T yo , j ∈ [ 0 , 1 ] st \quad T1_n = \alpha, T^T1_m = \beta, T_{i,j}\in[0,1]s . t .T 1n=un ,TT 1m=b ,Tyo , j[ 0 ,1 ]

Entre ellos, T.T.T significa matriz coincidente,1 n 1_n1ny 1m 1_m1mrepresentan nn respectivamenten dimensión ymmm -dimensional completo 1 vector,α \alphaαβ \betaβ denota el número de casillas objetivo y casillas predichas, respectivamente. T 1 n = α T1_n = \alphaT 1n=α significa que cada marco de predicción solo puede coincidir con un marco objetivo,TT 1 m = β T^T1_m = \betaTT 1m=β significa que cada cuadro objetivo solo puede coincidir con un cuadro de predicción. T yo , j ∈ [ 0 , 1 ] T_{i,j}\in[0,1]Tyo , j[ 0 ,1 ] representa el rango de valores de cada elemento en la matriz coincidente.

Código:
la implementación del código del algoritmo OTA se implementó en YOLOv5 y se puede encontrar en el archivo models/yolo.py en https://github.com/ultralytics/yolov5. El siguiente es el fragmento de código principal del algoritmo OTA:

Primero, defina la matriz de distancia CCdo :

Matriz de distancia

iou = box_iou(xywh2xyxy(pred_boxes), xywh2xyxy(target_boxes))  # shape(n,m)
iou[iou < 0.001] = 0  # avoid CPU NaN, [0,1]
C = -iou.log()  # cost = -log(iou)  shape(n,m)

Luego, calcule la matriz coincidente TTT :

Antiguo Testamento

T = torch.Tensor(ot.sinkhorn(torch.exp(-Cself.ota_tau), self.ota_lambd)).to(device)  # shape(n,m), run Sinkhorn

Entre ellos, la función ot.sinkhorn() usa el algoritmo Sinkhorn en la biblioteca Python Optimal Transport para calcular la matriz coincidente TTt._ _ self.ota_tau y self.ota_lambd representan el parámetro de temperatura y el parámetro de regularización en el algoritmo OTA, respectivamente. Finalmente, de acuerdo con la matriz de emparejamientoTTT calcula la distancia entre el cuadro objetivo y el cuadro predicho:

Pérdida

loss_xy = self.mse_loss(pred[..., :2], t[..., :2])  # xy loss
loss_wh = self.mse_loss(pred[..., 2:4], t[..., 2:4])  # wh loss
loss_obj = self.bce_loss(pred[..., 4:5], t[..., 4:5]) + self.bce_loss(pred[..., 9:10], t[..., 9:10])  # obj loss
loss_cls = self.bce_loss(pred[..., 5:9], t[..., 5:9]) + self.bce_loss(pred[..., 10:], t[..., 10:])  # cls loss
loss_l2 = self.l2_loss(pred_boxes, target_boxes) / self.hyp['giou']  # giou loss
loss = loss_xy + loss_wh + loss_obj + loss_cls + loss_l2  # total loss
loss *= self.ota_lambd
loss += (T * C).sum() * self.ota_tau  # OT loss

Al calcular la pérdida total, se suman el término de regularización y el término de pérdida OT del algoritmo OTA.

Lo anterior es la implementación del código y la fórmula del algoritmo OTA.

Agregar mecanismo de atención a YOLOv5

Agregar el mecanismo de atención a YOLOv5 puede traer los siguientes beneficios:

Mejorar la precisión de la detección: el mecanismo de atención puede hacer que la red preste más atención a las funciones importantes y suprima las funciones sin importancia, mejorando así la precisión de la detección.

Mejora de la robustez: el mecanismo de atención puede hacer que la red sea más robusta frente al ruido y la interferencia, mejorando así la robustez de la detección.

Fortalecer la capacidad de detección de objetivos pequeños: en YOLOv5, agregar un mecanismo de atención puede fortalecer la capacidad de detección de objetivos pequeños, porque los objetivos pequeños generalmente tienen representaciones de características débiles, y el mecanismo de atención puede hacer que la red preste más atención a las características importantes de los objetivos pequeños. , mejorando así la precisión de detección.

Acelerar la convergencia del modelo: el mecanismo de atención puede hacer que la red preste más atención a características importantes, lo que reduce los cálculos redundantes de la red y acelera la convergencia del modelo.

En YOLOv5, el mecanismo de atención se aplica al módulo SPP y al módulo PANet. En el módulo SPP, el mecanismo de atención se usa para ajustar los pesos de mapas de características de diferentes escalas para mejorar la capacidad de detección de objetos pequeños. En el módulo PANet, el mecanismo de atención se utiliza para ajustar los pesos de los mapas de características en diferentes niveles para mejorar la precisión y la solidez de la detección.

import torch
import torch.nn as nn


class SimAM(torch.nn.Module):
    def __init__(self, e_lambda=1e-4):
        super(SimAM, self).__init__()

        self.activaton = nn.Sigmoid()
        self.e_lambda = e_lambda

    def __repr__(self):
        s = self.__class__.__name__ + '('
        s += ('lambda=%f)' % self.e_lambda)
        return s

    @staticmethod
    def get_module_name():
        return "simam"

    def forward(self, x):
        b, c, h, w = x.size()

        n = w * h - 1

        x_minus_mu_square = (x - x.mean(dim=[2, 3], keepdim=True)).pow(2)
        y = x_minus_mu_square / (4 * (x_minus_mu_square.sum(dim=[2, 3], keepdim=True) / n + self.e_lambda)) + 0.5

        return x * self.activaton(y)


if __name__ == '__main__':
    input = torch.randn(3, 64, 7, 7)
    model = SimAM()
    outputs = model(input)
    print(outputs.shape)

Este código implementa un mecanismo de atención basado en similitudes (SimAM), que se puede utilizar para mejorar la capacidad de representación de características de las redes neuronales.

La implementación de SimAM es ingresar el mapa de características xxx está estandarizado y se calcula la similitud entre cada píxel y otros píxeles. Específicamente, para el mapa de características de entradax ∈ RB × C × H × W x\in\mathbb{R}^{B\times C\times H\times W}XRB × C × H × W , dondeBBB significa tamaño de lote,CCC representa el número de canales,HHHwaWW __W representa la altura y el ancho del mapa de características, respectivamente, y el proceso de cálculo de SimAM es el siguiente:

Calcular mapa de características xxEl valor medio de x μ ∈ RB × C × 1 × 1 \mu\in\mathbb{R}^{B\times C\times 1\times 1}metroRB × C × 1 × 1 y la varianzavar ∈ RB × C × 1 × 1 var\in\mathbb{R}^{B\times C\times 1\times 1}guerra _ _RB × C × 1 × 1 , donde la media y la varianza están respectivamente enHHHwaWW __Calculado sobre la dimensión de W.

Para el mapa de características xxx se estandariza para obtener un mapa de características estandarizadox ~ ∈ RB × C × H × W \tilde{x}\in\mathbb{R}^{B\times C\times H\times W}X~RB × C × H × W , es decir:

x ~ = x − μ var + ϵ \tilde{x} = \frac{x-\mu}{\sqrt{var+\epsilon}}X~=guerra _ _+ϵ Xmetro

donde ϵ \epsilonϵ es una pequeña constante para evitar el cero en el denominador.

Calcula cada punto de píxel xi , j ∈ x ~ x_{i,j}\in\tilde{x}Xyo , jX~ Similitud con otros píxelesyi , j y_{i,j}yyo , jy normalizar la similitud. Específicamente, para cada píxel xi , j x_{i,j}Xyo , j, calcula su similitud con otros píxeles:
yi , j = xi , j 2 4 ( 1 n − 1 ∑ k ≠ i , jxk 2 + ϵ ) + 0.5 y_{i,j} = \frac{x_{i ,j} ^2}{4(\frac{1}{n-1}\sum_{k\neq i,j}x_k^2+\epsilon)}+0.5yyo , j=4 (norte - 11k= yo , jXk2+) _Xyo , j2+0.5

donde n = ACS n= ACSnorte=H W representa el número de píxeles en el mapa de características. Semejanzayi , j y_{i,j}yyo , jEl método de cálculo es xi , j x_{i,j}Xyo , jNormalice la diferencia de cuadrados con otros píxeles y agregue un término de sesgo 0.5 0.50.5 , para mapear la similitud con[ 0 , 1 ][0,1][ 0 ,1 ] dentro del rango.

El mapa de características original xxx y semejanzayyMultiplica y para obtener el mapa de características ponderadasz ∈ RB × C × H × W z\in\mathbb{R}^{B\times C\times H\times W}zRB × C × H × W,即:
zi , j = xi , jyi , j z_{i,j} = x_{i,j}y_{i,j}zyo , j=Xyo , jyyo , j

Finalmente, el mapa de características ponderadas zzz se normaliza mediante la función de activación de Sigmoid para obtener el mapa de características de salida final.

En SimAM, el método de cálculo de similitud se basa en la similitud entre píxeles dentro del mapa de características, en lugar del método de agrupación global en mecanismos de atención como SENet. Este mecanismo de atención basado en la similitud puede preservar mejor la información espacial del mapa de características original, mejorando así la capacidad de representación de características de la red.

Las ventajas de SimAM incluyen:

Puede mejorar la capacidad de representación de funciones de la red: SimAM puede hacer que la red preste más atención a las funciones importantes y suprima las funciones sin importancia, mejorando así la capacidad de representación de funciones.

Puede mejorar la solidez de la red: SimAM puede hacer que la red sea más resistente al ruido y la interferencia, mejorando así la solidez de la red.

La información espacial del mapa de características original se puede conservar: SimAM calcula el peso de la atención en función de la similitud entre los píxeles dentro del mapa de características, lo que puede preservar mejor la información espacial del mapa de características original.

Menos computacionalmente intensivo: SimAM es menos computacionalmente intensivo y solo requiere algunas operaciones matemáticas básicas, por lo que puede integrarse fácilmente en redes neuronales.

Cabe señalar que el hiperparámetro e λ e_\lambda de SimAMmiyoDebe ajustarse de acuerdo con la tarea específica, y diferentes tareas pueden requerir diferentes hiperparámetros.

SimAM se ha aplicado con éxito a múltiples tareas de visión, como clasificación de imágenes, segmentación de imágenes y detección de objetos.

Mejora de YOLOV5: agregue FocalEIoU y use FocalEIoU para optimizar otras variantes de IoU.

https://www.bilibili.com/video/bv1pd4y1n7w3/?spm_ID_FROM=333.788vd_source=85F7D0D0D97C494901F6886C09B832B
, el autor tiene la prueba de destino de la prueba de destino Se ha mejorado el método de cálculo de iOU en el servicio y una nueva variante de IOU -Focaleiou y utilice la idea de FocalEIoU para optimizar otras variantes de IoU.

En las tareas tradicionales de detección de objetivos, IoU es un indicador que se utiliza para evaluar el grado de superposición entre el cuadro de detección y el cuadro de verdad del terreno. Sin embargo, el IoU tradicional tiene algunos problemas para lidiar con el desequilibrio de categorías. Por ejemplo, para algunos objetos raros, es difícil para el IoU tradicional distinguir el marco real del marco de fondo, lo que afecta la precisión de la detección.

Para resolver este problema, se introdujo una nueva variante de IoU, FocalEIoU, en YOLOv5. FocalEIoU introduce un peso de categoría y un peso de muestra basado en el método de cálculo tradicional de IoU, para que pueda manejar mejor la situación de desequilibrio de categoría. Específicamente, FocalEIoU se calcula de la siguiente manera:

F ocal EI o U = ∑ i = 1 nwi ⋅ fi ⋅ e γ ( 1 − fi ) ∑ i = 1 nwi FocalEIoU = \frac{\sum_{i=1}^{n}w_i\cdot f_i\cdot e^ {\gamma(1-f_i)}}{\sum_{i=1}^{n}w_i}F oc a lE I o U=yo = 1nwyoyo = 1nwyoFyomic ( 1 - fyo)

Entre ellos, nnn representa el número de intersecciones entre el marco de detección y el marco real;wi w_iwyoIndica el peso de cada categoría; fi f_iFyoRepresenta la frecuencia de cada categoría, que se puede estimar por el número de muestras; γ \gammaγ representa un hiperparámetro utilizado para equilibrar el peso de muestras positivas y negativas.

La ventaja de usar FocalEIoU es que puede manejar mejor el caso de desequilibrio de clases, lo que puede mejorar la precisión de la detección. Además, FocalEIoU también se puede utilizar para optimizar otras variantes de IoU, como GIoU y DIoU. Específicamente, la idea de FocalEIoU se puede utilizar para introducir pesos de categoría y pesos de muestra para optimizar el cálculo de estos IoU.

En resumen, FocalEIoU en YOLOv5 es una variante efectiva de IoU que puede manejar mejor el desequilibrio de categorías y, por lo tanto, mejorar la precisión de la detección de objetos. Además, la idea de FocalEIoU también se puede utilizar para optimizar otras variantes de IoU.

Además de FocalEIoU, YOLOv5 también presenta algunas otras mejoras, que incluyen:

Red troncal CSPDarknet: YOLOv5 utiliza una nueva red troncal, CSPDarknet, que puede mejorar la capacidad de representación de características y la eficiencia computacional de la red.

Entrenamiento adaptativo: YOLOv5 utiliza una estrategia de entrenamiento adaptativo, que puede ajustar automáticamente los parámetros de entrenamiento según el tamaño y la dificultad del conjunto de datos, mejorando así el efecto del entrenamiento.

Entrenamiento multiescala: YOLOv5 utiliza una estrategia de entrenamiento multiescala, que puede entrenar la red a diferentes escalas, mejorando así la capacidad de generalización y la solidez de la red.

Estrategia de preentrenamiento: YOLOv5 utiliza una nueva estrategia de preentrenamiento que se puede entrenar previamente en conjuntos de datos de imágenes a gran escala para mejorar la representación de características y las capacidades de generalización de la red.

Estas mejoras han permitido que YOLOv5 logre muy buenos resultados en tareas de detección de objetivos, por ejemplo, el rendimiento en el conjunto de datos COCO supera a otros algoritmos de detección de objetivos, y también tiene una gran mejora en la velocidad. Además, YOLOv5 puede mejorar aún más la eficiencia computacional a través de técnicas como la compresión de modelos.

Cabe señalar que aunque YOLOv5 ha logrado buenos resultados en tareas de detección de objetivos, diferentes tareas y conjuntos de datos pueden requerir diferentes algoritmos y técnicas. Por lo tanto, en aplicaciones prácticas, debe seleccionarse y ajustarse de acuerdo con tareas y conjuntos de datos específicos.

Mejora de YOLOV5: use Efficient-RepGFPN en DAMO-YOLO para reemplazar Neck en YOLOV5.

https://www.bilibili.com/video/BV1iR4y1a7bx/?spm_id_from=333.788&vd_source=85f7d0d97c49c694901f6886c09b832b
DAMO-YOLO es una versión mejorada basada en YOLOv5, que presenta una nueva red piramidal de características: Efficient-RepG FPN, con Para reemplazar Neck in YOLOv5. Efficient-RepGFPN puede mejorar la capacidad de representación de características y la eficiencia computacional de la red, mejorando así aún más la precisión y la velocidad de detección de objetos.

Efficient-RepGFPN es una red piramidal de funciones basada en la repetición de funciones y la agrupación global de pirámides de funciones. En concreto, incluye los siguientes módulos:

Módulo de repetición de funciones: el mapa de funciones se repite varias veces y se une con el mapa de funciones original para mejorar la resolución y la riqueza del mapa de funciones.

Módulo de pirámide de características regular: use múltiples capas convolucionales y de agrupación para construir pirámides de características, aumentando así la escala y la riqueza de los mapas de características.

Módulo de agrupación de pirámides de características globales: use diferentes escalas de agrupación para extraer características globales y unirlas con pirámides de características convencionales para mejorar la riqueza y las capacidades de generalización de los mapas de características.

Módulo de fusión de características: use el mecanismo de atención de características y la cascada de características para fusionar mapas de características de varias escalas, mejorando así la capacidad de representación y la precisión de los mapas de características.

El uso de Efficient-RepGFPN para reemplazar a Neck en YOLOv5 puede traer las siguientes ventajas:

Mejorar la capacidad de representación de características: Efficient-RepGFPN puede mejorar la resolución, la escala y la riqueza del mapa de características, mejorando así aún más la capacidad de representación de características.

Mejorar la eficiencia computacional: Efficient-RepGFPN puede reducir la cantidad de cálculos y la cantidad de parámetros a través de la repetición de características y la agrupación de pirámides de características globales, mejorando así la eficiencia computacional.

Mejorar la precisión de detección: el módulo de fusión de características de Efficient-RepGFPN puede mejorar aún más la capacidad de representación y la precisión de los mapas de características, mejorando así aún más la precisión de detección.

Cabe señalar que, si bien Efficient-RepGFPN puede brindar las ventajas anteriores, en aplicaciones prácticas, debe seleccionarse y ajustarse de acuerdo con tareas y conjuntos de datos específicos. Al mismo tiempo, la implementación de Efficient-RepGFPN también debe tener en cuenta las limitaciones de los recursos informáticos y la estabilidad del entrenamiento del modelo.

Mejora de YOLOV5: agregue EIOU, SIOU, AlphaIOU a la función de pérdida de yolov5.

https://www.bilibili.com/video/BV1KM411b7Sz/?spm_id_from=333.788&vd_source=85f7d0d97c49c694901f6886c09b832b
Agregar EIOU, SIOU y AlphaIOU a la función de pérdida de YOLOv5 puede optimizar aún más la precisión y la solidez de la detección de objetivos. Estas variantes de IoU pueden manejar mejor problemas como el desequilibrio de clases y las formas irregulares de los objetos, mejorando así la precisión y la solidez de la detección de objetos.

Específicamente, EIOU, SIOU y AlphaIOU se pueden agregar a la función de pérdida de YOLOv5 para calcular el grado de superposición entre el marco de detección y el marco real. Estas variantes de IoU se calculan de la siguiente manera:

EIOU:
EIOU = IOU − ( arctan ( wt / ht ) − arctan ( wp / hp ) ) 2 π 2 EIOU = IOU - \frac{(arctan(w_t/h_t) - arctan(w_p/h_p))^2}{ \pi^2}E I O U=YO TU _Pi2( a rc t an ( wt/ horat)a rc tan ( w _pag/ horapag) )2

Entre ellos, wt w_twty h h h_thtIndica el ancho y alto de la caja real, wp w_pwpagy hp h_phpagIndica el ancho y alto del cuadro de detección.

SIOU:
SIOU = IOU − ( wt − ht ) 2 wp 2 + hp 2 SIOU = IOU - \frac{(w_t-h_t)^2}{w_p^2+h_p^2}S I O U=YO TU _wpag2+hpag2( wtht)2

Entre ellos, wt w_twty h h h_thtIndica el ancho y alto de la caja real, wp w_pwpagy hp h_phpagIndica el ancho y alto del cuadro de detección.

AlphaIOU:
A lpha IOU = 1 − ( 1 − IOU α ) ( 1 − IOU α + ϵ ) AlphaIOU = 1 - \frac{(1 - IOU^\alpha)}{(1 - IOU^\alpha + \epsilon) } }A lp ha I O U=1( 1YO TU _a+) _( 1YO TU _a ).

Entre ellos, α \alphaα es un parámetro ajustable,ϵ \epsilonϵ es un pequeño número positivo para evitar el cero en el denominador.

Agregar estas variantes de IoU a la función de pérdida de YOLOv5 puede optimizar aún más la precisión y la solidez de la detección de objetos. Cabe señalar que los métodos de cálculo y la configuración de parámetros de estas variantes de IoU deben seleccionarse y ajustarse de acuerdo con tareas y conjuntos de datos específicos. Al mismo tiempo, en las aplicaciones prácticas, se deben considerar cuestiones como la eficiencia computacional y la estabilidad del entrenamiento del modelo.

EIOU, SIOU y AlphaIOU son versiones mejoradas de IoU, que se utilizan para calcular el grado de superposición entre el cuadro de detección y el cuadro de verdad del suelo. La diferencia entre ellos se refleja principalmente en el método de cálculo y el objetivo de optimización.

EIOU (intersección eficiente sobre unión):

  • El método de cálculo de EIOU se basa en el tradicional IoU (intersección sobre
    unión), agregando un elemento de ángulo para considerar la relación de rotación entre el marco de detección y el marco real. El objetivo de optimización de EIOU es maximizar el grado de superposición entre los cuadros predichos y reales, teniendo en cuenta el impacto de las diferencias de ángulo.

SIOU (intersección suave sobre la unión):

  • El método de cálculo de SIOU se basa en el IoU tradicional, agregando un elemento de suavizado para aliviar la diferencia de forma entre el marco de detección y el marco real. El objetivo de optimización de SIOU es maximizar el grado de superposición entre los cuadros predichos y reales al mismo tiempo que se considera el impacto de las diferencias de forma.

AlphaIOU:

  • AlphaIOU es una variante de IoU basada en el ajuste de parámetros, que introduce un parámetro ajustable α \alphaα , que se utiliza para equilibrar el grado de superposición entre el cuadro de verdad fundamental y el cuadro predicho. Cuandoα = 1 \alpha=1a=Cuando 1 , AlphaIOU es equivalente al IoU tradicional; cuandoα < 1 \alpha<1a<Cuando 1 , AlphaIOU presta más atención a la superposición entre el cuadro predicho y el cuadro real; cuandoα > 1 \alpha>1a>Cuando es 1 , AlphaIOU presta más atención a la parte que no se superpone entre el cuadro predicho y el cuadro real. El objetivo de optimización de AlphaIOU es maximizar el grado de superposición entre el cuadro predicho y el cuadro de verdad del terreno, considerando la influencia del ajuste de parámetros.

Cabe señalar que los métodos de cálculo y la configuración de parámetros de EIOU, SIOU y AlphaIOU deben seleccionarse y ajustarse de acuerdo con tareas y conjuntos de datos específicos. En aplicaciones prácticas, también deben tenerse en cuenta cuestiones como la eficiencia computacional y la estabilidad del entrenamiento del modelo.

Serie de mejora de YOLO: agregue el módulo C2F en YOLOV8 a YOLOV5.

https://www.bilibili.com/video/BV1rx4y1g7xt/?spm_id_from=333.788&vd_source=85f7d0d97c49c694901f6886c09b832b

Agregar el módulo C2F en YOLOv8 a YOLOv5 puede mejorar aún más la precisión y la solidez de la detección de objetos. El módulo C2F es un módulo de fusión de características que puede fusionar múltiples mapas de características de diferentes escalas para mejorar la capacidad de representación y la precisión de detección de los mapas de características.
La fusión de múltiples mapas de características de diferentes escalas puede mejorar la capacidad de representación y la precisión de detección del mapa de características, principalmente por las siguientes razones:

  • Los mapas de características de múltiples escalas pueden capturar más información semántica. Los mapas de características de diferentes escalas capturan información semántica diferente en diferentes niveles, y su fusión puede utilizar de manera integral su información en diferentes niveles, mejorando así la capacidad de representación y la precisión de detección de los mapas de características.
  • Los mapas de características multiescala pueden mejorar la adaptabilidad de los detectores a objetos de diferentes escalas. Los objetos de diferentes escalas tienen diferentes representaciones en el mapa de características, y la fusión de múltiples mapas de características de diferentes escalas puede mejorar la adaptabilidad del detector a objetos de diferentes escalas, mejorando así la precisión de detección.
  • Los mapas de características multiescala pueden mejorar la utilización de la información contextual del objeto por parte de los detectores. La fusión de múltiples mapas de características de diferentes escalas puede proporcionar información de contexto de objeto más rica, mejorando así la capacidad del detector para comprender los objetos y la precisión de detección.

Específicamente, el módulo C2F incluye los siguientes pasos:

Los mapas de características de diferentes escalas se convolucionan y agrupan para obtener múltiples mapas de características de diferentes escalas.

Para los mapas de características en cada escala, se utilizan operaciones de convolución y sobremuestreo para volver a escalarlos a un tamaño uniforme.

Los mapas de características ajustados se empalman para obtener un mapa de características fusionado.

Algunas operaciones de convolución y el mecanismo de atención de características se realizan en el mapa de características fusionado, para mejorar aún más la capacidad de representación y la precisión de detección del mapa de características.

Los pasos de implementación específicos para agregar el módulo C2F en YOLOv5 son los siguientes:

En la columna vertebral de YOLOv5, se agregan operaciones adicionales de convolución y agrupación para obtener múltiples mapas de características de diferentes escalas.

Las operaciones de convolución y sobremuestreo se realizan en los mapas de características de cada escala por separado, y sus escalas se ajustan a un tamaño uniforme.

Los mapas de características ajustados se empalman para obtener un mapa de características fusionado.

Algunas operaciones de convolución y el mecanismo de atención de características se realizan en el mapa de características fusionado, para mejorar aún más la capacidad de representación y la precisión de detección del mapa de características.

En la implementación específica, el módulo C2F se puede agregar a la parte del cuello de YOLOv5 para fusionar mapas de características de diferentes escalas. Específicamente, el módulo C2F se puede agregar al módulo FPN (Feature Pyramid Network) de YOLOv5 para fusionar mapas de características de diferentes escalas. En la implementación del módulo C2F, se pueden utilizar algunos mecanismos de atención de características comunes, como SENet (Squeeze-and-Excitation Network), CBAM (Módulo de atención de bloque convolucional), etc., para mejorar aún más la capacidad de representación y detección. precisión del mapa de características.

Cabe señalar que en las aplicaciones prácticas, también deben considerarse cuestiones como la eficiencia computacional del módulo C2F y la estabilidad del entrenamiento del modelo. Para mejorar la eficiencia computacional, se pueden adoptar algunas técnicas de optimización, como reducir el número de canales de los mapas de características, reducir la profundidad de las capas convolucionales, etc. Para mejorar la estabilidad del entrenamiento del modelo, se pueden utilizar algunas técnicas de regularización, como Dropout, Batch Normalization, etc., para reducir el riesgo de sobreajuste.

YOLOV5 Mejoramiento inteligente IoU

https://www.bilibili.com/video/BV1tG4y1N7Gk/?spm_id_from=333.788&vd_source=85f7d0d97c49c694901f6886c09b832b
Wise IoU es un método de cálculo de IoU mejorado que puede mejorar la precisión del detector en las tareas de detección de objetivos. El método de cálculo de IoU tradicional solo considera la superposición entre el cuadro predicho y el cuadro real, mientras que Wise IoU considera la relación de posición relativa entre el cuadro predicho y el cuadro real, para evaluar con mayor precisión el grado de superposición entre los dos cuadros.

Específicamente, el método de cálculo de Wise IoU se puede dividir en los siguientes pasos:

  • Calcule la intersección y la unión entre las cajas de verdad predicha y fundamental. Igual que el cálculo tradicional de IoU.
  • Calcule el desplazamiento del punto central del cuadro previsto en relación con el punto central del cuadro real y la diferencia entre la relación de aspecto del cuadro previsto y el cuadro real.
  • Utilizando la diferencia entre el desplazamiento y la relación de aspecto como dos factores de ponderación, se pondera el área de la intersección y la unión.
  • Wise IoU se calcula utilizando el área ponderada.

La implementación específica de agregar Wise IoU en YOLOv5 es la siguiente:

  • En la función de evaluación del detector, el método de cálculo IoU tradicional se reemplaza por el método de cálculo Wise IoU.
  • Durante el proceso de entrenamiento, Wise IoU se utiliza como parte de la función de pérdida, lo que introduce la consideración de la información de posición y forma para mejorar la precisión del detector.

Cabe señalar que la implementación específica del método de cálculo Wise IoU debe seleccionarse y ajustarse de acuerdo con tareas y conjuntos de datos específicos. Al mismo tiempo, en aplicaciones prácticas, también es necesario prestar atención a la eficiencia de cálculo del método de cálculo Wise IoU y la estabilidad del entrenamiento del modelo.

En resumen, al introducir el método de cálculo Wise IoU, la precisión y la robustez del detector se pueden mejorar aún más en YOLOv5.

Mejora de YOLOV5: agregando Deformable Conv V2

https://www.bilibili.com/video/BV1rT411Q76q/?spm_id_from=333.788&vd_source=85f7d0d97c49c694901f6886c09b832b

Deformable Conv V2 es una operación de convolución mejorada que mejora la precisión del detector en tareas de detección de objetos. La operación de convolución tradicional solo considera la posición de muestreo fija, pero Deformable Conv V2 considera que la posición de muestreo de cada posición en el mapa de características se puede ajustar dinámicamente de acuerdo con la transformación espacial en el mapa de características, para capturar la forma de el objetivo con mayor precisión Información de textura.

Específicamente, Deformable Conv V2 se puede dividir en los siguientes pasos:

  • La transformación espacial se realiza en el mapa de características de entrada para obtener el desplazamiento de cada posición.
  • La posición de muestreo de cada posición se ajusta de acuerdo con el desplazamiento, lo que captura con mayor precisión la información de forma y textura del objetivo.
  • La operación de convolución se realiza en las características muestreadas.
  • Los resultados de la convolución se ponderan y fusionan para obtener la representación final de la característica.

La implementación específica de agregar Deformable Conv V2 a YOLOv5 es la siguiente:

  • En la columna vertebral de YOLOv5, la operación de convolución tradicional se reemplaza por la operación Deformable Conv V2.
  • En la parte del cuello de YOLOv5, la operación de convolución tradicional se reemplaza por la operación Deformable Conv V2.
  • En la parte principal de YOLOv5, la operación de convolución tradicional se reemplaza por la operación Deformable Conv V2.

Cabe señalar que, en aplicaciones prácticas, también deben tenerse en cuenta cuestiones como la eficiencia computacional de las operaciones de Deformable Conv V2 y la estabilidad del entrenamiento del modelo. Para mejorar la eficiencia computacional, se pueden adoptar algunas técnicas de optimización, como reducir el número de canales de los mapas de características, reducir la profundidad de las capas convolucionales, etc. Para mejorar la estabilidad del entrenamiento del modelo, se pueden utilizar algunas técnicas de regularización, como Dropout, Batch Normalization, etc., para reducir el riesgo de sobreajuste.
inserte la descripción de la imagen aquíinserte la descripción de la imagen aquí

Mejora de YOLOV5 - CONTEXT_AUGMENTATION_MODULE

https://www.bilibili.com/video/BV17b411d7ef/?spm_id_from=333.788&vd_source=85f7d0d97c49c694901f6886c09b832b

CONTEXT_AUGMENTATION_MODULE es un módulo mejorado que mejora la precisión del detector en las tareas de detección de objetos. Su idea principal es utilizar la información contextual alrededor del objetivo para mejorar la representación de características del objetivo, mejorando así la capacidad del detector para reconocer el objetivo.

Específicamente, CONTEXT_AUGMENTATION_MODULE se puede dividir en los siguientes pasos:

En la tarea de detección de objetos, para cada objeto, el área de contexto circundante se extrae primero utilizando la información del cuadro delimitador del objeto.

Para cada región de contexto, su representación de características se extrae mediante algunas técnicas avanzadas de extracción de características, como las redes neuronales convolucionales.

La representación de características del objetivo y la representación de características del área de contexto se fusionan para obtener una representación de características mejorada.

En la tarea de detección de objetivos, la representación de características mejorada se utiliza para el reconocimiento y la localización de objetivos.

La implementación específica de agregar CONTEXT_AUGMENTATION_MODULE en YOLOv5 es agregar un módulo de contexto sobre el cabezal de detección de YOLOv5, que incluye múltiples capas convolucionales de diferentes escalas, utilizadas para extraer la información de contexto alrededor del objetivo y luego combinarlo con el objetivo Las características son se fusiona para obtener la representación de características mejorada y, finalmente, la representación de características mejorada se utiliza para el reconocimiento y posicionamiento de objetivos.

Los experimentos muestran que agregar CONTEXT_AUGMENTATION_MODULE puede mejorar significativamente el rendimiento de detección de YOLOv5. En el conjunto de datos COCO, el AP de detección se puede aumentar en más de 1,5 puntos porcentuales, lo que demuestra la eficacia del método.
inserte la descripción de la imagen aquí

Mejora de YOLOV5: agregue un cabezal de entrenamiento auxiliar

https://www.bilibili.com/video/BV1Fo4y1v7bi/?spm_id_from=333.788&vd_source=85f7d0d97c49c694901f6886c09b832b

En YOLOv5, agregar un cabezal de entrenamiento auxiliar es una técnica mejorada que puede ayudar a mejorar la precisión del detector. El cabezal de entrenamiento auxiliar se refiere a la adición de algunos cabezales de detección adicionales además del cabezal de detección principal, que se utilizan para predecir diferentes capas de características al mismo tiempo, lo que ayuda al detector a aprender mejor la representación de características del objetivo.

Específicamente, la implementación específica de agregar un cabezal de entrenamiento auxiliar es agregar algunos cabezales de detección adicionales además del cabezal de detección principal de YOLOv 5. Estos cabezales de detección adicionales generalmente tienen una estructura similar al cabezal de detección principal, pero en diferentes características. predecir. La predicción simultánea de diferentes capas de características a través de múltiples cabezales de detección puede ayudar al detector a aprender mejor la representación de características de múltiples escalas del objetivo, mejorando así la precisión del detector.

Durante el proceso de entrenamiento, los resultados de predicción del cabezal de detección principal y el cabezal de entrenamiento auxiliar se utilizan para el cálculo de pérdidas y la retropropagación, de modo que todos los cabezales de detección puedan entrenarse de manera efectiva. En el proceso de prueba, los resultados de predicción de múltiples cabezales de detección se utilizan para sintetizar, a fin de obtener el resultado de detección final.

Los experimentos muestran que agregar un cabezal de entrenamiento auxiliar puede mejorar significativamente el rendimiento de detección de YOLOv5. En el conjunto de datos COCO, el AP de detección se puede aumentar en más de 1,5 puntos porcentuales, lo que demuestra la eficacia del método.

La función principal del cabezal de entrenamiento auxiliar es aumentar el campo receptivo del detector para que pueda detectar mejor objetos de diferentes escalas. En las tareas de detección de objetos, los objetos de diferentes escalas suelen tener diferentes representaciones de características, por lo que al agregar cabezales de entrenamiento auxiliares en diferentes capas de características, puede ayudar al detector a aprender mejor estas representaciones de características, mejorando así la precisión del detector.

Además, agregar un cabezal de entrenamiento auxiliar también puede ayudar a aliviar el problema de la desaparición del gradiente, porque en las redes profundas, el entrenamiento de las últimas capas puede verse muy limitado debido a que el gradiente se reduce durante la retropropagación. Al agregar cabezales de entrenamiento auxiliares en diferentes capas de características, el gradiente puede fluir mejor a través de la red, lo que alivia el problema de la desaparición del gradiente y mejora el efecto de entrenamiento del modelo.

Cabe señalar que agregar un cabezal de entrenamiento auxiliar puede aumentar la complejidad y el cálculo del modelo y requerir más tiempo de entrenamiento. Por lo tanto, en las aplicaciones prácticas, es necesario elegir si usar esta tecnología de acuerdo con tareas específicas y recursos de hardware.

En conclusión, agregar un cabezal de entrenamiento auxiliar es una técnica efectiva que puede ayudar a mejorar la precisión y la robustez de los detectores de objetos, especialmente para tareas de detección de objetos de múltiples escalas.

Mejora de YOLOV5: algunos trucos que quizás no conozcas

https://www.bilibili.com/video/BV1Cy4y1f72u/?spm_id_from=333.788&vd_source=85f7d0d97c49c694901f6886c09b832b

  1. ¿Cómo usar el modelo yolov5-p6 o yolov5-p7?

YOLOv5-p6 y YOLOv5-p7 son dos variantes de YOLOv5. En comparación con YOLOv5, tienen una estructura de red más profunda y una resolución más alta, lo que puede mejorar la precisión y el rendimiento del detector. Estos son los pasos para usar el modelo YOLOv5-p6 o YOLOv5-p7:

Descarga el código y los pesos preentrenados para YOLOv5. Puede descargar el código y los pesos del repositorio de GitHub de YOLOv5 o
instalar YOLOv5 con el comando pip install yolov5.

Preparar el conjunto de datos. YOLOv5 es compatible con COCO, VOC, YOLO y otros conjuntos de datos de detección de objetivos. Es necesario convertir el conjunto de datos al formato compatible con YOLOv5, es decir, formato txt. Cada archivo txt corresponde a una imagen, y cada línea del archivo contiene información sobre un objetivo, incluida la categoría del objetivo, las coordenadas del centro del objetivo, el ancho y la altura del objetivo, etc.

Haz entrenamiento de modelos. Use el script train.py de YOLOv5 para el entrenamiento del modelo, puede optar por usar el modelo YOLOv5-p6 o YOLOv5-p7 configurando el parámetro –cfg, por ejemplo:

python train.py --img 640 --batch 16 --epochs 50 --data coco.yaml
–cfg yolov5-p6.yaml Entre ellos, el parámetro –cfg especifica el archivo de configuración del modelo utilizado, puede elegir yolov5-p6.yaml o yolov5-p7.yaml.

Hacer pruebas de modelo. Use la secuencia de comandos detect.py de YOLOv5 para la prueba del modelo. También puede optar por usar el modelo YOLOv5-p6 o YOLOv5-p7 configurando el parámetro –cfg. Por ejemplo: donde el parámetro –weights especifica el archivo de peso del modelo a usar
python detect.py --weights yolov5-p6.pt --img 640 --conf 0.5 --source test.jpg --cfg yolov5-p6.yaml
, puede elegir yolov5-p6.pt o yolov5-p7.pt, el parámetro --source especifica la ruta de la imagen de prueba y el parámetro --cfg especifica el archivo de configuración del modelo utilizado.

Cabe señalar que YOLOv5-p6 y YOLOv5-p7 requieren mayores recursos informáticos y un mayor tiempo de capacitación que YOLOv5, por lo que en aplicaciones prácticas, es necesario elegir qué modelo usar de acuerdo con las tareas específicas y los recursos de hardware.

  1. ¿Cómo aumentar la capa de detección superficial en yolov5?

Agregar capas de detección poco profundas en YOLOv5 puede ayudar a mejorar el rendimiento de detección del detector de objetos pequeños. Los siguientes son los pasos para agregar una capa de detección superficial en YOLOv5:
Descargue el código y los pesos de preentrenamiento de YOLOv5. Puede descargar el código y los pesos del repositorio de GitHub de YOLOv5 o instalar YOLOv5 con el comando pip install yolov5.
Modifique el archivo de configuración de YOLOv5. El archivo de configuración de YOLOv5 se encuentra en models/yolov5x.yaml (si usa otras versiones, el nombre del archivo de configuración correspondiente puede ser diferente), debe agregar una capa de detección superficial a este archivo. Específicamente, la última capa convolucional en la red troncal original se puede reemplazar con dos capas convolucionales, por ejemplo:

Última capa convolucional

  • nombre: características.14.conv
    de: -6 # usar -6 capa como
    módulos de entrada (predeterminado = 17):
    • Ruta _CSPR
    • nn.Conv2d:
      in_channels: 320
      out_channels: 640
      kernel_size: 1
      zancada: 1
      relleno: 0
    • nn.BatchNorm2d: # no se requiere sesgo con BN
      num_features: 640
      impulso: 0.03
      eps: 1E-4
    • nn.LeakyReLU:
      en el lugar: verdadero
    • nn.Conv2d:
      canales de entrada: 640
      canales de salida: 1280
      kernel_size: 3
      zancadas: 1
      relleno: 1
    • nn.BatchNorm2d: # no se requiere sesgo con BN
      num_features: 1280
      impulso: 0.03
      eps: 1E-4
    • nn.LeakyReLU:
      en el lugar: verdadero

Aquí, reemplazamos las características de la última capa convolucional.14.conv en la red troncal original con dos capas convolucionales, donde el número de canal de salida de la primera capa convolucional es 640, y la segunda capa convolucional El número de canales de salida es 1280.

Cabe señalar que agregar una capa de detección superficial puede aumentar la cantidad de cálculo y la complejidad del modelo, por lo que es necesario elegir si usar esta tecnología de acuerdo con tareas específicas y recursos de hardware.

Realizar entrenamiento y pruebas de modelos. Utilice la secuencia de comandos train.py de YOLOv5 para el entrenamiento de modelos y la secuencia de comandos detect.py para las pruebas de modelos. Al entrenar y probar, debe especificar el archivo de configuración modificado, por ejemplo:
python train.py --img 640 --batch 16 --epochs 50 --data coco.yaml
–cfg yolov5x-custom.yaml python detect.py --weights yolov5x-custom.pt --img 640 --conf 0.5 --source test.jpg --cfg yolov5x-custom.yaml Entre ellos, el parámetro --cfg especifica el archivo de configuración del modelo utilizado y el yolov5x modificado- Se pueden seleccionar archivos .yaml personalizados.

En conclusión, agregar una capa de detección poco profunda en YOLOv5 puede ayudar a mejorar el rendimiento del detector, pero debe sopesarse si usar esta técnica de acuerdo con la tarea y los recursos de hardware.

  1. ¿Cómo eliminar la capa de detección profunda de yolov5?

Eliminar la capa de detección profunda en YOLOv5 puede reducir la cantidad de cálculos y parámetros del modelo, y también puede mejorar la velocidad de inferencia del modelo. Los siguientes son los pasos para eliminar la capa de detección profunda en YOLOv5:

Descarga el código y los pesos preentrenados para YOLOv5. Puede descargar el código y los pesos del repositorio de GitHub de YOLOv5 o
instalar YOLOv5 con el comando pip install yolov5.

Modifique el archivo de configuración de YOLOv5. El archivo de configuración de YOLOv5 se encuentra en models/yolov5x.yaml (si usa otras versiones, el nombre del archivo de configuración correspondiente puede ser diferente), debe eliminar la capa de detección profunda en este archivo. Específicamente, la última capa convolucional y la última capa de detección en la red principal original se pueden eliminar, por ejemplo:

Detectar

  • nombre: detectar
    desde: [-2, -1]
    nc: 80
    anclas: [[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90 , 156, 198, 373, 326]]
    pasos: [8, 16, 32]

    Capa de regresión y clasificación

    regresión: nn.Conv2d(640, 18, kernel_size=1, zancada=1, relleno=0)
    clasificación: nn.Conv2d(640, 90, kernel_size=1, zancada=1, relleno=0)

Cambie el número de canales de salida de las últimas características de la capa convolucional.14.conv a 640, cambie el número de canales de entrada de la última capa de detección detectada a 640 y cambie el número de canales de entrada de las capas de regresión y clasificación a 640.

Cabe señalar que la eliminación de la capa de detección profunda puede reducir el rendimiento de detección del modelo, especialmente para la detección de objetivos pequeños, por lo que es necesario elegir si usar esta tecnología de acuerdo con tareas específicas y recursos de hardware.

Realizar entrenamiento y pruebas de modelos. Utilice la secuencia de comandos train.py de YOLOv5 para el entrenamiento de modelos y la secuencia de comandos detect.py para las pruebas de modelos. Al entrenar y probar, debe especificar el archivo de configuración modificado, por ejemplo:
python train.py --img 640 --batch 16 --epochs 50 --data coco.yaml
–cfg yolov5x-custom.yaml python detect.py --weights yolov5x-custom.pt --img 640 --conf 0.5 --source test.jpg --cfg yolov5x-custom.yaml Entre ellos, el parámetro --cfg especifica el archivo de configuración del modelo utilizado y el yolov5x modificado- Se pueden seleccionar archivos .yaml personalizados.

En resumen, eliminar la capa de detección profunda en YOLOv5 puede reducir la cantidad de cálculo y los parámetros del modelo, pero es necesario sopesar si usar esta tecnología según la tarea y los recursos de hardware.

inserte la descripción de la imagen aquí

  1. ¿Cómo reemplazar la función de activación de yolov5 con un clic?

El reemplazo con un solo clic de la función de activación de YOLOv5 se puede lograr modificando las partes relevantes del código YOLOv5. Los siguientes son los pasos para reemplazar la función de activación de YOLOv5 con un solo clic:

Descarga el código y los pesos preentrenados para YOLOv5. Puede descargar el código y los pesos del repositorio de GitHub de YOLOv5 o instalar YOLOv5 con el comando pip install yolov5.

Abra el archivo models/yolo.py de YOLOv5. Este archivo define la estructura del modelo YOLOv5 y la función de activación debe reemplazarse en este archivo. En concreto, la función de activación original (SiLU por defecto) se puede sustituir por otras funciones de activación, como ReLU:

Reemplace SiLU en el archivo yolo.py con ReLU

act = nn.ReLU(inplace=True)
aplica la nueva función de activación al modelo YOLOv5. Se puede agregar un parámetro al constructor del modelo YOLOv5 para especificar la función de activación. Por ejemplo:

class YOLOv5(nn.Module):
    def __init__(self, cfg='yolov5s.yaml', ch=3, nc=None):
        super().__init__()

        self.model, self.save = parse_model(deepcopy(load_yaml(cfg)), ch=[ch])  # model, savelist
        self.nc = self.model[-1].nc = nc  # number of classes

        # 将激活函数作为参数传递到构造函数中,用于替换原来的SiLU激活函数
        self.act = nn.ReLU(inplace=True)
        self.model = nn.Sequential(*self.model[0])

        # Initialize
        self.initialize()

Realizar entrenamiento y pruebas de modelos. Utilice la secuencia de comandos train.py de YOLOv5 para el entrenamiento de modelos y la secuencia de comandos detect.py para las pruebas de modelos. Al entrenar y probar, debe especificar el código del modelo modificado, por ejemplo:

python train.py --img 640 --batch 16 --epochs 50 --data coco.yaml --cfg yolov5s-custom.py
python detect.py --weights yolov5s-custom.pt --img 640 --conf 0.5 --source test.jpg --cfg yolov5s-custom.py

Entre ellos, el parámetro –cfg especifica el archivo de código del modelo utilizado y se puede seleccionar el archivo yolov5s-custom.py modificado.

En resumen, el reemplazo con un clic de la función de activación de YOLOv5 requiere modificar el código y volver a entrenar el modelo, por lo que se requieren ciertos conocimientos de programación y aprendizaje profundo.

  1. ¿Cómo usar fpn y bifpn en yolov5?

El uso de FPN o BiFPN en YOLOv5 requiere los siguientes pasos:

Descarga el código y los pesos preentrenados para YOLOv5. Puede descargar el código y los pesos del repositorio de GitHub de YOLOv5 o instalar YOLOv5 con el comando pip install yolov5.

Modifique el archivo models/yolo.py de YOLOv5. Este archivo define la estructura del modelo YOLOv5, y la estructura FPN o BiFPN debe agregarse a este archivo. Específicamente, la capa convolucional original puede ser reemplazada por la capa convolucional en FPN o BiFPN. Por ejemplo, para agregar la estructura BiFPN al modelo YOLOv5s, el archivo yolo.py se puede modificar de la siguiente manera:

# 在 yolo.py 文件中添加以下代码,将原来的卷积层替换为BiFPN中的卷积层
from models.common import Conv, BottleneckCSP, SPP, DWConv

class BiFPN(nn.Module):
    def __init__(self, in_channels, out_channels):
        super(BiFPN, self).__init__()

        self.conv6_up = Conv(in_channels[0], out_channels, 1, 1)
        self.conv5_up = Conv(in_channels[1], out_channels, 1, 1)
        self.conv4_up = Conv(in_channels[2], out_channels, 1, 1)
        self.conv3_up = Conv(in_channels[3], out_channels, 1, 1)

        self.conv3_down = Conv(in_channels[3], out_channels, 1, 1)
        self.conv4_down = Conv(in_channels[2], out_channels, 1, 1)
        self.conv5_down = Conv(in_channels[1], out_channels, 1, 1)
        self.conv6_down = Conv(in_channels[0], out_channels, 1, 1)

        self.conv7 = Conv(out_channels, out_channels, 3, 2)
        self.conv8 = Conv(out_channels, out_channels, 3, 2)
        self.conv9 = Conv(out_channels, out_channels, 3, 2)
        self.conv10 = Conv(out_channels, out_channels, 3, 2)

        self.act = nn.SiLU(inplace=True)

    def forward(self, inputs):
        c3, c4, c5, c6 = inputs

        # Top-down
        p6 = self.conv6_up(c6)
        p5 = self.conv5_up(c5) + F.interpolate(p6, scale_factor=2, mode='nearest')
        p4 = self.conv4_up(c4) + F.interpolate(p5, scale_factor=2, mode='nearest')
        p3 = self.conv3_up(c3) + F.interpolate(p4, scale_factor=2, mode='nearest')

        # Bottom-up
        p4 = self.conv4_down(p4) + self.conv4_up(F.interpolate(p3, scale_factor=0.5, mode='nearest'))
        p5 = self.conv5_down(p5) + self.conv5_up(F.interpolate(p4, scale_factor=0.5, mode='nearest'))
        p6 = self.conv6_down(p6) + self.conv6_up(F.interpolate(p5, scale_factor=0.5, mode='nearest'))
        p7 = self.conv7(p6)
        p8 = self.conv8(p7)
        p9 = self.conv9(p8)
        p10 = self.conv10(p9)

        # Output
        return [p3, p4, p5, p6, p7, p8, p9, p10]

class YOLOv5(nn.Module):
    def __init__(self, cfg='yolov5s.yaml', ch=3, nc=None, fpn=False, bifpn=True):
        super().__init__()

        self.model, self.save = parse_model(deepcopy(load_yaml(cfg)), ch=[ch])  # model, savelist
        self.nc = self.model[-1].nc = nc  # number of classes

        # Add FPN or BiFPN structure
        if fpn:
            self.model[-1].conv = nn.Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))
            self.model[-1].m[-1].conv = nn.Conv2d(512, 1024, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))
            self.model[-1].m[-1].m[-1].conv = nn.Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), padding=(0, 0), bias=False)
self.model[-1].m[-1].m[-1].act = nn.SiLU(inplace=True)
self.model[-1].m[-1].m[-1].bn = nn.BatchNorm2d(512, eps=0.001, momentum=0.03)

    if bifpn:
        # Replace the last convolution layer with BiFPN
        self.model[-1].conv = BiFPN([256, 512, 1024, 2048], 256)
        self.model[-1].m[-1].conv = nn.Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), padding=(0, 0), bias=False)
        self.model[-1].m[-1].act = nn.SiLU(inplace=True)
        self.model[-1].m[-1].bn = nn.BatchNorm2d(1024, eps=0.001, momentum=0.03)

    self.model = nn.Sequential(*self.model[0])
    
    # Initialize
    self.initialize()

En el código anterior, definimos una clase BiFPN, que contiene la implementación de la estructura BiFPN, y luego reemplazamos la última capa convolucional en el modelo YOLOv5s con BiFPN. Tenga en cuenta que las implementaciones de código de FPN y BiFPN pueden ser ligeramente diferentes y deben modificarse según la situación específica.

  1. Realizar entrenamiento y pruebas de modelos. Utilice la secuencia de comandos train.py de YOLOv5 para el entrenamiento de modelos y la secuencia de comandos detect.py para las pruebas de modelos. Al entrenar y probar, debe especificar el archivo de código del modelo utilizado, por ejemplo:
python train.py --img 640 --batch 16 --epochs 50 --data coco.yaml --cfg yolov5s-custom.py --bifpn
python detect.py --weights yolov5s-custom.pt --img 640 --conf 0.5 --source test.jpg --cfg yolov5s-custom.py --bifpn

Entre ellos, el parámetro –cfg especifica el archivo de código del modelo utilizado y se puede seleccionar el archivo yolov5s-custom.py modificado. El parámetro –bifpn se utiliza para indicar el uso de la estructura BiFPN.Si desea utilizar la estructura FPN, puede utilizar el parámetro –fpn.
Realizar la optimización del modelo. Para optimizar aún más el rendimiento del modelo, se pueden experimentar con diferentes hiperparámetros y estrategias de entrenamiento. Por ejemplo, puede ajustar la tasa de aprendizaje, agregar aumento de datos, usar diferentes funciones de pérdida, etc. Además, también puede intentar usar diferentes pesos preentrenados o ajustar el modelo preentrenado.

Hacer evaluación del modelo. Con el script test.py de YOLOv5 para la evaluación del modelo, puede calcular la precisión, la recuperación y otros indicadores del modelo en el conjunto de datos de prueba. Por ejemplo:

python test.py --weights yolov5s-custom.pt --data coco.yaml --cfg yolov5s-custom.py --bifpn

Entre ellos, el parámetro –weights especifica el archivo de peso del modelo utilizado, el parámetro –data especifica el archivo de configuración del conjunto de datos utilizado, el parámetro –cfg especifica el archivo de código del modelo utilizado y el parámetro –bifpn indica el uso de la estructura BiFPN.

Los anteriores son los pasos generales para usar FPN o BiFPN en YOLOv5. El proceso de implementación específico puede variar debido a factores como conjuntos de datos e hiperparámetros. Se requieren ajustes y modificaciones caso por caso.

  1. ¿Cómo usar kmean para agrupar el cuadro de anclaje correspondiente a su propio conjunto de datos?

En la detección de objetivos, Anchor Box es una forma de seleccionar un área de interés en una imagen. El número y el tamaño del Cuadro de anclaje tienen un gran impacto en el efecto de detección, por lo que el Cuadro de anclaje debe seleccionarse de acuerdo con su propio conjunto de datos. Entre ellos, un método popular es utilizar el algoritmo de agrupación en clústeres K-Means para analizar el conjunto de datos y determinar el cuadro de anclaje más adecuado para el conjunto de datos.

Los siguientes son los pasos para generar Anchor Box utilizando el algoritmo K-Means:

Preparar el conjunto de datos. Primero, debe preparar el conjunto de datos de entrenamiento para la detección de objetivos, incluidas imágenes, archivos de anotaciones, etc.

Extraiga la relación de ancho y alto del cuadro de etiqueta. Extraiga las relaciones de aspecto de todos los cuadros de anotaciones del archivo de anotaciones y guárdelas en una lista. Puede usar la biblioteca PIL o la biblioteca OpenCV en Python para leer imágenes y archivos de anotaciones, y usar la biblioteca Numpy para el procesamiento de datos.

Ejecute el algoritmo K-Means. Ejecute el algoritmo K-Means usando la clase KMeans de la biblioteca scikit-learn. Específicamente, es necesario especificar el número k de clústeres y el número de iteraciones n_init, y luego las proporciones de ancho y alto de los cuadros etiquetados se utilizan como datos de entrada para el agrupamiento.

from sklearn.cluster import KMeans

# 读取所有标注框的宽高比例
ratios = []
for annotation in annotations:
    bbox = annotation['bbox']
    ratio = bbox[2] / bbox[3]
    ratios.append(ratio)

# 运行K-Means算法
kmeans = KMeans(n_clusters=k, n_init=n_init).fit(np.array(ratios).reshape(-1, 1))
获取聚类中心。K-Means算法将标注框的宽高比例聚类成k个簇,每个簇的中心即为一个Anchor Box的宽高比例。可以使用KMeans类的cluster_centers_属性获取所有聚类中心。然后,将聚类中心按照宽高比例从小到大排序,得到最终的Anchor Box。
# 获取聚类中心
centers = kmeans.cluster_centers_.reshape(-1)

# 按照宽高比例从小到大排序
order = np.argsort(centers)

# 获取最终的Anchor Box
anchors = []
for i in order:
    anchors.append([0, 0, int(round(centers[i] * base_size)), base_size])

anchors = np.array(anchors)

Entre ellos, base_size es un tamaño de referencia, que se puede ajustar según su propio conjunto de datos.

Guarde Anchor Box en un archivo. Finalmente, guarde el Anchor Box generado en un archivo para usarlo durante el entrenamiento. Anchor Box se puede guardar como una matriz Numpy, un archivo JSON u otros formatos.

# 保存Anchor Box到文件
np.savetxt('anchors.txt', anchors, fmt='%d')

Tenga en cuenta que al usar el algoritmo K-Means para generar el Anchor Box, es necesario seleccionar el número apropiado de clústeres k y el número de iteraciones n_init. En términos generales, k se puede establecer en 5-10 y n_init se puede establecer en 10-20. Al mismo tiempo, también se pueden utilizar otros algoritmos de agrupación, como DBSCAN.

Cuando se utiliza el cuadro de anclaje generado para el entrenamiento de detección de objetivos, el cuadro de anclaje debe ingresarse como un hiperparámetro del modelo. Los siguientes son los pasos generales para el entrenamiento de detección de objetivos utilizando el cuadro de anclaje generado:

Preparar el conjunto de datos. Primero, debe preparar el conjunto de datos de entrenamiento para la detección de objetivos, incluidas imágenes, archivos de anotaciones, etc.

Cargue la caja de anclaje. Use el archivo Anchor Box generado anteriormente para cargar el Anchor Box en la memoria para usarlo durante el entrenamiento.

# 加载Anchor Box
anchors = np.loadtxt('anchors.txt')

Configurar el modelo. Configure el modelo utilizando un marco de detección de objetivos (como YOLOv5, Faster R-CNN, etc.) e ingrese el cuadro de anclaje generado como un hiperparámetro. Específicamente, la cantidad y el tamaño de los cuadros de anclaje deben ingresarse como hiperparámetros del modelo. En YOLOv5, puede modificar el archivo de configuración del modelo (como yolov5s.yaml) y establecer el parámetro de anclaje en el cuadro de anclaje generado.

# 修改模型配置文件
anchors_str = ','.join([str(int(x)) for x in anchors.reshape(-1)])
with open('yolov5s.yaml', 'r') as f:
    content = f.read()
content = content.replace('anchor: [0,0,0,0,0,0,0,0,0,0]', f'anchor: [{
      
      anchors_str}]')
with open('yolov5s-custom.yaml', 'w') as f:
    f.write(content)

Entrena al modelo. Utilice el modelo y el conjunto de datos configurados para el entrenamiento. Durante el entrenamiento, Anchor Box debe ingresarse como un hiperparámetro, y otros hiperparámetros, como la tasa de aprendizaje, el tamaño del lote, etc., deben ajustarse según sea necesario.

# 训练模型
python train.py --weights yolov5s.pt --cfg yolov5s-custom.yaml --data coco.yaml --batch-size 16 --epochs 50 --hyp hyp.scratch.yaml

Evalúa el modelo. Utilice el conjunto de datos de prueba para evaluar el modelo entrenado y calcule los indicadores de rendimiento del modelo, como la precisión, la tasa de recuperación, etc.

# 评估模型
python test.py --weights yolov5s-custom.pt --data coco.yaml --cfg yolov5s-custom.yaml

Debe tenerse en cuenta que cuando se utiliza el Anchor Box generado para el entrenamiento, es posible que se requieran algunos ajustes para adaptarlo a su propio conjunto de datos. Por ejemplo, la cantidad y el tamaño de los cuadros de anclaje se pueden ajustar según el tamaño y la complejidad del conjunto de datos. Además, también se pueden usar otros marcos y algoritmos de detección de objetivos para satisfacer diferentes necesidades.

Mejora de YOLOV5: agregue SAConv.

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

SAConv es una convolución adaptativa que puede ajustar automáticamente el tamaño y la forma del kernel de convolución de acuerdo con la estructura espacial del mapa de características de entrada, logrando así una mejor extracción de características.
En YOLOv5, el rendimiento del modelo se puede mejorar agregando capas SAConv.

Los siguientes son los pasos generales para agregar una capa SAConv en YOLOv5:

Defina la capa SAConv. Primero, es necesario definir la estructura y los parámetros de la capa SAConv. En YOLOv5, la capa SAConv se puede implementar mediante PyTorch. Específicamente, la capa SAConv se puede definir como un módulo PyTorch, que incluye una capa de convolución adaptativa, una capa de normalización por lotes y una capa de función de activación.

import torch
import torch.nn as nn
import torch.nn.functional as F

class SAConv(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=1):
        super(SAConv, self).__init__()
        self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)
        self.bn = nn.BatchNorm2d(out_channels)
        self.act = nn.ReLU(inplace=True)
        self.sa = nn.Conv2d(out_channels, out_channels, kernel_size=1, stride=1, padding=0)

    def forward(self, x):
        x = self.conv(x)
        x = self.bn(x)
        x = self.act(x)
        sa = F.avg_pool2d(x, x.size()[2:])
        sa = self.sa(sa)
        x = x * sa
        return x

Entre ellos, in_channels y out_channels representan el número de canales de los mapas de características de entrada y salida, kernel_size representa el tamaño del kernel de convolución, stride representa el paso y padding representa el tamaño de relleno.

Reemplace la capa convolucional en YOLOv5. En YOLOv5, la función replace_module se puede usar para reemplazar la capa convolucional en el modelo. Específicamente, es posible atravesar todas las capas del modelo, encontrar capas convolucionales y reemplazarlas con capas SAConv.

from models.yolo import Model

model = Model()
for name, module in model.named_modules():
    if isinstance(module, nn.Conv2d):
        sa_conv = SAConv(module.in_channels, module.out_channels, kernel_size=module.kernel_size, stride=module.stride, padding=module.padding)
        setattr(model, name, sa_conv)

Entrena al modelo. Utilice el modelo YOLOv5 modificado para el entrenamiento de detección de objetos y ajuste otros hiperparámetros, como la tasa de aprendizaje, el tamaño del lote, etc., según sea necesario.

modelo de entrenamiento

python train.py --weights yolov5s.pt --cfg yolov5s-custom.yaml --data coco.yaml --batch-size 16 --epochs 50 --hyp hyp.scratch.yaml

Cabe señalar que agregar una capa SAConv puede aumentar la cantidad de cálculos y parámetros del modelo, lo que resulta en un mayor tiempo de entrenamiento y consumo de memoria. Por lo tanto, se requieren ciertos ajustes de hiperparámetros cuando se usa la capa SAConv para equilibrar el rendimiento del modelo y la eficiencia computacional.

Mejora de YOLOV5-Soft-NMS (admite múltiples variantes de IoU)

https://www.bilibili.com/video/BV1cM41147Ry/?spm_id_from=333.788&vd_source=85f7d0d97c49c694901f6886c09b832b
se agrega un conjunto de datos cuando se realiza una detección intensiva de objetivos

Soft-NMS es un algoritmo mejorado de supresión no máxima que puede mejorar el rendimiento del modelo YOLOv5 en tareas de detección de objetivos. A diferencia del algoritmo NMS tradicional, Soft-NMS no elimina directamente los cuadros de detección con grandes superposiciones, sino que retiene más cuadros de detección al reducir la confianza de los cuadros superpuestos, mejorando así la recuperación y la precisión de la detección.

Los siguientes son los pasos generales para agregar Soft-NMS a YOLOv5:

Defina la función Soft-NMS. Primero, es necesario definir el método de cálculo de la función Soft-NMS. En YOLOv5, la función Soft-NMS se puede implementar usando Python. Específicamente, Soft-NMS se puede definir como una función de Python que incluye cajas de detección de entrada, confianzas y umbrales, y genera confianzas reducidas y cajas de detección filtradas.

def soft_nms(dets, confs, thresh=0.3, sigma=0.5):
    """
    Soft-NMS算法
    :param dets: 检测框列表,格式为(x1, y1, x2, y2)
    :param confs: 置信度列表
    :param thresh: 重叠阈值
    :param sigma: 置信度下降因子
    :return: 筛选后的检测框和置信度
    """
    ...
    return keep, new_confs

Llame a la función Soft-NMS en YOLOv5. En el módulo de detección de YOLOv5, el algoritmo NMS tradicional se puede reemplazar llamando a la función Soft-NMS. Específicamente, en el módulo de detección, NMS se puede reemplazar por Soft-NMS, y la salida de Soft-NMS se puede usar como resultado de detección final.

# 使用Soft-NMS替代传统的NMS
keep, confs = soft_nms(dets, confs, nms_thresh, nms_sigma)
# 将Soft-NMS的输出作为最终的检测结果
output.extend([Detection(xyxy, confs[i], cls) for i, xyxy in enumerate(dets[keep])])

...
ajustar los parámetros de Soft-NMS. Al usar Soft-NMS, los parámetros como el umbral de superposición y el factor de reducción de confianza deben ajustarse de acuerdo con tareas y conjuntos de datos específicos. En general, estos parámetros se pueden ajustar según el rendimiento del conjunto de validación para optimizar el rendimiento del modelo de detección.
Soft-NMS es un algoritmo de supresión no máxima eficaz que puede mejorar la recuperación y la precisión de la detección en la tarea de detección de objetivos YOLOv5. Al reemplazar el algoritmo NMS tradicional con Soft-NMS y ajustar los parámetros de Soft-NMS, el rendimiento de detección se puede mejorar aún más.

Mejora de YOLOV5: agregue CoordConv.

CoordConv es un método para agregar información de coordenadas en redes neuronales convolucionales, que puede mejorar el rendimiento del modelo YOLOv5 en tareas de detección de objetos. CoordConv agregará la información de posición de cada píxel del mapa de características de entrada a la red como información de canal adicional, lo que ayudará a la red a comprender mejor la posición y la escala del objeto.

Cómo agregar la información de posición de cada píxel a la red como información de canal adicional

Agregar la información de posición de cada píxel a la red como información de canal adicional se puede implementar utilizando la capa AddCoords. Específicamente, la capa AddCoords primero calcula la información de ubicación de cada píxel y la agrega al mapa de características de entrada y luego devuelve el mapa de características después de agregar la información de ubicación.

Aquí hay un ejemplo de implementación de una capa AddCoords simple:

importar torch.nn como nn

class AddCoords(nn.Module):
def init (self):
super(AddCoords, self). init ()
def adelante(self, x):
tamaño_lote, _, altura, ancho = x.tamaño()
xx_channel = antorcha.arange(ancho).repeat(batch_size, 1)
yy_channel = antorcha.arange(altura).repetir( tamaño_lote, 1).t()
xx_channel = xx_channel.float() / (ancho - 1)
yy_channel = yy_channel.float() / (alto - 1)
xx_channel = xx_channel * 2 - 1
yy_channel = yy_channel * 2 - 1
xx_channel = xx_channel.repeat(1, altura).view(batch_size, height, width)
yy_channel = yy_channel.repeat(1, width).view(batch_size, height, width)
ret = torch.cat([x, xx_channel.to(x.device), yy_channel.to(x.device)], dim=1)
return ret
En la capa AddCoords, primero obtenga el tamaño del mapa de características de entrada y luego use torch .arange genera la matriz de coordenadas x e y correspondiente, la normaliza al rango de [-1,1], y finalmente repite la matriz de coordenadas x e y al mismo tamaño que el mapa de características, y lo une con el mapa de características de entrada, para obtener el mapa de características después de agregar información de posición.

En el uso real, la capa AddCoords se puede agregar después de la capa de entrada de la red neuronal convolucional, de modo que la información de posición de cada píxel se puede agregar a la red como información de canal adicional para ayudar a la red a comprender mejor la posición y ubicación de los objetos. escala y otra información.

Los siguientes son los pasos generales para agregar CoordConv a YOLOv5:

Defina la capa CoordConv. Primero, debe definir el método de cálculo de la capa CoordConv. En YOLOv5, la capa CoordConv se puede implementar usando Python. Específicamente, la capa CoordConv se puede definir como una clase de Python que hereda de nn.Module y define la función de reenvío.

import torch.nn as nn
import torch.nn.functional as F

class CoordConv(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0):
        super(CoordConv, self).__init__()
        self.addcoords = AddCoords()
        in_channels += 2
        self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)

    def forward(self, x):
        x = self.addcoords(x)
        x = self.conv(x)
        return x

class AddCoords(nn.Module):
    def __init__(self):
        super(AddCoords, self).__init__()

    def forward(self, x):
        batch_size, _, height, width = x.size()
        xx_channel = torch.arange(width).repeat(batch_size, 1)
        yy_channel = torch.arange(height).repeat(batch_size, 1).t()
        xx_channel = xx_channel.float() / (width - 1)
        yy_channel = yy_channel.float() / (height - 1)
        xx_channel = xx_channel * 2 - 1
        yy_channel = yy_channel * 2 - 1
        xx_channel = xx_channel.repeat(1, height).view(batch_size, height, width)
        yy_channel = yy_channel.repeat(1, width).view(batch_size, height, width)
        ret = torch.cat([x, xx_channel.to(x.device), yy_channel.to(x.device)], dim=1)
        return ret

Entre ellos, la clase AddCoords se usa para calcular la información de posición de cada píxel, agregarlo al mapa de características de entrada y devolver el mapa de características agregado. La clase CoordConv se hereda de nn.Module y se usa para realizar operaciones de convolución en mapas de características después de agregar información de posición.

Llame a la capa CoordConv en YOLOv5. En la estructura de red de YOLOv5, la capa convolucional tradicional se puede reemplazar por la capa CoordConv, lo que agrega información de coordenadas al mapa de características. Específicamente, en la estructura de la red, Conv2d puede reemplazarse por CoordConv y agregarse a la posición correspondiente.

# 使用CoordConv替代Conv2d
x = CoordConv(in_channels, out_channels, kernel_size, stride, padding)(x)

...
ajustando los parámetros de CoordConv. Al usar CoordConv, los parámetros como el tamaño del kernel de convolución, el tamaño del paso y el relleno deben ajustarse de acuerdo con tareas y conjuntos de datos específicos. En general, estos parámetros se pueden ajustar según el rendimiento del conjunto de validación para optimizar el rendimiento del modelo de detección.
CoordConv es un método efectivo para agregar información de coordenadas en redes neuronales convolucionales, lo que puede mejorar el rendimiento del modelo YOLOv5 en tareas de detección de objetos. Al reemplazar la capa convolucional tradicional con una capa CoordConv y ajustar los parámetros de CoordConv, el rendimiento de detección se puede mejorar aún más.

Mejora de YOLOV5 - NWD para objetivos pequeños.

NWD significa Distancia ponderada normalizada, que es una función de pérdida para la medición de distancia en la detección de objetivos. En las tareas de detección de objetivos, a menudo es necesario calcular la distancia entre el marco predicho y el marco objetivo para medir el efecto de detección del modelo. La función de pérdida NWD pondera y suma la distancia entre el marco de predicción y el marco de destino para obtener un valor escalar como función de pérdida de detección de destino.

Específicamente, cuando la función de pérdida NWD calcula la distancia entre dos cajas, generalmente usa la distancia euclidiana u otros métodos de medición de distancia. El coeficiente de ponderación se ajusta según factores como el tamaño y la posición del marco del objetivo para mejorar la capacidad del modelo para detectar objetivos pequeños.

En modelos de detección de objetivos como YOLOv5, el uso de la función de pérdida NWD puede mejorar el efecto de detección del modelo, especialmente para la capacidad de detección de objetivos pequeños, y se pueden obtener mejores resultados.
NWD (distancia ponderada normalizada) para objetivos pequeños es un algoritmo de detección de objetivos mejorado que se puede utilizar en el modelo YOLOv5. En comparación con el algoritmo de detección de objetivos tradicional, el algoritmo NWD para objetivos pequeños puede lidiar mejor con la detección de objetivos pequeños y mejorar la precisión de la detección.

Los siguientes son los pasos generales para usar el algoritmo NWD para objetivos pequeños en YOLOv5:

Defina la función de pérdida NWD para objetos pequeños. La función de pérdida NWD para objetos pequeños es una función de pérdida basada en métricas de distancia en la detección de objetos. Primero, se debe calcular la distancia entre cada cuadro de predicción y el cuadro objetivo, y luego se calcula la suma ponderada de las distancias y se usa como el valor de la función de pérdida. Específicamente, el cálculo de distancia puede usar la distancia euclidiana u otros métodos de medición de distancia, y el coeficiente de ponderación se puede ajustar de acuerdo con factores como el tamaño y la posición del marco objetivo. Aquí hay un ejemplo simple de implementación de la función de pérdida NWD para objetivos pequeños:

def nwd_loss(pred, targets, anchors):
    # 计算距离
    distance = torch.sqrt((pred[..., 0] - targets[..., 0]) ** 2 + (pred[..., 1] - targets[..., 1]) ** 2)
    # 计算加权系数
    weight = 2 - targets[..., 2] * targets[..., 3]
    # 计算损失函数
    loss = torch.sum(weight * distance)
    return loss
其中,pred是模型的预测结果,targets是真实标签,anchors是先验框信息。

在YOLOv5中调用针对小目标的NWD损失函数。在YOLOv5的网络训练过程中,可以使用针对小目标的NWD损失函数作为模型的优化目标。具体来说,在训练过程中,可以将nwd_loss函数作为损失函数,并使用反向传播算法来更新模型的参数。
# 计算损失函数
loss = nwd_loss(pred, targets, anchors)
# 反向传播
loss.backward()
# 更新参数
optimizer.step()

Ajuste los hiperparámetros del modelo. Cuando se usa el algoritmo NWD para objetos pequeños, es necesario ajustar los hiperparámetros del modelo para adaptarse a diferentes tareas de detección de objetos. Específicamente, los hiperparámetros como el tamaño y la cantidad de fotogramas anteriores y el peso de los coeficientes de ponderación se pueden ajustar para mejorar la precisión y la recuperación de la detección.

En resumen, el algoritmo NWD para objetivos pequeños es un método de mejora eficaz que se puede utilizar en modelos de detección de objetivos como YOLOv5 para mejorar el efecto de detección de objetivos pequeños.
Además de usar el algoritmo NWD para objetivos pequeños, aquí hay algunos otros métodos mejorados para objetivos pequeños que se pueden usar en YOLOv5:

  1. Use tamaños de entrada más pequeños durante el entrenamiento. El uso de un tamaño de entrada más pequeño puede mejorar la capacidad del modelo para detectar objetos pequeños. Sin embargo, este método también reduce la capacidad del modelo para detectar objetos grandes, lo que requiere un compromiso entre precisión y velocidad.
  2. Modificar la estructura del modelo. La estructura de red de YOLOv5 se puede modificar para agregar algunas capas convolucionales adicionales o capas de agrupación para mejorar el campo receptivo del modelo y las capacidades de extracción de características. Este método requiere mucha depuración y entrenamiento del modelo, y también aumenta la complejidad y el cálculo del modelo.
  3. Utilice un método de detección multiescala. El método de detección de múltiples escalas puede detectar objetos a diferentes escalas, lo que puede mejorar efectivamente la capacidad del modelo para detectar objetos pequeños. Específicamente, la detección se puede realizar a diferentes escalas de la imagen de entrada y luego los resultados de la detección se fusionan para obtener el resultado final de la detección.
  4. Utilice más métodos de aumento de datos. Los métodos de aumento de datos pueden aumentar la diversidad de datos y mejorar la solidez y la capacidad de generalización de los modelos. Específicamente, los métodos de mejora de datos, como la rotación, el escalado, la traducción y el recorte, se pueden usar para generar más muestras de entrenamiento y mejorar la capacidad del modelo para detectar objetivos pequeños.
  5. Use información de cuadro anterior más refinada. La información del cuadro anterior tiene una influencia importante en el efecto de detección del modelo, y se puede diseñar un cuadro anterior más refinado según factores como el tamaño y la posición del objetivo para mejorar la precisión de detección del modelo.

En resumen, hay muchas formas de mejorar objetos pequeños, que se pueden seleccionar y combinar de acuerdo con los requisitos específicos de la tarea.

Mejora de YOLOV5: la última convolución deformable V3

https://www.bilibili.com/video/BV1LY411z7iE/?spm_id_from=333.788&vd_source=85f7d0d97c49c694901f6886c09b832b
La convolución deformable (Convolución deformable) es una operación de convolución para la diversidad de formas de objetos, que puede introducir deformación en la información de la capa de convolución, mejorando la adaptabilidad de el modelo a escenas complejas y cambios de forma. La última convolución deformable V3 se mejora sobre la base de la convolución deformable V1 y V2. Tiene una mayor eficiencia computacional y un mejor rendimiento de detección, y se puede utilizar para mejorar los modelos de detección de objetivos como YOLOv5.

Las principales mejoras de la última convolución deformable V3 incluyen:

  1. Se agregaron más métodos de muestreo de deformación. Convolución deformable V3 introduce un método de muestreo de deformación basado en triángulos y tetraedros, que puede adaptarse mejor a diferentes formas y distribuciones de objetos.
  2. Se introduce una estructura de múltiples ramas. Convolución deformable V3 introduce una estructura de múltiples ramas en la capa de convolución, que puede realizar múltiples muestreos de deformación al mismo tiempo, mejorando el campo receptivo y la capacidad de extracción de características del modelo.
  3. Optimizado el algoritmo de muestreo de deformación. La convolución deformable V3 optimiza el algoritmo de muestreo de deformación, adopta un método de cálculo más eficiente y un método de muestreo más preciso, lo que puede mejorar la eficiencia de cálculo y la precisión de detección del modelo.
  4. Se agregó información de contexto global. La convolución deformable V3 introduce información de contexto global en la capa de convolución, que puede utilizar mejor la información global para mejorar la capacidad de detección del modelo.

Al introducir la última convolución deformable V3, el efecto de detección y la eficiencia computacional de los modelos de detección de objetivos como YOLOv5 se pueden mejorar de manera efectiva, especialmente cuando se trata de escenas complejas y cambios de forma, se puede obtener un mejor rendimiento.

Mejora YOLOV5 - DSConv.

inserte la descripción de la imagen aquíinserte la descripción de la imagen aquí

DSConv es una versión mejorada de la convolución separable en profundidad, que se puede utilizar para mejorar los modelos de detección de objetivos como YOLOv5. La convolución separable en profundidad es una operación de convolución ligera que puede descomponer la operación de convolución en dos pasos de convolución en profundidad y convolución puntual para reducir los parámetros y el cálculo. DSConv introduce la convolución de contexto separable sobre la base de la convolución separable en profundidad, que puede mejorar el campo receptivo del modelo y la capacidad de extracción de características, y mejorar la precisión de detección.

Las características clave de DSConv incluyen:

  1. Se utiliza convolución de contexto separable. DSConv introduce la convolución de contexto separable sobre la base de la convolución separable en profundidad, que puede mejorar el campo receptivo del modelo y la capacidad de extracción de características, y mejorar la precisión de detección.
  2. Añadido escalado canal por canal. DSConv agrega una operación de escalado canal por canal en convolución punto por punto, que puede ajustar los pesos de los mapas de características de diferentes canales en diferentes grados para mejorar la solidez y la capacidad de generalización del modelo.
  3. Preservar la eficiencia computacional de las capas convolucionales. DSConv mantiene la característica liviana de la convolución separable en profundidad, que puede mejorar la precisión de detección del modelo al tiempo que garantiza la eficiencia computacional.

Al introducir DSConv, el efecto de detección y la eficiencia computacional de los modelos de detección de objetivos como YOLOv5 se pueden mejorar de manera efectiva.

Mejora de YOLOV5: encabezado de desacoplamiento eficiente (consulte yolov6)

El cabezal de desacoplamiento eficiente (Efficient Head) es un método mejorado del modelo de detección de objetivos, que puede mejorar la precisión de detección y la eficiencia de cálculo del modelo. El cabezal de desacoplamiento eficiente se propuso en YOLOv6, que mejora la capacidad de expresión de características y la eficiencia computacional del modelo al descomponer el canal de la capa convolucional en dos partes, a saber, convolución desacoplada y convolución punto por punto.

En concreto, el proceso de cálculo del cabezal de desacoplamiento Eficiente es el siguiente:

  1. Las características se extraen mediante convoluciones desacopladas. La convolución desacoplada es una operación de convolución especial, que puede descomponer el canal de la capa de convolución en dos partes y realizar operaciones de convolución por separado para mejorar la capacidad de expresión de características del modelo. En el cabezal de desacoplamiento eficiente, primero use la convolución desacoplada para extraer características y obtener una representación de características de alta dimensión.
  2. Reducción de dimensionalidad mediante convolución puntual. La convolución puntual es una operación de convolución ligera que reduce las representaciones de características de alta dimensión a dimensiones más bajas para reducir el cálculo. En el cabezal de desacoplamiento eficiente, la convolución punto por punto se utiliza para reducir la dimensionalidad de la representación de características de alta dimensión para obtener una representación de características de baja dimensión.
  3. Pase las características de baja dimensión a las capas posteriores. Finalmente, la representación de características de baja dimensión se pasa a capas posteriores para tareas como la detección de objetos.

Al utilizar el cabezal de desacoplamiento eficiente, el canal de la capa convolucional se puede descomponer en dos partes, lo que mejora la capacidad de expresión de características y la eficiencia computacional del modelo. El cabezal de desacoplamiento eficiente se ha aplicado con éxito a modelos de detección de objetivos como YOLOv6 y ha logrado buenos resultados.
inserte la descripción de la imagen aquí

Mejora de YOLOV5: C3-Faster basado en el modelo ligero FasterNet

https://blog.csdn.net/qq_37706472/article/details/129352058?spm=1001.2014.3001.5502

C3-Faster es un método mejorado basado en el modelo ligero FasterNet para tareas de detección de objetos. C3-Faster mejora aún más la precisión de detección y la eficiencia computacional del modelo al agregar el módulo C3 basado en FasterNet.

En concreto, la mejora de C3-Faster incluye principalmente los siguientes dos aspectos:

Agregar módulo C3. El módulo C3 es un módulo de convolución liviano que puede mejorar la capacidad de expresión de características del modelo al tiempo que garantiza la eficiencia computacional. En C3-Faster, al agregar el módulo C3, la precisión de detección del modelo se puede mejorar aún más.

Ajuste la estructura de red de FasterNet. Para mejorar aún más la eficiencia computacional del modelo, C3-Faster ajustó la estructura de red de FasterNet. Específicamente, C3-Faster agrega algunos módulos de convolución livianos basados ​​en FasterNet para reducir los parámetros y los cálculos.

Mediante el uso de C3-Faster, se puede mejorar la precisión de detección del modelo al tiempo que se garantiza la eficiencia computacional. C3-Faster se verificó en algunos conjuntos de datos de detección de objetivos y obtuvo buenos resultados.

Mejora de YOLOV5: reemplace la red troncal que desee según TIMM

https://www.bilibili.com/video/BV1Mx4y1A7jy/?spm_id_from=333.788&vd_source=85f7d0d97c49c694901f6886c09b832b
Basado en TIMM (pytorch-image-models) para reemplazar la red troncal que desea es un método mejorado de YOLOv5, que permite a los usuarios libremente Diferentes Las redes troncales se eligen para adaptarse a diferentes conjuntos de datos y tareas de detección de objetos.

TIMM es una biblioteca de modelos de imágenes basada en PyTorch que proporciona una gran cantidad de modelos previamente entrenados, que incluyen clasificación, detección, segmentación y otras tareas. La biblioteca de modelos de TIMM contiene una gran cantidad de redes troncales, como ResNet, EfficientNet, RegNet, etc., que pueden facilitar la selección y el reemplazo del modelo. Mediante el uso de TIMM, la red troncal de YOLOv5 se puede reemplazar rápida y fácilmente para adaptarse a diferentes tareas y conjuntos de datos.

Específicamente, el método de reemplazo del troncal que desea basado en TIMM incluye principalmente los siguientes pasos:

  1. Seleccione la red troncal apropiada de TIMM. Cuando utilice el método basado en TIMM para reemplazar la red troncal que desea, primero debe seleccionar una red troncal adecuada del TIMM. Según las tareas y los conjuntos de datos, se pueden seleccionar diferentes redes troncales para lograr resultados de detección óptimos.
  2. Integre la red troncal con YOLOv5. Después de seleccionar la red troncal, debe integrarse con YOLOv5. Específicamente, el modelo de entrenamiento previo proporcionado por TIMM se puede usar para la inicialización, o la parte de extracción de características del modelo de entrenamiento previo se puede usar para reemplazar la red troncal original de YOLOv5.
  3. para entrenamiento y puesta a punto. Una vez integrada la red troncal, es necesario capacitarla y ajustarla para obtener el mejor efecto de detección. De acuerdo con tareas específicas y conjuntos de datos, se pueden realizar ajustes de hiperparámetros y optimización del modelo para mejorar el rendimiento del modelo.

Al usar el método de reemplazo de la red troncal que desea en función de TIMM, puede elegir de manera flexible diferentes redes troncales para adaptarse a diferentes tareas de detección de objetivos y conjuntos de datos, mejorando así la precisión de detección y la eficiencia computacional del modelo.

YOLOV5改进-添加 Desacoplamiento de contexto específico de tareas (Desacoplamiento de contexto específico de tareas para la detección de objetos)

https://www.bilibili.com/video/BV1nT411z7on/?spm_id_from=333.788&vd_source=85f7d0d97c49c694901f6886c09b832b

El desacoplamiento del contexto específico de la tarea (TSCD) es un método mejorado para las tareas de detección de objetos, que puede mejorar la percepción del modelo del entorno circundante del objeto. La idea principal de TSCD es separar la información de contexto del objetivo de la información relacionada con la tarea, para hacer un mejor uso de la información de contexto y mejorar la precisión de la detección de objetivos.

En concreto, la mejora de TSCD incluye principalmente los dos aspectos siguientes:

Separación de información de contexto. En TSCD, se utiliza un módulo de separación para separar la información contextual del objetivo de la información relacionada con la tarea para obtener dos vectores de características diferentes. Entre ellos, la información contextual puede ayudar al modelo a percibir mejor el entorno que rodea al objetivo, y la información relacionada con la tarea puede ayudar al modelo a completar mejor la tarea de detección del objetivo.

fusión de características. Después de separar la información contextual y la información relacionada con la tarea, TSCD utiliza un método de fusión especial para fusionar estos dos vectores de funciones. Específicamente, TSCD utiliza un mecanismo de atención adaptable para ajustar dinámicamente el peso de la información de contexto y la información relacionada con la tarea de acuerdo con el tamaño y la información de ubicación del objetivo, a fin de obtener una representación de características más precisa.

Al usar TSCD, la información contextual alrededor del objetivo se puede utilizar mejor y se puede mejorar la capacidad de percepción y la precisión de detección del modelo. TSCD se ha aplicado con éxito al modelo YOLOv5 y ha obtenido buenos resultados.

Mejora de YOLOV5: use FasterNet para reemplazar la red troncal en yolov5

El uso de FasterNet para reemplazar la red troncal en YOLOv5 es un método de mejora que puede mejorar la eficiencia computacional y la precisión de detección del modelo. FasterNet es una red troncal liviana que puede mejorar la capacidad de expresión de características del modelo al tiempo que garantiza la eficiencia computacional.

Específicamente, el método de usar FasterNet para reemplazar la red troncal en YOLOv5 incluye principalmente los siguientes pasos:

Elija el modelo FasterNet apropiado. Cuando utilice FasterNet para reemplazar la red troncal en YOLOv5, debe elegir un modelo FasterNet adecuado. FasterNet proporciona una variedad de modelos diferentes que se pueden seleccionar según tareas y conjuntos de datos específicos.

Integre FasterNet con YOLOv5. Para integrar FasterNet con YOLOv5, puede usar el modelo FasterNet preentrenado para inicializar, o usar la parte de extracción de funciones del modelo preentrenado para reemplazar la red troncal original de YOLOv5.

para entrenamiento y puesta a punto. Después de integrar FasterNet, se requiere capacitación y ajuste para obtener el efecto de detección óptimo. De acuerdo con tareas específicas y conjuntos de datos, se pueden realizar ajustes de hiperparámetros y optimización del modelo para mejorar el rendimiento del modelo.

Al reemplazar la red troncal en YOLOv5 con FasterNet, se puede mejorar la eficiencia computacional y la precisión de detección del modelo. FasterNet se ha aplicado con éxito a las tareas de detección de objetivos y ha obtenido buenos resultados.

Mejora de YOLOV5 - Mecanismo de atención BiFormer efectivo para objetivos pequeños

El mecanismo de atención BiFormer, que es efectivo para objetos pequeños, es un método mejorado para tareas de detección de objetos, que puede mejorar la precisión de detección del modelo para objetos pequeños. Este método se basa en el mecanismo de atención BiFormer, que centra la atención del modelo en objetos pequeños al ponderar los mapas de características, mejorando así el efecto de detección de objetos pequeños.

En concreto, la mejora del mecanismo de atención BiFormer que es efectivo para pequeños objetivos incluye principalmente los siguientes dos aspectos:

  1. Mecanismo de atención basado en BiFormer. En el mecanismo de atención de BiFormer que es eficaz para objetos pequeños, los mapas de características se ponderan utilizando el mecanismo de atención basado en BiFormer. Específicamente, este método utiliza el mecanismo de autoatención en Transformer para ajustar dinámicamente el peso de cada posición mediante el cálculo de la similitud entre los vectores de características en diferentes posiciones, a fin de obtener una representación de características más precisa.
  2. Manipulación especial para objetos pequeños. Al detectar objetos pequeños, generalmente se requiere un procesamiento especial de mapas de características para mejorar la precisión de detección de objetos pequeños. Para este caso, el mecanismo de atención de BiFormer, que es eficaz para objetos pequeños, utiliza un método de ponderación especial para centrar la atención del modelo en objetos pequeños. Específicamente, el método utiliza un método de ponderación adaptable para ajustar dinámicamente los pesos de atención según la información de tamaño y ubicación del objeto, mejorando así la precisión de detección de objetos pequeños.

Mediante el uso del mecanismo de atención BiFormer que es eficaz para objetos pequeños, se puede mejorar la precisión de detección del modelo para objetos pequeños, mejorando así el rendimiento de todo el sistema de detección de objetos. Este método se ha aplicado con éxito al modelo YOLOv5 y ha obtenido buenos resultados.

Mejora de YOLOV5: agregue EVCBlock en CFPNet

Agregar EVCBlock en CFPNet es un método mejorado para las tareas de detección de objetos, que puede mejorar la eficiencia computacional y la precisión de detección del modelo. EVCBlock es un módulo de red liviano que puede acelerar el cálculo del modelo mientras mejora la capacidad de expresión de características del modelo.

Específicamente, el método para agregar EVCBlock en CFPNet incluye principalmente los siguientes pasos:

  1. Seleccione el modelo EVCBlock adecuado. Al utilizar EVCBlock para mejorar CFPNet, es necesario elegir un modelo de EVCBlock adecuado. EVCBlock proporciona una variedad de modelos diferentes, que se pueden seleccionar según tareas y conjuntos de datos específicos.
  2. Integre EVCBlock con CFPNet. Para integrar EVCBlock con CFPNet, puede usar el modelo EVCBlock preentrenado para inicializar, o usar la parte de extracción de características del modelo preentrenado para reemplazar algunos módulos en CFPNet.
  3. para entrenamiento y puesta a punto. Después de integrar EVCBlock, se requiere entrenamiento y ajuste para obtener el efecto de detección óptimo. De acuerdo con tareas específicas y conjuntos de datos, se pueden realizar ajustes de hiperparámetros y optimización del modelo para mejorar el rendimiento del modelo.

Al agregar EVCBlock en CFPNet, se puede mejorar la eficiencia de cálculo y la precisión de detección del modelo. EVCBlock se ha aplicado con éxito a las tareas de detección de objetivos y ha obtenido buenos resultados.

Mejora de YOLOV5: agregue un operador ligero de sobremuestreo CARAFE

Agregar el operador ligero de muestreo ascendente CARAFE es un método mejorado para las tareas de detección de objetos, que puede mejorar el efecto de muestreo ascendente y la precisión de detección del modelo. CARAFE es un operador ligero de muestreo ascendente que puede mejorar el efecto de muestreo ascendente del modelo al tiempo que garantiza la eficiencia computacional.

En concreto, el método de adición de CARAFE incluye principalmente los siguientes pasos:

  1. Elija el modelo de JARRA adecuado. Cuando utilice CARAFE para mejorar YOLOv5, debe elegir un modelo de CARAFE adecuado. CARAFE proporciona una variedad de modelos diferentes que se pueden seleccionar según tareas y conjuntos de datos específicos.
  2. Integra CARAFE con YOLOv5. Para integrar CARAFE con YOLOv5, puede usar el modelo CARAFE preentrenado para la inicialización, o usar la parte de extracción de características del modelo preentrenado para reemplazar algunos módulos en YOLOv5.
  3. para entrenamiento y puesta a punto. Después de integrar CARAFE, se requiere entrenamiento y ajuste para obtener el efecto de detección óptimo. De acuerdo con tareas específicas y conjuntos de datos, se pueden realizar ajustes de hiperparámetros y optimización del modelo para mejorar el rendimiento del modelo.

Al agregar CARAFE, se puede mejorar el efecto de sobremuestreo y la precisión de detección del modelo. CARAFE se ha aplicado con éxito a tareas de detección de objetivos y ha obtenido buenos resultados. El uso de CARAFE en YOLOv5 puede mejorar aún más su rendimiento, especialmente para la detección de objetivos pequeños.

Mejora de YOLOV5: tutorial de operación de fusión Conv y BN de la red troncal de convolución dinámica omnidimensional

La convolución dinámica omnidimensional (ODDC) es una operación de convolución que mejora la columna vertebral de YOLOv5, lo que puede mejorar la precisión y la eficiencia computacional del modelo. La operación ODDC combina operaciones Conv y BN, lo que puede reducir la cantidad de cómputo y uso de memoria en el modelo.

La operación de ODDC incluye principalmente los siguientes pasos:

  1. Combine las operaciones Conv y BN en una sola operación de convolución. Esto reduce el cálculo y la huella de memoria en el modelo.
  2. Convierta la operación de convolución combinada en una operación ODDC. La operación ODDC es una
    operación de convolución dinámica basada en Tensor que puede generar dinámicamente núcleos de convolución según la forma y el tamaño de los datos de entrada.
  3. Optimizado para operaciones ODDC. La operación ODDC puede adaptarse a diferentes datos de entrada ajustando la forma y el tamaño del kernel de convolución. La precisión y la eficiencia computacional del modelo se pueden optimizar ajustando la forma y el tamaño del kernel de convolución.

El siguiente es un tutorial para implementar operaciones ODDC:

Defina la clase ODDC. Las clases ODDC se pueden definir usando la clase nn.Module en PyTorch, por ejemplo:

import torch
import torch.nn as nn

class ODDC(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=1, groups=1, dim=2):
        super(ODDC, self).__init__()
        self.dim = dim
        self.kernel_size = kernel_size

        if dim == 1:
            self.conv = nn.Conv1d(in_channels, out_channels, kernel_size=kernel_size, stride=stride, padding=padding, groups=groups, bias=False)
            self.bn = nn.BatchNorm1d(out_channels)
        elif dim == 2:
            self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=kernel_size, stride=stride, padding=padding, groups=groups, bias=False)
            self.bn = nn.BatchNorm2d(out_channels)
        else:
            self.conv = nn.Conv3d(in_channels, out_channels, kernel_size=kernel_size, stride=stride, padding=padding, groups=groups, bias=False)
            self.bn = nn.BatchNorm3d(out_channels)

    def forward(self, x):
        # 计算均值和方差
        mean = torch.mean(x, dim=(2, 3), keepdim=True)
        var = torch.var(x, dim=(2, 3), keepdim=True)
        # 计算归一化的输入数据
        x_norm = (x - mean) / torch.sqrt(var + 1e-5)
        # 计算动态卷积核
        kernel_size = (self.kernel_size,) * self.dim
        weight = self.conv.weight
        weight_norm = torch.norm(weight.view(weight.size(0), -1), dim=1, keepdim=True)
        weight_norm = weight_norm.view(-1, *([1] * self.dim))
        weight_norm = weight_norm.repeat(1, *kernel_size)
        weight_norm = weight_norm.expand(-1, *x.size(1), *[-1] * self.dim)
        weight_norm = weight_norm * x_norm.size(1)
        kernel = weight / weight_norm
        # 执行动态卷积操作
        out = torch.nn.functional.conv2d(x_norm, kernel, stride=self.conv.stride, padding=self.conv.padding, dilation=self.conv.dilation, groups=self.conv.groups)
        # 进行 BN 操作
        out = self.bn(out)
        return out
使用 ODDC 类替换 Conv 和 BN 模块。可以使用 PyTorch 中的 nn.Sequential 类来定义模型,例如:
import torch.nn as nn

model = nn.Sequential(
    ODDC(3, 64, kernel_size=3, stride=2, padding=1),
    nn.ReLU(),
    ODDC(64, 128, kernel_size=3, stride=2, padding=1),
    nn.ReLU(),
    ODDC(128, 256, kernel_size=3, stride=2, padding=1),
    nn.ReLU(),
    ODDC(256, 512, kernel_size=3, stride=2, padding=1),
    nn.ReLU(),
    ODDC(512, 1024, kernel_size=3, stride=2, padding=1

para entrenamiento y puesta a punto. Después de reemplazar los módulos Conv y BN con ODDC, el modelo se puede entrenar usando métodos estándar de entrenamiento y ajuste. De acuerdo con tareas específicas y conjuntos de datos, se pueden realizar ajustes de hiperparámetros y optimización del modelo para mejorar el rendimiento del modelo.
Aquí hay un ejemplo de código completo que usa ODDC para mejorar la red troncal de YOLOv5:

import torch
import torch.nn as nn
from models.common import Conv, Bottleneck, SPP, DWConv

class ODDC(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=1, groups=1, dim=2):
        super(ODDC, self).__init__()
        self.dim = dim
        self.kernel_size = kernel_size

        if dim == 1:
            self.conv = nn.Conv1d(in_channels, out_channels, kernel_size=kernel_size, stride=stride, padding=padding, groups=groups, bias=False)
            self.bn = nn.BatchNorm1d(out_channels)
        elif dim == 2:
            self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=kernel_size, stride=stride, padding=padding, groups=groups, bias=False)
            self.bn = nn.BatchNorm2d(out_channels)
        else:
            self.conv = nn.Conv3d(in_channels, out_channels, kernel_size=kernel_size, stride=stride, padding=padding, groups=groups, bias=False)
            self.bn = nn.BatchNorm3d(out_channels)

    def forward(self, x):
        # 计算均值和方差
        mean = torch.mean(x, dim=(2, 3), keepdim=True)
        var = torch.var(x, dim=(2, 3), keepdim=True)
        # 计算归一化的输入数据
        x_norm = (x - mean) / torch.sqrt(var + 1e-5)
        # 计算动态卷积核
        kernel_size = (self.kernel_size,) * self.dim
        weight = self.conv.weight
        weight_norm = torch.norm(weight.view(weight.size(0), -1), dim=1, keepdim=True)
        weight_norm = weight_norm.view(-1, *([1] * self.dim))
        weight_norm = weight_norm.repeat(1, *x.size(1), *[-1] * self.dim)
        weight_norm = weight_norm * x_norm.size(1)
        kernel = weight / weight_norm
        # 执行动态卷积操作
        out = torch.nn.functional.conv2d(x_norm, kernel, stride=self.conv.stride, padding=self.conv.padding, dilation=self.conv.dilation, groups=self.conv.groups)
        # 进行 BN 操作
        out = self.bn(out)
        return out

class YOLOv5(nn.Module):
    def __init__(self, cfg='models/yolov5s.yaml'):
        super(YOLOv5, self).__init__()
        self.module_defs = parse_model_cfg(cfg)
        self.module_list, self.routs = create_modules(self.module_defs)
        self.yolo_head = YOLOLayer([(512, 1024), (256, 512), (128, 256)], 80)

    def forward(self, x):
        outputs = []
        route_idx = 0
        for i, (module_def, module) in enumerate(zip(self.module_defs, self.module_list)):
            if module_def['type'] in ['convolutional', 'depthwise_convolutional', 'ODDC']:
                x = module(x)
            elif module_def['type'] == 'shortcut':
                x = outputs[-1] + outputs[int(module_def['from'])]
            elif module_def['type'] == 'route':
                layers = module_def['layers'].split(',')
                layers = [int(l) if int(l) > 0 else i + int(l) for l in layers]
                if len(layers) == 1:
                    x = outputs[layers[0]]
                else:
                    try:
                        x = torch.cat([outputs[i] for i in layers], 1)
                    except ValueError:
                        import pdb; pdb.set_trace()
            elif module_def['type'] == 'yolo':
                x = self.yolo_head(x)
                outputs.append(x)
            outputs.append(x)
        return outputs[1:]

def create_modules(module_defs):
    """
    Constructs module list of layer blocks from module configuration in module_defs
    """
    hyperparams = module_defs.pop(0)
    output_filters = [int(hyperparams['channels'])]
    module_list = nn.ModuleList()
    routs = []
    for i, module_def in enumerate(module_defs):
modules = nn.Sequential()
if module_def['type'] == 'convolutional':
bn = int(module_def['batch_normalize'])
filters = int(module_def['filters'])
kernel_size = int(module_def['size'])
pad = (kernel_size - 1) // 2 if int(module_def['pad']) else 0
modules.add_module(f'conv{
      
      i}', Conv(output_filters[-1], filters, kernel_size, stride=int(module_def['stride']), padding=pad, bias=not bn))
if bn:
modules.add_module(f'bn{
      
      i}', nn.BatchNorm2d(filters, momentum=0.1))
if module_def['activation'] == 'leaky':
modules.add_module(f'leaky{
      
      i}', nn.LeakyReLU(0.1))
elif module_def['type'] == 'depthwise_convolutional':
bn = int(module_def['batch_normalize'])
filters = output_filters[-1]
kernel_size = int(module_def['size'])
pad = (kernel_size - 1) // 2 if int(module_def['pad']) else 0
modules.add_module(f'conv{
      
      i}', DWConv(filters, kernel_size, stride=int(module_def['stride']), padding=pad, bias=not bn))
if bn:
modules.add_module(f'bn{
      
      i}', nn.BatchNorm2d(filters, momentum=0.1))
if module_def['activation'] == 'leaky':
modules.add_module(f'leaky{
      
      i}', nn.LeakyReLU(0.1))
elif module_def['type'] == 'ODDC':
bn = int(module_def['batch_normalize'])
filters = int(module_def['filters'])
kernel_size = int(module_def['size'])
pad = (kernel_size - 1) // 2 if int(module_def['pad']) else 0
modules.add_module(f'oddc{
      
      i}', ODDC(output_filters[-1], filters, kernel_size, stride=int(module_def['stride']), padding=pad, bias=not bn))
if bn:
modules.add_module(f'bn{
      
      i}', nn.BatchNorm2d(filters, momentum=0.1))
if module_def['activation'] == 'leaky':
modules.add_module(f'leaky{
      
      i}', nn.LeakyReLU(0.1))
elif module_def['type'] == 'spp':
filters = output_filters[-1]
modules.add_module(f'spp{
      
      i}', SPP(filters, filters, [5, 9, 13]))
elif module_def['type'] == 'bottleneck':
bn = int(module_def['batch_normalize'])
filters = output_filters[-1]
internal_filters = int(module_def['internal_filters']) if 'internal_filters' in module_def else filters
modules.add_module(f'bot{
      
      i}', Bottleneck(filters, internal_filters, shortcut=int(module_def['shortcut']), expansion=2))
if bn:
modules.add_module(f'bn{
      
      i}', nn.BatchNorm2d(filters, momentum=0.1))
if module_def['activation'] == 'leaky':
modules.add_module(f'leaky{
      
      i}', nn.LeakyReLU(0.1))
elif module_def['type'] == 'route':
layers = module_def['layers'].split(',')
layers = [int(l) if int(l) > 0 else i + int(l) for l in layers]
filters = sum([output_filters[l] for l in layers])
modules.add_module(f'route{
      
      i}', nn.Sequential())
routs.extend([i + l if l < 0 else l for l in layers])
elif module_def['type'] == 'shortcut':
filters = output_filters[-1]
modules.add_module(f'shortcut{
      
      i}', nn.Sequential())
routs.append(i + int(module_def['from']))
elif module_def['type'] == 'yolo':
modules.add_module(f'yolo{
      
      i}', YOLOLayer([int(x) for x in module_def['anchors'].split(',')], int(module_def['classes']), int(module_def['num']), int(module_def['iou_thresh']), int(module_def['conf_thresh'])))
filters = output_filters[-1]
else:
print(f"Warning: Unrecognized Layer Type: {
      
      module_def['type']}")
filters = output_filters[-1]
output_filters.append(filters)
module_list.append(modules)
return module_list, routs, output_filters<|im_sep|>

Este código es una función PyTorch que define la arquitectura de la red neuronal YOLOv3. La función acepta una lista de diccionarios, donde cada diccionario representa una capa en la red neuronal. Cada diccionario contiene información sobre el tipo de capa, los parámetros y los hiperparámetros.

La función itera sobre una lista de diccionarios y crea módulos PyTorch basados ​​en sus tipos. Luego, estos módulos se agregan al contenedor secuencial de PyTorch para crear la arquitectura de red neuronal completa.

Los diferentes tipos de capas admitidos por esta función incluyen:

convolucional: una capa convolucional estándar con normalización por lotes y activaciones opcionales.
depthwise_convolutional: capas convolucionales separables en profundidad con activación y normalización por lotes opcionales.
ODDC: una capa personalizada llamada ODDC (Offset Dynamic Depthwise Convolution) con activación y normalización por lotes opcional.
spp: capa de agrupación de pirámide espacial.
cuello de botella: Una capa de cuello de botella comúnmente utilizada en la arquitectura ResNet.
ruta: Una capa que conecta las salidas de dos o más capas anteriores.
atajo: una capa que agrega la salida de la capa anterior a la salida de la capa actual.
yolo: una capa personalizada utilizada en modelos de detección de objetos para predecir cuadros delimitadores, puntajes de objetos y probabilidades de clase.
La función devuelve un contenedor PyTorch Sequential que contiene el módulo de red neuronal, una lista de índices que indican a qué capas se enruta la salida y una lista de la cantidad de filtros en la salida de cada capa. Estos valores se utilizan más adelante en el código de entrenamiento e inferencia de YOLOv3.

que es bn

"bn" es una abreviatura en aprendizaje profundo, que se refiere a
la tecnología Batch Normalization (normalización por lotes). La normalización por lotes es una técnica comúnmente utilizada para acelerar y estabilizar el entrenamiento de redes neuronales profundas. En una red neuronal profunda, la entrada y la salida de cada capa pueden tener un
problema de cambio de distribución, lo que dificultará el entrenamiento de la red y ralentizará la convergencia. La normalización por lotes hace que la red sea más fácil de entrenar y optimizar al normalizar la distribución de las entradas de la red en cada capa y puede mejorar el rendimiento de generalización de la red.

En PyTorch,
se puede crear una capa de normalización por lotes llamando a nn.BatchNorm2d(). Esta capa puede tomar un tensor de entrada, normalizar su dimensión de lote y generar el tensor normalizado. La capa de normalización por lotes generalmente se usa después de la capa convolucional o la capa totalmente conectada, lo que puede acelerar la convergencia de la red y mejorar la precisión y el rendimiento de generalización del modelo.
En el aprendizaje profundo, las capas convolucionales y las capas de normalización por lotes
son tipos de capas de redes neuronales comúnmente utilizados. La combinación de estas dos capas puede mejorar el efecto de entrenamiento y la capacidad de generalización de la red neuronal.

En PyTorch, las capas convolucionales y las capas de normalización por lotes se pueden combinar para formar una capa de red más compleja combinándolas. Específicamente,
nn.Sequential()se pueden concatenar usando un me gusta así:

    nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding),
    nn.BatchNorm2d(out_channels),
    nn.ReLU(inplace=True) ) 

En este ejemplo, nn.Conv2d()se crea una capa convolucional, nn.BatchNorm2d()una capa de normalización por lotes y ambas capas van seguidas de una
nn.ReLU()función de activación. Esta combinación de capas se puede utilizar como una unidad básica de capa de normalización por lotes de convolución, que se puede reutilizar en redes neuronales prácticas.

Cabe señalar que al combinar capas convolucionales y capas de normalización por lotes, se debe prestar especial atención a si sus dimensiones de entrada y salida son consistentes. En el ejemplo anterior, nn.Conv2d()
la cantidad de canales para la salida debe nn.BatchNorm2d()coincidir con la cantidad de canales de entrada para . Solo de esta manera podemos asegurarnos de que las dos capas se puedan conectar entre sí sin problemas.

Además, existen algunas técnicas de optimización que se pueden usar para mejorar aún más el efecto de la capa de normalización por lotes de convolución, como usar el parámetro nn.Conv2d()de biaspara reemplazar
nn.BatchNorm2d()el parámetro de compensación de la capa, etc. Estas técnicas se pueden seleccionar y ajustar de acuerdo con escenarios de aplicación específicos y resultados experimentales.

¿Cómo integra la operación ODDC las operaciones Conv y BN juntas?

ODDC (Offset Dynamic Depthwise Convolution) es una capa de red neuronal personalizada que combina convolución separable en profundidad y operaciones de normalización por lotes. El propósito de ODDC es mejorar el rendimiento y la capacidad de generalización del modelo.

¿Cómo se combinan las operaciones de convolución separables en profundidad y de normalización por lotes en ODDC? Aquí hay un código de muestra:

class ODDC(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size, stride, padding, dilation=1, groups=1, bias=True):
        super(ODDC, self).__init__()

        # depthwise convolution with bias
        self.conv_dw = nn.Conv2d(in_channels, in_channels, kernel_size, stride, padding, dilation=dilation, groups=in_channels, bias=True)

        # batch normalization
        self.bn = nn.BatchNorm2d(in_channels)

        # pointwise convolution with bias
        self.conv_pw = nn.Conv2d(in_channels, out_channels, 1, 1, 0, bias=bias)

        # activation function
        self.relu = nn.ReLU(inplace=True)

    def forward(self, x):
        # depthwise convolution
        x = self.conv_dw(x)

        # batch normalization
        x = self.bn(x)

        # pointwise convolution
        x = self.conv_pw(x)

        # activation function
        x = self.relu(x)

        return x

En este ejemplo, la capa ODDC contiene convoluciones separables en profundidad, normalización por lotes, convoluciones de puntos y funciones de activación de ReLU. Las operaciones de normalización por lotes y convolución separables en profundidad se implementan en las capas self.conv_dw y self.bn, respectivamente. Durante el paso hacia adelante, el tensor de entrada x se somete primero a una convolución separable en profundidad y luego se normaliza mediante una operación de normalización por lotes. Luego, después de la convolución de puntos y el procesamiento de la función de activación de ReLU, el resultado de salida final.

Cabe señalar que las operaciones de convolución separable en profundidad y normalización por lotes se implementan en dos capas diferentes, respectivamente. Esto se debe a que el proceso de cálculo de la convolución separable en profundidad es diferente de la convolución estándar, y los canales de entrada deben agruparse utilizando el parámetro de grupos. La normalización por lotes, por otro lado, requiere normalizar la salida de la capa convolucional. Por lo tanto, la capa ODDC necesita usar dos capas diferentes para lograr estas dos operaciones y luego concatenarlas para usarlas como una capa de red neuronal completa.

Mejora de YOLOV5: red troncal de convolución dinámica omnidimensional con puntos para objetivos pequeños

La convolución dinámica omnidimensional (ODDC) es una operación de convolución adaptativa que puede ajustar dinámicamente la forma y el tamaño del kernel de convolución en diferentes dimensiones. En YOLOv5, ODDC se usa como una mejora en la red troncal para manejar mejor los objetos pequeños.

La red troncal de YOLOv5 utiliza la arquitectura CSPDarknet53, que contiene múltiples capas convolucionales y bloques residuales. En estas capas convolucionales y bloques residuales, ODDC se utiliza para reemplazar la operación de convolución estándar original para adaptarse mejor a la tarea de detección de objetos pequeños.

La implementación específica de ODDC es combinar convolución separable en profundidad y operaciones de normalización por lotes, y usar kernels de convolución dinámica para lograr una convolución adaptativa. En aplicaciones prácticas, ODDC puede ajustar automáticamente la forma y el tamaño del kernel de convolución para adaptarse a objetivos de diferentes tamaños.

Mediante el uso de ODDC, la red troncal de YOLOv5 puede manejar mejor los objetos pequeños, mejorando la precisión de detección y la capacidad de generalización. Además, ODDC también tiene las ventajas de una alta eficiencia computacional y una pequeña huella de memoria, lo que hace que YOLOv5 tenga una velocidad de detección más rápida y un tamaño de modelo más pequeño mientras mantiene una alta precisión.

En resumen, ODDC es una operación de convolución adaptativa adecuada para la detección de objetos pequeños, que puede mejorar efectivamente la precisión y la capacidad de generalización del modelo. En YOLOv5, ODDC se utilizó como una mejora de la red troncal y logró buenos resultados de detección y optimización del rendimiento.
¿Cuáles son las ventajas de oddc?

La convolución dinámica omnidimensional (ODDC) es una operación de convolución adaptativa que tiene las siguientes ventajas:

  • Núcleo de convolución adaptable: ODDC puede ajustar automáticamente la forma y el tamaño del núcleo de convolución para adaptarse a objetivos de diferentes tamaños, mejorando la adaptabilidad y la capacidad de generalización del modelo.
  • Alta eficiencia computacional: el kernel de convolución adaptable de ODDC puede reducir efectivamente la cantidad de cálculo, reducir la complejidad del modelo y el tiempo de cálculo.
  • Huella de memoria pequeña: el kernel de convolución adaptable de ODDC puede reducir la cantidad de parámetros y la huella de memoria del modelo, lo que hace que el modelo sea más liviano y más fácil de implementar.
  • Amplia aplicabilidad: ODDC se puede aplicar a varias tareas de visión artificial, como clasificación de imágenes, detección de objetivos, segmentación semántica, etc.
  • Alta precisión: ODDC puede adaptarse mejor a objetivos de diferentes tamaños ajustando de forma adaptativa la forma y el tamaño del kernel de convolución, mejorando así la precisión y la capacidad de generalización del modelo.

En conclusión, ODDC es una operación de convolución con las ventajas de adaptabilidad, alta eficiencia computacional, pequeña huella de memoria, amplia aplicabilidad y alta precisión, que puede mejorar efectivamente el rendimiento y la eficiencia de las tareas de visión artificial.
¿Cuáles son las desventajas de oddc?

Aunque la convolución dinámica omnidimensional (ODDC) tiene muchas ventajas, también tiene algunas desventajas:

  1. Gran cantidad de cálculo: el kernel de convolución adaptable de ODDC debe calcularse dinámicamente, lo que aumentará la cantidad de cálculo del modelo y ralentizará la velocidad de entrenamiento e inferencia del modelo.
  2. Inestabilidad: debido a la naturaleza adaptativa de ODDC, el modelo puede ser inestable en algunos casos especiales, como cuando el kernel de convolución es demasiado pequeño o demasiado grande.
  3. Parámetros difíciles de ajustar: el kernel de convolución adaptable en ODDC tiene múltiples dimensiones y parámetros, lo que requiere un ajuste y una optimización complejos, lo que aumenta la dificultad del diseño y la depuración del modelo.
  4. Mala interpretabilidad: el kernel de convolución adaptativo en ODDC se genera dinámicamente, y es difícil explicar la función específica y el significado de cada kernel de convolución, lo que provoca ciertas dificultades para la interpretabilidad y comprensión del modelo.

En resumen, las desventajas de ODDC son principalmente la gran cantidad de cálculo, la inestabilidad, el difícil ajuste de parámetros y la pobre interpretabilidad. Debe considerarse y sopesarse de manera integral en aplicaciones prácticas, y debe seleccionarse la operación de convolución y la estructura del modelo adecuadas.

Guess you like

Origin blog.csdn.net/qq_44089890/article/details/130120649#comments_26920106