Yolov8_obb (pérdida de probabilidad) basado en detección de objetivo de marco giratorio sin anclaje

Yolov8_obb (pérdida de probabilidad) basado en detección de objetivo de marco giratorio sin anclaje

El efecto es mejor que el de yolov5 y puede superar con creces los resultados de v5 en pequeños conjuntos de datos, pero se requieren algunos ajustes para diferentes conjuntos de datos.

1. Transformación y definición de spin box

Los datos de las cuatro esquinas de dota se convierten al formato (x, y, w, h, theta), y el punto central (x, y) y el ancho y alto (w, h) del cuadro se obtienen mediante cv2. minAreaRect(). Y el ángulo angle, angle ∈ [0, 90], asigna el ángulo a pi. Dado que hay dos formas de w>h y h>w, el lado largo se establece uniformemente en h, el lado corto es w, y el ángulo theta girado se asigna al rango [ -pi/2, pi/2]. Es decir, el método de representación del lado largo. Para conocer
inserte la descripción de la imagen aquí
algunos métodos de representación de ángulos específicos, consulte https://zhuanlan.zhihu.com/p/459018810
para la implementación del código relevante.

    poly = np.float32(poly.reshape(4, 2))
    (x, y), (w, h), angle = cv2.minAreaRect(poly) # θ ∈ [0, 90]
    angle = -angle # θ ∈ [-90, 0]
    theta = angle / 180 * pi # 转为pi制
    # trans opencv format to longedge format θ ∈ [-pi/2, pi/2]
    if w != max(w, h): 
        w, h = h, w
        theta += pi/2
    rboxes.append([x, y, w, h, theta])

Para reproyectar los resultados previstos en la imagen, el formato (x, y, w, h, theta) debe reconvertirse al formato de las cuatro coordenadas de las esquinas.

        center, w, h, theta = obboxes[:,:, :2], obboxes[:,:, 2:3], obboxes[:,:, 3:4], obboxes[:,:, 4:5]

        Cos, Sin = torch.cos(theta), torch.sin(theta)


        vector1 = torch.cat(
            (w/2 * Cos, -w/2 * Sin), dim=-1)
        vector2 = torch.cat(
            (-h/2 * Sin, -h/2 * Cos), dim=-1)
        point1 = center + vector1 + vector2
        point2 = center + vector1 - vector2
        point3 = center - vector1 - vector2
        point4 = center - vector1 + vector2
        order = obboxes.shape[:-1]
        return torch.cat(
            (point2, point3, point4,point1), dim=-1).reshape(*order, 4,2)

El proceso de conversión se muestra en la figura:
inserte la descripción de la imagen aquí

dos, yolov8_obb

Supongo que te gusta

Origin blog.csdn.net/qq_39128381/article/details/131962684
Recomendado
Clasificación